13. 3D 并行(DP + TP + PP)怎么组合?为什么大模型训练要把三种并行叠在一起?
整理 3D 并行的组合策略、通信开销与拓扑映射。
简单回答
3D 并行是把数据并行(DP)、张量并行(TP)、流水线并行(PP)三种维度同时切分,用来训百亿到万亿规模的模型。单一维度切分都有上限——TP 切多了通信跨机器拖慢;PP 切多了 bubble 浪费算力;DP 切多了 micro-batch 放不下。三种组合后能把模型权重、激活、梯度同时分摊到几千张 GPU 上。组合的关键是按 硬件拓扑 分配——TP 在机内(高带宽 NVLink)、PP 跨机器但同 rack(中带宽)、DP 在最外层(最稀疏的通信)。Megatron-LM 这套组合是训练 70B 以上模型的标配。
详细解释
为什么单一并行不够
本专题第 01 篇讲过四种并行的区别。每一种单独用都有上限:
纯 DP 的瓶颈:模型必须能完整放进单卡显存。LLaMA-7B 全精度要 28GB,FSDP/ZeRO-3 切优化器状态也得 80GB 起。70B 模型单卡塞不下。即使能塞下,DP 的 micro-batch 太小训练效率也低。
纯 TP 的瓶颈:TP 的通信是在每个 transformer 层内部(每层至少 2 次 AllReduce),通信量大且频繁。一旦 TP 跨过单机 8 卡(NVLink 域),通信走 InfiniBand 就慢得多——TP=16 跨机的 MFU 比 TP=8 同机能掉 30-50%。所以 TP 实际上限就是机内 GPU 数。
纯 PP 的瓶颈:PP 把模型按层切成 N 段,每段在一台机器上跑。问题是 pipeline bubble——micro-batch 在流水线里 forward 走完才能开始 backward,bubble 的占比大约是 (N-1)/(N + micro_batch_count - 1)。流水线段数 N 越多 bubble 越大,超过 16 段一般效率就明显下降。
所以三种并行各有上限:DP 受单卡显存限制、TP 受机内带宽限制(≤ 8)、PP 受 bubble 限制(≤ 16)。要在几千张卡上训百亿到万亿模型,必须组合起来用。
3D 并行的组合形式
假设有 N 张 GPU,3D 并行把这 N 张卡按三个维度切分:
举例:1024 张 H100 训练 175B 模型,典型分配是 DP=8, TP=8, PP=16,正好 1024。每个 GPU 同时是某个 DP 副本的成员、某个 TP 组的成员、某个 PP 段的成员。
每张卡上保存的内容:
- 模型权重的 1/(TP × PP) ——按层切 PP 段,按张量切 TP
- 优化器状态的 1/(TP × PP × DP)(如果配 ZeRO-1)——再按 DP 切
- 激活的 1/(TP × PP)(每段流水线只保留自己那段的激活)
每张卡的实际显存压力比单一并行低一两个数量级。
通信模式
3D 并行下三种通信同时存在,频率和量不同:
TP 通信(最频繁):每个 transformer 层内部至少 2 次 AllReduce(attention 输出、FFN 输出),每秒上万次。通信量小但频率极高,对延迟敏感。必须走 NVLink。
PP 通信(次频繁):每个 micro-batch 在段间传递 activation(forward)和 gradient(backward)。通信量中等,频率中等。可以走 InfiniBand 但要尽量同 rack。
DP 通信(最稀疏):每个 step 结束做一次梯度 AllReduce。频率最低(每个 step 一次)但单次通信量最大(整个模型梯度)。可以走跨 rack 网络。
设计原则:通信频率越高的并行维度,要在物理上越靠近。
拓扑映射
GPU 集群有清晰的物理层级:单卡 → 单机内 NVLink 域(8 卡)→ 机柜(rack,几十张卡走 NVSwitch 或高速 IB)→ 整个集群(跨 rack 走 IB)。
3D 并行要按这个层级映射:
- TP → 机内 NVLink 域。8 卡机器 TP=8,所有 TP 通信都走 NVLink(带宽 600+ GB/s,几乎免费)
- PP → 跨机但同 rack。一段流水线在一台机器上,相邻段的机器物理相邻
- DP → 跨 rack。DP 副本之间 AllReduce 频率低,能容忍 IB 的 100-400 Gbps
这套映射做得好不好直接决定 MFU。同样的并行配置,物理映射不当 MFU 可能差 20-30%。Megatron-LM 和 DeepSpeed 都把这个做得很自动化,但用户仍然需要理解原理才能在异构集群上调好。
实际配置例子
几个真实模型的并行配置(公开数据):
Megatron-Turing 530B:用了 4480 张 A100,DP=35, TP=8, PP=16。TP=8 占满单机 NVLink,PP=16 跨 16 台机器,DP=35 在最外层。
LLaMA-70B(Meta 内部训练):约 2048 张 A100,DP=64, TP=8, PP=4。70B 模型不算特别大,PP 不需要切太多。
GPT-3 175B(公开估算):DP=8, TP=8, PP=64 左右。PP 切到 64 段是因为当时硬件单机显存有限,需要更多段才能塞下。现在的 H100 节点显存大,PP 可以少切。
DeepSeek-V3(公开论文):用了更复杂的混合策略。除了 3D 并行还有 MoE 的 EP(Expert Parallelism),形成 4D 并行。
工程上的微妙之处
Micro-batch size 的选择。PP 下需要把一个 batch 切成若干 micro-batch 在流水线里走,micro-batch 数 ≈ pipeline 长度才能填满 bubble。但 micro-batch 太小每次激活计算的算子启动开销占比上升。
Activation Recomputation 的层级化。3D 并行配 gradient checkpointing 时,重算策略也要分层——TP 内可以全 recompute,PP 段间存活的 activation 不重算。
优化器状态分片(ZeRO-1)叠加。3D 并行常配合 ZeRO-1 把优化器状态在 DP 维度上再切。这样 70B 模型的 Adam 状态(每参数 12 字节,70B 模型 840GB)能均匀分到几百张卡上。再加 ZeRO-2/3 切梯度和参数收益变小(已经被 TP/PP 切过了),通常不需要。
Loss scaling 和混合精度。3D 并行下不同维度的 reduce 操作要在合适精度上做——TP AllReduce 在 fp16/bf16 做(带宽友好),DP AllReduce 同样。Loss scaling 要在所有 DP 副本上一致。
Dataloader 的 sharding。DP 副本之间数据要不重不漏地切分。同一个 DP 副本内的 TP/PP 各 GPU 看到的是同一份数据。
容错和断点
3D 并行下任何一个 GPU 挂掉都让整个 job 中断。几千张卡的训练 job 平均每天会遇到 1-2 次 GPU 故障,所以容错机制必须做好(参考本专题第 09 篇)。
3D 并行的 checkpoint 是分布式的——每张卡只 save 自己负责的那部分参数和优化器状态。reload 时按相同的并行配置重组。如果重启时换了不同的并行度(比如从 1024 卡降到 512 卡),需要 resharding——把 checkpoint 按新并行度重新分片,这是个非平凡的工程操作。
不同框架的实现
Megatron-LM:NVIDIA 维护,3D 并行原生支持,配合 NVLink/NVSwitch 性能最好。学术界和工业界用得最多。
DeepSpeed:微软出的,重点在 ZeRO 系列优化器分片,3D 并行通过 DeepSpeed Pipeline Parallelism 支持。和 Megatron 可以结合(Megatron-DeepSpeed)。
FSDP(PyTorch 原生):本质是 DP + ZeRO-3,对 TP/PP 支持有限。适合中等规模(< 30B),70B+ 通常还是 Megatron 主导。
JAX + GSPMD:Google 的栈,把 3D 并行抽象为 mesh + sharding spec,自动化程度更高。Gemini、PaLM 都用这套。
业界从 2023 年开始有融合趋势——PyTorch 在 FSDP-2 中加强 TP/PP 支持,Megatron 也在更好地集成 PyTorch 原生组件。但目前训百亿以上模型 Megatron 仍然是主力。
面试时可以这样答
3D 并行是把 DP、TP、PP 三种并行同时切分。单一维度都有上限——DP 受单卡显存限制、TP 受机内带宽限制(一般 ≤ 8 不能跨机)、PP 受 bubble 限制(一般 ≤ 16)。要在几千张卡上训百亿万亿模型必须组合。
切分公式是 N = DP × TP × PP。每张卡同时是某个 DP 副本、TP 组、PP 段的成员。模型权重切到 1/(TP×PP)、优化器状态再按 DP 切。
关键是按硬件拓扑映射。TP 通信最频繁要走 NVLink,所以 TP 维度限定在机内 8 卡。PP 通信中等可以跨机但要同 rack。DP 通信最稀疏可以跨 rack 走 IB。映射做不好 MFU 能差 20-30%。
真实配置例子,Megatron-Turing 530B 用 DP=35 TP=8 PP=16 跑 4480 张 A100。LLaMA-70B 是 DP=64 TP=8 PP=4。GPT-3 175B 当年硬件显存小所以 PP=64。
工程细节包括 micro-batch 数要 ≈ pipeline 长度填满 bubble;ZeRO-1 通常叠在 DP 上切优化器状态;TP/PP 已经切过参数和梯度后 ZeRO-2/3 收益小;checkpoint 按并行度分布式存,换并行度要做 resharding。
框架上 Megatron-LM 是百亿以上模型的主力,DeepSpeed 在 ZeRO 优化器分片上强,FSDP 适合中小规模,JAX + GSPMD 是 Google 自家。趋势是逐步融合但当前训超大模型 Megatron 仍主导。
常见追问
- PP 的 bubble 怎么算?怎么用 1F1B、Interleaved Pipeline 这些技巧降低 bubble?
- TP 切 attention 的 head 维度时 GQA、MQA 模型怎么切?
- 3D 并行配 MoE 时 Expert Parallelism 怎么和 TP/PP/DP 融合成 4D 并行?