✨ 复制成功!

以文会友,打造好学人设!

📋 已复制到剪贴板:

分布式训练中,通信瓶颈通常出现在哪些环节?All-Reduce、All-Gather、Reduce-Scatter 分别用在什么并行策略里?如何判断是计算受限还是通信受限?

创建时间:2026-09-18 更新时间:2026-09-18 阅读次数:1307 次 分类:分布式训练与工程优化

一、 问题框架

分布式训练中,通信瓶颈和计算受限的判断是性能优化的核心问题。

大模型训练通常需要多卡、多机协作,卡与卡之间需要频繁同步数据。如果通信速度跟不上计算速度,GPU 就会空等,利用率下降。

这道题涉及三个层面:

  • 通信瓶颈出现在哪些环节:梯度同步、参数广播、激活传输、优化器状态同步等;
  • 三种集合通信的用途:All-Reduce、All-Gather、Reduce-Scatter 分别服务于哪种并行策略;
  • 如何判断计算受限还是通信受限:通过 profiling、利用率、扩展性测试等手段定位。

二、通信瓶颈通常出现在哪些环节

1、数据并行中的梯度同步

数据并行中,每张卡用不同数据计算梯度,然后需要同步梯度。

最常见的是 All-Reduce:

  • 每张卡都有完整梯度;
  • 所有卡的梯度求平均或求和;
  • 结果广播回所有卡。

通信量约为:

$$ 2 \times \frac{N-1}{N} \times \Psi $$

其中 $N$ 是卡数,$\Psi$ 是参数量。当 $N$ 很大时,通信量趋近于 $2\Psi$。

这是数据并行最主要的通信开销。

2、数据并行中的参数广播

如果使用 ZeRO-1 或 ZeRO-2,优化器状态和梯度被切分:

  • 每张卡只更新自己负责的那部分参数;
  • 更新完后需要把参数同步回所有卡;
  • 这一步通常是 All-Gather 或 Broadcast。

ZeRO-1/2 每个 step 末尾会有一次参数同步。

3、ZeRO-3 中的参数 All-Gather

ZeRO-3 切分了模型参数:

  • 每张卡只保存一部分参数;
  • 前向计算某一层时,需要 All-Gather 该层完整参数;
  • 反向传播时同样需要再次 All-Gather;
  • 每层都要通信,次数多、通信量大。

这是 ZeRO-3 通信开销上升的主要原因。

4、张量并行中的层内通信

张量并行把单层矩阵切分到多张卡:

  • 按列切分时,输出需要拼接,通常用 All-Gather;
  • 按行切分时,部分和需要相加,通常用 All-Reduce;
  • Transformer 中每层 Attention 和 MLP 都有通信。

张量并行通信频率极高,几乎每层都要通信,所以通常只在节点内做,依赖 NVLink 高带宽。

5、流水线并行中的激活传输

流水线并行按层切分模型:

  • 前一个 stage 算完,把激活传给下一个 stage;
  • 这是点对点通信(Send/Recv);
  • 通信量相对较小,但存在流水线气泡。

如果 stage 划分不均衡,或者 micro-batch 调度不好,也会造成等待。

6、优化器状态同步

使用 Adam 等优化器时:

  • 一阶动量、二阶动量需要同步;
  • 如果不用 ZeRO,每张卡都保存完整优化器状态;
  • 如果使用 ZeRO,优化器状态被切分,通信模式改变。

7、检查点保存和加载

训练中定期保存 checkpoint:

  • 所有卡的数据需要汇聚;
  • 写入存储可能成为瓶颈;
  • 加载时也需要分发。

虽然不频繁,但大规模训练中影响明显。

8、通信瓶颈的典型表现

  • GPU 利用率低,比如只有 30%–50%;
  • 训练速度随卡数增加不升反降;
  • Profiling 显示大量时间花在 NCCL 通信上;
  • 扩展效率随卡数增加明显下降。

三、All-Reduce、All-Gather、Reduce-Scatter 的用途

1、All-Reduce

语义:所有卡各自有一份数据,操作后所有卡都得到相同的归约结果。

比如每张卡有梯度 $g_i$,All-Reduce 求和后每张卡都得到:

$$ g = \sum_{i=1}^{N} g_i $$

