使用自定义容器将模型部署到联机终结点

适用范围: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 资源组具有“参与者”访问权限。 如果使用快速入门文章配置工作区,则会有这样的资源组。

  • 若要在本地部署,必须在本地运行 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_PATHMODEL_NAME)并公开端口(例如 8501)。 这些详细信息全部是特定于这一所选服务器的信息。 可以使用对服务器的这一理解来确定如何定义部署。 例如,如果在部署定义中设置 MODEL_BASE_PATHMODEL_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 下,而是位于指定的装载路径下

示意图,显示使用 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 endpoint invoke -n $ENDPOINT_NAME --request-file $BASE_PATH/sample_request.json)

删除终结点

使用终结点成功评分后,可以删除终结点:

az ml online-endpoint delete --name tfserving-endpoint