一、量化基础:什么是模型量化?为什么需要量化?

大家好,我是你们这堂课的主讲。咱们今天聊点实在的——模型量化。

先问个问题:你手头有个大模型,跑在A100上挺欢,一换到T4就卡成PPT。怎么办?

答案很可能就是量化。

1.1 什么是模型量化?

说白了,量化就是把模型里那些高精度的数字,换成低精度的。

举个例子。你想想看,一个浮点数 3.1415926535,在FP32里占32个比特。但如果我把它近似成 3.14,用INT8存,只占8个比特。内存占用直接缩到四分之一。

嗯,代价是丢了一点点精度。但很多时候,这点精度损失换来的速度提升,值。

我在项目中遇到过一位同事,死活不肯量化,说「精度就是命」。结果模型部署到手机端,推理一次要5秒,用户早跑了。后来量化到INT8,推理时间降到0.3秒,准确率只掉了0.5%。你说值不值?

核心定义:模型量化是将神经网络中的权重和激活值从高精度浮点数(如FP32)映射到低精度整数(如INT8、INT4)的过程。目的是减少模型大小、降低内存带宽需求、加速推理。

1.2 为什么需要量化?

原因其实就三个字:快、省、广。

  • 快:低精度计算比高精度快得多。INT8的乘加运算,在硬件上比FP32快2-4倍。
  • 省:模型体积变小。一个7B的模型,FP32版本约28GB,INT8版本只要7GB。省下来的显存,可以跑更大的batch size。
  • 广:很多边缘设备(手机、IoT、嵌入式)根本不支持FP32。量化是让大模型「下凡」的关键技术。

我曾经踩过一个坑:把模型直接量化到INT4,结果推理结果全是乱码。后来才发现,那个模型对精度极其敏感,INT4的量化误差直接让输出崩了。所以,量化不是万能药,得看模型和任务。

避坑指南:不是所有模型都适合量化。对精度极其敏感的任务(如医疗影像、金融风控),量化前一定要做充分的精度验证。我曾经见过一个团队,量化后模型准确率从99%掉到85%,直接返工。

1.3 量化的数学原理

量化的数学,其实不复杂。核心就一个映射公式。

假设我们有一个浮点数 r,要映射到整数 q。公式是:

r = S * (q - Z)

其中:

  • S 是缩放因子(scale),浮点数
  • Z 是零点偏移(zero point),整数
  • q 是量化后的整数
  • r 是反量化后的浮点数

反过来,从浮点数到整数的量化公式:

q = round(r / S) + Z

举个例子。假设我们有一组权重,范围在 [-1.0, 1.0] 之间。要量化到INT8(范围 -128 到 127)。

计算缩放因子:

S = (1.0 - (-1.0)) / (127 - (-128)) = 2.0 / 255 ≈ 0.00784

零点偏移:

Z = round(0 - (-128)) = 128

那么,浮点数 0.5 量化后就是:

q = round(0.5 / 0.00784) + 128 = round(63.78) + 128 = 64 + 128 = 192

反量化回去:

r = 0.00784 * (192 - 128) = 0.00784 * 64 = 0.50176

你看,0.5 变成了 0.50176,误差只有 0.35%。这就是量化的代价。

个人经验:我习惯在量化前先统计权重的分布。如果分布很均匀,量化误差就小。如果分布有长尾,量化误差会大。这时候可以考虑非对称量化或者逐通道量化。

1.4 常见数据类型

咱们来看看常用的几种数据类型。我整理了一张表,方便对比。

数据类型 位宽 表示范围 精度 典型应用
FP32 32位 ±3.4×10³⁸ 训练、高精度推理
FP16 16位 ±6.5×10⁴ 混合精度训练、推理
BF16 16位 ±3.4×10³⁸ 中(同FP32范围) 训练、推理(Google TPU)
INT8 8位 -128 ~ 127 推理加速、边缘部署
INT4 4位 -8 ~ 7 极低 极致压缩、移动端

你可能会问:BF16是什么?它和FP16有什么区别?

BF16是Google搞的。它和FP16一样占16位,但BF16用了8位指数、7位尾数,而FP16是5位指数、10位尾数。BF16的指数范围和FP32一样,所以能表示更大的数,但尾数精度低。说白了,BF16更适合训练,因为训练更怕数值溢出,不太怕精度损失。

我在项目中遇到过这种情况:用FP16训练一个模型,loss经常变成NaN。换成BF16后,问题就解决了。这就是指数范围的好处。

1.5 量化方法分类

量化方法有很多种,我按两个维度来分:

  1. 按量化时机:
    • 训练后量化(PTQ):模型训练完后,直接量化。简单、快,但精度损失可能大。
    • 量化感知训练(QAT):在训练过程中模拟量化,让模型适应低精度。精度更好,但需要重新训练。
  2. 按量化粒度:
    • 逐层量化:每层用一个缩放因子。简单,但精度差。
    • 逐通道量化:每个通道用一个缩放因子。精度好,但计算复杂。
    • 逐组量化:把通道分成组,每组一个缩放因子。折中方案。

我个人习惯是:先试PTQ,如果精度损失在可接受范围内,就用PTQ。如果不行,再上QAT。毕竟QAT要重新训练,时间成本高。

一句话总结:量化就是用精度换速度、换空间。选对方法,收益远大于损失。

1.6 量化知识体系图

下面我用一张SVG图,把本章的知识结构串起来。你看一眼就能明白量化的全貌。

模型量化知识体系 模型量化 为什么量化? 快(推理加速) 省(内存减少) 广(边缘设备部署) 数学原理 r = S * (q - Z) q = round(r/S) + Z 数据类型 FP32 / FP16 / BF16 INT8 / INT4 精度 vs 速度权衡 量化方法 PTQ(训练后量化) QAT(量化感知训练) 核心:用精度换速度,用空间换时间

这张图把量化的「为什么」、「是什么」、「怎么算」、「用什么类型」、「用什么方法」都串起来了。你保存下来,以后复习时看一眼就想起全貌。

我的建议:刚开始学量化,别贪多。先把PTQ和INT8搞明白。这两个是工业界最常用的组合。等用熟了,再研究QAT和INT4。

好了,这一章就到这里。量化基础打牢了,后面讲具体实现时你才能跟得上。记住:量化不是玄学,是数学。公式就那两个,但用好了,效果天差地别。

专注资料整理