安全推出用于实时推理的新部署

适用范围:Azure CLI ml 扩展 v2(最新版)Python SDK azure-ai-ml v2(最新版)

本文介绍如何在不造成任何中断的情况下,在生产环境中部署新版机器学习模型。 你将使用蓝绿部署策略(也称为安全推出策略)将新版 Web 服务引入生产环境。 使用此策略可以在全面推出新版 Web 服务之前,先向一小部分用户或请求者推出该版本。

本文假设使用联机终结点,即用于联机(实时)推理的终结点。 有两种类型的联机终结点:托管联机终结点和 Kubernetes 联机终结点。 有关终结点的详细信息以及托管联机终结点与 Kubernetes 联机终结点之间的差异,请参阅什么是 Azure 机器学习终结点?

本文中的主要示例使用托管联机终结点进行部署。 若要改用 Kubernetes 终结点,请参阅本文档中与托管联机终结点讨论内联的注释。

在本文中你将学到:

  • 定义一个联机终结点,并定义一个名为“蓝色”的部署来为模型的版本 1 提供服务
  • 扩展 blue 部署,使其能够处理更多请求
  • 将模型的版本 2(名为“green”部署)部署到终结点,但不向部署发送任何实时流量
  • 在隔离环境中测试 green 部署
  • 将一部分实时流量镜像到 green 部署以验证部署
  • 将一小部分实时流量发送到 green 部署
  • 将所有实时流量发送到 green 部署
  • 删除现已不再使用的 v1 blue 部署

先决条件

