使用自定义容器将模型部署到联机终结点
适用范围:Azure CLI ml 扩展 v2(最新版)Python SDK azure-ai-ml v2(最新版)
了解如何使用自定义容器将模型部署到 Azure 机器学习中的联机终结点。
自定义容器部署可以使用其他 Web 服务器,而不使用 Azure 机器学习所用的默认 Python Flask 服务器。 这些部署的用户仍可利用 Azure 机器学习的内置监视、缩放、警报和身份验证。
下表列出了使用自定义容器的各种部署示例,例如 TensorFlow Serving、TorchServe、Triton 推理服务器、Plumber R 包和 Azure 机器学习 Inference Minimal 映像。
示例 | 脚本 (CLI) | 说明 |
---|---|---|
minimal/multimodel | deploy-custom-container-minimal-multimodel | 通过扩展 Azure 机器学习 Inference Minimal 映像,将多个模型部署到单个部署。 |
minimal/single-model | deploy-custom-container-minimal-single-model | 通过扩展 Azure 机器学习 Inference Minimal 映像部署单个模型。 |
mlflow/multideployment-scikit | deploy-custom-container-mlflow-multideployment-scikit | 使用 Azure 机器学习 Inference Minimal 映像将具有不同 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 Serving 自定义容器部署 Half Plus Two (0.5*x + 2) 模型。 |
tfserving/half-plus-two-integrated | deploy-custom-container-tfserving-half-plus-two-integrated | 使用 TensorFlow Serving 自定义容器部署 Half Plus Two (0.5*x + 2) 模型,并将该模型集成到映像中。 |
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 机器学习工作区。 如果没有,请按照快速入门:创建工作区资源一文中的步骤创建一个。
Azure CLI 和
ml
扩展或 Azure 机器学习 Python SDK v2:若要安装 Azure CLI 和扩展,请参阅安装、设置和使用 CLI (v2)。
重要
本文中的 CLI 示例假定你使用的是 Bash(或兼容的)shell。 例如,从 Linux 系统或者适用于 Linux 的 Windows 子系统。
若要安装 Python SDK v2,请使用以下命令:
pip install azure-ai-ml azure-identity
要将 SDK 的现有安装更新到最新版本,请使用以下命令:
pip install --upgrade azure-ai-ml azure-identity
有关详细信息,请参阅安装适用于 Azure 机器学习的 Python SDK v2。
你或者你使用的服务主体必须对包含工作区的 Azure 资源组具有“参与者”访问权限。 如果使用快速入门文章配置工作区,则会有这样的资源组。
若要在本地部署,必须在本地运行 Docker 引擎。 强烈建议执行此步骤。 它可帮助你调试问题。
下载源代码
若要继续学习本教程,请从 GitHub 克隆源代码。
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
初始化环境变量
定义环境变量:
#/bin/bash
set -e
# <initialize_variables>
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 (正常)”响应。
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.chinacloudapi.cn/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 正常”响应。 只有在模型已载入内存后,服务器才能对就绪性请求做出“200 正常”响应。
有关活动情况探测和就绪情况探测的详细信息,请参阅 Kubernetes 文档。
请注意,此部署对活动性和就绪性使用相同的路径,因为 TF 服务仅定义活动性路由。
定位已装载的模型
将某个模型部署为联机终结点时,Azure 机器学习会将该模型装载到终结点。 通过装载模型,无需创建新的 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
。 你可以更改模型装载到的路径。
重要
model_mount_path
必须是 Linux(容器映像的 OS)中的有效绝对路径。
例如,可以在 tfserving-deployment.yml 中使用 model_mount_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
.....
那么,模型将位于部署中的 /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 endpoint invoke -n $ENDPOINT_NAME --request-file $BASE_PATH/sample_request.json)
删除终结点
使用终结点成功评分后,可以删除终结点:
az ml online-endpoint delete --name tfserving-endpoint