跳到主要内容

6.3 量化:把 16 位压成 4 位

差 2GB,逼出一个技术领域​

一个 7B 模型,每个参数用 fp16(16 位 = 2 字节)存,总共 14 GB。而 2025 年主流消费级显卡的显存是 12 GB——就差这么 2 GB,模型进不了千家万户的电脑。

买更贵的卡?那是机房的思路。真正改变格局的思路是反过来的:参数一定要用 16 位存吗? 如果每个数只用 8 位、甚至 4 位,体积立刻减半、再减半——这就是量化。

代价当然有:比特越少,能表示的数值刻度越粗,每个权重都要被「四舍五入」到最近的刻度上。问题只剩一个——模型受得了吗?

亲手压一压​

🎮 动手实验
量化:把权重压上更粗的刻度尺
蓝点是 12 个模型权重的真实值,它们必须落到当前精度允许的刻度(灰线)上——红色线段就是被迫挪动的距离(量化误差)。逐个点开四种精度对比。
-1-0.500.51(约 6.5 万级,近似连续,误差 ≈ 0)🔵 原始权重值 🟠 量化后的落点 🟥 量化误差
每参数比特数
16 bit
可用刻度数
≈ 连续
7B 模型体积
14 GB
平均量化误差
≈ 0
📏 训练用的精度,权重几乎「连续」。7B 模型要 14 GB——消费级显卡(12 GB,2025 年主流)装不下。
💡 要点:量化就是「用更少的比特存每个数字」——刻度变粗、误差变大,但换来体积和显存的成倍下降。神奇之处在于大模型对小误差相当迟钝(亿万个参数的误差互相抵消),所以 int8 几乎白赚、int4 靠技巧也能用。你下载的「Q4 量化版」开源模型、推理服务用的 fp8 权重,都是这一套的工业版本。

四档从左到右逐个点,盯着红色误差线和右侧的体积数字:

  1. fp16 / bf16(基准):约 6.5 万级刻度,近似连续,误差 ≈ 0——但 14 GB,消费卡装不下。
  2. int8:只剩 256 个刻度,可红色误差线几乎贴着零——几乎白赚,体积直接砍半到 7 GB。
  3. int4:16 个刻度,误差肉眼可见地变长了。但配合「分组缩放」(每几十个权重共享一把自适应刻度尺,深入层细讲),4 位模型仍能保住绝大部分能力——3.5 GB,笔记本轻松跑,这是 2024-2025 年本地部署的主流选择。
  4. int2(玩坏看看):4 个刻度硬塞所有权重,误差惨不忍睹——压缩和智力之间,终究有一条底线。

为什么大模型这么抗压​

按直觉,把几十亿个数全部搓圆捏扁,模型早该胡言乱语了。它没有,原因有两个:

  • 误差互相抵消:每个权重的量化误差有正有负、彼此独立,亿万个小误差在层层加权求和中大量对冲,单个参数的精度远没有「整体分布」重要。
  • 网络天生冗余:大模型的参数本来就远多于「刚好够用」,一点噪声伤不到主干规律——你可以把量化看成给模型加了一点听不见的背景噪音。

正因如此,量化把大模型从机房带进了千家万户:llama.cpp、Ollama 等生态(2023 年起爆发)让一台普通笔记本跑 7B、甚至量化后的几十 B 模型成为日常。顺带一提,它还赚了第二重便宜——上一节说过解码卡在「搬运」,权重变小一半,搬运也快了一半。

最后区分一件事:本节讲的是推理量化(模型训完后压缩权重);训练时用的 bf16 是混合精度训练,两者目的和技术都不同。

这个演示在哪里简化了?

实验用的是「全体权重共享一把均匀刻度尺」的极简量化。真实方案精细得多:按组缩放(每 64/128 个权重一把尺)、对少数「异常值」权重单独开小灶(激活值的量化比权重更难,异常值问题更凶)。另外「int8 几乎无损、int4 基本能用」是常见基准测试上的典型结论——在特定任务(尤其数学、代码)上,激进量化的退化可能明显得多,因模型而异。

小结​

本节要点
  • 量化 = 用更少比特存每个参数:刻度变粗、误差变大,换体积与显存成倍下降,顺带加速「搬运」。
  • 大模型抗量化的底气:亿万误差互相抵消 + 参数天生冗余。
  • 经验档位:int8 几乎白赚;int4 靠分组缩放等技巧撑起本地部署主流;int2 仍在底线之下。
  • 推理量化(压训练好的权重)≠ 训练混合精度(bf16 计算 + fp32 主副本),别混淆。
📝 动手自测0/3
1. 把 7B 模型从 fp16 量化到 int4,体积大约变成多少?
2. 量化把每个权重都改动了一点点,为什么模型整体能力几乎不受影响?
3. 实验里 int4 档误差明显变大,但正文说它「仍能保住绝大部分能力」,靠的主要是什么?

延伸阅读​