2、分布式训练基础:数据并行、模型并行、流水线并行、混合并行、通信原语
要诊断多机通信瓶颈,必须先理解分布式训练中“计算如何切分、梯度如何流动、通信发生在哪一层”。并行策略决定了通信原语的类型与频次,而通信原语又直接决定了带宽、延迟和同步开销。本节从并行维度出发,串联起 AllReduce、Broadcast、AllGather、ReduceScatter 四类核心原语,为后续瓶颈定位建立坐标系。
一、核心原理:四种并行策略的切分逻辑
数据并行(Data Parallel, DP)是最常见的策略:每张卡持有完整模型副本,输入数据被切分成不同 mini-batch。前向、反向在本地独立完成,反向结束后各卡持有局部梯度,必须通过 AllReduce 求平均,再各自更新参数。其瓶颈在于梯度体积与模型参数量成正比,通信量与卡数近似线性增长。
模型并行(Model Parallel, MP)把模型层内参数切分到不同设备。以矩阵乘法为例,权重按列切分后,各卡计算部分输出,再通过 AllGather 或 AllReduce 拼接结果。模型并行通信频繁、对带宽敏感,适合单层参数极大(如超大 Transformer 的 FFN)的场景。
流水线并行(Pipeline Parallel, PP)按层切分,不同设备负责不同 stage,通过 micro-batch 填充流水线。相邻 stage 之间只需点对点发送激活值(Send/Recv),通信量小,但存在流水线气泡(bubble),需要梯度累积与调度策略配合。
混合并行将上述策略组合:例如 DP + PP + TP(张量并行)。此时通信呈现分层结构——TP 组内高频 AllReduce,PP 组间点对点,DP 组间周期性 AllReduce。诊断时必须先确认“哪一层在通信”,否则容易误判。
二、方法流程:从计算图到通信原语
一次数据并行训练迭代的通信流程可拆解为:
- 各卡读取本地 mini-batch,前向计算得到 loss;
- 反向传播得到本地梯度
grad_i; - 执行 AllReduce,得到全局平均梯度
grad_avg = (1/N) * Σ grad_i; - 各卡用相同梯度更新参数,保证副本一致。
在混合并行中,流程变为分层执行。以 DP+TP 为例,TP 组内先做 AllReduce 完成层内归约,DP 组间再做 AllReduce 完成跨副本平均。若使用 ZeRO 或 FSDP,梯度会被 ReduceScatter 分片,再通过 AllGather 收集参数,通信模式从“一次大 AllReduce”变为“多次小原语”。
2 × (N-1)/N × 参数量 × 字节数。当参数量为 7B、FP16 时,单次 AllReduce 约 28GB 量级,这是多机瓶颈的根源。
三、案例/场景:7B 模型在 8 机 64 卡上的通信画像
假设 7B 模型采用 DP=8、TP=8 的混合并行,每张卡持有约 0.875B 参数。TP 组内每层需 AllReduce,层数 32,每层通信量约 0.875B × 2B × 2 ≈ 3.5GB,累计约 112GB;DP 组间每步一次 AllReduce,通信量约 28GB。若使用 25Gbps 网络,TP 组内通信时间将远超计算时间,表现为 GPU 利用率周期性跌落。
# 典型 NCCL 日志片段(诊断线索)
NCCL INFO AllReduce: 28.0 GB in 1.82 s -> 15.4 GB/s
NCCL INFO AllGather: 3.5 GB in 0.41 s -> 8.5 GB/s
NCCL INFO ReduceScatter: 14.0 GB in 0.95 s -> 14.7 GB/s
# 若带宽远低于链路标称值,优先排查拓扑与拥塞
四、误区与复盘
| 常见误区 | 实际原因 | 纠正方向 |
|---|---|---|
| “数据并行通信量固定” | 梯度压缩、ZeRO 分片会改变通信量 | 按实际原语与分片策略重新估算 |
| “模型并行一定比数据并行快” | 层内通信频次高,延迟敏感 | 结合带宽与延迟共同评估 |
| “流水线并行没有通信瓶颈” | 气泡与 stage 间激活传输仍占时间 | 关注 micro-batch 数与调度 |
| “AllReduce 和 AllGather 可互换” | 语义不同,输出形状与归约行为不同 | 按计算图需求选择原语 |