TensorFlow SavedModel 形式のモデルを、Elastic Algorithm Service (EAS) 上に REST API 推論サービスとしてデプロイできます。 CPU と GPU の両方をサポートしています。
前提条件
開始する前に、以下が準備できていることを確認してください。
-
SavedModel 形式の TensorFlow モデル。 Keras およびチェックポイント形式のモデルは、デプロイ前に変換する必要があります。変換手順については、「TensorFlow モデルを SavedModel 形式でエクスポートする」をご参照ください。
-
(オプション) PAI-Blade で最適化されたモデル。 PAI-Blade で最適化されたモデルは、変換なしで直接実行できます。
モデルのデプロイ
ステップ 1:サービス設定ファイルの作成
processor フィールドを、お使いの TensorFlow バージョンとハードウェアに対応するプロセッサ名に設定します。次の例は、CPU ベースの TensorFlow 1.15 サービスをデプロイする場合の設定です。
{
"name": "tf_serving_test",
"model_path": "oss://examplebucket.oss-cn-shanghai.aliyuncs.com/models/model.tar.gz",
"processor": "tensorflow_cpu_1.15",
"metadata": {
"instance": 1,
"cpu": 1,
"memory": 4000
}
}
プロセッサ名の一覧とサポートされているバージョンについては、「プロセッサのバージョン」をご参照ください。
EASCMD クライアントを使用してデプロイする方法については、「サービスのデプロイ:EASCMD & DSW」をご参照ください。コンソールからデプロイする方法については、「サービスのデプロイ:コンソール」をご参照ください。
ステップ 2:エンドポイントと認証トークンの取得
デプロイ後、サービス詳細の概要 ページに移動し、基本情報 セクションでエンドポイント情報の表示 をクリックして、サービスアクセス用のエンドポイントとサービス認証用のトークンを表示します。
サービスの呼び出し
TensorFlow サービスは、入力と出力の両方に protobuf 形式を使用します。オンラインデバッグは protobuf 形式をサポートしていません。
EAS は、リクエストのシリアル化を処理し、直接接続とフォールトトレランス機構を含むソフトウェア開発キット (SDK) を提供しています。生の protobuf リクエストを構築する必要がない限り、SDK を使用してください。
モデルの入出力の確認
SavedModel 形式のモデルは、空のリクエストを送信すると、入出力の構造を JSON 形式で返します。これを使用して、推論コードを記述する前にテンソル名、形状、データ型を確認できます。
# 空のリクエスト — モデル構造を返す
curl <endpoint>/api/predict/<service-name> \
-H 'Authorization: <authentication-token>'
レスポンスの例:
{
"inputs": [
{
"name": "images",
"shape": [-1, 784],
"type": "DT_FLOAT"
}
],
"outputs": [
{
"name": "scores",
"shape": [-1, 10],
"type": "DT_FLOAT"
}
],
"signature_name": "predict_images"
}
Frozen pb 形式のモデルは構造情報を返しません。
推論リクエストの送信
次の例は、Python SDK を使用してループ内で推論リクエストを送信する方法を示しています。
#!/usr/bin/env python
from eas_prediction import PredictClient
from eas_prediction import TFRequest
if __name__ == '__main__':
# エンドポイントとサービス名でクライアントを初期化します
client = PredictClient('http://1828488879222***.cn-shanghai.pai-eas.aliyuncs.com', 'mnist_saved_model_example')
client.set_token('YTg2ZjE0ZjM4ZmE3OTc0NzYxZDMyNmYzMTJjZTQ1****')
client.init()
# シグネチャ名を使用してリクエストを構築します
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)
パラメータの詳細については、「Python SDK の使用」をご参照ください。
生の protobuf を使用してサービスリクエストを手動で構築する方法については、「リクエスト形式」をご参照ください。
モデルのウォームアップの設定
TensorFlow モデルは遅延初期化を使用します。モデルが最初にリクエストを受信すると、ファイルとパラメータをメモリにロードします。この初期化により、最初のリクエストで 408 (タイムアウト) や 450 (キューがいっぱい) などのエラーが発生する可能性があり、ローリングアップデート中にレイテンシーのスパイクが発生します。
ローリングアップデート中のサービスのジッターを防ぐため、ウォームアップを設定してください。
ステップ 1:ウォームアップリクエストファイルの作成
手順については、「高度な設定:モデルサービスのウォームアップ」をご参照ください。
ステップ 2:サービスファイルへのウォームアップ設定の追加
OSS 内のウォームアップリクエストファイルを指す warm_up_data_path フィールドを追加します。
{
"name": "tf_serving_test",
"model_path": "oss://examplebucket.oss-cn-shanghai.aliyuncs.com/models/model.tar.gz",
"processor": "tensorflow_cpu_1.15",
"warm_up_data_path": "oss://path/to/warm_up_test.bin",
"metadata": {
"instance": 1,
"cpu": 1,
"memory": 4000
}
}
リクエスト形式
SDK はリクエストのシリアル化を自動的に処理します。リクエストを手動で構築する場合は、以下の protobuf 定義からコードを生成してください。完全な手順については、「TensorFlow サービスリクエストの構築」をご参照ください。
syntax = "proto3";
option cc_enable_arenas = true;
option java_package = "com.aliyun.openservices.eas.predict.proto";
option java_outer_classname = "PredictProtos";
enum ArrayDataType {
DT_INVALID = 0;
DT_FLOAT = 1;
DT_DOUBLE = 2;
DT_INT32 = 3;
DT_UINT8 = 4;
DT_INT16 = 5;
DT_INT8 = 6;
DT_STRING = 7;
DT_COMPLEX64 = 8; // 単精度複素数
DT_INT64 = 9;
DT_BOOL = 10;
DT_QINT8 = 11; // 量子化 int8
DT_QUINT8 = 12; // 量子化 uint8
DT_QINT32 = 13; // 量子化 int32
DT_BFLOAT16 = 14; // Float32 を 16 ビットに切り捨て (キャスト操作のみ)
DT_QINT16 = 15; // 量子化 int16
DT_QUINT16 = 16; // 量子化 uint16
DT_UINT16 = 17;
DT_COMPLEX128 = 18; // 倍精度複素数
DT_HALF = 19;
DT_RESOURCE = 20;
DT_VARIANT = 21; // 任意の C++ データ型
}
// 配列の次元
message ArrayShape {
repeated int64 dim = 1 [packed = true];
}
// 配列を表すプロトコルバッファ
message ArrayProto {
ArrayDataType dtype = 1;
ArrayShape array_shape = 2;
repeated float float_val = 3 [packed = true]; // DT_FLOAT
repeated double double_val = 4 [packed = true]; // DT_DOUBLE
repeated int32 int_val = 5 [packed = true]; // DT_INT32、DT_INT16、DT_INT8、DT_UINT8
repeated bytes string_val = 6; // DT_STRING
repeated int64 int64_val = 7 [packed = true]; // DT_INT64
repeated bool bool_val = 8 [packed = true]; // DT_BOOL
}
// モデルのシグネチャと入力テンソルを指定し、返す前に出力をフィルタリング
message PredictRequest {
string signature_name = 1;
map<string, ArrayProto> inputs = 2;
repeated string output_filter = 3;
}
// 予測が成功した場合の出力テンソルを含む
message PredictResponse {
map<string, ArrayProto> outputs = 1;
}
プロセッサのバージョン
特定のバージョン要件がない限り、最新のプロセッサバージョンを使用してください。新しいバージョンは、より優れたパフォーマンスと前方互換性を提供します。
|
プロセッサ名 |
TensorFlow バージョン |
GPU サポート |
|
tensorflow_cpu_1.12 |
TensorFlow 1.12 |
なし |
|
tensorflow_cpu_1.14 |
TensorFlow 1.14 |
なし |
|
tensorflow_cpu_1.15 |
TensorFlow 1.15 |
なし |
|
tensorflow_cpu_2.3 |
TensorFlow 2.3 |
なし |
|
tensorflow_cpu_2.4 |
TensorFlow 2.4 |
なし |
|
tensorflow_cpu_2.7 |
TensorFlow 2.7 |
なし |
|
tensorflow_gpu_1.12 |
TensorFlow 1.12 |
あり |
|
tensorflow_gpu_1.14 |
TensorFlow 1.14 |
あり |
|
tensorflow_gpu_1.15 |
TensorFlow 1.15 |
あり |
|
tensorflow_gpu_2.4 |
TensorFlow 2.4 |
あり |
|
tensorflow_gpu_2.7 |
TensorFlow 2.7 |
あり |