https://zhuanlan.zhihu.com/p/617133971
传统 DP 是将每个 dp 的 梯度,用 server 聚合,再分发。用一个专门的 server 做这个事情。所以一般用于单机多卡。
问题:
将 server 上的通讯压力均匀分摊给每个 worker。这就是传说中的 ring-allreduce。
ring-allreduce
分两步,reduce-scatter 和 allgather
reduce-scatter:通过环状通信,得到这样的结果
allgather:通过类似的环状通信,只不过运算从加法变成了替换,并且通信的起点也得是红色块。最终每个 GPU 上都得到完整数据。
DDP 的通信量跟传统 DP 是一样的。但是负载更均衡。
反直觉的是,allreduce 居然比 reduce scatter 还耗时。 主要是我之前一直以为 reduce scatter 是 allreduce + scatter。