Este tema proporciona una referencia detallada de la API para el SDK oficial de Python e incluye ejemplos de código completos para los formatos de entrada y salida más comunes.
Para conocer los casos de uso y los principios de funcionamiento del SDK, consulte SDK for service calls.
Requisitos previos
pip install -U eas-prediction --user
Inicio rápido
Elija una clase Request que coincida con el formato de datos de entrada de su modelo. A continuación se muestra un ejemplo mínimo de una llamada de servicio integral que utiliza una solicitud de tipo cadena. Para consultar más ejemplos, vea 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)
Referencia de la API
El SDK de Python proporciona las siguientes clases, agrupadas según su propósito:
Grupo | Descripción |
Cliente principal |
|
Entrada y salida |
|
Servicio de cola |
|
Parámetros comunes
Endpoint: La dirección del endpoint del servidor.
Para un servicio estándar, establezca este parámetro en el endpoint de puerta de enlace predeterminado. Ejemplo:
182848887922***.cn-shanghai.pai-eas.aliyuncs.com.Para una solicitud de conexión directa VPC, establezca este parámetro en el endpoint de conexión directa VPC del servicio. El formato es
<uid>.vpc.<region-id>.pai-eas.aliyuncs.com. Ejemplo:182848887922****.vpc.cn-shanghai.pai-eas.aliyuncs.com.
Clase PredictClient
Método | Descripción |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Inicializa el objeto PredictClient. Después de establecer los parámetros, debe llamar al método |
|
|
Clase StringRequest
Método | Descripción |
|
|
Clase StringResponse
Método | Descripción |
|
|
Clase TFRequest
Método | Descripción |
|
|
|
|
|
|
|
|
Clase TFResponse
Método | Descripción |
|
|
|
|
Clase TorchRequest
Método | Descripción |
| Crea un objeto |
|
|
|
|
|
|
Clase TorchResponse
Método | Descripción |
|
|
|
|
Clase QueueClient
Método | Descripción |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Clase Watcher
Método | Descripción |
|
|
| Descripción: Cierra un objeto Watcher para finalizar la conexión de datos del backend. Nota Un cliente solo puede tener un Watcher activo a la vez. Debe cerrar el Watcher actual antes de iniciar uno nuevo. |
Ejemplos
Ejemplo de inference síncrona (por formato de entrada y salida)
Seleccione el código de ejemplo según los tipos de entrada y salida del servicio.
String
Los usuarios que despliegan servicios con un procesador personalizado suelen utilizar cadenas de texto para las llamadas al servicio, como en el caso de los servicios de modelos PMML. A continuación se muestra un programa de ejemplo.
#!/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
Si utiliza TensorFlow, emplee TFRequest y TFResponse como formatos de datos de entrada y salida. A continuación se muestra un ejemplo de código.
#!/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
Si utiliza PyTorch, emplee TorchRequest y TorchResponse como formatos de datos de entrada y salida. A continuación se muestra un ejemplo de código.
#!/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
Si utiliza BladeProcessor, emplee BladeRequest y BladeResponse como formatos de datos de entrada y salida. A continuación se muestra un ejemplo de código.
#!/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 compatible con la interfaz predeterminada de TensorFlow
Los usuarios de BladeProcessor pueden usar TFRequest y TFResponse como formatos de datos de entrada y salida. Estos formatos son compatibles con la interfaz predeterminada de TensorFlow de Elastic Algorithm Service (EAS). A continuación se muestra un ejemplo de código.
#!/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) )
Ejemplo de llamada a un servicio mediante conexión directa VPC
Para utilizar una conexión directa, configure una Virtual Private Cloud (VPC) para el servicio. Para obtener más información, consulte Use Elastic Algorithm Service (EAS) resource groups y Access public or internal resources from EAS. Este método de llamada requiere solo una línea de código adicional en comparación con el método normal: client.set_endpoint_type(ENDPOINT_TYPE_DIRECT). Este método es ideal para servicios con alto tráfico y concurrencia. A continuación se proporciona un ejemplo de código.
#!/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)
Ejemplo: envío y suscripción a datos en un servicio de cola
Puede utilizar QueueClient para enviar datos a un servicio de cola, consultar datos, comprobar el estado del servicio y suscribirse a envíos de datos. La siguiente demostración muestra un ejemplo con dos hilos. Un hilo envía datos al servicio de cola. El otro hilo utiliza un Watcher para suscribirse a los datos 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()
Manejo de excepciones y obtención del ID de solicitud
Cuando una llamada a PredictClient.predict() falla, se genera una PredictException. Esta excepción tiene solo dos atributos: code (el código de estado HTTP) y message (el mensaje de error). **No posee un atributo request_id independiente.**
La forma de obtener el ID de solicitud depende de si la petición llegó al servidor:
La solicitud llegó al servidor: El cuerpo de respuesta XML devuelto por el servidor está incrustado en el atributo
messagede la excepción. El elemento<RequestId>dentro de ese cuerpo corresponde al ID de solicitud de la llamada, y debe extraerlo mediante una expresión regular o un analizador XML. Por ejemplo, si llama a un endpoint válido con un nombre de servicio inexistente, el servidor devuelve un HTTP 404 y es posible analizar un ID de solicitud como019FEB40-3720-5073-B3E5-4532B42EFDE9desdemessage.La solicitud no llegó al servidor: Si la llamada falla en la capa de red (por ejemplo, error de resolución DNS o fallo en el protocolo de enlace SSL),
messageno contiene un ID de solicitud. Por ejemplo, llamar a un endpoint que no se puede resolver genera una excepción cuyocodees 500 y cuyomessagecontiene información comoMax retries exceededyFailed to resolve. En este caso, compruebe la configuración de red y de certificados en el cliente en lugar de investigar el servidor.
El siguiente ejemplo muestra cómo capturar la excepción, leer code y analizar el ID de solicitud desde 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')
Si el mensaje de error indica un fallo relacionado con SSL, realice la solución de problemas de la siguiente manera:
Actualice los certificados CA: ejecute
pip install --upgrade certifi.Compruebe que la configuración del proxy local sea correcta y que el proxy no intercepte ni reescriba las solicitudes HTTPS.
Confirme que el endpoint del servicio EAS que utiliza admita acceso HTTPS y verifique que el prefijo de protocolo del endpoint coincida con la puerta de enlace real.
Solución de problemas
Para obtener información sobre los síntomas, las causas y la solución de problemas de excepciones en llamadas del Python SDK, consulte la sección 'Solución de problemas de excepciones de llamada' en Service Call SDK. Estas excepciones incluyen problemas comunes de autenticación, enrutamiento, conexión y servidor.
Para consultar una lista completa de códigos de estado del servicio, descripciones de mensajes de error y soluciones sugeridas, consulte Appendix: Service status codes and common errors.