多GPU并行训练

参考:https://zhuanlan.zhihu.com/p/178402798
1.常见的多GPU使用方法:
模型并行,数据并行。
模型并行,可用于训练大型网络,模型分块进行训练,对于训练速度影响不大。数据并行,相当于加大了batchsize的数量,加快了训练速度。
多GPU并行训练_第1张图片
多GPU并行训练_第2张图片
2.数据在不同设备之间如何分配?误差如何在不同设备之间通讯?
每一个step求梯度之后,会把不同的GPU之间的梯度求平均。
BN如何在不同设备间同步?
在不同设备间同步计算均值和方差时,需要计算所有的特征矩阵(多个GPU的总和)在每一个channel上的均值和方差,可提升约一个点的精度。但训练速度会降低。多GPU并行训练_第3张图片

每个BN层求的均值和方差都是针对每一个gpu上的batchsize数据,例如batchsize等于二的时候,计算的是第一个GPU上的两张照片的BN。

3.pytorch训练方法:
Dataparallel和DistributedDataParallel。
第一种方法一般用于单机多卡,第二种方法可以用于单机多卡或多机多卡。第二种方法速度一般,高于第一种方法。
pytorch中多gpu训练的方法:
torch.distributed.lanunch和torch.multiprocessing。第一种方法代码量更少,启动速度更快。第二种方法拥有更好的控制和灵活性。
多GPU并行训练_第4张图片
使用多GPU的场景,需要同步多个GPU之间的进度,最后返回该轮当中的平均损失值。

1、DDP:DistributedDataParallel是一个支持多机多卡。
Pytorch中troch.distributed.
DDP属于数据并行,,通过提高batch size来增加并行度。
通过多个进程方式来减轻Python GIL的限制。显著的快于DP。目前最流行的多机多卡的加速方法。
import torch.distributed as dist
2、DDP基本原理:
假设有N张显卡:在DDP模式下,将有N个进程被启动,每个进程在一张卡上加载一个模型,这些模型的参数在数值上是相等的。模型训练过程中通过Ring-Reduce方法与其他进程之间相互通信,交换各自梯度从而得到所有进程的梯度。在参数更新过程中,个进程之间的参数是通过平均梯度进行更新,由于各个进程的初始参数、更新参数一直,所以更新后的参数也是完全一致的。
3、DP:DataParallel很早出现的单机多卡、参数服务器的多卡训练模式。
model = torch.nn.DataParallel(model)
该模式下只有一个进程,master相当于一个参数服务器,会像其他卡广播参数。这种参数更新方式master节点任务、通讯量重,导致网络堵塞、训练速度减慢。

你可能感兴趣的:(神经网络,pytorch,深度学习,人工智能)