模型部署系列 | 卷积Backbone量化技巧集锦

简介: 模型部署系列 | 卷积Backbone量化技巧集锦

深度神经网络在广泛的任务中被证明是有效的。然而,它们高昂的计算和内存成本使得在资源受限的设备上部署它们不切实际。为了解决这个问题,已经提出了量化方案来减少内存占用并提高推理速度。虽然已经提出了许多量化方法,但它们缺乏对其有效性的系统分析。

为了弥补这一空白,作者收集并改进现有的量化方法,并提出了PTQ量化的黄金准则。作者在ImageNet数据集上使用2个流行的模型,ResNet50和MobileNetV2,评估了作者提出的方法的有效性。按照作者的准则进行量化后,即使直接将模型量化为8位也不会导致准确性下降,无需额外的训练。

基于准则的量化感知训练可以进一步提高低位量化的准确性。此外,作者还整合了一个多阶段微调策略,与现有的剪枝技术协同工作,进一步降低成本。

值得注意的是,作者的结果显示,30%稀疏的量化MobileNetV2实际上超越了等效的全精度模型的性能,凸显了作者提出的方案的有效性和韧性。

1、简介

自从AlexNet的引入以来,提出了大量出色的卷积神经网络,对各种视觉任务取得了有希望的成果。尽管取得了显著的结果,但在嵌入式或移动设备上部署CNN模型仍然具有挑战性,因为它对计算和内存存储造成了巨大负担。

为了解决这个问题,已经进行了大量的研究来降低相关成本,从而使CNN模型在实际应用中更加实用。广泛来说,这方面的研究可以分为3个不同的领域:

  • 高效结构设计
  • 模型剪枝
  • 模型量化

高效结构设计是一个富有挑战性的研究领域,引入了分离卷积作为一种有效的技术。这种方法将标准卷积分解为深度卷积和逐点卷积,从而减少计算量。其在高效网络中的成功应用包括MobileNets和ShuffleNets。这些网络广泛应用于资源受限的设备,并在实际应用中显示出了希望。此外,还提出了各种剪枝策略来减少计算和存储负担。然而,这些方法往往会导致准确性降低,使它们在实际应用中不那么吸引人。因此,重点已经转向开发高效结构设计方法,既可以提供高准确性,又不会损害计算效率。

量化是一种非常有效的部署模型的方法。它的有效性已经在最近的研究中得到证明,并因其硬件友好的特性而在工业界越来越受欢迎,它可以显著降低计算和内存成本。然而,尽管具有诸多优势,全精度模型和量化模型之间存在显著的准确性差距。这种差距在低位量化情况下(例如4位)尤为明显。尽管如此,研究人员正在积极努力缩小这一差距,使量化变得更加有效。

本文对卷积神经网络上的每个量化因素进行了系统的探索,形成了PTQ量化的黄金准则。此外,作者提出的多阶段微调策略使得量化能够与现有的剪枝策略协同工作。在ImageNet上使用ResNet-50和MobileNetV2进行不同位宽的量化的详细实验展示了作者提出方法的有效性。

2、量化方案

本节中,作者收集、审查和改进了现有的方法,以获取准确的量化神经网络。然后,作者进行了实验,使用两个代表性模型,ResNet50和MobileNetV2,在ImageNet数据集上检验这些方法的有效性。除非在实验中另有说明,权重和激活的位宽均设置为8位。

ImageNet分类任务被广泛认为是一个具有挑战性的基准,用于测试量化算法的有效性。该数据集包含128万个训练图像和5万个验证图像。在全精度训练期间,作者使用了随机大小裁剪策略,然后进行随机翻转和均值通道减法。作者的小Batch-size设置为256,并使用动量SGD优化器。

对于ResNet50,初始学习率设置为0.1,作者在第30、60和90个Epoch分别将其降低10倍,总共100个Epoch。对于MobileNetV2,初始学习率也为0.1,在第90、180和270个Epoch分别降低10倍,总共300个Epoch。

2.1、PTQ量化

1、确定最优的量化尺度

在进行高效的量化时,确定最优的量化尺度是主要挑战之一。选择给定位宽的大尺度允许更宽的表示范围,可以避免数据溢出,但也会导致更多的分布误差。相反,选择较小的尺度在大多数情况下可以减小量化误差,但由于数据范围较窄,可能导致数据溢出,从而导致数值计算错误。

