DataParallel & DistributedDataParallel分布式训练
摘录自:DataParallel & DistributedDataParallel分布式训练 - 知乎 (zhihu.com)
关于nn.DataParallel(以下简称DP)和DistributedDataParallel(以下简称DDP)的区别:
- DDP通过多进程实现的。也就是说操作系统会为每个GPU创建一个进程,从而避免了Python解释器GIL带来的性能开销。而DataParallel()是通过单进程控制多线程来实现的。还有一点,DDP也不存在前面DP提到的负载不均衡问题。
- 参数更新的方式不同。DDP在各进程梯度计算完成之后,各进程需要将梯度进行汇总平均,然后再由
rank=0的进程,将其broadcast到所有进程后,各进程用该梯度来独立的更新参数而 DP是梯度汇总到GPU0,反向传播更新参数,再广播参数给其他剩余的GPU。由于DDP各进程中的模型,初始参数一致 (初始时刻进行一次 broadcast),而每次用于更新参数的梯度也一致,因此,各进程的模型参数始终保持一致。而在DP中,全程维护一个 optimizer,对各个GPU上梯度进行求平均,而在主卡进行参数更新,之后再将模型参数 broadcast 到其他GPU.相较于DP, DDP传输的数据量更少,因此速度更快,效率更高。 - DDP支持 all-reduce(指汇总不同 GPU 计算所得的梯度,并同步计算结果),broadcast,send 和 receive 等等。通过 MPI 实现 CPU 通信,通过 NCCL 实现 GPU 通信,缓解了进程间通信有很大的开销问题。
- DP只支持单机多卡,DDP既可以单机多卡又可以多机多卡。
相较DP,DDP传输的数据量更少,因为速度更快,效率更高,所以在多卡训练时更推荐使用。唯一不好的地方是DDP相对后者来说,代码实现上会有些麻烦。
还要注意:在DataParallel中,batch_size设置必须为单卡的n倍, 但是在DistributedDataParallel内,batch_size设置于单卡一样即可(不然就会out of memory) .
浙公网安备 33010602011771号