呼び出しロジックの定義に必要な時間を短縮し、呼び出しの安定性を向上させるために、公式の Elastic Algorithm Service (EAS) SDK を使用することをお勧めします。このトピックでは、EAS SDK for Python について説明し、一般的に使用される入力と出力、および EAS SDK for Python を使用してサービスを呼び出す方法を示すデモを提供します。
SDK のインストール
pip install -U eas-prediction --userメソッド
共通パラメーターの説明
エンドポイント: サーバーのエンドポイント。
標準モードでサービスを呼び出す場合は、このパラメーターをデフォルトゲートウェイのエンドポイントに設定します。例:
182848887922***.cn-shanghai.pai-eas.aliyuncs.com。Virtual Private Cloud (VPC) 直接接続経由でサービスを呼び出す場合は、このパラメーターをリージョンの共通エンドポイントに設定します。たとえば、中国 (上海) リージョンでは、このパラメーターを
pai-eas-vpc.cn-shanghai.aliyuncs.comに設定します。
PredictClient
メソッド | 説明 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 説明: クライアントオブジェクトを初期化します。上記のすべてのメソッドが呼び出された後、 |
|
|
StringRequest
メソッド | 説明 |
|
|
StringResponse
メソッド | 説明 |
|
|
TFRequest
メソッド | 説明 |
|
|
|
|
|
|
|
|
TFResponse
メソッド | 説明 |
|
|
|
|
TorchRequest
メソッド | 説明 |
| 説明: TorchRequest クラスのオブジェクトを作成します。 |
|
|
|
|
|
|
TorchResponse
メソッド | 説明 |
|
|
|
|
QueueClient
メソッド | 説明 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Watcher
メソッド | 説明 |
|
|
| 説明: ウォッチャーを閉じてバックエンド接続を終了します。 説明 単一のクライアントに対して開始できるウォッチャーは 1 つだけです。別のウォッチャーを開始する前に、ウォッチャーを閉じる必要があります。 |
デモ
文字列としての入力と出力
カスタムプロセッサを使用してサービスをデプロイする場合、Predictive Model Markup Language (PMML) モデルに基づいてデプロイされたサービスなど、文字列を使用してサービスを呼び出すことがよくあります。デモコード:
#!/usr/bin/env python # EAS 予測用ライブラリのインポート 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}]') # サービスを 1000000 回呼び出します for x in range(0, 1000000): resp = client.predict(request) print(resp)テンソルとしての入力と出力
TensorFlow を使用してサービスをデプロイする場合、TFRequest クラスと TFResponse クラスを使用してサービスを呼び出す必要があります。デモコード:
#!/usr/bin/env python # EAS 予測用ライブラリのインポート 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) # サービスを 1000000 回呼び出します for x in range(0, 1000000): resp = client.predict(req) print(resp)VPC 直接接続チャネルを使用してサービスを呼び出す
VPC 直接接続チャネルを使用して、EAS 専用リソースグループにデプロイされたサービスのみにアクセスできます。VPC 直接接続チャネルを使用するには、EAS 専用リソースグループと指定された vSwitch が同じ VPC 内に存在する必要があります。EAS 専用リソースグループの購入方法とネットワーク接続の構成方法の詳細については、「専用リソースグループを操作する」および「ネットワーク接続を構成する」をご参照ください。 通常モードと比較して、このモードには追加のコード行
client.set_endpoint_type(ENDPOINT_TYPE_DIRECT)が含まれています。 このモードは、高並列性と高トラフィックのシナリオで使用できます。デモコード:#!/usr/bin/env python # EAS 予測用ライブラリのインポート 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__': # エンドポイントとサービス名を使用してクライアントを作成します。VPC アクセスを使用する場合は、リージョンの共通エンドポイントを使用します client = PredictClient('http://pai-eas-vpc.cn-hangzhou.aliyuncs.com', 'mnist_saved_model_example') # サービスアクセストークンを設定します client.set_token('M2FhNjJlZDBmMzBmMzE4NjFiNzZhMmUxY2IxZjkyMDczNzAzYjFi****') # VPC 直接接続チャネルを使用するようにクライアントを設定します client.set_endpoint_type(ENDPOINT_TYPE_DIRECT) # クライアントを初期化します client.init() # 予測メソッド名と入力テンソルを設定します request = TFRequest('predict_images') request.add_feed('images', [1, 784], TFRequest.DT_FLOAT, [1] * 784) # サービスを 1000000 回呼び出します for x in range(0, 1000000): resp = client.predict(request) print(resp)PyTorch モデルの呼び出し
PyTorch を使用してサービスをデプロイする場合、TorchRequest クラスと TorchResponse クラスを使用してサービスを呼び出す必要があります。デモコード:
#!/usr/bin/env python # EAS 予測用ライブラリのインポート 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 # サービスを 10 回呼び出します 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("平均応答時間: %s 秒" % (timer / 10) )Blade プロセッサベースのモデルの呼び出し
Blade プロセッサを使用してサービスをデプロイする場合、BladeRequest クラスと BladeResponse クラスを使用してサービスを呼び出す必要があります。デモコード:
#!/usr/bin/env python # EAS 予測用ライブラリのインポート 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 # サービスを 10 回呼び出します 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("平均応答時間: %s 秒" % (timer / 10) )デフォルトの TensorFlow メソッドと互換性のある EAS Blade プロセッサベースのモデルの呼び出し
TFRequest クラスと TFResponse クラスを使用して、EAS でサポートされているデフォルトの TensorFlow メソッドと互換性のある Blade プロセッサベースのモデルを呼び出すことができます。デモコード:
#!/usr/bin/env python # EAS 予測用ライブラリのインポート from eas_prediction import PredictClient # Blade TFRequest のインポートが必要 from eas_prediction.blade_tf_request import 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 # サービスを 10 回呼び出します 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("平均応答時間: %s 秒" % (timer / 10) )キューイングサービスを使用してデータを送信およびサブスクライブする
キュー内のデータの送受信、キューの状態のクエリ、およびキューによってプッシュされたデータのサブスクライブを行うことができます。次のデモでは、1 つのスレッドがキューにデータをプッシュし、別のスレッドがウォッチャーを使用してプッシュされたデータをサブスクライブします。デモコード:
#!/usr/bin/env python # EAS 予測用ライブラリのインポート 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) # キュー内のすべてのメッセージを切り詰めます attributes = queue.attributes() if 'stream.lastEntry' in attributes: queue.truncate(int(attributes['stream.lastEntry']) + 1) count = 100 # キューにメッセージを送信するスレッドを作成します def send_thread(): for i in range(count): index, request_id = queue.put('[{}]') print('送信: ', i, index, request_id) # キューからのメッセージを監視するスレッドを作成します def watch_thread(): watcher = queue.watch(0, 5, auto_commit=True) i = 0 for x in watcher.run(): print('受信: ', 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()