将神经网络训练扩展到多个GPU涉及在设备之间分布计算和数据以加速训练。主要有三种方法:数据并行、模型并行和流水线并行。数据并行是最常见的方法,每个GPU都持有一个完整的模型副本并处理训练数据的不同子集。通过在GPU之间平均梯度来同步模型更新。像 PyTorch 的 DistributedDataParallel
和 TensorFlow 的 MirroredStrategy
这样的框架可以自动化这一过程,使开发人员只需少量代码更改即可扩展训练。
模型并行将模型本身分割到多个GPU上,这在模型过大无法放入单个GPU时非常有用。例如,一个拥有数十亿参数的 transformer 模型可以将它的层分割到多个设备上。每个GPU计算正向和反向传播的一部分,并在设备之间传递中间输出。这需要仔细管理数据移动和同步。像 Megatron-LM 和 Mesh-TensorFlow 这样的库提供了有效分割模型的工具。流水线并行是模型并行的一个子集,它将模型划分为不同的阶段(例如,层组),并在阶段之间按顺序处理微批次数据,以重叠计算和通信。
为了有效实现多GPU训练,开发人员需要处理GPU之间的通信、优化批处理大小以及管理内存。像 PyTorch 这样的框架使用 NVIDIA Collective Communication Library (NCCL) 进行快速的GPU到GPU通信。批处理大小应与GPU数量成比例缩放(例如,8个GPU,基础批处理大小为32,总共将使用256)。梯度累积有助于在大批量下保持稳定性。像 NVIDIA 的 DeepSpeed 或 Horovod 这样的工具通过自动化梯度同步和混合精度优化来简化分布式训练。例如,DeepSpeed 的 Zero Redundancy Optimizer (ZeRO) 通过在GPU之间分割优化器状态来减少内存使用,从而能够大规模训练像 GPT-3 这样的模型。