小GPU内存用大batchsize的方法总结

      首先,我们要了解为什么我们要用到大的batchsize来训练我们的模型,这是因为大的batchsize可以让模型中的BN操作计算的不易受到个别数据噪声的影响,可以更快的收敛。
更详细的关于batchsize大小的影响可以去参考这一篇文章。
https://www.zhihu.com/question/32673260/answer/675161450
      但是很多时候受到单块GPU内存的限制,我们并不能用很大的一个batchsize,用多个GPU虽然可以在一定程度上解决这个问题,但是与单卡BN的计算不同,往往最后获得的收敛效果也不同,为此在这篇文章中,总结了一些网上所说的可以用大的batchsize的方法。

为了方便后面的方法讲述,我们做出一个硬件假设,GPU为RXT2080Ti,内存为11g,模型大小为1600M。

1、多GPU

      这种方法是用多块GPU来获得大的batchsize,这种方法实际上是将一个batchsize平均或者有一定设定分配到不同的卡中进行计算,并通过最后的模型输出计算损失。举个例子,如何我们要用的batchsize为12,1600m*12+loss已经超过了11G,一张卡显存不足,用两张卡的话就是一张卡分配到6个batch来计算。这样做相当于是模型中的BN层的batchsize只有6,两张卡中的数据是不相通的,他们唯一相通的是最后的损失函数计算,会集合12个batchsize的输出进行计算。
      可以看出这种方法并没办法获得很大的batch来更新BN层的参数,而唯一可以提高的是在损失中获得更大的batchsize的数据,同时可以获得更高的计算速度,但是如果损失用了均值操作的话也会减少迭代次数,如果这样的batchsize太大的话可能会找出不收敛。
      多GPU是最常用的一种方法,在各大深度学习框架中都有调用函数,但是并不是每个GPU所占用的内存都是一样的,这是因为loss的计算并不是每一个批次都需要进行,一般会放在前面的卡进行,也就是说第一张卡所占用的资源实际上要比其他的卡多一些,这也是为什么GPU负载不均衡的原因。

2、单GPU用大batchsize

      这种方法是用同一个GPU来计算损失并更新梯度,但是并没有做权重的更新,在进行两个epoch或者多个epoch之后用累积的梯度做权重更新。这种方法具体操作如下:
在这里插入图片描述
      这种方法依然存在第一种方法所说的一个问题,BN的更新并没有享用到大batchsize的福利,依旧受到了GPU内存的限制。同时loss也是单独计算的,比如现在我们只用一张GPU,那么最大的batchsize可以到6,假设我们要用所说的batchsize为12,就要通过两次迭代后再更新一次梯度。通过梯度累积可以获得更快的收敛,因为这里的梯度会更大,但是这个也并不是绝对的。

3、BN的同步方法

      前两个方法中BN并没有用到batchsize增大的福利,而这在一些检测和分割任务中可能会没法获得好的效果。
      这里介绍一种BN的同步方法:Synchronized-BatchNorm(https://github.com/vacancy/Synchronized-BatchNorm-PyTorch),这里有一篇论文:MegDet: A Large Mini-Batch Object Detector(https://arxiv.org/abs/1711.07240),讲的是它的应用在检测效果上的改进。这个方法使用也很简单,如下:
在这里插入图片描述
      这个方法可以做到BN和loss都用到所有批次的数据,性能很好,但是它却对一些没有高的硬件配置的研究者并不友好。因为要使得整个模型中的BN数据进行共通来计算BN就需要用到更大的GPU内存,还是以我们的假设来举例,假设我们需要跑12个batchsize,要用到的内存为1600*12+loss约为19G,需要两张GPU,但是如果用了Synchronized-BatchNorm的方法,那么在可能需要增加4~6G的内存,这里的内存增加只是打一个比方,并不一定是这个数字,因为这个和模型中BN的数量有关系,BN的数量越多,那么所需要共通的数据越多,也就需要更大的内存。
      虽然这种方法解决了之前我们所说的BN的参数更新不能获得batchsize提高的福利,但是它带来的巨大的内存增加,对设备要求增大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值