一、量化基础:什么是模型量化?为什么需要量化?
大家好,我是你们这堂课的主讲。咱们今天聊点实在的——模型量化。
先问个问题:你手头有个大模型,跑在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 量化方法分类
量化方法有很多种,我按两个维度来分:
- 按量化时机:
- 训练后量化(PTQ):模型训练完后,直接量化。简单、快,但精度损失可能大。
- 量化感知训练(QAT):在训练过程中模拟量化,让模型适应低精度。精度更好,但需要重新训练。
- 按量化粒度:
- 逐层量化:每层用一个缩放因子。简单,但精度差。
- 逐通道量化:每个通道用一个缩放因子。精度好,但计算复杂。
- 逐组量化:把通道分成组,每组一个缩放因子。折中方案。
我个人习惯是:先试PTQ,如果精度损失在可接受范围内,就用PTQ。如果不行,再上QAT。毕竟QAT要重新训练,时间成本高。
一句话总结:量化就是用精度换速度、换空间。选对方法,收益远大于损失。
1.6 量化知识体系图
下面我用一张SVG图,把本章的知识结构串起来。你看一眼就能明白量化的全貌。
这张图把量化的「为什么」、「是什么」、「怎么算」、「用什么类型」、「用什么方法」都串起来了。你保存下来,以后复习时看一眼就想起全貌。
我的建议:刚开始学量化,别贪多。先把PTQ和INT8搞明白。这两个是工业界最常用的组合。等用熟了,再研究QAT和INT4。
好了,这一章就到这里。量化基础打牢了,后面讲具体实现时你才能跟得上。记住:量化不是玄学,是数学。公式就那两个,但用好了,效果天差地别。