このトピックでは、公式の Python SDK の詳細な API リファレンスと、一般的な入力および出力フォーマット向けの完全なコード例を掲載しています。
SDK のユースケースと動作原理については、「サービス呼び出し用SDK」をご参照ください。
前提条件
pip install -U eas-prediction --userクイックスタート
モデルの入力データ形式に一致する Request クラスを選択します。 次のコードは、文字列リクエストを使用するエンドツーエンドのサービスコールの最小限の例です。 詳細については、「例」をご参照ください。
#!/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] * 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 インターフェイスと互換性のある 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] * 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) )VPC ダイレクト接続を使用したサービス呼び出しの例
ダイレクト接続を使用するには、サービス用に仮想プライベートクラウド (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 ダイレクト接続のエンドポイント形式は .vpc..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 つのスレッドを使用する例です。一方のスレッドがキューサービスにデータを送信し、もう一方のスレッドが 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()
# キュー内のすべてのメッセージをトランケートします
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()例外処理とリクエスト ID の取得
PredictClient.predict() の呼び出しが失敗すると、PredictException がスローされます。この例外には、code (HTTP ステータスコード) と message (エラーメッセージ) の 2 つの属性のみがあります。個別の request_id 属性はありません。
リクエスト ID を取得する方法は、リクエストがサーバーに到達したかどうかによって異なります。
リクエストがサーバーに到達した場合:サーバーから返される XML レスポンスボディが、例外の
message属性に埋め込まれています。そのボディ内の<RequestId>要素が呼び出しのリクエスト ID となっており、正規表現または XML パーサーを使用して抽出する必要があります。たとえば、存在しないサービス名を使用して有効なエンドポイントを呼び出すと、サーバーから HTTP 404 が返され、messageから019FEB40-3720-5073-B3E5-4532B42EFDE9などのリクエスト ID を解析できます。リクエストがサーバーに到達しなかった場合:ネットワーク層で呼び出しが失敗した場合 (DNS 名前解決の失敗や SSL ハンドシェイクの失敗など) 、
messageにはリクエスト ID が含まれません。たとえば、解決できないエンドポイントを呼び出すと、codeが 500 で、messageにはMax retries exceededやFailed to resolveなどの情報を含む例外が発生します。この場合、サーバーを調査するのではなく、クライアント側のネットワークと証明書の設定を確認してください。
次の例は、例外をキャッチし、code を読み取り、message からリクエスト ID を解析する方法を示しています。
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')エラーメッセージが SSL 関連の障害を示している場合は、次の手順でトラブルシューティングを行ってください。
CA 証明書をアップグレードするには、
pip install --upgrade certifiを実行してください。ローカルのプロキシ設定が正しいこと、およびプロキシが HTTPS リクエストをインターセプトまたは書き換えないことを確認してください。
使用している EAS サービスエンドポイントが HTTPS アクセスをサポートしていること、およびエンドポイントのプロトコルプレフィックスが実際のゲートウェイと一致していることを確認してください。
トラブルシューティング
Python SDK の呼び出しによる例外の症状、原因、トラブルシューティングについては、「Service Call SDK」の「Troubleshooting call exceptions」セクションをご参照ください。これらの例外には、認証、ルーティング、接続、サーバーに関する一般的な問題が含まれます。
サービスステータスコード、エラーメッセージの説明、推奨ソリューションの完全なリストについては、「付録:サービスステータスコードと一般的なエラー」をご参照ください。