Este tópico fornece uma referência detalhada da API do SDK oficial em Python e inclui exemplos completos de código para os formatos de entrada e saída mais comuns.
Para conhecer os casos de uso e os princípios de funcionamento do SDK, consulte SDK para chamadas de serviço.
Pré-requisitos
pip install -U eas-prediction --user
Início rápido
Escolha uma classe Request correspondente ao 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 Exemplos.
#!/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 em 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
Ao 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
Ao 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
Ao 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 Usar grupos de recursos do Elastic Algorithm Service (EAS) e Acessar recursos públicos ou internos a partir do 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 notificações 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 assinar os 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()
Solução de problemas
Para obter informações sobre sintomas, causas e solução de exceções em chamadas do SDK Python, consulte a seção 'Solução de problemas de exceções de chamada' em SDK de Chamada de Serviço. Essas exceções incluem problemas comuns de autenticação, roteamento, conexão e servidor.
Para obter uma lista completa de códigos de status de serviço, descrições de mensagens de erro e soluções sugeridas, consulte Apêndice: Códigos de status de serviço e erros comuns.