SageMaker 分布式数据并行配置提示和易犯错误
在使用 SageMaker 分布式数据并行库之前,请查看以下提示和易犯错误。此列表包括适用于各个框架的提示。
数据预处理
如果您在训练期间预处理数据式,使用了利用 CPU 的外部库,则可能会遇到 CPU 瓶颈,因为 SageMaker 分布式数据并行使用 CPU 执行 AllReduce
操作。您可以将预处理步骤移至使用 GPU 的库或在训练之前完成所有预处理操作,从而缩短训练时间。
单节点与多节点
我们建议您将此库与多节点结合使用。该库可以用于单主机、多设备设置中(例如,具有多个 GPU 的单个 ML 计算实例);但是,当您使用两个或更多节点时,库的 AllReduce
操作可以显著提高性能。此外,在单个主机上,NVLink 有助于提升节点内 AllReduce
效率。
使用 Debugger 调试扩展效率
在训练期间,您可以使用 Amazon SageMaker Debugger 监控并可视化 CPU 和 GPU 利用率以及其他感兴趣的指标。您可以使用 Debugger 内置规则监控计算性能问题,例如 CPUBottleneck
、LoadBalancing
和 LowGPUUtilization
。在定义 Amazon SageMaker Python SDK 估算器时,您可以使用 Debugger 配置指定这些规则。如果您使用 Amazon CLI 和 Amazon Boto3 在 SageMaker 上进行训练,您可以按照使用 Amazon SageMaker API 配置 Debugger 中所示启用 Debugger。
要查看在 SageMaker 训练作业中使用 Debugger 的示例,您可以引用 SageMaker 笔记本示例 GitHub 存储库
批次大小
在分布式训练中,随着添加的节点越多,批次大小应该按比例增加。在训练作业中添加更多节点并增加全局批次大小时,要想提高收敛速度,请提高学习率。
实现这一目标的一种方法是使用渐进的学习率预热,随着训练作业的进展,学习率从较小的值逐步提高到较大的值。这种渐进式提升避免了学习率的突然提高,从而在训练开始时能够健康地收敛。例如,您可以使用线性扩展规则,每次将小批次大小乘以 k 时,学习率也乘以 k。要了解有关这种技术的更多信息,请参阅研究论文准确的大型小批次 SGD:在 1 小时内训练 ImageNet
自定义 MPI 选项
SageMaker 分布式数据并行库采用消息传递接口 (MPI),这是一种常用标准,用于管理高性能集群中节点之间的通信,并使用 NVIDIA 的 NCCL 库进行 GPU 级通信。当您将数据并行库与 TensorFlow 或 Pytorch Estimator
一起使用时,各自的容器设置 MPI 环境并执行 mpirun
命令,以在集群节点上启动作业。
您可以使用 Estimator
中的 custom_mpi_options
参数设置自定义 MPI 操作。任何在此字段中传递的 mpirun
标志将添加到 mpirun
命令,并由 SageMaker 执行以进行训练。例如,您可以通过以下方法定义 Estimator
的 distribution
参数,以使用 NCCL_DEBUG
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 文档中的以下页面: