31、高效神经网络推理量化方法综述

高效神经网络推理量化方法综述

在神经网络推理中,量化是一种重要的技术,它可以在不显著损失精度的前提下,减少模型的存储需求和计算量,从而提高推理效率。本文将介绍几种常见的量化方法,包括量化感知训练(QAT)、训练后量化(PTQ)、零样本量化(ZSQ)、随机量化,以及一些高级的量化概念,如模拟量化与整数量化、混合精度量化、硬件感知量化和蒸馏辅助量化。

1. 量化感知训练(QAT)

QAT 在训练过程中考虑量化的影响,通过学习量化参数来减少量化带来的精度损失。例如,QIT 可以学习非均匀量化设置中的量化步骤和级别;LSQ 引入了新的梯度估计方法,用于在 QAT 期间学习非负激活(如 ReLU)的缩放因子;LSQ+ 则将这一思想扩展到了产生负值的通用激活函数,如 swish 和 h-swish。

不过,QAT 的主要缺点是重新训练神经网络模型的计算成本较高。为了恢复精度,尤其是在低比特精度量化的情况下,可能需要进行数百个 epoch 的重新训练。如果量化模型要长期部署,并且效率和精度特别重要,那么这种重新训练的投入可能是值得的;但对于一些生命周期较短的模型,QAT 可能不是最佳选择。

2. 训练后量化(PTQ)

PTQ 是一种替代 QAT 的方法,它在不进行任何微调的情况下进行权重的量化和调整。与 QAT 相比,PTQ 的开销非常低,通常可以忽略不计,并且可以在数据有限或未标记的情况下应用。然而,这通常会导致与 QAT 相比更低的精度,特别是在低精度量化时。

为了减轻 PTQ 的精度下降问题,人们提出了多种方法:
- 偏差校正方法 :[569, 580] 观察到权重值在量化后的均值和方差存在固有偏差,并提出了偏差校正方法。
- 权重范围均衡 :[570, 573] 表明,均衡不同层或通道之间的权重范围(以及隐含的激活范围)可以减少量化误差。
- ACIQ 方法 :通过分析计算 PTQ 的最佳裁剪范围和通道位宽设置,但通道激活量化在硬件上难以高效部署。
- OMSE 方法 :去除激活上的通道量化,通过优化量化张量与相应浮点张量之间的 L2 距离来进行 PTQ。
- OCS 方法 :通过复制和分割包含异常值的通道,减轻异常值对 PTQ 的不利影响。
- AdaRound 方法 :提出自适应舍入方法,以减少量化损失。
- AdaQuant 方法 :允许量化权重根据需要进行更改,是一种更通用的方法。

3. 零样本量化(ZSQ)

为了在量化后实现最小的精度损失,通常需要访问全部或部分训练数据。但在许多情况下,由于训练数据集过大、专有或涉及安全隐私问题,无法访问原始训练数据。ZSQ 就是为了解决这个挑战而提出的,它可以分为两个级别:
- Level 1(ZSQ + PTQ) :无需数据和微调,允许更快、更轻松地进行量化。
- Level 2(ZSQ + QAT) :无需数据但需要微调,通常可以获得更高的精度,特别是在超低比特精度设置下。

ZSQ 的一种流行研究方向是生成与目标预训练模型所训练的真实数据相似的合成数据,用于校准和/或微调量化模型。例如,早期的工作使用生成对抗网络(GANs)生成合成数据,但这种方法无法捕捉真实数据的内部统计信息。后续的研究使用批量归一化(BatchNorm)中存储的统计信息,如通道均值和方差,来生成更真实的合成数据。

4. 随机量化

在推理过程中,量化方案通常是确定性的,但也有一些工作探索了随机量化在量化感知训练和低精度训练中的应用。随机量化的直觉是,与确定性量化相比,它可以让神经网络探索更多的可能性。例如,小的权重更新可能由于舍入操作而不会导致权重变化,但随机舍入可以为神经网络提供更新参数的机会。

随机量化根据权重更新的幅度,以一定的概率将浮点数向上或向下映射。例如,在 [469, 591] 中,Int 运算符的定义如下:

Int(x) =
{
    ⌊x⌋  with probability ⌈x⌉−x,
    ⌈x⌉  with probability x −⌊x⌋.
}

对于二进制量化,[543] 将其扩展为:

Binary(x) =
{
    -1  with probability 1 - σ(x),
    +1  with probability σ(x),
}

其中,Binary 是将实值 x 二值化的函数,σ(·) 是 sigmoid 函数。

最近,QuantNoise 引入了另一种随机量化方法,它在每次前向传播时对不同的随机权重子集进行量化,并使用无偏梯度训练模型。然而,随机量化方法的一个主要挑战是为每个权重更新创建随机数的开销较大,因此在实践中尚未得到广泛应用。

5. 高级量化概念
5.1 模拟量化与整数量化

部署量化神经网络模型通常有两种常见方法:模拟量化(又称假量化)和整数量化(又称定点量化)。

模拟量化中,量化后的模型参数以低精度存储,但操作(如矩阵乘法和卷积)使用浮点运算进行。因此,在进行浮点运算之前,需要对量化参数进行反量化。这种方法无法充分利用快速高效的低精度逻辑。

整数量化则使用低精度整数运算执行所有操作,无需对任何参数或激活进行浮点反量化,从而可以更高效地进行推理。整数量化在延迟、功耗和面积效率方面具有优势,许多硬件处理器支持快速处理低精度算术。

一些著名的整数量化工作包括将批量归一化融合到前一个卷积层的方法,以及为具有批量归一化的残差网络提出的整数计算方法。最近的工作还通过用整数算术近似 GELU、Softmax 和层归一化,将整数量化扩展到了 Transformer 架构。

操作 能量 (pJ) 面积 (μm²)
8b Add 0.03 36
16b Add 0.05 67
32b Add 0.1 137
16b FP Add 0.4 1360
32b FP Add 0.9 4184
8b Mult 0.2 282
32b Mult 3.1 3495
16b FP Mult 1.1 1640
32b FP Mult 3.7 7700
32b SRAM Read (8kb) 5.0 N/A
32b DRAM Read 640 N/A

从表格中可以看出,低精度逻辑在能量和面积效率方面明显优于高精度逻辑。例如,INT8 加法比 FP32 加法的能量效率高 30 倍,面积效率高 116 倍。

5.2 混合精度量化

虽然使用较低精度量化可以提高硬件性能,但将模型统一量化到超低精度可能会导致显著的精度损失。混合精度量化通过为每个层使用不同的比特精度来解决这个问题。

选择每个层的混合精度本质上是一个搜索问题,人们提出了多种方法:
- 基于强化学习的方法 :[598] 提出了一种基于强化学习的方法,通过硬件模拟器获取硬件加速器的反馈,自动确定量化策略。
- 基于神经网络架构搜索的方法 :[608] 将混合精度配置搜索问题表述为神经网络架构搜索(NAS)问题,并使用可微 NAS(DNAS)方法高效探索搜索空间。
- 周期性函数正则化方法 :使用周期性函数正则化来训练混合精度模型,自动区分不同层对精度的重要性,并学习各自的位宽。
- HAWQ 方法 :基于模型的二阶灵敏度自动找到混合精度设置。HAWQv2 将该方法扩展到混合精度激活量化,比基于强化学习的混合精度方法快 100 倍以上。HAWQv3 引入了整数、硬件感知的量化方法,通过快速整数线性规划方法找到给定应用特定约束下的最佳比特精度。

混合精度量化已被证明是一种有效且硬件高效的低精度量化方法,可以在最小化精度损失的同时,受益于低精度量化带来的内存占用减少和速度提升。

graph LR
    A[选择混合精度量化方法] --> B{方法类型}
    B --> |强化学习| C[基于强化学习的方法]
    B --> |NAS| D[基于神经网络架构搜索的方法]
    B --> |正则化| E[周期性函数正则化方法]
    B --> |二阶灵敏度| F[HAWQ 方法]
5.3 硬件感知量化

量化的目标之一是提高推理延迟,但并非所有硬件在对某些层或操作进行量化后都能获得相同的加速效果。量化的好处取决于硬件,许多因素,如片上内存、带宽和缓存层次结构,都会影响量化的加速效果。

为了实现最佳效益,需要进行硬件感知量化。例如,[598] 使用强化学习代理,根据不同层和不同位宽的延迟查找表,确定硬件感知的混合精度设置,但该方法使用的是模拟硬件延迟。最近的工作 [501] 直接在硬件中部署量化操作,并测量每个层在不同量化比特精度下的实际部署延迟。

5.4 蒸馏辅助量化

在量化中,结合模型蒸馏可以提高量化精度。通过将知识从全精度模型转移到量化模型,可以帮助量化模型更好地学习数据的特征,从而减少量化带来的精度损失。

综上所述,不同的量化方法各有优缺点,在实际应用中需要根据具体情况选择合适的量化方法。例如,如果数据充足且对精度要求较高,可以选择 QAT;如果数据有限或希望快速部署模型,可以考虑 PTQ;在无法访问训练数据的情况下,ZSQ 是一个不错的选择;而混合精度量化、硬件感知量化和蒸馏辅助量化则可以进一步提高量化模型的性能。

高效神经网络推理量化方法综述

6. 不同量化方法对比总结

