技术文章和通讯

int8量化和深神经网络为什么受欢迎?

Ram Cherukuri MathWorks


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

然而,边缘设备内存有限,计算资源,和权力。这意味着必须深入学习网络优化为嵌入式部署。

int8量化已经成为一个流行的这种优化方法不仅对机器学习框架TensorFlow和PyTorch也像NVIDIA硬件工具链®TensorRT和Xilinx®DNNDK-mainly因为int8使用8位整数代替浮点数和整数数学代替浮点数学、减少内存和计算的要求。

这些需求可以相当大。例如,一个相对简单的网络就像AlexNet超过200 MB,而一个大型网络,如VGG-16超过500 MB [1]。这种规模的网络,不能适用于低功耗微控制器和较小的fpga。

在本文中,我们仔细看看使用8位代表数字意味着什么,看看int8量子化,数字表示的整数,可以减少内存和带宽使用率高达75%。

int8表示

我们从一个简单的例子开始使用VGG16网络组成的几个卷积和ReLU层和一些完全连接和最大池层。首先,让我们看看一个真实数量(重量的卷积层在这种情况下)可以用一个整数来表示。这个函数fi在MATLAB®给我们最好的精度扩展使用8位字长体重。这意味着我们得到最好的精确的比例因子2 ^ -12位模式和存储它,01101110,代表整数110。

\[实际\ _number =存储\ _integer *扩展\ _factor \]

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

脚本如下:

脚本

现在让我们考虑所有层的权重。使用fi再一次,我们发现比例因子,给予最好的精密卷积层中的权重是2 ^ 8。我们想象的分布直方图权重的动态范围。直方图显示大多数重量分布在2 ^ 3和2 ^ 9(图1),它还表明重量分布的对称性质。

图1所示。在VGG16从卷积层分布的权重。

图1所示。在VGG16从卷积层分布的权重。

这个例子显示数字转换的一种方式,用8位整数表示。有一些其他的选择:

选择一个不同的比例因子,考虑到精确权衡。因为我们选择比例因子2 ^ 8,近22%的重量低于精度。如果我们选择了一个比例因子2 ^ -10年,只有6%的权重会低于精度,但0.1%的权重会超出范围。这种权衡也说明了误差分布和最大绝对误差(图2)。我们可以选择16位整数,然后我们将使用比特的两倍。另一方面,使用4位会导致显著的精度损失或溢出。

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

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

当调用指定的偏见fi基于权重的分配。

\[实际\ _number = \ \ _factor _integer *扩展存储+偏见\]

你可以做一个类似的分析任何network-say, ResNet50 Yolo-and确定整数数据类型或比例因子可以代表重量和偏见在一定公差。

有两个关键好处使用int8表示整数的数据:

  • 可以减少数据存储需求的4倍,因为单精度浮点需要32位代表一个数字。结果是减少内存用来存储所有的重量和偏见和电力消耗在传输的所有数据,因为能源消耗是由内存访问。
  • 您可以使用整数计算获得进一步的加速而不是浮点数学,根据目标硬件。例如,您可以使用half-precision浮点NVIDIA gpu。不支持本地一半计算在大多数cpu。金宝app所有的目标,然而,支持整数数学,和一些还提供金宝app某些针对性的intrinsic,如支持SIMD,可以提供显著的加速使用整数时为基础计算。

量化int8网络

量化背后的核心理念是神经网络噪声的弹性;尤其是深层神经网络,训练去接键模式和忽视噪音。这意味着网络可以应付小重量和偏见的变化产生的网络量化误差和有越来越多的工作指示最小量化对整体网络的准确性的影响。这一点,再加上显著减少内存占用,功耗,和收益计算速度[1,2],使量化的一个有效的方法将神经网络部署到嵌入式硬件。

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

我们的网络模仿这两层的性质。我们在仿真软件建模这个网络金宝app®这样我们可以观察到的信号流和仔细看看计算的核心(图3)。

图3。MNIST网络。

图3。MNIST网络。

在每一层中,我们将会取代重量和偏见与缩放int8整数然后乘以矩阵乘法的输出固定指数重新调节。当我们验证修改后的网络验证的预测数据集,混淆矩阵显示int8表示仍保持95.9%的准确率(图4)。

