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张),汇聚梯度所花费的通信时间几乎是不变的! 这就是文本中说的“相当惊人的结果”。
总结
这张图演示了:
- 把梯度切块。
- 利用环形结构,让所有GPU同时发送和接收不同的小块。
- 最终每个GPU都持有一部分“完整求和”的数据(随后会有第二阶段All-Gather把这些完整数据分发给所有人,图中未画出)。
- 这种方法让带宽利用率最大化,通信速度不再受显卡数量增加的拖累。

浙公网安备 33010602011771号