很多人对量化的理解,只停在“把模型变小”

一个 7B 模型用 FP16 保存,理论上仅权重就接近 14GB;换成 4-bit,权重理论体积约为 3.5GB。看起来只是“少占显存”,但真正难点在后半句:模型参数原本是连续浮点数,压成 16 个离散等级以后,为什么还能正常回答问题?

答案不是“INT4 天生很聪明”,而是量化算法在努力控制误差。它们会选择合适的缩放因子、零点和分组粒度,有的补偿已经产生的误差,有的保护重要通道,有的把激活异常值转移给权重。

这篇文章不追求把所有量化名词都塞进来,而是把工程里最常见的几条路线讲清楚:INT8、INT4、GPTQ、AWQ、SmoothQuant、NF4 与 QLoRA。

先给结论:位数决定“能省多少”,算法决定“掉点多少”,推理内核决定“到底能不能跑快”。

理论权重体积对比,不包含 KV Cache、激活值和运行时开销

一、量化究竟做了什么

模型权重本质上是一堆数字。训练阶段通常使用 FP32、FP16 或 BF16,因为它们有更宽的动态范围,也更适合梯度计算;推理阶段不再更新全部参数,继续使用高精度就可能显得奢侈。

量化可以理解成给数字铺设一排有限的“停车位”。原始权重可以停在任意位置,量化后必须停到最近的刻度。位数越低,停车位越少,取整误差越大。

线性量化通常需要两个关键参数:scale 用来控制每个整数刻度代表多大范围,zero point 用来指定浮点数 0 对应哪个整数。对称量化常把 zero point 固定为 0,计算简单;非对称量化可以更充分地覆盖偏离零点的数据分布。

量化误差并不只由 bit 数决定。相同的 INT4,如果 group size、scale、zero point、异常值处理方式不同,效果可能完全不同。

二、为什么分组越细,通常越准确

如果一整层权重共用一个缩放因子,少数极端值会把量化范围拉得很宽,普通权重只能挤在少数几个刻度附近。把矩阵拆成通道或小组,每组单独算 scale,就像给不同身高的人准备不同尺子,精度会更好。

代价也很直观:分组越细,需要保存的 scale 越多,推理时的索引、解包和反量化也更复杂。工程上常见的 INT4 权重量化通常使用 group-wise 方式,在准确率和内核效率之间取平衡。

三、先分清 PTQ、QAT 和量化微调

PTQ 是训练结束后再压缩模型,成本最低,也是开源模型部署最常见的路线。GPTQ、AWQ 和 SmoothQuant 都属于这一大类。

QAT 会在训练时模拟低精度取整,让模型提前学会适应量化噪声,低位宽下通常更有机会守住效果,但训练成本也明显更高。

QLoRA 容易被误认为某种部署量化算法。它真正解决的是微调显存:基础模型以 4-bit 保存并冻结,反向传播只更新 LoRA 适配器。

四、GPTQ:把误差留给后面的权重来消化

朴素做法是每个权重直接四舍五入,但局部误差会沿网络传播。GPTQ 使用近似二阶信息判断权重对输出的敏感程度,并在逐步量化时,把已产生的误差补偿到尚未量化的权重中。

GPTQ 的优势是压缩能力强,论文展示了 3-bit、4-bit 甚至更低位宽的可能性。它适合离线处理模型,但需要校准数据和量化时间。最终推理速度不能只看“GPTQ”三个字,还要看目标框架是否有适配的高效内核。

五、AWQ:重要权重不是看权重本身,而是看它乘上什么输入

AWQ 的出发点是:并非所有权重对模型输出同样重要。论文发现,只需要保护很小一部分显著权重,就能大幅降低量化误差;判断这些通道是否重要,要参考校准数据产生的激活分布。

AWQ 通过缩放显著通道来降低其量化误差,同时保持线性层计算等价。它依然是权重量化,激活值通常保留较高精度。是否比 GPTQ 更快,要看具体模型、group size、GPU 与执行内核,不能把算法名直接等同于固定倍数的速度提升。

六、SmoothQuant:为什么量化激活比量化权重更难

