将 GitHub Actions 与 Azure 机器学习配合使用

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

开始使用 GitHub Actions 以便在 Azure 机器学习上训练模型。

本文介绍如何创建生成机器学习模型并将其部署到 Azure 机器学习的 GitHub Actions工作流。 你将基于纽约出租车数据集训练 scikit-learn 线性回归模型。

GitHub Actions 使用存储库中 /.github/workflows/ 路径下的工作流 YAML (.yml) 文件。 此定义包含组成工作流的各种步骤和参数。

先决条件

  • Azure 机器学习工作区。 有关创建工作区的步骤,请参阅 “创建工作区”。

  • 适用于 Python v2 的 Azure 机器学习 SDK。 若要安装 SDK,请使用以下命令:

    pip install azure-ai-ml azure-identity
    

    要将 SDK 的现有安装更新到最新版本,请使用以下命令:

    pip install --upgrade azure-ai-ml azure-identity
    

    有关详细信息,请参阅 适用于 Python 的 Azure 机器学习包客户端库

  • 一个 GitHub 帐户。 如果你没有帐户,可免费注册一个。

步骤 1:获取代码

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

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

在本地克隆分支存储库。

git clone https://github.com/YOUR-USERNAME/azureml-examples

步骤 2:使用 Azure 进行身份验证

首先需要定义如何使用 Azure 进行身份验证。 建议的更安全的选项是使用 Microsoft Entra 应用程序或用户分配的托管标识登录 OpenID Connect。 如有必要,还可以使用服务主体和机密登录。 此方法不太安全,不建议这样做。

生成部署凭据

若要凭借 OIDC 使用 Azure 登录操作,需要在 Microsoft Entra 应用程序或用户分配的托管标识上配置联合标识凭据。

选项 1:Microsoft Entra 应用程序

选项 2:用户分配的托管标识

创建机密

需要向登录操作提供应用程序的“客户端 ID”、“目录(租户) ID”和“订阅 ID”。 这些值可直接在工作流中提供,或可存储在 GitHub 机密中并在工作流中引用。 将这些值保存为 GitHub 机密是更安全的选择。

  1. GitHub 中,转到存储库。

  2. 选择“安全性”>“机密和变量”>“操作”。

    添加机密的屏幕截图

  3. 选择“新建存储库机密”。

    注意

    若要增强公共存储库中的工作流安全性,请使用环境机密而不是存储库机密。 如果环境需要批准,作业在所需的审查者批准之前不能访问环境机密。

  4. AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_SUBSCRIPTION_ID 创建机密。 从 GitHub 机密的 Microsoft Entra 应用程序或用户分配的托管标识复制这些值:

    GitHub 机密 Microsoft Entra 应用程序或用户分配的托管标识
    AZURE_CLIENT_ID 客户端 ID
    AZURE_SUBSCRIPTION_ID 订阅 ID
    AZURE_TENANT_ID (Azure租户ID) 目录(租户)ID

    注意

    出于安全原因,我们建议使用 GitHub 机密,而不是将值直接传递到工作流。

步骤 3:更新 setup.sh 以连接到 Azure 机器学习工作区

需要更新 CLI 安装文件变量以匹配工作区。

  1. 在分支存储库中,转到 azureml-examples/cli/

  2. 编辑 setup.sh 并更新文件中的这些变量。

    变量 说明
    GROUP 资源组的名称
    位置 工作区的位置(例如 eastus2
    工作区 Azure 机器学习工作区的名称

步骤 4:使用计算群集名称更新 pipeline.yml

你将使用 pipeline.yml 文件来部署 Azure 机器学习管道。 该管道为机器学习管道,而不是 DevOps 管道。 仅当要为自己的计算机群集名称使用 cpu-cluster 之外的名称时,才需要进行此更新。

  1. 在分支存储库中,转到 azureml-examples/cli/jobs/pipelines/nyc-taxi/pipeline.yml
  2. 每次看到 compute: azureml:cpu-cluster 时,都使用计算群集名称更新 cpu-cluster 的值。 例如,如果群集名称为 my-cluster,则新的值为 azureml:my-cluster。 有五个更新。

步骤 5:运行 GitHub Actions 工作流

工作流使用 Azure 进行身份验证、设置 Azure 机器学习 CLI 并使用 CLI 在 Azure 机器学习中训练模型。

工作流文件由触发器部分和作业组成:

  • 触发器在 on 部分中启动工作流。 工作流默认按 cron 计划运行,也在匹配的分支和路径发出拉取请求时运行。 详细了解触发工作流的事件
  • 在工作流的作业部分中,签出代码并使用 OpenID Connect 通过 Azure 登录操作登录到 Azure。
  • 作业部分还包括设置操作,用于安装和设置机器学习 CLI (v2)。 安装 CLI 后,运行作业操作将运行 Azure 机器学习 pipeline.yml 文件,以使用纽约出租车数据训练模型。

启用工作流

  1. 在分支存储库中,打开 .github/workflows/cli-jobs-pipelines-nyc-taxi-pipeline.yml 并验证工作流是否如下所示。

    name: cli-jobs-pipelines-nyc-taxi-pipeline
    on:
      workflow_dispatch:
      schedule:
        - cron: "0 0/4 * * *"
      pull_request:
        branches:
          - main
          - sdk-preview
        paths:
          - cli/jobs/pipelines/nyc-taxi/**
          - .github/workflows/cli-jobs-pipelines-nyc-taxi-pipeline.yml
          - cli/run-pipeline-jobs.sh
          - cli/setup.sh
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
        - name: check out repo
          uses: actions/checkout@v2
        - name: azure login
          uses: azure/login@v2
          with:
              client-id: ${{ secrets.AZURE_CLIENT_ID }}
              tenant-id: ${{ secrets.AZURE_TENANT_ID }}
              subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
        - name: setup
          run: bash setup.sh
          working-directory: cli
          continue-on-error: true
        - name: run job
          run: bash -x ../../../run-job.sh pipeline.yml
          working-directory: cli/jobs/pipelines/nyc-taxi
    
  2. 选择“查看运行”。

  3. 选择“我了解我的工作流,继续并启用”以启用工作流。

  4. 选择 cli-jobs-pipelines-nyc-taxi-pipeline 工作流并选择“启用工作流”。

    启用 GitHub Actions 工作流的屏幕截图。

  5. 选择“运行工作流”,并选择立即运行工作流。

    运行 GitHub Actions 工作流的屏幕截图。

步骤 6:验证工作流运行

  1. 打开已完成的工作流运行并验证生成作业是否成功运行。 作业旁边会显示绿色复选标记。

  2. 打开Azure 机器学习工作室并导航到 nyc-taxi-pipeline-example。 验证作业的每个部分(准备、转换、训练、预测、评分)是否完成,以及是否看到绿色复选标记。

    机器学习工作室中成功的运行的屏幕截图。

清理资源

不再需要资源组和存储库时,请通过删除资源组和 GitHub 存储库来清理部署的资源。

后续步骤