当前位置:   article > 正文

【显存不足解决方法】梯度累积_梯度累加batch norm换成group norm

梯度累加batch norm换成group norm

梯度累积:参考数据并行的方式,梯度累积简单理解是把并行的数据替换成串行的数据传入,可以在显卡数量有限的情况下使用,还没有了解是否影响收敛速度。

具体实现:

正常训练过程:

  1. outputs = model(data_batch)
  2. loss = loss_function(outputs, labels)
  3. optimizer.zero_grad()
  4. loss.backward()
  5. optimizer.step()

梯度累积:

  1. accumulation_steps = 4
  2. outputs = model(data_batch)
  3. loss = loss_function(outputs, labels)
  4. # 2.1 loss regularization loss正则化
  5. loss += loss / accumulation_steps
  6. # 2.2 backward propagation 反向传播计算梯度
  7. loss.backward()
  8. # 3. update parameters of net
  9. if ((i+1) % accumulation)==0:
  10. # optimizer the net
  11. optimizer.step()
  12. optimizer.zero_grad() # reset grdient

学习率可能要增大一些;batchnorm可能需要替换为groupnorm,由于梯度累积的训练batch与测试batch均值方差不同。

在不同框架实现中有所区别,torch需要梯度清空,mxnet计算梯度有两个参数,’write'和‘add',

'write'是默认参数,默认写入新梯度,无需pytorch中每次调用optimizer.zero_grad();

'add'表示梯度累积,梯度将在每次backward()时增加到已有数据中。

mxnet梯度累积可参考:

通过手动梯度累加方式:acc_grad[:] += parameter.grad()

https://github.com/szhengac/Grad_Accumulation/blob/master/gpu/train.py

通过设置'add‘梯度计算方式,在bind()中 grad_req设置为’add',默认‘write',具体查看executor_group.py,这时需要在参数更新后手动梯度清零。

这两种方式,是mxnet实现梯度累积的方式,具体还没有实现。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/677154
推荐阅读
相关标签
  

闽ICP备14008679号