量化基础:从理论到实践的第一课
大家好,我是你们这门课的主讲。今天咱们聊聊模型量化——这个在部署领域绕不开的话题。
我记得刚入行那会儿,第一次接触量化,脑子里全是问号。为什么要量化?精度会不会掉?怎么算的?后来踩了不少坑,才慢慢摸清门道。今天我把这些经验整理出来,希望能帮你少走弯路。
什么是模型量化?
说白了,模型量化就是把模型里的参数从高精度(比如FP32)变成低精度(比如INT8)。
你想想看,一个FP32的数值占4个字节,INT8只占1个字节。模型大小直接缩到四分之一。推理速度呢?硬件对INT8的计算支持通常更快,尤其是手机、边缘设备这些资源受限的场景。
举个例子:
# FP32 权重
weight_fp32 = [0.1234, -0.5678, 1.2345, -2.3456]
# INT8 量化后
weight_int8 = [16, -73, 158, -300] # 假设缩放因子为 0.0078
嗯,这里要注意:量化不是简单的四舍五入。它背后有一套数学逻辑。
为什么需要量化?
我直接说三个最现实的原因:
- 模型变小:FP32转INT8,体积缩小75%。你部署到手机App里,用户下载快,体验好。
- 推理加速:INT8的矩阵乘法在CPU/GPU/NPU上都有硬件加速。我在项目中测过,某些场景下速度能提升2-4倍。
- 功耗降低:低精度计算消耗更少电量。这对移动端、IoT设备至关重要。
你可能会问:那为什么不直接用INT8训练?嗯,这是个好问题。因为训练需要高精度来保证梯度更新的准确性。推理时我们只需要前向传播,精度要求没那么苛刻。
量化的数学原理
这部分是核心。我尽量讲得通俗些。
对称量化
对称量化,就是量化后的数值范围关于0对称。公式很简单:
q = round(r / s)
其中:
q = 量化后的整数值
r = 原始浮点值
s = 缩放因子(scale)
round() = 四舍五入
反量化就是:
r = q * s
对称量化的特点是:零点(zero point)固定为0。也就是说,浮点数的0量化后还是0。
我在项目中遇到过一个问题:如果模型权重分布不对称(比如大部分值在正区间),对称量化的精度会下降。因为负区间的量化范围被浪费了。
非对称量化
非对称量化引入了零点(zero point),公式变成:
q = round(r / s) + zp
其中:
zp = 零点(zero point)
s = (r_max - r_min) / (q_max - q_min)
反量化:
r = (q - zp) * s
非对称量化更灵活。它能根据数据的实际分布来调整量化范围。比如数据都在[0.5, 1.5]之间,非对称量化可以把整个量化范围都用来表示这个区间,精度自然更高。
核心区别一句话总结:对称量化简单但浪费位宽,非对称量化灵活但多一个零点参数。
量化精度与性能权衡
这是大家最关心的问题:量化后精度会掉多少?
说实话,没有标准答案。它取决于:
- 模型类型:CNN对量化比较友好,Transformer模型(比如BERT)敏感度更高。
- 量化位宽:INT8通常精度损失在1%以内,INT4就可能掉3-5%。
- 量化方法:训练后量化(PTQ) vs 量化感知训练(QAT)。后者精度更高,但需要重新训练。
| 量化方法 | 精度损失 | 速度提升 | 适用场景 |
|---|---|---|---|
| FP32(基线) | 0% | 1x | 训练、高精度推理 |
| INT8(PTQ) | 0.5-2% | 2-4x | 快速部署、精度要求不高 |
| INT8(QAT) | 0.1-0.5% | 2-4x | 精度敏感场景 |
| INT4 | 3-8% | 4-8x | 极端资源受限 |
我的经验:如果你第一次做量化,先用PTQ试试。精度能接受就省事。如果掉得厉害,再上QAT。我曾经有个项目,PTQ掉了3%的mAP,换成QAT后只掉了0.3%。
量化知识体系总览
下面这张图帮你理清本章的核心逻辑:
避坑指南:我曾经在一个项目中,直接对BERT模型做INT8量化,结果精度掉了8%。后来发现是因为没有做校准集(calibration dataset)的统计。记住:量化前一定要用代表性数据做校准,否则缩放因子算不准。
好了,这一章的内容就到这里。量化基础是后续所有章节的基石。你把这些概念吃透了,后面学QAT、混合精度量化、硬件适配都会轻松很多。
有什么问题,欢迎随时交流。咱们下一章见。