Batch大小不一定是2的n次幂!ML资深学者最新结论
扫一扫
分享文章到微信
扫一扫
关注99科技网微信公众号
Batch大小不一定是2的n次幂? 是否选择2的n次幂在运行速度上竟然也相差无几? 有没有感觉常识被颠覆? 这是威斯康星大学麦迪逊分校助理教授Sebastian Raschka (以下简称R教授) 的最新结论。 在神经网络训练中,2的n次幂作为Batch大小已经成为一个标准惯例,即64、128、256、512、1024等。 一直有种说法,是这样有助于提高训练效率。 但R教授做了一番研究之后,发现并非如此。 在介绍他的试验方法之前,首先来回顾一下这个惯例究竟是怎么来的?
2的n次幂从何而来?一个可能的答案是:因为CPU和GPU的内存架构都是由2的n次幂构成的。 或者更准确地说,根据内存对齐规则,cpu在读取内存时是一块一块进行读取的,块的大小可以是2,4,8,16 (总之是2的倍数) 。 因此,选取2的n次幂作为batch大小,主要是为了将一个或多个批次整齐地安装在一个页面上,以帮助GPU并行处理。 其次,矩阵乘法和GPU计算效率之间也存在一定的联系。 假设我们在矩阵之间有以下矩阵乘法A和B: 当A的行数等于B的列数的时候,两个矩阵才能相乘。 其实就是矩阵A的第一行每个元素分别与B的第一列相乘再求和,得到C矩阵的第一个数,然后A矩阵的第一行再与B矩阵的第二列相乘,得到第二个数,然后是A矩阵的第二行与B矩阵的第一列…… 因此,如上图所示,我们拥有2×M×N×K个每秒浮点运算次数 (FLOPS) 。 现在,如果我们使用带有Tensor Cores的GPU,例如V100时,当矩阵尺寸 (M,N以及K) 与16字节的倍数对齐,在FP16混合精度训练中,8的倍数的运算效率最为理想。 因此,假设在理论上,batch大小为8倍数时,对于具有Tensor Cores和FP16混合精度训练的GPU最有效,那么让我们调查一下这一说法在实践中是否也成立。
不用2的n次幂也不影响速度为了了解不同的batch数值对训练速度的影响,R教授在CIFAR-10上运行了一个简单的基准测试训练——MobileNetV3 (大) ——图像的大小为224×224,以便达到适当的GPU利用率。 R教授用16位自动混合精度训练在V100卡上运行训练,该训练能更高效地使用GPU的Tensor Cores。 如果你想自己运行,该代码可在此GitHub存储库中找到 (链接附在文末) 。 该测试共分为以下三部分:
小批量训练从上图可以看出,以样本数量128为参考点,将样本数量减少1 (127) 或增加1 (129) ,的确会导致训练速度略慢,但这种差异几乎可以忽略不计。 而将样本数量减少28 (100) 会导致训练速度明显放缓,这可能是因为模型现在需要处理的批次比以前更多 (50,000/100=500与50,000/128= 390) 。 同样的原理,当我们将样本数量增加28 (156) 时,运行速度明显变快了。
99科技网:http://www.99it.com.cn