📑 本页目录(点开跳转)
14 · 并行策略怎么组合
⏱ 22 分钟 | ⭐⭐ 把前四章拼成一个能用的方案
🎯 一句话
数据并行、张量并行、流水线并行不是三选一,是三个维度。 而它们的排列顺序不是偏好问题 —— 是第 5 章的带宽算出来的唯一答案。
🏛️ 一、黄金法则
⭐ 按【通信频率】从高到低,映射到【带宽】从高到低的层级:
张量并行 TP → 通信最频繁(每层 4 次) → 放【机内 NVLink】
流水线并行 PP → 通信较少(每切分点一次)→ 放【跨机】
数据并行 DP → 通信最少(每步一次) → 放【最外层】
一个 64 卡(8 机 × 8 卡)的典型配置:
TP=8 ← 机内 8 张卡,走 NVLink
PP=4 ← 4 组机器,跨机传激活
DP=2 ← 剩下的维度做数据并行
8 × 4 × 2 = 64 ✅
🔑 记住这个顺序的方法: 通信最凶的贴着最快的线。 就这一句。
🧭 二、决策流程(照着走)
① 模型能装进一张卡吗(含优化器状态)?
是 → 【纯数据并行 + ZeRO-2】,结束 ⭐
否 ↓
② 上 ZeRO-3 / FSDP 能装下吗?
是 → 【FSDP】(多机用 HYBRID_SHARD),结束 ⭐
否 ↓
③ 单层能装进一张卡吗?
否 → 必须加【张量并行】(TP ≤ 8,机内)
是 ↓
④ 还是装不下?
→ 加【流水线并行】(跨机,注意 M ≥ 4P)
⑤ 是 MoE 模型?
→ 加【专家并行 EP】(见下)
⑥ 序列特别长(≥32K)?
→ 加【序列/上下文并行】
⭐ 最重要的一条:能用 FSDP 解决就别上 3D 并行。 3D 并行的工程复杂度是数量级的差别 —— 调试、checkpoint、 负载均衡、超参都会变难。只在 FSDP 真的不够时才上。
📐 三、怎么定各个维度的大小
TP:先定它,且不超过 8
TP = 让【单层能装下】的最小值,且 ≤ 单机卡数
⭐ 判断依据:单层参数 + 单层激活 < 单卡显存的 60%
⭐ TP=8 是甜点,TP=16 通信占比已经很难看(第 12 章)
PP:让每级的显存刚好装下
PP ≈ 总层数 / (单卡能装下的层数)
⚠️ 然后检查气泡:M ≥ 4P(第 13 章)
如果全局 batch 不够大到支撑 M ≥ 4P,
→ 说明 PP 太大了,往回调 ⭐
DP:剩下的全给它
DP = 总卡数 / (TP × PP)
⚠️ DP 太大时,全局 batch 会大到影响收敛
→ 这时该考虑增大 micro-batch 或减少 DP
💡 一个常被忽略的约束:全局 batch
全局 batch = micro_batch × M × DP
⚠️ 它不能无限大:
· 太大 → 收敛变差(大 batch 泛化问题)
· 太小 → M 不够,气泡大;DP 的通信占比也高
⭐ 实践中常常是【先定一个合理的全局 batch】,
再反推 DP、M、micro_batch 的组合
🧠 四、MoE 的专家并行(EP)
MoE:每个 token 只激活少数几个专家
→ 参数量巨大但计算量不变
⭐ 专家并行:把不同的专家放到不同的卡上
GPU0: 专家 1-2 GPU1: 专家 3-4
GPU2: 专家 5-6 GPU3: 专家 7-8
每个 token 经过路由后,被【All2All】发送到对应专家所在的卡
算完再 All2All 送回来
| 特点 | 说明 |
|---|---|
| 通信原语 | All2All(第 5 章),不是 AllReduce ⭐ |
| 通信量 | 中等,但模式不规则 |
| 主要难点 | ⭐ 负载不均衡 —— 有的专家被路由到很多 token,有的很少 |
| 常见解法 | 辅助损失鼓励均衡、容量因子(超出就丢弃)、专家容量上限 |
💥 负载不均衡是 MoE 训练最头疼的问题: 如果 90% 的 token 都路由到同一个专家, 那张卡就成了瓶颈,其他卡在等它 —— 整个集群的效率被一张卡拖垮。
🧵 五、序列/上下文并行(长序列时)
问题:序列 128K 时,激活显存爆炸(即使有 FlashAttention)
✅ 上下文并行(Context Parallel / Ring Attention):
把【序列维度】切开分给多卡
attention 需要全局信息 → 用环形通信传递 K、V
⭐ 和 TP 正交,可以叠加
💡 这是 128K+ 上下文训练的必需品。 Ring Attention 的思路和 FlashAttention 一脉相承 —— 都是"分块 + 增量累积 softmax",只是一个在片上分块,一个跨卡分块。
📋 六、几个真实配置参考
| 场景 | 配置 |
|---|---|
| 7B 微调,8 卡 | FSDP(HYBRID_SHARD)+ 梯度检查点,不用 TP/PP ⭐ |
| 7B 预训练,64 卡 | DP=64 + ZeRO-2 ⭐ |
| 70B 预训练,512 卡 | TP=8, PP=8, DP=8 + 序列并行 |
| 175B+ 预训练,数千卡 | TP=8, PP=16, DP=n + 交错式 1F1B |
| MoE(如 8×7B),64 卡 | EP=8, TP=1~2, DP=剩余 |
| 长上下文(128K) | 上下文并行 + TP + FSDP |
⭐ 注意第一行和第二行:大部分人的实际场景是这两行。 3D 并行是千卡以上才需要考虑的事 —— 别过度设计。
🔬 七、怎么验证你的配置是对的
① 算 MFU(第 4 章)—— 低于 35% 说明配置有问题
② 分别测:
· 只开 DP 的单步时间
· 加上 TP 后的单步时间 → 差值就是 TP 的通信开销
· 加上 PP 后的单步时间 → 差值就是气泡 + PP 通信
③ 用 profiler 看 nccl kernel 的占比
④ ⭐ 做一次【扫描实验】:固定总卡数,试几组 (TP, PP, DP)
# ⭐ 一个实用的扫描脚本骨架
for tp in [1, 2, 4, 8]:
for pp in [1, 2, 4, 8]:
dp = total_gpus // (tp * pp)
if dp < 1: continue
if micro_bs * n_micro * dp != global_batch: continue
run_benchmark(tp, pp, dp) # 记录 MFU 和单步时间
🔑 不要凭理论选配置 —— 实测扫描 30 分钟,能省下几周的低效训练。 理论只用来缩小搜索范围(比如 TP ≤ 8),最终答案靠测。
🔗 和站内其他章的关系
| 相关的地方 | 这里的位置 |
|---|---|
| 第 5 章 带宽层级 | 黄金法则的唯一依据 ⭐ |
| 第 10 章–13 章 | 本章把它们拼起来 |
| 第 11 章 HYBRID_SHARD | 决策树第二步 |
| 第 4 章 MFU | 验证配置的标准 |
| 第 8 章 分块累积 | Ring Attention 同源 |
| 《大模型全景导论》04 训练三阶段 预训练占 99% 算力 | 那边给的是"要烧多少算力",本章是这些算力怎么切到卡上 |
| 《强化学习基础》12 RLHF 全流程 阶段 3 的工程现实 | 四个模型各要一套并行配置(两个在训、两个冻结)—— 本章决策流程最难的一次实战 ⭐ |
✅ 检查点
- 黄金法则是什么?用一句话概括记忆方法。
- 64 卡(8 机×8 卡)的典型配置是什么?
- 决策流程的第一步是什么?最重要的一条建议是什么?
- TP 怎么定?为什么不超过 8?
- PP 定完后要检查什么?不满足怎么办?
- 全局 batch 的约束是什么?实践中的定法?
- MoE 用什么通信原语?最头疼的问题是什么?
- 上下文并行和 FlashAttention 有什么共同点?
- 怎么验证配置是对的?为什么不能只凭理论?
👀 答案
- TP 放机内 NVLink、PP 跨机、DP 最外层。记忆方法:通信最凶的贴着最快的线。
- TP=8(机内)、PP=4(跨机)、DP=2,8×4×2 = 64。
- 第一步:模型能装进一张卡吗(含优化器状态)——能就纯 DP + ZeRO-2。最重要的建议:⭐能用 FSDP 解决就别上 3D 并行,它的工程复杂度是数量级差别。
- TP = 让单层能装下的最小值,判断依据是单层参数+激活 < 单卡显存 60%。不超过 8 是因为跨机带宽撑不住(TP 通信量和 TP 度无关但计算被分摊,TP=16 通信占比已很难看)。
- 检查气泡:M ≥ 4P。如果全局 batch 不够大到支撑 M ≥ 4P,说明 PP 太大了,要往回调。
- 全局 batch = micro_batch × M × DP。太大收敛变差,太小则 M 不够气泡大、DP 通信占比高。实践:先定一个合理的全局 batch,再反推 DP、M、micro_batch。
- All2All(不是 AllReduce)。最头疼的是负载不均衡——如果 90% 的 token 路由到同一个专家,那张卡成为瓶颈,整个集群被一张卡拖垮。解法:辅助损失、容量因子。
- 都是分块 + 增量累积 softmax——FlashAttention 在片上分块,Ring Attention 跨卡分块。
- ①算 MFU(<35% 有问题)②分别测只开 DP / 加 TP / 加 PP 的单步时间,差值就是各自开销 ③profiler 看 nccl 占比 ④做扫描实验。不能只凭理论是因为实测扫描 30 分钟能省下几周的低效训练——理论只用来缩小搜索范围,最终答案靠测。
🛑 可以停在这里
⚡ 走神救援
⭐⭐三种并行不是三选一,是三个维度,排列顺序由带宽唯一决定。⭐黄金法则:TP 放机内 NVLink、PP 跨机、DP 最外层——记忆方法是「通信最凶的贴着最快的线」;64 卡典型配置 TP=8 × PP=4 × DP=2。决策流程:①装得进一张卡 → 纯 DP + ZeRO-2 ②ZeRO-3/FSDP 能装下 → FSDP(多机 HYBRID_SHARD) ③单层装不下 → 必须加 TP(≤8,机内) ④还不够 → 加 PP(注意 M≥4P)⑤MoE → 加 EP ⑥超长序列 → 上下文并行。⭐最重要的一条:能用 FSDP 就别上 3D 并行(工程复杂度是数量级差别)。定维度:TP 取"让单层装下"的最小值(单层参数+激活 < 单卡显存 60%);PP 定完必须检查 M≥4P,不满足说明 PP 太大要回调;DP 拿剩下的。⭐常被忽略的约束:全局 batch = micro_batch × M × DP,太大收敛差、太小气泡大 → 实践是先定合理的全局 batch 再反推。MoE 的专家并行用 All2All(不是 AllReduce),⭐最头疼的是负载不均衡(90% token 路由到同一专家 → 整个集群被一张卡拖垮),解法是辅助损失和容量因子。上下文并行(Ring Attention)切序列维度,和 FlashAttention 同源——都是"分块+增量累积 softmax",一个片上一个跨卡。真实配置:⭐7B 微调 8 卡就用 FSDP+梯度检查点,不要 TP/PP;7B 预训练 64 卡用 DP+ZeRO-2;70B/512 卡才是 TP=8,PP=8,DP=8——3D 并行是千卡以上的事,别过度设计。⭐验证靠实测扫描(固定总卡数试几组 TP/PP/DP),30 分钟的扫描能省几周的低效训练;理论只用来缩小搜索范围。
下一节 👉 15-推理和训练是两回事.md ⭐⭐