混合并行与配置方法论
真实的千亿模型训练从不用单一并行方式,而是 TP × PP × DP(× SP/CP × EP)的 3D/4D 组合。本章给出配置的完整方法论:每种并行的"先后顺序"、每种度怎么从集群与模型的约束里推出来、以及一个可以直接套用的推导模板。
总原则:按通信代价排优先级
Section titled “总原则:按通信代价排优先级”四种并行通信量与频率完全不同,配置顺序就藏在这里:
| 优先级 | 并行 | 通信特征 | 为什么先/后 |
|---|---|---|---|
| ① | DP(ZeRO) | 每 step 一次梯度 all-reduce,可重叠 | 通信可藏,扩展最线性 |
| ② | TP + SP | 每层 4 次 all-reduce,GB 级 | 通信贵,必须 NVLink 域内 |
| ③ | EP | 每层 2 次 all-to-all | 通信贵且乱,尽量节点内 |
| ④ | PP | 每 step 2 次边界激活 | 通信最便宜,跨机可用,但气泡贵 |
| ⑤ | CP | 环形传 K/V | 只在长序列时启用 |
推导顺序(从零开始配一个训练):
- 先决定 TP:单层装不下的最小 TP 度(2/4/8),配 SP
- 再决定 EP(若是 MoE):专家数与卡数的匹配
- 再决定 PP:TP+EP 之后模型还装不下的部分,用 PP 跨机切层
- 剩下的全给 DP:数据并行的规模决定总吞吐
- 长序列才加 CP
一个完整的推导例子
Section titled “一个完整的推导例子”问题:7B 模型(dense,hidden 4096,32 层)、seqlen 8k、256 张 H100(32 节点 × 8 卡)、NVLink 域内 + 400G IB 跨机。
第一步:TP。 7B 单层装得下,但 8k 序列的激活大:batch 4 × 8k × 4096 的激活每层 ~6 GB,单卡还要装权重 14 GB + 激活 + KV。选 TP=4(配 SP):权重 3.5 GB、激活 ÷4。
第二步:PP。 TP=4 占 4 卡,单卡还有余量,理论上不用 PP。但 8k 序列的 KV/激活在大 batch 下会溢出——选 PP=2 摊一半层。
第三步:DP。 4 × 2 = 8 卡一组,256 ÷ 8 = DP=32。
第四步:验证。
- 气泡:PP=2,微批 M=32 → 气泡 ✅
- TP 通信:NVLink 域内 ✅
- DP 梯度同步:7B 梯度 14 GB ÷ 32 卡(ZeRO-1 分片),与反向重叠 ✅
- 全局 batch:32 DP × 4 微批 × 8k token ≈ 1M token/step,在稳定区间 ✅
配置:TP=4 × PP=2 × DP=32(+SP)。每一步都是约束推出来的,不是拍脑袋。
约束清单:每个度的上下限
Section titled “约束清单:每个度的上下限”每个并行度都有硬约束,配置前先对表:
| 度 | 上限约束 | 下限/代价约束 |
|---|---|---|
| TP | NVLink 域大小(8 或 72);单层激活被除后仍有余 | 每加一倍通信翻倍;能小则小 |
| PP | 全局 batch 允许拆出足够微批() | 气泡 线性涨 |
| DP | 集群剩余卡数;全局 batch 上限 | 梯度同步量 = 模型梯度,越大越贵 |
| EP | 专家数;网络容量(all-to-all) | 负载不均的失衡损失 |
| CP | 序列长度 ÷ CP 度 ≥ 单卡可承受 | 环形通信 + 负载不均 |
全局 batch 是所有度的交汇点:
它必须落在训练稳定区间(大模型典型 1M–64M token)——这个约束反过来限制 PP 的微批数、DP 的规模,是混合并行里最常被忽略的联动约束。
显存核算模板
Section titled “显存核算模板”配置定稿前,把单卡显存完整算一遍(7B、TP=4、PP=2、微批 4、8k 序列):
| 组成 | 计算 | 大小 |
|---|---|---|
| 权重 | 14 GB ÷ TP4 | 3.5 GB |
| 优化器状态 | 84 GB ÷ TP4 ÷(ZeRO-1 再除 DP) | ~0.1 GB |
| 梯度 | 14 GB ÷ TP4 | 3.5 GB |
| 激活(每层,有选择性重计算) | ~6 GB ÷ TP4 ÷ PP2 × 微批4 | ~3 GB × 层数摊销 |
| KV/杂项 | — | ~2–4 GB |
| CUDA 上下文 | 固定 | ~1–2 GB |
| 合计 | ~20–30 GB ✅ |
留 20–30% 余量给碎片与峰值——显存打满是 OOM 的第一来源。
调优顺序:从大到小
Section titled “调优顺序:从大到小”配置跑起来后,调优按收益排序:
- MFU 基线:先算理论 step time(见效率与成本卷),对比实测,差距大再细查
- 重叠确认:DP 梯度同步、PP 激活传输是否与计算重叠(利用率曲线锯齿 = 没重叠)
- TP 通信:节点内 all-reduce busbw 应 >85%(见 NCCL)
- 气泡:PP 气泡占比实测 vs 公式
- 负载均衡:EP 的 max/mean、CP 的负载分布
- 微批与 batch:在稳定区间内微调
| 反模式 | 症状 | 修正 |
|---|---|---|
| TP 跨机 | step time 慢 5–10 倍,节点内正常 | TP 收回 NVLink 域内 |
| PP 太深微批太少 | 利用率锯齿 + 均值低 | 减 PP 或加微批 |
| 无脑最大 batch | loss 曲线异常/不稳 | 回到稳定区间,梯度累积调 |
| 显存打满 | OOM 随机出现 | 留 20–30% 余量 |
| CP 用在短序列上 | 慢而显存没省 | 短序列关 CP |
- 配置顺序:TP(节点内)→ EP → PP(跨机)→ DP(剩余全给)→ CP(长序列才加)。
- 每个度有硬约束:TP 上限是 NVLink 域,PP 要求微批 ≥ 4p,全局 batch 是交汇约束。
- 推导模板:约束驱动,每一步"装不下的最小切分",不是拍脑袋。
- 显存核算模板 + 20–30% 余量;OOM 的第一来源是打满。
- 调优从 MFU 基线开始,逐层往下查重叠、通信、气泡、负载均衡。
- 数据并行与 ZeRO / FSDP — 基础层
- 张量并行 / 流水线并行 — 两个正交维度
- 拓扑:胖树、轨道优化与并行映射 — 配置落到网络上的位置
- MFU 与利用率 — 调优的起点指标