

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

# 使用 Amazon 对规则执行操作 CloudWatch 以及 AWS Lambda
<a name="debugger-cloudwatch-lambda"></a>

亚马逊 CloudWatch 收集亚马逊 A SageMaker I 模型训练作业日志和 Amazon SageMaker Debugger 规则处理任务日志。使用 Amazon Ev CloudWatch ents 配置调试器 AWS Lambda ，并根据调试器规则评估状态采取行动。

## 示例笔记本
<a name="debugger-test-stop-training"></a>

您可以运行以下示例笔记本，这些笔记本已准备就绪，可以使用 Ama CloudWatch zon 和，使用调试器内置规则上的操作来尝试停止训练作业。 AWS Lambda
+ [Amazon SageMaker 调试器-对来自规则 CloudWatch 的事件做出反应](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-debugger/tensorflow_action_on_rule/tf-mnist-stop-training-job.html)

  此示例笔记本运行的训练作业存在梯度消失问题。构建 SageMaker AI TensorFlow 估计器时使用调试器[VanishingGradient](debugger-built-in-rules.md#vanishing-gradient)内置规则。当 Debugger 规则检测到问题时，训练作业即告终止。
+ [使用调试器规则检测停滞的训练并 SageMaker 调用操作](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-debugger/tensorflow_action_on_rule/detect_stalled_training_job_and_actions.html)

  此示例笔记本运行一个训练脚本，有一行代码会强制脚本休眠 10 分钟。Debugger [StalledTrainingRule](debugger-built-in-rules.md#stalled-training) 内置规则调用问题并停止训练作业。

**Topics**
+ [示例笔记本](#debugger-test-stop-training)
+ [调试器规则和训练作业的访问 CloudWatch 日志](debugger-cloudwatch-metric.md)
+ [使用 CloudWatch 和 Lambda 设置调试器以自动终止训练作业](debugger-stop-training.md)
+ [禁用 CloudWatch 事件规则以停止使用自动终止训练作业](debugger-disable-cw.md)

# 调试器规则和训练作业的访问 CloudWatch 日志
<a name="debugger-cloudwatch-metric"></a>

当存在训练问题时，您可以使用 CloudWatch 日志中的训练和调试器规则作业状态来采取进一步的措施。以下过程说明如何访问相关日 CloudWatch 志。有关使用监控训练作业的更多信息 CloudWatch，请参阅[监控 Amazon SageMaker AI](https://docs.aws.amazon.com/sagemaker/latest/dg/monitoring-overview.html)。

**访问训练作业日志和 Debugger 规则作业日志**

1. 打开 CloudWatch 控制台，网址为[https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)。

1. 在左侧导航窗格的**日志**节点下，选择**日志组**。

1. 在日志组列表中，执行以下操作：
   + aws/sagemaker/TrainingJobs为训练作业日志选择**/**。
   + aws/sagemaker/ProcessingJobs为调试器规则作业日志选择**/**。

# 使用 CloudWatch 和 Lambda 设置调试器以自动终止训练作业
<a name="debugger-stop-training"></a>

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

**Topics**
+ [第 1 步：创建 Lambda 函数](#debugger-lambda-function-create)
+ [步骤 2：配置 Lambda 函数](#debugger-lambda-function-configure)
+ [步骤 3：为调试器创建 CloudWatch 事件规则并链接到 Lambda 函数](#debugger-cloudwatch-events)

## 第 1 步：创建 Lambda 函数
<a name="debugger-lambda-function-create"></a>

**创建 Lambda 函数**

1. 打开 AWS Lambda 控制台，网址为[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)。

1. 在左侧导航窗格中，选择**函数**，然后选择**创建函数**。

1. 在**创建函数**页面上，选择**从头开始创作**。

1. 在**基本信息**部分，输入**函数名称**（例如，**debugger-rule-stop-training-job**）。

1. 对于**运行时系统**，选择 **Python 3.7**。

1. 对于**权限**，展开下拉选项，然后选择**更改默认执行角色**。

1. 对于**执行角色**，选择**使用现有角色**并选择用于在 A SageMaker I 上训练任务的 IAM 角色。
**注意**  
请确保您使用附加了 `AmazonSageMakerFullAccess` 和 `AWSLambdaBasicExecutionRole` 的执行角色。否则，Lambda 函数将无法正确响应训练作业的 Debugger 规则状态变化。如果您不确定正在使用哪个执行角色，请在 Jupyter 笔记本单元中运行以下代码来检索执行角色输出：  

   ```
   import sagemaker
   sagemaker.get_execution_role()
   ```

1. 在页面底部，选择**创建函数**。

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

![\[“创建函数”页面。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/debugger/debugger-lambda-create.png)


## 步骤 2：配置 Lambda 函数
<a name="debugger-lambda-function-configure"></a>

**配置 Lambda 函数**

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

   ```
   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 AWS 控制台编辑器创建函数](https://docs.aws.amazon.com/lambda/latest/dg/code-editor.html)。

1. 跳过所有其他设置，然后在配置页面顶部选择**保存**。

## 步骤 3：为调试器创建 CloudWatch 事件规则并链接到 Lambda 函数
<a name="debugger-cloudwatch-events"></a>

**为调试器创建 CloudWatch 事件规则并链接到 Lambda 函数**

1. 打开 CloudWatch 控制台，网址为[https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)。

1. 在左侧导航窗格中，选择**事件**节点下的**规则**。

1. 选择 **Create rule**（创建规则）。

1. 在 “**步骤 1：创建规则**” 页面的 “**事件源**” 部分，为 “**服务名称**” 选择 “**SageMaker AI**”，为 “**事件类型**” 选择 “**SageMaker AI Training Job 状态更改**”。事件模式预览应该类似于以下示例 JSON 字符串：

   ```
   {
       "source": [
           "aws.sagemaker"
       ],
       "detail-type": [
           "SageMaker Training Job State Change"
       ]
   }
   ```

1. 在**目标**部分，选择**添加目标\$1，然后选择您创建的-** jo **debugger-rule-stop-trainingb** Lambda 函数。此步骤将 CloudWatch 事件规则与 Lambda 函数关联起来。

1. 选择**配置详细信息**，然后转到**步骤 2：配置规则详细信息页面**。

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

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

1. 返回 Lambda 函数配置页面并刷新页面。在**设计器**面板中确认已正确配置函数。应将 CloudWatch 事件规则注册为 Lambda 函数的触发器。配置设计应类似于以下示例。  
<a name="lambda-designer-example"></a>![\[CloudWatch 配置的设计器面板。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/debugger/debugger-lambda-designer.png)

# 禁用 CloudWatch 事件规则以停止使用自动终止训练作业
<a name="debugger-disable-cw"></a>

如果要禁用自动终止训练作业，则需要禁用 CloudWatch 事件规则。在 Lambda **设计器**面板中，选择链接到 Lambda 函数的 **EventBridge （CloudWatch 事件）**模块。这会在 “**设计器 **EventBridge****” 面板下方显示一个面板（例如，参见上一个屏幕截图）。选中 **EventBridge （CloudWatch 事件）:** 旁边的复选框 debugger-cw-event-rule，然后选择**禁用**。如果您想稍后使用自动终止功能，可以再次启用 CloudWatch 事件规则。