公式のElastic Algorithm Service (EAS) SDKは、モデルに基づいてデプロイされたコールサービスに提供されます。 EAS SDKは、コールロジックの定義に必要な時間を短縮し、コールの安定性を向上させます。 このトピックでは、Python用EAS SDKについて説明します。 EAS SDK for Pythonを使用してサービスを呼び出す方法を示すデモが提供されています。 これらのデモでは、入力と出力は一般的に使用されるタイプです。
SDK のインストール
pip install -U eas-prediction -- user
変更方法
クラス | 移動方法 | 説明 |
PredictClient |
|
|
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
| 説明: クライアントオブジェクトを初期化します。 パラメーターの設定に使用される前述のすべてのメソッドが呼び出された後、パラメーターは | |
|
| |
StringRequest |
|
|
StringResponse |
|
|
TFRequest |
|
|
|
| |
|
| |
|
| |
TFResponse |
|
|
|
| |
TorchRequest |
| 説明: TorchRequestクラスのオブジェクトを作成します。 |
|
| |
|
| |
|
| |
TorchResponse |
|
|
|
| |
QueueClient |
|
|
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
ウォッチャー |
|
|
| 説明: バックエンド接続を閉じるためにウォッチャーを停止します。 説明 1つのクライアントに対して起動できるウォッチャーは1つだけです。 別のウォッチャーを開始する前に、ウォッチャーを閉じる必要があります。 |
デモ
文字列としての入力と出力
カスタムプロセッサを使用してモデルをサービスとして展開する場合、文字列は、予測モデルマークアップ言語 (PMML) モデルに基づいて展開されるサービスなど、サービスを呼び出すためによく使用されます。 詳細については、次のデモを参照してください。
#!/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を使用してモデルをサービスとして展開する場合は、TFRequestクラスとTFResponseクラスを使用してサービスを呼び出す必要があります。 詳細については、次のデモを参照してください。
#!/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)
VPCダイレクト接続チャネルを使用してサービスを呼び出す
VPCダイレクト接続チャネルを使用して、EAS専用リソースグループにデプロイされているサービスのみにアクセスできます。 さらに、チャネルを使用するには、EASの専用リソースグループと指定されたvSwitchがVPCに接続されている必要があります。 EAS専用リソースグループとネットワーク接続の購入方法については、「専用リソースグループの操作」および「ネットワーク接続の設定」をご参照ください。 通常モードと比較して、このモードには
client.set_endpoint_type(ENDPOINT_TYPE_DIRECT)
という追加のコード行が含まれています。 このモードは、同時実行性が高く、トラフィックが多いシナリオで使用できます。 詳細については、次のデモを参照してください。#!/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__': client = PredictClient('http://pai-eas-vpc.cn-hangzhou.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)
PyTorchモデルを呼び出す
PyTorchを使用してモデルをサービスとして展開する場合は、TorchRequestクラスとTorchResponseクラスを使用してサービスを呼び出す必要があります。 詳細については、次のデモを参照してください。
#!/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) )
Bladeプロセッサベースモデルの呼び出し
Bladeプロセッサを使用してモデルをサービスとして展開する場合は、BladeRequestクラスとBladeResponseクラスを使用してサービスを呼び出す必要があります。 詳細については、次のデモを参照してください。
#!/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) )
デフォルトのTensorFlowメソッドと互換性のあるBladeプロセッサベースモデルの呼び出し
TFRequestクラスとTFResponseクラスを使用して、EASでサポートされている既定のTensorFlowメソッドと互換性のあるBladeプロセッサベースのモデルを呼び出すことができます。 詳細については、次のデモを参照してください。
#!/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) )
キューイングサービスを使用したデータの送信とサブスクライブ
キュー内のデータを送信および照会したり、キューの状態を照会したり、キューによってプッシュされたデータをサブスクライブしたりできます。 次のデモでは、スレッドがキューにデータをプッシュし、別のスレッドがウォッチャーを使用してプッシュされたデータをサブスクライブします。 詳細については、次のデモを参照してください。
#!/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()