Quantizing deep convolutional networks for efficient inference A whitepaper

Quantizing deep convolutional networks for efficient inference: A whitepaper

深度网络越来越多地被用于边缘的应用。边缘的设备通常具有较低的计算能力,在内存和功耗方面受到限制。也有必要减少向云端传输模型的通信量,以节省电力和减少网络连接要求。因此,迫切需要优化模型的技术,以减少模型大小,加快推理速度和降低功耗。

在这个问题上有广泛的研究,有几种方法被考虑。一种方法是从头开始建立高效模型[1],[2]和[3]。另一种方法是通过应用量化、剪枝和压缩技术来减少模型的大小[4]、[5]和[6]。通过拥有用于降低精度计算的高效内核,如GEMMLOWP[7]、Intel MKL-DNN[8]、ARM CMSIS[9]、Qualcomm SNPE[10]、Nvidia TensorRT[11]以及用于快速推理的定制硬件,已经实现了更快的推理速度[12]、[13]和[14]。

降低模型复杂性的一个简单方法是降低权重和激活的精度要求。这种方法有很多优点:

  • 它广泛适用于一系列的模型和用例。人们不需要为提高速度而开发一个新的模型结构。在许多情况下,人们可以从现有的浮点模型开始,快速量化它以获得固定点量化的模型,几乎没有精度损失,而不需要重新训练模型。多个硬件平台和库支持使用量化权重和激活的快速推理,因此不需要等待新的硬件开发。

  • 更小的模型占用空间。通过8位量化,可以将模型大小减少4倍,而精度损失可以忽略不计。这可以在不需要任何数据的情况下完成,因为只有权重被量化了。这也导致了模型更新的快速下载时间。

  • 更少的工作存储器和激活的缓存。中间计算通常存储在缓存中,供深层网络的后几层重复使用,减少存储这些数据的精度可以减少需要的工作存储器。拥有较低精度的权重和激活可以更好地重用缓存。

  • 更快的计算。大多数处理器允许更快地处理8位数据。

  • 更低的功率。移动8位数据的效率是移动32位浮点数据的4倍。在许多深层架构中,内存访问可以主导功耗[2]。因此,减少数据移动量可以对功耗产生重大影响。

上述所有因素都转化为更快的推理,由于内存访问和计算的精度降低,典型的速度提高了2-3倍。使用为低精度矢量算术而优化的处理器和硬件加速器,可以进一步提高速度和功耗。

2 Quantizer Design

2.1 Uniform Affine Quantizer

考虑一个范围为 ( x m i n , x m a x ) (x_{min}, x_{max}) (xmin,xmax)的浮点变量,需要量化为(0, N l e v e l s N_{levels} Nlevels - 1),其中 N l e v e l s N_{levels} Nlevels= 256,为8位精度。我们得出两个参数。Scale(∆)和Zero-point(z),它们将浮点值映射为整数(见[15])。Scale指定了量化器的步长, floating point零映射为零点[4]。零点是一个整数,确保零点被量化后没有误差。这对于确保零点填充等常见操作不会导致量化错误非常重要。

因此,对于one sided分布,范围( x m i n , x m a x x_{min}, x_{max} xmin,xmax)被放宽到包括零。例如,一个范围为(2.1,3.5)的浮点变量将被放宽到范围(0,3.5),然后被量化。请注意,在极端one sided的情况下,这可能会导致精度的损失。

一旦定义了 scale and zero-point,量化过程如下:

在这里插入图片描述

虽然 uniform affine quantize允许以8比特的精度存储权重和激活,但由于零点的存在,有一个额外的成本。考虑一个权重和激活之间的二维卷积

在这里插入图片描述

一个天真的卷积实现,在卷积之前进行零点加法,由于操作数较宽(16/32位),导致吞吐量减少2到4倍。我们可以通过使用上面的等式,并注意到最后一项是一个常数,其他每项都需要N次乘法,这比8位点乘的操作多3倍。通过注意到权重在推理时是恒定的,以及注意到所有相同大小的卷积核的激活之和是相同的,这可以进一步改善。然而,这需要优化卷积核。关于深入的讨论,请参见[16]。

2.2 Uniform symmetric quantize

仿射量化器的一个简化版本是对称量化器,它将零点限制为0。使用对称量化器,转换操作简化为

在这里插入图片描述

为了更快地实现SIMD,我们进一步限制权重的范围。在这种情况下,clamping被修改为:

在这里插入图片描述

2.3 Stochastic quantizer

随机量化的模型是将量化器作为一个加性噪声,然后进行四舍五入。随机量化器由以下公式给出:

在这里插入图片描述

