最近训练模型时一直被batsh size, number updates以及多卡的关系搞混,这里对其进行总结。

参考资料:

符号

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

此时