示例图片二

Batch大小不一定是2的n次幂!ML资深学者最新结论

2022-08-01 20:45:15 彩神 已读

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)时,运行速度明显变快了。

最大批量训练

鉴于 MobileNetV3 架构和输入映像大小,上一轮中样本数量相对较小,因此 GPU 利用率约为 70%。

为了调查 GPU 满载时的训练速度,本轮把样本数量增加到 512,使 GPU 的计算利用率接近 100%。

△由于 GPU 内存限制,无法使用大于 515 的样本数量

可以看出,跟上一轮结果一样,不管样本数量是否是 2 的 n 次幂,训练速度的差异几乎可以忽略不计。

多 GPU 训练

基于前两轮测试评估的都是单个 GPU 的训练性能,而如今多个 GPU 上的深度神经网络训练更常见。为此,这轮进行的是多 GPU 培训。

正如我们看到的,2 的 n 次幂(256)的运行速度并不比 255 差太多。

测试注意事项

在上述 3 个基准测试中,需要特别声明的是:

所有基准测试的每个设置都只运行过一次,理想情况下当然是重复运行次数越多越好,最好还能生成平均和标准偏差,但这并不会影响到上述结论。

此外,虽然 R 教授是在同一台机器上运行的所有基准测试,但两次运营之间没有特意相隔很长时间,因此,这可能意味着前后两次运行之间的 GPU 基本温度可能不同,并可能稍微影响到运算时间。

结论

可以看出,选择 2 的 n 次幂或 8 的倍数作为 batch 大小在实践中不会产生明显差异。

然而,由于在实际使用中已成为约定俗成,选择 2 的 n 次幂作为 batch 大小,的确可以帮助运算更简单并且易于管理。

此外,如果你有兴趣发表学术研究论文,选择 2 的 n 次幂将使你的论文看上去不那么主观。

尽管如此,R 教授仍然认为,batch 的最佳大小在很大程度上取决于神经网络架构和损失函数。

例如,在最近使用相同 ResNet 架构的研究项目中,他发现 batch 的最佳大小可以在 16 到 256 之间,具体取决于损失函数。

因此,R 教授建议始终把调整 batch 大小,作为超参数优化的一部分。

但是,如果你由于内存限制而无法使用 512 作为 batch 大小,那么则不必降到 256,首先考虑 500 即可。

作者 Sebastian Raschka

Sebastian Raschka,是一名机器学习和 AI 研究员。

他在 UW-Madison(威斯康星大学麦迪逊分校)担任统计学助理教授,专注于深度学习和机器学习研究,同时也是 Lightning AI 的首席 AI 教育家。

另外他还写过一系列用 Python 和 Scikit-learn 做机器学习的教材。

基准测试代码链接:

https://github.com/rasbt/b3-basic-batchsize-benchmark

参考链接:

https://sebastianraschka.com/blog/2022/batch-size-2.html

彩神平台,彩神官网,彩神网址,彩神下载,彩神app,彩神开户,彩神投注,彩神购彩,彩神注册,彩神登录,彩神邀请码,彩神技巧,彩神手机版,彩神靠谱吗,彩神走势图,彩神开奖结果