本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
分布式训练策略
分布式训练通常按两种方法来拆分:数据并行和模型并行。数据并行是分布式训练的最常见方法:您有很多数据,将其分成批次,然后将数据块发送到多个 CPU 或 GPU(节点)以供神经网络或 ML 算法处理,然后合并结果。每个节点上的神经网络都是一样的。模型并行方法用于不能整体放到一个节点的内存中的大型模型;该方法拆分模型,不同的部分放在不同的节点上。在这种情况下,您需要将数据批次发送到各个节点,以便在模型的所有部分上处理数据。
术语网络和模型经常可以互换使用:大型模型实际上是一个具有许多层和参数的大型网络。使用大型网络进行训练会生成一个大型模型,将模型以及所有预训练的参数及其权重加载回网络,会将大型模型加载到内存中。当您拆分模型以在节点之间分布模型时,您也会拆分底层网络。网络由层组成,为了拆分网络,您可以将层放置在不同的计算设备上。
在设备之间拆分层时,一个常见的内在缺陷是 GPU 的利用率严重不足。无论是向前还是向后传递,训练在本质上都是顺序的,在给定时间,只有一个 GPU 可以有效地进行计算,而其他 GPU 则等待发送激活信号。为了解决这个问题,现代模型并行库使用管道执行计划来提高设备利用率。但是,只有 Amazon SageMaker AI 的分布式模型并行库包含自动模型拆分。该库有两个核心功能:自动模型拆分和管道执行计划,通过制定自动化决策以实现高效设备利用,简化了实施模型并行的过程。
使用数据并行和模型并行进行训练
如果您在使用大型数据集进行训练,请首先使用数据并行方法。如果您在训练期间内存不足,则可能需要切换到模型并行方法,或尝试混合使用模型并行和数据并行。您还可以尝试以下方法,通过数据并行来提高性能:
-
更改模型的超参数。
-
减少批次大小。
-
继续减少批次大小,直至能够放入。如果您将批量大小减少到 1,但内存仍然不足,那就应该尝试模型并行训练。
尝试梯度压缩(FP16、INT8):
-
在配备 NVIDIA TensorCore 的硬件上,使用混合精确度训练
可加快速度并减少内存消耗。 -
SageMaker AI 的分布式数据并行库支持现成可用的自动混合精度(AMP)。除了对训练脚本进行框架级别的修改之外,您无需执行额外操作即可启用 AMP。如果梯度位于 FP16 中,则 SageMaker AI 数据并行库会在 FP16 中运行其
AllReduce操作。有关对您的训练脚本中实施 AMP API 的更多信息,请参阅以下资源:-
NVIDIA 深度学习性能文档中的框架 – PyTorch
-
NVIDIA 深度学习性能文档中的框架 – TensorFlow
-
NVIDIA 开发人员文档中的适用于深度学习的自动混合精度
-
PyTorch 博客中的引入 PyTorch 自动混合精度功能,用于加快 NVIDIA GPU 上的训练速度
-
《TensorFlow 文档》中的 TensorFlow 混合精度 API
-
尝试减小输入大小:
-
如果您增加序列链接、需要减少批处理大小或增加 GPU 以分散批次,则减少 NLP 序列长度。
-
降低图像分辨率。
检查是否使用了批次标准化,因为这可能会影响收敛性。在使用分布式训练时,您的批次在 GPU 之间拆分,而小得多的批次大小可能会带来更高的错误率,进而干扰模型的收敛。例如,如果您在批次大小为 64 的单个 GPU 上对网络进行原型设计,然后扩展到使用 4 个 p3dn.24xlarge,那么现在有 32 个 GPU,而每个 GPU 的批次大小从 64 降至 2。这可能会破坏您在单个节点上可以实现的收敛。
在以下情况下从模型并行训练开始:
-
您的模型不能放入单个设备中。
-
由于模型大小,您在选择较大的批次大小方面面临限制,例如模型加权占用了大部分 GPU 内存,而且您被迫选择较小、较不理想的批次大小。
要了解有关 SageMaker AI 分布式库的更多信息,请参阅以下内容: