SageMaker 分布式数据并行配置提示和易犯错误 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

SageMaker 分布式数据并行配置提示和易犯错误

在使用 SageMaker 分布式数据并行库之前,请查看以下提示和易犯错误。此列表包括适用于各个框架的提示。

数据预处理

如果您在训练期间预处理数据式,使用了利用 CPU 的外部库,则可能会遇到 CPU 瓶颈,因为 SageMaker 分布式数据并行使用 CPU 执行 AllReduce 操作。您可以将预处理步骤移至使用 GPU 的库或在训练之前完成所有预处理操作,从而缩短训练时间。

单节点与多节点

我们建议您将此库与多节点结合使用。该库可以用于单主机、多设备设置中(例如,具有多个 GPU 的单个 ML 计算实例);但是,当您使用两个或更多节点时,库的 AllReduce 操作可以显著提高性能。此外,在单个主机上,NVLink 有助于提升节点内 AllReduce 效率。

使用 Debugger 调试扩展效率

在训练期间,您可以使用 Amazon SageMaker Debugger 监控并可视化 CPU 和 GPU 利用率以及其他感兴趣的指标。您可以使用 Debugger 内置规则监控计算性能问题,例如 CPUBottleneckLoadBalancingLowGPUUtilization。在定义 Amazon SageMaker Python SDK 估算器时,您可以使用 Debugger 配置指定这些规则。如果您使用 Amazon CLI 和 Amazon Boto3 在 SageMaker 上进行训练,您可以按照使用 Amazon SageMaker API 配置 Debugger 中所示启用 Debugger。

要查看在 SageMaker 训练作业中使用 Debugger 的示例,您可以引用 SageMaker 笔记本示例 GitHub 存储库中的笔记本示例之一。要详细了解 Debugger,请参阅 Amazon SageMaker Debugger

批次大小

在分布式训练中,随着添加的节点越多,批次大小应该按比例增加。在训练作业中添加更多节点并增加全局批次大小时,要想提高收敛速度,请提高学习率。

实现这一目标的一种方法是使用渐进的学习率预热,随着训练作业的进展,学习率从较小的值逐步提高到较大的值。这种渐进式提升避免了学习率的突然提高,从而在训练开始时能够健康地收敛。例如,您可以使用线性扩展规则,每次将小批次大小乘以 k 时,学习率也乘以 k。要了解有关这种技术的更多信息,请参阅研究论文准确的大型小批次 SGD:在 1 小时内训练 ImageNet 中的第 2 节和第 3 节。

自定义 MPI 选项

SageMaker 分布式数据并行库采用消息传递接口 (MPI),这是一种常用标准,用于管理高性能集群中节点之间的通信,并使用 NVIDIA 的 NCCL 库进行 GPU 级通信。当您将数据并行库与 TensorFlow 或 Pytorch Estimator 一起使用时,各自的容器设置 MPI 环境并执行 mpirun 命令,以在集群节点上启动作业。

您可以使用 Estimator 中的 custom_mpi_options 参数设置自定义 MPI 操作。任何在此字段中传递的 mpirun 标志将添加到 mpirun 命令,并由 SageMaker 执行以进行训练。例如,您可以通过以下方法定义 Estimatordistribution 参数,以使用 NCCL_DEBUG 变量来在程序开始时打印 NCCL 版本:

distribution = {'smdistributed':{'dataparallel':{'enabled': True, "custom_mpi_options": "-verbose -x NCCL_DEBUG=VERSION"}}}

使用 Amazon FSx 并设置最佳的存储和吞吐能力

在具有分布式数据并行性的多个节点上训练模型时,强烈建议使用 FSx for Lustre。Amazon FSx 是一种可扩展的高性能存储服务,支持共享文件存储,吞吐速度更快。大规模使用 Amazon FSx 存储可以在计算节点之间实现更快的数据加载速度。

通常情况下,使用分布式数据并行性,您可以预期总训练吞吐量与 GPU 的数量之间存在近线性扩展的关系。但是,如果您使用次优的 Amazon FSx 存储,则由于 Amazon FSx 吞吐量较低,训练性能可能会降低。

例如,如果您使用 Amazon FSx 文件系统的 SCRATCH_2 部署类型以及最低的 1.2 TiB 存储容量,则 I/O 吞吐能力为 240 MB/s。Amazon FSx 存储的工作方式是,您可以分配物理存储设备,分配的设备越多,您获得的吞吐量就越大。SRATCH_2 类型的最小存储增量为 1.2 TiB,相应的吞吐量增益为 240 MB/s。

假设您有一个模型,在 4 个节点的集群上对超过 100 GB 的数据集进行训练。对于针对集群进行了优化的给定批次大小,假设模型可以在大约 30 秒内完成一个纪元。在这种情况下,所需的最低 I/O 速度约为 3 GB/s(100 GB/30 秒)。这显然比 240 MB/s 的吞吐量要高得多。由于 Amazon FSx 容量存在这样的限制,将分布式训练作业扩展到更大的集群可能会加剧 I/O 瓶颈问题;随着缓存数据的积累,后面纪元中的模型训练吞吐量可能会得到改善,但 Amazon FSx 吞吐量仍可能是瓶颈。

为了缓解此类 I/O 瓶颈问题,您应该增加 Amazon FSx 存储大小以获得更高的吞吐能力。通常,为了找到最佳 I/O 吞吐量,您可以尝试不同的 Amazon FSx 吞吐能力,分配等于或略低于您估算值的吞吐量,直到您发现这足以解决 I/O 瓶颈问题为止。在前述示例中,具有 2.4 Gb/s 吞吐量和 67 GB RAM 缓存的 Amazon FSx 存储便已足够。如果文件系统具有最佳吞吐量,则模型训练吞吐量应立即达到最大值,或者在第一个纪元之后建立了缓存时达到最大值。

要了解有关如何增加 Amazon FSx 存储以及部署类型的更多信息,请参阅适用于 Lustre 的 Amazon FSx 文档中的以下页面: