模型量化基础:为什么需要量化、FP32与INT8的精度差异、对称量化与非对称量化、量化感知训练(QAT)与训练后量化(PTQ)
大家好,我是你们的老朋友。今天咱们聊聊模型量化。
说实话,我刚入行那会儿,觉得量化这事儿挺玄乎的。不就是把32位浮点数砍成8位整数吗?能有多大区别?后来在项目里被精度掉坑里摔过几次,才真正明白——量化不是简单的“砍一刀”,而是一门平衡艺术。
好,咱们正式开始。
为什么需要量化?
先问个问题:你手头有个训练好的模型,在服务器上跑得飞快,精度也漂亮。但一放到嵌入式设备上,内存爆了,推理慢得像蜗牛。怎么办?
答案就是量化。
量化说白了,就是用更少的比特数来表示模型的参数和激活值。我见过最夸张的例子:一个ResNet-50模型,FP32版本要98MB,量化到INT8后直接缩到25MB。你想想看,在只有几百KB内存的MCU上,这差别就是“能不能跑”和“根本跑不了”的区别。
量化的好处,我总结为三点:
- 模型体积缩小:INT8模型只有FP32的1/4大小。存储和带宽压力骤减。
- 推理速度提升:整数运算比浮点运算快得多。在ARM Cortex-M系列上,INT8推理能快2-4倍。
- 功耗降低:整数运算单元更省电。对电池供电的设备来说,这是刚需。
核心观点:量化不是可选项,而是边缘部署的必选项。没有量化,很多模型根本塞不进嵌入式设备。
FP32与INT8的精度差异
FP32用32位表示一个数,INT8只用8位。精度差距有多大?
我举个例子。FP32能表示的最小正数大约是1.4e-45,最大能到3.4e38。INT8呢?只能表示-128到127的整数,或者0到255的无符号整数。这中间差了十几个数量级。
但别慌。模型推理时,我们关心的不是单个数值的精度,而是输出结果的相对排序。说白了,分类任务里,只要“猫”的概率仍然比“狗”高,精度就没丢。
| 数据类型 | 位宽 | 表示范围 | 精度 | 典型场景 |
|---|---|---|---|---|
| FP32 | 32 | ±1.4e-45 ~ ±3.4e38 | 高 | 训练、高精度推理 |
| FP16 | 16 | ±6.0e-8 ~ ±6.5e4 | 中 | 移动端GPU推理 |
| INT8 | 8 | -128 ~ 127 或 0 ~ 255 | 低 | 边缘设备推理 |
我在项目中遇到过一个问题:一个语义分割模型,量化后输出图像出现了明显的“块状效应”。排查下来,是因为某些层的激活值分布特别不均匀,量化后信息丢失严重。后来加了逐通道量化才解决。
我的经验:量化后精度下降超过1%就要警惕了。先检查激活值的分布,再考虑换量化方案。
对称量化与非对称量化
这是量化里最基础也最容易搞混的概念。我尽量说清楚。
对称量化:量化范围关于0对称。比如FP32的[-1.0, 1.0]映射到INT8的[-128, 127]。0在两边都是0。
非对称量化:量化范围不关于0对称。比如FP32的[0.0, 1.0]映射到INT8的[0, 255]。0映射到某个整数,不一定是0。
你可能会问:什么时候用对称,什么时候用非对称?
我个人习惯:权重用对称量化,激活值用非对称量化。
为什么?
- 权重通常关于0对称分布(想想看,正负权重都有意义)。对称量化能充分利用INT8的表示范围。
- 激活值经过ReLU后全是非负的。用非对称量化可以把[0, max]映射到[0, 255],不浪费表示能力。
我曾经在一个项目里,所有层都用了对称量化。结果激活值分布偏到一边,量化后信息丢失严重。改成非对称量化后,精度直接回升了0.5%。
注意:非对称量化需要额外存储零点(zero point),计算时多一次减法操作。在极端资源受限的设备上,这个开销不能忽略。
量化感知训练(QAT)与训练后量化(PTQ)
这两个是量化的两种主流实现方式。我分别说说。
训练后量化(PTQ):模型训练完后,直接对权重和激活值做量化。简单粗暴,不需要重新训练。
优点:快,不需要训练数据(或者只需要少量校准数据)。
缺点:精度损失可能较大,尤其是小模型或敏感层。
量化感知训练(QAT):在训练过程中模拟量化效果,让模型学会适应量化误差。
优点:精度损失小,通常能接近FP32水平。
缺点:需要重新训练,耗时耗力。
我个人的建议是:
- 如果模型比较大(比如MobileNetV2以上),先试PTQ。精度够用就直接用。
- 如果模型很小(比如TinyML级别的),或者PTQ后精度掉得厉害,上QAT。
我曾经在一个语音唤醒词检测项目里,PTQ后精度从95%掉到82%。换成QAT后,精度回到了93.5%。虽然训练多花了3天,但效果值得。
避坑指南:QAT训练时,一定要在验证集上监控量化模拟的精度。我见过有人训练了10个epoch,结果量化模拟精度反而下降了——因为学习率没调好。
知识体系总览
下面这张图,是我自己梳理的量化知识框架。你看一眼,心里就有谱了。
这张图把量化从“为什么”到“怎么做”串起来了。你顺着箭头看,思路就清晰了。
总结一下
量化是边缘AI部署的必修课。今天咱们聊了:
- 为什么需要量化——体积、速度、功耗,三座大山压着,不量化不行。
- FP32与INT8的精度差异——范围差十几个数量级,但推理任务更关心相对排序。
- 对称量化与非对称量化——权重用对称,激活用非对称,这是我的经验之谈。
- QAT与PTQ——大模型先试PTQ,小模型或精度敏感的上QAT。
嗯,今天就到这儿。量化这块内容不少,但掌握了这些基础,后面讲具体部署工具链的时候,你会觉得轻松很多。