通过访问训练容器 AWS Systems Manager 进行远程调试 - Amazon SageMaker

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

通过访问训练容器 AWS Systems Manager 进行远程调试

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

您可以连接到 Fr SageMaker amework 容器或连接到自己在训练环境中设置的 SageMaker 训练容器。

设置 IAM 权限

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

IAM 角色

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

要为训练作业启用远程调试, SageMaker 需要在训练作业开始时在训练容器中启动 SSM 代理。要允许 SSM 代理与 SSM 服务通信,请将以下策略添加到用于运行训练作业的 IAM 角色中。

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

IAM 用户

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

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

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

{ "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 用户限制远程调试的策略示例。

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

有关更多信息,请参阅《AWS 服务授权参考》 SageMaker中的 Amazon 条件密钥

如何为 SageMaker 训练作业启用远程调试

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

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 )

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

使用以下 estimator 类方法,可以在训练作业运行时启用或禁用远程调试,而作业SecondaryStatus的任务为Downloading或。Training

# Enable RemoteDebug estimator.enable_remote_debug() # Disable RemoteDebug estimator.disable_remote_debug()
AWS SDK for Python (Boto3)

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

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

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的任务为DownloadingTraining

# 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 笔记本上运行它,请在行的开头添加一个感叹号 (!)。

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 笔记本上运行它,请在行的开头添加一个感叹号 (!)。

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

访问您的训练容器

当相应训练作业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)
AWS SDK for Python (Boto3)

要检查训练作业,请运行以下适用于 Python 的 SDK (Boto3) 代码。SecondaryStatus

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训练作业的,请运行以下 AWS CLI 命令 SageMaker。

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 会创建相同数量的主机和日志流。例如,如果您使用 4 个实例,则 SageMaker 会创建algo-1algo-2algo-3、和algo-4。您必须确定要调试的日志流及其主机号。要访问与训练作业关联的日志流,请执行以下操作。

  1. 打开亚马逊 SageMaker 控制台,网址为 https://console.aws.amazon.com/sagemaker/

  2. 在左侧导航窗格中,选择培训,然后选择训练作业

  3. 训练作业列表中,选择要调试的训练作业。将打开训练作业详细信息页面。

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

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

要详细了解如何 SageMaker 管理多实例分布式训练的配置信息,请参阅分布式训练配置

访问训练容器

在终端中使用以下命令启动 SSM 会话 (aws ssm start-session) 并连接到训练容器。

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

如果您的训练容器在未连接到公共互联网的 Amazon Virtual Private Cloud 中运行,则可以使用 AWS PrivateLink 启用 SSM。 AWS PrivateLink 将您的终端节点实例、SSM 和 Amazon EC2 之间的所有网络流量限制到亚马逊网络。有关如何使用设置 SSM 访问权限的更多信息 AWS PrivateLink,请参阅为会话管理器设置 Amazon VPC 终端节点

记录 SSM 会话命令和结果

按照创建会话管理器首选项文档(命令行)中的说明进行操作后,您可以创建定义 SSM 会话首选项的 SSM 文档。您可以使用 SSM 文档配置会话选项,包括数据加密、会话持续时间和日志记录。例如,您可以指定是将会话日志数据存储在亚马逊简单存储服务 (Amazon S3) 存储桶中,还是存储在 CloudWatch 亚马逊日志组中。您可以创建定义 AWS 账户所有会话的常规首选项的文档 AWS 区域,也可以创建定义单个会话首选项的文档。

通过查看 SSM 中的错误日志来解决问题

Amazon 会将错误从 SSM 代理 SageMaker 上传到 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

注意事项

使用 SageMaker 远程调试时,请考虑以下几点。

  • SageMaker 算法容器或容器从开始 SageMaker 就不支持远程调试 AWS Marketplace。

  • 您无法为启用网络隔离的容器启动 SSM 会话,因为隔离可以防止出站网络呼叫。