3. 性能评估指标

各位同学,今天我们来聊聊模型量化。说实话,我刚接触这个领域时,觉得量化就是把32位浮点数砍成8位整数,简单得很。直到我在一个唤醒词模型上栽了跟头——量化后精度掉了5个点,怎么调都回不去。嗯,从那以后我才真正开始理解,量化这件事,远不止“砍位数”这么简单。

什么是量化?

量化,说白了就是用更少的比特数来表示模型的参数和激活值。一个典型的语音模型,权重通常是FP32(32位浮点),每个参数占4字节。如果量化成INT8,每个参数只占1字节。你想想看,模型体积直接缩小到原来的四分之一。

但代价是什么?精度损失。因为整数只能表示离散的值,而浮点数可以表示连续的范围。量化相当于把连续的浮点空间“映射”到离散的整数空间,这个过程必然会有信息丢失。

核心公式:

量化:q = round(r / scale) + zero_point
反量化:r = (q - zero_point) * scale

其中 r 是浮点值,q 是量化后的整数值,scale 是缩放因子,zero_point 是零点偏移。

我在项目中遇到过一位同事,他以为量化就是直接截断小数位。结果模型跑出来全是噪声。其实量化需要根据数据的实际分布来选择合适的 scale 和 zero_point,不是随便一除就完事的。

量化的类型:PTQ 与 QAT

量化主要分两种:训练后量化(PTQ)和量化感知训练(QAT)。这两种方式,我建议你根据项目阶段来选择。

特性 PTQ(训练后量化) QAT(量化感知训练)
是否需要重新训练 不需要 需要
精度损失 较大(通常1-3%) 较小(通常<1%)
部署速度 快(几小时) 慢(几天到几周)
适用场景 快速验证、原型开发 生产部署、精度敏感场景
数据需求 少量校准数据 完整训练数据

PTQ:快速上手,但有坑

PTQ 是最简单的量化方式。你只需要一个训练好的浮点模型,加上一小批校准数据,就能算出 scale 和 zero_point。我个人习惯先用 PTQ 跑一遍,看看精度损失在不在可接受范围内。

但要注意,PTQ 对异常值非常敏感。我记得有一次,校准数据里混进了一个极端大的值,导致 scale 被拉得很大,大部分量化后的值都挤在0附近,精度直接崩了。所以做 PTQ 时,一定要先检查校准数据的分布,必要时做裁剪。

我的经验:PTQ 的校准数据最好覆盖模型可能遇到的各种情况。比如语音模型,校准集里既要有安静环境下的语音,也要有嘈杂环境下的语音。否则量化后的模型在噪声场景下表现会很差。

QAT:精度优先,代价是时间

QAT 是在训练过程中模拟量化效果。模型前向传播时,权重和激活值会被“伪量化”——先量化成整数,再反量化回浮点。这样模型在训练时就学会了适应量化带来的误差。

QAT 的流程大概是这样的:

  1. 用浮点模型初始化
  2. 在训练中插入伪量化节点(fake quantization nodes)
  3. 正常训练,但反向传播时梯度通过伪量化节点直通(STE,Straight-Through Estimator)
  4. 训练完成后,将伪量化节点替换为真正的量化操作

我曾经在一个语音识别模型上做过对比:PTQ 后 WER(词错误率)上升了2.3%,而 QAT 只上升了0.4%。但 QAT 的训练时间多了整整一周。所以你要权衡:是精度重要,还是时间重要?

避坑指南:QAT 训练时,学习率要适当调小。我曾经用默认学习率跑 QAT,结果模型直接不收敛了。后来把学习率降到原来的十分之一,才稳定下来。另外,QAT 的 batch size 不宜过大,否则伪量化节点的统计量会不稳定。

量化对性能与精度的影响

量化带来的性能提升是实打实的。我直接给你看一组数据:

指标 FP32 INT8 提升比例
模型大小 100 MB 25 MB 4x 缩小
推理速度(CPU) 100 ms 35 ms 约 2.8x 加速
推理速度(GPU) 50 ms 20 ms 约 2.5x 加速
内存带宽占用 高 低 显著降低
功耗 高 低 约 30-50% 降低

为什么 INT8 能加速这么多?原因有三:

  • 计算更快:整数运算比浮点运算快得多,尤其是在没有 FPU 的嵌入式设备上
  • 内存更省:更小的模型意味着更少的内存访问,而内存访问往往是推理的瓶颈
  • 缓存友好:模型变小后,更多参数可以塞进 CPU 缓存,减少缓存未命中

但精度损失是绕不开的。量化对语音模型的影响,我总结了几点:

  • 小值信号容易丢失:语音信号中有很多低幅度的细节,量化后可能被截断为0
  • 噪声放大:量化误差在某些层会被累积放大,导致输出质量下降
  • 敏感层差异大:不是所有层对量化都同样敏感。我习惯先逐层分析量化误差,找出最敏感的几层,然后对它们单独做高精度量化(比如保留 FP16)

核心观点:量化不是“做不做”的问题,而是“怎么做”的问题。在语音算法领域,模型大小和推理速度往往是产品落地的关键瓶颈。量化是解决这些瓶颈最有效的手段之一。

下面这张图展示了量化决策的整体流程,你可以参考一下:

量化决策流程 训练好的FP32模型 精度要求高吗? 是 QAT量化感知训练 否 PTQ训练后量化 准备校准数据 准备校准数据 执行量化 执行量化 INT8模型(高精度) INT8模型(快速) 根据精度和速度需求选择路径

最后说一句,量化不是银弹。有些模型结构对量化特别敏感,比如含有大量 LayerNorm 或 SiLU 激活函数的模型。我建议你在做量化之前,先跑一遍逐层精度分析,看看哪些层是“量化杀手”。如果发现某几层精度损失特别大,可以考虑混合精度方案——敏感层用 FP16,其他层用 INT8。

嗯,量化这块内容比较多,但核心就三点:理解原理、选对方法、做好评估。你只要把这三点吃透了,量化就不会再是拦路虎。