为了解决这个问题,NVIDIA的TensorRT采用了一种PTQ量化方法,通过最小化量化前后特征图分布之间的Kullback-Leibler(KL)散度来扫描量化尺度。这种方法在量化流行的CNN模型,如ResNet和MobileNet,时表现出色,并且不需要额外的微调。

在数理统计的背景下,KL散度是衡量两个概率分布之间差异的一种度量。因此,通过最小化真实值和其量化结果之间的KL散度,它可以用于确定合适的量化尺度。

然而,通过实验作者发现,直接使用与最小KL散度相对应的尺度通常会导致性能下降。相反,作者发现优越结果的最优尺度通常大于最小KL散度的尺度。因此,作者引入了一个容差系数来改进CNN中的量化性能。作者不再选择具有最小KL散度的尺度,而是在一系列尺度候选值中扫描,并选择其对应的KL散度小于最小KL散度的T倍的最大值。

表1展示了作者方法的结果。为简单起见,作者为网络中的所有层设置了一个全局容差参数。为1.0时,对应于使用传统的KL散度算法进行特征图量化,它选择具有最小KL散度的量化尺度,并用作比较的基准。随着T的增加,作者观察到ResNet50和MobileNetV2的显著性能改进。

但是,如果将设置为非常高的值,它会退化为简单的对称MinMax量化,即将张量的最大值选为量化阈值。作者发现将设置为1.3可以显著改进大多数模型。

2、确定激活量化尺度的细节

通过作者的实验,作者发现,优秀结果的最优尺度通常大于对应于KL散度最小值的尺度,如图1所示。

基于这一观察,作者对之前在标准KL散度算法进行了改进。作者对改进后的算法进行了详细描述,如算法1所示。

在该算法中,作者通过不断迭代,利用KL散度的计算结果和给定的浮点范围来更新激活和权重的最优尺度,直至达到收敛条件为止。通过这样的改进,作者可以得到更优的尺度,从而获得更优越的结果。

3、量化的粒度

通常情况下,对整个张量使用单一的量化尺度通常会得到令人满意的结果。然而,Jacob等人最近的研究表明,在卷积权重的每个卷积核中使用不同的量化尺度可以得到出色的性能,在将模型部署到硬件上时不会增加计算复杂性。

在文献中,卷积层中的权重量化分为两种类型:Per-Tensor和Per-Channel。虽然激活只允许进行Per-Tensor量化,但卷积权重可以进行Per-Channel量化。

表2对比了8位和7位的Per-Tensor量化和Per-Channel量化。结果显示,在所有情况下,Per-Channel量化始终优于Per-Tensor量化,这是可以预期的,因为它提供了更大的灵活性和更少的分布误差。此外,随着位宽的降低,性能差距变得更加明显。

例如,在8位量化中,MobileNetV2的top-1准确率为71.45%,而Per-Channel量化优于Per-Tensor变体0.54%。然而,在7位量化中,差距扩大到2.48%。这些结果表明,在神经网络的权重中,Per-Channel量化的优势。

4、无符号量化

ReLU激活在现代架构中常被使用,用于解决梯度消失问题。在ReLU中,负的激活值被截断为零。当在ReLU之后对特征图进行量化时,可以应用无符号量化来改进正值的表示,通过丢弃负值来实现。本质上,这种方法相当于在正值的量化中添加一个额外的比特,从而有效地将表示的范围加倍。

为了评估无符号量化的有效性,作者将其结果与有符号量化进行了比较。如表3所示,作者观察到量化的类型对高效网络有重要影响。使用无符号量化,MobileNetV2的top-1准确率达到了71.94%,与全精度训练的准确率相等。

另一方面,有符号量化的变体只达到了71.28%的top-1准确率。因此,对于正激活值的表示,加入无符号量化对于在不增加额外成本的情况下获得更好的准确性至关重要。

5、量化位置

通常,在卷积层之后进行量化,可以有或没有激活层。在具有通过逐元素求和的快捷连接的残差网络中,通常会对残差分支的输出激活和求和后的特征进行量化。

然而,作者观察到在残差分支的末端进行量化会显著降低性能。这是因为在求和的情况下,两个输入特征的量化尺度需要保持一致。

作者认为这是一个严格的约束条件,可能导致显著的准确性降低。因此,在逐元素求和中,作者更倾向于保持浮点算术(例如半精度)并在所有实验中使用它。

6、量化放置的说明

如前所述,作者更倾向于使用浮点运算(如半精度)来进行元素级求和。图2展示了ResNet中量化瓶颈块的一个例子。

7、INT16中的累积

