Gradient Accumulation 梯度累加,顾名思义,就是将多次计算得到的梯度值进行累加,然后一次性进行参数更新。如下图所示,假设我们有batch size = 256的global-batch,在单卡训练显存不足时,将其分为多个小的mini-batch(如图分为大小为64的4个mini-batch),每个step送入1个mini-batch获得梯度,将多次获得的梯度进行累加...
一、gradient accumulation 正常情况下是一个batch之后统一计算梯度大小,gradient accumulation可以再指定个batch之后一起更新梯度,这种情况下,可以再batch_size很小的时候,提升真正的batch_size,是一种显存占用的优化算法。随着模型和数据规模越来越大,显存紧张的时候,需要把batch_size设置的很小,使用gradient accumulation的...
一定条件下,batchsize越大训练效果越好,梯度累加则实现了batchsize的变相扩大,如果accumulation_steps为8,则batchsize '变相' 扩大了8倍,是我们这种乞丐实验室解决显存受限的一个不错的trick,使用时需要注意,学习率也要适当放大。 更新1:关于BN是否有影响,之前有人是这么说的: As far as I know, batch norm sta...
1. 梯度累加 在训练大模型时,batch_size 最大值往往受限于显存容量上限,当模型非常大时,这个上限可能小到不可接受。梯度累加(Gradient Accumulation)是一个解决该问题的 trick 梯度累加的思想很简单,就是时间换空间。具体而言,我们不在每个 batch data 梯度计算后直接更新模型,而是多算几个 batch 后,使用这些 batc...
1. gradient_accumulation_steps 如果显存不足,我们可以通过gradient_accumulation_steps梯度累计来解决。 假设原来的batch size=10,数据总量为1000,那么一共需要100train steps,同时一共进行100次梯度更新。 若是显存不够,我们需要减小batch size,我们设置gradient_accumulation_steps=2,那么我们新的batch size=10/2=5...
但是有时候模型显存占用量太大,为了节省显存,可以采用梯度累积的方法来曲线救国,间接增大batchsize。 我们可以这么改 loss=loss/gradient_accumulation_stepsloss.backward()ifstep%gradient_accumulation_steps==0optimizer.step()optimizer.zero_grad()step+=1 ...