【显存不足解决方法】梯度累积

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

具体实现:

正常训练过程:

outputs = model(data_batch)
loss = loss_function(outputs, labels)

optimizer.zero_grad()
loss.backward()
optimizer.step()

梯度累积:

accumulation_steps = 4


outputs = model(data_batch)
loss = loss_function(outputs, labels)

# 2.1 loss regularization loss正则化
loss += loss / accumulation_steps

# 2.2 backward propagation 反向传播计算梯度
loss.backward()

# 3. update parameters of net
if ((i+1) % accumulation)==0:
    # optimizer the net
    optimizer.step()
    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实现梯度累积的方式,具体还没有实现。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值