将 Azure Pipelines 与 Azure 机器学习配合使用

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

可以使用 Azure DevOps Pipelines 自动执行机器学习生命周期。 可以自动执行的操作包括:

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

本文介绍如何创建一个 Azure 管道来生成机器学习模型并将其部署到 Azure 机器学习

本教程使用 Azure 机器学习 Python SDK v2Azure CLI ML 扩展 v2

先决条件

步骤 1:获取代码

在 GitHub 创建以下存储库分支:

https://github.com/azure/azureml-examples

步骤 2:登录到 Azure Pipelines

登录到 Azure Pipelines。 登录后,浏览器会转到 https://dev.azure.com/my-organization-name 并显示 Azure DevOps 仪表板。

在所选组织中,创建项目。 如果组织中没有任何项目,则会显示创建项目并开始使用屏幕。 或者选择仪表板右上角的“新建项目”按钮。

步骤 3:创建服务连接

可使用现有的服务连接。

需要 Azure 资源管理器连接才能在 Azure 门户中进行身份验证。

  1. 在 Azure DevOps 中,选择“项目设置”并打开“服务连接”页。

  2. 选择“创建服务连接”并选择“Azure 资源管理器”。

  3. 选择默认身份验证方法“服务主体(自动)”。

  4. 创建服务连接。 设置首选范围级别、订阅、资源组和连接名称。

    ARM 服务连接的屏幕截图。

步骤 4:创建管道

  1. 转到“管道”,然后选择“创建管道”。

  2. 完成向导中的各个步骤。首先选择 GitHub 作为源代码位置。

  3. 可能会重定向到 GitHub 进行登录。 如果是这样,请输入 GitHub 凭据。

  4. 看到存储库列表时,请选择你的存储库。

  5. 你可能会被重定向到 GitHub 来安装 Azure Pipelines 应用。 如果是,请选择“批准并安装”。

  6. 选择“初学者管道”。 你将更新初学者管道模板。

步骤 5:生成 YAML 管道以提交 Azure 机器学习作业

删除初学者管道,并将其替换为以下 YAML 代码。 在此管道中,你将:

  • 使用 Python 版本任务设置 Python 3.8 并安装 SDK 要求。
  • 使用 Bash 任务为 Azure 机器学习 SDK 和 CLI 运行 bash 脚本。
  • 使用 Azure CLI 任务提交 Azure 机器学习作业。

根据使用的是 Azure 资源管理器服务连接还是通用服务连接,选择以下选项卡。 在管道 YAML 中,将变量的值替换为你的资源。

name: submit-azure-machine-learning-job

trigger:
- none

variables:
  service-connection: 'machine-learning-connection' # replace with your service connection name
  resource-group: 'machinelearning-rg' # replace with your resource group name
  workspace: 'docs-ws' # replace with your workspace name

jobs:
- job: SubmitAzureMLJob
  displayName: Submit AzureML Job
  timeoutInMinutes: 300
  pool:
    vmImage: ubuntu-latest
  steps:
  - task: UsePythonVersion@0
    displayName: Use Python >=3.8
    inputs:
      versionSpec: '>=3.8'

  - bash: |
      set -ex

      az version
      az extension add -n ml
    displayName: 'Add AzureML Extension'

  - task: AzureCLI@2
    name: submit_azureml_job_task
    displayName: Submit AzureML Job Task
    inputs:
      azureSubscription: $(service-connection)
      workingDirectory: 'cli/jobs/pipelines-with-components/nyc_taxi_data_regression'
      scriptLocation: inlineScript
      scriptType: bash
      inlineScript: |
      
        # submit component job and get the run name
        job_name=$(az ml job create --file single-job-pipeline.yml -g $(resource-group) -w $(workspace) --query name --output tsv)

        # Set output variable for next task
        echo "##vso[task.setvariable variable=JOB_NAME;isOutput=true;]$job_name"

步骤 6:等待 Azure 机器学习作业完成

在步骤 5 中,你添加了一个提交 Azure 机器学习作业的作业。 在此步骤中,另外添加一个等待 Azure 机器学习作业完成的作业。

如果使用 Azure 资源管理器服务连接,你可以使用“机器学习”扩展。 可在 Azure DevOps 扩展市场中搜索此扩展,也可直接转到该扩展。 安装“机器学习”扩展。

重要

不要错误地安装“机器学习(经典版)”扩展,它是一个更旧的扩展,不提供相同的功能。

在“管道评审”窗口中,添加服务器作业。 在作业的步骤部分,选择“显示助手”并搜索“AzureML”。 选择“AzureML 作业等待”任务并填写作业的信息。

该任务有 4 个输入:Service ConnectionAzure Resource Group NameAzureML Workspace NameAzureML Job Name。 填写这些输入。 这些步骤生成的 YAML 类似于以下示例:

注意

  • Azure 机器学习作业等待任务在服务器作业上运行,该作业不会耗尽昂贵的代理池资源,也不需要额外的费用。 服务器作业(由 pool: server 指示)在管道所在的计算机上运行。
  • 一个 Azure 机器学习作业等待任务只能等待一个作业。 需要为每个要等待的作业设置单独的任务。
  • Azure 机器学习作业等待任务最多可等待 2 天。 这是 Azure DevOps Pipelines 设置的硬性限制。
- job: WaitForAzureMLJobCompletion
  displayName: Wait for AzureML Job Completion
  pool: server
  timeoutInMinutes: 0
  dependsOn: SubmitAzureMLJob
  variables: 
    # We are saving the name of azureMl job submitted in previous step to a variable and it will be used as an inut to the AzureML Job Wait task
    azureml_job_name_from_submit_job: $[ dependencies.SubmitAzureMLJob.outputs['submit_azureml_job_task.JOB_NAME'] ] 
  steps:
  - task: AzureMLJobWaitTask@1
    inputs:
      serviceConnection: $(service-connection)
      resourceGroupName: $(resource-group)
      azureMLWorkspaceName: $(workspace)
      azureMLJobName: $(azureml_job_name_from_submit_job)

步骤 7:提交管道并验证管道运行

选择“保存并运行”。 管道将等待 Azure 机器学习作业完成,并在 WaitForJobCompletion 下结束任务,状态与 Azure 机器学习作业相同。 例如:Azure 机器学习作业 Succeeded == WaitForJobCompletion 作业下的 Azure DevOps 任务 Succeeded,Azure 机器学习作业 Failed == WaitForJobCompletion 作业下的 Azure DevOps 任务 Failed,Azure 机器学习作业 Cancelled == WaitForJobCompletion 作业下的 Azure DevOps 任务 Cancelled

提示

可以在 Azure 机器学习工作室中查看完整的 Azure 机器学习作业。

清理资源

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