深度学习多机多卡batchsize和学习率的关系

前言

最近的一些实验感觉碰到一些玄学的问题。
总结一下:

  • 纯FC的网络,学习率对训练结果的影响很大。实验现象是这样的,把resnet50的backbone给冻结了之后,只训练后面的head部分(不是简单的几层FC,还是比较复杂的结构拼了些transformer的block还有很重的MLP),发现不同的学习率会有两个点多的浮动。
  • 单机多卡和多机多卡即使全局batchsize对齐训练结果仍有较大的diff,实验结果是差了2个多点。

玄学一

在没冻结backbone之前没有这样的情况出现。有点怀疑的地方是因为把backbone冻结后网络没有BN层参与训练了,是不是因为缺少BN层所以模型的更新受到了学习率较大的影响呢?因为没有BN层将数据归一化,梯度变化较大,学习率如果过大的话容易跳来跳去。是不是可以加warmup来解决这个问题呢?有空实验看看。

玄学二

文末介绍下DP和DDP两种的梯度传输。

以前总是听到学习率和batchsize成正比例变化这样的说法,之前做reid实验的时候确实是这么回事:

记得当时作者的模型是四卡DP模式训练的全局batchsize是256,相当于每张卡上的batchsize是64.作者的学习率是0.00375我复现的实验因为实验室没有卡只能用两卡实验,修改全局batchsize为128,学习率0.001875,然后还有个重要的参数,就是每个epoch遍历的iter数,因为作者的dataloader是iterloader,就是说一个epoch不是见过了所有的数据就结束,而是达到我制定的iter数目才结束,所以一个epoch可能会见到一两遍全部的数据。然后作者的iter数目设置的是400,我因为一个iter的bs只有128了,所以iter的数目设置了他的两倍就是800.修改上述三个参数实验结果和作者对齐了。reid这种任务因为要充分挖掘一个batch里面正负样本的信息,所以受到batchsize很大的影响,上述三个参数不管哪个不对都会很大的影响最后的结果。

这次的玄学出现在DDP的模式下,举个例子,单机8卡,单卡的bs如果是512的话,全局的batchsize就是4096=8 * 512,对应的四台机器每台机器8卡,全局的卡数是32,单卡的batchsize是128的话,全局batchsize也是4096=128 * 8 * 4了。这个时候我以为学习率一致就好了,因为全局的batchsize是一样的。但是…实验结果差了很多,也就是因为玄学一,我这个全FC的网络受学习率的影响有很大,所以看了下DDP的梯度回传原理,好像明白了什么…

DDP

单机多卡数据并行-DataParallel(DP)
多机多卡数据并行-DistributedDataParallel(DDP)

这个博客写的真的很简洁明了,就不重述了,主要是圈起来这句话:
深度学习多机多卡batchsize和学习率的关系_第1张图片
突然有了灵感,单机八卡如果全局batchsize是4096,但是GPU的节点数是8,所以4096的batchsize的梯度是按8份平均的。而四台机器32卡,如果全局batchsize是4096,但是GPU节点数是32,所以4096的batchsize的梯度是按32份平均的,相当于后者的梯度是前者的1/4了。所以是不是应该后者的学习率翻4倍或者前者的学习率缩小到1/4呢?
正在实验中。。。复现了效果会贴上来。

实验完了…结果和我分析的好像不太对…有点尴尬
我以为是下面这样:
深度学习多机多卡batchsize和学习率的关系_第2张图片
结果实验的是学习率不是翻4倍反而要缩小几倍效果才对齐…有点搞不懂了…

你可能感兴趣的:(#,pytorch,深度学习)