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

使用 Azure DevOps 设置 MLOps

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

可以通过 Azure 机器学习与 Azure DevOps 管道集成,以自动执行机器学习生命周期。 可以自动执行的操作包括:

  • Azure 机器学习基础结构的部署
  • 数据准备(提取、转换、加载操作)
  • 通过按需横向扩展和纵向扩展训练机器学习模型
  • 将机器学习模型部署为公共或专用 Web 服务
  • 监视部署的机器学习模型(例如用于性能分析)

本文介绍如何使用 Azure 机器学习设置端到端 MLOps 管道,该管道运行线性回归来预测纽约市的出租车费用。 管道由组件组成,每个组件提供不同的功能,可在工作区中注册这些功能、对其进行版本控制,并通过各种输入和输出重复使用它们。 你将使用适用于 MLOps 的推荐 Azure 体系结构Azure MLOps (v2) 解决方案加速器,在 Azure 机器学习中快速设置 MLOps 项目。

提示

在实现任何解决方案之前,建议先了解一些建议的适用于 MLOps 的 Azure 体系结构。 你需要为给定的机器学习项目选择最佳体系结构。

先决条件

注意

需要 Git 2.27 或更高版本。 有关安装 Git 命令的详细信息,请参阅 https://git-scm.com/downloads 并选择操作系统

重要

本文中的 CLI 命令是使用 Bash 进行测试的。 如果使用其他 shell,则可能会遇到错误。

使用 Azure 和 DevOps 设置身份验证

在使用 Azure 机器学习设置 MLOps 项目之前,需要为 Azure DevOps 设置身份验证。

创建服务主体

若要使用演示,需要创建一个或两个服务主体,具体取决于要处理的环境数量(Dev 和/或 Prod)。 可使用以下方法之一创建这些主体:

  1. 启动 Azure Cloud Shell

    提示

    首次启动 Cloud Shell 时,系统会提示为 Cloud Shell 创建存储帐户。

  2. 如果出现提示,请选择 Bash 作为在 Cloud Shell 中使用的环境。 还可以在顶部导航栏的下拉列表中更改环境

    Screenshot of the cloud shell environment dropdown.

  3. 将下面的 bash 命令复制到计算机,并使用项目的值更新 projectName、subscriptionId 和 environment 变量。 如果同时创建 Dev 和 Prod 环境,需要为每个环境运行一次此脚本,为每个环境创建一个服务主体。 此命令还将向所提供的订阅中的服务主体授予“参与者”角色。 必须具备此项,才能使 Azure DevOps 正确使用该订阅中的资源。

    projectName="<your project name>"
    roleName="Contributor"
    subscriptionId="<subscription Id>"
    environment="<Dev|Prod>" #First letter should be capitalized
    servicePrincipalName="Azure-ARM-${environment}-${projectName}"
    # Verify the ID of the active subscription
    echo "Using subscription ID $subscriptionID"
    echo "Creating SP for RBAC with name $servicePrincipalName, with role $roleName and in scopes     /subscriptions/$subscriptionId"
    az ad sp create-for-rbac --name $servicePrincipalName --role $roleName --scopes /subscriptions/$subscriptionId
    echo "Please ensure that the information created here is properly save for future use."
    
  4. 将编辑后的命令复制到 Azure Shell 中并运行它们 (Ctrl + Shift + v)。

  5. 运行这些命令后,你将看到与服务主体相关的信息。 将此信息保存到安全位置,稍后将在演示中用于配置 Azure DevOps。

    {
       "appId": "<application id>",
       "displayName": "Azure-ARM-dev-Sample_Project_Name",
       "password": "<password>",
       "tenant": "<tenant id>"
    }
    
  6. 如果要为 Dev 和 Prod 环境创建服务主体,请重复步骤 3。 在本演示中,我们将只创建一个环境,即 Prod。

  7. 创建服务主体后,关闭 Cloud Shell。

