将 GitHub Actions 与 Azure 机器学习配合使用
本文内容
先决条件
步骤 1:获取代码
步骤 2:使用 Azure 进行身份验证
步骤 3:更新 setup.sh 以连接到 Azure 机器学习工作区
步骤 4:使用计算群集名称更新 pipeline.yml
步骤 5:运行 GitHub Actions 工作流
步骤 6:验证工作流运行
清理资源
后续步骤
显示另外 5 个
适用范围: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 SDK v2,请使用以下命令:
pip install azure-ai-ml azure-identity
要将 SDK 的现有安装更新到最新版本,请使用以下命令:
pip install --upgrade azure-ai-ml azure-identity
有关详细信息,请参阅安装适用于 Azure 机器学习的 Python SDK v2 。
一个 GitHub 帐户。 如果你没有帐户,可免费注册 一个。
在 GitHub 创建以下存储库分支:
https://github.com/azure/azureml-examples
在本地克隆分支存储库。
git clone https://github.com/YOUR-USERNAME/azureml-examples
首先需要定义如何使用 Azure 进行身份验证。 可以使用服务主体 或 OpenID Connect 。
在 Azure CLI 中使用 az ad sp create-for-rbac 命令创建服务主体 。
az ad sp create-for-rbac --name "myML" --role contributor \
--scopes /subscriptions/<subscription-id>/resourceGroups/<group-name> \
--sdk-auth
在上面的示例中,请将占位符替换为你的订阅 ID、资源组名称和应用名称。 输出是一个 JSON 对象,包含的角色分配凭据可提供对应用服务应用的访问权限,如下所示。 复制此 JSON 对象供以后使用。
{
"clientId": "<GUID>",
"clientSecret": "<GUID>",
"subscriptionId": "<GUID>",
"tenantId": "<GUID>",
(...)
}
OpenID Connect 是一种使用短期令牌的身份验证方法。 使用 GitHub Actions 设置 OpenID Connect 的过程会更复杂,能提供更强的安全性。
如果没有现有的应用程序,请注册一个可访问资源的新 Active Directory 应用程序和服务主体 。 创建 Active Directory 应用程序。
az ad app create --display-name myApp
此命令将输出 JSON,其中 appId
为你的 client-id
。 保存该值,稍后将其用作 AZURE_CLIENT_ID
GitHub 机密。
使用图形 API 创建联合凭据时,将使用 objectId
值,并将其引用为 APPLICATION-OBJECT-ID
。
创建服务主体。 将 $appID
替换为 JSON 输出中的 appId。
此命令使用不同的 objectId
生成 JSON 输出,将在下一步中使用。 新的 objectId
是 assignee-object-id
。
复制 appOwnerTenantId
以在稍后用作 AZURE_TENANT_ID
的 GitHub 机密。
az ad sp create --id $appId
按订阅和对象创建新的角色分配。 默认情况下,角色分配将绑定到默认订阅。 将 $subscriptionId
替换为你的订阅 ID,将 $resourceGroupName
替换为你的资源组名称,将 $assigneeObjectId
替换为生成的 assignee-object-id
。 了解如何使用 Azure CLI 管理 Azure 订阅 。
az role assignment create --role contributor --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroupName --subscription $subscriptionId --assignee-object-id $assigneeObjectId --assignee-principal-type ServicePrincipal
运行以下命令,为 Active Directory 应用程序创建新的联合标识凭据 。
将 APPLICATION-OBJECT-ID
替换为 Active Directory 应用程序的 objectId(在创建应用时生成)。
为 CREDENTIAL-NAME
设置一个值供以后引用。
设置 subject
。 此项的值由 GitHub 根据工作流定义:
GitHub Actions 环境中的作业:repo:< Organization/Repository >:environment:< Name >
对于未绑定到环境的作业,请根据用于触发工作流的 ref 路径包括分支/标记的 ref 路径:repo:< Organization/Repository >:ref:< ref path>
。 例如 repo:n-username/ node_express:ref:refs/heads/my-branch
或 repo:n-username/ node_express:ref:refs/tags/my-tag
。
对于由拉取请求事件触发的工作流:repo:< Organization/Repository >:pull_request
。
az rest --method POST --uri 'https://microsoftgraph.chinacloudapi.cn/beta/applications/<APPLICATION-OBJECT-ID>/federatedIdentityCredentials' --body '{"name":"<CREDENTIAL-NAME>","issuer":"https://token.actions.githubusercontent.com","subject":"repo:organization/repository:ref:refs/heads/main","description":"Testing","audiences":["api://AzureADTokenExchange"]}'
若要了解如何在 Azure 门户中创建 Active Directory 应用程序、服务主体和联合凭据,请参阅连接 GitHub 和 Azure 。
在 GitHub 中浏览存储库,选择“设置”>“机密”>“操作”。 选择“新建存储库机密”。
将 Azure CLI 命令的整个 JSON 输出粘贴到机密的值字段中。 为机密指定名称 AZ_CREDS
。
需要向登录操作提供应用程序的“客户端 ID”、“租户 ID”和“订阅 ID”。 这些值可直接在工作流中提供,或可存储在 GitHub 机密中并在工作流中引用。 将这些值保存为 GitHub 机密是更安全的选择。
在 GitHub 中浏览存储库,选择“设置”>“机密”>“操作”。 选择“新建存储库机密”。
为 AZURE_CLIENT_ID
、AZURE_TENANT_ID
和 AZURE_SUBSCRIPTION_ID
创建机密。 将 Active Directory 应用程序中的这些值用于 GitHub 机密:
展开表
GitHub 机密
Active Directory 应用程序
AZURE_CLIENT_ID
应用程序(客户端)ID
AZURE_TENANT_ID
目录(租户)ID
AZURE_SUBSCRIPTION_ID
订阅 ID
通过选择“添加机密”来保存每个机密。
步骤 3:更新 setup.sh
以连接到 Azure 机器学习工作区
需要更新 CLI 安装文件变量以匹配工作区。
在分支存储库中,转到 azureml-examples/cli/
。
编辑 setup.sh
并更新文件中的这些变量。
展开表
变量
说明
GROUP
资源组的名称
LOCATION
工作区的位置(例如 chinanorth2
)
工作区
Azure 机器学习工作区的名称
步骤 4:使用计算群集名称更新 pipeline.yml
你将使用 pipeline.yml
文件来部署 Azure 机器学习管道。 这是机器学习管道,而不是 DevOps 管道。 仅当要为自己的计算机群集名称使用 cpu-cluster
之外的名称时,才需要进行此更新。
在分支存储库中,转到 azureml-examples/cli/jobs/pipelines/nyc-taxi/pipeline.yml
。
每次看到 compute: azureml:cpu-cluster
时,都使用计算群集名称更新 cpu-cluster
的值。 例如,如果群集名称为 my-cluster
,则新的值为 azureml:my-cluster
。 有五个更新。
步骤 5:运行 GitHub Actions 工作流
工作流使用 Azure 进行身份验证、设置 Azure 机器学习 CLI 并使用 CLI 在 Azure 机器学习中训练模型。
工作流文件由触发器部分和作业组成:
触发器在 on
部分中启动工作流。 工作流默认按 cron 计划运行,也在匹配的分支和路径发出拉取请求时运行。 详细了解触发工作流的事件 。
在工作流的作业部分中,签出代码并使用服务主体机密登录到 Azure。
作业部分还包括设置操作,用于安装和设置机器学习 CLI (v2) 。 安装 CLI 后,运行作业操作将运行 Azure 机器学习 pipeline.yml
文件,以使用纽约出租车数据训练模型。
在分支存储库中,打开 .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@v1
with:
creds: ${{secrets.AZURE_CREDENTIALS}}
- 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
选择“查看运行”。
选择“我了解我的工作流,继续并启用”以启用工作流。
选择 cli-jobs-pipelines-nyc-taxi-pipeline 工作流并选择“启用工作流”。
选择“运行工作流”,并选择立即运行工作流。
工作流文件由触发器部分和作业组成:
触发器在 on
部分中启动工作流。 工作流默认按 cron 计划运行,也在匹配的分支和路径发出拉取请求时运行。 详细了解触发工作流的事件 。
在工作流的作业部分中,签出代码并使用 OpenID Connect 通过 Azure 登录操作登录到 Azure。
作业部分还包括设置操作,用于安装和设置机器学习 CLI (v2) 。 安装 CLI 后,运行作业操作将运行 Azure 机器学习 pipeline.yml
文件,以使用纽约出租车数据训练模型。
在分支存储库中,打开 .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@v1
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
选择“查看运行”。
选择“我了解我的工作流,继续并启用”以启用工作流。
选择 cli-jobs-pipelines-nyc-taxi-pipeline 工作流并选择“启用工作流”。
选择“运行工作流”,并选择立即运行工作流。
打开已完成的工作流运行并验证生成作业是否成功运行。 作业旁边会显示绿色复选标记。
打开Azure 机器学习工作室并导航到 nyc-taxi-pipeline-example。 验证作业的每个部分(准备、转换、训练、预测、评分)是否完成,以及是否看到绿色复选标记。
不再需要资源组和存储库时,请通过删除资源组和 GitHub 存储库来清理部署的资源。