先看一组对比。

同一个 7B 模型,70 亿参数:用 FP16 老老实实存,大约 14 GB;换成 4 bit 存,只要 3.5 GB 左右。

模型还是那个模型,70 亿参数一个都没少。凭什么换个存法,体积就缩了好几倍?

答案就是今天要讲的量化(Quantization)。这篇把它讲清楚,不需要任何基础。

一、参数,到底存的是什么

回到最朴素的神经网络:y = Wx + b。W 是权重,b 是偏置——合起来,就是常挂在嘴边的"参数"。

参数本质上是什么?是数字。

一个网络训练完,里面的数字可能长这样:0.837421、-0.003914……而一个大模型里,这样的数字有几十亿、几百亿,甚至上万亿个。

所以模型为什么占空间?原因朴素得不行——这些数字,每一个都得存下来。

下一个问题自然就来了:一个数字,比如 0.837421,到底要花多少空间来存?这就轮到"精度"出场了。

二、精度:一个数字用几个字节

最经典的一种精度,叫 FP32。FP 是 floating point 的缩写,意思是浮点数;32 指的是 32 个比特。八个比特是一个字节,所以一个 FP32 的数占 4 个字节。

算一笔账:10 亿个参数(1B),每个 4 字节,加起来大约 4 GB。

把常见精度排个队,就是这张表:

精度 一个参数 1B 参数 7B 模型
FP32 4 字节 约 4 GB 约 28 GB
FP16 2 字节 约 2 GB 约 14 GB
int8 1 字节 约 1 GB 约 7 GB
4 bit 0.5 字节 约 0.5 GB 约 3.5 GB

(顺带一提,int8 的 int 是 integer,也就是整数;8 同样指 8 个比特。)

看到这儿,有人就开始琢磨了:每个数字都存得这么精确,真的有必要吗?

0.837421 存成 0.8374,模型照样能干活。精度一降再降,省下来的可都是实打实的空间。

那就降到 4 bit——一个参数只占半个字节。不过,问题也跟着来了。

三、量化:把连续的数,装进 16 个格子

4 bit 一共能表示多少种状态?2 的 4 次方,16 种。也就是说,一个 4 bit 的数,只有 16 个格子可站。

可原来的参数,是一串连续的小数。16 个格子,怎么装得下?

装不下,就建一种映射关系:把原来连续的数值范围,划分成 16 个等级;每个数,改成离自己最近的那个等级。

原来的参数:连续的小数 量化后:只有 16 个等级 量化 按最近的等级归类 0.84 和 0.83 之间,还塞得下无穷多个数 每个数,归到离自己最近的那个
从连续到离散:量化做的事,就是给每个数找一个离得最近的"格子"。

原来挨得很近的两个数,很可能被映射进同一个格子——精度就是这么丢的。

这件事,就是量化:把高精度的连续数值,映射到更少的离散数值上。

丢掉的精度会变成误差:0.837421 量化之后,可能只能近似成 0.84。这个误差有个正经名字——量化误差。

所以量化的本质,是做一次交换:用一点精度,换更小的模型、更低的内存。

四、4 bit:最划算的那一档

按理说,信息存得越全越好。但实践里,4 bit 反而成了最受欢迎的挡位——很多大语言模型在合理的量化方法下,4 bit 能保持相当不错的能力。

于是个人电脑上跑大模型,4 bit 是最常见的姿势:同样一个 7B 模型,从 FP32 的 28 GB 一路瘦到 3.5 GB,普通笔记本也带得动。

从数据中心的大块头,到人手一台的普通机器——量化搭的,正是这座桥。

五、别和"蒸馏"搞混

讲到这,必须顺手纠正一个特别容易混的概念:蒸馏和量化,不是一回事。

先回忆蒸馏:比如 DeepSeek R1 蒸馏出的千问 7B——大模型当老师,小模型当学生;学生学老师的本事,最后你手里有一个 671B 的大模型,和一个 7B 的小模型。

蒸馏,参数数量是真的变少了。

量化不一样:参数数量一个没变,变的是每个参数用几个比特来存。

一个减"数量",一个减"精度"——方向完全不同,别搞混。

收个尾

回到开头那组对比:模型还是那个模型,参数还是那些参数。

量化干的事,说白了就一件——把每个数字说得粗略一点。可就是这么点让步,让大模型从数据中心的机柜里,走到了普通人的电脑上。

工程里常有这种交易:不求完美,只求够用。量化就是其中一笔。