分布式训练的核心思想与目标
分布式训练的主要并行范式
根据如何“拆分”任务,主要有以下几种并行策略,通常会组合使用:

数据并行
这是最常用、最直观的分布式训练方式。
- 怎么做:
- 优点:实现相对简单,通信模式固定(主要是梯度同步),对于模型可以放进单卡的情况非常有效。
- 缺点:每个设备都需要存储完整的模型和优化器状态,对于超大规模模型,单卡显存仍然不够。
- 通信核心:All-Reduce 操作(特别是对梯度进行求和或求平均)。
模型并行
当模型太大,单个设备放不下时,就需要拆分模型本身。
- 怎么做:
- 将模型的网络结构在层间或层内进行切分,不同的部分放置在不同的计算设备上。
- 数据(一个Mini-Batch)需要依次流过这些设备来完成前向传播,反向传播时梯度则反向传递。
- 优点:可以训练巨大的模型。
- 缺点:会引入设备间的通信依赖和等待空闲,设备2必须等待设备1完成计算后才能开始工作,导致设备利用率不足(“气泡”问题)。
- 典型技术:流水线并行 是模型并行的一种优化形式。
流水线并行
这是对朴素模型并行的改进,旨在解决设备闲置问题。
- 怎么做:
- 同样将模型按层切分到不同设备上。
- 将训练数据分成更小的 “微批次”。
- 像工厂流水线一样,当第一个微批次在设备2上计算时,第二个微批次可以立刻在设备1上开始计算,从而让多个微批次在不同设备上同时处理,提高设备利用率。
- 核心挑战:需要精心调度微批次,处理流水线启动和排空时的“气泡”。
张量并行(层内并行)
一种更细粒度的模型并行,将单个层内部的运算(如一个大型矩阵乘法)拆分到多个设备上。
- 怎么做:将一个大的权重矩阵按行或列切分,每个设备持有矩阵的一部分,共同协作完成该层的计算。
- 代表:NVIDIA的 Megatron-LM 就大量使用了张量并行来训练百亿、千亿级参数的Transformer模型。
- 通信特点:通信通常发生在层内计算期间,通信模式比数据并行复杂。
混合并行
在实际训练超大规模模型(如百亿、万亿参数)时,几乎没有单一并行策略,工程师会组合使用上述所有策略:
- 数据并行 在不同 组 的设备间使用。
- 张量并行 在 组内 设备间使用,以放下一个巨大的层。
- 流水线并行 在 组间 使用,以放下整个模型。
使用1024个GPU训练一个大模型时,可能会先分成8组流水线(流水线并行),每组128个GPU;这128个GPU内部再通过张量并行紧密协作;如果有更多数据需要并行,可以为整个系统再配置多份副本进行数据并行。
分布式训练的关键技术组件
-
通信后端:负责设备间的数据交换。
-
同步 vs 异步更新:
- 同步(Synchronous):等待所有设备的梯度都计算完成后,同步(平均)梯度,再更新,主流方法,训练稳定,但速度受限于最慢的设备。
- 异步(Asynchronous):设备计算完梯度后立即更新中心参数,不等待其他设备,训练速度快但可能不稳定,现已较少使用。
-
参数服务器架构 vs 集合通信架构:
-
ZeRO(Zero Redundancy Optimizer):
- 由微软DeepSpeed提出的一种革命性的优化器状态分区技术。
- 核心思想:消除数据并行中的内存冗余,它将优化器状态、梯度、甚至模型参数本身分区存储在所有设备上,每个设备只负责更新自己那部分。
- 在通信时,按需从其他设备收集所需的参数。ZeRO-Offload 和 ZeRO-Infinity 还能进一步将部分数据卸载到CPU内存甚至NVMe硬盘,实现了在有限GPU资源下训练超大模型的能力。
分布式训练是当代大规模深度学习训练的基石,其演进路径是: 单卡训练 -> 数据并行(加速)-> 模型/流水线并行(放大模型)-> 张量并行(更细粒度放大)-> 混合并行 + ZeRO(训练千亿/万亿模型)。
对于入门者,从理解数据并行和梯度同步开始最为重要,而对于希望训练或使用大模型的从业者,需要深入理解混合并行策略以及像 PyTorch DDP, FSDP(PyTorch对ZeRO的实现), DeepSpeed 这样的框架和工具。