深度学习中batch size, update freq以及多卡的关系
最近训练模型时一直被batsh size, number updates以及多卡的关系搞混,这里对其进行总结。
参考资料:
- https://stackoverflow.com/questions/4752626/epoch-vs-iteration-when-training-neural-networks
- https://github.com/pytorch/fairseq/issues/979
- http://www.linzehui.me/2019/01/28/%E7%A2%8E%E7%89%87%E7%9F%A5%E8%AF%86/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8fairseq%E5%A4%8D%E7%8E%B0Transformer%20NMT/
符号
update freq
update freq$(u)$的含义为,每$u$次forward做一次backward,其目的是模拟多卡的行为。
说明:
- 网上很多介绍epoch和iter关系的文章都假设forward次数和backward次数相等,但是由于update freq的存在,两者不一定相等,所以后续计算epoch以及iter都使用backward的次数;
epoch和iter
- 1 epoch:模型对所有训练集做一次backward;
- 1 iter:模型对一批数据做一次backward;
- 一批数据的数量为$\text{batch size}\times \text{cards num}\times \text{update freq}=b\times c\times u$,后续会详细说明;
batch size, 多卡
首先考虑单卡情形。
单卡情形
单卡情形下,batch size$(b)$表示一次(一张卡)forward的样本数量。
多卡情形
每次forward,单卡forward的样本数量为batch size$(b)$,所以多卡一次forward的样本数量为
由于一次backward要对应update freq$(u)$次forward,所以一次backward对应的样本数量为
因为1 epoch要backward全部训练样本($N$),所以1 epoch需要的iteration number为
个人理解
每次backward的梯度是使用$u\times b\times c$个样本计算出来的,所以只要该乘积保持不变,那么训练方式应该是等价的,这三个量的区别在于:
- batsh size$(b)$和显存有关,每张卡都有阈值;
- cards number$(c)$为使用的显卡数量,和算力资源有关;
- update freq$(u)$是可以任意调整的值,和算力,设备无关,训练时间和update freq成正比关系;
例子
假设
实验设置1
此时
实验设置2
此时
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Doraemonzzz!
评论
ValineLivere