并行策略
先把分布式训练看成四个问题
分布式训练不是“卡越多越快”,而是在多张 GPU 之间拆分数据、模型、训练状态和通信:模型放不下看显存拆分,单层太大看张量并行,层数太多看流水线并行,吞吐不够再扩大数据并行。
一张表先看清每种并行
| 策略 | 解决什么问题 | 核心通信 | 放置直觉 |
|---|---|---|---|
| DP / DDP | 扩大吞吐,吃更多数据 | 每步 AllReduce 梯度 | 拓扑要求相对低,可跨节点 |
| TP | 单层矩阵太大或单层计算太重 | 每层 AllGather / ReduceScatter | 尽量放在同节点 NVLink/NVSwitch 内 |
| PP | 模型层数太多,整模型放不进单卡 | 相邻 stage 传激活和梯度 | 可以跨节点,但要减少 stage 间跳数 |
| EP | MoE 专家分布在不同 GPU | All-to-All | 需要高 bisection bandwidth |
| ZeRO / FSDP | 参数、梯度、优化器状态占显存太多 | AllGather / ReduceScatter | 通常作为 DP 的显存优化层 |
选型路径
分布式训练选型可以按“先能放下,再跑得快,再排得好”的顺序判断,不要一开始就堆所有并行策略。
| 判断问题 | 优先方案 | 原因 |
|---|---|---|
| 模型状态放不下 | ZeRO-2 / ZeRO-3 / FSDP | 先减少每卡必须常驻的训练状态 |
| 单层参数或 attention 太大 | TP | 把层内矩阵切到多张卡上计算 |
| 层数太多、激活峰值高 | PP + activation checkpointing | 把不同层放到不同 stage,降低单卡常驻压力 |
| 模型能放下但吞吐不够 | DP / DDP | 复制模型副本,吃更多数据 |
| MoE 专家很多 | EP | 专家分布式放置,按 token routing 通信 |
3D 并行的拓扑放置
大模型训练常见组合是 TP × PP × DP。总 GPU 数满足:
放置原则比公式更重要:TP 的通信最频繁,优先限制在单节点高速互联内;PP 只在相邻 stage 传激活,通常可以跨节点;DP 每步同步梯度,频率低于 TP,可以放在最外层扩吞吐。
| 并行维度 | 推荐位置 | 为什么 |
|---|---|---|
| TP | 节点内 4/8 卡 | 每层多次通信,跨节点延迟和带宽都容易成为瓶颈 |
| PP | 跨节点 stage | 通信量主要是激活和梯度,低于 TP |
| DP | 多条 pipeline 副本之间 | 每步同步一次梯度,适合做吞吐扩展 |
数据并行:最常见、也最容易被低估的并行方式
数据并行(Data Parallelism, DP)的核心是:每张 GPU 持有一份完整模型,处理不同数据分片,每个 step 后同步梯度,保证所有副本参数一致。它的优点是实现简单、扩展直观;缺点是模型和优化器状态仍然需要每卡完整保存,通信瓶颈集中在梯度同步。
DP / DDP 基础链路
| 阶段 | 每张卡做什么 | 通信行为 | 面试重点 |
|---|---|---|---|
| Forward | 用本地 mini-batch 计算 loss | 通常无跨卡通信 | 每卡模型副本完整 |
| Backward | 计算本地梯度 | 梯度 bucket ready 后启动 AllReduce | DDP 会按 bucket 重叠通信和反向计算 |
| Optimizer Step | 用同步后的梯度更新参数 | 无额外通信或少量状态同步 | 所有副本参数保持一致 |
| Next Step | 读取下一批数据 | 重复上述过程 | DataLoader/I/O 也可能成为瓶颈 |
梯度同步通信量
如果模型参数量为 P,每个梯度用 FP32 表示,即 4 bytes/parameter,则一次梯度张量大小约为:
Ring AllReduce 中,每张卡的网络收发总量近似为:
当 N 很大时,近似为:
通信-计算重叠:DDP 性能的关键
DDP 不会等所有梯度都算完才统一通信,而是把参数分成多个 bucket。某个 bucket 的梯度 ready 后就立刻 AllReduce,同时后面的层继续反向计算。
| 机制 | 作用 | 风险 |
|---|---|---|
| bucket | 把小梯度合并成较大通信块 | bucket 太小启动开销高,太大重叠差 |
| overlap | 通信隐藏在 backward 计算后面 | 如果网络慢或模型小,仍然暴露通信尾巴 |
| gradient accumulation | 多次 backward 后再同步 | 有效 batch 变大,可能影响收敛 |
| no_sync | 累积期间禁用 DDP 同步 | 忘记恢复同步会导致参数不一致 |
回答思路:先说明每卡看到的数据不同,再说明梯度平均的数学意义,最后解释 AllReduce 的工程价值。
DP 中每张卡处理不同 mini-batch,算出的本地梯度只代表本地数据。如果直接各自更新,模型副本会逐渐发散。
AllReduce 会把所有 GPU 的梯度求和并广播回每张卡,通常再除以 world size,得到等价于更大 batch 上的平均梯度。
AllReduce 是去中心化集合通信,没有单点参数服务器瓶颈,适合 GPU 间高带宽同步。
回答思路:先讲等价条件,再讲差异和副作用。
如果累积 k 个 micro-batch 后再做 optimizer step,在不考虑 BatchNorm、dropout 随机性和数值误差时,接近于把 batch size 扩大 k 倍。
累积期间可以不做 AllReduce,等 k 次 backward 后再同步一次,通信频率降低为原来的 1/k。
有效 batch 变大后,学习率、warmup、梯度裁剪、loss scale 都可能需要重新调参。
回答思路:明确参数量、梯度 dtype、Ring AllReduce 公式,再代入计算。
7B 参数,如果梯度用 FP32 保存,则梯度张量约为:
8 卡 Ring AllReduce 每张卡收发总量约为:
这不是总集群流量,而是每张 GPU 网卡/互联上的近似收发量;如果网络带宽不足,这部分会成为 step time 的尾部。
张量并行与流水线并行:一个切层内,一个切层间
张量并行(TP)解决“单层矩阵太大或单层计算太重”的问题;流水线并行(PP)解决“层数太多、整模型放不进单卡”的问题。二者经常组合:TP 放在节点内 NVLink 域,PP 可以跨节点。
TP vs PP 对比
| 维度 | 张量并行 TP | 流水线并行 PP |
|---|---|---|
| 切分对象 | 每层矩阵、attention head、MLP 中间维度 | 模型层序列 |
| 通信模式 | AllGather、ReduceScatter、AllReduce | 相邻 stage Send/Recv |
| 通信频率 | 每层多次,频率极高 | 每个 micro-batch 跨 stage 传激活/梯度 |
| 拓扑要求 | 强,优先 NVLink/NVSwitch | 中等,可以跨节点但要减少跳数 |
| 主要风险 | 跨节点 TP 会极慢 | pipeline bubble 降低利用率 |
TP 的矩阵切分直觉
以线性层 Y = XW 为例,列并行把 W 按输出维度切成多份:
行并行则把输入维度切分,局部结果需要 ReduceScatter 或 AllReduce 合并。
PP 的 Bubble 公式
流水线并行把 batch 切成 m 个 micro-batch,在 p 个 stage 上流动。1F1B 调度下,理想 bubble 比例可近似为:
所以 stage 越多 bubble 越大,micro-batch 越多 bubble 越小。但 micro-batch 数受 global batch size、显存和收敛约束限制。
回答思路:先说明 TP 通信频率高,再比较 NVLink 和跨节点 IB 的带宽/延迟差异。
TP 不是每 step 通信一次,而是每一层 forward/backward 都可能 AllGather 或 ReduceScatter。96 层模型一轮训练可能触发数百次集合通信。
跨节点网络不仅带宽低于 NVLink,还会增加延迟。频繁的小/中等消息会被延迟放大。
通常 TP 度不超过单节点 GPU 数,例如 8×A100 节点上 TP=8,跨节点部分交给 PP 或 DP。
回答思路:先给公式,再解释 p 和 m 的影响,最后给工程优化手段。
1F1B 调度下近似:
p 是 stage 数,m 是 micro-batch 数。
如果 p=4、m=12:
增加 micro-batch、减少 PP stage、使用 interleaved 1F1B、平衡每个 stage 的层数和计算量。
回答思路:先用公式算 DP,再给拓扑放置原则。
总 GPU 数等于三种并行度乘积:
如果每节点 8 卡,则每个 TP group 正好占一台机器;两个 PP stage 占两台机器;DP=2 表示有两条完全相同的 pipeline 副本,总共 4 台机器。
TP group 内通信走 NVLink,PP stage 间走 IB,DP 同步梯度频率较低,可以跨 pipeline 副本做 AllReduce。