
深度学习的Batchsize必须是2的n次方吗?
大家或多或少都已经默认了,batchsize一般都是2,8,36,64,128...因为基本上所有论文都是这么设置默认超参数,大家久而久之就习惯了,至少这样设置总不会错吧。
其实我也有这么一个迷思,如果不设置为2的n次方会怎么样?效果变差?效率变低?还是...
基本理论
一般而言,选择batchsize为2的幂背后的主要思想来自于:内存对齐和浮点效率。
内存对齐
将batchsize选择为2的幂的主要论点之一是CPU和GPU内存架构是以2的幂组织的。有一个内存页的概念,它本质上是一个连续的内存块。如果使用的是macOS或Linux,可以通过在终端中执行getconf PAGESIZE来检查页面大小,这应该返回一个2的幂。
这个想法是将一个或多个批次整齐地放在一个页面上,帮助GPU中的并行处理。或者换句话说,选择批量大小为2,以获得更好的内存对齐。这与在视频游戏开发和图形设计中使用OpenGL和DirectX时选择2的幂次纹理类似(并且可能受到启发)。
浮点效率
Nvidia有一个矩阵乘法背景指南,解释了矩阵维数和图形处理单元(GPU)计算效率之间的关系。建议将矩阵维数选择为8的倍数,在有Tensor Core的GPU上进行混合精度训练更有效率。
将两个矩阵A和B相乘的一种方式是通过计算矩阵A的行向量与矩阵B的列向量之间的点积。如下所示,这些是k元素向量对的点积:
每个点积由一个“加”和一个“乘”操作组成,我们有 M×N 个这样的点积。因此,总的来说,我们有 2×M×N×K 浮点运算(FLOPS)。如果这时候使用GPU例如V100,当矩阵维度( MM , NN 和 KK )对齐为16字节的倍数时,计算效率会更好(根据Nvidia的指南)。具体来说,在FP16混合精度训练的情况下,8的倍数是效率的最佳选择。
实验验证
以下验证都是基于在CIFAR-10上训练MobileNetV3模型测试。
小Batchsize验证
看起来,将批量大小减少1(127)或将批量大小增加1(129)确实会导致训练性能稍慢。这里的差异几乎不明显,可以忽略不计。
大Batchsize验证
批量大小为2的幂(或8的倍数)确实会产生很小但几乎不明显的差异。
多GPU下Batchsize验证
这一次,2的幂和8的倍数的批量大小(256)没有快于257,所以其实实际上稍微改变Batchsize,在现实中影响并没有那么明显。
结论
如果按实践指南来说,建议还是以2的n次方来设置batchsize比较稳妥,一个是有理论基础,另外一个是谁也不想因为Batchsize的个性化导致漫长的训练过程变得更漫长。但从实际简单的测试来看,好像影响又不是很明显,但总体来说,Batchsize一般设置在16-256之间,是比较有效且稳妥的做法,可供参考。
https://docs.nvidia.com/deeplearning/performance/dl-performance-matrix-multiplication/index.html#gpu-imple
https://sebastianraschka.com/blog/2022/batch-size-2.html
本文转载自 沐白AI笔记,作者: 杨沐白
