你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在联机终结点中使用自定义容器部署通过 TF 服务提供服务的 TensorFlow 模型

适用于:Azure CLI ml 扩展 v2(当前版本)

了解如何在 Azure 机器学习中将自定义容器部署为联机终结点。

自定义容器部署可以使用其他 Web 服务器,而不使用 Azure 机器学习所用的默认 Python Flask 服务器。 这些部署的用户仍可利用 Azure 机器学习的内置监视、缩放、警报和身份验证。

警告

Microsoft 可能无法帮助解决由自定义映像引起的问题。 如果遇到问题,请使用默认映像或 Microsoft 提供的映像之一,了解该问题是否特定于你的映像。

先决条件

  • 安装并配置 Azure CLI 和 ML 扩展。 有关详细信息,请参阅安装、设置和使用 CLI (v2)

  • 必须有一个 Azure 资源组,你(或者你使用的服务主体)在此资源组中需要拥有 Contributor 访问权限。 如果已按照上述文章配置了 ML 扩展,那么你就有了此类资源组。

  • 必须有一个 Azure 机器学习工作区。 如果已按照上述文章配置了 ML 扩展,那么你就有了此类工作区。

  • 如果尚未为 Azure CLI 指定默认设置,则应保存默认设置。 为了避免必须反复传入值,请运行:

    az account set --subscription <subscription id>
    az configure --defaults workspace=<azureml workspace name> group=<resource group>
    
    
  • 若要在本地部署,必须在本地运行 Docker 引擎。 强烈建议执行此步骤。 它会帮助你调试问题。

下载源代码

若要学习本教程,请下载以下源代码。

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli

初始化环境变量

定义环境变量:

BASE_PATH=endpoints/online/custom-container
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

创建用于终结点和部署的 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: 1
  path: ./half_plus_two
environment_variables:
  MODEL_BASE_PATH: /var/azureml-app/azureml-models/tfserving-mounted/1
  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_DS2_v2
instance_count: 1

在此 YAML 中,需要注意几个重要概念:

就绪性路由与活动性路由

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

Diagram showing a tree view of the local directory structure.

并且 tfserving-deployment.yml 包含:

model:
    name: tfserving-mounted
    version: 1
    path: ./half_plus_two

则你的模型将位于 /var/azureml-app/azureml-models/tfserving-deployment/1 下的部署中:

Diagram showing a tree view of the deployment directory structure.

你可以选择配置 model_mount_path。 可以通过它来更改模型的装载路径。 例如,可以在 tfserving-deployment.yml 中使用 model_mount_path 参数:

重要

model_mount_path 必须是 Linux(容器映像的 OS)中的有效绝对路径。

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 下,而是在指定的装载路径下:

Diagram showing a tree view of the deployment directory structure when using 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

调用终结点

部署完成后,看看能否向部署的终结点发出评分请求。

RESPONSE=$(az ml online-endpoint invoke -n $ENDPOINT_NAME --request-file $BASE_PATH/sample_request.json)

删除终结点和模型

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

az ml online-endpoint delete --name tfserving-endpoint
az ml model delete -n tfserving-mounted --version 1

后续步骤