量化基础:从理论到实践的第一课

大家好,我是你们这门课的主讲。今天咱们聊聊模型量化——这个在部署领域绕不开的话题。

我记得刚入行那会儿,第一次接触量化,脑子里全是问号。为什么要量化?精度会不会掉?怎么算的?后来踩了不少坑,才慢慢摸清门道。今天我把这些经验整理出来,希望能帮你少走弯路。

什么是模型量化?

说白了,模型量化就是把模型里的参数从高精度(比如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%。

量化知识体系总览

下面这张图帮你理清本章的核心逻辑:

量化知识体系 模型量化 为什么量化? 模型变小 推理加速 功耗降低 数学原理 对称量化 非对称量化 缩放因子 + 零点 精度 vs 性能 PTQ vs QAT INT8 vs INT4 模型类型影响 核心目标:在精度损失可控的前提下,最大化推理效率 量化感知训练(QAT)是实现这一目标的关键技术

避坑指南:我曾经在一个项目中,直接对BERT模型做INT8量化,结果精度掉了8%。后来发现是因为没有做校准集(calibration dataset)的统计。记住:量化前一定要用代表性数据做校准,否则缩放因子算不准。

好了,这一章的内容就到这里。量化基础是后续所有章节的基石。你把这些概念吃透了,后面学QAT、混合精度量化、硬件适配都会轻松很多。

有什么问题,欢迎随时交流。咱们下一章见。

专注资料整理