反量化操作由等式3给出。注意,在期望中,随机量化器减少到浮点权重的传递,对于超出范围的值具有饱和。因此,该函数在计算梯度时表现良好。我们不考虑推理的随机量化,因为大多数推理硬件不支持它。

2.4 Modeling simulated quantization in the backward pas

对于量化感知训练,我们使用模拟量化操作来模拟量化的效果,这包括一个量化器和一个去量化器,即

在这里插入图片描述

由于模拟的统一量化器函数的导数几乎在任何地方都是零,因此需要在后向通道中对量化器进行近似建模。一个在实践中行之有效的近似方法(见[5])是为了定义量化器的导数,按照方程14的规定对其进行建模(见图1)。

由于模拟均匀量化器函数的导数几乎处处为零,因此需要近似值来模拟后向过程中的量化器。一种在实践中效果很好的近似方法(见[5])是按照等式14中的规定对量化器进行建模,以定义其导数(见图1)。(Since the derivative of a simulated uniform quantizer function is zero almost everywhere, approximations are required to model a quantizer in the backward pass. An approximation that has worked well in practice (see [5]) is to model the quantizer as specified in equation 14 for purposes of defining its derivative (See figure 1).)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

图1:模拟量化器(顶部),显示输出值的量化。为了计算导数而进行的逼近(下图)。

2.5 Determining Quantizer parameters

量化器的参数可以用几个标准来确定。例如,TensorRT[11]最小化原始分布和量化分布之间的KL分歧来确定step size。在这项工作中,我们采用更简单的方法。对于权重,我们使用实际的最小值和最大值来确定量化器的参数。对于激活,我们使用各批次的最小值和最大值的移动平均值来确定量化器参数。对于训练后量化方法,人们可以通过仔细选择量化器参数来提高量化模型的准确性

2.6 Granularity of quantization

我们可以为整个张量指定一个单一的量化器(由scale and zero-point定义),被称为每层量化。通过将量化器的参数适应于张量中的每个核,可以获得更好的精度[17]。例如,权重张量是4维的,是3维卷积核的集合,每个卷积核负责产生一个输出特征图。per-channel quantization量化对每个卷积核有不同的尺度和偏移。我们不考虑激活的per-channel quantization量化,因为这将使作为卷积和matmul操作核心的内积计算变得复杂。每层量化和每通道量化都允许有效的点乘和卷积实现,因为在这两种情况下量化器的参数都是固定的。

3 Quantized Inference: Performance and Accuracy

如第1节所述,量化模型可以提供多个好处。我们讨论了模型量化的多种方法,并展示了每种方法对性能的影响。

3.1 Post Training Quantization

在许多情况下,最好是通过压缩权重和/或量化权重和激活来减少模型的大小,以便更快地进行推理,而不需要重新训练模型。训练后量化技术使用起来比较简单,而且可以用有限的数据进行量化。在本节中,我们研究了不同的量化方案,包括只对权重进行量化和对权重和激活进行量化。我们表明,在广泛的网络中,per-channel quantization with asymmetric ranges产生了接近于浮点的精度。

3.1.1 Weight only quantization

一个简单的方法是只将网络的权重精度从浮点数降低到8位。由于只有权重是量化的,所以不需要任何验证数据就可以做到这一点(见图2)。一个简单的命令行工具可以将权重从浮点数转换成8位精度。如果只想减少用于传输和存储的模型大小,并且不介意以浮点方式进行推理的成本,那么这种设置是有用的。

3.1.2 Quantizing weights and activations

人们可以通过计算所有要量化的量的量化器参数,将浮点模型量化到8位精度。由于激活需要量化,人们需要校准数据,并需要计算激活的动态范围。(见图2)通常情况下,大约100个小型batch足以使激活范围的估计值收敛。

We make the following observations:

  1. 每通道量化可以提供良好的精度,可以作为权重和激活的训练后量化的良好基线,非对称量化为所有网络提供接近浮点的精度。
  2. 激活可以量化到8位,几乎没有精度上的损失。由于以下原因,激活的动态范围很低。

(a) Batch normalization with no scaling: 在Inception-V3中使用,确保所有特征图的激活值都是零均值和单位方差。
(b) ReLU6:在Mobilenet-V1中使用,它限制所有特征图的激活度在一个固定的范围内(0,6),从而去除大的动态范围变化。

  1. 与参数较少的Mobilenets相比,具有更多参数的网络,如Resnets和Inception-v3,对量化更为稳健
  2. There is a large drop when weights are quantized at the granularity of a layer, particularly for Mobilenet architectures.
  3. 几乎所有量化造成的精度损失都是由于权重量化造成的。

