量化基础:什么是模型量化、定点与浮点、量化参数(scale/zero-point)、对称与非对称量化

在深入地平线模型量化工具链之前,我们首先需要建立对量化本身清晰且准确的认识。模型量化本质上是一种数值精度与计算效率的交换艺术——它通过将神经网络中高精度的浮点参数和激活值,映射到低比特的整数表示,从而换取更小的模型体积、更低的内存带宽需求和更快的推理速度。对于地平线征程系列芯片这类边缘计算平台而言,量化不仅是优化手段,更是将深度学习模型部署到嵌入式硬件的必经之路。本章将系统拆解量化的数学本质、核心参数以及两种最基本的量化策略,为后续的校准数据准备和精度评估打下坚实的理论基础。

数值表示体系 量化核心参数 量化策略对比 FP32 浮点 动态范围大,精度高 INT8 定点 范围[-128,127],效率高 映射关系 r = S(q - Z) |-- 量化 -->| |<-- 反量化 --| Scale (缩放因子) 浮点范围 / 整数范围 决定步长,影响精度 Zero-Point (零点) 浮点0对应的整数 非对称量化关键 量化公式 q = round(r/S) + Z 核心:确定S和Z 对称量化 Z=0,范围对称 适合权重,实现简单 非对称量化 Z≠0,范围灵活 适合激活值,精度更高 选择依据 数据分布是否过零点 权重对称,激活非对称 量化本质:在有限整数位宽下,寻找最优的 S 和 Z 以最小化信息损失

上图清晰地勾勒出本章的知识框架:左侧是数值表示体系的转换,中间是量化参数的定义,右侧则是两种量化策略的对比。接下来,我们将逐一深入这些核心概念,并探讨它们在实际部署中的具体考量。

核心原理:从浮点域到整数域的数学映射

模型量化最根本的数学基础是一个仿射变换。假设我们有一个浮点实数 \( r \),我们希望将其转换为一个整数 \( q \)。这个转换过程并非简单的四舍五入,而是由一个线性映射加上一个偏移量构成。其标准数学表达式为:

q = clamp(round(r / S) + Z, q_min, q_max)

其中,S(Scale)是缩放因子,它是一个浮点数,表示整数中每一个“步长”对应多大的浮点数值范围;Z(Zero-Point)是零点,它是一个整数,表示浮点数值 0.0 经过量化后对应的整数。\( q_{min} \) 和 \( q_{max} \) 则是由位宽决定的整数表示范围,例如对于 INT8,范围是 [-128, 127]。

反量化过程则是上述变换的逆运算,用于在推理时将整数结果还原为浮点值(通常在算子内部完成,以便进行浮点累加或传递给下一个算子):

r = S * (q - Z)

理解这个公式是掌握一切量化细节的钥匙。它揭示了两个关键点:第一,量化过程必然引入舍入误差,因为浮点数值被映射到离散的整数点上;第二,S 和 Z 的选择直接决定了映射的精度和有效性。如果 S 过大,则步长粗糙,精度损失严重;如果 S 过小,则可能无法覆盖整个动态范围,导致数值截断。因此,量化的核心任务就是基于真实数据分布,寻找最优的 S 和 Z。

判断方法:定点与浮点的本质区别及硬件偏好

在计算机科学中,浮点数(如 FP32)通过符号位、指数位和尾数位来表示数值,其特点是动态范围极大,能够表示从极小到极大的数值,但代价是计算单元复杂、功耗高、面积大。而定点数(如 INT8)则仅用固定位宽的整数表示,其动态范围有限,但计算单元简单、速度快、功耗低。

对于地平线征程系列芯片这类 AI 加速器而言,其内部的计算单元(如矩阵乘法单元)针对 INT8 进行了深度优化。这意味着,如果模型以 FP32 精度运行,不仅无法利用硬件的峰值算力,还会因为巨大的内存带宽消耗而严重拖慢推理速度。因此,判断一个模型是否适合部署,首要标准就是看它能否被量化到 INT8(或更低的 INT4/INT2)精度,同时保持可接受的精度损失。

