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

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

3天内不再提示

有关batch size的设置范围

OpenCV学堂 来源:机器之心 作者:机器之心 2022-07-12 10:15 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

有关 batch size 的设置范围,其实不必那么拘谨。

我们知道,batch size 决定了深度学习训练过程中,完成每个 epoch 所需的时间和每次迭代(iteration)之间梯度的平滑程度。batch size 越大,训练速度则越快,内存占用更大,但收敛变慢。

又有一些理论说,GPU 对 2 的幂次的 batch 可以发挥更好性能,因此设置成 16、32、64、128 … 时,往往要比设置为其他倍数时表现更优。

后者是否是一种玄学?似乎很少有人验证过。最近,威斯康星大学麦迪逊分校助理教授,著名机器学习博主 Sebastian Raschka 对此进行了一番认真的讨论。

Sebastian Raschka

关于神经网络训练,我认为我们都犯了这样的错误:我们选择批量大小为 2 的幂,即 64、128、256、512、1024 等等。(这里,batch size 是指当我们通过基于随机梯度下降的优化算法训练具有反向传播的神经网络时,每个 minibatch 中的训练示例数。)

据称,我们这样做是出于习惯,因为这是一个标准惯例。这是因为我们曾经被告知,将批量大小选择为 2 的幂有助于从计算角度提高训练效率。

这有一些有效的理论依据,但它在实践中是如何实现的呢?在过去的几天里,我们对此进行了一些讨论,在这里我想写下一些要点,以便将来参考。我希望你也会发现这很有帮助!

理论背景

在看实际基准测试结果之前,让我们简要回顾一下将批大小选择为 2 的幂的主要思想。以下两个小节将简要强调两个主要论点:内存对齐和浮点效率。

内存对齐

选择批大小为 2 的幂的主要论据之一是 CPU 和 GPU 内存架构是以 2 的幂进行组织的。或者更准确地说,存在内存页的概念,它本质上是一个连续的内存块。如果你使用的是 macOS 或 Linux,就可以通过在终端中执行 getconf PAGESIZE 来检查页面大小,它应该会返回一个 2 的幂的数字。

0aded8f6-0125-11ed-ba43-dac502259ad0.png

这个想法是将一个或多个批次整齐地放在一个页面上,以帮助 GPU 并行处理。或者换句话说,我们选择批大小为 2 以获得更好的内存对齐。这与在视频游戏开发和图形设计中使用 OpenGL 和 DirectX 时选择二次幂纹理类似。

矩阵乘法和 Tensor Core

再详细一点,英伟达有一个矩阵乘法背景用户指南,解释了矩阵尺寸和图形处理单元 GPU 计算效率之间的关系。因此,本文建议不要将矩阵维度选择为 2 的幂,而是将矩阵维度选择为 8 的倍数,以便在具有 Tensor Core 的 GPU 上进行混合精度训练。不过,当然这两者之间存在重叠:

0aed43d2-0125-11ed-ba43-dac502259ad0.png

为什么会是 8 的倍数?这与矩阵乘法有关。假设我们在矩阵 A 和 B 之间有以下矩阵乘法:

0afbc4e8-0125-11ed-ba43-dac502259ad0.png

将两个矩阵 A 和 B 相乘的一种方法,是计算矩阵 A 的行向量和矩阵 B 的列向量之间的点积。如下所示,这些是 k 元素向量对的点积:

0b0dd5e8-0125-11ed-ba43-dac502259ad0.png

每个点积由一个「加」和一个「乘」操作组成,我们有 M×N 个这样的点积。因此,共有 2×M×N×K 次浮点运算(FLOPS)。不过需要知道的是:现在矩阵在 GPU 上的乘法并不完全如此,GPU 上的矩阵乘法涉及平铺。

如果我们使用带有 Tensor Cores 的 GPU,例如英伟达 V100,当矩阵维度 (M、N 和 K)与 16 字节的倍数对齐(根据 Nvidia 的本指南)后,在 FP16 混合精度训练的情况下,8 的倍数对于效率来说是最佳的。

通常,维度 K 和 N 由神经网络架构决定(尽管如果我们自己设计还会有一些回旋余地),但批大小(此处为 M)通常是我们可以完全控制的。

