12.7.2 环同步

这张图解释的是深度学习分布式训练中非常经典且高效的通信算法——Ring All-Reduce(环形全归约)

简单来说,它的目的是解决多张GPU如何最快地把各自计算出的梯度(Gradients)加在一起的问题。

以下是通俗易懂的详细解释:

1. 为什么要这么做?(背景)

在多显卡训练时,每张卡都会算出一份“梯度”(模型更新的方向)。为了更新模型,我们需要把所有显卡的梯度加起来求平均,然后再发回给每张卡。

  • 笨办法(图中文本提到的“低效”方法): 第1个传给第2个,加完传给第3个……这样就像接力赛跑,同一时间只有一个人在跑,其他人都在等,效率很低,显卡越多越慢。
  • 聪明办法(Ring All-Reduce): 把数据切块,大家围成一个圈,同时互传不同的块。就像大家围坐一圈传扑克牌,每个人的手都在动,没有人在空等。

2. 图解步骤(发生了什么?)

这张图展示了算法的第一阶段:Scatter-Reduce(分散归约)
假设有4张GPU(GPU 0-3),每张卡的梯度数据被切成了4个小块(行)。

  • 初始状态(左上图):

    • 每张GPU都有自己的完整数据(4个块)。
    • 关键策略: 并不是把整份数据发给邻居,而是每个人只负责发其中一块
    • 比如:GPU 0 发送第1块给左边,GPU 1 发送第2块给左边……大家同时动作。
  • 中间过程(右上图 & 左下图):

    • 每一步,GPU都会收到邻居发来的一块数据。
    • 收到后,它会把这份数据加(Accumulate)到自己对应位置的数据上。
    • 加完之后,再把这个“和”传给下一个邻居。
  • 最终状态(右下图):

    • 注意看那些红色的X
    • 经过 \(N-1\) 步(这里是3步)后,你会发现:
      • GPU 0 拥有了所有卡在第4块数据的总和。
      • GPU 1 拥有了所有卡在第1块数据的总和。
      • 以此类推,对角线上的红色部分表示:该GPU已经拿到了这一行数据的“完全体”(所有人的总和)。

3. 那个神奇的公式 \((n-1)/n \approx 1\) 是什么意思?

这是在算通信时间,也是这个算法最厉害的地方:

  • 数据量: 假设总数据量是 \(D\)。因为切成了 \(n\) 块,每块大小是 \(D/n\)
  • 步骤数: 在一个 \(n\) 个节点的环里,要把一份数据转一圈加完,需要走 \(n-1\) 步。
  • 总时间: 每次传输耗时与数据量成正比。

    \[\text{总时间} = \text{步数} \times \text{单次传输数据量} = (n-1) \times \frac{D}{n} = \frac{n-1}{n} \times D \]

结论: 当显卡数量 \(n\) 很大时,\((n-1)/n\) 约等于 1。
这意味着:不管你增加多少张显卡(4张、8张还是100张),汇聚梯度所花费的通信时间几乎是不变的! 这就是文本中说的“相当惊人的结果”。

总结

这张图演示了:

  1. 把梯度切块。
  2. 利用环形结构,让所有GPU同时发送和接收不同的小块。
  3. 最终每个GPU都持有一部分“完整求和”的数据(随后会有第二阶段All-Gather把这些完整数据分发给所有人,图中未画出)。
  4. 这种方法让带宽利用率最大化,通信速度不再受显卡数量增加的拖累。
posted @ 2026-01-14 08:29  最爱丁珰  阅读(0)  评论(0)    收藏  举报