技术文章和通讯

什么是int8量化,为什么它在深度神经网络中流行?

作者:Ram Cherukuri, MathWorks


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

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

int8量化已经成为一种流行的优化方法,不仅适用于TensorFlow和PyTorch这样的机器学习框架,也适用于NVIDIA这样的硬件工具链®TensorRT和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 = stored\_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 = stored\_integer * scaling\_factor + bias\]

您可以对任何网络(例如ResNet50或yolo)进行类似的分析,并确定一个整数数据类型或比例因子,该数据类型或比例因子可以表示在某个容忍范围内的权重和偏差。

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

  • 您可以将数据存储需求减少到原来的4倍,因为单精度浮点需要32位来表示一个数字。其结果是用于存储所有权重和偏差的内存减少,以及传输所有数据所消耗的功率减少,因为能量消耗由内存访问主导。
  • 您可以通过使用整数计算而不是浮点计算来获得进一步的加速,这取决于目标硬件。例如,您可以在NVIDIA gpu上使用半精确浮点。大多数cpu不支持本地半计算。金宝app然而,所有目标都支持整数运算,有些目标还提供金宝app特定于目标的内在特性,如SIMD支持,这可以在使用整数进行基础计算时提供显著的加速。

将网络量化为int8

量化背后的核心思想是神经网络对噪声的弹性;特别是深度神经网络,它被训练得能够识别关键模式并忽略噪声。这意味着网络可以应对量化误差导致的网络权重和偏差的微小变化,而且越来越多的工作表明量化对整个网络的准确性影响最小。这使得量化成为将神经网络部署到嵌入式硬件的一种有效方法,再加上显著减少内存占用、功耗和提高计算速度[1,2]。

我们将把上面讨论的想法应用到网络中。为了简单起见,我们将使用一个简单的网络来进行MNIST数字分类,它由两层组成。用于图像分类和目标检测的深度网络,如VGG16或ResNet,包括多种层次。卷积层和全连接层是内存和计算最密集的层。

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

图3。MNIST网络。

在每一层中,我们将用缩放后的int8整数替换权重和偏差,然后将矩阵乘法的输出乘以固定指数来缩放。当我们在验证数据集上验证修正网络的预测时,混淆矩阵显示int8表示仍然保持95.9%的准确性(图4)。

图4。缩放MNIST的混淆矩阵

为了理解将权值和偏差量化到int8的效率收益,让我们将这个网络部署到一个嵌入式硬件目标—在本例中,一个ST发现板(STM32F746G)。我们将分析两个关键指标:

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

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

我们使用使用int8的权重和偏差矩阵的比例模型,但计算仍然是单一精度(图5)。

图5。第1层的矩阵乘法。权值是int8,但是输入数据是单精度的,底层计算也是单精度的。

如预期的那样,生成的代码消耗的内存少了4x(图6)。

图6。左:单精度的代码。右:int8代码。

然而,在发现板上的执行时间显示,单精度版本平均运行14.5毫秒(大约69帧每秒),而缩放版本稍微慢一点,平均运行19.8毫秒(大约50帧每秒)。这可能是因为对单一精度的强制转换的开销,因为我们仍然在单一精度中进行计算(图7)。

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

这个示例只涉及量化的一个方面—在int8中存储权重和偏差。通过将同样的原则应用到标准的现成网络,如AlexNet和VGG,您可以将它们的内存占用减少3倍[1]。

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

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

这些问题是定点分析的本质——事实上,数字识别文档示例说明了如何使用定点数据类型[5]转换MNIST网络。按照该示例中演示的步骤,我们得到了权重的8位表示,其插入精度低于1%(图8)。

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

生成的代码不仅只有原来的四分之一大小;它也更快,11毫秒~ 90帧每秒(图9)。

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

其他量化技术

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

  • 通过聚类权值进行权值共享,并使用Huffman编码减少权值[1]。
  • 量化重量到两个最接近的力量。这显着加速了计算,因为它替换了具有更快的算术换档操作的乘法操作。
  • 将激活函数替换为查找表以加快激活函数的计算,例如双曲正切经验值.例如,在图9所示的生成的代码中,我们可以通过替换来进一步优化网络的性能双曲正切函数带有查找表。

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

你可以在MATLAB中探索所有这些优化思想。您可以探索量化以进一步限制精度整数数据类型(如int4)的可行性和影响,或者探索浮点数据类型(如半精度)。结果可能是令人印象深刻的:Song、Huizi和william[1]使用了这些技术的组合,分别将AlexNet和VGG等网络的大小减少了35倍和49倍。

2019年出版的

参考

  1. 深度压缩:基于剪枝、训练量化和霍夫曼编码的深度神经网络压缩-韩松,毛慧子,william J Dally, ICLR 2016。

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

查看相关功能的文章