分布式并行全景:从单卡到万卡
摘要:训练一个放不进单卡显存的模型,本质上是回答三个问题:把什么切开(参数 / 梯度 / 激活 / 专家)、切到多少份(并行度)、切开后怎么同步(通信原语与网络拓扑)。本文从单卡出发,逐层推导出混合并行配置,并给出可直接套用的选型决策树。
1. 起点:单卡为什么装不下
以 70B 参数、BF16 精度的大模型为例,仅模型权重就需要约 140 GB(70 × 10⁹ × 2 bytes),加上 Adam 优化器状态(2 份动量 + 1 份方差,约 420 GB)、梯度(140 GB)、激活值,单卡 H100 的 80 GB 显存远远不够。
单卡显存占用 = 权重 140G + 梯度 140G + 优化器状态 420G + 激活
≈ 700 GB 以上(70B BF16 全参训练)这就是分布式训练的起点:显存放不下,就必须把状态切到多张卡上。
2. 并行策略:六种"切法"
2.1 数据并行(DP)—— 切数据
每张卡持有完整模型副本,各吃一份不同的 batch,前向反向后做一次全归约(AllReduce)同步梯度。
- 通信量:每步同步 2 × 模型参数量(梯度),与数据量无关。
- 适用:模型单卡放得下,数据量 / 吞吐是瓶颈。
- 瓶颈:显存不省,通信与 batch 呈反比(batch 越大同步占比越低)。
2.2 ZeRO(零冗余优化器)—— 切优化器状态
数据并行的"省显存"变体:把优化器状态、梯度、甚至权重按 DP rank 分片,各卡只维护自己的分片,用时通过 AllGather 取回。
- ZeRO-1 只切优化器状态;ZeRO-2 切优化器+梯度;ZeRO-3 三者全切(激活另算)。
- 代价:通信量从 2× 参数涨到约 2.7×~3× 参数(多了 AllGather 权重)。
- 适用:小规模(≤32 卡)微调、长上下文、低成本场景。DeepSpeed ZeRO / FSDP 都是工程实现。
2.3 张量并行(TP)—— 切权重矩阵
把单个线性层的权重矩阵按行/列切成多份,分布在不同卡上,前向一次需要 2 次 AllReduce(forward 一次、backward 一次)。
- 通信量:每层每次 2 × 该层激活,与参数量无关,随序列长度和 batch 放大。
- 通信频率极高(每个 Transformer 层都要同步),要求卡间低延迟高带宽:优先放在同一节点内(NVLink)或同一 Pod 的同一 leaf 交换机下。
- 适用:单机多卡起步的必然选择;千卡以上时 TP 度一般 ≤ 8,避免跨交换机放大。
2.4 流水并行(PP)—— 切层
把 Transformer 层切成连续段(stage),每卡只算一段,数据像流水线一样逐段流过。
- 通信量:每步仅 2 × 层间激活(一次 send/recv),是并行策略里通信最省的。
- 代价:流水线气泡(bubble),微批数量 = 2×(PP-1) 时气泡理论最小(Gpipe);PP≥4 时通常配合微批调度(1F1B)。
- 适用:显存紧张、跨节点时的显存扩展手段;与 TP 互补(TP 管单层内部,PP 管层之间)。
2.5 序列并行(SP)—— 切序列
把序列长度维度切开,配合 TP 把 LayerNorm / Dropout 等逐 token 操作分片,省下激活显存,几乎不增加通信。
- 适用:超长上下文(如 128K/1M tokens)训练,激活显存随序列线性增长的场景。
- 实践中常以"TP + SP"组合出现(如 Megatron-LM 的序列并行)。
2.6 MoE 专家并行(EP)—— 切专家
MoE 模型的专家网络按卡分片,token 通过 All-to-All 路由到对应专家卡,算完再路由回来。
- 通信量:2 × 路由 token 量,随 batch 放大,且是 All-to-All(全局模式,最依赖网络拓扑)。
- 适用:MoE 大模型(如 Mixtral、DeepSeek-MoE)训练与推理;通常需要大带宽 + 低拥塞网络(全连接拓扑 / 高 radix 交换)。
3. 混合并行:怎么组合
真实训练几乎不会只用一种并行。以典型 LLM 训练为例:
大模型训练 = 数据并行(最外层) × 张量并行(单机内) × 流水并行(跨节点) × 序列/专家并行(可选)组合原则:
- TP 优先打底:8 卡 H100 节点内 NVLink 全互联,TP=8 通信成本可接受;TP 不跨节点(除非节点内卡数 < 8)。
- PP 按显存缺口决定:70B 在 8×80G 节点上,TP=8 仍放不下,就需要 PP=2 或更大,此时 PP 跨节点是允许的(通信量小)。
- DP 填满算力:剩下不够用的算力全部用 DP(或 ZeRO/FSDP)补齐。
- EP 只给 MoE:普通稠密模型用不到 All-to-All。
典型配置速查(BF16 全参训练)
| 模型规模 | 单卡显存 | 典型并行 | 最少卡数 | 说明 |
|---|---|---|---|---|
| 7B | 80 GB | DP/ZeRO-3 | 8~32 | 单节点即可,主要瓶颈是通信占比 |
| 13B | 80 GB | TP=8 + DP | 16~64 | 单节点 TP=8 打底 |
| 70B | 80 GB | TP=8 + PP=2~4 + DP | 64~256 | 节点内 TP,节点间 PP |
| 175B+ | 80 GB | TP=8 × PP=8~16 × DP | 512+ | 需要 3D 混合并行 + 密集网络 |
| MoE 千卡级 | 80 GB | TP=4~8 × EP + DP | 1000+ | All-to-All 流量大,需高 radix 拓扑 |
4. 通信量估算:网络够不够
选型前先算通信占比(training-time communication overhead)。核心公式:
每步通信量 ≈ 2×参数(梯度同步) + 2×TP层间激活(TP) + 2×层间激活(PP) + 2×路由token(EP)
网络需求 ≈ 通信量 ÷ (全局带宽 × 训练步数 × 利用率)工程经验值:
- AllReduce 梯度同步(DP/ZeRO):7B 每步约 14 GB,千卡集群 IB NDR 400G 单卡带宽约 50 GB/s,通信占比约 5~15%。
- TP=8 的层间 AllReduce:激活随序列增长,序列 4K、batch 512 时单层通信可达 GB 级;TP 通信占比通常 10~25%。
- 若估算通信占比 > 30%,先降 TP 或加大 batch,而不是盲目加卡——加卡在通信占比高时可能负收益(通信时间超过计算节省)。
5. 选型决策树
模型放不进单卡?
├─ 显存缺口小(≤2×):ZeRO-3 / FSDP 最省事
├─ 显存缺口大但节点内可容纳:TP=8 → 不够再 PP
├─ 必须跨节点:PP 跨节点(通信省) + TP 不跨节点
└─ MoE 模型:EP + 高 radix 网络,先验证 All-to-All 带宽
网络侧配套检查:
├─ 节点内:NVLink(TP 必需)
├─ 节点间:IB/RoCE 全连接或高 radix(PP/EP 必需)
└─ 机柜/集群级:ECMP 散列均匀 + PFC/ECN(AllReduce/All-to-All 必需)6. 常见误区
- "卡越多越快":通信占比超过计算占比后,扩展效率(scaling efficiency)断崖下跌,7B 在 512 卡以上通常不如加大 batch。
- "TP 度越大越好":TP 通信最密集,TP=16 跨节点时,AllReduce 延迟可能抵消全部收益。
- "ZeRO-3 万能":ZeRO-3 通信量比 DP 高约 50%,千卡级训练优先用真实 DP + 完整模型副本,而不是 ZeRO-3。
- "只看模型并行不看拓扑":EP/大 DP 的 AllReduce 需要全网均匀带宽,胖树(Fat-Tree)与 Dragonfly 的散列行为差异极大,务必先用
nccl-tests实测。
下一步:并行策略定好后,网络能不能兜住,见 NCCL 网络调优实战。