用在哪些并行策略:

  • 数据并行:梯度同步,最典型;
  • 张量并行:按行切分时,部分和需要 All-Reduce 相加;
  • ZeRO-1/2:梯度同步阶段。

通信量:约 $2\Psi$,是数据并行的主要开销。

2、All-Gather

语义:每张卡有一份分片数据,操作后每张卡都得到完整数据。

比如每张卡有参数分片 $W_i$,All-Gather 后每张卡都得到:

$$ W = [W_1, W_2, \dots, W_N] $$

用在哪些并行策略:

  • ZeRO-3:前向和反向时收集完整参数;
  • 张量并行:按列切分时,输出拼接;
  • 数据并行 + ZeRO-1/2:参数同步;
  • FSDP:参数收集。

通信量:与参数量成正比。

3、Reduce-Scatter

语义:每张卡有一份完整数据,操作后每张卡只得到归约结果的一部分。

比如每张卡有梯度 $g_i$,Reduce-Scatter 后第 $j$ 张卡得到:

$$ g^{(j)} = \sum_{i=1}^{N} g_i^{(j)} $$

其中 $g_i^{(j)}$ 是第 $i$ 张卡梯度的第 $j$ 个分片。

用在哪些并行策略:

  • ZeRO-2:梯度切分,每张卡只保存自己负责的梯度分片;
  • ZeRO-3:梯度切分;
  • 数据并行 + ZeRO:减少显存占用。

通信量:与 All-Reduce 相当,但每张卡只存一部分结果。

4、三者的关系

All-Reduce 可以分解为:

$$ \text{All-Reduce} = \text{Reduce-Scatter} + \text{All-Gather} $$

这也是 Ring All-Reduce 的实现思路:

  • 先 Reduce-Scatter,每张卡得到部分归约结果;
  • 再 All-Gather,把各部分拼成完整结果。

ZeRO 正是利用这个分解,把中间状态切分开,降低显存。

5、汇总表

通信操作 语义 主要用途
All-Reduce 所有卡得到相同归约结果 数据并行梯度同步、张量并行按行切分
All-Gather 所有卡得到完整数据 ZeRO-3 参数收集、张量并行按列切分、FSDP
Reduce-Scatter 每张卡得到部分归约结果 ZeRO-2/3 梯度切分
Broadcast 一张卡广播给所有卡 参数初始化、参数同步
Send/Recv 点对点传输 流水线并行激活传输

四、如何判断是计算受限还是通信受限

1、看 GPU 利用率

最直接的方法:

  • 计算受限:GPU 利用率高,比如 80%–100%,SM 活跃;
  • 通信受限:GPU 利用率低,比如 30%–50%,大量时间在等通信。

可以用 nvidia-smi、nvtop、dcgm 等工具观察。

2、看 Profiling 时间分布

用 PyTorch Profiler、Nsight Systems、Nsight Compute 等:

  • 统计前向、反向、通信各占多少时间;
  • 如果 NCCL 通信占比高,说明通信受限;
  • 如果 CUDA kernel 占比高,说明计算受限。

典型判断:

  • 计算受限:CUDA kernel 时间占比 > 70%;
  • 通信受限:NCCL 时间占比 > 30%。

3、看扩展效率

固定模型和 batch size,增加卡数:

  • 计算受限:吞吐随卡数近似线性增长;
  • 通信受限:吞吐增长放缓,甚至下降。

定义扩展效率:

$$ \text{Scaling Efficiency} = \frac{\text{吞吐}(N)}{\text{吞吐}(1) \times N} $$

如果扩展效率随 $N$ 增加明显下降,说明通信或同步开销变大。

4、看计算通信比

估算每步的计算量和通信量:

$$ \text{Compute/Communication Ratio} = \frac{\text{FLOPs}}{\text{Bytes}} $$

如果这个比值高,说明计算密集,通信相对不是瓶颈;如果比值低,说明通信密集。

大模型训练中,随着模型变大,计算量增长快于通信量,通常更偏计算受限;但随着卡数增加,通信量也增加,可能转为通信受限。

5、看 batch size 的影响

  • 增大 batch size,计算量增加,通信量不变;
  • 如果吞吐明显提升,说明之前是计算受限或 GPU 没喂饱;
  • 如果吞吐不变,说明通信或显存是瓶颈。

