使用 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 体系结构。 你需要为给定的机器学习项目选择最佳体系结构。

先决条件

  • Azure 订阅。 如果没有 Azure 订阅,请在开始前创建一个试用版订阅。 尝试试用版订阅
  • Azure 机器学习工作区。
  • 在本地计算机上运行的 Git。
  • Azure DevOps 中的组织
  • 将托管源存储库和管道的 Azure DevOps 项目
  • Azure DevOps 的 Terraform 扩展(如果使用 Azure DevOps 和 Terraform 来启动基础结构)

注意

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

重要

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

使用 Azure 和 DevOps 设置身份验证

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

创建服务主体

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

  1. 导航到 Azure 应用注册

  2. 选择“新建注册”。

    服务主体设置的屏幕截图。

  3. 完成服务主体 (SP) 创建过程,选择“任何组织目录中的帐户(任何 Microsoft Entra 目录 - 多租户)”,并将其命名为 Azure-ARM-Dev-ProjectName。 创建后,重复操作并新建一个名为 Azure-ARM-Prod-ProjectName 的 SP。 将 ProjectName 替换为项目的名称,以便可以唯一标识服务主体。

  4. 转到“证书和机密”并为每个 SP 添加“新建客户端密码”,然后单独存储值和机密。

  5. 若要为这些主体分配必要的权限,请选择相应的订阅并转到 IAM。 依次选择“+ 添加”和“添加角色分配”。

    “添加角色分配”页的屏幕截图。

  6. 选择“参与者”,然后通过选择“+ 选择成员”来添加成员。 添加成员(之前创建的 Azure-ARM-Dev-ProjectName)。

    “添加角色分配”选项的屏幕截图。

  7. 如果将 Dev 和 Prod 环境部署到同一订阅,请在此处重复执行步骤,否则请更改为 prod 订阅,并使用 Azure-ARM-Prod-ProjectName 重复执行操作。 基本 SP 设置已成功完成。

设置 Azure DevOps

  1. 导航到 Azure DevOps

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

    ADO 项目的屏幕截图。

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

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

    ADO“新建服务连接”按钮的屏幕截图。

  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”部分,然后选择“导入存储库”

    首次 Azure DevOps 导入存储库的屏幕截图。

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

    Azure DevOps 导入 MLOps 演示存储库的屏幕截图。

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

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

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

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

    管道安全性的屏幕截图。

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

    “添加安全性”的屏幕截图。

注意

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

通过 Azure DevOps 部署基础结构

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

提示

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

运行 Azure 基础结构管道

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

    重要

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

    ADO 中存储库的屏幕截图。

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

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

    注意

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

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

  3. 转到 Pipelines 部分

    ADO Pipelines 的屏幕截图。

  4. 选择“Create Pipeline”。

  5. 选择“Azure Repos Git”。

    ADO“你的代码在哪里”的屏幕截图。

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

  7. 选择现有 Azure Pipelines YAML 文件

    配置步骤中 Azure DevOps 管道页的屏幕截图。

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

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

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

    注意

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

示例训练和部署方案

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

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

准备数据

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

训练模型

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

评估模型

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

注册模型

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

部署模型训练管道

  1. 转到 ADO Pipelines

    ADO Pipelines 的屏幕截图。

  2. 选择“新建管道”。

    ADO“新建管道”按钮的屏幕截图。

  3. 选择“Azure Repos Git”。

    ADO“你的代码在哪里”的屏幕截图。

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

  5. 选择现有 Azure Pipelines YAML 文件

    配置步骤中 ADO 管道页的屏幕截图。

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

  7. 保存并运行管道

注意

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

部署已训练的模型

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

部署 ML 模型终结点

  1. 转到 ADO Pipelines

    ADO Pipelines 的屏幕截图。

  2. 选择“新建管道”。

    用于终结点的 ADO“新建管道”按钮的屏幕截图。

  3. 选择“Azure Repos Git”。

    ADO“你的代码在哪里”的屏幕截图。

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

  5. 选择现有 Azure Pipelines YAML 文件

    配置步骤中 Azure DevOps 管道页的屏幕截图。

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

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

    Azure DevOps 批处理部署脚本的屏幕截图。

    重要

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

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

    ADO 管道批处理运行结果页的屏幕截图。

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

清理资源

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

后续步骤