为了避免在卷积的累积过程中出现数据溢出,通常的做法是使用INT32数据类型来存储中间累积结果,即使权重和激活值被量化为8位或更少的位宽。

然而,为了进一步降低延迟和内存占用,作者建议在权重和激活值的位宽之和小于等于14时使用INT16数据类型进行累积。在作者的设置中,作者将卷积的权重量化为6位,激活值量化为8位,这满足了这个要求。

表格4展示了结果。作者发现,在量化的MobileNetV2中使用INT16进行累积时,几乎保持了准确性,这验证了使用INT16进行累积的有效性。

8、关于在INT16中的积累的详细阐述

在后续的第2.1节中,作者简要提及了累积过程。在这里,作者将详细介绍这个过程。图3说明了量化卷积的累积过程,其中A、W和O分别表示卷积层的浮点输入激活、权重和输出激活。进行量化卷积操作时,首先使用量化尺度SA和SW将A和W分别量化为INT8和INT6表示,表示为Aint和Wint。

通常情况下,使用INT32来存储累积结果,以避免数据溢出的可能性。然而,作者的实验表明,更节省内存的INT16数据类型足以完成这个任务。为了恢复浮点结果,可以将INT16中的累积结果与用于各自量化的激活和权重的量化尺度的乘积相乘。

9、PTQ量化指南

总结一下,为了提高PTQ量化的准确性,作者提出了以下准则:

  • 使用改进的KL散度算法和容差系数来确定激活值的量化尺度,并使用MinMax量化来确定权重的尺度。
  • 对权重使用Per-Channel量化,这比Per-Tensor量化更优,特别是对于高效的卷积操作。
  • 对正的激活值(如ReLU的输出)使用无符号量化。
  • 尽可能地避免对网络中的加法输入进行量化,因为这可以在计算量略微增加的情况下带来显著的性能提升。

表5展示了PTQ量化的结果。为了比较,作者使用了商业闭源的推理库TensorRT,并报告了使用不同校准数据的8次实验运行的平均结果。遵

循上述准则,作者在ResNet50和MobileNetV2上实现了8位量化的全精度准确性水平。实际上,作者的方法在一定程度上优于TensorRT。

2.2、QAT量化

1、折叠BN层

Batch Normalization (BN) 是一个关键模块,它增强了训练的稳定性,并使得深度神经网络的权重初始化要求降到最低。在训练过程中,BN操作被认为是一个线性操作,可以合并到前一个卷积层中。

为了实现量化感知训练,作者需要实现BN折叠来确定前向传递过程中的最优尺度。然后梯度以展开的方式进行反向传播,允许作者单独更新前一个卷积层的权重以及BN的尺度和偏移。参数折叠策略的公式如下:

其中W是前一个卷积层的权重,和是合并后的权重和偏置。、σγβ分别是BN的均值、方差、尺度和偏移值。和分别是卷积权重在合并前后的量化尺度向量。

值得注意的是,只需要在训练后执行一次即可。

2、量化感知训练

在较低精度(例如4位)下,对权重和激活进行量化,PTQ量化无法保持准确性,会有一定的容忍损失。在这种情况下,作者通过精细调整量化模型,增强权重的适应性和鲁棒性,来进一步提高准确性。

作者首先根据PTQ准则对经过训练的全精度模型进行量化。然后,作者采用修改后的训练过程对其进行微调,使模型适应量化。作者禁用了激进的随机大小裁剪,并采用了较弱的随机裁剪增强。模型进行微调,使用固定的权重量化尺度进行20个epochs的训练,改善训练收敛性。初始学习率为5e-4,在第10个epoch时衰减为原来的1/5,以达到可比较的性能。

表6显示了MobileNetV2的比较结果。在较低的精度(4位、5位和6位)量化下是具有挑战性的,但作者的方法在这些情况下都实现了最佳性能,超越了其他方法。

3、与剪枝集成

作者现在探索将量化与网络剪枝策略结合,旨在加速推理并减少内存占用。作者采用简单的非结构化剪枝方法,将“不重要”的权重置零,这些权重具有相对较小的绝对值,因为作者的重点不在于稀疏策略的设计。为了将剪枝与量化结合起来,作者提出了一个包含以下步骤的流程:

「稀疏化 →全精度微调 →PTQ量化 →QAT训练」

具体而言,作者首先对经过训练的全精度模型应用剪枝策略,从而在整个流程中保持稀疏性。在剪枝步骤后,作者使用较小的学习率对模型进行微调,使其余参数进行微调,生成另一个稀疏的全精度模型。接下来是PTQ量化,然后是如上所述的量化感知训练。这将得到两个连续的量化模型,即和。

