APPLIES TO:
Azure CLI ml extension v2 (current)
Python SDK azure-ai-ml v2 (current)
Azure Machine Learningでは、カスタム コンテナーを使用してモデルをオンライン エンドポイントにデプロイできます。 カスタム コンテナーデプロイでは、Azure Machine Learningが使用する既定の Python Flask サーバー以外の Web サーバーを使用できます。
カスタム デプロイを使用すると、次のことができます。
- TensorFlow Serving (TF Serving)、TorchServe、Triton Inference Server、Plumber R パッケージ、Azure Machine Learning推論の最小イメージなど、さまざまなツールとテクノロジを使用します。
- 引き続き、Azure Machine Learningが提供する組み込みの監視、スケーリング、アラート、認証を利用します。
この記事では、TF サービス イメージを使用して TensorFlow モデルを提供する方法について説明します。
Prerequisites
Azure Machine Learning ワークスペース。 ワークスペースを作成する手順については、「ワークスペースの 作成」を参照してください。
Azure CLIと
ml拡張機能または Azure Machine Learning Python SDK v2:Azure CLIと
拡張機能をインストールするには、 CLI (v2) のインストールとセットアップ を参照してください。この記事の例では、Bash シェルまたは互換性のあるシェルを使用することを前提としています。 たとえば、Linux システムまたは Windows Subsystem for Linux でシェルを使用できます。
ワークスペースを含み、あなたまたはサービス プリンシパルが寄稿者アクセス権を持つ Azure リソース グループ。 ワークスペースを 作成してワークスペース を構成する手順を使用する場合は、この要件を満たします。
Docker エンジン。ローカルにインストールされ、実行されています。 この前提条件を 強くお勧めします。 モデルをローカルにデプロイするために必要であり、デバッグに役立ちます。
配置例
次の表はデプロイの例カスタム コンテナーを使用し、さまざまなツールとテクノロジを利用する例を示しています。
| Example | Azure CLI スクリプト | Description |
|---|---|---|
| minimal/multimodel | deploy-custom-container-minimal-multimodel | Azure Machine Learning推論の最小イメージを拡張することで、複数のモデルを 1 つのデプロイにデプロイします。 |
| minimal/single-model | `カスタムコンテナのデプロイ-最小限のシングルモデル` | Azure Machine Learning推論の最小イメージを拡張して、1 つのモデルをデプロイします。 |
| mlflow/multideployment-scikit | deploy-custom-container-mlflow-multideployment-scikit | 異なるPython要件を持つ 2 つの MLFlow モデルを、1 つのエンドポイントの背後にある 2 つの個別のデプロイにデプロイします。 Azure Machine Learning推論の最小イメージを使用します。 |
| r/multimodel-plumber | deploy-custom-container-r-multimodel-plumber | 3 つの回帰モデルを 1 つのエンドポイントにデプロイします。 Plumber R パッケージを使用します。 |
| tfserving/half-plus-two | deploy-custom-container-tfserving-half-plus-two | TF Serving カスタム コンテナーを使用して、Half Plus Two モデルをデプロイします。 標準モデル登録プロセスを使用します。 |
| tfserving/half-plus-two-integrated | デプロイカスタムコンテナ-tfserving-ハーフプラスツー-インテグレーテッド | イメージに統合されたモデルと共に TF Serving カスタム コンテナーを使用して、Half Plus 2 モデルをデプロイします。 |
| torchserve/densenet | deploy-custom-container-torchserve-densenet | TorchServe カスタム コンテナーを使用して 1 つのモデルをデプロイします。 |
| triton/single-model | トリトン単一モデル用・カスタムコンテナのデプロイ | カスタム コンテナーを使用して Triton モデルをデプロイします。 |
この記事では、 tfserving/half-plus-two の例を使用する方法について説明します。
Warning
Microsoft サポート チームは、カスタム イメージによって発生する問題のトラブルシューティングを支援できない場合があります。 問題が発生した場合は、既定のイメージまたは Microsoft が提供するイメージの 1 つを使用して、問題がイメージに固有であるかどうかを確認するように求められる場合があります。
ソース コードをダウンロードする
この記事の手順では、azureml-examples リポジトリのコード サンプルを使用します。 次のコマンドを使用して、リポジトリをクローンします。
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
環境変数を初期化する
TensorFlow モデルを使用するには、いくつかの環境変数が必要です。 次のコマンドを実行して、これらの変数を定義します。
BASE_PATH=endpoints/online/custom-container/tfserving/half-plus-two
AML_MODEL_NAME=tfserving-mounted
MODEL_NAME=half_plus_two
MODEL_BASE_PATH=/var/azureml-app/azureml-models/$AML_MODEL_NAME/1
TensorFlow モデルをダウンロードする
入力値を 2 で除算し、結果に 2 を追加するモデルをダウンロードして解凍します。
wget https://aka.ms/half_plus_two-model -O $BASE_PATH/half_plus_two.tar.gz
tar -xvf $BASE_PATH/half_plus_two.tar.gz -C $BASE_PATH
TF サービス イメージをローカルでテストする
Docker を使用して、テスト用にイメージをローカルで実行します。
docker run --rm -d -v $PWD/$BASE_PATH:$MODEL_BASE_PATH -p 8501:8501 \
-e MODEL_BASE_PATH=$MODEL_BASE_PATH -e MODEL_NAME=$MODEL_NAME \
--name="tfserving-test" docker.io/tensorflow/serving:latest
sleep 10
イメージに対してライブネス要求とスコアリング要求を送信する
コンテナー内のプロセスが実行されていることを確認するライブネス要求を送信します。 応答状態コード 200 OK が表示されます。
curl -v http://localhost:8501/v1/models/$MODEL_NAME
スコアリング要求を送信して、ラベル付けされていないデータの予測を取得できることを確認します。
curl --header "Content-Type: application/json" \
--request POST \
--data @$BASE_PATH/sample_request.json \
http://localhost:8501/v1/models/$MODEL_NAME:predict
イメージを停止する
ローカルでのテストが完了したら、イメージを停止します。
docker stop tfserving-test
オンライン エンドポイントを Azure にデプロイする
オンライン エンドポイントをAzureにデプロイするには、次のセクションの手順を実行します。
エンドポイントとデプロイ用の YAML ファイルを作成する
YAML を使用してクラウド デプロイを構成できます。 たとえば、エンドポイントを構成するには、次の行を含む tfserving-endpoint.yml という名前の YAML ファイルを作成します。
$schema: https://azuremlsdk2.blob.core.windows.net/latest/managedOnlineEndpoint.schema.json
name: tfserving-endpoint
auth_mode: aml_token
デプロイを構成するには、次の行を含む tfserving-deployment.yml という名前の YAML ファイルを作成します。
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: tfserving-deployment
endpoint_name: tfserving-endpoint
model:
name: tfserving-mounted
version: <model-version>
path: ./half_plus_two
environment_variables:
MODEL_BASE_PATH: /var/azureml-app/azureml-models/tfserving-mounted/<model-version>
MODEL_NAME: half_plus_two
environment:
#name: tfserving
#version: 1
image: docker.io/tensorflow/serving:latest
inference_config:
liveness_route:
port: 8501
path: /v1/models/half_plus_two
readiness_route:
port: 8501
path: /v1/models/half_plus_two
scoring_route:
port: 8501
path: /v1/models/half_plus_two:predict
instance_type: Standard_DS3_v2
instance_count: 1
以降のセクションでは、YAML と Python パラメーターに関する重要な概念について説明します。
TestVM
YAML の environment セクション、または Python の Environment コンストラクターで、基本イメージをパラメーターとして指定します。 この例では、docker.io/tensorflow/serving:latest値としてimageを使用します。
コンテナーを検査すると、このサーバーが ENTRYPOINT コマンドを使用してエントリ ポイント スクリプトを開始していることがわかります。 このスクリプトは、 MODEL_BASE_PATH や MODEL_NAMEなどの環境変数を受け取り、 8501などのポートを公開します。 これらの詳細はすべてこのサーバーに関連しており、この情報を使用してデプロイを定義する方法を決定できます。 たとえば、展開定義で MODEL_BASE_PATH 環境変数と MODEL_NAME 環境変数を設定した場合、TF Serving はこれらの値を使用してサーバーを開始します。 同様に、展開定義で各ルートのポートを 8501 に設定すると、それらのルートへのユーザー要求が TF サービス サーバーに正しくルーティングされます。
この例は、TF サービス ケースに基づいています。 ただし、稼働状態を維持し、liveness、readiness、スコアリング ルートに移動する要求に応答する、任意のコンテナーを使用できます。 Dockerfile を形成してコンテナーを作成する方法については、他の例を参照してください。 一部のサーバーでは、CMD命令の代わりにENTRYPOINT命令が使用されます。
ヒント
運用環境のデプロイでは、docker.io/tensorflow/serving:2.18.0を使用する代わりに特定のイメージ バージョン (:latest など) にピン留めして、再現可能なデプロイを確保します。
inference_config パラメーター
environment セクションまたは Environment クラスでは、inference_configはパラメーターです。 これは、3 種類のルート (liveness、readiness、スコアリング ルート) のポートとパスを指定します。 マネージド オンライン エンドポイントで独自のコンテナーを実行する場合は、 inference_config パラメーターが必要です。
readiness ルートと liveness ルート
一部の API サーバーには、サーバーの状態を確認する方法が用意されています。 状態を確認するために指定できるルートには、次の 2 種類があります。
- ライブネス ルート: サーバーが実行されているかどうかを確認するには、liveness ルートを使用します。
- 準備ルート : サーバーが作業の準備ができているかどうかを確認するには、準備ルートを使用します。
機械学習推論のコンテキストでは、モデルを読み込む前に、サーバーが状態コード 200 OK でライブネス要求に応答する場合があります。 サーバーは、モデルをメモリに読み込んだ後にのみ、状態コード 200 OK で準備要求に応答する場合があります。
liveness および readiness probe の詳細については、liveness、readiness、startup probe の構成を参照してください。
選択した API サーバーによって、ライブ性と準備のルートが決まります。 コンテナーをローカルでテストするときは、前の手順でそのサーバーを識別します。 この記事では、TF Serving はライブネス ルートのみを定義するため、デプロイ例では、ライブネス ルートと準備ルートに同じパスを使用します。 ルートを定義するその他の方法については、他の例を参照してください。
ルートをスコアリングする
使用する API サーバーは、作業するペイロードを受け取る方法を提供します。 機械学習推論のコンテキストでは、サーバーは特定のルートを介して入力データを受信します。 前の手順でコンテナーをローカルでテストするときに、API サーバーのルートを特定します。 作成するデプロイを定義するときに、そのルートをスコアリング ルートとして指定します。
デプロイが正常に作成されると、エンドポイントの scoring_uri パラメーターも更新されます。 この事実を確認するには、次のコマンドを実行します: az ml online-endpoint show -n <endpoint-name> --query scoring_uri。
マウントされたモデルを見つける
モデルをオンライン エンドポイントとしてデプロイする場合は、モデルをエンドポイントにAzure Machine Learning mountsします。 モデルがマウントされると、新しい Docker イメージを作成しなくても、新しいバージョンのモデルをデプロイできます。 既定では、 my-model とバージョン 1 という名前で登録されたモデルは、デプロイされたコンテナー内のパス /var/azureml-app/azureml-models/my-model/1 にあります。
たとえば、次の設定を考えてみましょう。
- ローカル コンピューター上のディレクトリ構造
/azureml-examples/cli/endpoints/online/custom-container - モデル名は
half_plus_twoです
tfserving-deployment.yml ファイルの model セクションに次の行が含まれているとします。 このセクションでは、name 値は、モデルをAzure Machine Learningに登録するために使用する名前を参照します。
model:
name: tfserving-mounted
version: 1
path: ./half_plus_two
この場合、デプロイを作成すると、モデルは次のフォルダーの下に配置されます: /var/azureml-app/azureml-models/tfserving-mounted/1。
必要に応じて、 model_mount_path 値を構成できます。 この設定を調整することで、モデルをマウントするパスを変更できます。
Important
model_mount_path値は、Linux の有効な絶対パスである必要があります (コンテナー イメージのゲスト OS 内)。
Important
model_mount_pathは、BYOC (独自のコンテナーを持ち込む) シナリオでのみ使用できます。 BYOC シナリオでは、オンライン展開で使用される環境に inference_config パラメーター が構成されている必要があります。 Azure Machine Learning CLI または Python SDK を使用して、環境の作成時に inference_config パラメーターを指定します。 スタジオでは現在、このパラメーターの指定はサポートされていません。
model_mount_pathの値を変更する場合は、MODEL_BASE_PATH環境変数も更新する必要があります。 ベース パスが見つからないというエラーが原因でデプロイが失敗しないように、 MODEL_BASE_PATH を model_mount_path と同じ値に設定します。
たとえば、model_mount_path ファイルに tfserving-deployment.yml パラメーターを追加できます。 そのファイルの MODEL_BASE_PATH 値を更新することもできます。
name: tfserving-deployment
endpoint_name: tfserving-endpoint
model:
name: tfserving-mounted
version: 1
path: ./half_plus_two
model_mount_path: /var/tfserving-model-mount
environment_variables:
MODEL_BASE_PATH: /var/tfserving-model-mount
...
デプロイでは、モデルは /var/tfserving-model-mount/tfserving-mounted/1 にあります。
azureml-app/azureml-modelsではなく、指定したマウント パスの下にあります。
エンドポイントとデプロイを作成する
YAML ファイルを作成したら、次のコマンドを使用してエンドポイントを作成します。
az ml online-endpoint create --name tfserving-endpoint -f endpoints/online/custom-container/tfserving/half-plus-two/tfserving-endpoint.yml
次のコマンドを使用してデプロイを作成します。 この手順は数分実行される場合があります。
az ml online-deployment create --name tfserving-deployment -f endpoints/online/custom-container/tfserving/half-plus-two/tfserving-deployment.yml --all-traffic
エンドポイントを呼び出す
デプロイが完了したら、デプロイされたエンドポイントにスコアリング要求を行います。
RESPONSE=$(az ml online-endpoint invoke -n $ENDPOINT_NAME --request-file $BASE_PATH/sample_request.json)
エンティティを削除する
エンドポイントが不要になった場合は、次のコマンドを実行して削除します。
az ml online-endpoint delete --name tfserving-endpoint