分享方式:


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

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

瞭解如何使用自訂容器將模型部署至 Azure Machine Learning 中的線上端點。

自訂容器部署所使用的 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 服務自訂容器部署一半加二模型,該容器使用標準模型註冊程序。
tfserving/half-plus-two-integrated deploy-custom-container-tfserving-half-plus-two-integrated 使用 TensorFlow 服務自訂容器,將一半加二模型部署至映像中。
torchserve/densenet deploy-custom-container-torchserve-densenet 使用 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 參數中有一些要注意的重要概念:

基礎映像

基底映像會指定為環境中的參數,並 docker.io/tensorflow/serving:latest 在此範例中使用。 當您檢查容器時,您會發現此伺服器會使用 ENTRYPOINT 來啟動進入點腳本,此腳本會採用和 MODEL_NAMEMODEL_BASE_PATH環境變數,並公開例如 的8501埠。 這些詳細數據都是此所選伺服器的所有特定資訊。 您可以使用此對伺服器的理解,來判斷如何定義部署。 例如,如果您在部署定義中設定 和 MODEL_NAME 的環境變數MODEL_BASE_PATH,伺服器 (在此案例中為 TF 服務) 會採用值來起始伺服器。 同樣地,如果您將路由的埠設定為 8501 部署定義中,則會將使用者對這類路由的要求正確路由傳送至 TF 服務伺服器。

請注意,此特定範例是以 TF 服務案例為基礎,但您可以使用任何容器來隨時響應即將上線、整備程度和評分路由的要求。 您可以參考其他範例,並查看 dockerfile 的形成方式(例如,使用 CMD 而非 ENTRYPOINT)來建立容器。

推斷設定

推斷組態是環境中的參數,它會指定 3 種路由類型的埠和路徑:即時性、整備程度和評分路由。 如果您想要使用受控在線端點執行自己的容器,則需要推斷設定。

整備路線與即時性路由

您選擇的 API 伺服器可能會提供檢查伺服器狀態的方法。 您可以指定兩種類型的路由: 活躍度整備程度。 活躍度路由可用來確認伺服器是否正在執行。 整備度路由可用來確認伺服器是否已準備好執行工作。 在機器學習推斷的內容中,伺服器可以在載入模型之前,將 200 OK 回應至即時性要求,而伺服器只有在模型載入記憶體之後,才會回應 200 OK 的整備要求。

如需一般實況和整備探查的詳細資訊,請參閱 Kubernetes 檔

即時度和整備路由將由您選擇的 API 伺服器決定,如同您在先前步驟中於本機測試容器時所識別的。 請注意,本文中的範例部署會針對即時性和整備程度使用相同的路徑,因為 TF 服務只會定義即時性路由。 如需定義路由的不同模式,請參閱其他範例。

評分路由

您選擇的 API 伺服器會提供接收要處理之承載的方法。 在機器學習推斷的內容中,伺服器會透過特定路由接收輸入數據。 當您在先前的步驟中於本機測試容器時,請識別 API 伺服器的此路由,並在定義要建立的部署時指定它。 請注意,成功建立部署也會更新端點的 scoring_uri 參數,您可以使用 進行驗證 az ml online-endpoint show -n <name> --query scoring_uri

找出所掛接的模型

當您將模型部署為線上端點時,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