在瑞芯微(Rockchip)NPU 部署深度学习模型时,8 位量化是平衡推理速度、内存占用与精度的核心技术。本文将从量化本质出发,深入解析 RKNN 官方支持的三种量化算法(norm/mmse/kl)及两种量化粒度(layer/channel)的差异、适用场景,并结合实操代码,为开发者提供量化方案选择的完整指南。
一、量化核心本质:FP32 与 INT8 的映射逻辑
深度学习模型原始权重和激活值多为 32 位浮点数(FP32),虽精度高,但存在存储开销大、NPU 计算效率低的问题。8 位量化的核心是通过**缩放因子(Scale)**建立 FP32 与 INT8 的线性映射关系,在精度损失可控的前提下,实现模型体积缩减 75%、推理速度提升 4~8 倍(依赖 RK NPU 硬件特性)。
1.1 对称量化核心公式
RKNN 主流采用对称 8 位量化(INT8 有效范围 [-127, 127],规避 -128 符号位冲突),映射公式如下:
- 量化(FP32→INT8):q = round(f / scale),其中 f 为原始浮点数,q 为量化后整数,round 表示四舍五入取整。
- 反量化(INT8→FP32):f̂ = q × scale,推理时 NPU 自动完成反量化,输出接近原始精度的结果。
关键在于 scale(缩放因子)的计算,而三种量化算法的核心差异,正是 scale 的选择策略不同。
1.2 量化误差可控性
量化本质是用整数近似浮点数,不可避免存在微小误差。但神经网络具备一定的容错性,合理选择量化方案可将精度损失控制在 1% 以内,完全不影响实际业务(如分类、检测任务的准确率)。
二、三种量化算法(norm/mmse/kl)深度对比
RKNN 提供 norm、mmse、kl 三种量化算法,均用于计算最优 scale,但衡量'量化误差'的标准不同,导致精度、速度和适用场景存在显著差异。
2.1 算法核心原理拆解
1. norm(对称量化,默认)
全称 Normal 量化,逻辑最简单:以整层数据的最大绝对值为基准计算 scale,公式为 scale = max_abs / 127(max_abs 为数据绝对值的最大值)。
可理解为'一刀切'映射:将浮点数范围按最大绝对值拉伸至 INT8 区间。优点是计算极快(仅统计极值,毫秒级完成),NPU 硬件适配性最好;缺点是对极端值敏感——若数据中存在少量异常大值,会导致 scale 偏大,多数正常数据被压缩到小整数区间,精度损失加剧。
2. mmse(最小均方误差)
全称 Minimum Mean Square Error 量化,核心是'试错找最优':先基于 max_abs 生成一批候选 scale(如 0.8×~1.2×区间的多个值),分别计算每个 scale 量化反量化后的均方误差(MSE = sum((f̂ - f)²) / n),选择 MSE 最小的 scale 作为最终值。
相比 norm,mmse 能有效规避极端值的负面影响,精度更稳定;但计算量中等,量化耗时略长于 norm。
mmse 算法实例演示
沿用前文卷积层权重数据(2 个输出通道,原始 FP32 权重如下),演示 mmse 如何选择最优 scale:
- 通道 0:[0.1, 0.3, 0.5, 0.8](范围 0.1~0.8)
- 通道 1:[5.0, 6.2, 7.1, 8.0](范围 5.0~8.0)
若采用 layer 级 mmse 量化,步骤如下:
- 生成候选 scale:基于整层最大绝对值 8.0,生成 0.8×~1.2×区间的候选 scale,即 [8.0×0.8/127≈0.0504, 8.0×0.9/127≈0.0567, 8.0×1.0/127≈0.0630, 8.0×1.1/127≈0.0693, 8.0×1.2/127≈0.0756]。
- 计算每个候选 scale 的 MSE:以候选 scale=0.0567(对应 8.0×0.9)为例,量化反量化后计算均方误差: 通道 0 量化结果:[0.1/0.0567≈2→2, 0.3/0.0567≈5→5, 0.5/0.0567≈9→9, 0.8/0.0567≈14→14],反量化值:[0.1134, 0.2835, 0.5103, 0.7938],误差平方和≈(0.0134)²+(0.0165)²+(0.0103)²+(0.0062)²≈0.0007。
- 通道 1 量化结果:[5.0/0.0567≈88→88, 6.2/0.0567≈109→109, 7.1/0.0567≈125→125, 8.0/0.0567≈141→127(截断到 INT8 上限)],反量化值:[4.9896, 6.1803, 7.0875, 7.2009],误差平方和≈(0.0104)²+(0.0197)²+(0.0125)²+(0.7991)²≈0.6386。

