

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

# 通过访问训练容器 AWS Systems Manager 进行远程调试
<a name="train-remote-debugging"></a>

您可以通过 AWS Systems Manager (SSM) 安全地连接到 SageMaker 训练容器。这样您就可以通过 shell 级别访问容器中正在运行的训练作业。您还可以记录流式传输到 Amazon 的命令和响应 CloudWatch。如果您使用自己的亚马逊虚拟私有云 (VPC) Amazon Virtual Private Cloud 来训练模型，则 AWS PrivateLink 可以使用为 SSM 设置 VPC 终端节点并通过 SSM 私密连接到容器。

您可以连接到 [SageMaker AI Framework 容](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only)器或连接到自己在训练环境中设置的 SageMaker 训练容器。

## 设置 IAM 权限
<a name="train-remote-debugging-iam"></a>

要在 SageMaker 训练容器中启用 SSM，您需要为容器设置 IAM 角色。要使您或您的 AWS 账户中的用户能够通过 SSM 访问培训容器，您需要为 IAM 用户设置有权使用 SSM。

### IAM 角色
<a name="train-remote-debugging-iam-role"></a>

要使 SageMaker 训练容器以 SSM 代理开头，请为具有 SSM 权限的 IAM 角色提供一个。

要为您的训练作业启用远程调试， SageMaker AI 需要在训练作业开始时在训练容器中启动 [SSM 代理](https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent.html)。要允许 SSM 座席与 SSM 服务通信，请将以下策略添加到用于运行训练作业的 IAM 角色中。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	             
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel"
            ],
            "Resource": "*"    
        }
    ]
 }
```

------

### IAM 用户
<a name="train-remote-debugging-iam-user"></a>

添加以下策略以向 IAM 用户提供连接到 SSM 目标的 SSM 会话权限。在本例中，SSM 目标是 SageMaker 训练容器。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	             
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:StartSession",
                "ssm:TerminateSession"
            ],
            "Resource": "*"    
        }
    ]
}
```

------

 您可以通过添加 `Condition` 密钥来限制 IAM 用户只能连接到用于特定训练作业的容器，如以下策略示例所示。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	             
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:StartSession",
                "ssm:TerminateSession"
            ],
            "Resource": [
                "*"
            ],
            "Condition": {
                "StringLike": {
                    "ssm:resourceTag/aws:ssmmessages:target-id": [
                        "sagemaker-training-job:*"
                    ]
                }
            } 
        }
    ]
}
```

------

您也可以明确使用 `sagemaker:EnableRemoteDebug` 条件键来限制远程调试。以下是 IAM 用户限制远程调试的策略示例。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DenyRemoteDebugInTrainingJob",
            "Effect": "Allow",
            "Action": [
                "sagemaker:CreateTrainingJob",
                "sagemaker:UpdateTrainingJob"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "sagemaker:EnableRemoteDebug": false
                }
            }
        }
    ]
}
```

------