很多大模型的激活值会出现少数极端通道。若直接对整组激活做 INT8,这些尖峰会占满动态范围,让普通值的刻度变得粗糙。SmoothQuant 通过一个数学等价的缩放,把部分量化难度从激活迁移到更容易量化的权重。

SmoothQuant 的目标是 W8A8,也就是权重和激活都使用 8-bit。相比只压缩权重,它更有机会减少矩阵乘法和访存成本,但需要适合的硬件与内核支持。

七、QLoRA 与 NF4:让大模型在有限显存里完成微调

QLoRA 把冻结的基础模型以 4-bit NormalFloat 保存。NF4 不是普通等距 INT4,它根据近似正态分布设计 16 个非均匀表示值,让 0 附近更密集的权重获得更细的刻度。

前向与反向计算时,量化权重会按需反量化到更高精度参与计算;梯度不会更新基础模型,而是流向 LoRA 参数。论文还引入双重量化以压缩量化常数,并使用分页优化器缓解显存尖峰。

QLoRA 的“4-bit”重点是减少训练显存,并不代表训练过程全程使用原生 INT4 矩阵乘法。

八、GPTQ、AWQ、SmoothQuant、QLoRA 到底怎么选

如果目标是 GPU 在线推理,先查看部署框架与目标显卡当前成熟支持哪些量化格式和 kernel,再在候选中比较 AWQ、GPTQ、FP8 或 W8A8。

如果目标是本地 CPU 或消费级设备,GGUF 生态通常更方便,但要记住 GGUF 是文件格式,内部可以采用多种量化类型。

如果目标是低显存微调,QLoRA 通常比 GPTQ/AWQ 更对题,因为它把低比特存储与 LoRA 训练结合起来。

九、一个最小的 4-bit 加载示例

下面示例使用 Hugging Face Transformers 与 bitsandbytes 加载 4-bit 模型。代码的重点不是“复制后一定最快”,而是展示量化配置和计算精度是两个不同概念。

import torch
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
quant_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_use_double_quant=True,
bnb_4bit_compute_dtype=torch.bfloat16,
)
model = AutoModelForCausalLM.from_pretrained(
"your-model-id",
quantization_config=quant_config,
device_map="auto",
torch_dtype=torch.bfloat16,
)

4-bit 主要描述基础权重的保存方式,计算时仍可以使用 BF16。若要做 QLoRA,还需要再接入 PEFT/LoRA 配置,并且只让适配器参数参与训练。

十、工程里别先问“哪个算法最好”,先问你要解决什么

量化选型最好从目标倒推。显存不足、吞吐不足、延迟过高和微调成本过高,可能需要完全不同的方案。即便模型成功加载,也不能说明方案可上线。

十一、最常见的五个误区

**误区一:INT4 一定比 FP16 快:**INT4 一定更省权重带宽,但若硬件没有高效内核,解包和反量化开销可能抵消部分收益。

**误区二:同为 4-bit,效果就差不多:**算法、分组粒度、校准数据、异常值处理与计算精度都会影响效果。

**误区三:GGUF、GPTQ、AWQ 是同一层概念:**前者主要是文件格式,后两者是量化算法。

**误区四:公开榜单掉点小,业务也一定安全:**数学、代码、工具调用、结构化输出和长上下文可能比通用对话更敏感。

**误区五:权重缩小四倍,显存就必然缩小四倍:**实际显存还包含 scale、运行时工作区、激活值、KV Cache 与批处理开销。

结语:量化不是把精度“砍掉”,而是把误差放到更可控的位置

INT8 和 INT4 告诉我们模型用了多少位;GPTQ、AWQ、SmoothQuant 告诉我们如何降低精度;QLoRA 告诉我们如何在低比特基础权重上继续训练;GGUF 和 safetensors 则负责模型如何落盘。把这些层次分开,量化选型就不会只剩下“哪个文件更小”。

真正可靠的方案,必须在自己的模型、硬件、框架和业务数据上同时验证质量、显存、延迟与吞吐。量化没有绝对冠军,只有更适合当前约束的组合。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