并行的五个维度
一个模型放不进一块卡之后,所有问题都变成"怎么切、切完怎么通信"。
切法只有有限几种。本章给出一页纸的总览——足以看懂任何一份并行配置。具体推导与工程细节在第四卷。
本章大量使用第六章的集合通信原语,没读过的话先回去看一眼。
| 维度 | 切什么 | 每卡还剩什么 | 通信原语 | 通信频率 |
|---|---|---|---|---|
| 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 下冗余存储的状态(优化器状态、梯度、参数)分片,用通信换显存。
数据并行(DP)
Section titled “数据并行(DP)”最简单:每张卡放一份完整模型,各自算不同的数据,反向后同步梯度。
- 通信:每步一次 all-reduce,量 = 参数量(与批量无关)。
- 优点:实现简单、扩展性好、通信可与反向传播重叠(算完一层的梯度就开始发)。
- 限制:每卡要放得下完整模型 + 优化器状态。70B 模型需要 1.1 TB 状态,单卡放不下 → 必须配 ZeRO/FSDP 或其他维度。
- 隐含约束:DP 度数 = 全局批量 ÷ 单卡批量。全局批量不能无限大(过大会影响收敛),所以 DP 度数有上限。
ZeRO 三阶段:
| 阶段 | 分片什么 | 显存节省 | 额外通信 |
|---|---|---|---|
| ZeRO-1 | 优化器状态 | ~4× | 几乎没有 |
| ZeRO-2 | + 梯度 | ~8× | 几乎没有 |
| ZeRO-3 / FSDP | + 参数 | ~× | all-reduce → reduce-scatter + all-gather |
ZeRO-1/2 几乎是免费的,应该默认开启;ZeRO-3 通信显著增加,与 TP/PP 叠加时要谨慎。
张量并行(TP)
Section titled “张量并行(TP)”在算子内部切矩阵。以 MLP 为例:第一个线性层按列切、第二个按行切,中间不需要通信,末尾一次 all-reduce 合并部分和。注意力则按头切。
- 通信:每层前向一次、反向一次 all-reduce,量 = 激活大小(批量 × 序列 × 隐层维度)。
- 特点:通信极频繁,且在计算的关键路径上(不像 DP 的梯度可以延后发),对延迟敏感。
- 限制:因此 TP 度数通常 ≤ 单节点卡数(一般是 8)。跨节点做 TP 几乎总是亏的——回顾第三章,节点内带宽比跨节点高约一个数量级。
- 配套:序列并行(SP) 常与 TP 一起用,把 LayerNorm/Dropout 处的激活也沿序列维切开,消除 TP 遗留的激活冗余。SP 通常和 TP 绑定使用,不算独立维度。
流水线并行(PP)
Section titled “流水线并行(PP)”按层切成若干 stage,每张卡负责连续几层,微批次(micro-batch)依次流过,像装配线。
- 通信:最小——只在 stage 边界传激活,点对点。
- 代价:气泡(bubble)。第一个微批次要走完所有 stage 才能开始反向,期间后面的 stage 在空转。朴素调度的气泡比例:
( 为 stage 数, 为微批次数。)代入几个数:
| 气泡 | ||
|---|---|---|
| 4 | 4 | 75% |
| 8 | 8 | 88% |
| 8 | 32 | 22% |
| 8 | 64 | 11% |
| 16 | 128 | 12% |
所以 PP 需要足够多的微批次,经验规则是 。
- 调度演进:GPipe(先全部前向再全部反向,激活内存高)→ 1F1B(一前一后交错,峰值激活内存大幅降低)→ 交错式 1F1B(每卡拿不连续的多段层,进一步压气泡)→ 零气泡调度。
- 适合:跨节点。通信量小,容忍较低带宽。
专家并行(EP)
Section titled “专家并行(EP)”MoE 模型把 FFN 换成多个专家,每个 token 只路由到少数专家(比如 8 选 2)。EP 把专家分布到不同卡上。
- 通信原语:all-to-all —— token 发到专家所在的卡,算完再发回来,一层两次。
- 特点:all-to-all 对网络的要求与 all-reduce 完全不同,考验全互联带宽而非环形带宽。
- 难点:负载不均衡。热门专家所在的卡忙死,冷门专家所在的卡空转,而集合通信要等最慢的。对策是容量因子(超出就丢弃)、辅助均衡损失、专家复制。
上下文并行(CP)
Section titled “上下文并行(CP)”当序列长到单卡放不下激活(数十万 token),在序列维度切分。
两种主流做法:
| 方法 | 通信 | 特点 |
|---|---|---|
| Ring Attention | 环形传递 KV 块(点对点) | 通信量随序列线性增长,但可与计算重叠 |
| DeepSpeed-Ulysses | all-to-all 在"切序列"与"切头"间转换 | 通信量小,但受注意力头数限制 |
- 难点:因果掩码导致负载不均——后面的 token 要看前面所有 token,所以简单地按序列均分会让不同卡的工作量差好几倍。需要特殊的块分配策略。
| 维度 | 参数 | 优化器状态 | 激活 |
|---|---|---|---|
| DP(朴素) | ✗ | ✗ | ✗ |
| DP + ZeRO-1/2 | ✗ | ✓ | ✗ |
| DP + ZeRO-3 / FSDP | ✓ | ✓ | ✗ |
| TP | ✓ | ✓ | ✓(配 SP) |
| PP | ✓ | ✓ | 部分 |
| EP | ✓(专家部分) | ✓ | ✗ |
| CP | ✗ | ✗ | ✓ |
按每步通信量与频率的综合排序:
谁能跨节点?
Section titled “谁能跨节点?”正好相反:
这两条排序合起来就是映射规则:通信最重的维度放在带宽最高的层级上。
怎么组合:七步决策流程
Section titled “怎么组合:七步决策流程”现代大模型训练常见 3D 到 5D 并行。配置顺序:
- 先满足显存。 算出模型状态 + 激活的总量(第十一章给公式),用 TP × PP × ZeRO 把它压进单卡容量。放不下就没有下一步。
- TP 度数 ≤ 节点内卡数(通常 8),且优先用满——它省显存最有效,且节点内带宽最便宜。
- PP 跨节点,度数由"还差多少显存"决定;同时保证微批次数 以控制气泡。
- 剩下的卡全给 DP,配 ZeRO-1/2。ZeRO-3 通信重,与 TP/PP 叠加时要实测。
- MoE 模型再加 EP,度数与专家数匹配,注意 all-to-all 的拓扑要求。
- 长上下文再加 CP。
- 最后调重叠:通信与计算重叠、梯度累积步数、激活重计算的粒度。
一个具体例子
Section titled “一个具体例子”2048 张卡训一个 70B 稠密模型,典型配置:
全局批量 = 64 × 单卡微批量 × 梯度累积步数。若单卡微批量 1、梯度累积 16,则每 PP stage 有 16 个微批次,气泡约 ——偏高,可以增大梯度累积到 32 把气泡压到 10%。
推理侧的并行
Section titled “推理侧的并行”推理的并行选择逻辑不同:
| 维度 | 推理中的角色 |
|---|---|
| TP | 仍是主力——降低单请求延迟、分摊权重显存 |
| PP | 较少用,它增加延迟;只在显存实在不够时用 |
| DP | 变成"多副本",由负载均衡器分发请求,而不是切批量 |
| EP | MoE 推理同样需要 |
| CP | 长上下文推理需要 |
| P/D 分离 | 推理特有的新维度:按阶段而非按模型结构切分 |
关键差异:训练优化吞吐,所以愿意用 PP 换显存;推理优化延迟,PP 的 stage 间传递会直接加到每个请求的延迟上。
- 五个维度:DP 切数据、TP 切矩阵、PP 切层、EP 切专家、CP 切序列;ZeRO/FSDP 是 DP 的显存优化而非新维度。
- 通信量排序 TP > EP > DP ≈ CP > PP;跨节点能力排序正好相反——这两条合起来就是映射规则。
- TP 度数通常 ≤ 8(节点内);PP 气泡比例 ,经验规则 。
- 配置顺序:先满足显存 → TP 吃满节点内 → PP 跨节点 → 剩下给 DP → MoE 加 EP → 长文加 CP → 最后调重叠。
- 没有普适最优;跑三组实测胜过纸上推演一天。
- 推理侧逻辑不同:TP 为主、PP 少用、DP 变多副本、新增 P/D 分离。
- 训练与推理的系统差异 — 上一章
- 规模与算力估算 — 下一章
- 集合通信原语与代价模型 — 本章的通信基础
- 混合并行与配置方法论 — 第四卷的详细展开