0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Batch大小不一定是2的n次幂?

电子工程师 来源:量子位 作者:量子位 2022-08-08 16:29 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Batch大小不一定是2的n次幂?

是否选择2的n次幂在运行速度上竟然也相差无几?

有没有感觉常识被颠覆?

这是威斯康星大学麦迪逊分校助理教授Sebastian Raschka(以下简称R教授)的最新结论。

5bc08726-16c2-11ed-ba43-dac502259ad0.png

神经网络训练中,2的n次幂作为Batch大小已经成为一个标准惯例,即64、128、256、512、1024等。

一直有种说法,是这样有助于提高训练效率。

但R教授做了一番研究之后,发现并非如此。

在介绍他的试验方法之前,首先来回顾一下这个惯例究竟是怎么来的?

2的n次幂从何而来?

一个可能的答案是:因为CPUGPU的内存架构都是由2的n次幂构成的。

或者更准确地说,根据内存对齐规则,cpu在读取内存时是一块一块进行读取的,块的大小可以是2,4,8,16(总之是2的倍数)。

5bdb5d76-16c2-11ed-ba43-dac502259ad0.png

因此,选取2的n次幂作为batch大小,主要是为了将一个或多个批次整齐地安装在一个页面上,以帮助GPU并行处理。

其次,矩阵乘法和GPU计算效率之间也存在一定的联系。

5bf09aa6-16c2-11ed-ba43-dac502259ad0.jpg

假设我们在矩阵之间有以下矩阵乘法A和B:

5c011c32-16c2-11ed-ba43-dac502259ad0.jpg

当A的行数等于B的列数的时候,两个矩阵才能相乘。

其实就是矩阵A的第一行每个元素分别与B的第一列相乘再求和,得到C矩阵的第一个数,然后A矩阵的第一行再与B矩阵的第二列相乘,得到第二个数,然后是A矩阵的第二行与B矩阵的第一列……

5c10effe-16c2-11ed-ba43-dac502259ad0.jpg

因此,如上图所示,我们拥有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存储库中找到(链接附在文末)。

该测试共分为以下三部分:

小批量训练

5c2292c2-16c2-11ed-ba43-dac502259ad0.png

从上图可以看出,以样本数量128为参考点,将样本数量减少1(127)或增加1(129),的确会导致训练速度略慢,但这种差异几乎可以忽略不计。

而将样本数量减少28(100)会导致训练速度明显放缓,这可能是因为模型现在需要处理的批次比以前更多(50,000/100=500与50,000/128= 390)。

同样的原理,当我们将样本数量增加28(156)时,运行速度明显变快了。

最大批量训练

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

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

5c3b8002-16c2-11ed-ba43-dac502259ad0.png

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

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

多GPU训练

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

5c492c66-16c2-11ed-ba43-dac502259ad0.png

正如我们看到的,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做机器学习的教材。

5c7af340-16c2-11ed-ba43-dac502259ad0.png

基准测试代码链接:
https://github.com/rasbt/b3-basic-batchsize-benchmark
参考链接:
https://sebastianraschka.com/blog/2022/batch-size-2.html

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 矩阵
    +关注

    关注

    1

    文章

    441

    浏览量

    35805
  • 机器学习
    +关注

    关注

    66

    文章

    8541

    浏览量

    136216

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

