NVIDIA 深度学习性能

内存受限层用户指南

摘要

本指南介绍了内存受限层(包括批量归一化、激活函数和池化)的性能。它还提供了关于理解和减少网络中这些层所花费时间的技巧。

以下快速入门清单为性能受内存访问限制的层提供了具体技巧。

  • 浏览 NVIDIA cuDNN API 参考 或您的框架中每个层的可用实现。通常,提高性能的最佳方法是选择更高效的实现。例如,批量归一化的持久性实现需要从内存中加载的次数更少。

  • 注意每个层所需的内存访问次数。内存受限计算的性能仅取决于每次传递需要加载和/或存储的输入、输出和权重的数量。我们没有针对这些层的建议参数调整。

  • 注意每个层对整体训练步骤性能的影响。在没有大型且计算密集型层来主导性能的小型网络中,内存受限层最有可能占用大量时间。

深度学习模型中使用的许多类型的层,包括归一化、激活函数和池化层,每个输入和输出值的计算量相对较少。在 GPU 上,预计这些层的前向和反向传播会受到内存传输时间的限制。

背后的原因在 NVIDIA GPU 性能背景用户指南 中有更详细的解释。本指南侧重于内存受限层中常见的性能趋势,以及每个层的重要算法和参数选择。

归一化层是提高训练正则化的常用工具。

归一化操作有很多变体,不同之处在于正在操作的输入张量的“区域”(例如,批量归一化操作颜色通道内的所有像素,而层归一化操作小批量样本内的所有像素)。所有这些操作都具有非常相似的性能行为;它们都受到内存带宽的限制。例如,让我们考虑批量归一化。

3.1. 批量归一化

批量归一化 (BN) 层将 4D(NCHW 或其他布局)张量作为输入,对每个通道 C 内的所有像素进行归一化、缩放和移位。在大多数卷积神经网络中,BN 层跟随在卷积层之后。

批量归一化在输入张量中没有足够的操作来在任何现代 GPU 上受到数学限制;因此,执行批量归一化所花费的时间主要由输入张量的大小和可用的内存带宽决定。

图 1. 两种不同区域中使用 NCHW 数据的空间和持久性空间批量归一化的持续时间。请注意,两个轴均以对数刻度缩放。NVIDIA A100-SXM4-80GB,CUDA 11.2,cuDNN 8.1。

batch-norm.svg

当输入张量非常小时,持续时间不会随输入大小而变化(图 1 (a),前向训练的批量大小低于 64 时)。这是因为张量足够小,内存带宽没有得到充分利用。但是,对于较大的输入,持续时间几乎与大小成线性增长(图 1 (b));移动两倍的输入和输出值将花费两倍的时间。

基准测试了两种不同的算法选项 图 1。非持久性批量归一化是一种多通道算法,其中输入数据将被读取一次或多次以计算统计信息(如均值和方差),然后再次读取以进行归一化。当输入足够小时,cuDNN 可以使用更好的单通道算法(持久性批量归一化)- 在这里,输入被读取一次到片上 GPU 内存中,然后从那里执行统计信息计算和归一化,而无需任何额外的数据读取。更少的数据读取导致到片外内存的流量减少,这 - 对于恒定带宽 - 意味着持续时间减少。换句话说,空间持久性批量归一化比其非持久性变体更快。

图 2. 两种不同区域中持久性空间批量归一化的持续时间,这次使用 NHWC 数据。请注意,两个轴均以对数刻度缩放。NVIDIA A100-SXM4-80GB,CUDA 11.2,cuDNN 8.1。

batch-norm-regions.svg

当使用 NHWC 数据时,可以看到类似的趋势。

激活函数通常跟随网络中的全连接层、卷积层或循环层。这些函数独立应用于每个激活值,因此我们将它们称为“逐元素”操作。

激活张量的形状保持不变。有关激活函数可能实现的详细信息,请参阅 cudnnActivationForward()cudnnActivationBackward() 的文档。TensorFlow 和 PyTorch 等深度学习框架通常使用它们自己的(非 cuDNN)实现和库来执行激活函数,例如通过 TensorFlow 1.13 中的 Eigen 库。无论实现方式如何,激活函数(和其他逐元素操作)在 GPU 上的通用性能行为始终相同,如下所述。

图 3. 激活函数的前向和反向传播的持续时间与输入大小(此处为 N*H*W*C)成正比。请注意,两个轴均以对数刻度缩放。NVIDIA A100-SXM4-80GB,CUDA 11.2,cuDNN 8.1。

activations.svg

这些函数涉及的计算量非常少,以至于它们的前向和反向传播速度由内存带宽决定。Sigmoid、ReLU 和 tanh 函数都仅依赖于单个激活值,因此具有非常相似的内存访问要求,因此性能也相似。图 3 显示持续时间始终与激活次数(此处为 N*H*W*C)成正比。因此,减少激活次数是加速激活函数的唯一方法。作为此规则的例外,非常小的激活张量可能没有传输足够的数据到内存和从内存传输以达到带宽饱和;在 图 3 中显示的 H=W=32 情况的反向激活图表中,最小批量大小的行为是可见的。

