适用于: Azure CLI ml 扩展 v2(当前版本)

本文介绍如何使用 Azure CLI 和组件创建和运行 机器学习管道 (有关详细信息,请参阅 什么是 Azure 机器学习组件? )。 可以在不使用组件的情况下创建管道,但组件可提供最大的灵活性和可重用性。 可以使用 YAML 定义 Azure 机器学习管道并从 CLI 运行,也可以使用 Python 创作 Azure 机器学习管道,或在 Azure 机器学习工作室设计器中通过拖放 UI 操作来编写 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 机器学习管道
  • 什么是 Azure 机器学习组件
  • 使用组件创建第一个管道

    在示例中使用组件创建第一个管道。 本部分旨在通过具体示例让你初步了解 Azure 机器学习中的管道和组件。

    azureml-examples 存储库cli/jobs/pipelines-with-components/basics 目录导航到 3b_pipeline_with_data 子目录。 在此目录下有三种类型的文件。 这些文件是生成你自己的管道时需要创建的文件。

  • pipeline.yml:此 YAML 文件定义机器学习管道。 此 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 字典,这些信息包括:

    若要使用无服务器计算(预览版),请将此文件中的 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 架构。

    description inputs 管道作业的输入字典。 键是作业上下文中的输入名称,值是输入值。 这些管道输入可以被管道中单个步骤作业的输入所引用(使用 ${{ parent.inputs.<input_name> }} 表达式)。 outputs 管道作业的输出配置字典。 键是作业上下文中的输出名称,值是输出配置。 这些管道输出可以被管道中单个步骤作业的输出所引用(使用 ${{ parents.outputs.<output_name> }} 表达式)。

    在 3b_pipeline_with_data 示例中,我们创建了三步骤管道。

  • 这三个步骤在 jobs 下定义。 三个步骤类型都是命令作业。 每个步骤的定义都位于相应的 component.yml 文件中。 可在 3b_pipeline_with_data 目录下查看组件 YAML 文件。 下一部分将介绍 componentA.yml。
  • 此管道具有数据依赖项,这在大多数实际管道中很常见。 Component_a 从 ./data 下的本地文件夹(第 17-20 行)获取数据输入,并将其输出传递给 componentB(第 29 行)。 Component_a 的输出可以引用为 ${{parent.jobs.component_a.outputs.component_a_output}}
  • compute 定义此管道的默认计算。 如果 jobs 下的某个组件定义了此组件的不同计算,系统将遵循特定于组件的设置。
  • 在管道中读取和写入数据

    一种常见场景是在管道中读取和写入数据。 在 Azure 机器学习中,我们针对所有类型的作业(管道作业、命令作业和扫描作业)使用同一架构来读取和写入数据。 以下是在常见场景中使用数据的管道作业示例。

  • 具有公共 URL 的 Web 文件
  • Azure 机器学习数据存储和路径
  • 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 架构。

    description

    对于 3b_pipeline_with_data/componentA.yml 中的示例,componentA 有一个数据输入和一个数据输出,可以连接到父管道中的其他步骤。 提交管道作业时,组件 YAML 中 code 部分下的所有文件都将上传到 Azure 机器学习。 在此示例中,将上传 ./componentA_src 下的文件(componentA.yml 中的第 16 行)。 可在工作室 UI 中查看上传的源代码:双击 ComponentA 步骤并导航到“快照”选项卡,如以下屏幕截图所示。 可看到它是一个仅执行一些简单打印的 hello-world 脚本,并可将当前日期/时间写入 componentA_output 路径。 组件通过命令行参数获取输入和输出,并在 hello.py 中使用 argparse 进行处理。

    输入和输出

    输入和输出定义组件的接口。 输入和输出可以是文本值(stringnumberintegerboolean 类型)或包含输入架构的对象。

    对象输入(uri_fileuri_foldermltablemlflow_modelcustom_model 类型)可以连接到父管道作业中的其他步骤,从而将数据/模型传递给其他步骤。 在管道图形中,对象类型输入将呈现为连接点。

    文本值输入(stringnumberintegerboolean)是可以在运行时传递给组件的参数。 可在 default 字段下添加文本输入的默认值。 对于 numberinteger 类型,还可使用 minmax 字段添加接受值的最小值和最大值。 如果输入值超过最小值和最大值,管道在验证时将失败。 提交管道作业之前进行验证以节省时间。 验证适用于 CLI、Python SDK 和设计器 UI。 以下屏幕截图显示了设计器 UI 中的验证示例。 同样,可在 enum 字段中定义允许的值。

    如果要向组件添加输入,务必编辑三个位置:1) 组件 YAML 中的 inputs 字段 2) 组件 YAML 中的 command 字段。 3) 处理命令行输入的组件源代码。 在上面的屏幕截图中用绿色框进行了标记。

    环境定义要执行组件的环境。 可以是 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
    

    运行完这些命令后,可在工作室的“资产”->“组件”下查看组件:

    选择组件。 你将看到每个版本的组件的详细信息。

    在“详细信息”选项卡下,可看到组件的基本信息,例如名称、创建者、版本等。还可看到“标记”和“说明”的可编辑字段。 标记可用于添加快速搜索的关键字。 说明字段支持 Markdown 格式设置,应将其用于描述组件的功能和基本用途。

    在“作业”选项卡下,你将看到使用此组件的所有作业的历史记录。

    在管道作业 YAML 文件中使用已注册的组件

    现在使用 1b_e2e_registered_components 演示如何在管道 YAML 中使用已注册的组件。 导航到 1b_e2e_registered_components 目录,打开 pipeline.yml 文件。 inputsoutputs 字段中的键和值类似于之前讨论过的键和值。 唯一的显著区别是 jobs.<JOB_NAME>.component 项中 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 参考了解更多示例

    description
  •