Cette rubrique fournit une référence détaillée de l'API pour le SDK Python officiel et inclut des exemples de code complets pour les formats d'entrée et de sortie courants.
Pour en savoir plus sur les cas d'utilisation et les principes de fonctionnement du SDK, consultez la rubrique SDK pour les appels de service.
Prérequis
pip install -U eas-prediction --user
Démarrage rapide
Choisissez une classe Request qui correspond au format des données d'entrée de votre modèle. Le code suivant présente un exemple minimal d'appel de service de bout en bout utilisant une requête sous forme de chaîne. Pour plus d'exemples, consultez la section Exemples.
#!/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)
Référence API
Le SDK Python met à disposition les classes suivantes, organisées par fonctionnalité :
Groupe | Description |
Client principal |
|
Entrées et sorties |
|
Service de file d'attente |
|
Paramètres communs
Endpoint : Adresse endpoint du serveur.
Pour un service standard, définissez ce paramètre sur l'endpoint de la passerelle par défaut. Exemple :
182848887922***.cn-shanghai.pai-eas.aliyuncs.com.Pour une demande de connexion directe VPC, définissez ce paramètre sur l'endpoint de connexion directe VPC du service. Le format est
<uid>.vpc.<region-id>.pai-eas.aliyuncs.com. Exemple :182848887922****.vpc.cn-shanghai.pai-eas.aliyuncs.com.
Classe PredictClient
Méthode | Description |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Initialisez l'objet PredictClient. Après avoir défini les paramètres, vous devez appeler la méthode |
|
|
Classe StringRequest
Méthode | Description |
|
|
Classe StringResponse
Méthode | Description |
|
|
Classe TFRequest
Méthode | Description |
|
|
|
|
|
|
|
|
Classe TFResponse
Méthode | Description |
|
|
|
|
Classe TorchRequest
Méthode | Description |
| Crée un objet |
|
|
|
|
|
|
Classe TorchResponse
Méthode | Description |
|
|
|
|
Classe QueueClient
Méthode | Description |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Classe Watcher
Méthode | Description |
|
|
| Description : fermez un objet Watcher pour mettre fin à la connexion de données côté back-end. Remarque Un client ne peut avoir qu'un seul objet Watcher actif à la fois. Vous devez fermer l'objet Watcher actuel avant d'en démarrer un nouveau. |
Exemples
Exemple d'inférence synchrone (par format d'entrée/sortie)
Sélectionnez l'exemple de code en fonction des types d'entrée et de sortie du service.
String
Les utilisateurs qui déploient des services avec un processeur personnalisé utilisent généralement des chaînes pour les appels de service, par exemple pour les services de modèles PMML. Le code suivant présente un exemple de programme.
#!/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 vous utilisez TensorFlow, servez-vous de TFRequest et TFResponse comme formats de données d'entrée et de sortie. Le code ci-dessous illustre un exemple.
#!/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
Pour PyTorch, employez TorchRequest et TorchResponse comme formats de données d'entrée et de sortie. Voici un exemple de code.
#!/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
Avec BladeProcessor, optez pour BladeRequest et BladeResponse comme formats de données d'entrée et de sortie. L'extrait suivant montre un cas concret.
#!/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 with the default TensorFlow interface
Les utilisateurs de BladeProcessor peuvent recourir à TFRequest et TFResponse comme formats de données d'entrée et de sortie. Ces formats sont compatibles avec l'interface TensorFlow par défaut d'Elastic Algorithm Service (EAS). Le code ci-après fournit un exemple.
#!/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) )
Exemple d'appel d'un service via une connexion directe VPC
Pour utiliser une connexion directe, configurez un Virtual Private Cloud (VPC) pour le service. Pour plus d'informations, consultez les rubriques Use Elastic Algorithm Service (EAS) resource groups et Access public or internal resources from EAS. Cette méthode d'appel nécessite seulement une ligne de code supplémentaire par rapport à la méthode normale : client.set_endpoint_type(ENDPOINT_TYPE_DIRECT). Elle convient parfaitement aux services générant un trafic élevé et une forte concurrence. Le code suivant en donne un exemple.
#!/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)
Exemple : envoi et abonnement aux données dans un service de file d'attente
Vous pouvez utiliser QueueClient pour envoyer des données à un service de file d'attente, interroger les données, vérifier l'état du service et vous abonner aux poussées de données. La démonstration suivante présente un exemple avec deux threads. Un thread envoie des données au service de file d'attente. L'autre thread utilise un Watcher pour s'abonner aux données poussées.
#!/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()
Dépannage
Pour obtenir des informations sur les symptômes, les causes et le dépannage des exceptions lors des appels du SDK Python, consultez la section « Troubleshooting call exceptions » de la rubrique Service Call SDK. Ces exceptions incluent les problèmes courants liés à l'authentification, au routage, à la connexion et au serveur.
Pour une liste complète des codes d'état du service, des descriptions des messages d'erreur et des solutions suggérées, consultez la rubrique Appendix: Service status codes and common errors.