使用自定义容器将模型部署到联机终结点
适用范围: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 参数中,需要注意几个重要概念:
Base image
基础映像在环境中指定为参数,此示例中使用 docker.io/tensorflow/serving:latest
。 检查容器时,可以发现此服务器使用 ENTRYPOINT
启动入口点脚本,该脚本接收环境变量(例如 MODEL_BASE_PATH
和 MODEL_NAME
)并公开端口(例如 8501
)。 这些详细信息全部是特定于这一所选服务器的信息。 可以使用对服务器的这一理解来确定如何定义部署。 例如,如果在部署定义中设置 MODEL_BASE_PATH
和 MODEL_NAME
的环境变量,则服务器(在本例中为 TF Serving)将接收值来启动服务器。 同样,如果在部署定义中将路由的端口设置为 8501
,则对此类路由的用户请求将正确路由到 TF Serving 服务器。
请注意,此特定示例基于 TF Serving 案例,但你可以使用任何保持运行并响应运行情况、就绪情况和评分路由的请求的容器。 你可以参考其他示例并了解 dockerfile 的形成方式(例如,使用 CMD
而不是 ENTRYPOINT
)以创建容器。
推理配置
推理配置是环境中的一个参数,它指定 3 种类型的路由的端口和路径:运行情况、就绪情况和评分路由。 如果要使用托管联机终结点运行你自己的容器,则需要推理配置。
就绪情况路由与运行情况路由
你选择的 API 服务器可能会提供检查服务器状态的方法。 有两种类型的路由可以指定:运行情况和就绪情况。 活动性路由用于检查服务器是否正在运行。 就绪性路由用于检查服务器是否准备好进行工作。 在机器学习推理的上下文中,服务器可以在加载模型之前对运行情况请求响应 200 OK,并且服务器只能在模型加载到内存中之后对就绪情况请求响应 200 OK。
如需更多关于运行情况探测和就绪情况探测的一般信息,请参阅 Kubernetes 文档。
运行情况和就绪情况路由将由你所选的 API 服务器确定,就像你在前面的步骤中本地测试容器时所识别的那样。 请注意,本文中的示例部署对运行情况和就绪情况使用相同的路径,因为 TF Serving 仅定义一个运行情况路由。 请参阅其他定义路由的不同模式的示例。
评分路由
你选择的 API 服务器将提供一种接收有效负载以进行处理的方法。 在机器学习推理的上下文中,服务器将通过特定路由接收输入数据。 在前面的步骤中本地测试容器时,标识 API 服务器的此路由,并在定义要创建的部署时指定它。
请注意,成功创建部署也会更新终结点的 scoring_uri 参数,可以使用 az ml online-endpoint show -n <name> --query scoring_uri
验证它。
定位已装载的模型
将某个模型部署为联机终结点时,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