跳转到内容

并行的五个维度

一个模型放不进一块卡之后,所有问题都变成"怎么切、切完怎么通信"。

切法只有有限几种。本章给出一页纸的总览——足以看懂任何一份并行配置。具体推导与工程细节在第四卷。

本章大量使用第六章的集合通信原语,没读过的话先回去看一眼。

维度切什么每卡还剩什么通信原语通信频率
DP 数据并行切批量完整模型All-Reduce(梯度)每步一次
TP 张量并行切算子内的矩阵每层的一部分All-Reduce(激活)每层两次
PP 流水线并行切层连续几层点对点 send/recv每 stage 边界
EP 专家并行切 MoE 专家部分专家All-to-All(token)每 MoE 层两次
CP 上下文并行切序列序列的一段点对点 或 All-to-All注意力内部

外加一个不是并行维度但总与 DP 一起说的东西:ZeRO / FSDP——它不改变计算的切法,只把 DP 下冗余存储的状态(优化器状态、梯度、参数)分片,用通信换显存。

最简单:每张卡放一份完整模型,各自算不同的数据,反向后同步梯度。

  • 通信:每步一次 all-reduce,量 = 参数量(与批量无关)。
  • 优点:实现简单、扩展性好、通信可与反向传播重叠(算完一层的梯度就开始发)。
  • 限制:每卡要放得下完整模型 + 优化器状态。70B 模型需要 1.1 TB 状态,单卡放不下 → 必须配 ZeRO/FSDP 或其他维度。
  • 隐含约束:DP 度数 = 全局批量 ÷ 单卡批量。全局批量不能无限大(过大会影响收敛),所以 DP 度数有上限。

ZeRO 三阶段:

阶段分片什么显存节省额外通信
ZeRO-1优化器状态~4×几乎没有
ZeRO-2+ 梯度~8×几乎没有
ZeRO-3 / FSDP+ 参数~pp×all-reduce → reduce-scatter + all-gather

ZeRO-1/2 几乎是免费的,应该默认开启;ZeRO-3 通信显著增加,与 TP/PP 叠加时要谨慎。

在算子内部切矩阵。以 MLP 为例:第一个线性层按列切、第二个按行切,中间不需要通信,末尾一次 all-reduce 合并部分和。注意力则按头切。

  • 通信:每层前向一次、反向一次 all-reduce,量 = 激活大小(批量 × 序列 × 隐层维度)。
  • 特点:通信极频繁,且在计算的关键路径上(不像 DP 的梯度可以延后发),对延迟敏感。
  • 限制:因此 TP 度数通常 ≤ 单节点卡数(一般是 8)。跨节点做 TP 几乎总是亏的——回顾第三章,节点内带宽比跨节点高约一个数量级。
  • 配套:序列并行(SP) 常与 TP 一起用,把 LayerNorm/Dropout 处的激活也沿序列维切开,消除 TP 遗留的激活冗余。SP 通常和 TP 绑定使用,不算独立维度。

按层切成若干 stage,每张卡负责连续几层,微批次(micro-batch)依次流过,像装配线。

  • 通信:最小——只在 stage 边界传激活,点对点。
  • 代价:气泡(bubble)。第一个微批次要走完所有 stage 才能开始反向,期间后面的 stage 在空转。朴素调度的气泡比例:
bubble=p−1m\text{bubble} = \frac{p - 1}{m}

(pp 为 stage 数,mm 为微批次数。)代入几个数:

ppmm气泡
4475%
8888%
83222%
86411%
1612812%

所以 PP 需要足够多的微批次,经验规则是 m≥4pm \ge 4p。

  • 调度演进:GPipe(先全部前向再全部反向,激活内存高)→ 1F1B(一前一后交错,峰值激活内存大幅降低)→ 交错式 1F1B(每卡拿不连续的多段层,进一步压气泡)→ 零气泡调度。
  • 适合:跨节点。通信量小,容忍较低带宽。

MoE 模型把 FFN 换成多个专家,每个 token 只路由到少数专家(比如 8 选 2)。EP 把专家分布到不同卡上。

  • 通信原语:all-to-all —— token 发到专家所在的卡,算完再发回来,一层两次。
  • 特点:all-to-all 对网络的要求与 all-reduce 完全不同,考验全互联带宽而非环形带宽。
  • 难点:负载不均衡。热门专家所在的卡忙死,冷门专家所在的卡空转,而集合通信要等最慢的。对策是容量因子(超出就丢弃)、辅助均衡损失、专家复制。

