数据并行故障排除 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

数据并行故障排除

如果您在使用库运行训练作业时遇到问题,请按照以下列表尝试进行故障排除。如果您需要进一步的支持,请通过 Amazon Support CenterAmazon SageMaker 的 Amazon 开发人员论坛联系 SageMaker 团队。

将 SageMaker 分布式数据并行与 Amazon SageMaker Debugger 和检查点结合使用

在使用 SageMaker 分布式数据并行运行训练作业时,若要监控系统瓶颈、分析框架操作和调试模型输出张量,请使用 Amazon SageMaker Debugger。

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

SMDebug Does Not Currently Support Distributed Training Jobs With Checkpointing Enabled

这是由于 Debugger 与检查点之间存在内部错误,当您启用 SageMaker 分布式数据并行时,就会出现此错误。

  • 如果您启用了全部三个功能,SageMaker Python SDK 会通过传递 debugger_hook_config=False 来自动关闭 Debugger,这等同于以下框架 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 分布式数据并行和 SageMaker Debugger,一种解决方法是手动向训练脚本中添加检查点函数,而不是从估算器指定 checkpoint_s3_uricheckpoint_local_path 参数。有关在训练脚本中设置手动检查点的更多信息,请参阅保存检查点

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

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

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

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

有关前缀问题的更多信息,请参阅 PyTorch 论坛中的使用多 GPU 训练时在保存的模型中为参数名称添加前缀?讨论主题。

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

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

在使用启用了 EFA 的实例(ml.p3dn.24xlargeml.p4d.24xlarge)时,如果您的 SageMaker 分布式数据并行训练作业在初始化期间停滞,这可能是训练作业所用 VPC 子网的安全组配置错误所导致。EFA 需要正确的安全组配置才能启用节点之间的流量。

配置安全组的入站和出站规则
  1. 登录到Amazon Web Services Management Console并打开 Amazon VPC 控制台,网址:https://console.aws.amazon.com/vpc/

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

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

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

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

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

    1. 选择 Add rule

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

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

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

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

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

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

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

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

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

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

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

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

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

从 v1.4.0 开始,SageMaker 数据并行性库可用作 PyTorch 分布式的后端。由于在 PyTorch 中使用该库发生了重大变化,您可能会收到一条警告消息,提示 PyTorch 分布式软件包的 smdistributed API 已被弃用。警告消息应该类似于以下内容:

smdistributed.dataparallel.torch.dist is deprecated in the SageMaker 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 分布式模块。有关重大更改以及在 PyTorch 中使用库的新方法,请参阅修改 PyTorch 训练脚本