作者在高效的MobileNetV2上进行了实验,结果显示在表7中。作者首先训练了一个top-1准确率为72.91%的全精度模型,然后对该模型进行了0%、10%、20%和30%的稀疏比率剪枝。

有趣的是,在第一次微调后,作者观察到所有经过剪枝的模型都优于全精度的Baseline模型,包括没有剪枝的模型(稀疏率为0)。这可能归因于微调期间数据增强的减弱,就像在量化感知训练中一样。

在经过QAT训练(即第二次微调)后,作者获得了一个8位MobileNetV2的量化模型,其top-1准确率为73.35%,是迄今为止最好的性能。

此外,所有具有不同剪枝比例的量化模型均优于全精度模型。这些结果表明,量化方案可以很好地与网络剪枝策略结合使用。

3、总结

在这项工作中,作者首先对PTQ量化的有效方法进行了系统地改进和优化,并在实践中建立了一个黄金准则。遵循这个准则,8位量化的模型可以达到与全精度模型相当的准确性,而无需额外的训练。

此外,作者提出了一种简单高效的量化感知训练策略,在较低精度的设置中进一步提高了准确性。最后,作者证明了量化可以与剪枝策略结合使用,并提出了一个多阶段微调的流程将它们连接在一起。

这些贡献为在资源受限的环境中实现更高效和准确的深度神经网络模型铺平了道路。

4、参考

[1].BAG OF TRICKS WITH QUANTIZED CONVOLUTIONAL NEURAL NETWORKS FOR IMAGE CLASSIFICATION.

相关文章
|
6天前
|
机器学习/深度学习 存储 自然语言处理
卷积神经元网络CNN基础
卷积神经元网络CNN基础
39 1
|
机器学习/深度学习 数据可视化 计算机视觉
轻量化Backbone | 如何改进MobileViT-v1与MobileViT-v2?MobileViT-v3带你实验
轻量化Backbone | 如何改进MobileViT-v1与MobileViT-v2?MobileViT-v3带你实验
663 0
轻量化Backbone | 如何改进MobileViT-v1与MobileViT-v2?MobileViT-v3带你实验
|
1天前
|
机器学习/深度学习 编解码 边缘计算
YOLOv5改进 | 卷积模块 | 用ShuffleNetV2卷积替换Conv【轻量化网络】
本文介绍了如何在YOLOv5中用ShuffleNetV2替换卷积以减少计算量。ShuffleNetV2是一个轻量级网络,采用深度可分离卷积、通道重组和多尺度特征融合技术。文中提供了一个逐步教程,包括ShuffleNetV2模块的代码实现和在YOLOv5配置文件中的添加方法。此外,还分享了完整的代码链接和GFLOPs的比较,显示了GFLOPs的显著减少。该教程适合初学者实践,以提升深度学习目标检测技能。
YOLOv5改进 | 卷积模块 | 用ShuffleNetV2卷积替换Conv【轻量化网络】
|
11月前
|
机器学习/深度学习
LeNet5模型与全连接模型的差异
LeNet5模型与全连接模型的差异
69 0
|
11月前
|
PyTorch 算法框架/工具
Pytorch 深度可分离卷积和MobileNet_v1
Pytorch 深度可分离卷积和MobileNet_v1
|
12月前
|
数据可视化 计算机视觉
轻量化Backbone | 如何改进MobileViT-v1与MobileViT-v2?MobileViT-v3带你实验(二)
轻量化Backbone | 如何改进MobileViT-v1与MobileViT-v2?MobileViT-v3带你实验(二)
130 0
|
12月前
|
机器学习/深度学习 计算机视觉 网络架构
轻量化Backbone | 如何改进MobileViT-v1与MobileViT-v2?MobileViT-v3带你实验(一)
轻量化Backbone | 如何改进MobileViT-v1与MobileViT-v2?MobileViT-v3带你实验(一)
601 0
|
12月前
|
机器学习/深度学习 计算机视觉 索引
目标检测无痛涨点新方法 | DRKD蒸馏让ResNet18拥有ResNet50的精度(一)
目标检测无痛涨点新方法 | DRKD蒸馏让ResNet18拥有ResNet50的精度(一)
298 0
|
12月前
|
机器学习/深度学习 SQL 编解码
Inception 新结构 | 究竟卷积与Transformer如何结合才是最优的?(一)
Inception 新结构 | 究竟卷积与Transformer如何结合才是最优的?(一)
199 0