# 计算与通信重叠：把等待藏进独立计算里

中文合成旁白 · 1280×720 · 20 fps · 111.23 秒

**00:00:00,000 · 训练中的通信**
多卡训练里，算出本地梯度还不够，通常还要跨设备归约，让各卡获得一致的梯度。

**00:00:07,395 · 训练中的通信**
反向计算逐步产生梯度。后面层的梯度已经就绪时，前面层可能还在计算，这就留下了重叠的机会。

**00:00:16,273 · 先算完再归约**
用三个梯度块举例，每块计算二毫秒，通信一毫秒。假设全部算完才开始通信。

**00:00:24,020 · 先算完再归约**
三块计算共六毫秒，再加三毫秒通信，总共九毫秒。优化器要等需要的归约完成，才能更新。

**00:00:32,944 · 按桶就绪重叠**
把梯度组织成桶。第一个桶在第二毫秒就绪，马上开始归约，同时继续计算第二块。

**00:00:40,910 · 按桶就绪重叠**
第二个桶在第四毫秒就绪，第三个在第六毫秒就绪。最后一次归约到第七毫秒完成。

**00:00:48,641 · 按桶就绪重叠**
同样的计算和通信，理想时间从九毫秒变成七毫秒。通信没有消失，只是部分时间和计算重叠了。

**00:00:57,812 · 长尾与依赖**
如果每块通信要四毫秒，通信会排队，分别在二到六、六到十、十到十四毫秒执行。

**00:01:05,912 · 长尾与依赖**
串行原本十八毫秒，重叠后仍要十四毫秒。通信很慢时，长尾依然存在，不能全部藏起来。

**00:01:14,897 · 长尾与依赖**
桶里需要的梯度没就绪，不能提前归约。优化器必须等结果；各卡也必须保持一致的集合通信顺序。

**00:01:23,799 · 重叠和融合**
这里讲的是运行时安排独立的计算和通信。MC 平方等通算融合，则在复合算子内部切块、编排局部依赖。

**00:01:33,331 · 重叠和融合**
仅仅设置异步，并不保证重叠。若马上等待，或硬件资源互相争用，执行仍可能变慢。

**00:01:41,685 · 重叠和融合**
评估时看完整步耗时和最后的通信长尾。记住：先确认依赖，再找能同时推进的工作。

## 教学假设
教学模型：单计算引擎与单通信引擎，三个块，计算每块 2 ms；正常通信每块 1 ms，慢通信每块 4 ms。未计启动、争用与跨 rank 就绪差异。并发箭头表示合法依赖，不保证真实硬件加速倍数。

## 原始资料
- [PyTorch DDP 原理说明](https://docs.pytorch.org/docs/main/notes/ddp.html)
- [昇腾 MC² 通算融合说明](https://www.hiascend.com/developer/techArticles/20250325-1)