设置 Azure DevOps

  1. 导航到 Azure DevOps

  2. 选择“创建新项目”(将本教程的项目命名为 mlopsv2)。

    Screenshot of ADO Project.

  3. 在“项目设置”下的项目中(项目页的左下角),选择“服务连接”。

  4. 选择“创建服务连接”。

    Screenshot of ADO New Service connection button.

  5. 选择“Azure 资源管理器”和“下一步”,再选择“服务主体(手动)”和“下一步”,然后对于范围级别,选择“订阅”。

    • 订阅名称 - 使用存储服务主体的订阅的名称。
    • 订阅 ID - 使用在步骤 1 输入中使用的 subscriptionId 作为订阅 ID
    • 服务主体 ID - 使用步骤 1 输出中的 appId 作为服务主体 ID
    • 服务主体密钥 - 使用步骤 1 输出中的 password 作为服务主体密钥
    • 租户 ID - 使用步骤 1 输出中的 tenant 作为租户 ID
  6. 将服务连接命名为 Azure-ARM-Prod。

  7. 选择“授予对所有管道的访问权限”,然后选择“验证并保存”。

Azure DevOps 设置已成功完成。

使用 Azure DevOps 设置源存储库

  1. 打开在 Azure DevOps 中创建的项目

  2. 打开“Repos”部分,然后选择“导入存储库”

    Screenshot of Azure DevOps import repo first time.

  3. 在“克隆 URL”字段输入 https://github.com/Azure/mlops-v2-ado-demo。 选择页面底部的“导入”

    Screenshot of Azure DevOps import MLOps demo repo.

  4. 打开左侧导航窗格底部的“项目”设置

  5. 在“存储库”部分下,选择“存储库”。 选择在上一步中创建的存储库,然后选择“安全性”选项卡

  6. 在“用户权限”部分下,选择“mlopsv2 生成服务”用户。 将“参与”权限更改为“允许”,将“创建分支”权限更改为“允许”。 Screenshot of Azure DevOps permissions.

  7. 在左侧导航窗格中打开“管道”部分,然后选择“创建管道”按钮旁边的 3 个垂直点。 选择“管理安全性”

    Screenshot of Pipeline security.

  8. 在“用户”部分下,为项目选择“mlopsv2 生成服务”帐户。 将“编辑生成管道”权限更改为“允许”

    Screenshot of Add security.

注意

这意味着先决条件部分已完成,可以开始部署解决方案加速器了。

通过 Azure DevOps 部署基础结构

此步骤将训练管道部署到在先前步骤中创建的 Azure 机器学习工作区。

提示

在签出 MLOps v2 存储库和部署基础结构之前,请确保了解解决方案加速器的体系结构模式。 在示例中,你将使用经典 ML 项目类型

运行 Azure 基础结构管道

  1. 转到存储库 mlops-v2-ado-demo,然后选择 config-infra-prod.yml 文件。

    重要

    确保已选择存储库的主分支。

    Screenshot of Repo in ADO.

    此配置文件使用命名空间和后缀值(项目的名称)以确保唯一性。 根据自己的需要更新配置中的以下部分。

     namespace: [5 max random new letters]
     postfix: [4 max random new digits]
     location: eastus
    

    注意

    如果运行的是深度学习工作负载(如 CV 或 NLP),请确保 GPU 计算在部署区域中可用。

  2. 选择“提交并推送代码”,将这些值放入管道中。

  3. 转到 Pipelines 部分

    Screenshot of ADO Pipelines.

  4. 选择“Create Pipeline”。

  5. 选择“Azure Repos Git”。

    Screenshot of ADO Where's your code.

  6. 选择从上一部分克隆的存储库 mlops-v2-ado-demo

  7. 选择现有 Azure Pipelines YAML 文件

    Screenshot of Azure DevOps Pipeline page on configure step.

  8. 选择 main 分支,选择 mlops/devops-pipelines/cli-ado-deploy-infra.yml,然后选择“继续”。

  9. 运行管道需要几分钟才能完成。 管道应会创建以下项目:

    • 工作区的资源组,包括存储帐户、容器注册表、Application Insights、Keyvault 和 Azure 机器学习工作区本身。
    • 在工作区中,还创建了一个计算群集。
  10. 现在,MLOps 项目的基础结构已部署。 Screenshot of ADO Infra Pipeline screen.

    注意

    可能会忽略“无法将现有存储库移动到所需位置并重复使用”警告。

示例训练和部署方案