在层的粒度上进行权重量化,主要是由于批量归一化导致精度大幅下降,这导致单层卷积核的动态范围出现极端变化。附录A有关于批量归一化的影响的更多细节。每通道量化通过在核的粒度上进行量化来回避这个问题,这使得每通道量化的准确性不受批量规范化的影响。然而,激活仍然以每层对称量化的方式进行量化。

请注意,其他的方法,如权重正则化,也可以提高量化后训练的准确性,请参见[22]。

3.2 Quantization Aware Training

量化感知训练在训练期间对量化进行建模,可以提供比量化后训练方案更高的精度。在这一节中,我们描述了如何在训练期间对量化进行建模,并描述了如何使用TensorFlow中的自动量化工具轻松完成这一工作。我们还评估了不同量化方案在量化感知训练中获得的精度,并表明即使是每层量化方案在8比特精度下也显示出较高的训练后精度。我们还表明,在4位精度下,量化感知训练提供了比训练后量化方案更显著的改进。

我们使用对权重和激活的模拟量化操作来模拟量化的效果。对于后向传递,我们使用straight through estimator (见2.4节)来模拟量化。注意,我们在前向和后向计算中都使用模拟量化的权重和激活。然而,我们以浮点方式维持权重,并随着梯度的更新而更新它们。这确保了小的梯度更新会逐渐更新权重,而不是溢出。更新后的权重被量化并用于随后的前向和后向计算。对于SGD来说,更新是通过以下方式给出的。

在这里插入图片描述

3.2.1 Operation Transformations for Quantization

确保在训练时忠实地模拟所有量化相关的工件是很重要的。这可能会使加法(图6)和concatenation (图7)等琐碎的操作变得不简单,因为需要重新调整定点值,以便加法/concatenation 能够正确发生。

此外,重要的是要确保推理时的操作融合在训练中被正确建模。例如,考虑一个加法,然后是一个ReLU操作。在这种情况下,在大多数平台上,我们可以在推理时融合加法和ReLU操作。为了与此相匹配,伪量化操作不应该放在加法和ReLU操作之间。

3.2.2 Batch Normalization

在这一节中,我们描述了量化批量归一化层的几种策略。在第4节中,并表明带有correction and freezing的批量归一化提供了最好的准确性。
批量归一化[25],是一种流行的技术,它将每层输出的激活统计量归一化,减少各层的依赖性,同时显著提高模型精度。

在这里插入图片描述

在这里插入图片描述

其中μB和σB是batch 平均数和标准偏差。µ和σ是长期平均数和标准差,在训练期间作为批次统计的移动平均数计算。
对于推理,我们将batch normalization折叠到方程20和21所定义的权重中。因此,在推理过程中,没有明确的批量归一化。权重和偏差被修改以考虑到批量归一化。

在这里插入图片描述

在这里插入图片描述

对于量化推理,我们首先考虑折叠bn,并对其进行训练,如图8所示。我们注意到,批量规范化在训练时使用批量统计,但在推理时使用长期统计。由于每批统计量都不同,这就在量化权重中引入了不希望有的抖动,降低了量化模型的准确性。(14和15中的绿色曲线)一个简单的解决方案是在训练过程中改用长期移动平均数,然而,这消除了批次归一化(即使用的平均值和方差不对应于批次统计),并导致训练的不稳定。图形重写器实现了一个解决方案,消除了训练和推理与批量归一化之间的不匹配(见图9)。

3.2.4 Lower Precision Networks

我们注意到,在8比特的精度下,训练后量化方案提供了接近于浮点的精度。为了更好地理解量化意识训练的好处,我们进行了实验来评估权重和激活的4比特量化的性能。

我们进行了以下实验:

  • 实验1:4比特的每通道量化明显优于每层量化。我们表明,在所有网络中,每通道量化比每层量化提供了 对所有的网络来说,每通道量化比每层量化有很大的好处。在8位时,增益并不显著,因为有足够的水平来高保真地表示权重。在4比特处,即使对于训练后量化(表5的第2列和第3列),每信道量化的益处也是显而易见的。

  • 实验2:微调可以在较低的位宽下提供大量的精度改进。有趣的是,对于大多数网络来说,通过微调4比特的权重,可以获得8比特量化的5%以内的精度(表5第4列)。由于微调带来的改进在4比特时也更加明显。请注意,在这些实验中,激活被量化为8比特。

  • 实验3:低精度激活。我们研究了所有层的4位激活所获得的精度,并对其进行了微调。请注意,激活是以每层为单位进行量化的。权重是以8比特的精度量化的,具有每通道的颗粒度。我们注意到,在这种情况下,微调也能提高精确度。激活量化带来的损失比权重量化带来的损失更严重(见表6)。请注意,激活和权重的量化颗粒度是不同的,所以这不是对量化影响的公平比较。我们假设,量化激活会引入随机误差,因为激活模式因图像而异,而权重量化是确定的。这使得网络可以学习权重值,以更好地补偿权重量化带来的确定性失真。

