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

计划机器学习管道作业

适用范围:Azure CLI ml 扩展 v2(当前版本)Python SDK azure-ai-ml v2(当前版本)

本文介绍如何以编程方式将管道计划为在 Azure 上运行,并使用计划 UI 执行相同的操作。 可以基于运行时间创建计划。 基于时间的计划可用于处理例程任务,例如定期重新训练模型或执行批量预测,使其保持最新状态。 了解如何创建计划后,你将了解如何通过 CLI、SDK 和工作室 UI 检索、更新和停用它们。

提示

如果需要使用外部业务流程协调程序(如 Azure 数据工厂或 Microsoft Fabric)安排作业,请考虑在批处理终结点下部署管道作业。 详细了解如何在批处理终结点下部署作业以及如何从 Microsoft Fabric 消耗批处理终结点

先决条件

  • 必须拥有 Azure 订阅,才能使用 Azure 机器学习。 如果没有 Azure 订阅,请在开始操作前先创建一个免费帐户。 立即试用免费版或付费版 Azure 机器学习

计划管道作业

若要重复运行管道作业,需创建计划。 Schedule 可关联作业和触发器。 触发器可以是 cron,其使用 cron 表达式来描述运行之间的等待,也可以是 recurrence,其指定触发作业的频率。 在每种情况下,都需要先定义管道作业,可以是现有的管道作业,也可以是内联定义的管道作业,请参阅在 CLI 中创建管道作业在 SDK 中创建管道作业

可以在本地计划管道作业 yaml,也可以在工作区计划现有管道作业。

创建计划

使用定期模式创建基于时间的计划

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

$schema: https://azuremlschemas.azureedge.net/latest/schedule.schema.json
name: simple_recurrence_job_schedule
display_name: Simple recurrence job schedule
description: a simple hourly recurrence job schedule

trigger:
  type: recurrence
  frequency: day #can be minute, hour, day, week, month
  interval: 1 #every day
  schedule:
    hours: [4,5,10,11,12]
    minutes: [0,30]
  start_time: "2022-07-10T10:00:00" # optional - default will be schedule creation time
  time_zone: "Pacific Standard Time" # optional - default will be UTC

create_job: ./simple-pipeline-job.yml
# create_job: azureml:simple-pipeline-job

trigger 包含以下属性:

  • (必需)type 指定计划类型为 recurrence。 也可以是 cron,请在下一部分中查看详细信息。

列表继续如下。

注意

需要指定的以下属性适用于 CLI 和 SDK。

  • (必需)frequency 指定描述计划触发频率的时间单位。 可以是 minutehourdayweekmonth

  • (必需)interval 指定计划触发频率的值,即计划再次触发之前需等待的时间单位数。

  • (可选)schedule 定义定期模式,包含 hoursminutesweekdays

    • frequencyday 时,模式可以指定 hoursminutes
    • frequencyweekmonth 时,模式可以指定 hoursminutesweekdays
    • hours 应为 0 到 23 的整数或列表。
    • minutes 应为 0 到 59 的整数或列表。
    • weekdays 可以是 mondaysunday 的字符串或列表。
    • 如果省略 schedule,则将根据 start_timefrequencyinterval 的逻辑触发作业。
  • (可选)start_time 使用时区描述开始日期和时间。 如果省略 start_time,则 start_time 将等于作业创建时间。 如果开始时间是过去的时间,则第一个作业将在下一个计算的运行时间运行。

  • (可选)end_time 使用时区描述结束日期和时间。 如果省略 end_time,则在手动禁用计划之前,计划将继续触发作业。

  • (可选)time_zone 指定定期的时区。 如果省略,则默认为 UTC。 若要了解有关时区值的详细信息,请参阅时区值附录

使用 cron 表达式创建基于时间的计划

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

$schema: https://azuremlschemas.azureedge.net/latest/schedule.schema.json
name: simple_cron_job_schedule
display_name: Simple cron job schedule
description: a simple hourly cron job schedule