解决方案加速器包括示例端到端机器学习管道的代码和数据,该管道运行线性回归来预测纽约市的出租车费用。 管道由组件组成,每个组件提供不同的功能,可在工作区中注册这些功能、对其进行版本控制,并通过各种输入和输出重复使用它们。 计算机视觉和 NLP 方案的示例管道和工作流具有不同的步骤和部署步骤。

此训练管道包含以下步骤:

准备数据

  • 此组件采用多个出租车数据集(黄色和绿色),合并/筛选数据,并准备训练/验证和评估数据集。
  • 输入:./data/ 下的本地数据(多个 .csv 文件)
  • 输出:准备好的单个数据集 (.csv) 和训练/验证/测试数据集。

训练模型

  • 此组件使用训练集来训练线性回归器。
  • 输入:训练数据集
  • 输出:经过训练的模型(pickle 格式)

评估模型

  • 此组件使用经过训练的模型来预测测试集的出租车费用。
  • 输入:ML 模型和测试数据集
  • 输出:模型的性能以及表示是否进行部署的部署标志。
  • 此组件将模型的性能与新测试数据集上所有先前部署的模型进行比较,并决定是否将模型提升到生产环境中。 通过在 AML 工作区中注册模型,将模型提升到生产环境。

注册模型

  • 此组件根据测试集中预测的准确程度对模型进行评分。
  • 输入:经过训练的模型和部署标志。
  • 输出:Azure 机器学习中已注册的模型。

部署模型训练管道

  1. 转到 ADO Pipelines

    Screenshot of ADO Pipelines.

  2. 选择“新建管道”。

    Screenshot of ADO New Pipeline button.

  3. 选择“Azure Repos Git”。

    Screenshot of ADO Where's your code.

  4. 选择从上一部分克隆的存储库 mlopsv2

  5. 选择现有 Azure Pipelines YAML 文件

    Screenshot of ADO Pipeline page on configure step.

  6. 选择 main 作为分支,选择 /mlops/devops-pipelines/deploy-model-training-pipeline.yml,然后选择“继续”。

  7. 保存并运行管道

注意

此时,将配置基础结构并部署 MLOps 体系结构的原型循环。 你已准备好将训练后的模型迁移到生产环境。

部署已训练的模型

此方案包括两种方法的预生成工作流,可部署训练模型、批量评分或将模型部署到终结点进行实时评分。 可以运行其中一个或两个工作流,以在 Azure ML 工作区中测试模型的性能。 在此示例中,我们将使用实时评分。

部署 ML 模型终结点

  1. 转到 ADO Pipelines

    Screenshot of ADO Pipelines.

  2. 选择“新建管道”。

    Screenshot of ADO New Pipeline button for endpoint.

  3. 选择“Azure Repos Git”。

    Screenshot of ADO Where's your code.

  4. 选择从上一部分克隆的存储库 mlopsv2

  5. 选择现有 Azure Pipelines YAML 文件

    Screenshot of Azure DevOps Pipeline page on configure step.

  6. 选择 main 作为分支,选择“托管联机终结点”/mlops/devops-pipelines/deploy-online-endpoint-pipeline.yml,然后选择“继续”。

  7. 联机终结点名称必须是唯一的,因此请将 taxi-online-$(namespace)$(postfix)$(environment) 更改为另一个唯一名称,然后选择“运行”。 如果没有失败,则无需更改默认值。

    Screenshot of Azure DevOps batch deploy script.

    重要

    如果运行因现有联机终结点名称而失败,请按照前面所述重新创建管道,并将 [your endpoint-name] 更改为 [your endpoint-name (random number)]

  8. 运行完成后,会看到如下图所示的输出:

    Screenshot of ADO Pipeline batch run result page.

  9. 若要测试此部署,请转到 AzureML 工作区中的“终结点”选项卡,选择终结点,然后单击“测试”选项卡。可以使用位于 /data/taxi-request.json 的克隆存储库中的示例输入数据来测试终结点。

清理资源

  1. 如果你不打算继续使用管道,请删除 Azure DevOps 项目。
  2. 在 Azure 门户中,删除资源组和 Azure 机器学习实例。

后续步骤