Amazon 中分布式培训的疑难解答 SageMaker - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

Amazon 中分布式培训的疑难解答 SageMaker

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

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

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

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

SMDebug Does Not Currently Support Distributed Training Jobs With Checkpointing Enabled

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

  • 如果您启用所有三个功能, 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 分布式数据 parallel 和 D SageMaker ebugger,则一种解决方法是手动向训练脚本中添加检查点函数,而不是从估算器中指定checkpoint_s3_uricheckpoint_local_path参数。有关在训练脚本中设置手动检查点的更多信息,请参阅保存检查点

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

对于 PyTorch 分布式训练作业,可能会在state_dict密钥(model模型参数)上附加意外前缀(例如)。 PyTorch 训练作业保存模型工件时,d SageMaker ata parallel 库不会直接更改或预置任何模型参数名称。 PyTorch的分布式训练将中的名称更改state_dict为通过网络,在前面加上前缀。如果您在使用 SageMaker 数据并行库和检查点进行训练时由于参数名称不同而遇到任何模型失败问题,请调整以下示例代码,在 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 初始化期间分布式训练作业停滞

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

配置安全组的入站和出站规则
  1. 登录 Amazon Web Services Management Console 并打开亚马逊 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 用户指南》中的聚合文件系统性能管理存储和吞吐能力

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

从 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 分布式模块。在训练脚本中使用 SMDDP 库 PyTorch 要了解重大更改以及使用该库的新方法,请参阅 PyTorch。