Pytorch单机多卡训练
pytorch中单机多卡可以使用DataParallel和DistributedDataParallel 来实现。
pytorch官网中推荐使用DistributedDataParallel。两者区别是:
DataParallel是单进程多线程控制GPU的实现方式,因此只能在一台机器上使用,而DistributedDataParallel则是多进程控制GPU,除了能实现单机多卡外,也能够实现分布式训练。
DataParallel一般会比DistributedDataParallel慢
DistributedDataParallel支持model parallel
DP有负载不均衡的现象
DataParallel训练的原理
并行训练有模型并行,数据并行和混合并行。数据并行即每个GPU上都有相同的模型参数,将一个batch的数据分给每个GPU,这样就可以设置更大的batchsize。假设有8个GPU,代码会将GPU0当做reducer,它的功能是分发给其他GPU数据和模型参数,参数更新。其他的GPU则是Maper,主要是进行前向传播和反向传播,向reducer传输自己的参数梯度。
我们知道当batchsize为N时,单机单卡时我们计算loss时是将每个样本的loss求和取平均,这也就相当于把每个样本计算的梯度进行求和后再求平均得到最终的梯度,再进行参数更新。
所以我们要清楚的是那些部分能够进行并行计算,前向传播和反向传播显然可以,因为其只依赖自己的样本,而参数更新不行。
DistributedDataParallel
DistributedDataParallel使用allreduce的方式,能够减少通信开销。并且每个GPU保