https://zhuanlan.zhihu.com/p/617133971

传统 dp

传统 DP 是将每个 dp 的 梯度,用 server 聚合,再分发。用一个专门的 server 做这个事情。所以一般用于单机多卡。

问题:

image.png

DDP

将 server 上的通讯压力均匀分摊给每个 worker。这就是传说中的 ring-allreduce。

ring-allreduce

分两步,reduce-scatter 和 allgather

reduce-scatter:通过环状通信,得到这样的结果

image.png

allgather:通过类似的环状通信,只不过运算从加法变成了替换,并且通信的起点也得是红色块。最终每个 GPU 上都得到完整数据。

DDP 的通信量跟传统 DP 是一样的。但是负载更均衡。

反直觉的是,allreduce 居然比 reduce scatter 还耗时。 主要是我之前一直以为 reduce scatter 是 allreduce + scatter。

ZeRO

参考:https://zhuanlan.zhihu.com/p/618865052