在按照本文中的步骤操作之前,请确保满足以下先决条件:

  • Azure 基于角色的访问控制 (Azure RBAC) 用于授予对 Azure 机器学习中的操作的访问权限。 若要执行本文中的步骤,必须为用户帐户分配 Azure 机器学习工作区的所有者参与者角色,或者分配一个允许 Microsoft.MachineLearningServices/workspaces/onlineEndpoints/* 的自定义角色。 有关详细信息,请参阅管理对 Azure 机器学习工作区的访问

  • (可选)若要在本地部署,必须在本地计算机上安装 Docker 引擎强烈建议选择此选项,以便更轻松地调试问题。

准备你的系统

设置环境变量。

如果尚未为 Azure CLI 指定默认设置,则应保存默认设置。 若要避免多次传入订阅、工作区和资源组的值,请运行此代码:

az account set --subscription <subscription id>
az configure --defaults workspace=<Azure Machine Learning workspace name> group=<resource group>

克隆示例存储库

若要按照本文的说明进行操作,请先克隆示例存储库 (azureml-examples)。 然后转到存储库的 cli/ 目录:

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

提示

使用 --depth 1 以便仅克隆提交到存储库的最新内容。 这可以减少完成操作所需的时间。

本教程中的命令位于 cli 目录中的文件 deploy-safe-rollout-online-endpoints.sh 内,YAML 配置文件位于 endpoints/online/managed/sample/ 子目录中。

注意

Kubernetes 联机终结点的 YAML 配置文件位于 endpoints/online/kubernetes/ 子目录中。

定义终结点和部署

联机终结点用于联机(实时)推理。 联机终结点包含已准备好从客户端接收数据并可实时发回响应的部署。

定义终结点

下表列出了定义终结点时要指定的关键属性。

属性 描述
名称 必需。 终结点的名称。 在 Azure 区域中必须具有唯一性。 有关命名规则的详细信息,请参阅终结点限制
身份验证模式 终结点的身份验证方法。 在基于密钥的身份验证 key 和基于 Azure 机器学习令牌的身份验证 aml_token 之间进行选择。 密钥不会过期,但令牌会过期。 有关身份验证的详细信息,请参阅向联机终结点进行身份验证
说明 终结点的说明。
标记 终结点的标记字典。
交通 有关如何跨部署路由流量的规则。 将流量表示为键值对字典,其中键表示部署名称,值表示到该部署的流量百分比。 仅当终结点下的部署已创建时,才能设置流量。 创建部署后,你还可以更新联机终结点的流量。 有关如何使用镜像流量的详细信息,请参阅将一小部分实时流量分配给新部署
镜像流量 要镜像到部署的实时流量的百分比。 有关如何使用镜像流量的详细信息,请参阅使用镜像流量测试部署

若要查看可以在创建终结点时指定的完整属性列表,请参阅 CLI (v2) 联机终结点 YAML 架构SDK (v2) ManagedOnlineEndpoint 类

定义部署

部署是一组资源,用于承载执行实际推理的模型。 下表描述了定义部署时要指定的关键属性。

属性 描述
名称 必需。 部署的名称。
终结点名称 必需。 要在其中创建部署的终结点的名称。
型号 要用于部署的模型。 此值可以是对工作区中现有版本受控模型的引用,也可以是对内联模型规范的引用。 本示例中有一个执行回归的 scikit-learn 模型。
代码路径 本地开发环境中目录的路径,其中包含用于为模型评分的所有 Python 源代码。 可以使用嵌套目录和包。
评分脚本 根据给定输入请求执行模型的 Python 代码。 此值可以是源代码目录中评分文件的相对路径。
评分脚本接收提交到已部署的 Web 服务的数据,并将此数据传递给模型。 然后,该脚本执行模型并将其响应返回给客户端。 评分脚本特定于你的模型,必须理解模型期望作为输入和作为输出返回的数据。
在此示例中,我们有一个 score.py 文件。 此 Python 代码必须具有 init() 函数和 run() 函数。 在创建或更新模型后将调用 init() 函数(例如,可以使用该函数在内存中缓存模型)。 每次调用终结点时,都将调用 run() 函数来执行实际评分和预测。
环境 必需。 用于承载模型和代码的环境。 此值可以是对工作区中现有版本受控环境的引用,也可以是对内联环境规范的引用。 环境可以是具有 Conda 依赖项、Dockerfile 或已注册环境的 Docker 映像。
实例类型 必需。 用于部署的 VM 大小。 有关支持的大小列表,请参阅托管联机终结点 SKU 列表
实例计数 必需。 用于部署的实例数。 请根据预期的工作负载确定值。 为实现高可用性,建议将值至少设置为 3。 我们保留额外的 20% 来执行升级。 有关详细信息,请参阅联机终结点限制

若要查看可以在创建部署时指定的完整属性列表,请参阅 CLI (v2) 托管联机部署 YAML 架构SDK (v2) ManagedOnlineDeployment 类

创建联机终结点

首先设置终结点的名称,然后对其进行配置。 在本文中,你将使用 endpoints/online/managed/sample/endpoint.yml 文件来配置终结点。 以下代码片段显示了文件的内容:

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: my-endpoint
auth_mode: key

下表描述了 YAML 格式的终结点的参考资料。 若要了解如何指定这些属性,请参阅联机终结点 YAML 参考。 如需了解与托管联机终结点相关的限制,请参阅联机终结点限制

密钥 说明
$schema (可选)YAML 架构。 若要查看 YAML 文件的所有可用选项,可在浏览器中查看上述代码片段中的架构。
name 终结点的名称。
auth_mode 使用 key 可执行基于密钥的身份验证。 使用 aml_token 可执行基于 Azure 机器学习令牌的身份验证。 若要获取最新的令牌,请使用 az ml online-endpoint get-credentials 命令。

若要创建联机终结点,请执行以下操作:

  1. 设置终结点名称:

    对于 Unix,请运行以下命令(将 YOUR_ENDPOINT_NAME 替换为唯一名称):

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    

    重要

    Azure 区域中的终结点名称必须唯一。 例如,在 Azure chinanorth2 区域中,只能有一个名为 my-endpoint 的终结点。

  2. 在云中创建终结点:

    运行以下代码,使用 endpoint.yml 文件配置终结点:

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml
    

创建“blue”部署

在本文中,你将使用 endpoints/online/managed/sample/blue-deployment.yml 文件来配置部署的关键方面。 以下代码片段显示了文件的内容:

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: blue
endpoint_name: my-endpoint
model:
  path: ../../model-1/model/
code_configuration:
  code: ../../model-1/onlinescoring/
  scoring_script: score.py
environment: 
  conda_file: ../../model-1/environment/conda.yaml
  image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
instance_type: Standard_DS3_v2
instance_count: 1

若要为终结点创建名为 blue 的部署,请运行以下命令来使用 blue-deployment.yml 文件进行配置

az ml online-deployment create --name blue --endpoint-name $ENDPOINT_NAME -f endpoints/online/managed/sample/blue-deployment.yml --all-traffic

重要

az ml online-deployment create 中的 --all-traffic 标志会将 100% 的终结点流量分配给新创建的蓝色部署。

blue-deployment.yaml 文件中,我们以内联方式指定 path(从中上传文件)。 CLI 会自动上传文件并注册模型和环境。 适用于生产的最佳做法是注册模型和环境,并在 YAML 中指定已注册的名称和版本。 使用格式 model: azureml:my-model:1environment: azureml:my-env:1

若要执行注册,可以将 modelenvironment 的 YAML 定义提取到单独的 YAML 文件中,并使用命令 az ml model createaz ml environment create。 若要详细了解这些命令,请运行 az ml model create -haz ml environment create -h

有关将模型注册为资产的详细信息,请参阅使用 CLI 在机器学习中将模型注册为资产。 若要详细了解如何创建环境,请参阅使用 CLI & SDK (v2) 管理 Azure 机器学习环境

确认现有部署

确认现有部署的一种方法是调用终结点,以便它可以就给定输入请求为你的模型评分。 通过 CLI 或 Python SDK 调用终结点时,可以选择指定将接收传入流量的部署的名称。

注意

与 CLI 或 Python SDK 相比,Azure 机器学习工作室则略有不同,后者要求你在调用终结点时必须指定部署。

使用部署名称调用终结点

如果使用将接收流量的部署的名称调用终结点,Azure 机器学习会将终结点的流量直接路由到指定的部署并返回其输出。 可以使用 --deployment-name 选项(对于 CLI v2)或 deployment_name 选项(对于 SDK v2)来指定部署。

调用终结点而不指定部署

如果在调用终结点时未指定接收流量的部署,Azure 机器学习将根据流量控制设置将终结点的传入流量路由到终结点中的部署。

流量控制设置会将指定百分比的传入流量分配给终结点中的各个部署。 例如,如果流量规则指定终结点中的某个部署将在 40% 的时间内接收传入流量,则 Azure 机器学习会将终结点的 40% 的流量路由到该部署。

可以运行以下命令来查看现有终结点和部署的状态:

az ml online-endpoint show --name $ENDPOINT_NAME 

az ml online-deployment show --name blue --endpoint $ENDPOINT_NAME 

应会看到由 $ENDPOINT_NAME 标识的终结点,以及名为 blue 的部署。

使用示例数据测试终结点

可以使用 invoke 命令调用终结点。 我们将使用一个 json 文件发送示例请求。

az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json

扩展现有部署以处理更多流量

在按使用联机终结点部署机器学习模型并为其评分所述进行部署时,请在 yaml 部署文件中将 instance_count 设置为值 1。 可以使用 update 命令进行横向扩展:

az ml online-deployment update --name blue --endpoint-name $ENDPOINT_NAME --set instance_count=2

注意

请注意,在以上命令中,我们使用 --set 重写部署配置。 你也可以更新 yaml 文件,并使用 --file 输入将它作为输入传递给 update 命令。

部署新模型,但暂时不要向其发送任何流量

创建名为 green 的新部署:

az ml online-deployment create --name green --endpoint-name $ENDPOINT_NAME -f endpoints/online/managed/sample/green-deployment.yml

由于我们尚未将任何流量显式分配给 green,因此分配给它的流量为零。 可使用以下命令对此进行验证:

az ml online-endpoint show -n $ENDPOINT_NAME --query traffic

测试新部署

尽管为 green 分配的流量为 0%,但你可以通过指定 --deployment 名称来直接调用它:

az ml online-endpoint invoke --name $ENDPOINT_NAME --deployment-name green --request-file endpoints/online/model-2/sample-request.json

如果要使用 REST 客户端直接调用部署而不经历流量规则处理过程,请设置以下 HTTP 头:azureml-model-deployment: <deployment-name>。 下面的代码片段使用 curl 直接调用部署。 代码片段应在 Unix/WSL 环境中生效:

# get the scoring uri
SCORING_URI=$(az ml online-endpoint show -n $ENDPOINT_NAME -o tsv --query scoring_uri)
# use curl to invoke the endpoint
curl --request POST "$SCORING_URI" --header "Authorization: Bearer $ENDPOINT_KEY" --header 'Content-Type: application/json' --header "azureml-model-deployment: green" --data @endpoints/online/model-2/sample-request.json

使用镜像流量测试部署

测试 green 部署后,可以将一定百分比的实时流量镜像(或复制)到该部署。 流量镜像(也称为影子处理)不会更改返回给客户端的结果 - 请求仍 100% 流向 blue 部署。 流量的镜像百分比将复制并提交到 green 部署,以便你可以收集指标和日志记录,而不会影响客户端。 如果要验证新部署而不影响客户端,则可使用镜像。 例如,可以使用镜像来检查延迟是否在可接受的范围内,或者检查是否没有 HTTP 错误。 使用流量镜像/影子处理测试新部署也称为影子测试。 接收镜像流量的部署(在本例中为 green 部署)也可以称为影子部署

镜像具有以下限制:

  • CLI (v2)(版本 2.4.0 或更高版本)和 Python SDK (v2)(版本 1.0.0 或更高版本)支持镜像。 如果使用旧版 CLI/SDK 更新终结点,则会丢失镜像流量设置。
  • Kubernetes 联机终结点目前不支持镜像。
  • 只能将流量镜像到终结点中的一个部署。
  • 可以镜像的最大流量百分比为 50%。 此限制旨在降低对终结点带宽配额(默认 5 MBPS)的影响 - 如果超过分配的配额,终结点带宽将受到限制。 若要了解如何监视带宽限制,请参阅监视托管联机终结点

另请注意以下行为:

  • 部署可以配置为仅接收实时流量或镜像流量,而不能同时接收两者。
  • 调用终结点时,你可以指定其任何部署的名称(甚至是影子部署)以返回预测。
  • 使用将接收传入流量的部署名称调用终结点时,Azure 机器学习不会将流量镜像到影子部署。 如果未指定部署,Azure 机器学习会将发送到终结点的流量镜像到影子部署。

现在,让我们将绿色部署设置为接收 10% 的镜像流量。 客户端仍将仅接收来自蓝色部署的预测。

显示 10% 流量镜像到一个部署的示意图。

以下命令将 10% 的流量镜像到 green 部署:

az ml online-endpoint update --name $ENDPOINT_NAME --mirror-traffic "green=10"

你可以通过多次调用终结点而不指定用于接收传入流量的部署来测试镜像流量:

for i in {1..20} ; do
    az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json
done

可以通过查看来自部署的日志,来确认具体将多少百分比的流量发送到了 green 部署:

az ml online-deployment get-logs --name blue --endpoint $ENDPOINT_NAME

测试后,可以将镜像流量设置为零以禁用镜像:

az ml online-endpoint update --name $ENDPOINT_NAME --mirror-traffic "green=0"

将一小部分实时流量分配给新部署

测试 green 部署后,为其分配一小部分流量:

az ml online-endpoint update --name $ENDPOINT_NAME --traffic "blue=90 green=10"

提示

总流量百分比之和必须要么是 0%(禁用流量),要么是 100%(启用流量)。

现在,green 部署会接收所有实时流量的 10%。 客户端将从 bluegreen 部署接收预测。

显示部署之间的流量拆分的示意图。

将所有流量发送到新部署

green 部署完全满意后,将所有流量切换到该部署。

az ml online-endpoint update --name $ENDPOINT_NAME --traffic "blue=0 green=100"

删除旧部署

使用以下步骤从托管联机终结点中删除单个部署。 删除单个部署会影响托管联机终结点中的其他部署:

az ml online-deployment delete --name blue --endpoint $ENDPOINT_NAME --yes --no-wait

删除终结点和部署

如果不打算使用终结点和部署,则应该删除它们。 删除终结点时,你还会删除其所有基础部署。

az ml online-endpoint delete --name $ENDPOINT_NAME --yes --no-wait