step,epoch,batch size和显存
显存占用 = 模型显存占用 + batch_size × 每个样本的显存占用
时间更宝贵,尽可能使模型变快(减少 flop)
显存占用不是和 batch size 简单成正比,模型自身的参数及其延伸出来的数据也要占据显存
batch size 越大,速度未必越快。在你充分利用计算资源的时候,加大 batch size 在速度上的提升很有限
尤其是 batch-size,假定 GPU 处理单元已经充分利用的情况下:
增大 batch size 能增大速度,但是很有限(主要是并行计算的优化)
增大 batch size 能减缓梯度震荡,需要更少的迭代优化次数,收敛的更快,但是每次迭代耗时更长。
增大 batch size 使得一个 epoch 所能进行的优化次数变少,收敛可能变慢,从而需要更多时间才能收敛(比如 batch_size 变成全部样本数目)
完成每个epoch运算的所需的全部时间主要卡在:
load数据的时间,
每个epoch的iter数量。
因此对于每个epoch,不管是纯计算时间还是全部时间,大体上还是大batch能够更节约时间一点,但随着batch增大,iter次数减小,完成每个epoch的时间更取决于加载数据所需的时间,此时也不见得大batch能带来多少的速度增益了。
batch size过小,花费时间多,同时梯度震荡严重,不利于收敛;batch size过大,不同batch的梯度方向没有任何变化,容易陷入局部极小值。
我们选取batch size时不妨这样操作:
当有足够算力时,选取batch size为32或更小一些。
算力不够时,在效率和泛化性之间做trade-off,尽量选择更小的batch size。
当模型训练到尾声,想更精细化地提高成绩(比如论文实验/比赛到最后),有一个有用的trick,就是设置batch size为1,即做纯SGD,慢慢把error磨低。
step:一次梯度更新(一个batch跑完) epoch(数据集跑一遍) iter数量=数据集大小/batch size
参考:batchsize大小对训练速度的影响 训练时GPU显存太小问题、batchsize 的大小跟GPU的显存的关系 怎么选取训练神经网络时的Batch size?