使用自訂容器將模型部署至線上端點
適用於: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 Machine Learning 工作區。 如果您沒有工作區資源,請依快速入門:建立工作區資源一文中的步驟來建立工作區資源。
Azure CLI 與
ml
延伸模組或 Azure Machine Learning Python SDK v2:若要安裝 Azure CLI 和擴充功能,請參閱安裝、設定和使用 CLI (v2)。
重要
本文中的 CLI 範例假設您使用 Bash (或相容的) 殼層。 例如,從 Linux 系統或 Windows 子系統 Linux 版。
若要安裝 Python SDK v2,請使用下列命令:
pip install azure-ai-ml azure-identity
若要將現有的 SDK 安裝更新為最新版本,請使用下列命令:
pip install --upgrade azure-ai-ml azure-identity
您或您使用的服務主體對於包含工作區的 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_NAME
等MODEL_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 之下,而是在您指定的掛接路徑下:
建立端點和部署
現在您已瞭解 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