View a markdown version of this page

在 Amazon A SageMaker I 中进行分布式训练的疑难解答 - 亚马逊 SageMaker AI

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

在 Amazon A SageMaker I 中进行分布式训练的疑难解答

如果您在使用库运行训练作业时遇到问题,请按照以下列表尝试进行故障排除。如果您需要进一步的支持,请通过AWS 支持中心或亚马逊 Amazon SageMaker AI AWS 开发者论坛与 Amazon A SageMaker I 团队联系。

与 Amazon SageMaker 调试器和检查点并行使用 SageMaker 人工智能分布式数据

要监控系统瓶颈、分析框架操作并调试模型输出张量,以并行使用 SageMaker 人工智能分布式数据进行训练作业,请使用 Amazon D SageMaker ebugger。

但是,当您使用 SageMaker Debugger、 SageMaker AI 分布式数据 parallel 和 SageMaker AI 检查点时,可能会看到类似于以下示例的错误。

SMDebug Does Not Currently Support Distributed Training Jobs With Checkpointing Enabled

这是由于调试器和检查点之间存在内部错误,当您并行启用 SageMaker AI 分布式数据时,就会发生这种错误。

  • 如果您启用所有三个功能, SageMaker Python SDK 会通过传递自动关闭调试器debugger_hook_config=False,这等同于以下框架estimator示例。

    bucket=sagemaker.Session().default_bucket() base_job_name="sagemaker-checkpoint-test" checkpoint_in_bucket="checkpoints" # The S3 URI to store the checkpoints checkpoint_s3_bucket="s3://{}/{}/{}".format(bucket, base_job_name, checkpoint_in_bucket) estimator = TensorFlow( ... distribution={"smdistributed": {"dataparallel": { "enabled": True }}}, checkpoint_s3_uri=checkpoint_s3_bucket, checkpoint_local_path="/opt/ml/checkpoints", debugger_hook_config=False )
  • 如果您想继续同时使用 SageMaker AI 分布式数据 parallel 和 SageMaker Debugger,则一种解决方法是手动向训练脚本中添加检查点函数,而不是从估算器中指定checkpoint_s3_uricheckpoint_local_path参数。有关在训练脚本中设置手动检查点的更多信息,请参阅保存检查点

意外前缀附加到模型参数键上

对于 PyTorch 分布式训练作业,可能会在state_dict密钥(model模型参数)上附加意外前缀(例如)。当 PyTorch 训练作业保存模型工件时, SageMaker AI 数据 parallel 库不会直接更改或预置任何模型参数名称。 PyTorch的分布式训练将中的名称更改state_dict为通过网络,在前面加上前缀。如果您在使用 SageMaker AI 数据并行库和检查点进行训练时由于参数名称不同而遇到任何模型失败问题,请调整以下示例代码,在 PyTorch 训练脚本中加载检查点的步骤中删除前缀。

state_dict = {k.partition('model.')[2]:state_dict[k] for k in state_dict.keys()}

这会将每个 state_dict 键作为字符串值,在 'model.' 第一次出现时分隔字符串,并获取分区字符串的第三个列表项(索引 2)。

有关前缀问题的更多信息,请参阅 “如果经过多 GPU 训练,则在保存的模型中使用前缀参数名称? 在PyTorch 讨论论坛中。

有关保存和加载模型的 PyTorch 方法的更多信息,请参阅PyTorch文档中的跨设备保存和加载模型

SageMaker 初始化期间 AI 分布式训练作业停滞

如果您的 SageMaker AI 分布式数据并行训练作业在使用 EFA-enabled 实例时在初始化期间停滞不前,则这可能是由于用于训练作业的 VPC 子网的安全组配置错误所致。EFA 需要正确的安全组配置才能启用节点之间的流量。

配置安全组的入站和出站规则
  1. 登录 AWS 管理控制台 并打开 Amazon VPC 控制台,网址为https://console.aws.amazon.com/vpc/

  2. 在左侧导航窗格中,选择安全组

  3. 选择与您用于训练的 VPC 子网关联的安全组。

  4. 详细信息部分中复制安全组 ID

  5. Inbound Rules (入站规则) 选项卡上,选择 Edit inbound rules (编辑入站规则)

  6. Edit inbound rules (编辑入站规则) 页面上,执行以下操作:

    1. 选择添加规则

    2. 对于 Type (类型),请选择 All traffic (所有流量)

    3. 对于,请选择自定义,将安全组 ID 粘贴到搜索框中,然后选择弹出的安全组。

  7. 选择保存规则即可完成安全组入站规则的配置。

  8. 出站规则选项卡上,选择编辑出站规则

  9. 重复步骤 6 和 7,添加相同的规则作为出站规则。

完成上述配置安全组的入站和出站规则的步骤后,请重新运行训练作业并验证停滞问题是否已解决。

有关为 VPC 和 EFA 配置安全组的更多信息,请参阅 VPC 的安全组Elastic Fabric Adapter

SageMaker AI 分布式训练作业在训练结束时停滞不前

训练结束时出现停滞问题的根本原因之一是,每个纪元在不同秩之间处理的批次数量不匹配。所有工作线程 (GPU) 都会在向后传递中同步其局部梯度,以确保在批次迭代结束时它们都拥有模型的相同副本。如果在训练的最后一个纪元中,将批次大小不均匀地分配给不同的工作线程组,则训练作业将停止。例如,当一个工作线程组(组 A)完成所有批次的处理并退出训练循环时,另一个工作线程组(组 B)开始处理其他批次,但仍需要来自组 A 的通信以同步梯度。这会导致组 B 等待 A 组,但组 A 已经完成训练并且没有任何梯度可供同步。

因此,在设置训练数据集时,重要的是每个工作线程获得相同数量的数据样本,这样每个工作线程在训练时都会处理相同数量的批次。确保每个秩获得相同的批次数量,以避免出现这种停滞问题。

发现由于 Amazon FSx 吞吐量瓶颈而导致的扩展效率下降

扩展效率降低的一个潜在原因是 FSx 的吞吐量限制。如果您在切换到更大的训练集群时发现扩展效率突然下降,请尝试使用具有较高吞吐量限制的更大 FSx for Lustre 文件系统。有关更多信息,请参阅《适用于 Lustre 的 Amazon FSx 用户指南》中的聚合文件系统性能管理存储和吞吐能力

SageMaker 带有 PyTorch 返回弃用警告的 AI 分布式训练作业

从 v1.4.0 起, SageMaker AI 分布式数据并行库可以用作分布式的后端。 PyTorch 由于在使用库时发生了重大变化 PyTorch,您可能会遇到一条警告消息,说明 PyTorch 分布式包smdistributed的 API 已被弃用。警告消息应该类似于以下内容:

smdistributed.dataparallel.torch.dist is deprecated in the SageMaker AI distributed data parallel library v1.4.0+. Please use torch.distributed and specify 'smddp' as a backend when initializing process group as follows: torch.distributed.init_process_group(backend='smddp') For more information, see the library's API documentation at https://docs.aws.amazon.com/sagemaker/latest/dg/data-parallel-modify-sdp-pt.html

在 v1.4.0 及更高版本中,只需要在训练脚本顶部导入一次库,并在 PyTorch 分布式初始化期间将其设置为后端。使用单行后端规范,您可以保持 PyTorch 训练脚本不变,直接使用 PyTorch 分布式模块。在训练脚本中使用 SMDDP 库 PyTorch要了解重大更改以及使用该库的新方法,请参阅 PyTorch。