单卡放不下模型,无非三个东西可以切:数据、层的权重矩阵、层本身。三种切法分别演化出数据并行(DP)、张量并行(TP)、流水并行(PP),它们不是互斥选项,而是同一本账的三个章节:每个方案都在"切什么、通信多少、显存省多少"三个维度上做不同取舍。
数据并行:切 batch,通信是梯度的全部-reduce
每卡持有完整模型副本,各跑一个数据分片,反向结束后同步梯度:
$$ g = \frac{1}{N}\sum_{i=1}^{N} g_i \qquad (\text{all-reduce over } N\ \text{卡}). $$
通信量:每张卡要发出并接收约 $2\cdot\frac{N-1}{N}\cdot P$ 个参数量的数据(all-reduce 可由 reduce-scatter + all-gather 两步实现,各 $P\cdot\frac{N-1}{N}$),$P$ 是参数量。对一个 7B 模型,fp32 梯度 28 GB,这一步在单机 NVLink 上是秒级,跨机走 InfiniBand 就要掂量了。通信频次是每优化器步一次,可以通过梯度桶化、通信计算重叠(backward 算出一桶发一桶)藏掉大半。
显存:模型状态(权重+梯度+优化器)每卡一份,原样复制——DP 不省模型本身的显存,只切数据和激活。
张量并行:切矩阵,通信嵌进每层前向
把一个线性层 $Y = XW$ 按列切成 $N$ 份:$W = [W_1, \dots, W_N]$,各卡算 $Y_i = XW_i$,再把输出拼接——$X$ 在每卡都有完整副本,计算天然并行。Megatron-LM 的核心观察是:Transformer 的 MHA 和 FFN 都能组织成这种"先切后合"的形式,且每一次切分对应的 all-reduce 都能和下一次切分的输入复用,每个 Transformer 块在 forward 只需 2 次 all-reduce(attention 输出合一次、FFN 输出合一次),backward 是 2 次(等价于 forward 的转置),合计每块 4 次。
通信量:频次高(每层 4 次)、单次小。单次传输的是激活而非梯度——大小为 $\text{seq} \times \text{hidden} \times 2$ 字节(bf16),对一个 4k 序列、4096 宽度的激活只有约 32 MB,比 DP 整模型梯度小三个数量级。但频次高意味着延迟敏感,all-reduce 必须在微秒级完成,否则每层都在等。这就是 TP 必须住在单机 NVLink 域内(8 卡)的原因:跨机做一次 all-reduce 的毫秒级延迟会被乘上"层数 × 4",直接吞掉计算收益。
显存:权重、梯度、优化器状态按 $N$ 分片,每卡只存 $1/N$——TP 是真省模型显存的。
流水并行:切层,通信只有激活但引入气泡
把 $L$ 层切成 $N$ 段,第 $i$ 段驻在第 $i$ 组卡上:第 1 组算完第 1 段的激活,发给第 2 组继续。通信只发生在段边界,单次是一个 micro-batch 的激活(前向)和梯度(反向),通信量与 DP/TP 比可以忽略。代价在别处:流水线气泡。朴素串行调度下,$N$ 段流水跑 $m$ 个 micro-batch,总时间里有 $\frac{N-1}{m+N-1}$ 的比例在等别人——段间数据依赖导致首尾的 ramp-up 和 ramp-down 阶段机器是闲的。m 越大气泡越小,所以 PP 天然要配大的 micro-batch 数,并配合 1F1B(one-forward-one-backward)交错调度把气泡压到 $\frac{N-1}{m}$ 附近。另一个麻烦是显存不均衡:调度不好的实现里,负责中间段的卡同时要抱多个 in-flight micro-batch 的激活,成为显存热点,需要 interleaved 1F1B(把层切成更细的虚段交错排布)来缓解。
显存:模型状态按层切 $1/N$,激活只存本段的——PP 省模型显存,激活占用取决于调度。
把账放在一起:以 175B 量级为例
三种并行对一个参数量为 $\Psi$、宽度 $h$、层数 $L$ 的模型:
| 维度 | DP | TP | PP |
|---|---|---|---|
| 切的对象 | 数据 batch | 权重矩阵(列/行) | 层序列 |
| 每步通信量 | $2\Psi$(梯度,fp32) | 每层 4 次,每次 $4 \cdot b \cdot s \cdot h$ 字节级 | 每 micro-batch 2 次边界传输 |
| 通信频次 | 每优化器步 | 每层 × 4 | 每 micro-batch × 2 |
| 延迟敏感度 | 低(可重叠) | 极高(必须 NVLink) | 低(批量传输) |
| 模型显存 | 不省(复制) | 省 $1/N$ | 省 $1/N$ |
| 附加成本 | 无 | 无 | 气泡 $\approx\frac{N-1}{m}$ |
GPT-3 175B 的排布是教科书案例:8 卡 TP(单机内),单机 8 卡再切 PP(跨机),最外层 DP 复制若干这样的"机组"。选这个排布的理由直接从账本读出:TP 的延迟要求锁死单机,PP 的通信量小适合跨机,DP 放最外层是因为它的通信虽然大但最易重叠、且副本间无需高频同步。如果只有 DP,175B 的 fp32 优化器状态(Adam 的 $m,v$ 加 master weights 约 $16\Psi$ 字节 ≈ 2.8 TB)没有任何单机能装下——三种并行在显存维度是叠加关系,缺一不可。
小结
三种并行回答三个不同问题:DP 回答"数据太多怎么加速",代价是每步一次大 all-reduce;TP 回答"矩阵太大怎么切",代价是嵌进每层的高频小通信,锁死单机;PP 回答"层数太深怎么切",代价是流水线气泡和调度复杂度。组合的次序(TP→PP→DP 由内到外)由通信的延迟敏感度决定。下一篇的 ZeRO 可以看做 DP 的升级版:不动模型切分,先把 DP 复制浪费的显存省回来。