在实际工程中,我们通常遵循以下判断流程:

  1. 分析权重分布:预训练模型的权重通常呈现以 0 为中心的对称分布(类似高斯分布或拉普拉斯分布),这非常适合对称量化。
  2. 分析激活值分布:经过 ReLU 等激活函数后,激活值通常是非负的,且分布可能偏向某一侧,此时非对称量化能更好地利用有限的整数范围。
  3. 评估敏感度:并非所有层对量化都同样敏感。某些层(如检测头的最后一层)对数值精度极其敏感,可能需要保留更高精度(如 FP16)或进行混合精度量化。
经验之谈:在开始量化之前,务必使用工具(如 Python 的 matplotlib 或 seaborn)可视化几个关键层的权重和激活值直方图。如果发现某个层的激活值分布存在极端离群点(Outlier),直接使用 min-max 量化会导致其他正常数值的精度严重受损,此时需要考虑截断(Clipping)或使用更先进的校准方法。

案例拆解:对称与非对称量化的实战选择

为了更直观地理解对称与非对称量化的差异,我们以一个具体的卷积层为例。假设某层权重的最小值为 -0.5,最大值为 0.5,而激活值的最小值为 0.0,最大值为 6.0。

量化类型 计算 S 计算 Z 优点 缺点
对称量化 S = 0.5 / 127 ≈ 0.00394 Z = 0 实现简单,推理时无需减去零点,计算量小 若数据分布偏向一侧(如激活值全为正),则一半的整数范围(负数部分)被浪费,精度利用率低
非对称量化 S = 6.0 / 255 ≈ 0.02353 Z = -round(0.0 / 0.02353) = 0 充分利用整个整数范围,对于偏置分布的数据精度更高 推理时需要额外计算减去 Z 的操作,略微增加计算开销

在上述案例中,对于权重(对称分布),对称量化是首选,因为它简单且不损失精度。对于激活值(全为正),非对称量化显然更优,因为它将 [0, 6.0] 的范围映射到了完整的 [0, 255] 区间,而对称量化只能映射到 [0, 127],相当于损失了 1 比特的表示能力。

在实际的地平线工具链中,权重通常强制使用对称量化,而激活值则根据校准统计结果自动选择对称或非对称。这种混合策略在保证精度的同时,最大限度地简化了硬件设计。

常见误区与总结复盘

在学习和实践量化过程中,初学者常陷入以下几个误区,需要特别警惕:

误区一:认为量化就是简单的类型转换。 直接将 FP32 的 numpy 数组强制转换为 int8 会导致严重的信息丢失。正确的量化必须包含 S 和 Z 的映射过程,并且需要基于统计信息来确定这些参数。

误区二:忽视校准数据的重要性。 S 和 Z 的确定依赖于对真实数据分布的统计。如果校准数据(Calibration Dataset)与真实部署场景的数据分布差异过大,量化后的模型精度会大幅下降。这为后续章节“校准数据”的讲解埋下了伏笔。

误区三:认为所有层都必须使用同一种量化策略。 现代量化工具(包括地平线的工具链)支持混合精度量化。对于敏感层,可以保留为 FP16 或使用更高的比特数(如 INT16),以实现精度与性能的最佳平衡。

总结复盘:本章我们建立了量化的数学基础。核心要点如下:

  • 量化本质:通过仿射变换 \( q = round(r/S) + Z \) 将浮点张量映射到整数张量,核心是寻找最优的 S 和 Z。
  • 定点与浮点:定点(INT8)是硬件高效计算的基础,浮点(FP32)是精度基准,量化是两者之间的桥梁。
  • 对称量化:Z=0,适合权重等以 0 为中心的对称分布,计算简单。
  • 非对称量化:Z≠0,适合激活值等偏置分布,能更充分利用整数表示范围。
  • 工程实践:权重用对称,激活用非对称,是业界最常用的高效配置。

掌握了这些基础概念,我们才能进一步探讨如何通过校准数据来精准地确定 S 和 Z,以及如何评估量化对最终模型精度的影响。这是通往高质量部署的关键一步。