多卡训练时的batch_size设置
问:假设我有4张卡,我将batch_size设置为64,那么是每张卡上都有64的batch同时训练,还是每张卡batch为64/4=16?
答:不管是dp还是ddp模式,batch_size都是单张卡上的batch大小,即每张卡训练的都是batch=64
我觉得挺奇怪,如果我是因为显存不足而使用多卡训练,模型中又有大量batch_norm,那么是不是这里的多卡训练就达不到我想要的效果?因为,如果对batch_norm来说,batch越大效果越好,则我希望是多张卡能够合起来组成一个大的batch,但实际上它还是几个小的batch单独计算batch_norm
当然,有需求就会有市场,batch_norm也是有跨gpu版本的,名为 SyncBatchNorm
DP vs DDP
dp和ddp的区别在于梯度计算的过程
当使用dp模式时,多张卡计算的loss结果会concatenate到第一张卡上,然后由这张卡计算整个batch的梯度,然后累加起来再求平均
当使用ddp模式时,每张卡单独计算这张卡上的mini_batch的梯度,然后再将所有的卡上的梯度求和,再除以卡的数量,这样一来就让每张卡上的梯度一样了,然后每张卡单独backward,因为每张卡的超参数都一样,且梯度一样,所以更新后的梯度也是一样的
学习率
使用多卡训练时,不需要刻意对学习率进行调整

参考
https://discuss.pytorch.org/t/comparison-data-parallel-distributed-data-parallel/93271