使用自訂容器將模型部署至線上端點

適用於:Azure CLI ml 延伸模組 v2 (目前)Python SDK azure-ai-ml v2 (目前)

瞭解如何使用自定義容器將模型部署至 Azure 機器學習 中的在線端點。

自訂容器部署所使用的 Web 伺服器可以不同於 Azure Machine Learning 所使用的預設 Python Flask 伺服器。 這些部署的使用者仍然可以利用 Azure Machine Learning 的內建監視、縮放、警示和驗證功能。

下表列出各種部署範例,其使用自訂容器,例如 TensorFlow Serving、TorchServe、Triton Inference Server、Plumber R 套件和 Azure Machine Learning 推斷最小映像。

範例 指令碼 (CLI) 描述
minimal/multimodel deploy-custom-container-minimal-multimodel 藉由擴充 Azure Machine Learning 推斷最小映像,將多個模型部署到單一部署。
minimal/single-model deploy-custom-container-minimal-single-model 藉由擴充 Azure Machine Learning 推斷最小映像來部署單一模型。
mlflow/multideployment-scikit deploy-custom-container-mlflow-multideployment-scikit 使用 Azure Machine Learning 推斷最小映像,將兩個具有不同 Python 需求的 MLFlow 模型部署到單一端點後方的兩個不同部署。
r/multimodel-plumber deploy-custom-container-r-multimodel-plumber 使用 Plumber R 套件將三個迴歸模型部署到一個端點
tfserving/half-plus-two deploy-custom-container-tfserving-half-plus-two 使用 TensorFlow 使用 TensorFlow 服務自定義容器,使用標準模型註冊程式部署半加兩個模型。
tfserving/half-plus-two-integrated deploy-custom-container-tfserving-half-plus-two-integrated 使用 TensorFlow 服務自定義容器,將半加兩個模型部署至映像中。
torchserve/densenet deploy-custom-container-torchserve-densenet 使用 TorchServe 自訂容器部署單一模型。
torchserve/huggingface-textgen deploy-custom-container-torchserve-huggingface-textgen 將 Hugging Face 模型部署至線上端點,並遵循 Hugging Face Transformers TorchServe 範例。
triton/single-model deploy-custom-container-triton-single-model 使用自訂容器來部署 Triton 模型

本文著重在使用 TensorFlow (TF) Serving 提供 TensorFlow 模型。

警告

Microsoft 可能無法協助針對自定義映像所造成的問題進行疑難解答。 如果您遇到問題,系統可能會要求您使用預設影像或 Microsoft 提供的其中一個影像,以查看問題是否為映像專屬。

必要條件

遵循本文中的步驟之前,請確定您已滿足下列必要條件:

  • 您或您使用的服務主體必須具有 包含工作區之 Azure 資源群組的參與者 存取權。 如果您使用快速入門文章來設定工作區,您有這樣的資源群組。

  • 若要在本機部署,您必須在本機執行 Docker 引擎強烈建議您執行此步驟。 它可協助您偵錯問題。

下載原始程式碼

若要遵循本教學課程,請從 GitHub 複製原始程式碼。

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli

初始化環境變數

定義環境變數:

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 模型

下載並解壓縮會將輸入除以二,再將所得結果加二的模型:

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 來設定雲端部署。 請參閱此範例的範例 YAML:

tfserving-endpoint.yml

$schema: https://azuremlsdk2.blob.core.windows.net/latest/managedOnlineEndpoint.schema.json
name: tfserving-endpoint
auth_mode: aml_token

tfserving-deployment.yml

$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 參數中,有幾個要注意的重要概念:

整備度路由與活躍度路由

HTTP 伺服器會定義活躍度整備度的路徑。 活躍度路由可用來確認伺服器是否正在執行。 整備度路由可用來確認伺服器是否已準備好執行工作。 在機器學習推斷中,伺服器可能會在載入模型之前,先對活躍度要求回應 200 OK。 只有在模型載入記憶體之後,伺服器才能回應 200 OK 的整備要求。

如需即時度和整備探查的詳細資訊,請參閱 Kubernetes 檔

請注意,此部署會針對活躍度和整備度使用相同的路徑,因為 TF 服務只會定義活躍度路由。

找出所掛接的模型

當您將模型部署為線上端點時,Azure Machine Learning 會將您的模型「掛接」到您的端點。 模型掛接可讓您部署新版本的模型,而不需要建立新的 Docker 映像。 根據預設,以 foo 名稱和第 1註冊的模型會位於已部署容器內的下列路徑:/var/azureml-app/azureml-models/foo/1

例如,如果您的本機計算機上有 /azureml-examples/cli/endpoints/online/custom-container目錄結構,其中模型名為 half_plus_two

此圖顯示本機目錄結構的樹視圖。

tfserving-deployment.yml 包含:

model:
    name: tfserving-mounted
    version: 1
    path: ./half_plus_two

然後您的模型將會位於部署中的 /var/azureml-app/azureml-models/tfserving-deployment/1 底下:

此圖顯示部署目錄結構的樹視圖。

您可以選擇性地設定 model_mount_path。 它可讓您變更掛接模型的路徑。

重要

在 Linux 中,model_mount_path 必須是有效的絕對路徑 (容器映像的 OS)。

例如,您可以將 model_mount_path 參數加入到 tfserving-deployment.yml

name: tfserving-deployment
endpoint_name: tfserving-endpoint
model:
  name: tfserving-mounted
  version: 1
  path: ./half_plus_two
model_mount_path: /var/tfserving-model-mount
.....

然後您的模型位於 部署中的 /var/tfserving-model-mount/tfserving-deployment/1 。 請注意,它不再位在 azureml-app/azureml-models 之下,而是在您指定的掛接路徑下:

此圖顯示使用 mount_model_path 時部署目錄結構的樹視圖。

建立端點和部署

現在您已瞭解 YAML 的建構方式,請建立您的端點。

az ml online-endpoint create --name tfserving-endpoint -f endpoints/online/custom-container/tfserving-endpoint.yml

建立部署可能需要幾分鐘的時間。

az ml online-deployment create --name tfserving-deployment -f endpoints/online/custom-container/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