同一个大模型,完整版可能写着 FP16,旁边还有 8-bit、4-bit,甚至更低精度的版本。
文件突然缩小好几倍,还能在消费级显卡上运行。难道开发者发现了无损压缩咒语?
没有。量化确实会丢信息,只是它想办法把损失放在模型不那么敏感的地方。
先算清楚,模型到底占多少空间
先看模型为什么占空间。大语言模型里有大量参数,可以把它们理解成训练后得到的一堆数字。假设只算权重,一个拥有一百亿参数的模型,每个参数用 16 位保存,理论上就是一百亿乘以 16 位,再除以 8,约二十GB。
如果每个参数只用 8 位,理论权重体积减半;换成 4 位,就只剩四分之一。但这只是权重的纸面账单。真正运行时还可能需要量化元数据、临时激活、运行时缓冲区和 KV Cache,所以“模型文件放得下”不等于“显存一定够”。
你可以把它当成搬家。模型权重是最大的家具,但卡车里还要放包装材料,搬运工具和路上临时使用的东西。只按家具尺寸订车,到了现场照样可能关不上门。
少几个刻度,为什么还能工作
问题是,一个原本用高精度浮点数表示的参数,怎么装进少得多的格子?最简单的办法,是先确定一段数值范围,再用有限的整数刻度去近似它们。
比如一组权重从负一到正一,现在只允许十几个刻度。原来的零点一三,可能被映射成零点一二;零点七八,可能变成零点八。量化会保存低位数字,再配合缩放因子,有些格式还会使用零点信息,把它们近似还原到计算需要的范围。
这不是 ZIP 压缩。ZIP 解压后要求原数据一模一样,量化后的参数通常只接近原值,所以它是一种有损的数值表示变化。
问题来了:刻度划得越少,误差通常越难控制。8 位到 4 位不是单纯再压一半文件,而是让原来很多不同数字挤进更少的格子。怎么安排这些格子,决定了哪些差异能够留下。
那为什么模型没有立刻变傻?因为不同参数对输出的影响并不完全相同,误差也会在网络里以不同方式传播。粗暴地把所有数字一视同仁,确实可能破坏模型。
更成熟的方法会分组计算缩放范围,或者根据少量校准数据判断哪些权重更敏感。GPTQ 使用近似的二阶信息,逐步减少量化造成的输出误差;AWQ 则根据激活分布识别更重要的权重通道,并通过缩放保护它们。
说白了,不是所有数字都坐同一种廉价座位。对结果更关键的部分,要获得更谨慎的处理。
不过,GPTQ、AWQ只是不同量化方法的代表,不是所有4位模型都使用同一套算法。下载文件时,你要同时看位宽、格式和运行框架,不能只看到一个“Q4”就认为它们效果完全一样。
4 位权重,不等于全程 4 位计算
这里还有三个容易混淆的对象。权重量化,压的是模型参数;激活量化,处理的是推理过程中产生的中间结果;KV Cache 量化,压的是长上下文生成时保存的注意力缓存。
它们都能节省内存或带宽,但难度和副作用不同。只把权重变成 4 位,不代表所有计算都在 4 位完成。很多方案会在运行时解码、缩放,或者让部分运算保留更高精度。你看到文件名里的“4-bit”,不能自动推导出整条推理链路都是四位整数。
如果你主要跑长对话,权重已经不再变化,持续增长的 KV Cache 反而可能成为新瓶颈。此时只盯着权重量化,就像行李箱已经减重,却没发现同行的人越来越多。
省空间,不一定省时间
模型变小以后一定更快吗?也不一定。如果硬件和计算内核能高效处理这种格式,读取的数据变少,速度可能提升;但如果运行时频繁转换格式,或者硬件没有对应指令,解码成本反而会吃掉收益。
速度还受到批大小、上下文长度、内存带宽和推理框架影响。所以“体积缩小四倍”等于权重位宽的理论变化,不等于端到端速度必然提升四倍。看到一张性能表,先问它测的是什么模型、什么硬件、什么任务和什么并发。
甚至在某些设备上,高精度格式有成熟的加速单元,低位格式却需要额外转换。模型更小但没有匹配的计算内核,结果可能只是省显存,不一定省时间。
版本怎么选,用自己的任务说话
能力损失也不能用一句“几乎无损”包办。量化误差可能在常见问答上不明显,却在数学、代码、长上下文或少数语言任务里暴露。不同模型对同一种量化方法的敏感度也不同。
因此选择版本时,第一看显存预算;第二看运行框架是否真正支持这种格式;第三用你自己的任务集比较准确率、格式遵循和速度。别只问“哪种量化最好”,要问“我愿意用多少质量,换多少内存和吞吐”。
你还可以先算最低账单:参数量乘以位宽再除以八,得到纯权重的理论体积;然后给缓存和运行开销留空间。这个数字不是最终答案,但能迅速排除明显装不下的方案。
现在把链路串起来:模型体积主要来自大量参数;降低每个参数的位数,可以明显减少权重空间;缩放、分组和误差补偿,让近似值尽量保留模型能力;真正运行时还要支付缓存、激活与格式转换的成本。
所以几十GB模型能塞进一张显卡,不是参数凭空消失了,而是它们从精装房搬进了更密集的宿舍。住得下只是第一步,跑得快不快、考试掉不掉分,还得分别验证。