文章出处:【微信号:CVer,微信公众号:CVer】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RSA加速实现思路

    N;其中(E , N)组成公钥。 解密过程为:M = CDmodN;其中(D , N)组成私钥。 2 关于加速操作 上述提到N
    发表于 10-28 07:28

    串口DMA接收方式打开,为什么在开启IDLE中断的情况下还需要开启DMA中断呢?

    户接口rx_indicate来读取数据,此时,串口收到的数据并不一定是完整的帧,破坏了使用IDLE中断的意义。所以,为什么要开启DMA中断呢? 此处,可以看到不论是IDLE中断还是DMA传输中断,都会导致用户回调的调用。
    发表于 09-29 08:30

    如何秒级实现接口间“等”补偿:款轻量级仿等数据校正处理辅助工具

    导语 本文分析了在网络超时场景下,RPC服务调用数据致性的问题,对于接口无等、接口等失效情况下,对异常数据快速处理做了分析思考和尝试,开发了款轻量级仿
    的头像 发表于 09-15 16:55 600次阅读
    如何秒级实现接口间“<b class='flag-5'>幂</b>等”补偿:<b class='flag-5'>一</b>款轻量级仿<b class='flag-5'>幂</b>等数据校正处理辅助工具

    等等党不一定会赢,但小鹏G7一定会!

    行业资讯
    脑极体
    发布于 :2025年07月15日 15:50:41

    可靠性技术系列教材之PCB EMC设计技术

    的通路等差模电流会转换成共模电流。 三、共模电流 大小不一定相等方向相位相同。 设备对外的干扰多以共模为主差模干扰也存在但是共模干扰强度常常比差模强度的大几个数量级。 外来的干扰也多以共模
    发表于 07-01 16:12

    Denebola RDK上配置的帧大小与实际帧大小不一致是怎么回事?

    字节,与预期值不一致。 eCamViewer 上的显示问题: 使用Wireshark检查数据传输,数据包已成功传输到主机。 但是,视频没有在eCamViewer上显示,我怀疑帧和数据包大小差异(在第 1 点和第 2 点中提到)
    发表于 05-19 08:09

    求助,CY3014中CyU3PDmaChannelSetWrapUp函数的使用以及其他问题求解

    我在主任务中的FOR循环中实现了个功能: UART不定时的接收大小不一的数据,然后再通过UART传出。 其中附件是我的代码. 遇到的问题: 刚开始接收与发送是正常的,我发送的数据以及数据大小,再
    发表于 05-15 08:09

    cyusb3014 slave fifo模式In和Out缓存大小不一样时,显示错误怎么解决?

    cyusb3014 slave fifo 模式 In 和 Out 缓存大小设置不一样时(比如:U2P DMA缓存16K,P2U DMA缓存1K),可以测出来实际就是设置值,但在USB
    发表于 05-13 06:55

    DLP4500需要使用近红外光源,如何判断这个芯片是否适用?

    因为要对人体扫描,之前直再看450NIR,650NIR做的投影产品,但这种太少还都是在国外才有的卖。 所以想问下,如果用850nm的光源,是不是用普通的DMD芯片就可以,不一定是近红外波段的NIR系列芯片。 另外,如果有人
    发表于 02-21 17:15

    DLPC3478使用External Pattern Mode如何解决并行口第N输入的数据将在N+1时输出造成的第1输出图像不能指定的问题?

    时,直接先通过并行口输入张图像,用以保证后续每次图片都正常,但是测试时发现,只要两图像操作的时间间隔超过一定时间,后面操作输出的第1图像又会变成默认图像。请问,在External
    发表于 02-21 14:49

    使用DLPC3478+DLPA3005做了款板子,修改了batch file关灯但是无效,怎么回事?

    我们现在使用DLPC3478+DLPA3005做了款板子,使用TI官网的9.0.1的red_only固件可以驱动光机,但是光机开机会投splash,我修改了batch file关灯但是无效
    发表于 02-17 06:05

    TLK2201的数据端口对应不齐是怎么回事?

    这个片子我选择的是unframed模式,输入的端口0-9的数据不一定是对应在输出端口0-9输出。而是在上电后,输入输出端口0-9是随机循环对应的。即有可能输入端9-0对应输出端0,9-1;或输入
    发表于 02-07 07:29

    文看懂ADC转换过程

    单位:数字信号最低位LSB所对应的模拟信号大小。用 表示。 量化:把取样后的保持信号化为量化单位的整数倍。 量化误差:因模拟电压不一定能被 整除而引起的误差。 编码:把量化的数值用二进制代码表示。划分量化电平的两种方法:   2
    的头像 发表于 01-23 17:43 2957次阅读
    <b class='flag-5'>一</b>文看懂ADC转换过程

    养成良好的编程习惯|堆内存初值不一定是0

    ;} 代码很简单,使用 malloc 申请段堆内存,假设内存空间足够大。 通过 getchar 配合 while 循环,从标准输入获取个字符串,直到遇到换行符结束。 最后就是把获取的字符串输出。 乍看,好像程序没什么问题。
    的头像 发表于 12-18 09:14 571次阅读

    使用ADS1256中出现重新上电会出现读取AD值不一样的情况,怎么解决?

    您好,我在使用ADS1256中出现重新上电会出现读取AD值不一样的情况:我这边直给个恒定的电压输入,重复上电断电读取AD值的实验,10中大约出现两
    发表于 12-13 09:34