9008be48cb4ea63a571f01d14358fa37.jpeg

文 | 付瑶

最近刷到一个话题很有趣,搬来和大家一起讨论下:

“batch-size 一定要大小为2的幂吗?不这样设置会有啥差别吗?”

4e71a6ccf78bc19861dd14a6a48e4e47.png

发帖人认为大家都进入一个误区。坚持选择batch-size的大小为2的幂次数是因为曾经被告知从计算的角度是对训练效率有益的。但是这个“有益”是真实存在的吗?

为了求证这个问题,发帖人首先试图从内存对齐和精度训练的效率两个角度找寻答案。

首先关于memory alignment的主要是猜测受内存页大小的影响,内存页经查看确实是一个2的幂次方的数字,但是作者认为这个理念是一个或者多个batches放在同一个内存页上,以帮助gpu的内存对齐,有些类似于在游戏开发和图像设计中使用的OpenGL和DirectX选择两种纹理。而关于浮点数的计算效率,他在Nvidia的《Matrix Multplication Background User‘s Guide 》中找解释,其中结束了矩阵尺寸和GPU计算效率之间的关系,矩阵维度不应该选择2的幂次的数字而且8的倍数,以便在具有TensorCores的GPU上进行训练(2的幂次数和8的倍数之间存在重叠)。因此,发帖人batch size大小为8的倍数对于FP16混合精度训练的gpu来说,理论上是最有效的。

然后他进行一系列实验,研究在实际训练中“有效性”是否可以被注意到。这次实验在CIFAR-10进行了10个epoch的实验,图像大小标准倍调整为224*224,用16bit混合精度来训练。

1. 以 Batch Size = 128 作为参考点

cd01cc8c8a6df7279b4f12d3746fc455.png

似乎将批大小减少1(127)或将批大小增加1(129)确实会导致训练性能略慢。但是差异十分微小,作者认为可以忽略不计。

2. 以 Batch Size = 256 作为参考点

7fed3f17057dc8307ae87dd92b40ddee.png同样只有微小但几乎不可察觉的差异

3. 多卡训练场景

4f4ee50d6038f661d9c2e13b18eb207c.png在多卡训练场景下,2的幂和8的倍数批量大小(256)并不比257快。作者补充谈到每一次实验设置都只运行一次并且按照顺序运行的,即使运行的时间没有很久,但是也意味着运行之间的基本GPU温度可能是不同的,或许对计时有微弱的影响。

在帖子下面的网友讨论也是各显神通。有一些调侃的回复,同样也有一些不同角度的解答。

“都选7”派

ddb9240def4b698bfab0432bb150d5a5.png“我有时候会设成 7 的倍数去训练,然后去教堂洗刷我的罪孽。”(似乎是暗指天主教宗的七宗罪)

“666”派

bcb9efe0dee860a1d28297b58c3bb104.png

下面也有人提出在“nvidia的完整手册”描述了为什么层尺寸和批量大小的 2 次方对于cuda级别的最大性能是必须的。作者的监控和测试并不具代表性,然而作者列出的反例也有道理:f7bcb2eb13cab3c27ad343b606dde3df.png

fd2b62d4657b78516114c2dfd3cbf4b1.png

总结下大家的发言:存在一部分人认为发帖人的实验不具说服力和意义,例如在超小型网络上使用了超小型数据集、未使用TPU、任务过于单一等。与此同时也有人提出考虑TPU/XLA填充数据、以及深度学习编译器的8的倍数准则等,batch size的大小将至关重要。可以说是各持一词非常热闹,但是究竟这个问题是否真的有解?欢迎大家一起讨论~

02186753a1c923dcf7244a271a4fbd41.png萌屋作者:付奶茶

新媒体交叉学科在读Phd,卖萌屋十级粉丝修炼上任小编,目前深耕多模态,希望可以和大家一起认真科研,快乐生活!

作品推荐

1.在斯坦福,做 Manning 的 phd 要有多强?

2.史上最大多模态图文数据集发布!

3.MSRA-万字综述 直击多模态文档理解

4.大模型时代,我们真的不再需要分词了吗?

16e4cd1d9b70a8d746329286390e24e4.jpeg后台回复关键词【入群

加入卖萌屋NLP、CV、搜推广与求职讨论群

 91d521350f39901c859d9fa0c60578f4.png

[1]https://www.reddit.com/r/MachineLearning/comments/vs1wox/p_no_we_dont_have_to_choose_batch_sizes_as_powers/
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