为了更清晰地了解各种量化方法的特点,我们将主要的量化方法进行对比总结,如下表所示:
| 量化方法 | 优点 | 缺点 | 适用场景 |
| ---- | ---- | ---- | ---- |
| 量化感知训练(QAT) | 能较好地减少量化带来的精度损失,精度相对较高 | 重新训练计算成本高,耗时久 | 数据充足、对精度要求高、模型需长期部署 |
| 训练后量化(PTQ) | 开销低,可在数据有限或未标记时应用 | 精度相对较低,尤其是低精度量化时 | 数据有限、希望快速部署模型 |
| 零样本量化(ZSQ) | 无需访问训练数据,适用于数据敏感场景 | 部分方法需要微调,且生成合成数据可能存在问题 | 无法访问训练数据,如数据过大、专有或涉及安全隐私 |
| 随机量化 | 可让神经网络探索更多可能性 | 创建随机数开销大,未广泛应用 | 特定研究场景,需要探索更多参数更新可能性时 |
| 模拟量化 | 实现相对简单 | 无法充分利用低精度逻辑优势 | 带宽受限而非计算受限的任务,如推荐系统 |
| 整数量化 | 能高效进行推理,在延迟、功耗和面积效率方面有优势 | 对激活函数等有一定限制 | 追求低延迟、低功耗和高面积效率的场景 |
| 混合精度量化 | 有效且硬件高效,可减少精度损失并利用低精度优势 | 搜索最佳混合精度设置较复杂 | 希望在精度和低精度量化优势间平衡的场景 |
| 硬件感知量化 | 考虑硬件特性,实现最佳量化效益 | 需要对硬件有深入了解和测量 | 追求硬件量化最佳加速效果的场景 |
| 蒸馏辅助量化 | 可提高量化精度 | 依赖全精度模型 | 需要提高量化模型精度的场景 |

7. 量化方法的选择与应用建议

在实际应用中,选择合适的量化方法至关重要。以下是一些选择量化方法的建议和应用流程:
1. 评估数据可用性
- 如果有充足的训练数据,且对模型精度要求较高,同时有足够的计算资源和时间,QAT 是一个不错的选择。可以按照以下步骤进行:
- 准备好训练数据和全精度模型。
- 在训练过程中引入量化操作,使用合适的量化算法(如 LSQ、LSQ+ 等)学习量化参数。
- 进行数百个 epoch 的重新训练,以恢复精度。
- 如果数据有限或未标记,PTQ 更为合适。操作步骤如下:
- 直接对训练好的模型进行量化和权重调整,无需重新训练。
- 根据具体情况选择合适的 PTQ 改进方法,如偏差校正、权重范围均衡等。
2. 考虑数据敏感性
- 当无法访问原始训练数据时,ZSQ 是首选。根据具体需求选择 Level 1 或 Level 2:
- Level 1(ZSQ + PTQ):无需数据和微调,直接进行量化。
- Level 2(ZSQ + QAT):需要进行微调,可先使用合成数据进行校准和微调。合成数据可通过 GANs 或利用 BatchNorm 统计信息等方法生成。
3. 关注硬件特性
- 如果追求硬件的高效利用,可考虑整数量化、混合精度量化和硬件感知量化:
- 整数量化:优先选择支持低精度整数运算的硬件,如某些 GPU。在部署时,可参考相关的整数运算优化方法,如将 Batch Normalization 融合到卷积层等。
- 混合精度量化:根据硬件特性和模型特点选择合适的混合精度量化方法。如使用 HAWQ 方法时,可按照其算法流程计算二阶灵敏度,确定各层的最佳比特精度。
- 硬件感知量化:通过实际测量硬件中各层不同量化比特精度下的延迟,选择最佳的量化设置。可参考 [501] 的方法,直接在硬件中部署量化操作并测量。
4. 需要提高量化精度
- 当需要提高量化模型的精度时,可采用蒸馏辅助量化。具体步骤如下:
- 准备全精度模型作为教师模型和量化模型作为学生模型。
- 在训练量化模型时,使用蒸馏损失函数,将全精度模型的知识转移到量化模型中。

8. 量化方法的未来发展趋势

随着神经网络和硬件技术的不断发展,量化方法也将不断演进。以下是一些可能的未来发展趋势:
1. 更高效的量化算法 :继续研究和开发更高效的量化算法,减少量化带来的精度损失,同时降低计算成本。例如,进一步优化随机量化算法,减少随机数生成的开销,使其更具实用性。
2. 自适应量化 :根据不同的输入数据和硬件环境,自适应地选择最佳的量化方法和参数。例如,在不同的硬件平台上,自动调整混合精度量化的设置,以实现最佳的性能和精度平衡。
3. 与其他技术的融合 :将量化方法与其他神经网络优化技术(如剪枝、知识蒸馏等)相结合,进一步提高模型的效率和性能。例如,在剪枝后的模型上进行量化,或者在量化过程中更好地利用知识蒸馏的优势。
4. 对新型神经网络架构的支持 :随着新型神经网络架构(如 Transformer 等)的广泛应用,量化方法需要更好地支持这些架构。例如,进一步扩展整数量化到更多的激活函数和归一化操作,以适应 Transformer 架构的需求。
5. 硬件与算法的协同设计 :加强硬件和量化算法的协同设计,使硬件能够更好地支持量化操作,同时算法能够充分利用硬件的特性。例如,设计专门支持低精度量化的硬件架构,或者根据硬件的特点优化量化算法。

总之,量化方法在高效神经网络推理中具有重要的作用。通过了解不同量化方法的特点、选择合适的方法并关注其未来发展趋势,我们可以更好地应用量化技术,提高神经网络的推理效率和性能。在实际应用中,需要根据具体的需求和场景,综合考虑各种因素,选择最适合的量化方案。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值