什么是INT8量化,为什么它为深神经网络流行?

Mathworks的Ram Cherukuri


在实时推理的边缘上的深度学习部署是许多应用领域的关键。在网络带宽,网络延迟和功耗方面,它显着降低了与云通信的成本。

但是,边缘设备具有有限的内存,计算资源和电源。这意味着必须针对嵌入式部署优化深度学习网络。

INT8量化已成为一种流行的方法,不仅用于机器学习框架,如Tensorflow和Pytorch,而且还用于像NVIDIA这样的硬件工具链®统治和Xilinx.®DNNDK - 主要是因为INT8使用8位整数而不是浮点数和整数数学而不是浮点数学,从而减少内存和计算要求。

这些要求可以相当大。例如,像alexNet这样的相对简单的网络超过200 MB,而像VGG-16这样的大型网络超过500 MB [1]。这种尺寸的网络不能适用于低功耗微控制器和较小的FPGA。

在本文中,我们将仔细查看表示使用8位表示数字的方法,并查看Int8量化的数量如何,其中数字在整数中表示,可以将内存和带宽使用量缩小多达75%。

INT8表示

我们从一个简单的例子开始,使用VGG16网络,包括多个卷积和relu层以及一些完全连接和最大池层。首先,让我们来看看真实世界的数字(这种情况下的一个卷积层中的权重)可以用整数表示。功能FI.在matlab.®使用8位字长度为我们提供最佳精度缩放。这意味着我们获得了具有2 ^ -12的缩放因子的最佳精度,并将其存储为位模式,01101110表示整数110。

\ [real \ _number =存储\ _integer * scaling \ _factor \]

\ [0.0269 = 110 * 2 ^ { - 12} \]

脚本如下:

现在让我们考虑层的所有重量。使用FI.再次,我们发现将为卷积层中所有重量提供最佳精度的缩放因子是2 ^ -8。我们在直方图中可视化权重的动态范围的分布。直方图表明大多数权重的分布在2 ^ -3和2 ^ -9的范围内(图1)。它还表明了重量分布的对称性。

图1. VGG16中卷积层的重量分布。

此示例显示了一种方式来量化和表示8位整数。有几个其他替代方案:

考虑精确权衡,选择不同的缩放因子。因为我们选择了2 ^ -8的缩放因子,所以近22%的重量低于精度。如果我们选择了2 ^ -10的缩放因子,则只有6%的重量将低于精度,但0.1%的权重将超越范围。此权衡也通过错误分布和最大绝对误差来说明(图2)。我们可以选择16位整数,但随后我们将使用两倍的位。另一方面,使用4位将导致显着的精度损失或溢出。

图2. 2 ^ -8(左)和2 ^ -10(右)和相应的最大绝对误差的误差的直方图分布。

调用时指定偏差FI.,基于重量分布。

\ [real \ _number =存储\ _integer * scaling \ _factor + bias \]

您可以对任何网络进行类似的分析 - 说,Reset50或Yolo - 并识别整数数据类型或缩放因子,其可以在特定公差内表示权重和偏置。

使用INT8表示整数中的数据有两个主要优势:

  • 您可以将数据存储要求减少为4,因为单精度浮点需要32位来表示数字。结果是用于存储所有权重和偏置的内存以及在传输所有数据时消耗的功率的记忆,因为能量消耗由内存访问主导。
  • 根据目标硬件,您可以使用整数计算而不是浮点数学来获得进一步加速。例如,您可能能够在NVIDIA GPU上使用半精度浮点。大多数CPU不支持本机半计算。金宝app但是,所有目标都支持整数数学,有些也提供了某金宝app些目标特定内在内部,例如SIMD支持,可以在使用底层计算的整数时提供显着的加速。

量化网络到INT8

量化背后的核心思想是神经网络对噪声的弹性;特别是深度神经网络,培训接受拾取关键模式并忽略噪音。这意味着网络可以应对由量化误差产生的网络的权重和偏置的小变化 - 并且存在生长的工作体,这表明量化对整体网络的准确性的最小影响。这样,耦合在计算速度下的内存占地面积,功耗和增益的显着降低[1,2],使量化成为将神经网络部署到嵌入式硬件的有效方法。

我们将应用我们上面讨论的想法。为简单起见,我们将使用一个简单的网络,用于由两层组成的Mnist数字分类。用于图像分类和物体检测的深网络,如VGG16或RESET包括各种各样的层。卷积层和完全连接的层是最内存密集型和计算密集层的层。

我们的网络模仿这两层的属性。我们在Simulink中建模了这个网络金宝app®这样我们就可以观察到信号流并仔细看看计算的肠道(图3)。

