このトピックでは、公式 Python SDK の詳細な API リファレンスと、一般的な入力形式と出力形式に対応する完全なコード例を掲載します。
SDK のユースケースと動作原理は、「サービスコール用 SDK」をご参照ください。
前提条件
pip install -U eas-prediction --userクイックスタート
モデルの入力データフォーマットに一致する Request クラスを選択します。次のコードは、StringRequest を使用するエンドツーエンドのサービスコールにおける最小限の例です。この例では、JSON 構造のデータを文字列として送信しています。その他の例については、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)API リファレンス
Python SDK は、目的別にグループ化された以下のクラスを提供します。
グループ | 説明 |
メインクライアント |
|
入力と出力 |
|
キューサービス |
|
共通パラメーター
エンドポイント:サーバーのエンドポイントアドレスです。
標準サービスの場合、このパラメーターをデフォルトのゲートウェイエンドポイントに設定します。例:
182848887922***.cn-shanghai.pai-eas.aliyuncs.com。VPC ダイレクト接続リクエストの場合、このパラメーターをサービスの VPC ダイレクト接続エンドポイントに設定します。フォーマットは
<uid>.vpc.<region-id>.pai-eas.aliyuncs.comです。例:182848887922****.vpc.cn-shanghai.pai-eas.aliyuncs.com。
PredictClient クラス
メソッド | 説明 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| PredictClient オブジェクトを初期化します。パラメーターを設定した後、設定を有効にするには |
|
|
StringRequest クラス
メソッド | 説明 |
|
|
StringResponse クラス
メソッド | 説明 |
|
|
TFRequest クラス
メソッド | 説明 |
|
|
|
|
|
|
|
|
TFResponse クラス
メソッド | 説明 |
|
|
|
|
TorchRequest クラス
メソッド | 説明 |
|
|
|
|
|
|
|
|
TorchResponse クラス
メソッド | 説明 |
|
|
|
|
QueueClient クラス
メソッド | 説明 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Watcher クラス
メソッド | 説明 |
|
|
| 説明:Watcher オブジェクトを閉じて、バックエンドのデータ接続を終了します。 説明 クライアントは一度に 1 つのアクティブな Watcher しか持つことができません。新しい Watcher を開始する前に、現在の Watcher を閉じる必要があります。 |
例
同期推論の例 (入出力フォーマット別)
サービスの入力タイプと出力タイプに基づいてサンプルコードを選択します。
文字列
カスタムプロセッサでサービスをデプロイするユーザーは、通常、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
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)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) )BladeProcessor
BladeProcessor を使用する場合は、入力および出力データフォーマットとして 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] * 46080)
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 インターフェイスと互換性のある BladeProcessor
BladeProcessor ユーザーは、入力および出力データフォーマットとして TFRequest と TFResponse を使用できます。これらのフォーマットは、Elastic Algorithm Service (EAS) のデフォルトの TensorFlow インターフェイスと互換性があります。以下にサンプルを示します。
#!/usr/bin/env python
from eas_prediction import PredictClient
from eas_prediction.blade_tf_request import TFRequest # 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] * 46080)
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) )VPC 専用接続を使用したサービスコールの例
VPC 専用接続を使用するには、サービスの Virtual Private Cloud (VPC) を設定します。詳細については、「Elastic Algorithm Service (EAS) のリソースグループの使用」および「EAS からパブリックまたは内部リソースへのアクセス」をご参照ください。この呼び出し方式は、通常の方式と比較してコードを 1 行追加するだけで済みます: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__':
# VPC 専用接続エンドポイントのフォーマットは <uid>.vpc.<region-id>.pai-eas.aliyuncs.com です。EAS コンソールのサービス詳細ページにある [Invocation Information] タブでエンドポイントを確認できます。
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)例:キューサービスにおけるデータの送信とサブスクライブ
QueueClient を使用して、キューサービスへのデータの送信、データのクエリ、サービスステータスの確認、データプッシュのサブスクライブができます。次のデモでは、2 つのスレッドを使用した例を示します。1 つのスレッドがキューサービスにデータを送信し、もう 1 つのスレッドが Watcher を使用してプッシュされたデータをサブスクライブします。
#!/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)
# キュー内のすべてのメッセージを切り捨てます
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('send: ', i, index, request_id)
# キューからのメッセージを監視するスレッドを作成します
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()トラブルシューティング
Python SDK の呼び出しで発生する例外の症状、原因、およびトラブルシューティングについては、「サービスコール SDK」の「呼び出し例外のトラブルシューティング」セクションをご参照ください。これらの例外には、認証、ルーティング、接続、サーバーに関する一般的な問題が含まれます。
サービスステータスコード、エラーメッセージの説明、および推奨されるソリューションの完全な一覧については、「付録:サービスステータスコードと一般的なエラー」をご参照ください。