Este tópico fornece uma referência detalhada da API do SDK oficial para Python e inclui exemplos completos de código para formatos comuns de entrada e saída.
Para conhecer os casos de uso e os princípios de funcionamento do SDK, consulte SDK for service calls.
Pré-requisitos
pip install -U eas-prediction --user
Início rápido
Escolha uma classe Request compatível com o formato dos dados de entrada do seu modelo. O código a seguir apresenta um exemplo mínimo de chamada de serviço ponta a ponta usando uma requisição do tipo string. Para mais exemplos, consulte Examples.
#!/usr/bin/env python
from eas_prediction import PredictClient
from eas_prediction import StringRequest
if __name__ == '__main__':
client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'my_service')
client.set_token('YOUR_SERVICE_TOKEN')
client.init()
request = StringRequest('[{}]')
resp = client.predict(request)
print(resp)
Referência da API
O SDK para Python oferece as classes abaixo, organizadas por finalidade:
Grupo | Descrição |
Cliente principal |
|
Entrada e saída |
|
Serviço de fila |
|
Parâmetros comuns
Endpoint: Endereço do endpoint do servidor.
Para serviços padrão, defina este parâmetro como o endpoint de gateway padrão. Exemplo:
182848887922***.cn-shanghai.pai-eas.aliyuncs.com.Para requisições de conexão direta via VPC, defina este parâmetro como o endpoint de conexão direta VPC do serviço. O formato é
<uid>.vpc.<region-id>.pai-eas.aliyuncs.com. Exemplo:182848887922****.vpc.cn-shanghai.pai-eas.aliyuncs.com.
Classe PredictClient
Método | Descrição |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Inicializa o objeto PredictClient. Após definir os parâmetros, chame o método |
|
|
Classe StringRequest
Método | Descrição |
|
|
Classe StringResponse
Método | Descrição |
|
|
Classe TFRequest
Método | Descrição |
|
|
|
|
|
|
|
|
Classe TFResponse
Método | Descrição |
|
|
|
|
Classe TorchRequest
Método | Descrição |
| Cria um objeto |
|
|
|
|
|
|
Classe TorchResponse
Método | Descrição |
|
|
|
|
Classe QueueClient
Método | Descrição |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Classe Watcher
Método | Descrição |
|
|
| Descrição: Fecha um objeto Watcher para encerrar a conexão de dados back-end. Nota Um cliente pode ter apenas um Watcher ativo por vez. Feche o Watcher atual antes de iniciar um novo. |
Exemplos
Exemplo de inferência síncrona (por formato de entrada/saída)
Selecione o código de exemplo com base nos tipos de entrada e saída do serviço.
String
Usuários que implantam serviços com um processador personalizado geralmente usam strings para chamadas de serviço, como em serviços de modelo PMML. O código a seguir mostra um programa de exemplo.
#!/usr/bin/env python
from eas_prediction import PredictClient
from eas_prediction import StringRequest
if __name__ == '__main__':
client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'scorecard_pmml_example')
client.set_token('YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****')
client.init()
request = StringRequest('[{"fea1": 1, "fea2": 2}]')
for x in range(0, 1000000):
resp = client.predict(request)
print(resp)
TensorFlow
Se usar TensorFlow, utilize TFRequest e TFResponse como formatos de dados de entrada e saída. O código a seguir mostra um exemplo.
#!/usr/bin/env python
from eas_prediction import PredictClient
from eas_prediction import StringRequest
from eas_prediction import TFRequest
if __name__ == '__main__':
client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'mnist_saved_model_example')
client.set_token('YTg2ZjE0ZjM4ZmE3OTc0NzYxZDMyNmYzMTJjZTQ1YmU0N2FjMTAy****')
client.init()
#request = StringRequest('[{}]')
req = TFRequest('predict_images')
req.add_feed('images', [1, 784], TFRequest.DT_FLOAT, [1] * 784)
for x in range(0, 1000000):
resp = client.predict(req)
print(resp)
PyTorch
Se usar PyTorch, utilize TorchRequest e TorchResponse como formatos de dados de entrada e saída. O código a seguir mostra um exemplo.
#!/usr/bin/env python
from eas_prediction import PredictClient
from eas_prediction import TorchRequest
if __name__ == '__main__':
client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'pytorch_gpu_wl')
client.init()
req = TorchRequest()
req.add_feed(0, [1, 3, 224, 224], TorchRequest.DT_FLOAT, [1] * 150528)
# req.add_fetch(0)
import time
st = time.time()
timer = 0
for x in range(0, 10):
resp = client.predict(req)
timer += (time.time() - st)
st = time.time()
print(resp.get_tensor_shape(0))
# print(resp)
print("average response time: %s s" % (timer / 10) )
BladeProcessor
Se usar BladeProcessor, utilize BladeRequest e BladeResponse como formatos de dados de entrada e saída. O código a seguir mostra um exemplo.
#!/usr/bin/env python
from eas_prediction import PredictClient
from eas_prediction import BladeRequest
if __name__ == '__main__':
client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'nlp_model_example')
client.init()
req = BladeRequest()
req.add_feed('input_data', 1, [1, 360, 128], BladeRequest.DT_FLOAT, [0.8] * 85680)
req.add_feed('input_length', 1, [1], BladeRequest.DT_INT32, [187])
req.add_feed('start_token', 1, [1], BladeRequest.DT_INT32, [104])
req.add_fetch('output', BladeRequest.DT_FLOAT)
import time
st = time.time()
timer = 0
for x in range(0, 10):
resp = client.predict(req)
timer += (time.time() - st)
st = time.time()
# print(resp)
# print(resp.get_values('output'))
print(resp.get_tensor_shape('output'))
print("average response time: %s s" % (timer / 10) )
BladeProcessor compatível com a interface padrão do TensorFlow
Usuários do BladeProcessor podem usar TFRequest e TFResponse como formatos de dados de entrada e saída. Esses formatos são compatíveis com a interface padrão do TensorFlow do Elastic Algorithm Service (EAS). O código a seguir mostra um exemplo.
#!/usr/bin/env python
from eas_prediction import PredictClient
from eas_prediction.blade_tf_request import TFRequest # Need Importing blade TFRequest
if __name__ == '__main__':
client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'nlp_model_example')
client.init()
req = TFRequest(signature_name='predict_words')
req.add_feed('input_data', [1, 360, 128], TFRequest.DT_FLOAT, [0.8] * 85680)
req.add_feed('input_length', [1], TFRequest.DT_INT32, [187])
req.add_feed('start_token', [1], TFRequest.DT_INT32, [104])
req.add_fetch('output')
import time
st = time.time()
timer = 0
for x in range(0, 10):
resp = client.predict(req)
timer += (time.time() - st)
st = time.time()
# print(resp)
# print(resp.get_values('output'))
print(resp.get_tensor_shape('output'))
print("average response time: %s s" % (timer / 10) )
Exemplo de chamada de serviço usando conexão direta VPC
Para usar uma conexão direta, configure uma Virtual Private Cloud (VPC) para o serviço. Para mais informações, consulte Use Elastic Algorithm Service (EAS) resource groups e Access public or internal resources from EAS. Este método de chamada requer apenas uma linha adicional de código em comparação ao método normal: client.set_endpoint_type(ENDPOINT_TYPE_DIRECT). Ideal para serviços com alto tráfego e concorrência. O código a seguir fornece um exemplo.
#!/usr/bin/env python
from eas_prediction import PredictClient
from eas_prediction import StringRequest
from eas_prediction import TFRequest
from eas_prediction import ENDPOINT_TYPE_DIRECT
if __name__ == '__main__':
# The format of a VPC direct connection endpoint is <uid>.vpc.<region-id>.pai-eas.aliyuncs.com. You can find the endpoint on the Invocation Information tab of the service details page in the EAS console.
client = PredictClient('http://182848887922****.vpc.cn-hangzhou.pai-eas.aliyuncs.com', 'mnist_saved_model_example')
client.set_token('M2FhNjJlZDBmMzBmMzE4NjFiNzZhMmUxY2IxZjkyMDczNzAzYjFi****')
client.set_endpoint_type(ENDPOINT_TYPE_DIRECT)
client.init()
request = TFRequest('predict_images')
request.add_feed('images', [1, 784], TFRequest.DT_FLOAT, [1] * 784)
for x in range(0, 1000000):
resp = client.predict(request)
print(resp)
Exemplo: Envio e assinatura de dados em um serviço de fila
Use o QueueClient para enviar dados a um serviço de fila, consultar dados, verificar o status do serviço e inscrever-se em envios de dados. A demonstração a seguir mostra um exemplo com duas threads. Uma thread envia dados para o serviço de fila. A outra usa um Watcher para se inscrever nos dados enviados.
#!/usr/bin/env python
from eas_prediction import QueueClient
import threading
if __name__ == '__main__':
endpoint = '182848887922****.cn-shanghai.pai-eas.aliyuncs.com'
queue_name = 'test_group.qservice/sink'
token = 'YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MTUx****'
queue = QueueClient(endpoint, queue_name)
queue.set_token(token)
queue.init()
queue.set_timeout(30000)
# truncate all messages in the queue
attributes = queue.attributes()
if 'stream.lastEntry' in attributes:
queue.truncate(int(attributes['stream.lastEntry']) + 1)
count = 100
# create a thread to send messages to the queue
def send_thread():
for i in range(count):
index, request_id = queue.put('[{}]')
print('send: ', i, index, request_id)
# create a thread to watch messages from the queue
def watch_thread():
watcher = queue.watch(0, 5, auto_commit=True)
i = 0
for x in watcher.run():
print('recv: ', i, x.index, x.tags['requestId'])
i += 1
if i == count:
break
watcher.close()
thread1 = threading.Thread(target=watch_thread)
thread2 = threading.Thread(target=send_thread)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
Tratamento de exceções e recuperação do ID de requisição
Quando uma chamada PredictClient.predict() falha, ela levanta uma PredictException. Esta exceção possui apenas dois atributos: code (código de status HTTP) e message (mensagem de erro). **Não possui um atributo separado request_id .**
A obtenção do ID de requisição depende se a requisição chegou ao servidor:
A requisição chegou ao servidor: O corpo da resposta XML retornado pelo servidor está embutido no atributo
messageda exceção. O elemento<RequestId>nesse corpo é o ID de requisição da chamada; extraia-o com uma expressão regular ou parser XML. Por exemplo, ao chamar um endpoint válido com um nome de serviço inexistente, o servidor retorna HTTP 404 e um ID de requisição como019FEB40-3720-5073-B3E5-4532B42EFDE9pode ser analisado a partir demessage.A requisição não chegou ao servidor: Se a chamada falhar na camada de rede (por exemplo, falha na resolução DNS ou handshake SSL),
messagenão conterá um ID de requisição. Por exemplo, chamar um endpoint irresolvível levanta uma exceção cujocodeé 500 e cujomessagecontém informações comoMax retries exceededeFailed to resolve. Nesse caso, verifique a configuração de rede e certificados no cliente em vez de investigar o servidor.
O exemplo a seguir mostra como capturar a exceção, ler code e analisar o ID de requisição a partir de message:
from eas_prediction import PredictClient, StringRequest, PredictException
import re
client = PredictClient('http://pai-eas.cn-shanghai.aliyuncs.com', 'your_service')
client.set_token('your_token')
client.init()
req = StringRequest('{"input": "test"}')
try:
resp = client.predict(req)
print(resp.to_string())
except PredictException as e:
print('Error code:', e.code)
msg = e.message.decode('utf-8') if isinstance(e.message, bytes) else str(e.message)
match = re.search(r'<RequestId>(.*?)</RequestId>', msg)
if match:
print('Request ID:', match.group(1))
else:
print('No request ID: the request may not have reached the server')
Se a mensagem de erro indicar falha relacionada a SSL, solucione o problema da seguinte forma:
Atualize os certificados CA: execute
pip install --upgrade certifi.Verifique se as configurações de proxy local estão corretas e se o proxy não intercepta ou reescreve requisições HTTPS.
Confirme se o endpoint do serviço EAS usado suporta acesso HTTPS e verifique se o prefixo de protocolo do endpoint corresponde ao gateway real.
Solução de problemas
Para obter informações sobre sintomas, causas e solução de problemas de exceções em chamadas do SDK para Python, consulte a seção 'Solução de problemas de exceções de chamada' em Service Call SDK. Essas exceções incluem problemas comuns com autenticação, roteamento, conexão e servidor.
Para obter uma lista completa de códigos de status do serviço, descrições de mensagens de erro e soluções sugeridas, consulte Appendix: Service status codes and common errors.