一、量化基础概念:什么是模型量化、为什么需要量化、量化的数学原理
大家好,我是你们这堂课的主讲。今天咱们来聊聊模型量化这个事儿。
说实话,我刚入行那会儿,对量化也是一头雾水。觉得模型跑得好好的,干嘛非得折腾它?后来在部署一个图像识别模型到嵌入式设备上时,才真正体会到什么叫「理想很丰满,现实很骨感」。模型在服务器上跑得飞起,一上设备,内存直接爆了,推理速度慢得像蜗牛。嗯,从那以后,我再也不敢小看量化了。
1.1 什么是模型量化?
说白了,模型量化就是把模型里那些「精贵」的浮点数(比如 FP32),换成「皮实」的整数(比如 INT8)来存和算。
你想想看,一个 FP32 的数值占 4 个字节,换成 INT8 只占 1 个字节。模型大小直接缩到原来的四分之一。这还不算完,整数运算在硬件上比浮点运算快得多,尤其是那些没有强大 GPU 的边缘设备。
我个人的习惯是,把量化想象成「压缩饼干」。营养还在,但体积小了很多,吃起来也更方便。
1.2 为什么需要量化?
这个问题,我在项目中被问过无数次。答案其实很直接:
- 模型太大,装不下:一个 ResNet-50 的 FP32 模型大约 98MB,量化到 INT8 后只有 25MB 左右。对于手机、IoT 设备这些存储空间有限的地方,这简直是救命。
- 跑得太慢,等不起:INT8 的矩阵乘法在专用硬件(如 NVIDIA 的 Tensor Core、手机端的 NPU)上,速度可以比 FP32 快 2-4 倍。我曾在一次自动驾驶项目里,靠量化把帧率从 15fps 提到了 45fps,效果立竿见影。
- 功耗太高,扛不住:整数运算的功耗远低于浮点运算。对于电池供电的设备,这直接决定了产品能不能用。
1.3 量化的数学原理
聊完了「是什么」和「为什么」,咱们来看看「怎么做」。量化的核心,就是找到一个映射关系,把浮点数 r 映射到整数 q。这个映射关系,主要分两种:对称量化和非对称量化。
1.3.1 对称量化
对称量化,顾名思义,就是零点(zero-point)固定在 0 上。映射公式很简单:
r = s * q
其中 r 是原始浮点数,q 是量化后的整数,s 是缩放因子(scale)。
反过来,从浮点数到整数的量化公式是:
q = round(r / s)
这里有个关键点:s 怎么确定?通常是根据数据的最大值 max 和量化位宽 n 来算:
s = max / (2^(n-1) - 1)
比如 INT8,n=8,那么 s = max / 127。
1.3.2 非对称量化
非对称量化就灵活多了。它引入了一个零点 z,让映射可以偏移:
r = s * (q - z)
反过来:
q = round(r / s + z)
这里的 s 和 z 怎么算?
s = (max - min) / (2^n - 1)
z = round(-min / s)
你看,非对称量化能覆盖 [min, max] 整个区间,不会浪费任何量化范围。对于 ReLU 这种输出全是非负数的激活函数,非对称量化效果更好。
1.4 知识体系总览
为了让你更直观地理解,我画了一张图,把量化基础的核心逻辑串起来:
1.5 量化参数总结
最后,我把对称量化和非对称量化的关键参数整理成了一张表,方便你对比:
| 特性 | 对称量化 | 非对称量化 |
|---|---|---|
| 零点 (zero-point) | 固定为 0 | 根据 min/max 计算 |
| 缩放因子 (scale) | max / (2^(n-1) - 1) | (max - min) / (2^n - 1) |
| 适用场景 | 权重分布对称(如 Conv 权重) | 激活值分布不对称(如 ReLU 输出) |
| 实现复杂度 | 低 | 中 |
| 量化范围利用率 | 较低(可能浪费负半轴) | 高(完全覆盖数据范围) |
好了,量化基础概念就聊到这儿。记住一句话:量化不是魔法,而是一种工程权衡。理解了这些基础,后面咱们讲 QAT 和 PTQ 的时候,你就能明白每一步到底在干什么了。