因此,假设批大小为 8 的倍数在理论上对于具有 Tensor Core 和 FP16 混合精度训练的 GPU 来说是最有效的,让我们研究一下在实践中可见的差异有多大。

简单的 Benchmark

为了解不同的批大小如何影响实践中的训练,我运行了一个简单的基准测试,在 CIFAR-10 上训练 MobileNetV3 模型 10 个 epoch—— 图像大小调整为 224×224 以达到适当的 GPU 利用率。在这里,我使用 16 位原生自动混合精度训练在英伟达 V100 卡上运行训练,它更有效地使用了 GPU 的张量核心。

如果想自己运行它,代码可在此 GitHub 存储库中找到:https://github.com/rasbt/b3-basic-batchsize-benchmark

小 Batch Size 基准

我们从批大小为 128 的小基准开始。「训练时间」对应于在 CIFAR-10 上训练 MobileNetV3 的 10 个 epoch。推理时间意味着在测试集中的 10k 图像上评估模型。

0b20d9ae-0125-11ed-ba43-dac502259ad0.jpg

查看上表,让我们将批大小 128 作为参考点。似乎将批量大小减少一 (127) 或将批量大小增加一 (129) 确实会导致训练性能减慢。但这里的差异看来很小,我认为可以忽略不计。

将批大小减少 28 (100) 会导致性能明显下降。这可能是因为模型现在需要处理比以前更多的批次(50,000 / 100 = 500 对比 50,000 / 100 = 390)。可能出于类似的原因,当我们将批大小增加 28 (156) 时就可以观察到更快的训练时间。

最大 Batch Size 基准

鉴于 MobileNetV3 架构和输入图像大小,上一节中的批尺寸相对较小,因此 GPU 利用率约为 70%。为了研究 GPU 满负荷时的训练时间差异,我将批量大小增加到 512,以使 GPU 显示出接近 100% 的计算利用率:

0b2b2d14-0125-11ed-ba43-dac502259ad0.jpg

由于 GPU 内存限制,批大小不可能超过 515。

同样,正如我们之前看到的,作为 2 的幂(或 8 的倍数)的批大小确实会产生很小但几乎不明显的差异。

多 GPU 训练

之前的基准测试评估了单块 GPU 上的训练性能。不过如今在多 GPU 上训练深度神经网络更为常见。所以让我们看看下面的多 GPU 训练的数字比较:

0b39c0cc-0125-11ed-ba43-dac502259ad0.jpg

请注意,推理速度被省略了,因为在实践中我们通常仍会使用单个 GPU 进行推理。此外,由于 GPU 的内存限制,我无法运行批处理大小为 512 的基准测试,因此在这里降低到 256。

正如我们所看到的,这一次 2 的幂和 8 的倍数批量大小 (256) 并不比 257 快。在这里,我使用 DistributedDataParallel (DDP) 作为默认的多 GPU 训练策略。你也可以使用不同的多 GPU 训练策略重复实验。GitHub 上的代码支持 —strategy ddp_sharded (fairscale)、ddp_spawn、deepspeed 等。

基准测试注意事项

这里需要强调的是上述所有基准测试都有注意事项。例如我只运行每个配置一次。理想情况下,我们希望多次重复这些运行并报告平均值和标准偏差。(但这可能不会影响我们的结论,即性能没有实质性差异)

此外,虽然我在同一台机器上运行了所有基准测试,但我以连续的顺序运行它们,运行之间没有很长的等待时间。因此这可能意味着基本 GPU 温度在运行之间可能有所不同,并且可能会对计时产生轻微影响。

我运行基准测试来模仿真实世界的用例,即在 PyTorch 中训练具有相对常见设置的现成架构。然而,正如 Piotr Bialecki 正确指出的那样,通过设置 torch.backends.cudnn.benchmark = True 可以稍微提高训练速度。

其他资源和讨论

正如 Ross Wightman 所提到的,他也不认为选择批量大小作为 2 的幂会产生明显的差异。但选择 8 的倍数对于某些矩阵维度可能很重要。此外 Wightman 指出,在使用 TPU 时批量大小至关重要。(不幸的是,我无法轻松访问 TPU,也没有任何基准比较)