图4。按比例缩小的MNIST的混淆矩阵。

图4。按比例缩小的MNIST的混淆矩阵

理解效率收益量化int8重量和偏见,让我们将这个网络部署到一个嵌入式硬件目标这个例子中,一个圣发现委员会(STM32F746G)。我们要分析两个关键指标:

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

当我们试图部署原始模型(双精度浮点),它甚至不适合在黑板上,内存溢出。最简单的修复是把重量和偏见到一个数据类型。现在模型适合在目标硬件,但仍有改进的余地。

我们使用比例模型,使用重量和偏见的int8矩阵,但计算仍在单精度(图5)。

图5。在layer1矩阵乘法。重量是int8,但输入数据在单精度和底层的计算在单精度。

图5。在layer1矩阵乘法。重量是int8,但输入数据在单精度和底层的计算在单精度。

生成的代码4 x消耗更少的内存,因为预期(图6)。

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

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

然而,发现董事会执行时间显示,单精度变体平均需要14.5毫秒(约69 fps)运行时按比例缩小的版本是有点慢,需要平均19.8毫秒(约50帧/秒)。这可能是因为单一精密铸件的开销,我们仍在做计算的单精度(图7)。

图7。为单身精度:生成的代码。底部:按比例缩小的版本。

图7。为单身精度:生成的代码。底部:按比例缩小的版本。

这个例子仅仅覆盖int8 quantization-storing重量和偏见的一个方面。运用同样的原则标准AlexNet和VGG现成的网络,你可以减少内存占用3 x [1]。

TensorFlow,例如,使岗位量化在两只形成8位浮点内核的权重和全整数量化权重和激活[3]。虽然TensorFlow使用比例因子和偏差映射到int8范围(-128、127),英伟达TensorRT避免偏见的需要编码的权重(-128、127)通过确定一个阈值范围,最大限度地减少损失的信息和饱和阈值范围之外的值[4]。

利用全整数量化的好处,我们需要扩展或每一层的输入转换成整数类型。这需要我们确定合适的扩展层的输入,然后重新调节后的整数乘法。但是int8将正确的数据类型,会有溢出,并将网络的准确性是可以接受的吗?

这些问题是定点的本质分析和,事实上,数字识别文档的示例说明了如何使用定点数据类型转换一个MNIST网络[5]。下面这个例子中所示的步骤,我们想出了一个8位表示权重与dropin精度在1%以下(图8)。

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

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

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

图9。左:从定点模型生成的代码。对的:第一层的权重比例MNIST网络。

图9。左:从定点模型生成的代码。对的:第一层的权重比例MNIST网络。

其他量化技术

我们看了只有少数的策略研究和探索优化深层神经网络为嵌入式部署。例如,第一层的权重,也就是100 x702大小,只包括192独特的价值观。其他的量化技术,可以应用包括以下:

  • 使用集群所共享的重量和重量使用霍夫曼编码以减少权重的数量[1]。
  • 量化权重到最近的两个。这显著加速计算,因为它代替乘法操作与算术操作转变快得多。
  • 激活函数替换查找表加快计算激活等功能双曲正切经验值。例如,在生成的代码如图9所示,我们可以进一步优化网络的性能,取代了双曲正切函数与一个查找表。

深度学习应用程序不仅仅是网络。你也需要的预处理和后处理逻辑应用程序的考虑。我们一直讨论的一些工具和技术等量化算法用于几十年了。他们不仅可以用来量化网络但整个应用程序。

你可以探索这些用MATLAB优化的思想。你可以探索的可行性和影响量化进一步有限精度整数数据类型如int4或探索像一半精度浮点数据类型。可以令人印象深刻的结果:歌曲、惠子和威廉[1]使用这些技术的组合来减少网络的大小就像AlexNet和VGG 35 x到49岁,分别。

2019年出版的

引用

  1. 深度压缩:压缩与修剪深层神经网络,训练有素的量化和霍夫曼编码——歌汉,惠子毛,威廉J磨磨蹭蹭的,快ICLR 2016。

  2. 诉Vanhoucke、a .高级和m . z毛”cpu上改善神经网络的速度”,在深入学习和无监督特征学习研讨会,少量的2011,2011。

查看相关文章的能力