Skip to content

通信与并行正文

页面目标

这页把“多卡为什么慢”“并行策略怎么选”“通信热点怎么查”这三件事展开成正文。

适用人群

  • 想把单卡训练扩到多卡的人。
  • 正在判断该用 ZeRO、Pipeline 还是 Tensor Parallelism 的人。
  • 想把通信等待、气泡和吞吐放在一起看的人。

不适用人群

  • 只关心单卡算子优化的人。
  • 还没建立 batch、同步、AllReduce 基本概念的人。
  • 不打算看 benchmark 或通信热点的人。

你应该如何开始读

  • 先读 05 -> 20,把通信原语和拓扑关系看懂。
  • 再读 06 -> 27 -> 28 -> 29,确定该用哪种并行切分。
  • 如果你关心实际扩展效果,再看 42 -> 34 -> 31
  • 最后回到 2.8,把策略选择和训练目标对齐。

故事线

一个最常见的并行故事,是“GPU 明明加了,训练还是没快”。最开始大家通常会怀疑模型太大,或者单卡算子太慢;但真正把链路拆开以后,问题往往是同步等待、micro-batch 气泡和通信 overlap 没做好。

第一步先看 05 -> 20,把通信原语和拓扑关系讲清楚。 第二步再看 06 -> 27 -> 28 -> 29,决定到底该切状态、切层还是切算子。 第三步再看 42 -> 34 -> 31,确认通信热点和基准结果是否证明并行策略真的值。 最后回到 2.8,把策略判断和训练目标重新对齐。

这个故事的重点不是“多卡就快”,而是不同切分层级解决的是不同问题,必须先分清代价从哪来。

具体案例

案例 1:8 卡训练,速度没有线性提升

现象是:从 1 卡扩到 8 卡,显存确实降了,但训练时间没有按预期下降。
判断链路是:先看 05 -> 20,确认同步原语和拓扑关系;再看 42 -> 34,确认通信等待和 overlap 是否已经吞掉收益。

常见结果是:

  • 如果 sync 占比高,说明 AllReduce 或同步开销在拖慢。
  • 如果 bubble 高,说明流水线没有排满。
  • 如果 overlap 低,说明通信和计算没真正重叠起来。

这个案例的重点是:加卡只是把显存问题拆开,不代表训练一定更快。

案例 2:ZeRO 后显存降了,但 step time 变长

现象是:启用 ZeRO 后,显存明显下降,但每步耗时却增加。
判断链路是:先看 06 -> 27,确认状态切分是否有效;再看 42 -> 34 -> 31,确认收益是不是被更多的通信和管理开销吃掉。

常见结论是:

  • 如果状态切分有效但访问更频繁,时间代价会上升。
  • 如果 benchmark 没对齐 workload,结论会被误判。

这个案例的重点是:显存收益和时间收益不是同一个方向,必须一起看。

案例 3:Tensor Parallelism 在小 batch 下不划算

现象是:算子内部切分后,通信频率变高,小 batch 场景下收益不明显。
判断链路是:先看 29 -> 42,确认切分后的通信压力;再看 42 -> 34 -> 31,确认真实吞吐是否被通信成本抵消。

这个案例的重点是:并行策略要和切分层级、batch 规模、通信拓扑一起看,不能只看理论扩展性。

专题主线

这页不是按单个并行方法罗列,而是按“通信原语 -> 并行切分 -> 调度与代价 -> 基准验证”的链路来读。

主线关注的问题适合先看
通信原语主线NCCL 和 AllReduce 到底在做什么05 -> 20
显存分摊主线ZeRO 怎么把参数、梯度和优化器状态拆开06 -> 27
流水线主线Pipeline Parallelism 的 micro-batch 和气泡怎么理解28 -> 34
张量切分主线Tensor Parallelism 的切分和同步代价怎么判断29 -> 42
选型验证主线怎么把并行策略的收益和通信代价算清楚42 -> 34 -> 31

一页速记

层级你主要关心什么在本专题里怎么看
计算层单卡算子和单步前向/反向是否合理先看基础模块,再判断是不是本身就算得慢
切分层参数、梯度、激活该怎么分到多卡上重点看 ZeRO / Pipeline / Tensor Parallelism
通信层同步、AllReduce、Overlap 和等待时间重点看 42 -> 34 -> 31 这条验证链
验证层多卡扩展到底有没有收益最后回到 benchmark,确认吞吐和气泡是否改善

