1. 量化基础概念:什么是模型量化?为什么 NPU 需要量化?

大家好,我是这次课的主讲。在芯片部署这行摸爬滚打了十来年,今天咱们来聊聊量化。

很多人一听到「量化」就觉得是玄学,其实没那么复杂。说白了,就是给模型「减肥」——把那些又大又沉的浮点数,换成轻便的整数。

1.1 什么是模型量化?

模型量化,就是把神经网络里用 float32 表示的权重和激活值,映射到 int8 甚至 int4 这样的低精度整数上。

举个例子,你训练好的模型里有个权重是 0.12345678,量化之后可能就变成了 42(假设是 int8)。精度确实丢了,但换来的是速度和体积。

核心思想: 用更少的比特数,去近似表达原来的浮点数。

我刚开始做部署时,总觉得量化是「偷工减料」。直到有一次,一个 200MB 的模型死活塞不进芯片的 8MB SRAM,量化到 int8 后直接降到 50MB,推理速度还快了 4 倍。嗯,从那以后我再也不敢小看量化了。

1.2 为什么 NPU 需要量化?

NPU(神经网络处理器)跟 CPU 不一样。CPU 是通用型选手,什么活都能干,但效率一般。NPU 是专为神经网络设计的,它最擅长的事就是做矩阵乘法。

但 NPU 有个硬伤——它的计算单元和片上存储都非常有限。你想想看,一个嵌入式 NPU 可能只有几 MB 的 SRAM,几百个 MAC(乘加)单元。如果跑 float32 模型,带宽和存储根本扛不住。

量化带来的好处,我列个表你就明白了:

指标 Float32 Int8 量化后 提升幅度
模型体积 100 MB 25 MB 4x 缩小
内存带宽 高 低 4x 降低
计算速度 慢 快 2-4x 提升
功耗 高 低 显著降低
注意: 量化不是免费的午餐。精度损失是必然的,关键是怎么把损失控制在可接受范围内。我曾经有个项目,量化后精度掉了 5 个点,后来发现是激活值分布没处理好。

1.3 量化的数学原理

量化的数学其实不复杂。核心就一句话:找一个映射关系,把浮点数区间映射到整数区间。

常见的量化方式有两种:对称量化和非对称量化。我分别讲讲。

1.3.1 对称量化

对称量化,就是让浮点数的 0 对应整数的 0。映射关系是线性的:

Q = round(r / S)

其中:

  • r 是原始浮点数
  • Q 是量化后的整数
  • S 是缩放因子(scale)

反量化就是:

r ≈ Q × S

S 怎么算?很简单:

S = max(|r|) / (2^(N-1) - 1)

N 是量化位数。int8 的话,N=8,分母就是 127。

举个例子:

假设浮点范围是 [-3.0, 3.0]
S = 3.0 / 127 ≈ 0.0236
浮点数 1.5 → Q = round(1.5 / 0.0236) = round(63.56) = 64
反量化回来:64 × 0.0236 = 1.5104
误差只有 0.0104,还不错吧?
我的经验: 对称量化适合权重分布比较对称的情况,比如经过 BatchNorm 后的卷积层。我遇到过一些模型,权重分布严重偏斜,用对称量化效果就很差。

1.3.2 非对称量化

非对称量化引入了零点(zero-point)的概念。映射关系变成:

Q = round(r / S) + Z

其中 Z 就是零点,用来对齐浮点数的 0 和整数的某个值。

S 和 Z 的计算:

S = (r_max - r_min) / (Q_max - Q_min)
Z = round(Q_max - r_max / S)

还是刚才的例子:

浮点范围 [-3.0, 3.0],int8 范围 [0, 255]
S = (3.0 - (-3.0)) / (255 - 0) = 6.0 / 255 ≈ 0.0235
Z = round(255 - 3.0 / 0.0235) = round(255 - 127.66) = round(127.34) = 127
浮点数 1.5 → Q = round(1.5 / 0.0235) + 127 = round(63.83) + 127 = 64 + 127 = 191
反量化:191 × 0.0235 - 127 × 0.0235 = 1.504

你看,非对称量化多了一个零点,但能更灵活地覆盖浮点数的分布范围。

1.3.3 两种方式的对比

对比项 对称量化 非对称量化
零点 无(固定为 0) 有(可调节)
整数范围 有符号(如 int8: -128~127) 无符号(如 uint8: 0~255)
适用场景 权重分布对称(如卷积层) 激活值分布偏斜(如 ReLU 后)
计算复杂度 低 稍高(需处理零点)
硬件友好度 高 中等
避坑指南: 我曾经在一个项目中,所有层都用了对称量化,结果最后一层精度崩了。后来发现是 Softmax 前的激活值分布极度不均匀。换成非对称量化后,问题解决。所以,不要一刀切,不同层可以用不同量化方式。

1.4 量化知识体系总览

为了让你对量化有个整体认识,我画了张图:

模型量化知识体系 模型量化 为什么需要量化? 量化数学原理 量化方法分类 存储限制 带宽瓶颈 计算效率 功耗约束 对称量化 非对称量化 训练后量化 量化感知训练 量化不是简单的精度换速度,而是要在精度、速度、功耗之间找到最佳平衡点 不同场景、不同硬件,量化策略完全不同

这张图把量化的核心脉络理清楚了。从「为什么需要量化」到「量化原理」再到「量化方法」,每一步都有对应的技术细节。后面的章节,我们会逐一深入。

个人建议: 刚开始学量化,别急着看代码。先把对称和非对称量化的数学公式手推一遍,理解 S 和 Z 是怎么来的。我当年就是靠手推公式,才真正搞懂了量化误差的来源。

好了,这一章就到这里。量化不是什么高深莫测的东西,它就是一套工程化的精度-效率权衡方案。你只要掌握了映射关系,剩下的就是调参和踩坑了。