如果你对其他 GPU 基准测试感兴趣,请在此处查看 Thomas Bierhance 的优秀文章:https://wandb.ai/datenzauberai/Batch-Size-Testing/reports/Do-Batch-Sizes-Actually-Need-to-be-Powers-of-2---VmlldzoyMDkwNDQx

特别是你想要比较:

显卡是否有 Tensor Core;

显卡是否支持混合精度训练;

在像 DeiT 这样的无卷积视觉转换器

Rémi Coulom-Kayufu 的一个有趣的实验表明,2 次方的批大小实际上很糟糕。看来对于卷积神经网络,可以通过以下方式计算出较好的批大小:

Batch Size=int ((n×(1《《14)×SM)/(H×W×C))。

其中,n 是整数,SM 是 GPU 内核的数量(例如,V100 为 80,RTX 2080 Ti 为 68)。

结论

根据本文中共享的基准测试结果,我不认为选择批大小作为 2 的幂或 8 的倍数在实践中会产生明显的差异。

然而,在任何给定的项目中,无论是研究基准还是机器学习的实际应用上,都已经有很多旋钮需要调整。因此,将批大小选择为 2 的幂(即 64、128、256、512、1024 等)有助于使事情变得更加简单和易于管理。此外,如果你对发表学术研究论文感兴趣,将批大小选择为 2 的幂将使结果看起来不像是刻意挑选好结果。

虽然坚持批大小为 2 的幂有助于限制超参数搜索空间,但重要的是要强调批大小仍然是一个超参数。一些人认为较小的批尺寸有助于泛化性能,而另一些人则建议尽可能增加批大小。

个人而言,我发现最佳批大小在很大程度上取决于神经网络架构和损失函数。例如,在最近一个使用相同 ResNet 架构的研究项目中,我发现最佳批大小可以在 16 到 256 之间,具体取决于损失函数。

因此,我建议始终考虑调整批大小作为超参数优化搜索的一部分。但是,如果因为内存限制而不能使用 512 的批大小,则不必降到 256。有限考虑 500 的批大小是完全可行的。

原文标题:一番实验后,有关Batch Size的玄学被打破了

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

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

    关注

    42

    文章

    4840

    浏览量

    108146
  • 存储
    +关注

    关注

    13

    文章

    4883

    浏览量

    90251
  • gpu
    gpu
    +关注

    关注

    28

    文章

    5263

    浏览量

    136040

