Elastic Algorithm Service (EAS) は、標準の SavedModel 形式の TensorFlow モデルをオンラインサービスとしてデプロイするための組み込み TensorFlow プロセッサを提供します。このトピックでは、モデルサービスをデプロイして呼び出す方法について説明します。
背景情報
ご利用のモデルが Keras モデルまたは Checkpoint モデルの場合、デプロイする前に SavedModel 形式に変換する必要があります。詳細については、「SavedModel 形式での TensorFlow モデルのエクスポート」をご参照ください。PAI-Blade によって最適化されたモデルは、直接実行できます。
TensorFlow プロセッサのバージョン
TensorFlow は、CPU と GPU の両方のデバイスをサポートする複数のバージョンで利用可能です。特定のビジネス要件がない場合、サービスをデプロイする際は、最新バージョンを使用してください。新しいバージョンの TensorFlow は、より優れたパフォーマンスを提供し、以前のバージョンの機能と前方互換性があります。次の表に、各 TensorFlow バージョンのプロセッサ名を示します。
|
プロセッサ名 |
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 |
はい |
ステップ 1: サービスのデプロイ
-
オプション: ウォームアップ用のリクエストファイルを構成します。
一部の TensorFlow モデルが初めて呼び出されると、関連ファイルとパラメーターがメモリにロードされる必要があります。このプロセスには時間がかかり、最初の数回のリクエストで高い応答時間 (RT) を引き起こす可能性があります。408 (リクエストタイムアウト) や 450 (キューが満杯のためリクエストが破棄されました) などのエラーにつながる可能性もあります。ローリングアップデート中のサービスジッターを防ぐため、サービスデプロイメント中にモデルをウォームアップするためのパラメーターを追加できます。これにより、ウォームアップが完了した後にのみサービスインスタンスがトラフィックを受信することが保証されます。詳細については、「高度な構成: モデルサービスのウォームアップ」をご参照ください。
-
サービスをデプロイします。
EASCMD クライアントを使用して TensorFlow モデルサービスをデプロイする場合、[processor type] パラメーターをプロセッサ名に設定します。以下は、構成ファイルの例です。
{ "name": "tf_serving_test", "model_path": "http://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 } }クライアントを使用してサービスをデプロイする方法の詳細については、「サービスデプロイメント: EASCMD & DSW」をご参照ください。
コンソールから TensorFlow モデルサービスをデプロイすることもできます。詳細については、「サービスデプロイメント: コンソール」をご参照ください。
-
TensorFlow サービスがデプロイされた後、[Elastic Algorithm Service (EAS)] ページに移動します。呼び出したいサービスを見つけ、[サービスメソッド] 列の [呼び出し情報の表示] をクリックします。この操作により、サービスエンドポイントと認証トークンが表示されます。
ステップ 2: サービスの呼び出し
TensorFlow サービスは、プレーンテキストではなく protobuf 形式を入力と出力に使用するため、オンラインデバッグ機能を使用できません。オンラインデバッグ機能はプレーンテキストデータのみをサポートしています。
EAS は、サービスリクエストと応答データをカプセル化するためのソフトウェア開発キット (SDK) を提供しています。SDK には、直接接続とフォールトトレランスのメカニズムが含まれています。SDK を使用してリクエストを構築および送信することを推奨します。手順は次のとおりです。
-
モデル構造の照会。
標準の SavedModel 形式のモデルの場合、サービスに空のリクエストを送信して、JSON 形式でモデル構造情報を取得できます。
// 空のリクエストを送信します。 $ curl 1828488879222***.cn-shanghai.pai-eas.aliyuncs.com/api/predict/mnist_saved_model_example -H 'Authorization: YTg2ZjE0ZjM4ZmE3OTc0NzYxZDMyNmYzMTJjZTQ1***' // 返されたモデル構造情報。 { "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 の使用」をご参照ください。
サービスリクエストを自分で構築することもできます。詳細については、「リクエスト形式」をご参照ください。
リクエスト形式
TensorFlow プロセッサは、入力と出力に protobuf 形式を使用します。SDK を使用してリクエストを送信する場合、SDK がリクエストをカプセル化します。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 {
// DataType の有効な値ではありません。DataType フィールドが
// 設定されていないことを示します。
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; // 16 ビットに切り捨てられた Float32。キャスト操作のみ。
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;
// DT_FLOAT。
repeated float float_val = 3 [packed = true];
// DT_DOUBLE。
repeated double double_val = 4 [packed = true];
// DT_INT32、DT_INT16、DT_INT8、DT_UINT8。
repeated int32 int_val = 5 [packed = true];
// DT_STRING。
repeated bytes string_val = 6;
// DT_INT64。
repeated int64 int64_val = 7 [packed = true];
// DT_BOOL。
repeated bool bool_val = 8 [packed = true];
}
// PredictRequest は、実行する TensorFlow モデルと、
// 入力がテンソルにマッピングされる方法、および出力が
// ユーザーに返される前にフィルタリングされる方法を指定します。
message PredictRequest {
// 評価する名前付きシグネチャ。指定されていない場合、デフォルトのシグネチャが
// 使用されます。
string signature_name = 1;
// 入力テンソル。
// 入力テンソルの名前はエイリアス名です。エイリアスから実際の
// 入力テンソル名へのマッピングは、モデルエクスポートの "inputs" キーの下に
// 名前付き汎用シグネチャとして保存されることが期待されます。
// "inputs" という名前の汎用シグネチャにリストされている各エイリアスは、
// 予測を実行するために正確に一度提供される必要があります。
map<string, ArrayProto> inputs = 2;
// 出力フィルター。
// 指定された名前はエイリアス名です。エイリアスから実際の出力
// テンソル名へのマッピングは、モデルエクスポートの "outputs" キーの下に
// 名前付き汎用シグネチャとして保存されることが期待されます。
// ここで指定されたテンソルのみが実行/フェッチされ、返されます。
// ただし、何も指定されていない場合は、名前付きシグネチャで指定されたすべてのテンソルが
// 実行/フェッチされ、返されます。
repeated string output_filter = 3;
}
// 正常な実行時の PredictRequest の応答。
message PredictResponse {
// 出力テンソル。
map<string, ArrayProto> outputs = 1;
}