模型量化是什么?对效果和显存有什么影响?

进阶原理约 6 分钟读完

一句话回答

量化是用更低的精度存储模型权重:从 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 演示对称量化,对比整体量化和分组量化的误差:

Python
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 轮

登录后就可以和 AI 面试官对练,面试记录也会保存下来。登录

这道题你掌握了吗?

选一个最接近的状态,没掌握的题会出现在"我的进度 · 待复习"里。

学习记录暂存在本机浏览器。登录后自动同步到账号,换设备也能看到。