🌟 引言:从浮点到整数的革命
深度学习在过去十年中取得了巨大的进展,但其计算需求也随之飙升。32位单精度浮点数(fp32)曾是深度学习应用的主导数值格式,但随着模型规模的扩大和计算需求的增加,低精度格式逐渐成为提升计算性能的关键。16位浮点数(如fp16和bfloat16)已被广泛用于训练,而在推理阶段,更低精度的格式(如定点数和整数)则展现出更大的潜力。
低精度格式的优势显而易见:首先,许多处理器为低比特格式提供了更高的计算吞吐量,从而加速了卷积和矩阵乘法等数学密集型操作;其次,较小的字长减少了内存带宽压力,提升了带宽受限计算的性能;最后,较小的字长降低了内存需求,从而提高了缓存利用率和其他内存系统操作的效率。
本文聚焦于神经网络推理中的整数量化,探讨其数学原理、技术挑战以及在实际应用中的表现。通过大量的实验,我们展示了一种8位量化工作流程,能够在包括MobileNets和BERT-large在内的所有网络中,将精度保持在浮点基线的1%以内。
🧮 量化的数学基础:从浮点到整数的映射
量化是将浮点数转换为整数的过程,其核心在于如何将实数值映射到有限的整数范围内。我们主要关注均匀量化,因为它允许在整数域中执行矩阵乘法和卷积操作,从而利用高吞吐量的整数数学管道。
3.1 范围映射:从实数到整数的转换
量化的第一步是选择实数的范围,将超出该范围的值进行截断。第二步则是将实数值映射到可表示的整数范围内。我们主要讨论两种量化方式:仿射量化和尺度量化。
仿射量化
仿射量化通过以下公式将实数值x映射到b位有符号整数x_q:
s = \frac{2^b - 1}{\alpha - \beta}
z = -\text{round}(\beta \cdot s) - 2^{b-1}
其中,s为缩放因子,z为零点。量化操作定义为:
x_q = \text{quantize}(x, b, s, z) = \text{clip}(\text{round}(s \cdot x + z), -2^{b-1}, 2^{b-1} - 1)
反量化操作则为:
\hat{x} = \text{dequantize}(x_q, s, z) = \frac{1}{s}(x_q - z)
尺度量化
尺度量化仅使用缩放因子进行映射,其对称变体定义为:
s = \frac{2^{b-1} - 1}{\alpha}
x_q = \text{quantize}(x, b, s) = \text{clip}(\text{round}(s \cdot x), -2^{b-1} + 1, 2^{b-1} - 1)
反量化操作为:
\hat{x} = \text{dequantize}(x_q, s) = \frac{1}{s}x_q
3.2 量化粒度:从全张量到逐通道
量化粒度决定了量化参数在张量元素中的共享方式。最粗粒度的全张量量化共享所有元素的量化参数,而最细粒度的逐元素量化则为每个元素单独设置量化参数。中间粒度则在不同维度上重用参数,例如2D矩阵的逐行或逐列量化,3D张量的逐通道量化等。
在矩阵乘法中,整数矩阵乘法的实现要求缩放因子与k无关,因此激活量化和权重量化应分别采用全张量和逐列(或全张量)量化粒度。
3.3 仿射量化的计算成本
尽管仿射量化和尺度量化都允许使用整数算术,但仿射量化在推理过程中计算成本更高。尺度量化仅需在整数矩阵乘法后进行一次浮点乘法,而仿射量化则需要进行额外的整数运算,增加了计算开销。
🔍 量化实践:从理论到应用
4.1 权重量化:精度与性能的权衡
我们首先评估权重量化的影响,因为其值不依赖于网络输入。实验表明,逐通道量化能够在保持精度的同时,最大化计算性能。相比之下,全张量量化在某些网络中会导致显著的精度损失,尤其是在批量归一化(Batch Normalization, BN)参数被折叠到卷积层时。
4.2 激活量化:校准方法的选择
激活量化的精度很大程度上依赖于校准方法。我们比较了最大校准、熵校准和百分位校准(如99.9%到99.9999%)的效果。实验表明,熵校准和99.99%百分位校准在大多数网络中能够保持较好的精度,而最大校准则容易因异常值导致精度下降。
🛠️ 精度恢复技术:从部分量化到量化感知训练
5.1 部分量化:跳过敏感层
部分量化的核心思想是跳过对量化最敏感的层,以牺牲部分性能为代价来提升精度。我们通过逐层敏感性分析,识别出对量化最敏感的层,并跳过这些层的量化。实验表明,跳过少数敏感层能够在保持大部分性能的同时,显著提升量化模型的精度。
5.2 量化感知训练:让模型适应量化
量化感知训练(Quantization-Aware Training, QAT)通过在训练过程中插入伪量化操作,使模型能够适应量化后的权重和激活值。QAT使用直通估计器(Straight-Through Estimator, STE)来近似量化操作的梯度,从而在训练过程中优化量化模型。实验表明,QAT能够显著提升量化模型的精度,尤其是在后训练量化(PTQ)无法满足精度要求时。
5.3 量化参数学习:从固定到动态
除了在训练过程中固定量化参数外,还可以通过PACT等方法在训练过程中学习激活量化范围。实验表明,当激活量化范围初始化得当时,学习量化参数并不能显著提升精度。然而,在初始化不佳的情况下,学习量化参数能够显著改善模型的精度。
📊 推荐工作流程:从校准到微调
基于实验结果,我们推荐以下8位量化工作流程:
- 权重量化:使用尺度量化,采用逐列/逐通道粒度,并使用最大校准。
- 激活量化:使用尺度量化,采用全张量粒度。
- 后训练量化:量化所有计算密集型层,并运行多种校准方法(如最大、熵和99.99%百分位校准)。如果校准结果不理想,则进行部分量化或量化感知训练。
- 量化感知训练:从最佳校准模型开始,使用QAT进行微调,微调时间约为原始训练时间的10%,学习率从初始训练学习率的1%开始,并采用余弦退火学习率调度。
🎯 结论:整数量化的未来
本文回顾了神经网络整数量化的数学基础,并通过大量实验评估了不同量化选择的效果。我们提出了一种量化工作流程,能够在包括MobileNets和BERT-large在内的所有网络中,将精度保持在浮点基线的1%以内。这一工作流程仅涉及后训练量化、部分量化和量化感知微调技术,无需复杂的优化方法。然而,对于更低比特的整数表示,这些复杂技术可能仍需进一步探索。
参考文献
- Wu, H., Judd, P., Zhang, X., Isaev, M., & Micikevicius, P. (2020). Integer Quantization for Deep Learning Inference: Principles and Empirical Evaluation. arXiv preprint arXiv:2004.09602.
- Jacob, B., et al. (2018). Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference. arXiv preprint arXiv:1712.05877.
- Krishnamoorthi, R. (2018). Quantizing deep convolutional networks for efficient inference: A whitepaper. arXiv preprint arXiv:1806.08342.
- McKinstry, J. L., et al. (2019). Low Precision Inference on GPUs. arXiv preprint arXiv:1905.07374.
- Choi, Y., et al. (2018). PACT: Parameterized Clipping Activation for Quantized Neural Networks. arXiv preprint arXiv:1805.06085.