模型量化是什么?对效果和显存有什么影响?
一句话回答
量化是用更低的精度存储模型权重:从 FP16/BF16(每个参数 2 字节)降到 INT8(1 字节)或 INT4(0.5 字节),显存占用和每次要读取的数据量成比例下降。生成阶段主要受显存带宽限制,读的数据少了,通常也会更快。代价是精度损失:8 位一般影响很小,4 位更明显,越难的任务(数学、代码、长推理)越容易受影响。常见的方法有 GPTQ、AWQ,GGUF 是 llama.cpp 使用的模型格式。选哪种要在自己的任务上评测。
详细解析
原理
把一组浮点数映射到有限个整数上:
对称量化(以 INT8 为例):
缩放系数 scale = 这组数的最大绝对值 / 127
量化: q = round(x / scale),结果在 -127~127 之间
反量化: x' = q × scale,x' 和 x 的差就是量化误差
- 粒度:整个张量共用一个 scale(per-tensor),每个输出通道一个(per-channel),或者每若干个权重一组(per-group,如每 128 个一组)。粒度越细,误差越小,额外存储的 scale 也越多
- 离群值:少数绝对值特别大的数会把 scale 撑大,其他数可用的精度就变少了。很多量化方法的核心就是处理离群值
- 训练后量化(PTQ)直接对训练好的模型做量化,最常用;量化感知训练(QAT)在训练中模拟量化误差,效果更好,但成本高
量化什么
| 对象 | 说明 |
|---|---|
| 只量化权重 | 如 W4A16:权重 4 位,计算时反量化成 16 位。省显存,适合小批量推理 |
| 权重和激活都量化 | 如 W8A8:矩阵乘法直接用低精度计算,需要硬件支持,适合大批量、高吞吐 |
| KV Cache | 用 8 位等低精度格式存储,长上下文、高并发时能省下大量显存 |
常见方法和格式
- GPTQ:逐层量化,用少量校准数据,借助二阶信息调整还没量化的权重,补偿已经产生的误差
- AWQ:根据激活值找出对结果影响大的权重通道,先缩放保护它们,再量化
- GGUF:llama.cpp 使用的模型文件格式,内置多种量化类型,常用于在 CPU、苹果芯片和消费级显卡上运行
- 也可以在加载模型时直接量化(如 bitsandbytes),或者在支持的 GPU 上使用 FP8
对显存的影响
权重显存 ≈ 参数量 × 每个参数的字节数。7B 模型用 FP16 约 14 GB,INT8 约 7 GB,INT4 约 3.5 GB,再加上 scale 等额外开销。量化权重只减少了权重这一部分,KV Cache 和激活值要另外计算,见部署 7B 模型需要多少显存。
怎么选
- 硬件允许时,优先用 FP16/BF16 或 8 位,效果最稳
- 显存不够(消费级显卡、端侧设备)时用 4 位,优先选成熟的量化版本,或者用和业务数据相近的校准数据自己量化
- 无论哪种,都要用自己的评测集对比量化前后的效果,重点关注数学、代码、长文本这些难任务
代码示例
用 NumPy 演示对称量化,对比整体量化和分组量化的误差:
import numpy as np
w = np.random.randn(4096).astype(np.float32) * 0.02 # 模拟一组权重
w[0] = 0.5 # 放一个离群值
def quantize(x, bits):
qmax = 2 ** (bits - 1) - 1 # INT8 为 127,INT4 为 7
scale = np.abs(x).max() / qmax # 对称量化:由最大绝对值决定
q = np.clip(np.round(x / scale), -qmax - 1, qmax)
return q, scale
def error(x, bits, group=None):
groups = x.reshape(-1, group) if group else [x] # 分组后每组各用一个 scale
errs = []
for g in groups:
q, scale = quantize(g, bits)
errs.append(np.abs(g - q * scale).mean())
return np.mean(errs)
for bits in (8, 4):
# 分组量化时,离群值只影响它所在的那一组,误差明显更小
print(f'INT{bits}:整体量化误差 {error(w, bits):.6f},每 128 个一组 {error(w, bits, 128):.6f}')
面试官可能追问
量化之后一定会更快吗?
不一定。小批量生成时,瓶颈是显存带宽,权重变小、读得更快,通常会提速。但只量化权重的方案,计算前要先反量化,大批量、计算密集的场景收益变小,甚至更慢;速度还取决于推理框架和硬件有没有对应的优化内核。要在目标硬件上实测。
为什么 GPTQ、AWQ 需要校准数据?
它们要知道在真实输入下,哪些权重更重要、误差会怎样传递,所以要用一小批样本跑一遍前向计算,收集激活值的统计信息。校准数据和实际业务的数据差别太大时,量化效果会打折扣。
量化、蒸馏、剪枝有什么区别?
量化不改变模型结构,只降低数值的精度;蒸馏是用大模型的输出训练一个更小的模型;剪枝是去掉不重要的权重或结构。三者可以组合使用,比如蒸馏出来的小模型再做量化。
易错点
- 以为量化只省显存、不影响效果,不做评测就上线
- 只算了量化后的权重,忘了 KV Cache 和激活值
- 把 INT4 的"约 3.5 GB"当成实际占用,scale 和保持高精度的层还有额外开销
- 以为位数越低一定越快,没考虑硬件和内核的支持
AI 模拟面试官
用自己的话回答,AI 对照参考答案打分、指出遗漏,再追问,最多 3 轮
这道题你掌握了吗?
选一个最接近的状态,没掌握的题会出现在"我的进度 · 待复习"里。
学习记录暂存在本机浏览器。登录后自动同步到账号,换设备也能看到。