逐步将 MLflow 模型推出到联机终结点

本文介绍如何在不导致服务中断的情况下逐步更新 MLflow 模型并将其部署到联机终结点。 请使用蓝绿部署(也称为安全推出策略)将一个新版 Web 服务引入生产环境。 使用此策略可以在全面推出新版 Web 服务之前,先向一小部分用户或请求者推出该版本。

关于此示例

联机终结点具有“终结点”和“部署”的概念。 终结点表示可让客户使用模型的 API,而部署表示该 API 的特定实现。 这种区别使用户能够将 API 与实现分离,并在不影响使用者的情况下更改基础实现。 本示例将使用这种概念,在不造成服务中断的情况下在终结点中更新部署的模型。

我们要部署的模型基于 UCI 心脏病数据集。 数据库包含 76 个属性,但我们使用其中 14 个。 该模型尝试预测患者是否存在心脏疾病。 它是从 0(不存在)到 1(存在)的整数值。 它已使用 XGBBoost 分类器进行训练,所有必需的预处理都打包为 scikit-learn 管道,使此模型成为从原始数据到预测的端到端管道。

本文中的信息基于 azureml-examples 存储库中包含的代码示例。 若要在不复制/粘贴文件的情况下在本地运行命令,请克隆存储库,然后将目录更改为 sdk/using-mlflow/deploy

在 Jupyter Notebook 中继续操作

可以在以下笔记本中按照此示例进行操作。 在克隆的存储库中,打开笔记本:mlflow_sdk_online_endpoints_progresive.ipynb

先决条件

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

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

另外需要:

连接到工作区

首先,让我们连接到要在其中工作的 Azure 机器学习工作区。

az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>

在注册表中注册模型

确保在 Azure 机器学习注册表中注册模型。 Azure 机器学习中不支持部署未注册的模型。 可以使用 MLflow SDK 注册新模型:

MODEL_NAME='heart-classifier'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"

创建联机终结点

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

我们将通过在同一终结点下部署同一模型的多个版本来利用此功能。 但是,新部署最初将接收 0% 的流量。 在确定新模型正常工作后,我们逐步将流量从一个部署转移到另一个部署。

  1. 终结点需要一个名称,该名称在同一区域中必须唯一。 确保创建一个不存在的名称:

    ENDPOINT_SUFIX=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w ${1:-5} | head -n 1)
    ENDPOINT_NAME="heart-classifier-$ENDPOINT_SUFIX"
    
  2. 配置终结点

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
    name: heart-classifier-edp
    auth_mode: key
    
  3. 创建终结点:

    az ml online-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
    
  4. 获取终结点的身份验证机密。

    ENDPOINT_SECRET_KEY=$(az ml online-endpoint get-credentials -n $ENDPOINT_NAME | jq -r ".accessToken")
    

创建蓝色部署

到目前为止,终结点是空的。 其中不包含任何部署。 让我们通过部署以前使用的同一模型来创建第一个模型。 我们将此部署称为“default”,表示“蓝色部署”。

  1. 配置部署

    blue-deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: default
    endpoint_name: heart-classifier-edp
    model: azureml:heart-classifier@latest
    instance_type: Standard_DS2_v2
    instance_count: 1
    
  2. 创建部署

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

    如果终结点没有传出连接,请通过添加 --with-package 标记使用模型打包(预览版):

    az ml online-deployment create --with-package --endpoint-name $ENDPOINT_NAME -f blue-deployment.yml --all-traffic
    

    提示

    在 create 命令中设置标志 --all-traffic,以便将所有流量分配到新部署。

  3. 将所有流量分配到部署

    到目前为止,终结点有一个部署,但没有为其分配任何流量。 让我们分配流量。

    在 Azure CLI 中不需要执行此步骤,因为我们在创建期间使用了 --all-traffic

  4. 更新终结点配置:

    在 Azure CLI 中不需要执行此步骤,因为我们在创建期间使用了 --all-traffic

  5. 创建示例输入以测试部署

    sample.yml

    {
        "input_data": {
            "columns": [
                "age",
                "sex",
                "cp",
                "trestbps",
                "chol",
                "fbs",
                "restecg",
                "thalach",
                "exang",
                "oldpeak",
                "slope",
                "ca",
                "thal"
            ],
            "data": [
                [ 48, 0, 3, 130, 275, 0, 0, 139, 0, 0.2, 1, 0, "normal" ]
            ]
        }
    }
    
  6. 测试部署

    az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file sample.json
    

在终结点下创建绿色部署

假设开发团队创建了一个已准备好投入生产的新模型版本。 我们首先可以尝试运行此模型,在对它有信心后,我们可以更新终结点以将流量路由到该模型。

  1. 注册新的模型版本

    MODEL_NAME='heart-classifier'
    az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"
    

    让我们获取新模型的版本号:

    VERSION=$(az ml model show -n heart-classifier --label latest | jq -r ".version")
    
  2. 配置新部署

    green-deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: xgboost-model
    endpoint_name: heart-classifier-edp
    model: azureml:heart-classifier@latest
    instance_type: Standard_DS2_v2
    instance_count: 1
    

    如下所示为部署命名:

    GREEN_DEPLOYMENT_NAME="xgboost-model-$VERSION"
    
  3. 创建新部署

    az ml online-deployment create -n $GREEN_DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME -f green-deployment.yml
    

    如果终结点没有传出连接,请通过添加 --with-package 标记使用模型打包(预览版):

    az ml online-deployment create --with-package -n $GREEN_DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME -f green-deployment.yml
    
  4. 在不更改流量的情况下测试部署

    az ml online-endpoint invoke --name $ENDPOINT_NAME --deployment-name $GREEN_DEPLOYMENT_NAME --request-file sample.json
    

    提示

    请注意我们现在如何指明要调用的部署的名称。

逐步更新流量

在对新部署有信心后,我们可以更新流量,以将一部分流量路由到新部署。 流量是在终结点级别配置的:

  1. 配置流量:

    在 Azure CLI 中不需要执行此步骤

  2. 更新终结点

    az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=90 $GREEN_DEPLOYMENT_NAME=10"
    
  3. 如果你决定将整个流量切换到新部署,请更新所有流量:

    在 Azure CLI 中不需要执行此步骤

  4. 更新终结点

    az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=0 $GREEN_DEPLOYMENT_NAME=100"
    
  5. 由于旧部署未收到任何流量,因此你可以放心地删除旧部署:

    az ml online-deployment delete --endpoint-name $ENDPOINT_NAME --name default
    

    提示

    请注意,此时,以前的“蓝色部署”已删除,新的“绿色部署”取代了“蓝色部署”。

清理资源

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

重要

请注意,删除终结点也会删除其下的所有部署。

后续步骤