TensorFlow Serving は、ディープ ラーニング モデルの推論サービスエンジンです。 TensorFlow Serving を使用すると、SavedModel 形式の TensorFlow モデルをオンラインサービスとしてデプロイできます。 TensorFlow Serving は、ローリングアップデートやモデルのバージョン管理などの機能もサポートしています。このトピックでは、TensorFlow Serving イメージを使用してモデルサービスをデプロイする方法について説明します。
始める前に
モデルファイル
TensorFlow Serving イメージを使用してモデルサービスをデプロイするには、モデルファイルが次の構造の Object Storage Service (OSS) バケットに保存されていることを確認してください。
バージョン サブディレクトリ: 各ディレクトリには、少なくとも 1 つのバージョン サブディレクトリが必要です。バージョン サブディレクトリの名前は、モデルバージョンを示す数値である必要があります。数値が大きいほど、モデルバージョンが新しくなります。
モデルファイル: モデルファイルは、バージョン サブディレクトリ内に SavedModel 形式で保存されます。モデルサービスは、最新バージョンに対応するサブディレクトリからモデルファイルを自動的にロードします。
次の手順を実行します。
OSS バケットにモデルストレージディレクトリを作成します(例:
oss://examplebucket/models/tf_serving/)。 詳細については、「ディレクトリの管理」をご参照ください。前の手順で作成したディレクトリにモデルファイルをアップロードします (サンプルとして tf_serving.zip を使用できます)。モデルストレージディレクトリの形式は次のとおりです。
tf_serving ├── modelA │ └── 1 │ ├── saved_model.pb │ └── variables │ ├── variables.data-00000-of-00001 │ └── variables.index │ ├── modelB │ ├── 1 │ │ └── ... │ └── 2 │ └── ... │ └── modelC ├── 1 │ └── ... ├── 2 │ └── ... └── 3 └── ...
モデル構成ファイル
構成ファイルを使用すると、単一のサービス内で複数のモデルを実行できます。単一モデルサービスのみをデプロイする必要がある場合は、この手順をスキップしてください。
以下の手順に従って構成ファイルを作成し、OSS にアップロードします(モデルファイル セクションで提供されている例には、model_config.pbtxt という名前のモデル構成ファイルが含まれており、必要に応じて使用または変更できます)。 この例では、モデル構成ファイルは oss://examplebucket/models/tf_serving/ にアップロードされます。
モデル構成ファイル model_config.pbtxt には、次のものが含まれている必要があります。
model_config_list {
config {
name: 'modelA'
base_path: '/models/modelA/'
model_platform: 'tensorflow'
model_version_policy{
all: {}
}
}
config {
name: 'modelB'
base_path: '/models/modelB/'
model_platform: 'tensorflow'
model_version_policy{
specific {
versions: 1
versions: 2
}
}
version_labels {
key: 'stable'
value: 1
}
version_labels {
key: 'canary'
value: 2
}
}
config {
name: 'modelC'
base_path: '/models/modelC/'
model_platform: 'tensorflow'
model_version_policy{
latest {
num_versions: 2
}
}
}
}次の表に、主要なパラメーターを示します。
パラメーター | 必須 | 説明 |
name | いいえ | モデルの名前。このパラメーターを指定することをお勧めします。指定しないと、後でサービスを呼び出すことができません。 |
base_path | はい | サービスインスタンス内のモデルディレクトリへのパス。 後続の手順でモデルファイルを読み取るために使用されます。 たとえば、マウントディレクトリが |
model_version_policy | いいえ | モデルバージョンのロードポリシー。
|
version_labels | いいえ | モデルバージョンを識別するためのカスタムラベル。 version_labels がないと、モデルバージョンは番号でしか区別できません。 リクエストパスは version_labels を設定すると、バージョンラベルをリクエストして特定のバージョン番号を指すことができます: 説明 ラベルは、デフォルトでサービスとしてロードおよび開始されたモデルバージョンにのみ割り当てることができます。 ロードされていないモデルバージョンにラベルを割り当てるには、[実行するコマンド] を |
サービスのデプロイ
次のいずれかの方法を使用して、TensorFlow Serving モデルサービスをデプロイできます。
シナリオベースのデプロイメント: 基本的なデプロイメントシナリオに適しています。少数のパラメーターを構成するだけで、TensorFlow Serving モデルサービスをデプロイできます。
カスタムデプロイメント: 柔軟な構成がサポートされています。たとえば、ポートを変更したり、モデルファイルのポーリング期間を指定したりできます。
TensorFlow Serving モデルサービスはポート 8501 と 8500 をサポートしています。
8501: ポート 8501 で HTTP または REST サーバーを起動して、HTTP リクエストを受信します。
8500: ポート 8500 で Google 遠隔手続き呼出し (gRPC) サーバーを起動して、gRPC リクエストを受信します。
デフォルトでは、シナリオベースのデプロイメントはポート 8501 を使用し、変更することはできません。ポート 8500 を使用するには、カスタムデプロイメントを選択する必要があります。
シナリオベースのデプロイメント
次の手順を実行します。
PAI コンソール にログオンします。リージョンとワークスペースを選択します。次に、[elastic Algorithm Service (EAS) に入る] をクリックします。
[elastic Algorithm Service (EAS)] ページで、[サービスのデプロイ] をクリックします。表示されるページの [シナリオベースのモデルデプロイメント] セクションで、[tensorflow Serving デプロイメント] をクリックします。
[tfserving デプロイメント] ページで、次の表に示す主要なパラメーターを構成します。その他のパラメーターについては、「PAI コンソールでモデルサービスをデプロイする」をご参照ください。
パラメーター
説明
[デプロイ方法]
サポートされているデプロイ方法は次のとおりです。
[標準モデルデプロイメント]: この方法は、単一モデルを使用するサービスをデプロイする場合に使用します。
[構成ファイルデプロイメント]: この方法は、複数のモデルを組み込んだサービスをデプロイする場合に使用します。
[モデル設定]
[標準モデルデプロイメント] を [デプロイ方法] として選択した場合は、モデルファイルを含む OSS パスを指定します。
[構成ファイルデプロイメント] を [デプロイ方法] として選択した場合は、次のパラメーターを構成します。
[OSS]: モデルファイルが保存されている OSS パスを選択します。
[マウントパス]: モデルファイルにアクセスするためのサービスインスタンス内の宛先パスを指定します。
[構成ファイル]: モデル構成ファイルの OSS パスを選択します。
構成例:
パラメーター
単一モデルの例 (modelA をデプロイ)
複数モデルの例
[サービス名]
modela_scene
multi_scene
[デプロイ方法]
[標準モデルデプロイメント] を選択します。
[構成ファイルデプロイメント] を選択します。
[モデル設定]
OSS:
oss://examplebucket/models/tf_serving/modelA/.[OSS]:
oss://examplebucket/models/tf_serving/.[マウントパス]: /models
[構成ファイル]:
oss://examplebucket/models/tf_serving/model_config.pbtxt
[デプロイ] をクリックします。
カスタムデプロイメント
次の手順を実行します。
PAI コンソール にログオンします。リージョンとワークスペースを選択します。次に、[elastic Algorithm Service (EAS) に入る] をクリックします。
[elastic Algorithm Service (EAS)] ページで、[サービスのデプロイ] をクリックします。[カスタムモデルデプロイメント] セクションで、[カスタムデプロイメント] をクリックします。
[カスタムデプロイメント] ページで、次の表に示す主要なパラメーターを構成します。その他のパラメーターについては、「PAI コンソールでモデルサービスをデプロイする」をご参照ください。
パラメーター
説明
[イメージ構成]
[alibaba Cloud イメージ] から tensorflow-serving のバージョンを選択します。最新バージョンを使用することをお勧めします。
説明モデルサービスで GPU リソースが必要な場合、イメージバージョンは x.xx.x-gpu 形式である必要があります。
[モデル設定]
複数の方法を使用してモデルファイルを構成できます。この例では [OSS] を使用します。
[URI]: モデルファイルが保存されている OSS パスを選択します。
[マウントパス]: モデルファイルを読み取るためのサービスインスタンス内のパス。
[実行コマンド]
tensorflow-serving の起動パラメーター。 tensorflow-serving イメージを選択すると、コマンド
/usr/bin/tf_serving_entrypoint.shがプリロードされます。 次のパラメーターを構成します。単一モデルデプロイメントの起動パラメーター:
--model_name: モデルの名前。サービスリクエスト URL で使用されます。デフォルト値: model。
--model_base_path: サービスインスタンス内のモデルディレクトリへのパス。 デフォルト値:
/models/model。
複数モデルデプロイメントの起動パラメーター:
--model_config_file: 必須。モデル構成ファイルへのパス。
--model_config_file_poll_wait_seconds: オプション。 モデル構成ファイルの更新を確認する間隔(秒単位)。 たとえば、
--model_config_file_poll_wait_seconds=30は、サービスが 30 秒ごとにファイルを確認することを意味します。説明新しい構成ファイルが検出されると、新しいファイルの変更のみが適用されます。たとえば、モデル A が新しいファイルから削除され、モデル B が追加されると、サービスはモデル A をアンロードし、モデル B をロードします。
--allow_version_labels_for_unavailable_models: オプション。 デフォルト値: false。 ロードされていないモデルバージョンにカスタムラベルを割り当てるには、true に設定します。 たとえば、
--allow_version_labels_for_unavailable_models=true。
構成例:
パラメーター
単一モデルの例 (modelA をデプロイ)
複数モデルの例
[デプロイ方法]
[イメージベースのデプロイメント] を選択します。
[イメージ構成]
[alibaba Cloud イメージ]: tensorflow-serving:2.14.1 を選択します。
[モデル設定]
[OSS] を選択します。
[URI]:
oss://examplebucket/models/tf_serving/.[マウントパス]:
/models.
[実行コマンド]
/usr/bin/tf_serving_entrypoint.sh --model_name=modelA --model_base_path=/models/modelA/usr/bin/tf_serving_entrypoint.sh --model_config_file=/models/model_config.pbtxt --model_config_file_poll_wait_seconds=30 --allow_version_labels_for_unavailable_models=trueデフォルトのポート番号は 8501 です。モデルサービスは、ポート 8501 で HTTP または REST サーバーを起動して、HTTP リクエストを受信します。サービスで gRPC リクエストをサポートするには、次の操作を実行します。
[環境情報] で、[ポート番号] を 8500 に変更します。
[環境情報] で、[gRPC を有効にする] を選択します。
[サービス構成の編集] で、次の構成を追加します。
"networking": { "path": "/" }
[デプロイ] を選択します。
モデルサービスの呼び出し
モデルサービスのデプロイ時に構成したポート番号に基づいて、HTTP または gRPC リクエストをモデルサービスに送信できます。次の例では、modelA にリクエストを送信します。
テストデータを準備する
ModelA は、28x28 のグレースケール画像で構成される Fashion-MNIST トレーニング データセットを使用する画像分類モデルです。 サンプルが 10 個のカテゴリのいずれかに属する可能性を予測します。 テストでは、modelA サービスリクエストのテストデータは
[[[[1.0]] * 28] * 28]で表されます。サンプルリクエストを表示します。
HTTP リクエスト
サービスは、ポート 8501 で HTTP リクエストをリッスンするように構成されています。単一モデルと複数モデルの両方のデプロイメントの HTTP リクエストパスの概要を以下に示します。
単一モデル
複数モデル
パス形式:
<service_url>/v1/models/<model_name>:predictここで:
シナリオベースのデプロイメントの場合、<model_name> は model として事前定義されています。
カスタムデプロイメントの場合、<model_name> は [実行するコマンド] で設定されたモデル名に対応します。デフォルト値: model。
サービスは、モデルバージョンが指定されているリクエストと指定されていないリクエストの両方に対応します。それぞれのパス形式は次のとおりです。
バージョンが指定されていないリクエスト (最新バージョンを自動的にロード):
<service_url>/v1/models/<model_name>:predictモデルバージョンが指定されているリクエスト:
<service_url>/v1/models/<model_name>/versions/<version_num>:predictバージョンラベルが構成されている場合:
<service_url>/v1/models/<model_name>/labels/<version label>:predict
ここで、<model_name> はモデルの構成ファイルで設定された名前を指します。
<service_url> はサービスのエンドポイントです。 表示するには、[Elastic Algorithm Service (EAS)] ページに移動し、目的のサービスの [サービスの種類] 列の [呼び出し方法] をクリックします。 この URL は、オンラインデバッグにコンソールを使用するときに事前に入力されます。
たとえば、modelA のシナリオベースの単一モデルデプロイメントの HTTP リクエストパスは
<service_url>/v1/models/model:predictです。コンソールでオンラインデバッグを実行し、Python コードを使用してサービスリクエストを送信する方法の例を以下に示します。
オンラインデバッグを実行する
サービスがデプロイされたら、[アクション] 列の [オンラインデバッグ] を選択します。 <service_url> は [リクエストパラメーターのオンラインチューニング] に含まれています。 パス
/v1/models/model:predictを URL に追加し、[本文] にリクエストデータを入力します。{"signature_name": "serving_default", "instances": [[[[1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0]], [[1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0]], [[1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0]], [[1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0]], [[1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0]], [[1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0]], [[1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0]],(以下略)]]}パラメーターを設定したら、[リクエストの送信] をクリックします。戻り値の例:

Python コードを使用して HTTP リクエストを送信する
Python コードの例:
from urllib import request import json # サービスエンドポイントとトークンに置き換えてください。 # トークンは、推論サービスリストの [サービスメソッド] 列にある [呼び出し情報] をクリックすると、[パブリックアドレス呼び出し] タブに表示されます。 service_url = '<service_url>' token = '<test-token>' # シナリオベースの単一モデルデプロイメントの場合は model を使用します。その他の場合は、上記のパス記述テーブルを参照してください。 model_name = "model" url = "{}/v1/models/{}:predict".format(service_url, model_name) # HTTP リクエストを作成します。 req = request.Request(url, method="POST") req.add_header('authorization', token) data = { 'signature_name': 'serving_default', 'instances': [[[[1.0]] * 28] * 28] } # リクエストを送信します。 response = request.urlopen(req, data=json.dumps(data).encode('utf-8')).read() # レスポンスを表示します。 response = json.loads(response) print(response)gRPC リクエスト
gRPC リクエストの場合は、サービスがポート 8500 を使用するように構成し、必要な設定を追加します。 gRPC リクエストを送信するための Python コードの例を以下に示します。
import grpc import tensorflow as tf from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_service_pb2_grpc from tensorflow.core.framework import tensor_shape_pb2 # サービスのエンドポイント。詳細については、以下の host パラメーターの説明を参照してください。 host = "tf-serving-multi-grpc-test.166233998075****.cn-hangzhou.pai-eas.aliyuncs.com:80" # <test-token> をサービスのトークンに置き換えます。トークンは [パブリックエンドポイント] タブで確認できます。 token = "<test-token>" # モデルの名前。詳細については、以下の name パラメーターの説明を参照してください。 name = "<model_name>" signature_name = "serving_default" # 使用するモデルバージョンに値を設定します。リクエストでは 1 つのモデルバージョンのみを指定できます。 version = "<version_num>" # gRPC リクエストを作成します。 request = predict_pb2.PredictRequest() request.model_spec.name = name request.model_spec.signature_name = signature_name request.model_spec.version.value = version request.inputs["keras_tensor"].CopyFrom(tf.make_tensor_proto([[[[1.0]] * 28] * 28])) # リクエストを送信します。 channel = grpc.insecure_channel(host) stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) metadata = (("authorization", token),) response, _ = stub.Predict.with_call(request, metadata=metadata) print(response)次の表に、主要なパラメーターを示します。
パラメーター
説明
host
http://プレフィックスがなく、:80サフィックスが付いたモデルサービスのエンドポイント。 エンドポイントを取得するには、次の手順を実行します。 [Elastic Algorithm Service (EAS)] ページに移動し、モデルサービスを見つけ、[サービスの種類] 列の [呼び出し方法] をクリックします。name
単一モデル gRPC リクエストの場合:
シナリオベースのデプロイメントでは、name を model に設定します。
カスタムデプロイメントでは、name を [実行するコマンド] で指定されたモデル名に設定します。設定しない場合、デフォルトで model になります。
複数モデル gRPC リクエストの場合:
name をモデル構成ファイルで概説されているモデル名に設定します。
version
使用するモデルバージョン。リクエストでは 1 つのモデルバージョンのみを指定できます。
metadata
モデルサービスのトークン。 [呼び出し方法] をクリックして表示できます。
関連情報
Triton Inference Server イメージを使用してモデルサービスをデプロイする方法については、「Triton Inference Server イメージを使用してモデルサービスをデプロイする」をご参照ください。
カスタムイメージを作成して、EAS にモデルサービスをデプロイできます。詳細については、「カスタムイメージを使用してモデルサービスをデプロイする」をご参照ください。