池化层通常用于神经网络中,以引入对输入中小的空间变化的鲁棒性,并减小流经神经网络的激活的空间维度(高度和宽度)。它们由输入的维度(N x H x W x C)、池化类型(例如,池化窗口内激活的最大值或平均值)、池化窗口的大小和形状(win_hwin_w)以及池化窗口应用之间的步幅(U 和 V)定义。

图 4. 对于较大的维度,持续时间与输入大小成正比。池化操作的前向和反向传播的性能有所不同。请注意,此处持续时间已在 N*H*W*C 上归一化。NVIDIA A100-SXM4-80GB,CUDA 11.2,cuDNN 8.1。

pooling.svg

深度神经网络中实际使用的大多数池化操作都受内存限制,因为它们每个元素执行的计算量不足以摊销读取输入和写入输出的成本:即使在理想的(前向传递)实现中,每个元素也仅重复使用 win_h * win_w 次。因此,大多数实际实现都侧重于最大化实现的内存带宽利用率,并且 图 4 中显示的两种实现都达到了足够大输入的带宽饱和。一旦达到饱和,执行时间将与输入张量的大小成正比。

声明

本文档仅供参考,不得视为对产品的特定功能、条件或质量的保证。NVIDIA Corporation(“NVIDIA”)对本文档中包含信息的准确性或完整性不作任何明示或暗示的陈述或保证,并且对本文档中包含的任何错误不承担任何责任。NVIDIA 对因使用此类信息或因使用此类信息而可能导致的侵犯第三方专利或其他权利的行为的后果或使用不承担任何责任。本文档不承诺开发、发布或交付任何材料(如下定义)、代码或功能。

NVIDIA 保留随时对此文档进行更正、修改、增强、改进和任何其他更改的权利,恕不另行通知。

客户应在下订单前获取最新的相关信息,并应验证此类信息是否为最新且完整。

NVIDIA 产品根据订单确认时提供的 NVIDIA 标准销售条款和条件进行销售,除非 NVIDIA 和客户的授权代表签署的单独销售协议(“销售条款”)另有约定。NVIDIA 在此明确反对将任何客户通用条款和条件应用于购买本文档中引用的 NVIDIA 产品。本文档未直接或间接地形成任何合同义务。

NVIDIA 产品并非设计、授权或保证适用于医疗、军事、航空、航天或生命支持设备,也不适用于 NVIDIA 产品发生故障或故障可能合理预期会导致人身伤害、死亡或财产或环境损害的应用。对于在上述设备或应用中包含和/或使用 NVIDIA 产品,NVIDIA 不承担任何责任,因此,此类包含和/或使用由客户自行承担风险。

NVIDIA 不保证或声明基于本文档的产品将适用于任何特定用途。NVIDIA 不一定会对每个产品的所有参数进行测试。客户全权负责评估和确定本文档中包含的任何信息的适用性,确保产品适合并满足客户计划的应用,并为应用执行必要的测试,以避免应用或产品的默认设置。客户产品设计中的缺陷可能会影响 NVIDIA 产品的质量和可靠性,并可能导致超出本文档中包含的附加或不同的条件和/或要求。NVIDIA 对任何可能基于或归因于以下原因的默认设置、损坏、成本或问题不承担任何责任:(i) 以任何违反本文档的方式使用 NVIDIA 产品或 (ii) 客户产品设计。

本文档未授予 NVIDIA 专利权、版权或其他 NVIDIA 知识产权下的任何明示或暗示的许可。NVIDIA 发布的有关第三方产品或服务的信息不构成 NVIDIA 授予使用此类产品或服务的许可,也不构成对此类产品或服务的保证或认可。使用此类信息可能需要获得第三方在第三方专利或其他知识产权下的许可,或者获得 NVIDIA 在 NVIDIA 专利或其他知识产权下的许可。

仅在事先获得 NVIDIA 书面批准的情况下,才允许复制本文档中的信息,并且复制必须未经修改并完全符合所有适用的出口法律和法规,并附带所有相关的条件、限制和声明。

本文档以及所有 NVIDIA 设计规范、参考板、文件、图纸、诊断程序、列表和其他文档(统称为“材料”)均按“原样”提供。NVIDIA 不对材料作出任何明示、暗示、法定或其他形式的保证,并且明确声明不承担任何关于不侵权、适销性和特定用途适用性的暗示保证。在法律未禁止的范围内,在任何情况下,NVIDIA 均不对任何损害负责,包括但不限于任何直接、间接、特殊、偶然、惩罚性或后果性损害,无论其由何种原因引起,也无论责任理论如何,即使 NVIDIA 已被告知发生此类损害的可能性。尽管客户可能因任何原因遭受任何损害,但 NVIDIA 对本文所述产品的客户承担的累计总责任应根据产品的销售条款进行限制。

Google

Android、Android TV、Google Play 和 Google Play 徽标是 Google, Inc. 的商标。

商标

NVIDIA、NVIDIA 徽标、CUDA、Merlin、RAPIDS、Triton Inference Server、Turing 和 Volta 是 NVIDIA Corporation 在美国和其他国家/地区的商标和/或注册商标。其他公司和产品名称可能是与其相关的各自公司的商标。

© 2020-2023 NVIDIA Corporation 及附属公司。保留所有权利。 上次更新时间:2023 年 7 月 26 日。