你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本文介绍如何使用 Azure CLI 和组件来创建并运行机器学习管道。 您即使不使用组件也可以创建管道,但组件提供了灵活性并允许重复使用。 可以在 YAML 中定义 Azure 机器学习管道,并通过拖放 UI 从 CLI 运行、使用 Python 创作或由 Azure 机器学习工作室设计器组成。 本文重点介绍 CLI。
先决条件
一份 Azure 订阅。 如果没有订阅,请在开始之前创建一个免费帐户。 试用免费版或付费版 Azure 机器学习。
一个 Azure 机器学习工作区。
用于机器学习的 Azure CLI 扩展,已安装并设置。
示例存储库的克隆。 可以使用以下命令克隆存储库:
git clone https://github.com/Azure/azureml-examples --depth 1 cd azureml-examples/cli/jobs/pipelines-with-components/basics
建议的预读取
使用组件创建您的第一个管道
首先,使用示例创建包含组件的管道。 这样做可让你初步了解 Azure 机器学习中的管道和组件的外观。
在cli/jobs/pipelines-with-components/basics
存储库的azureml-examples
目录中,转到3b_pipeline_with_data
子目录。 在此目录下有三种类型的文件。 这些是生成自己的管道时需要创建的文件。
pipeline.yml。 此 YAML 文件定义机器学习管道。 本文介绍如何将完整的机器学习任务分解为多步骤工作流。 例如,考虑使用历史数据训练销售预测模型的简单机器学习任务。 你可能想要生成包含数据处理、模型训练和模型评估步骤的顺序工作流。 每个步骤都是一个具有定义完善的接口的组件,可以独立开发、测试和优化。 管道 YAML 还定义了子步骤如何连接到管道中的其他步骤。 例如,模型训练步骤生成模型文件,模型文件将传递给模型评估步骤。
component.yml。 这些 YAML 文件定义组件。 它们包含以下信息:
- 元数据:名称、显示名称、版本、说明、类型等。 元数据有助于描述和管理组件。
- 接口:输入和输出。 例如,模型训练组件采用训练数据和纪元数作为输入,并生成训练的模型文件作为输出。 定义接口后,不同的团队可以独立开发和测试组件。
- 命令、代码和环境:用于运行组件的命令、代码和环境。 该命令是运行组件的 shell 命令。 该代码通常引用源代码目录。 环境可以是 Azure 机器学习环境(特选或客户创建)、Docker 映像或 conda 环境。
component_src。 这些是特定组件的源代码目录。 它们包含组件中运行的源代码。 可以使用首选语言,包括 Python、R 和其他语言。 代码必须由 shell 命令运行。 源代码可以从 shell 命令行获取几个输入来控制此步骤的运行方式。 例如,一个训练步骤可能会采用训练数据、学习率和纪元数来控制训练过程。 shell 命令的参数用于向代码传递输入和输出。
现在,你将使用示例 3b_pipeline_with_data
创建管道。 以下各节将进一步介绍每个文件。
首先,使用以下命令列出可用的计算资源:
az ml compute list
如果还没有一个名为 cpu-cluster
的群集,可以通过运行以下命令来创建:
注意
跳过此步骤以使用无服务器计算。
az ml compute create -n cpu-cluster --type amlcompute --min-instances 0 --max-instances 10
现在,运行以下命令,创建在pipeline.yml文件中定义的管道作业。 在 pipeline.yml 文件中,计算目标被引用为 azureml:cpu-cluster
。 如果计算目标使用其他名称,务必在 pipeline.yml 文件中进行更新。
az ml job create --file pipeline.yml
应收到 JSON 字典,其中包含有关管道作业的信息,包括:
密钥 | 说明 |
---|---|
name |
作业的 GUID 名称。 |
experiment_name |
在工作室中组织作业时使用的名称。 |
services.Studio.endpoint |
用于监视和查看管道作业的 URL。 |
status |
作业的状态。 此时,它可能为 Preparing 。 |
转到 services.Studio.endpoint
URL 以查看管道的可视化效果:
了解管道定义 YAML
现在,你将在 3b_pipeline_with_data/pipeline.yml 文件中查看管道定义。
注意
若要使用无服务器计算,请将此文件中的 default_compute: azureml:cpu-cluster
替换为 default_compute: azureml:serverless
。
$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
display_name: 3b_pipeline_with_data
description: Pipeline with 3 component jobs with data dependencies
settings:
default_compute: azureml:cpu-cluster
outputs:
final_pipeline_output:
mode: rw_mount
jobs:
component_a:
type: command
component: ./componentA.yml
inputs:
component_a_input:
type: uri_folder
path: ./data
outputs:
component_a_output:
mode: rw_mount
component_b:
type: command
component: ./componentB.yml
inputs:
component_b_input: ${{parent.jobs.component_a.outputs.component_a_output}}
outputs:
component_b_output:
mode: rw_mount
component_c:
type: command
component: ./componentC.yml
inputs:
component_c_input: ${{parent.jobs.component_b.outputs.component_b_output}}
outputs:
component_c_output: ${{parent.outputs.final_pipeline_output}}
# mode: upload
下表描述了管道 YAML 架构最常用的字段。 若要了解详细信息,请参阅完整的管道 YAML 架构。
密钥 | 说明 |
---|---|
type |
必需。 作业类型。 对于管道作业,它必须为 pipeline 。 |
display_name |
管道作业在工作室 UI 中的显示名称。 在工作室 UI 中可编辑。 它不必在工作区中的所有作业中保持唯一。 |
jobs |
必需。 在管道中作为步骤运行的一组单个作业的字典。 这些作业被视为父管道作业的子作业。 在当前版本中,管道中支持的作业类型为 command 和 sweep 。 |
inputs |
管道作业的输入字典。 该键是作业上下文中输入的名称,值为输入值。 可以使用 ${{ parent.inputs.<input_name> }} 表达式,通过管道中单个步骤作业的输入来引用这些管道输入。 |
outputs |
管道作业的输出配置字典。 该键是作业上下文中输出的名称,值为输出配置。 可以使用 ${{ parents.outputs.<output_name> }} 表达式,通过管道中单个步骤作业的输出来引用这些管道输出。 |
3b_pipeline_with_data示例包含一个三步管道。
- 这三个步骤在
jobs
下定义。 这三个步骤都为command
类型。 每个步骤的定义都位于相应的component*.yml
文件中。 可以在 3b_pipeline_with_data 目录中查看组件 YAML 文件。 将在下一部分介绍componentA.yml
。 - 此管道具有数据依赖项,在实际管道中很常见。 组件 A 从本地文件夹(
./data
第 18-21 行)获取数据输入,并将其输出传递到组件 B(第 29 行)。 组件 A 的输出可以引用为${{parent.jobs.component_a.outputs.component_a_output}}
. default_compute
定义管道的默认计算。 如果jobs
下的组件定义了不同的计算,则遵循特定于组件的设置。
在管道中读取和写入数据
一种常见方案是在管道中读取和写入数据。 在 Azure 机器学习中,使用相同的架构读取 和写入 所有类型的作业(管道作业、命令作业和扫描作业)的数据。 以下是一些在管道中应用数据的常见情境示例:
了解组件定义 YAML
下面是 componentA.yml 文件,一个定义组件的 YAML 示例:
$schema: https://azuremlschemas.azureedge.net/latest/commandComponent.schema.json
type: command
name: component_a
display_name: componentA
version: 1
inputs:
component_a_input:
type: uri_folder
outputs:
component_a_output:
type: uri_folder
code: ./componentA_src
environment:
image: python
command: >-
python hello.py --componentA_input ${{inputs.component_a_input}} --componentA_output ${{outputs.component_a_output}}
此表定义组件 YAML 最常用的字段。 若要了解详细信息,请参阅完整的组件 YAML 架构。
密钥 | 说明 |
---|---|
name |
必需。 组件的名称。 它必须在 Azure 机器学习工作区中是唯一的。 它必须以小写字母开头。 允许使用小写字母、数字和下划线(_)。 最大长度为 255 个字符。 |
display_name |
工作室 UI 中组件的显示名称。 它不必在工作区中是唯一的。 |
command |
必需。 要执行的命令 |
code |
要上传并用于组件的源代码目录的本地路径。 |
environment |
必需。 用于运行组件的环境。 |
inputs |
组件输入的字典。 该键是组件上下文中输入的名称,值为组件输入定义。 您可以使用 ${{ inputs.<input_name> }} 表达式来引用命令中的输入。 |
outputs |
组件输出字典。 该键是组件上下文中输出的名称,值为组件输出定义。 可以在命令中使用 ${{ outputs.<output_name> }} 表达式来引用输出。 |
is_deterministic |
如果组件输入未更改,是否重用上一个作业的结果。 默认值是 true 。 默认情况下,此设置也称为 重复使用。 设置为 false 时,通常的情况是强制从云存储或 URL 重新加载数据。 |
在 3b_pipeline_with_data/componentA.yml 示例中,组件 A 具有一个数据输入和一个数据输出,可以连接到父管道中的其他步骤。 提交管道作业时,组件 YAML 部分中的所有 code
文件都将上传到 Azure 机器学习。 在此示例中,将上传下面的 ./componentA_src
文件。 ( componentA.yml第16行)可以在工作室 UI 中看到上传的源代码:双击图形中的 componentA 步骤并转到 “代码 ”选项卡,如以下屏幕截图所示。 可以看到它是一个 hello-world 脚本,它执行一些简单的打印,并将当前日期和时间写入 componentA_output
路径。 该组件通过命令行接收输入并提供输出。 它在 hello.py 中通过 argparse
进行处理。
输入和输出
输入和输出定义组件的接口。 输入和输出可以是文本值(类型string
、number
integer
或boolean
)或包含输入架构的对象。
对象输入(类型uri_file
、、uri_folder
mltable
或mlflow_model
custom_model
)可以连接到父管道作业中的其他步骤,以将数据/模型传递给其他步骤。 在管道图中,对象类型输入呈现为连接点。
文本值输入(string
、、number
integer
)boolean
是可以在运行时传递给组件的参数。 可以在 default
字段中添加文字输入的默认值。 对于 number
和 integer
类型,也可以通过使用 min
和 max
字段来添加最小值和最大值。 如果输入值小于最小值或大于最大值,则管道在验证时失败。 提交管道作业之前会进行验证,从而节省时间。 验证适用于 CLI、Python SDK 和设计器 UI。 以下屏幕截图显示了设计器 UI 中的验证示例。 同样,可以在字段中定义允许的值 enum
。
如果要向组件添加输入,需要在三个位置进行编辑:
inputs
组件 YAML 中的字段。command
组件 YAML 中的字段。- 在组件源代码中,用于处理命令行输入。
这些位置在前面的屏幕截图中标有绿色框。
若要了解有关输入和输出的详细信息,请参阅 管理组件和管道的输入和输出。
环境
环境是组件在其中运行的环境。 它可以是 Azure 机器学习环境(特选或自定义注册)、Docker 映像或 conda 环境。 请参阅以下示例:
- 已注册的 Azure 机器学习环境资产。 组件中使用
azureml:<environment-name>:<environment-version>
语法引用环境。 - 公共 docker 映像。
- Conda 文件。 conda 文件需要与基础映像一起使用。
注册组件以重复使用和共享
尽管某些组件特定于特定管道,但组件的真正好处来自重用和共享。 可以在机器学习工作区中注册组件,使其可供重复使用。 已注册的组件支持自动版本控制,以便可以更新组件,但确保需要较旧版本的管道将继续工作。
在 azureml-examples 存储库中,转到 cli/jobs/pipelines-with-components/basics/1b_e2e_registered_components
目录。
若要注册组件,请使用 az ml component create
命令:
az ml component create --file train.yml
az ml component create --file score.yml
az ml component create --file eval.yml
运行这些命令以完成之后,可以在 Studio 中查看“ 资产>组件”下的组件:
选择组件。 你会看到每个版本的组件的详细信息。
“ 详细信息 ”选项卡显示基本信息,如组件名称、创建者和版本。 标签和描述有可编辑字段。 可以使用标记添加搜索关键字。 说明字段支持 Markdown 格式。 应使用它来描述组件的功能和基本用途。
在“ 作业 ”选项卡上,可以看到使用该组件的所有作业的历史记录。
在管道作业 YAML 文件中使用已注册的组件
现在,你将使用 1b_e2e_registered_components
作为如何在管道 YAML 中应用已注册组件的示例。 转到 1b_e2e_registered_components
目录并打开 pipeline.yml
该文件。 inputs
和 outputs
字段中的键和值类似于之前讨论过的键和值。 唯一的显著区别是 component
项中 jobs.<job_name>.component
字段的值。 该值 component
采用格式 azureml:<component_name>:<component_version>
。 例如,定义 train-job
指定应使用最新版本的已注册组件 my_train
:
type: command
component: azureml:my_train@latest
inputs:
training_data:
type: uri_folder
path: ./data
max_epocs: ${{parent.inputs.pipeline_job_training_max_epocs}}
learning_rate: ${{parent.inputs.pipeline_job_training_learning_rate}}
learning_rate_schedule: ${{parent.inputs.pipeline_job_learning_rate_schedule}}
outputs:
model_output: ${{parent.outputs.pipeline_job_trained_model}}
services:
my_vscode:
管理组件
可以使用 CLI v2 检查组件详细信息和管理组件。 使用 az ml component -h
获取有关组件命令的详细说明。 下表列出了所有可用的命令。 请参阅 Azure CLI 参考了解更多示例。
指令 | 说明 |
---|---|
az ml component create |
创建组件。 |
az ml component list |
列出工作区中的组件。 |
az ml component show |
显示组件的详细信息。 |
az ml component update |
更新组件。 只有几个字段(说明,display_name)支持更新。 |
az ml component archive |
存档组件容器。 |
az ml component restore |
还原已存档的组件。 |
后续步骤
- 试用 CLI v2 组件示例