安排管道运行 - Amazon SageMaker

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

安排管道运行

您可以使用亚马逊安排亚马逊 SageMaker 管道的执行 EventBridge。亚马逊支持将亚马逊 SageMaker 管道作为目标 EventBridge。这样,您就可以根据事件总线中的任何事件启动建模管线的执行。借 EventBridge助,您可以自动执行管道并自动响应诸如训练作业或端点状态更改之类的事件。事件包括上传到您的 Amazon S3 存储桶的新文件、由于偏移而导致的亚马逊 SageMaker 终端节点状态变化以及亚马逊简单通知服务 (SNS) 主题。

可以自动启动以下管道操作: 

  • StartPipelineExecution

有关安排 SageMaker 任务的更多信息,请参阅 SageMaker 使用 Amazon EventBridge 实现自动化

向 Amazon 安排管道 EventBridge

要使用 Amazon Event CloudWatch s 开始管道执行,您必须创建 EventBridge规则。在为事件创建规则时,您可以指定在 EventBridge 收到与该规则匹配的事件时要采取的目标操作。当事件与规则匹配时, EventBridge 会将该事件发送到指定的目标并启动规则中定义的操作。

以下教程展示了如何 EventBridge 使用 EventBridge控制台或来安排管道执行 AWS CLI。 

先决条件

  • EventBridge 可以凭SageMaker::StartPipelineExecution权限代入的角色。如果您从 EventBridge控制台创建规则,则可以自动创建此角色;否则,您需要自己创建此角色。 有关创建 SageMaker 角色的信息,请参阅SageMaker 角色

  • 有待安排的亚马逊 SageMaker 管道。要创建 Amazon SageMaker 管道,请参阅定义管道

使用 EventBridge控制台创建 EventBridge 规则

以下过程说明如何使用 EventBridge 控制台创建 EventBridge 规则。 

  1. 导航到EventBridge 控制台

  2. 选择左侧的规则

  3. 选择 Create Rule

  4. 为您的规则输入名称和描述。

  5. 选择启动此规则的方式。您可以为规则提供以下选择:

    • 事件模式:当发生与模式匹配的事件时,您的规则会启动。您可以选择与特定类型事件相匹配的预定义模式,也可以创建自定义模式。如果选择预定义模式,则可以编辑该模式以对其进行自定义。有关事件模式的更多信息,请参阅事件中的 CloudWatch 事件模式

    • 计划:您的规则将按指定的计划定期启动。您可以使用固定速率的计划,该计划会定期启动并持续指定的分钟数、小时数或周数。您还可以使用 cron 表达式来创建更精细的计划,例如“每月第一个星期一上午 8 点”。自定义或合作伙伴事件总线不支持计划。

  6. 选择所需的事件总线。

  7. 选择当某个事件与您的事件模式匹配或当计划启动时要调用的目标。最多可为每项规则添加 5 个目标。在目标下拉列表中选择 SageMaker Pipeline

  8. 从管道下拉列表中选择要启动的管道。

  9. 使用名称和值对添加要传递给管道执行的参数。参数值可以是静态的,也可以是动态的。有关 Amazon Pi SageMaker peline 参数的更多信息,请参阅AWS:: Events:: Rule SagemakerPipelineParameters

    • 每次启动管道时,都会将静态值传递给管道执行。例如,如果{"Name": "Instance_type", "Value": "ml.4xlarge"}在参数列表中指定,则StartPipelineExecutionRequest每次 EventBridge 启动管道时都会将其作为参数传递。

    • 动态值是使用JSON路径指定的。 EventBridge 解析事件负载中的值,然后将其传递给管道执行。例如:$.detail.param.value

  10. 选择要用于此规则的角色。您可以使用现有角色,也可以创建新的角色。

  11. (可选)添加标签。

  12. 选择 Create 以最终确定您的规则。

您的规则现已生效,可以启动管道执行了。

使用创建 EventBridge 规则 AWS CLI

以下过程说明如何使用创建 EventBridge 规则 AWS CLI。

  1. 创建要启动的规则。使用创建 EventBridge 规则时 AWS CLI,您可以选择两个启动规则的方式,即事件模式和时间表。

    • 事件模式:当发生与模式匹配的事件时,您的规则会启动。您可以选择与特定类型事件相匹配的预定义模式,也可以创建自定义模式。如果选择预定义模式,则可以编辑该模式以对其进行自定义。  您可以使用以下命令创建具有事件模式的规则:

      aws events put-rule --name <RULE_NAME> ----event-pattern <YOUR_EVENT_PATTERN> --description <RULE_DESCRIPTION> --role-arn <ROLE_TO_EXECUTE_PIPELINE> --tags <TAGS>
    • 计划:您的规则将按指定的计划定期启动。您可以使用固定速率的计划,该计划会定期启动并持续指定的分钟数、小时数或周数。您还可以使用 cron 表达式来创建更精细的计划,例如“每月第一个星期一上午 8 点”。自定义或合作伙伴事件总线不支持计划。您可以使用以下命令创建具有计划的规则:

      aws events put-rule --name <RULE_NAME> --schedule-expression <YOUR_CRON_EXPRESSION> --description <RULE_DESCRIPTION> --role-arn <ROLE_TO_EXECUTE_PIPELINE> --tags <TAGS>
  2. 添加目标,以便在某个事件与您的事件模式匹配或当计划启动时调用。最多可为每项规则添加 5 个目标。  对于每个目标,您必须指定: 

    • ARN:您的管ARN道资源。

    • 角色ARN:该ARN角色 EventBridge 应假定为执行管道。

    • 参数:要传递的 Amazon SageMaker 管道参数。

  3. 运行以下命令,使用 p ut-t argets SageMaker 将 Amazon 管道作为目标传递给您的规则:

    aws events put-targets --rule <RULE_NAME> --event-bus-name <EVENT_BUS_NAME> --targets "[{\"Id\": <ID>, \"Arn\": <RESOURCE_ARN>, \"RoleArn\": <ROLE_ARN>, \"SageMakerPipelineParameter\": { \"SageMakerParameterList\": [{\"Name\": <NAME>, \"Value\": <VALUE>}]} }]"] 

