趋近智
当单个GPU不再足以满足您的训练需求时,无论是数据集庞大,还是模型本身非常大,您都必须将训练任务扩展到多个处理器。这就是分布式训练的范畴。通过分担工作负载,您可以大幅缩短模型训练所需的时间,从数周缩短到数天,或从数天缩短到数小时。然而,这并非简单地增加更多硬件。高效的分布式训练需要有策略地划分工作并协调结果。
分布式训练的主要挑战是通信。每当GPU需要同步时,它们都会花费时间彼此发送数据,而不是执行计算。您的目标是在最大化计算量的同时,最小化这种通信开销。实现此目标的两大主要策略是数据并行和模型并行。
数据并行是分布式训练中最常见且通常最直接的策略。其核心思想很简单:您在每个可用GPU上复制整个模型,但为每个GPU提供输入数据的不同片段。这是一种在相同时间内处理更大批次数据的有效方法。
使用数据并行执行单次训练步骤的过程通常遵循以下步骤:
在数据并行中,模型在每个GPU上复制。一批数据被分割,每个GPU处理其部分。然后,在更新每个模型副本之前,聚合生成的梯度。
数据并行的主要优点是它能够通过增加每秒处理的数据总量来加速训练。然而,其效果受限于GPU之间(例如,NVLink或PCIe)以及跨机器(网络)的通信带宽。它也不能解决模型过大无法放入单个GPU内存的问题,因为整个模型必须加载到每个设备上。
当您的模型非常庞大,拥有数十亿参数,以至于无法放入最大可用GPU的内存中时,会发生什么?这时模型并行就变得必要了。你不是复制模型,而是将模型本身分割到多个GPU上。
可以将其看作一条装配线。每个GPU负责执行模型层中的一个特定子集。
在模型并行中,模型的层被分割到多个GPU上。数据在前向传播(激活值)期间顺序流经GPU,梯度在反向传播期间反向流动。
这种简单方法的主要缺点是GPU利用率不足。当GPU 1工作时,GPU 0空闲,反之亦然。这通常被称为“流水线气泡”。更高级的技术,例如流水线并行(例如GPipe),通过将数据批次分割成更小的微批次并创建流水线来解决此问题,允许GPU同时处理不同的微批次以减少空闲时间。实现模型并行比数据并行复杂得多,并且通常仅在别无选择的情况下使用。
在大多数情况下,选择很明确:
在一些极端情况,例如训练先进的大型语言模型(LLM)时,这些技术会被结合使用。混合并行可能会使用模型并行在单个服务器节点内将庞大模型分割到多个GPU上,然后使用数据并行将这种多GPU设置复制到许多不同的服务器节点上。
手动管理梯度同步和数据传输既复杂又容易出错。幸运的是,主流深度学习框架提供了高级抽象来为您处理这些。
torch.nn.parallel.DistributedDataParallel (DDP)。你用DDP包装你的模型,它会自动处理数据分发、使用高效的All-Reduce算法聚合梯度,并保持模型副本同步。tf.distribute.Strategy API提供了灵活的分布式训练方式。对于一台或多台机器上的数据并行,tf.distribute.MirroredStrategy和tf.distribute.MultiWorkerMirroredStrategy是常见的选择。你定义策略,然后在策略范围内构建并编译模型,TensorFlow会处理分发逻辑。这些工具抽象掉了底层细节,允许您通过相对较少的代码更改,将单GPU训练脚本转换为分布式脚本。下一步是将这些策略付诸实践,我们将在实践实验中进行探讨。
这部分内容有帮助吗?
torch.nn.parallel.DistributedDataParallel, PyTorch Documentation, 2023 - PyTorch数据并行分布式训练主要工具的官方文档,详细说明了其用法和机制。MirroredStrategy。© 2026 ApX Machine Learning用心打造