建议阅读顺序

  1. 先看 05 -> 20,把通信原语和拓扑关系立住。
  2. 再看 06 -> 27 -> 28 -> 29,判断该用 ZeRO、Pipeline 还是 Tensor Parallelism。
  3. 最后看 42 -> 34 -> 31,把通信热点和收益验证闭环起来。

典型案例

加卡不加速

如果 GPU 数量增加了但速度没涨,先别假设“模型太大”,而是先查是不是同步等待过高。05 -> 20 能先把原语和拓扑关系说明白,42 -> 34 能把通信热点和等待时间坐实。

并行策略选择

如果要选并行策略,先看切分层级:状态切分用 ZeRO,层切分用 Pipeline,算子内部切分用 Tensor Parallelism。对应阅读是 06 -> 2728 -> 3429 -> 42

通信是否重叠成功

很多优化看起来通信少了,但其实只是被挪到了别处。要用 42 -> 34 看 overlap 和 idle time,确认通信是不是被真正藏进计算间隙。

典型阅读链

  • 如果你想先理解多卡通信原理,先读 05 -> 20,把通信拓扑和 AllReduce 先讲通。
  • 如果你想先理解显存是怎么被并行策略切开的,先读 06 -> 27,把 ZeRO 的收益和代价讲清楚。
  • 如果你想先理解流水线为什么会有气泡,先读 28 -> 34,把 micro-batch、排布和基准结果串起来。
  • 如果你想先理解张量切分的通信压力,先读 29 -> 42,把切分方式和通信热点串起来。
  • 如果你想先看并行策略值不值,先读 42 -> 34 -> 31,把通信 profile、分布式 benchmark 和最终收益连起来。

对照表

场景先看什么重点差异
只想看同步05 -> 20先确认通信原语和拓扑
要选并行法06 -> 27 / 28 / 29区分状态切分、层切分和算子切分
多卡不加速42 -> 34 -> 31看等待、气泡和 overlap
想做扩展2.8看策略如何和训练目标对齐

进一步展开

1. 先看通信层级

  • 如果是参数/梯度同步,先看 AllReduce
  • 如果是状态切分,先看 ZeRO
  • 如果是层切分,先看 Pipeline
  • 如果是算子内部切分,先看 Tensor Parallelism

2. 再看资源代价

  • 通信是否把计算间隙吃掉了。
  • micro-batch 是否造成了气泡。
  • 显存分摊是否真的换来了规模提升。

3. 最后看验证口径

  • 只看显存不够,要看时间。
  • 只看单卡不够,要看多卡。
  • 只看一次实验不够,要看 benchmark。

FAQ

  • ZeROTensor Parallelism 能一起用吗?可以,但它们解决的是不同层面的切分问题,组合后要额外关注通信复杂度和调度边界。
  • Pipeline Parallelism 为什么常常会有气泡?因为 micro-batch 在流水线上需要填充和排空,阶段不平衡时就会留下空转。
  • 这个专题是不是只讲训练?不是,通信原理和并行边界也会直接影响推理和服务化场景。
  • 通信 profiling 的结果为什么不能直接当结论?因为它需要结合 workload、batch 和请求分布一起解释,单看热图容易误判。

观测清单

  • 先看 allreduce / sync 占比,判断是不是通信把训练或推理拖慢了。
  • 再看 bubble / idle time,判断是不是流水线没有排满。
  • 再看 memory split / state shard,判断是不是显存分摊真的起作用。
  • 再看 overlap / wait time,判断是不是通信和计算没重叠起来。
  • 最后回到 34 / 31,把并行策略的收益和代价放到 benchmark 里验证。

简单规则

  • 先判定问题是不是同步/等待。
  • 再选并行策略,不要反过来。
  • 最后用 benchmark 验证吞吐和显存收益。

常见错误

  • 盲目加卡。
  • 把不同切分层级的并行方法混为一谈。
  • 只看显存,不看气泡和通信等待。

深入阅读

  • 想看完整并行选型故事,去 通信与并行深入阅读
  • 想快速回顾摘要、案例和清单,继续留在本页即可。

相关专题

小结

通信与并行的关键不是“有没有多卡”,而是“切分层级和通信代价是不是匹配当前问题”。

Released under the MIT License.