深度学习中多GPU训练

针对这个问题:
深度学习中多GPU训练是否等价于增大batch size? - 知乎
https://www.zhihu.com/question/323307595

先说我认为的结论,若夸卡训练中有统计数据同步(比如BN层的runing average 和 variance),这时单卡和多卡效果是一样的,只不过多卡增大了batch size,否则就不是严格的增大batch,因为统计数据可能不够准确。可以参考一下我摘录的小笔记,以BN层为对象,思考一下其他老师同学的回答:

Pytorch Batch Normalizatin layer的坑

在实际应用中,增大batch size的同时会相应增大学习率,以更好地利用训练数据,@茂神看世界 指出的论文《Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour》从等效的梯度方差估计角度给出了解释,一般情况下,我们LR和Batch Size同步缩放,但这只是粗略的调整,之后还要搜索。

通过@Chan ijasmine,@Kord,@王赟 Maigo 的讨论,我反思了一下。神经网络确实存在非线性,比如当使用sigmoid之类的激活函数,这时平均就是不一样的结果。但是在进行模型训练的时候,如何提高计算资源的利用?对模型的计算采用矢量化的操作,即成batch训练(也就是每个样本之间并行运算,然后对各个样本的损失求 平均/和 得到最终的损失),而在pytorch夸卡分布式训练(单机)中,会独立地在所有卡上进行loss计算和梯度计算,然后复制各自计算得到的梯度传输到其他卡上,若进行数据同步,则此时就是增大batch, 这一点可以参考:

分布式训练从入门到放弃

而对于数据并行多卡方式,则更简单了,pytorch会把其他卡上的网络输出结果放在一张主卡上计算损失和计算梯度并回传梯度到副卡上,若此时也进行数据同步,则也是增大batch.

数据并行,把loss写进model里的分析同理,只是此时我们需要在训练过程中显示地手动求loss平均,比如:

loss = torch.sum(loss_ngpu) / opt.batch_size

请大神指正,菜鸟求轻喷。

你可能感兴趣的:(pytorch)