4 Training best practices

我们对训练量化模型的几种配置进行了实验。我们的第一个实验比较了随机量化和确定性量化。随后,我们研究了从头开始训练量化模型是否比从浮点模型微调提供更高的精度。我们还评估了不同的批量归一化层的量化方法,并表明带有修正的批量归一化提供了最佳的精度。我们还比较了在训练过程中平均权重的方案和没有平均的方案。

  1. 随机量化没有提高准确性:随机量化确定了浮点权重,在随机量化下提供了稳健的性能,这导致量化的权重在不同的小批中变化。在推理中,量化是确定的,导致与训练不匹配。我们观察到,由于这种不匹配,随机量化的性能低于确定性量化(图12),这在训练中可以得到更好的补偿。

  2. 从floating point checkpoint量化一个模型可以提供更好的准确性。问题是,从头开始训练一个量化模型还是从浮点模型开始训练更好。与其他工作[27]一致,我们注意到当我们对浮点模型进行微调时,精度更好,如图13所示。这与一般的看法是一致的,即最好是训练一个具有更多自由度的模型,然后将其作为一个教师来产生一个较小的模型([28])。

3.匹配批量归一化与推理减少抖动(jitter),提高准确性。我们给出了两个网络的结果。在第一个实验(见图14)中,我们比较了Mobilenet-v1的训练与原始batch norm folding、batch renormalization和batch normalization with correction and freezing。我们注意到我们提出的方法具有稳定的评估精度和更高的精度。在第二个实验中,我们比较了Mobilenet v2_1_224的天真batch norm folding和带修正和冻结的批量规范化。我们注意到,修正稳定了训练,冻结批规范提供了额外的精度增益,在图15中的步骤400000之后可以看到。

在这里插入图片描述

图15:Mobilenet v2 1 224。批量归一化修正和冻结对精度的影响。没有修正的量化显示出高抖动(绿色曲线)。带有冻结的修正显示出良好的精度(蓝色和红色曲线)。在移动平均数被冻结后(400000步),评估精度的抖动明显下降。注意在充分训练后EMA权重的性能不足(红色曲线)。

在这里插入图片描述

图14:Mobilenet v1。Batch normalization量化方案的比较。没有修正的Batch normalization(绿色)显示了大量的抖动,这是由于各批次权重的缩放比例变化造成的。Batch renormalization(红色)改善了抖动,但没有消除抖动。使用移动平均统计对权重进行量化可以减少抖动,但不能消除它(橙色)。在200000步之后冻结移动平均数和方差更新,允许量化权重适应批次规范引起的缩放,并以最小的抖动提供最佳精度(蓝色曲线)。

  1. 谨慎使用指数移动平均法进行量化。权重的移动平均数[29]通常用于浮点训练以提供更好的准确性[30]。由于我们在反向传播过程中使用量化的权重和激活,浮点权重会收敛到量化的决策边界。即使是浮点权重的微小变化,在瞬时平均数和移动平均数之间也会导致量化后的权重明显不同,损害性能,见图15中EMA曲线的准确性下降。

5 Model Architecture Recommendations

在本节中,我们将探讨激活函数的选择以及网络的精度和宽度之间的权衡。

  • 不要约束激活范围。通过用ReLU6的非线性取代ReLU,让训练决定激活范围,可以获得稍好的准确性(见图16)。

间也会导致量化后的权重明显不同,损害性能,见图15中EMA曲线的准确性下降。

5 Model Architecture Recommendations

在本节中,我们将探讨激活函数的选择以及网络的精度和宽度之间的权衡。

  • 不要约束激活范围。通过用ReLU6的非线性取代ReLU,让训练决定激活范围,可以获得稍好的准确性(见图16)。

  • 探索宽度与量化的权衡。一个过度参数化的模型更适合于量化。即使是像mobilenet这样的精简架构,也可以通过权重的精确性来权衡深度乘法器。我们在图17中比较了在不同的深度乘法器上用每通道4比特量化权重和8比特量化权重获得的精度。值得注意的是,这种比较使我们能够评估深度与量化的权衡(见[31])。有趣的是,我们可以在几乎相同的时间内获得模型尺寸进一步减小25%的结果同样的精度,移动到4位精度的权重。

猜你喜欢

转载自blog.csdn.net/weixin_37958272/article/details/119111871