在托管联机终结点中使用自定义容器部署通过 TF 服务提供服务的 TensorFlow 模型(预览版)

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

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

重要

此功能目前处于公开预览状态。 此预览版在提供时没有附带服务级别协议,不建议将其用于生产工作负荷。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Microsoft 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
ENDPOINT_NAME=tfserving-endpoint
DEPLOYMENT_NAME=tfserving

下载 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:

$schema: https://azuremlsdk2.blob.core.windows.net/latest/managedOnlineEndpoint.schema.json
name: tfserving-endpoint
type: online
auth_mode: aml_token
traffic:
  tfserving: 100

deployments:
  - name: tfserving
    model:
      name: tfserving-mounted
      version: 1
      local_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
      docker:
        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_F2s_v2
    scale_settings:
      scale_type: manual
      instance_count: 1
      min_instances: 1
      max_instances: 2

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

就绪性路由与活动性路由

HTTP 服务器可以选择性地为活动性和就绪性定义路径 。 活动性路由用于检查服务器是否正在运行。 就绪性路由用于检查服务器是否已准备好执行某项工作。 在机器学习推理中,在加载模型之前,服务器可对活动性请求做出“200 正常”响应。 只有在模型已载入内存后,服务器才能对就绪性请求做出“200 正常”响应。

有关活动性探测和就绪性探测的详细信息,请查看 Kubernetes 文档

请注意,此部署对活动性和就绪性使用相同的路径,因为 TF 服务仅定义活动性路由。

定位已装载的模型

将某个模型部署为实时终结点时,Azure 机器学习会将该模型装载到终结点。 通过装载模型,无需创建新的 Docker 映像即可部署该模型的新版本。 默认情况下,使用 名称 foo 和版本 1 注册的模型将位于已部署容器内的以下路径:

例如,如果本地计算机上具有以下目录结构:

azureml-examples
  cli
    endpoints
      online
        custom-container
          half_plus_two
          tfserving-endpoint.yml    

并且 tfserving-endpoint.yml 包含:

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

则模型将定位到终结点中的以下位置:

var 
  azureml-app
    azureml-models
      tfserving-endpoint
        1
          half_plus_two

创建终结点

了解 YAML 的构造方式后,接下来请创建终结点。 此命令可能需要几分钟才能完成。

az ml endpoint create -f $BASE_PATH/$ENDPOINT_NAME.yml -n $ENDPOINT_NAME

调用终结点

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

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

删除终结点和模型

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

az ml endpoint delete -n $ENDPOINT_NAME -y
echo "deleting model..."
az ml model delete -n tfserving-mounted --version 1

后续步骤