模型量化是把大模型的权重从高精度数字换成低精度数字保存和计算的做法。一个模型训练完成后,每个权重常用 FP16 或 BF16 记录,占 2 个字节;量化把它换成 INT8,占 1 个字节,甚至换成 INT4,只占半个字节。参数个数一个不少,变的是每个参数记得有多精细。结果很直接:同一个模型文件更小、占的显存更少、推理时要搬运的数据更少,原本装不进普通显卡的模型,量化之后往往就能在本地跑起来。它省的不是模型的“个头”,而是每个数字的“字长”——为什么字长砍掉大半,回答质量却没有跟着砍掉大半,是理解量化最关键的一环。
先算一笔显存账:量化到底省在哪
模型占多少显存,先看一条粗算公式:参数量 × 每个参数的字节数。一个 70 亿参数(7B)的模型,用 FP16 存,权重约占 14GB;换成 INT8,约 7GB;换成 INT4,约 3.5GB,再加上每组权重附带的缩放参数等少量开销,实际文件通常在 4GB 上下。换到 700 亿参数(70B),差距更悬殊:FP16 要约 140GB,普通单卡根本装不下;INT4 则压到 35–40GB,一张大显存显卡或一台高内存的电脑就能勉强跑起来。
速度上的收益来自同一个道理。大模型生成文字时,每吐一个词都要把全部权重从显存里读一遍,瓶颈往往不是算得慢,而是搬得慢。权重体积减半,要搬的数据就减半,在很多消费级硬件上,生成速度会跟着明显提升。不过量化省的主要是权重本身;对话越长越占地方的 KV 缓存并不会自动变小,长上下文场景下这部分开销仍要单独算。
精度降了,效果为什么没有同比例变差
直觉上,把数字记得粗略四倍,效果也该差四倍,但实际不是这样,原因藏在权重的分布里。训练好的模型里,绝大多数权重挤在 0 附近一个很窄的区间,只有极少数值特别大。FP16 用很宽的范围去记这些挤成一团的数字,其实浪费了大量刻度。量化做的事,是把真正用得上的那段区间重新拉开、切成 256 档(INT8)或 16 档(INT4)来记,浪费的刻度被丢掉,有效信息大部分留了下来。
工程上还有三层保护。一是分组量化:不是整个模型共用一把尺子,而是每几十个权重单独配缩放系数,局部范围小,刻度就更贴合。二是校准:常见的训练后量化(PTQ)会拿少量真实文本让模型先跑一遍,统计每层数值的实际分布,再决定怎么切档。三是区别对待敏感部分:少数对结果影响特别大的权重通道会被识别出来重点保护,AWQ 的“激活感知”指的就是先看哪些通道在真实推理中最活跃,再优先保住它们。
损失当然存在,只是不均匀。INT8 通常接近无损,多数评测里和原模型难分高下;INT4 开始出现可感知的下降,但日常对话、摘要、改写这类任务多数人分辨不出来;压到 3 比特以下,退化会明显加速。越靠精确性的任务越敏感:多步数学计算、代码生成、长链推理、严格按格式输出,量化后出错往往先从这些地方冒头。所以“量化没什么损失”这句话只在特定档位和特定任务下成立,不能无条件套用。
和蒸馏、剪枝、混合专家不是一回事
量化常和另外几个“让模型变小”的词混在一起,其实动的刀完全不同。
| 做法 | 动了什么 | 参数个数 | 是否需要重新训练 |
|---|---|---|---|
| 量化 | 降低每个权重的记录精度 | 不变 | 不需要,训练后处理即可 |
| 蒸馏 | 用大模型教出一个小模型 | 变少 | 需要,等于训练新模型 |
| 剪枝 | 删掉不重要的权重或通道 | 变少 | 通常要微调恢复效果 |
| 混合专家(MoE) | 训练时就设计成多专家轮流激活 | 总量不变,单次只用一部分 | 是架构设计,不是事后压缩 |
区分的关键在这里:蒸馏和剪枝是让模型本身变小,量化是让同一个模型记得更省地方。量化代价最低、见效最快,用户拿到量化版就能换档;代价是它有天花板,再怎么压,效果上限还是原模型,压不出一个更聪明的模型。
GGUF、GPTQ、AWQ 分别是什么
下载开源模型时最常撞见的三个名字,其实不在同一个层面上。GGUF 是 llama.cpp 生态使用的文件格式,打包了量化权重和运行元信息,Q4_K_M、Q5_K_M 这类标记表示不同的量化档位,主打在 CPU 和苹果芯片上本地运行,Ollama、LM Studio 等工具都支持它。GPTQ 和 AWQ 则是两种量化算法:GPTQ 逐层处理权重,尽量让量化前后的每层输出保持接近;AWQ 先观察激活值、保护重要通道再下手。两者主要面向显卡推理。
普通使用者不需要纠结算法论文,选哪个先看你用什么工具跑:本地电脑用 llama.cpp 系工具,就找 GGUF;显卡上用 vLLM 等推理框架部署服务,常见的是 GPTQ 或 AWQ 版本。同为 INT4,不同方法之间的差距远小于 INT8 和 INT4 之间的档位差距,先选对档位,再挑方法。
哪些情况值得量化,哪些先别动
最值得量化的,是被硬件卡住的场景:显存差一点装不下、想在手机或边缘设备上离线运行、服务并发高想压低单次推理成本。这几种情况下,量化换来的不是“稍微省一点”,而是“从跑不了变成跑得了”。
有三种情况要先停一下。第一,还打算继续训练或微调的模型别急着量化,量化权重不适合直接拿来训练,常见做法是保留高精度原版做训练、部署时再量化;QLoRA 那种“冻结的量化底座加一层可训练小模块”是专门设计的例外。第二,任务对精度极其敏感时——比如逐字核对的合同条款、不能错一位的数值计算——先拿自己的真实样本做几十条对比测试,再决定档位,不要只看公开跑分。第三,模型本来就很小,比如只有一两亿参数,量化省下的空间有限,相对损失反而更明显,收益常常不划算。
判断顺序可以固定下来:先看原版装不装得下,装不下再降档;每降一档,用手头最难的那批真实问题验一遍;效果守得住,就停在当前档位。量化档位表上没有“最佳”,只有“你的硬件和任务能接受的最低精度”。