适用范围:
Azure CLI ml 扩展 v2(最新版)
Python SDK azure-ai-ml v2(最新版)
本文介绍如何调度机器学习管道,以便在 Azure 上运行。 你可以计划例行任务,例如重新训练模型或根据已用时间定期更新批量预测。
本文介绍如何使用 Azure 机器学习 CLI、Azure 机器学习 SDK v2 for Python 或 Azure 机器学习工作室 UI 创建、列出、查看、更新、禁用、启用和删除计划。
提示
若要使用外部业务流程协调器(例如 Azure 数据工厂或 Microsoft Fabric)来计划作业,请考虑在批处理终结点下部署管道作业。
先决条件
- 一个 Azure 订阅。 如果您还没有试用,请在开始之前先创建一个试用。
- 一个 Azure 机器学习工作区。 若要创建工作区,请参阅创建工作区资源。
- 了解 Azure 机器学习管道。 有关信息,请参阅什么是机器学习管道。
- Azure CLI
- Python SDK
- Studio UI
- 按照安装、设置并使用 CLI (v2)中的说明安装 Azure CLI 和
ml扩展。 - 了解如何创建 Azure 机器学习 YAML 管道。 有关信息,请参阅在 Azure 机器学习 CLI 中使用组件创建并运行机器学习管道。
限制
- Azure 机器学习 v2 计划不支持基于事件的触发器。
- CLI 和 SDK v2 计划支持指定包含多个触发时间戳的复杂重复周期模式。 工作室 UI 会显示复杂模式,但不支持对其进行编辑。
- 工作室 UI 仅支持 v2 计划,无法列出或访问基于已发布管道或管道终结点的 v1 计划。 可为未发布的管道创建计划。
- 如果将重复周期设置为每月的第 31 天或第 30 天,则计划不会在数月内触发少于天数的作业。
- cron 计划表达式不支持
DAYS和MONTHS值。 为这些参数传递的值将被忽略并视为*。 - 即便在将托管标识分配给计划以后,作者仍需保留其任务运行权限,以确保计划能够正常运作。
创建日程
如果管道作业具有令人满意的性能和输出,则可以设置计划以定期自动触发作业。 为此,必须创建一个用于将作业与触发器相关联的计划。 触发器可以是 recurrence 模式,也可以是指定作业运行间隔和频率的 cron 表达式。
在这两种情况下,首先都需要定义一个管道作业,可采用内联方式,或通过指定现有管道作业来定义。 可以在 YAML 中定义管道并从 CLI 运行它们、在 Python 中内联创作管道,或者在 Azure 机器学习工作室中编写管道。 可以在本地创建管道作业,也可以基于工作区中的现有作业创建管道作业。
可以使用工作室 UI、SDK v2 或 CLI v2 为 v2 或 v1 管道作业创建 v2 计划。 无需首先发布现有管道即可为管道作业设置计划。
- Azure CLI
- Python SDK
- Studio UI
本文中的代码示例摘自在 Azure 机器学习 CLI 2.0 中使用计划。
定义使用重复周期模式的基于时间的计划
- Azure CLI
- Python SDK
- Studio UI
以下 YAML 代码为管道作业定义重复计划。 必需的 type 参数指定 trigger 类型为 recurrence。
$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
提供以下计划参数。 标记必需的参数;其余部分是可选的。
参数
-
frequency(必需)是计划触发所依据的时间单位。 可以是minute、hour、day、week或month。 -
interval(必需)是计划重复周期之间的时间单位数。 -
schedule(可选)定义重复周期模式,可以包含hours、minutes和weekdays。 如果省略,则作业将根据start_time、frequency和interval的逻辑触发。- 当
frequency为day时,模式可以指定hours和minutes。 - 当
frequency为week或month时,模式可以指定hours、minutes和weekdays。-
hours是 0 到 23 的整数或列表。 -
minutes是 0 到 59 的整数或列表。 -
weekdays是monday到sunday的字符串或列表。
-
- 当
-
start_time(可选)是带时区的开始日期和时间。 如果省略,则默认值等于计划创建时间。 如果开始时间是过去的时间,则第一个作业将在下一个计算的运行时间运行。 -
end_time(可选)是带时区的结束日期和时间。 如果省略此参数,计划将保持活动状态,直到手动禁用它。 -
time_zone(可选)指定重复计划的时区。 如果省略,则默认值为协调世界时 (UTC)。 有关时区值的详细信息,请参阅时区值附录。
- Azure CLI
- Python SDK
- Studio UI
创建计划 YAML 后,通过 CLI 使用以下命令创建计划:
# This action creates related resources for a schedule and can take up to a minute to complete.
az ml schedule create --file recurrence-job-schedule.yml --no-wait
若要确认计划已创建且处于活动状态,请按 列表计划 所示列出计划,或在 “查看计划详细信息”中将其打开。 新计划显示为 is_enabled: true。
使用 cron 表达式定义基于时间的计划
cron 表达式为计划指定灵活和自定义的重复模式。 标准的 crontab 表达式由空格分隔的字段 MINUTES HOURS DAYS MONTHS DAYS-OF-WEEK 组成。 通配符 * 表示字段的所有值。
在 Azure 机器学习 计划的 cron 表达式中:
-
MINUTES是 0 到 59 的整数或列表。 -
HOURS是 0 到 23 的整数或列表。 - 不支持
DAYS值,始终会将其视为*。DAYS中的*值表示一个月中的所有日,该值根据月份和年份而异。 - 不支持
MONTHS值,始终会将其视为*。 -
DAYS-OF-WEEK是从 0 到 6 的整数或列表,其中 0 = 星期日。 也接受星期几的名称。
例如,表达式 15 16 * * 1 表示每星期一下午 4:15 UTC。 有关 crontab 表达式的详细信息,请参阅 GitHub 上的 Crontab 表达式 wiki。
- Azure CLI
- Python SDK
- Studio UI
以下 YAML 代码为管道作业定义周期性计划。 必需的 type 参数指定 trigger 类型为 cron。
$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
提供以下计划参数。 标记必需的参数;其余部分是可选的。
参数
-
expression(必需) 是定义定期计划的标准 crontab 表达式。 -
start_time(可选)是带时区的计划开始日期和时间。 例如,start_time: "2022-05-10T10:15:00-04:00"表示计划从 2022 年 5 月 10 日上午 10:15:00 开始,采用 UTC-4 时区。 如果省略此参数,则默认值为计划创建时间。 如果开始时间是过去的时间,则第一个作业将在下一个计算的运行时间运行。 -
end_time(可选)是带时区的结束日期和时间。 如果省略此参数,计划将保持活动状态,直到手动禁用它。 -
time_zone(可选)指定重复计划的时区。 如果省略此参数,则默认值为 UTC。
- Azure CLI
- Python SDK
- Studio UI
创建计划 YAML 后,通过 CLI 使用以下命令创建计划:
# This action creates related resources for a schedule and can take up to a minute to complete.
az ml schedule create --file cron-job-schedule.yml --no-wait
若要确认计划已创建且处于活动状态,请按 列表计划 所示列出计划,或在 “查看计划详细信息”中将其打开。 新计划显示为 is_enabled: true。
定义计划时更改作业设置
有时,你希望由调度器触发的作业采用与测试作业不同的配置。 使用现有作业定义计划时,可以更改作业设置。 此方法允许定义使用相同作业但输入不同的多个计划。
- Azure CLI
- Python SDK
- Studio UI
定义计划时,可以更改运行管道作业时要使用的 settings、inputs 或 outputs。 还可以更改已触发作业的experiment_name。
以下计划定义将更改现有作业的设置。
$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
在计划任务中使用支持的表达式
定义计划时,使用以下宏表达式定义在作业运行时解析为实际值的动态参数值。
| 表达式 | 说明 | 支持的属性 |
|---|---|---|
${{name}} |
作业名称 | 管道作业的 outputs 路径 |
${{creation_context.trigger_time}} |
作业触发时间 | 管道作业的字符串类型 inputs |
管理日程
可以在工作区中列出、更新、禁用、启用、删除计划和查看其详细信息。
列出日程
- Azure CLI
- Python SDK
- Studio UI
az ml schedule list
查看日程详细信息
- Azure CLI
- Python SDK
- Studio UI
az ml schedule show -n simple_cron_job_schedule
更新日程
- Azure CLI
- Python SDK
- Studio UI
az ml schedule update -n simple_cron_schedule --set description="new description" --no-wait
注意
若要更新多个属性而不是标记和说明,请考虑使用 az ml schedule create --file update_schedule.yml。
禁用计划
- Azure CLI
- Python SDK
- Studio UI
az ml schedule disable -n simple_cron_job_schedule --no-wait
启用计划任务
- Azure CLI
- Python SDK
- Studio UI
az ml schedule enable -n simple_cron_job_schedule --no-wait
删除计划
重要
必须先禁用计划才能将其删除。 删除是永久性操作,而不可恢复。
- Azure CLI
- Python SDK
- Studio UI
az ml schedule enable -n simple_cron_schedule --no-wait
查询由计划触发的作业
由特定计划触发的作业都使用显示名称 <schedule_name>-YYYYMMDDThhmmssZ。 例如,如果名为 named-schedule 的计划从 2021 年 1 月 1 日上午 6 点开始每隔 12 小时运行一次,则创建的作业的显示名称如下:
- named-schedule-20210101T060000Z
- named-schedule-20210101T180000Z
- named-schedule-20210102T060000Z
- named-schedule-20210102T180000Z
显示名称会在每个预定时间间隔继续显示。
此外,还可以应用 Azure CLI JMESPath 查询按计划名称查询触发的作业。
# query triggered jobs from schedule, please replace the simple_cron_schedule to your schedule name
az ml job list --query "[?contains(display_name,'simple_cron_schedule')]"
提示
工作室中计划详细信息页上的“ 作业历史记录 ”选项卡提供了一种简单的方法来查找计划触发的所有作业。
基于角色的访问控制 (RBAC) 支持
由于计划将用于生产,因此减少误操作的可能性和影响非常重要。 工作区管理员可以限制谁可以在工作区中创建和管理计划。
管理员可以在 Azure 门户中配置与计划相关的以下操作规则。 有关详细信息,请参阅管理对 Azure 机器学习工作区的访问。
| 操作 | 说明 | 规则 |
|---|---|---|
| 读取 | 获取和列出计划 | Microsoft.MachineLearningServices/workspaces/schedules/read |
| 写 | 创建、更新、禁用和启用计划 | Microsoft.MachineLearningServices/workspaces/schedules/write |
| 删除 | 删除计划 | Microsoft.MachineLearningServices/workspaces/schedules/delete |
成本考量
Azure 会根据计划数量向你收费。 每个计划都会创建一个由 Azure 机器学习 代表你(HOBO)托管的逻辑应用。 因此,无法在 Azure 门户中将逻辑应用视为订阅下的资源。
逻辑应用的费用将记入你的 Azure 订阅。 HOBO 资源成本使用原始资源提供程序发出的相同计量。 费用显示在主机资源(即 Azure 机器学习工作区)下。
对计划进行故障排除
使用下表诊断计划管道作业的常见问题。
| 症状 | 原因 | 解决方案 |
|---|---|---|
| 计划不会触发作业。 | 计划处于禁用状态,或者 start_time 其将来处于禁用状态。 |
确认计划已启用,并检查 start_time。 使用 查看计划详情 以查看触发器。 |
| 触发的作业此前成功,但随后失败了。 | 即使分配了托管标识,计划作者也失去了提交作业所需的权限。 | 恢复作者的任务提交权限。 请参阅 基于角色的访问控制(RBAC)支持。 |
| 任何作业都不会在某些月份的 30 日或 31 日运行。 | 并非每个月都有这些天。 | 使用一个 cron 表达式,或选择每个月都存在的一天。 |
DAYS 或 MONTHS cron 表达式中的值将被忽略。 |
这些字段不受支持,并且始终被视为 *。 |
使用支持的字段来表达模式,或使用重复触发器。 |