trigger:
  type: cron
  expression: "0 * * * *"
  start_time: "2022-07-10T10:00:00" # optional - default will be schedule creation time
  time_zone: "Pacific Standard Time" # optional - default will be UTC

# create_job: azureml:simple-pipeline-job
create_job: ./simple-pipeline-job.yml

trigger 部分定义计划详细信息,其包含以下属性:

  • (必需)type 指定计划类型为 cron

列表继续如下。

  • (必需)expression 使用标准 crontab 表达式来表示一个定期计划。 单个表达式由 5 个空格分隔的字段组成:

    MINUTES HOURS DAYS MONTHS DAYS-OF-WEEK

    • 单个通配符 (*) 涵盖字段的所有值。 因此,天中的 * 表示一个月的所有天(因月份和年份而异)。

    • 上例中的 expression: "15 16 * * 1" 表示每周一下午 16:15。

    • 下表列出了各字段的有效值:

      字段 范围 注释
      MINUTES 0-59 -
      HOURS 0-23 -
      DAYS - 不支持。 将忽略该值并将其视为 *
      MONTHS - 不支持。 将忽略该值并将其视为 *
      DAYS-OF-WEEK 0-6 零 (0) 表示星期日。 也接受天的名称。
    • 若要详细了解如何使用 crontab 表达式,请参阅 GitHub 上的 Crontab 表达式 wiki

    重要

    不支持 DAYSMONTH。 如果传递一个值,该值将被忽略并被视为 *

  • (可选)start_time 使用计划的时区指定开始日期和时间。 start_time: "2022-05-10T10:15:00-04:00" 表示计划于 UTC-4 时区 2022-05-10 上午 10:15:00 开始。 如果省略 start_time,则 start_time 将等于计划创建时间。 如果开始时间是过去的时间,则第一个作业将在下一个计算的运行时间运行。

  • (可选)end_time 使用时区描述结束日期和时间。 如果省略 end_time,则在手动禁用计划之前,计划将继续触发作业。

  • (可选)time_zone 指定表达式的时区。 如果省略,则默认为 UTC。 请参阅时区值附录

的限制:

  • 目前,Azure 机器学习 v2 计划不支持基于事件的触发器。
  • 可以使用 Azure 机器学习 SDK/CLI v2 指定包含多个触发时间戳的复杂重复模式,而 UI 仅显示复杂模式且不支持编辑。
  • 如果将重复周期设置为每月的 31 日,在少于 31 天的月份,计划不会触发作业。

定义计划时更改运行时设置

使用现有作业定义计划时,可以更改作业的运行时设置。 使用此方法可以在同一作业中使用不同输入定义多个计划。

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

$schema: https://azuremlschemas.azureedge.net/latest/schedule.schema.json
name: cron_with_settings_job_schedule
display_name: Simple cron job schedule
description: a simple hourly cron job schedule

trigger:
  type: cron
  expression: "0 * * * *"
  start_time: "2022-07-10T10:00:00" # optional - default will be schedule creation time
  time_zone: "Pacific Standard Time" # optional - default will be UTC

create_job: 
  type: pipeline
  job: ./simple-pipeline-job.yml
  # job: azureml:simple-pipeline-job
  # runtime settings
  settings:
    #default_compute: azureml:cpu-cluster
    continue_on_step_failure: true
  inputs:
    hello_string_top_level_input: ${{name}} 
  tags: 
    schedule: cron_with_settings_schedule

定义计划时,可以更改以下属性:

属性 说明
设置 运行管道作业时要使用的设置字典。
inputs 运行管道作业时要使用的输入字典。
outputs 运行管道作业时要使用的输入字典。
experiment_name 触发的作业的试验名称。

注意

工作室 UI 用户只能在创建计划时修改输入、输出和运行时设置。 只能使用 CLI 或 SDK 更改 experiment_name

