SageMaker 分布式数据并行库的配置提示 - Amazon SageMaker

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

SageMaker 分布式数据并行库的配置提示

在使用 SageMaker 分布式数据并行度 (SMDDP) 库之前,请查看以下提示。此列表包括适用于各个框架的提示。

数据预处理

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

单节点与多节点

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

使用调试器调试缩放效率

您可以使用 Amazon SageMaker Debugger 监控和可视化训练期间的 CPU 和 GPU 利用率以及其他感兴趣的指标。您可以使用 Debugger 内置规则监控计算性能问题,例如 CPUBottleneckLoadBalancingLowGPUUtilization。在定义 Amaz SageMaker on Python 软件开发工具包估算器时,您可以使用调试器配置来指定这些规则。如果您使用 AWS CLI 和 AWS SDK for Python (Boto3) 进行训练,则可以启用调试器 SageMaker,如使用 Ama SageMaker zon API 配置 SageMaker 调试器中所示。

要查看在 SageMaker 训练作业中使用 Debugger 的示例,可以参考笔记本示例 GitHub 存储库中的一个SageMaker 笔记本示例。要了解有关调试器的更多信息,请参阅 Amazon SageMaker 调试器。

批次大小

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

实现这一目标的一种方法是使用渐进的学习率预热,随着训练作业的进展,学习率从较小的值逐步提高到较大的值。这种渐进式提升避免了学习率的突然提高,从而在训练开始时能够健康地收敛。例如,您可以使用线性扩展规则,每次将小批次大小乘以 k 时,学习率也乘以 k。要了解有关这项技术的更多信息,请参阅研究论文《准确、大型 Minibatch 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 文档中的以下页面: