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

将Azure Pipelines用于Azure 机器学习

Azure DevOps 服务 |Azure DevOps Server 2022 - Azure DevOps Server 2019

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

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

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

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

先决条件

步骤 1:获取代码

从GitHub分叉以下存储库:

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

步骤 2:创建项目

登录到Azure。 搜索并选择Azure DevOps组织。 选择“ 查看我的组织”。 选择要使用的组织。

在所选组织中,创建 个项目。 如果组织中没有任何项目,则会看到 “创建项目”以开始 屏幕。 否则,请选择仪表板右上角的“新建Project”按钮。

步骤 3:创建服务连接

可以使用现有的服务连接。

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

  1. 在 Azure DevOps 中,选择 Project 设置,然后选择 Service connections

  2. 选择创建服务连接,选择Azure 资源管理器,然后选择Next

  3. 使用标识类型和凭据的默认值。

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

    ARM 服务连接的屏幕截图。

步骤 4:创建管道

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

  2. 选择 GitHub 作为源代码的位置。

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

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

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

  6. 选择 入门管道。 您更新初始管道模板。

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

删除起始管道,并将其替换为以下 YAML 代码。 在该流程中,您将:

  • 使用Python版本任务设置 Python 3.10 并安装 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.10
    inputs:
      versionSpec: '>=3.10'

  - 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 资源管理器 选项卡上的 AzureMLJobWaitTask@1 任务和泛型选项卡上的 InvokeRESTAPI@1 webhook 注册)取决于Azure 机器学习在作业完成时将 RunTerminated 通知发送回Azure DevOps。 此通知路径当前正在接受调查,可能无法按预期完成,导致 WaitFor* 服务器作业超时,无法反映 Azure 机器学习 作业状态。 如果遇到此行为,请使用 az ml job show --query status 轮询代理作业的状态,直到返回终端状态(CompletedFailedCanceled),并以匹配的状态退出任务。

如果使用资源管理器服务连接,可以使用机器学习扩展。 可以在 Azure DevOps extensions Marketplace 中搜索此扩展或直接转到 extension 页面。 安装机器学习扩展。

重要

不要安装 机器学习 (经典) 扩展。 它是一个不提供相同功能的较旧扩展。

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

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

注意

  • Azure 机器学习作业等待任务在服务器作业上运行,该作业不使用昂贵的代理池资源,无需额外付费。 服务器作业(由pool: server指示)在与您的管道相同的计算机上运行。 有关详细信息,请参阅 服务器作业
  • 一个 Azure 机器学习作业等待任务只能等待一个作业。 你需要为每个要等待的作业设置单独的任务。
  • Azure 机器学习作业等待任务最多可以等待两天。 此限制是由Azure DevOps管道设置的硬限制。
- job: WaitForAzureMLJobCompletion
  displayName: Wait for AzureML Job Completion
  pool: server
  timeoutInMinutes: 0
  dependsOn: SubmitAzureMLJob
  variables: 
    # Save the name of the azureMl job submitted in the previous step to a variable. It will be used as an input 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:提交管道并验证管道运行

选择“ 保存并运行”。 当步骤 6 中的等待机制按设计工作时,管道将等待Azure 机器学习作业完成并结束WaitForJobCompletion下的任务,其状态与Azure 机器学习作业相同。 例如:

  • Azure 机器学习作业 Succeeded == WaitForJobCompletion 作业下的 Azure DevOps 任务 Succeeded

  • Azure 机器学习作业 Failed == WaitForJobCompletion 作业下的 Azure DevOps 任务 Failed

  • Azure 机器学习作业 Cancelled == WaitForJobCompletion 作业下的 Azure DevOps 任务 Cancelled

注意

由于步骤 6 中指出的问题,WaitFor* 作业可能会超时,导致无法反映 Azure 机器学习作业的状态。 使用Azure 机器学习工作室确认实际作业结果,直到通知路径还原。

提示

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

清理资源

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