使用 SageMaker Python 安排管道 SDK

以下各节介绍如何使用 SageMaker Python 设置访问 EventBridge 资源的权限和创建管道计划SDK。

所需的权限

您需要拥有必要的权限才能使用管道调度器。完成以下步骤来设置您的权限:

  1. 将以下最低权限策略附加到用于创建管道触发器或使用 AWS 托管策略的IAM角色AmazonEventBridgeSchedulerFullAccess

    { "Version": "2012-10-17", "Statement": [ { "Action": [ "scheduler:ListSchedules", "scheduler:GetSchedule", "scheduler:CreateSchedule", "scheduler:UpdateSchedule", "scheduler:DeleteSchedule" ], "Effect": "Allow", "Resource": [ "*" ] }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::*:role/*", "Condition": { "StringLike": { "iam:PassedToService": "scheduler.amazonaws.com" } } } ] }
  2. EventBridge 通过将服务主体scheduler.amazonaws.com添加到该角色的信任策略中,与建立信任关系。如果您在 SageMaker Studio 中启动笔记本,请务必将以下信任策略附加到执行角色。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "scheduler.amazonaws.com", "sagemaker.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }

创建管道计划

使用PipelineSchedule构造函数,您可以安排管道运行一次或按预先确定的间隔运行。管道计划必须是atrate、或cron。这组计划类型是EventBridge 计划选项的扩展。有关如何使用该PipelineSchedule类的更多信息,请参阅 sagemaker.workflow.triggers。 PipelineSchedule。以下示例演示如何使用创建每种调度类型PipelineSchedule

from sagemaker.workflow.triggers import PipelineSchedule # schedules a pipeline run for 12/13/2023 at time 10:15:20 UTC my_datetime_schedule = PipelineSchedule( name="<schedule-name>", at=datetime(2023, 12, 13, 10, 15, 20) ) # schedules a pipeline run every 5 minutes my_rate_schedule = PipelineSchedule( name="<schedule-name>", rate=(5, "minutes") ) # schedules a pipeline run at 10:15am UTC on the last Friday of each month during the years 2022 to 2023 my_cron_schedule = PipelineSchedule( name="<schedule-name>", cron="15 10 ? * 6L 2022-2023" )
注意

如果您创建了一次性计划并且需要访问当前时间,请使用datetime.utcnow()而不是datetime.now()。后者不存储当前区域上下文,并导致传递到的时间不正确 EventBridge。

将触发器连接到您的管道

要将您的PipelineSchedule连接到您的管道,put_triggers请使用触发器列表对您创建的管道对象调用。如果您收到回复ARN,则说明您在账户中成功创建了计划,并 EventBridge 开始按指定的时间或速率调用目标管道。必须指定具有正确权限的角色才能将触发器附加到父管道。如果您不提供默认角色,Pipelines 会从配置文件中获取用于创建管道的默认角色。

以下示例演示如何将计划附加到管道。

scheduled_pipeline = Pipeline( name="<pipeline-name>", steps=[...], sagemaker_session=<sagemaker-session>, ) custom_schedule = PipelineSchedule( name="<schedule-name>", at=datetime(year=2023, month=12, date=25, hour=10, minute=30, second=30) ) scheduled_pipeline.put_triggers(triggers=[custom_schedule], role_arn=<role>)

描述当前的触发器

要检索有关您创建的管道触发器的信息,您可以使用触发器describe_trigger()API名称调用。此命令返回有关已创建的计划表达式的详细信息,例如其开始时间、启用状态和其他有用信息。以下代码段显示了一个调用示例:

scheduled_pipeline.describe_trigger(name="<schedule-name>")

清理触发器资源

在删除管道之前,请清理现有的触发器,以避免账户中出现资源泄漏。在销毁父管道之前,应删除触发器。您可以通过将触发器名称列表传递给来删除触发器delete_triggersAPI。以下代码段演示了如何删除触发器。

pipeline.delete_triggers(trigger_names=["<schedule-name>"])
注意

删除触发器时,请注意以下限制:

  • 通过指定触发器名称来删除触发器的选项仅在 SageMaker Python 中可用SDK。删除CLI或DeletePipelineAPI调用中的管道不会删除您的触发器。结果,触发器变成孤立状态,并 SageMaker 尝试为不存在的管道开始运行。

  • 此外,如果您正在使用其他笔记本会话或已经删除了管道目标,请通过调度程序CLI或 EventBridge 控制台清理孤立的计划。