量化(Quantization)是把模型里的数字用更少的位数来表示。训练完成的模型权重通常是 16 位浮点数,量化把它们压成 8 位、4 位,有时甚至更低的整数。位数少了,模型文件变小,显存占用下降,数据在显存和计算单元之间搬运得更快,推理也就更快。
这是本地跑模型的人最先遇到的概念。你在模型下载页看到的 Q4_K_M、INT8、AWQ、GPTQ 这些标记,说的都是量化方式和位数。同一个模型,全精度要 140GB 显存,4 位量化后可能 40GB 出头就够,这就是能不能在自己机器上跑起来的分水岭。
先用一句话抓住它
量化就是把模型权重的「小数位」砍掉一部分,用一点精度换显存和速度。
生活里的类比是照片压缩。一张 RAW 原片几十兆,存成 JPEG 后只有几兆,肉眼看几乎一样,但放大到像素级会发现细节被合并了。量化做的是同一件事:绝大多数情况下输出看不出差别,但在最需要精细判断的地方,损失会显出来。
它省的到底是什么
一个 70B 参数的模型,按 16 位浮点存,光权重就要约 140GB。换算关系很简单:
| 精度 | 每个参数占用 | 70B 模型权重约需 |
|---|---|---|
| FP16 / BF16(16 位) | 2 字节 | ~140 GB |
| INT8(8 位) | 1 字节 | ~70 GB |
| INT4(4 位) | 0.5 字节 | ~35 GB |
实际占用还要加上 KV 缓存、激活值和框架开销,所以真实需求会更高。但趋势很清楚:每砍一半位数,显存需求大致减半。
速度收益的来源常被误解。大模型推理在生成阶段主要是显存带宽受限,也就是说瓶颈不在算得多快,而在把权重从显存搬到计算单元有多快。权重变小,搬运量变小,生成速度就上去了——这也是为什么量化对逐 Token 生成的提速往往比对首 Token 延迟更明显。
常见的几种做法
训练后量化(PTQ) 是绝大多数人接触到的形式:模型已经训好,用一小批校准数据算出合适的缩放系数,直接压缩。GPTQ、AWQ 是两种常见的实现思路,llama.cpp 生态里的 GGUF 文件也属于这一类。它的优点是快、不需要重新训练。
量化感知训练(QAT) 在训练阶段就模拟低精度带来的误差,让模型自己适应。效果通常更好,但需要训练资源,一般只有模型发布方会做。
混合精度是实践中的常态:不是所有层都同等敏感,注意力里的某些投影、以及嵌入层和输出层,往往保留更高精度,其余部分压到 4 位。GGUF 里 Q4_K_M 这类命名中的 M(medium)就是在描述这种混合策略。
精度损失到底有多大
经验上有几条相对稳定的规律,但都需要在自己的任务上验证:
- 8 位通常几乎无损,可以放心用。
- 4 位在多数通用任务上损失很小,是本地部署的主流选择。
- 低于 4 位(3 位、2 位)损失开始明显,通常只在显存极度紧张时使用。
- 模型越大,越抗量化。同样压到 4 位,70B 模型的相对损失一般比 7B 小。因此「大模型量化到 4 位」往往优于「小模型跑全精度」,在显存预算相同的情况下。
需要特别注意:损失不是均匀分布的。日常问答看不出差别的量化模型,可能在长链推理、精确数值计算、代码生成、以及小语种上退化明显。这类差异必须靠你自己的评估去测,不能只看别人贴的困惑度数字。
和蒸馏、小模型、微调的区别
和蒸馏的区别:蒸馏是训练一个结构上更小的新模型去模仿大模型,参数量真的变少了;量化不改变参数数量和结构,只改变每个参数的表示精度。两者可以叠加使用。
和小语言模型的区别:SLM 是从设计之初就小;量化是把已有的大模型压小。在同样的显存预算下,二者是真实的竞争关系,需要按任务实测选择。
和 LoRA 的关系:QLoRA 把二者结合起来——把基座模型量化到 4 位冻结住,只训练一小组 LoRA 参数,让消费级显卡也能微调大模型。
容易误解的地方
「量化会让模型变笨」——说法太笼统。8 位基本无损,4 位在多数场景可用,问题出在盲目追求更低位数、或者在对精度敏感的任务上用了激进量化却没测。
「量化只对本地部署有意义」——云端服务同样广泛使用量化和低精度推理来压成本,只是对用户不可见。你在 API 中转站或者不透明的第三方服务上遇到「同名模型表现不一致」,量化差异是常见原因之一。
「文件小了就一定快」——如果模型仍然放不进显存、需要在内存和显存之间换页,速度会崩。量化的加速前提是整个模型(加上 KV 缓存)能装进显存。
什么时候该用
想在自己的电脑上跑本地模型,量化基本是必选项,从 4 位开始试即可。做云端服务时,量化是压推理成本的常规手段,但上线前要用真实任务对比全精度版本,重点测你的业务里最难的那类样本。
如果你在评估第三方 API 服务,把「用的是什么精度」列进尽调问题——这一项通常不写在定价页上,却直接影响你拿到的效果。