计划中支持的表达式

定义计划时,支持以下表达式,在作业运行时这些表达式将解析为实际值。

表达式 说明 支持的属性
${{creation_context.trigger_time}} 触发计划的时间。 管道作业的字符串类型输入
${{name}} 作业的名称。 管道作业的 outputs.path

管理计划

创建日程安排

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

创建计划 yaml 后,可以通过 CLI 使用以下命令创建计划。

# This action will create related resources for a schedule. It will take dozens of seconds to complete.
az ml schedule create --file cron-schedule.yml --no-wait

列出工作区中的计划

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

az ml schedule list

检查计划详细信息

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

az ml schedule show -n simple_cron_job_schedule

更新计划

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

az ml schedule update -n simple_cron_job_schedule  --set description="new description" --no-wait

注意

如果你不只是想要更新标记/说明,建议使用 az ml schedule create --file update_schedule.yml

禁用计划

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

az ml schedule disable -n simple_cron_job_schedule --no-wait

启用计划

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

az ml schedule enable -n simple_cron_job_schedule --no-wait

从计划查询触发的作业

计划触发的所有作业的显示名称都将显示为 <计划名称>-YYYYMMDDThhmmssZ。 例如,如果创建了一个名为 named-schedule 的计划,计划开始运行时间为 2021 年 1 月 1 日凌晨 6 点,并每隔 12 小时运行一次,则创建的作业的显示名称如下所示:

  • named-schedule-20210101T060000Z
  • named-schedule-20210101T180000Z
  • named-schedule-20210102T060000Z
  • named-schedule-20210102T180000Z,以此类推

Screenshot of the jobs tab in the Azure Machine Learning studio filtering by job display name.

此外,还可以应用 Azure CLI JMESPath 查询按计划名称查询触发的作业。

# query triggered jobs from schedule, please replace the simple_cron_job_schedule to your schedule name
az ml job list --query "[?contains(display_name,'simple_cron_schedule')]"

注意

有关查找计划触发的所有作业的更简单方法,请使用工作室 UI 查看计划详细信息页上的作业历史记录。


删除计划

重要

必须禁用计划才能将其删除。 删除是不可恢复的操作。 删除某个计划后,永远无法访问或恢复它。

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

az ml schedule delete -n simple_cron_job_schedule

RBAC(基于角色的访问控制)支持

由于计划通常用于生产,为了减少误操作的影响,工作区管理员可能希望限制对在工作区中创建和管理计划的访问。

目前有三个操作规则与计划相关,你可以在 Azure 门户中配置这些规则。 可以详细了解如何管理对 Azure 机器学习工作区的访问权限

操作 说明 规则
读取 获取和列出机器学习工作区中的计划 Microsoft.MachineLearningServices/workspaces/schedules/read
写入 在机器学习工作区中创建、更新、禁用和启用计划 Microsoft.MachineLearningServices/workspaces/schedules/write
删除 在机器学习工作区中删除计划 Microsoft.MachineLearningServices/workspaces/schedules/delete

常见问题

  • 为何 UI 中未列出 SDK 创建的计划?

    计划 UI 适用于 v2 计划。 因此,无法通过 UI 列出或访问 v1 计划。

    但是,v2 计划也支持 v1 管道作业。 你无需先发布管道,而可以直接为管道作业设置计划。

  • 为何我的计划未在我先前设置的时间触发作业?

    • 默认情况下,计划将使用 UTC 时区来计算触发时间。 你可以在创建向导中指定时区,也可以在计划详细信息页中更新时区。
    • 如果将重复周期设置为每月的 31 日,在少于 31 天的月份,计划不会触发作业。
    • 如果使用 cron 表达式,则不支持 MONTH。 如果传递一个值,该值将被忽略并被视为 *。 这是一个已知限制。
  • 是否支持基于事件的计划?

    • 否,V2 计划不支持基于事件的计划。

后续步骤