当序列长到单卡放不下激活(数十万 token),在序列维度切分。

两种主流做法:

方法通信特点
Ring Attention环形传递 KV 块(点对点)通信量随序列线性增长,但可与计算重叠
DeepSpeed-Ulyssesall-to-all 在"切序列"与"切头"间转换通信量小,但受注意力头数限制
  • 难点:因果掩码导致负载不均——后面的 token 要看前面所有 token,所以简单地按序列均分会让不同卡的工作量差好几倍。需要特殊的块分配策略。
维度参数优化器状态激活
DP(朴素)✗✗✗
DP + ZeRO-1/2✗✓✗
DP + ZeRO-3 / FSDP✓✓✗
TP✓✓✓(配 SP)
PP✓✓部分
EP✓(专家部分)✓✗
CP✗✗✓

按每步通信量与频率的综合排序:

TP>EP>DP≈CP>PP\text{TP} > \text{EP} > \text{DP} \approx \text{CP} > \text{PP}

正好相反:

PP>DP>CP>EP>TP\text{PP} > \text{DP} > \text{CP} > \text{EP} > \text{TP}

这两条排序合起来就是映射规则:通信最重的维度放在带宽最高的层级上。

现代大模型训练常见 3D 到 5D 并行。配置顺序:

  1. 先满足显存。 算出模型状态 + 激活的总量(第十一章给公式),用 TP × PP × ZeRO 把它压进单卡容量。放不下就没有下一步。
  2. TP 度数 ≤ 节点内卡数(通常 8),且优先用满——它省显存最有效,且节点内带宽最便宜。
  3. PP 跨节点,度数由"还差多少显存"决定;同时保证微批次数 m≥4pm \ge 4p 以控制气泡。
  4. 剩下的卡全给 DP,配 ZeRO-1/2。ZeRO-3 通信重,与 TP/PP 叠加时要实测。
  5. MoE 模型再加 EP,度数与专家数匹配,注意 all-to-all 的拓扑要求。
  6. 长上下文再加 CP。
  7. 最后调重叠:通信与计算重叠、梯度累积步数、激活重计算的粒度。

2048 张卡训一个 70B 稠密模型,典型配置:

TP=8⏟节点内×PP=4⏟跨节点×DP=64⏟剩余=2048\underbrace{\text{TP}=8}_{\text{节点内}} \times \underbrace{\text{PP}=4}_{\text{跨节点}} \times \underbrace{\text{DP}=64}_{\text{剩余}} = 2048

全局批量 = 64 × 单卡微批量 × 梯度累积步数。若单卡微批量 1、梯度累积 16,则每 PP stage 有 16 个微批次,气泡约 (4−1)/16≈19%(4-1)/16 \approx 19\%——偏高,可以增大梯度累积到 32 把气泡压到 10%。

推理的并行选择逻辑不同:

维度推理中的角色
TP仍是主力——降低单请求延迟、分摊权重显存
PP较少用,它增加延迟;只在显存实在不够时用
DP变成"多副本",由负载均衡器分发请求,而不是切批量
EPMoE 推理同样需要
CP长上下文推理需要
P/D 分离推理特有的新维度:按阶段而非按模型结构切分

关键差异:训练优化吞吐,所以愿意用 PP 换显存;推理优化延迟,PP 的 stage 间传递会直接加到每个请求的延迟上。

  • 五个维度:DP 切数据、TP 切矩阵、PP 切层、EP 切专家、CP 切序列;ZeRO/FSDP 是 DP 的显存优化而非新维度。
  • 通信量排序 TP > EP > DP ≈ CP > PP;跨节点能力排序正好相反——这两条合起来就是映射规则。
  • TP 度数通常 ≤ 8(节点内);PP 气泡比例 (p−1)/m(p-1)/m,经验规则 m≥4pm \ge 4p。
  • 配置顺序:先满足显存 → TP 吃满节点内 → PP 跨节点 → 剩下给 DP → MoE 加 EP → 长文加 CP → 最后调重叠。
  • 没有普适最优;跑三组实测胜过纸上推演一天。
  • 推理侧逻辑不同:TP 为主、PP 少用、DP 变多副本、新增 P/D 分离。