图3. Mnist网络。

在每层中,我们将用缩放的Int8整数替换权重和偏置,然后将矩阵乘法的输出与固定指数乘以重新扫描。当我们在验证数据集上验证修改的网络的预测时,混淆矩阵显示INT8表示仍保持95.9%的精度(图4)。

图4.缩放Mnist的混淆矩阵

要了解从量化权重和偏差到INT8的效率提升,让我们将这个网络部署到嵌入式硬件目标 - 在此示例中,ST发现板(STM32F746G.)。我们将分析两个关键指标:

  • 内存使用情况
  • 运行时执行性能

当我们尝试部署原始模型时(在双精度浮点)时,它甚至不适合电路板,并且RAM溢出。最简单的修复是将权重和偏置转换为单个数据类型。该模型现在适合目标硬件,但仍有改进余地。

我们使用使用INT8的缩放模型进行重量和偏置矩阵,但计算仍处于单精度(图5)。

图5. Layer1中的矩阵乘法。权重是INT8,但输入数据处于单精度,底层计算是单精度。

所生成的代码如预期的那样消耗4倍较少的内存(图6)。

图6.左:单精度代码。右:INT8代码。

但是,发现板上的执行时间显示单精度变体平均为14.5毫秒(大约69 fps),而缩放版本有点慢,平均为19.8毫秒(约50 fps)。这可能是因为投射到单精度的开销,因为我们仍在以单精度执行计算(图7)。

图7. TOP:生成的单精度代码。底部:缩放版本。

此示例仅涵盖了INT8中量化存储权重和偏差的一个方面。通过将相同的原则应用于标准的现成网络,如alexNet和vgg,您可以通过3x [1]来降低它们的内存占用空间。

例如,TensorFlow以两种形式的训练后量化为8位 - 只有浮点内核的权重和重量和激活的全整数量化[3]。虽然TensoRFlow使用具有偏置的缩放因子来映射到INT8范围[-128,127],但是NVIDIA TENRT通过确定最小化信息丢失的阈值来避免对[-128,127]范围的权重来偏置偏差并饱和超出阈值范围的值[4]。

要利用完整整数量化的好处,我们还需要将输入或将每个图层转换为整数类型。这要求我们确定图层输入的正确缩放,然后在整数乘法后重新归类。但是INT8将是正确的数据类型,是否会溢出,并且网络的准确性将是可接受的?

这些问题是定点分析的本质 - 实际上,数字识别文档示例说明了如何使用定点数据类型转换Mnist网络[5]。在该示例中所示的步骤之后,我们提出了一个8位表示,其重量在1%以下的精度下降(图8)。

图8.转换为使用16位字长度的模型。

生成的代码不仅是四分之一的大小;它也更快,11毫秒〜90 fps(图9)。

图9.左:从固定点模型生成的代码。右:从Mnist网络的第一层缩放权重。

其他量化技术

我们只研究了一些正在研究和探索的许多策略,以优化嵌入式部署的深度神经网络。例如,第一层中的权重为100x702的大小,仅由192个唯一值组成。可以应用的其他量化技术包括以下内容:

  • 通过群集权重和使用Huffman编码来使用权重共享来减少权重的数量[1]。
  • 量化重量到最接近的两个力量。这显着加速计算,因为它替换了速率更快的算术换档操作的乘法操作。
  • 用查找表替换激活功能,以加快激活功能的计算,例如塔尼exp.。例如,在图9所示的生成代码中,我们可以通过替换来实现网络的性能塔尼功能与查找表。

深度学习应用程序不仅仅是网络。您还需要考虑申请的预先和后处理逻辑。我们讨论过的一些工具和技术已被用于量化数十年来量化此类算法。它们可用于量化不仅仅是网络,而是整个应用程序。

您可以探索Matlab中的所有这些优化想法。您可以探索量化以进一步有限的精度整数数据类型,如INT4或探索浮点数据类型,如半精度。结果可以令人印象深刻:歌曲,惠芝和威廉[1]使用这些技术的组合来减少亚历纳网和vgg等网络的大小,分别为35倍和49倍。

发布2019年

参考

  1. 深压缩:用修剪,训练量化和霍夫曼编码 - 宋汉,惠芝毛,威廉·吉拉利,ICLR 2016,压缩深层神经网络。

  2. V.Vanhoucke,A.高级和M. Z.Mao,“提高CPU上的神经网络速度”,在深度学习和无监督的功能学习研讨会中,2011年的NIPS 2011年。

查看相关功能的文章