原文标题:一番实验后,有关Batch Size的玄学被打破了

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何设置HDI PCB布局?

    如何设置HDI PCB布局 在电子设计领域,HDI(High Density Interconnect)PCB,即高密度互连印刷电路板,已成为现代电子设备中不可或缺的关键组件。其以高集成度、小体
    的头像 发表于 03-30 17:01 962次阅读
    如何<b class='flag-5'>设置</b>HDI PCB布局?

    变频器起动过程曲线参数怎么设置

    (Acceleration Time) ● 定义:电机从静止加速至额定转速所需时间。 ● 典型设置范围:5-60秒(根据负载惯量调整)。 ● 重载应用建议:延长至标准值的1.5-2倍。 ● 过短会导致:电流冲击(可达额定电流5-7倍)。 ● 验证方法:监测启动电流不超过变
    的头像 发表于 01-23 12:03 451次阅读
    变频器起动过程曲线参数怎么<b class='flag-5'>设置</b>

    飞凌嵌入式ElfBoard-标准IO接口之设置缓冲区

    文件默认采用全缓冲模式。 size:指定缓冲区的大小。 4)返回值 成功返回0,失败将返回一个非0值,并且会设置errno来指示错误原因。 2.setbuf 用于以对文件的 stdio 缓冲区进行设置
    发表于 11-14 09:02

    芯来IDE是否支持__attribute__( (packed) )?需要设置什么吗?

    要开发一个以太网应用,使用__attribute__( (packed) ),可是在初始化的时候检查size发现没有按照要求压缩。想问一下需要设置什么吗,还是说不支持。
    发表于 11-10 08:12

    U盘插上后串口打印CBW size error怎么解决?

    request size 18, transfer size 0 CBW size error rt_udisk_run =-8 之前调好的U_HOST的驱动,插入u盘后正可以正常挂载与读写,今天插了另一个U盘后出现如上打
    发表于 10-13 06:53

    普源示波器DS8204-R触发功能设置指南

    基础设置:快速定位信号 1. 触发类型选择 在示波器界面进入“触发”菜单,根据信号特征选择触发模式: 边缘触发:适用于周期性信号,可设置上升沿/下降沿触发; 脉宽触发:针对特定脉冲宽度信号,设置最小/最大脉宽
    的头像 发表于 09-29 17:58 919次阅读
    普源示波器DS8204-R触发功能<b class='flag-5'>设置</b>指南

    激光锡焊的核心温控测温范围

    激光锡焊的温控与测温范围是保障焊接质量的核心参数,其设置需精准匹配焊料特性、工件材质及工艺需求。合理的温度区间控制既能确保焊锡充分熔化浸润,又能避免基材过热损伤,是精密电子制造中不可或缺的工艺指标。
    的头像 发表于 09-09 15:32 2637次阅读
    激光锡焊的核心温控测温<b class='flag-5'>范围</b>

    【嘉楠堪智K230开发板试用体验】基于 K230 的 参照HHB的 demo 实现基于 c 语言的自定义模型公交

    create_data_loaders(data_dir, batch_size=32, input_size=224): train_transforms, val_transforms = get_data_transforms
    发表于 09-07 00:45

    利用矢量网络分析仪测试大动态范围微波器件的几种方法

    准确测试结果,进而在测试精度不受影响的前提下通过设置较宽的中频带宽从而提高测试速度。矢量网络分析仪工作原理了解矢量网络分析仪的工作原理和动态范围的定义,对开展大动
    的头像 发表于 08-27 17:33 1884次阅读
    利用矢量网络分析仪测试大动态<b class='flag-5'>范围</b>微波器件的几种方法

    【「DeepSeek 核心技术揭秘」阅读体验】基于MOE混合专家模型的学习和思考-2

    , num_experts) def forward(self, x): # 1. 门控网络计算权重 [batch_size, num_experts] gating_weights
    发表于 08-23 17:00

    无线充电发射线圈参数设置

    无线充电发射线圈参数设置需考虑圆形与方形线圈选择,多层线圈设计增大磁场覆盖范围,尺寸与功率匹配需综合考虑。电阻降低可减少发热,电感需精确匹配。谐振频率需与接收端一致,不同应用场景需有差异化需求。
    的头像 发表于 07-17 08:17 1833次阅读
    无线充电发射线圈参数<b class='flag-5'>设置</b>

    泰克示波器MDO32电流探头怎么设置

    示波器电流探头的设置流程。 1.依据测量需求挑选适配探头:首先要明确待测电流信号的参数范围,这是选择合适电流探头的基础。对于幅值,需预估被测电流的最大值。例如,若要测量一般小型电子设备的工作电流,其电流通常在数安培以内,可
    的头像 发表于 07-16 14:34 1077次阅读
    泰克示波器MDO32电流探头怎么<b class='flag-5'>设置</b>的

    示波器探头偏置与动态范围的协同优化策略

    :最大不失真信号与最小可测信号的比值(dB) 关键指标:现代高端探头可达60dB以上动态范围 测量瓶颈:通常受限于探头前端的非线性失真 关键技术相互作用 偏置设置的三大黄金法则 中央定位原则:将信号置于量程中央区域 80%安全准则:保留2
    的头像 发表于 05-20 17:55 722次阅读
    示波器探头偏置与动态<b class='flag-5'>范围</b>的协同优化策略

    泰克示波器电流探头设置指南

    ,并针对常见问题提供解决方案,帮助工程师高效完成电流信号的精确测量。   一、电流探头选型与基础连接 1.1 确定测量需求 在设置电流探头前,需明确待测信号的参数范围: 电流幅值:根据被测设备的工作电流选择探头量程。例
    的头像 发表于 05-06 16:15 1484次阅读
    泰克示波器电流探头<b class='flag-5'>设置</b>指南

    变频器控制电机需要设置哪些参数

    变频器控制电机时需要设置的参数主要包括以下几类: 一、基本运行参数 1. 频率范围:根据电机的额定频率和工作要求,设置变频器的频率范围。这决定了电机的转速
    的头像 发表于 04-21 07:41 2511次阅读