有关更多信息，请参阅《*AWS 服务授权参考*》中的 [ SageMaker Amazon AI 条件密钥](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonsagemaker.html#amazonsagemaker-policy-keys)。

## 如何为 SageMaker 训练作业启用远程调试
<a name="train-remote-debugging-how-to-use"></a>

在本节中，学习如何在 Amazon A SageMaker I 中启动或更新训练作业时启用远程调试。

------
#### [ SageMaker Python SDK ]

使用 Pyth SageMaker on SDK 中的估算器类，您可以使用`enable_remote_debug`参数或`enable_remote_debug()`和`disable_remote_debug()`方法开启或关闭远程调试。

**要在创建训练作业时启用远程调试**

要在创建新训练作业时启用远程调试，请将 `enable_remote_debug` 参数设置为 `True`。默认为 `False`，因此，如果您根本没有设置此参数，或明确将其设置为 `False`，则远程调试功能将被禁用。

```
import sagemaker

session = sagemaker.Session()

estimator = sagemaker.estimator.Estimator(
    ...,
    sagemaker_session=session,
    image_uri="<your_image_uri>", #must be owned by your organization or Amazon DLCs 
    role=role,
    instance_type="ml.m5.xlarge",
    instance_count=1,
    output_path=output_path,
    max_run=1800,
    enable_remote_debug=True
)
```

**要通过更新训练作业启用远程调试**

使用以下估算器类方法，当训练作业的 `SecondaryStatus` 为 `Downloading` 或 `Training` 时，您可以在训练作业运行时启用或禁用远程调试。

```
# Enable RemoteDebug
estimator.enable_remote_debug()

# Disable RemoteDebug
estimator.disable_remote_debug()
```

------
#### [ 适用于 Python (Boto3) 的 AWS SDK ]

**要在创建训练作业时启用远程调试**

要在创建新的训练作业时启用远程调试，请在 `RemoteDebugConfig` 参数中将 `EnableRemoteDebug` 密钥值设置为 `True`。

```
import boto3

sm = boto3.Session(region_name=region).client("sagemaker")

# Start a training job
sm.create_training_job(
    ...,
    TrainingJobName=job_name,
    AlgorithmSpecification={
        // Specify a training Docker container image URI 
        // (Deep Learning Container or your own training container) to TrainingImage.
        "TrainingImage": "<your_image_uri>",
        "TrainingInputMode": "File"
    },
    RoleArn=iam_role_arn,
    OutputDataConfig=output_path,
    ResourceConfig={
        "InstanceType": "ml.m5.xlarge",
        "InstanceCount": 1,
        "VolumeSizeInGB": 30
    },
    StoppingCondition={
        "MaxRuntimeInSeconds": 86400
    },
    RemoteDebugConfig={
        "EnableRemoteDebug": True
    }
)
```

**要通过更新训练作业启用远程调试**

使用 `update_traing_job` API，当训练作业的 `SecondaryStatus` 为 `Downloading` 或 `Training` 时，您可以在训练作业运行时启用或禁用远程调试。

```
# Update a training job
sm.update_training_job(
    TrainingJobName=job_name,
    RemoteDebugConfig={
        "EnableRemoteDebug": True     # True | False
    }
)
```

------
#### [ AWS Command Line Interface (CLI) ]

**要在创建训练作业时启用远程调试**

准备一个 JSON 格式的 `CreateTrainingJob` 请求文件，如下所示。

```
// train-with-remote-debug.json
{
    "TrainingJobName": job_name,
    "RoleArn": iam_role_arn,
    "AlgorithmSpecification": {
        // Specify a training Docker container image URI (Deep Learning Container or your own training container) to TrainingImage.
        "TrainingImage": "<your_image_uri>",
        "TrainingInputMode": "File"
    },
    "OutputDataConfig": {
        "S3OutputPath": output_path
    },
    "ResourceConfig": {
        "InstanceType": "ml.m5.xlarge",
        "InstanceCount": 1,
        "VolumeSizeInGB": 30
    },
    "StoppingCondition": {
        "MaxRuntimeInSeconds": 86400
    },
    "RemoteDebugConfig": {
        "EnableRemoteDebug": True
    }
}
```

保存 JSON 文件后，在提交训练作业的终端运行以下命令。以下示例命令假定 JSON 文件名为 `train-with-remote-debug.json`。如果您从 Jupyter Notebook 运行，请在行首添加一个感叹号 (`!`)。

```
aws sagemaker create-training-job \
    --cli-input-json file://train-with-remote-debug.json
```

**要通过更新训练作业启用远程调试**

准备一个 JSON 格式的 `UpdateTrainingJob` 请求文件，如下所示。

```
// update-training-job-with-remote-debug-config.json
{
    "TrainingJobName": job_name,
    "RemoteDebugConfig": {
        "EnableRemoteDebug": True
    }
}
```

保存 JSON 文件后，在提交训练作业的终端运行以下命令。以下示例命令假定 JSON 文件名为 `train-with-remote-debug.json`。如果您从 Jupyter Notebook 运行，请在行首添加一个感叹号 (`!`)。

```
aws sagemaker update-training-job \
    --cli-input-json file://update-training-job-with-remote-debug-config.json
```

------

## 访问您的训练容器
<a name="train-remote-debugging-access-container"></a>

当相应训练作业的 `SecondaryStatus` 为 `Training` 时，您可以访问训练容器。以下代码示例演示如何使用 `DescribeTrainingJob` API 检查训练作业的状态、如何查看训练作业登录 CloudWatch以及如何登录训练容器。

**要查看训练作业的状态**

------
#### [ SageMaker Python SDK ]

要检查训练作业，请运行以下 SageMaker Python SDK 代码。`SecondaryStatus`

```
import sagemaker

session = sagemaker.Session()

# Describe the job status
training_job_info = session.describe_training_job(job_name)
print(training_job_info)
```

------
#### [ 适用于 Python (Boto3) 的 AWS SDK ]

要查看训练作业的 `SecondaryStatus`，请运行以下 Python SDK (Boto3) 代码。

```
import boto3

session = boto3.session.Session()
region = session.region_name
sm = boto3.Session(region_name=region).client("sagemaker")

# Describe the job status
sm.describe_training_job(TrainingJobName=job_name)
```

------
#### [ AWS Command Line Interface (CLI) ]

要检查训练`SecondaryStatus`作业，请为 SageMaker AI 运行以下 AWS CLI 命令。

```
aws sagemaker describe-training-job \
    --training-job-name job_name
```

------

**要查找训练容器的主机名称**

要通过 SSM 连接到训练容器，目标 ID 应使用以下格式：`sagemaker-training-job:<training-job-name>_algo-<n>`，其中 `algo-<n>` 是容器的主机名称。如果您的作业在单个实例上运行，则主机始终 `algo-1`。如果您在多个实例上运行分布式训练作业， SageMaker AI 会创建相同数量的主机和日志流。例如，如果您使用 4 个实例， SageMaker AI 会创建`algo-1``algo-2`、`algo-3`、和`algo-4`。您必须确定要调试的日志流及其主机编号。要访问与训练作业相关的日志流，请执行以下操作。

1. 打开 Amazon A SageMaker I 控制台，网址为[https://console.aws.amazon.com/sagemaker/](https://console.aws.amazon.com/sagemaker/)。

1. 在左侧导航窗格中，选择**训练**，然后选择**训练作业**。

1. 从**训练作业**列表中，选择要调试的训练作业。训练作业详细信息页面会打开。

1. 在**监控**部分，选择**查看日志**。相关的训练作业日志流列表将在 CloudWatch 控制台中打开。

1. 日志流名称以 `<training-job-name>/algo-<n>-<time-stamp>` 格式显示，其中 `algo-<n>` 代表主机名称。

要详细了解 SageMaker AI 如何管理多实例分布式训练的配置信息，请参阅[分布式训练配置](https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-training-algo-running-container.html#your-algorithms-training-algo-running-container-dist-training)。

**要访问训练容器**

在终端中使用以下命令启动 SSM 会话 (`[aws ssm start-session](https://docs.aws.amazon.com/cli/latest/reference/ssm/start-session.html)`) 并连接到训练容器。

```
aws ssm start-session --target sagemaker-training-job:<training-job-name>_algo-<n>
```

例如，如果训练作业名称为 `training-job-test-remote-debug`，主机名称为 `algo-1`，则目标 ID 将变为 `sagemaker-training-job:training-job-test-remote-debug_algo-1`。如果此命令的输出类似于 `Starting session with SessionId:xxxxx`，则表示连接成功。

### 使用 SSM 访问权限 AWS PrivateLink
<a name="train-remote-debugging-access-container-vpc"></a>

如果您的训练容器在未连接到公共互联网的 Amazon Virtual Private Cloud 中运行，则可以使用 AWS PrivateLink 启用 SSM。 AWS PrivateLink 将您的终端节点实例、SSM 和 Amazon EC2 之间的所有网络流量限制到亚马逊网络。有关如何使用设置 SSM 访问权限的更多信息 AWS PrivateLink，请参阅为[会话管理器设置 Amazon VPC 终端节点](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started-privatelink.html)。

## 记录 SSM 会话命令和结果
<a name="train-remote-debugging-log-ssm"></a>

按照[创建会话管理器首选项文档（命令行）](https://docs.aws.amazon.com/systems-manager/latest/userguide/getting-started-create-preferences-cli.html)中的说明进行操作后，您可以创建 SSM 文档来定义 SSM 会话的首选项。您可以使用 SSM 文档来配置会话选项，包括数据加密、会话持续时间和日志记录。例如，您可以指定是将会话日志数据存储在亚马逊简单存储服务 (Amazon S3) 存储桶中，还是存储在 CloudWatch 亚马逊日志组中。您可以创建定义 AWS 账户所有会话的常规首选项的文档 AWS 区域，也可以创建定义单个会话首选项的文档。

## 通过查看 SSM 的错误日志排除故障
<a name="train-remote-debugging-checking-ssm-agent-logs"></a>

Amazon SageMaker AI 会将错误从 SSM 代理上传到 CloudWatch 日志组中的`/aws/sagemaker/TrainingJobs`日志中。SSM 座席日志流的命名格式为：`<job-name>/algo-<n>-<timestamp>/ssm`。例如，如果您创建了一个名为的双节点训练作业`training-job-test-remote-debug`，则训练作业日志`training-job-test-remote-debug/algo-<n>-<timestamp>`和多个 SSM 代理错误日志`training-job-test-remote-debug/algo-<n>-<timestamp>/ssm`将上传到您的 CloudWatch 日志。在此示例中，您可以查看 `*/ssm` 日志流以解决 SSM 问题。

```
training-job-test-remote-debug/algo-1-1680535238
training-job-test-remote-debug/algo-2-1680535238
training-job-test-remote-debug/algo-1-1680535238/ssm
training-job-test-remote-debug/algo-2-1680535238/ssm
```

## 注意事项
<a name="train-remote-debugging-considerations"></a>

使用 SageMaker AI 远程调试时，请考虑以下几点。
+ [SageMaker AI 算法容器或从 SageMaker AI 开始的容](https://docs.aws.amazon.com/sagemaker/latest/dg/algorithms-choose.html)器不支持远程调试 AWS Marketplace。
+ 您无法为启用网络隔离的容器启动 SSM 会话，因为隔离会阻止出站网络调用。