6、看并行策略

  • 数据并行:通信主要在梯度 All-Reduce,通信量与参数量成正比;
  • 张量并行:通信频繁,几乎每层都有,对带宽要求高;
  • 流水线并行:通信量小,但气泡可能导致等待;
  • ZeRO-3:通信量大,容易通信受限。

7、看网络拓扑

  • 节点内 NVLink:带宽高,通信受限可能性小;
  • 跨节点 InfiniBand:带宽较低,通信受限可能性大;
  • 跨节点以太网:带宽更低,通信瓶颈更明显。

8、看具体指标

常用指标:

  • SM 利用率:低说明计算没喂饱;
  • 显存带宽利用率:高说明显存受限;
  • NCCL 带宽:看是否跑满网络;
  • 通信等待时间:看 GPU 空等比例。

9、判断流程总结

第一步,看 GPU 利用率:

  • 高,偏计算受限;
  • 低,偏通信受限或数据加载受限。

第二步,看 Profiling:

  • CUDA kernel 占比高,计算受限;
  • NCCL 占比高,通信受限;
  • DataLoader 占比高,数据加载受限。

第三步,看扩展性:

  • 增加卡数吞吐线性增长,计算受限;
  • 增加卡数吞吐不涨,通信受限。

第四步,看 batch size:

  • 增大 batch 吞吐提升,之前没喂饱;
  • 增大 batch 吞吐不变,通信或显存瓶颈。

五、通信瓶颈的常见优化手段

1、计算通信重叠

  • 反向传播时,梯度算完一层就通信一层;
  • 用 bucket 把梯度分组,边算边通信;
  • PyTorch DDP 的 bucket_cap_mb 就是做这个。

2、梯度累积

  • 多个 micro-batch 累积梯度,减少通信次数;
  • 用时间换通信。

3、通信压缩

  • 梯度量化,比如 FP16、INT8;
  • 梯度稀疏化,只传大梯度;
  • 减少通信量,但可能影响精度。

4、拓扑感知

  • 张量并行放节点内,利用 NVLink;
  • 流水线并行跨节点,通信量小;
  • 数据并行放最外层。

5、使用高效通信库

  • NCCL:NVIDIA GPU 标配;
  • Gloo:CPU 和异构;
  • MPI:传统 HPC。

6、调整并行策略

  • 通信受限时,减少张量并行度;
  • 增加流水线并行,减少跨节点通信;
  • 用 ZeRO-1 代替 ZeRO-3,减少通信。

六、简单评价这道面试题

1、这道题的价值

  • 这是分布式训练性能优化中非常核心的一道题;
  • 一道题能考察通信环节、集合通信语义、计算通信判断三个层面;
  • 区分度好,初级可能只知道 All-Reduce,中级能说清三种通信的用途,高级能讲清 profiling 和优化手段;
  • 贴近实战,大模型训练调优必须掌握这些。

2、这道题的不足

  • 题目偏综合,如果候选人没有实际调优经验,容易答得空泛;
  • 没有涉及具体数字,比如给定模型和卡数算通信量;
  • 没有涉及 NCCL 内部实现,比如 Ring、Tree 算法;
  • 对计算通信重叠的考察可以更深入。

3、建议的追问方向

  • Ring All-Reduce 的原理是什么?为什么通信量是 $2\Psi$?
  • 如何估算一个模型的通信时间?
  • 计算通信重叠具体怎么实现?
  • 梯度累积和通信优化的关系是什么?
  • 跨节点训练时,如何选择并行策略减少通信?

4、总体评价

这是一道很好的分布式训练系统面试题,适合考察候选人对通信瓶颈和性能优化的理解。它既能考察集合通信的基础语义,也能延伸到 profiling 和实际调优。如果候选人能把通信瓶颈环节、三种集合通信的用途、计算通信判断方法以及常见优化手段都讲清楚,基本可以判断其具备分布式训练性能优化的扎实基础。


📌 面试天下网:一款服务于上班族的口袋书,让大家在地铁里/公交上可以学习大模型技术!
📌 网站公告:【悬赏 200 元/篇】寻找“大模型面试战场”的一手回忆录
📌 网站公告:【大模型/Agent面试陪练1V1指导】正式启动......

评论专区

评论加载中...