使用 CloudWatch 和 Lambda 设置调试器以自动终止训练作业 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用 CloudWatch 和 Lambda 设置调试器以自动终止训练作业

调试器规则监控训练作业状态, CloudWatch 事件规则监视调试器规则训练作业评估状态。以下各节概述了使用 using CloudWatch 和 Lambda 自动终止训练任务所需的流程。

第 1 步:创建 Lambda 函数

创建 Lambda 函数
  1. 打开 Amazon Lambda 控制台,网址为https://console.aws.amazon.com/lambda/

  2. 在左侧导航窗格中,选择函数,然后选择创建函数

  3. 创建函数页面上,选择从头开始创作

  4. 基本信息部分,输入函数名称(例如,debugger-rule-stop-training-job)。

  5. 对于运行时系统,选择 Python 3.7

  6. 对于权限,展开下拉选项,然后选择更改默认执行角色

  7. 对于 “执行角色”,选择 “使用现有IAM角色”,然后选择用于训练作业的角色 SageMaker。

    注意

    请确保您使用附加了 AmazonSageMakerFullAccessAWSLambdaBasicExecutionRole 的执行角色。否则,Lambda 函数将无法正确响应训练作业的 Debugger 规则状态变化。如果您不确定正在使用哪个执行角色,请在 Jupyter 笔记本单元中运行以下代码来检索执行角色输出:

    import sagemaker sagemaker.get_execution_role()
  8. 在页面底部,选择创建函数

下图显示了创建函数页面的示例,其中已完成了输入字段和选择。

“创建函数”页面。

步骤 2:配置 Lambda 函数

配置 Lambda 函数
  1. 在配置页面的函数代码部分,将以下 Python 脚本粘贴到 Lambda 代码编辑器窗格中。该lambda_handler函数监视收集的调试器规则评估状态 CloudWatch 并触发StopTrainingJobAPI操作。f SageMaker or 提供了一种 Amazon SDK for Python (Boto3) client用于触发StopTrainingJobAPI操作的高级方法。stop_training_job

    import json import boto3 import logging logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): training_job_name = event.get("detail").get("TrainingJobName") logging.info(f'Evaluating Debugger rules for training job: {training_job_name}') eval_statuses = event.get("detail").get("DebugRuleEvaluationStatuses", None) if eval_statuses is None or len(eval_statuses) == 0: logging.info("Couldn't find any debug rule statuses, skipping...") return { 'statusCode': 200, 'body': json.dumps('Nothing to do') } # should only attempt stopping jobs with InProgress status training_job_status = event.get("detail").get("TrainingJobStatus", None) if training_job_status != 'InProgress': logging.debug(f"Current Training job status({training_job_status}) is not 'InProgress'. Exiting") return { 'statusCode': 200, 'body': json.dumps('Nothing to do') } client = boto3.client('sagemaker') for status in eval_statuses: logging.info(status.get("RuleEvaluationStatus") + ', RuleEvaluationStatus=' + str(status)) if status.get("RuleEvaluationStatus") == "IssuesFound": secondary_status = event.get("detail").get("SecondaryStatus", None) logging.info( f'About to stop training job, since evaluation of rule configuration {status.get("RuleConfigurationName")} resulted in "IssuesFound". ' + f'\ntraining job "{training_job_name}" status is "{training_job_status}", secondary status is "{secondary_status}"' + f'\nAttempting to stop training job "{training_job_name}"' ) try: client.stop_training_job( TrainingJobName=training_job_name ) except Exception as e: logging.error( "Encountered error while trying to " "stop training job {}: {}".format( training_job_name, str(e) ) ) raise e return None

    有关 Lambda 代码编辑器界面的更多信息,请参阅使用 Lambda Amazon 控制台编辑器创建函数

  2. 跳过所有其他设置,然后在配置页面顶部选择保存

步骤 3:为调试器创建 CloudWatch 事件规则并链接到 Lambda 函数

为调试器创建 CloudWatch 事件规则并链接到 Lambda 函数
  1. 打开 CloudWatch 控制台,网址为https://console.aws.amazon.com/cloudwatch/

  2. 在左侧导航窗格中,选择事件节点下的规则

  3. 选择创建规则

  4. 在 “步骤 1:创建规则” 页面的 “事件源” 部分,选择 “服务名称”,然后SageMaker为 “事件类型” 选择 “T SageMakerraining Job 状态更改”。事件模式预览应类似于以下示例JSON字符串:

    { "source": [ "aws.sagemaker" ], "detail-type": [ "SageMaker Training Job State Change" ] }
  5. 目标部分中,选择添加目标*,然后选择您创建的- jo debugger-rule-stop-trainingb Lambda 函数。此步骤将 CloudWatch 事件规则与 Lambda 函数关联起来。

  6. 选择配置详细信息,然后转到步骤 2:配置规则详细信息页面

  7. 指定 CloudWatch 规则定义名称。例如,debugger-cw-event-rule

  8. 选择创建规则以完成操作。

  9. 返回 Lambda 函数配置页面并刷新页面。在设计器面板中确认已正确配置函数。应将 CloudWatch 事件规则注册为 Lambda 函数的触发器。配置设计应类似于以下示例。

    CloudWatch 配置的设计器面板。