localaiforum
登录
指南 › 模型与格式

量化,深入

量化把权重从 16 位浮点缩到更少比特,用一点质量换大量内存。一行版(Q8 ≈ 无损、Q4_K_M ≈ 甜点、Q3 以下受伤)足够跑起来。本页往下一层:标签实际做什么、K-quant 与 I-quant 怎么不同、质量损失最先出现在哪里。

为什么 4-bit 根本可行

训练出的权重不是均匀噪声。每个张量里的值聚在一个窄窄的、大致钟形的分布里,而网络的行为由那个分布的形状承载——不由任何单个权重的最后一位小数。这让权重可压缩:把每个权重存成一个小整数加一个共享缩放因子,你只损失细节。

一个真实的复杂点:离群通道。一小部分通道携带远大于其余的激活。整张张量一个缩放会把全部量程花在那些离群值上、把其余一切碾成泥。每个严肃的量化方案从根本上都是离群值处理方案——按块缩放、激活感知保护(AWQ)、或针对真实数据的校准(imatrix)。

块量化机制

核心戏法:把每张张量切成共享一个缩放的小块。反量化一个权重是一次乘法:

w ≈ s · q                       # s:块缩放,q:存储的整数

Q4_0:     block = 32 weights → 1×fp16 scale + 32×4-bit ints ≈ 4.5 bpw
K-quants: super-block = 256 weights
          1×fp16 super-scale + 8×fp8 sub-scales + ints ≈ 4.8 bpw

bpw = 每权重比特,含缩放开销。那个开销就是为什么没有东西恰好是 4.0:4-bit 权重是半字节,摊到 32 个权重上的 2 字节缩放加 0.5 bpw。K-quant 用两级缩放摊薄成本——256 权重的超块、其 8 个子块用廉价 fp8 缩放——以 ~4.8 bpw 落地,质量优于相近尺寸的 Q4_0。

K-quant 与 _M / _S 后缀

Q4_K_M 不是“戴帽子的 Q4_K”——后缀是一种混合。量化器把特定张量抬到更高量化、其余主体留在 Q4_K:典型是注意力投影(wv、wo)和有时词元嵌入表升到 Q6_K。后缀为混合排序:

  • _S(small)——抬得最少、文件最小
  • _M(medium)——默认推荐、最佳尺寸/质量平衡
  • _L(large)——更多张量更高精度、收益递减

混合存在是因为各层退化不均:注意力投影和嵌入比大型前馈矩阵更敏感。在那儿多花几百 MB 买到真质量——这就是为什么 _M 是社区默认而非光 Q4_K。

I-quant:校准过、更小、CPU 慢

IQ 量化(IQ4_XS、IQ3_XXS、IQ2_XS……)加了一步校准。先跑模型过一段有代表性的文本样本计算重要性矩阵(imatrix);然后把量化等级放到重要权重实际所在的地方。回报:同等质量下比等价 K-quant 更小——IQ4_XS 以相等或更好的质量压过 Q4_K_S,而 IQ2/IQ3 让 3 GB 以下的 7–8B 模型根本成为可能。

代价是解码速度。I-quant 反量化不是单纯乘法——它需要非 2 的幂的查表和结构化重建。CPU 上那份额外数学在 tokens/sec 里可见;GPU 上它躲在内存延迟后面、几乎不花钱。经验法则:CPU 机器用 K-quant、GPU 上 I-quant 无妨、IQ2/IQ3 只在显存逼你出手时。

质量阶梯,诚实版

7–8B 模型的近似文件大小。随参数大致线性缩放——14B 约为两倍:

量化 大小 bpw 诚实的质量注
Q8_0 8.5 GB 8.5 透明;对 FP16 的盲测 A/B 中存活
Q6_K 6.6 GB 6.6 近透明;偏执之前的最后一站
Q5_K_M 5.7 GB 5.7 轻微损失,聊天中难以察觉
Q4_K_M 4.9 GB 4.8 甜点;基准测试低个位数百分比
IQ4_XS 4.5 GB 4.25 ≈ Q4_K_S 质量、更小;GPU 上优先
Q3_K_M 3.9 GB 3.9 事实回忆和数学上可察觉
IQ3_XXS 3.2 GB 3.1 流畅聊天、发抖的事实;现实地仅限 GPU
Q2_K 3.2 GB 3.4 最后手段——人格幸存、精度不存

把精确百分比当作传说级:损失取决于模型、语言和任务。排序是稳定的,即便幅度不是。

量化最先伤哪里

损伤在能力间不均匀。大致按先后:

  1. 事实回忆——名字、日期、数字先漂移。Q3 模型自信地张冠李戴。
  2. 数学与多步推理——小错误沿链条复利。
  3. 长上下文连贯性——从长提示词深处的检索比短提示行为所暗示的更抖。
  4. 低资源语言——重量化下韩语比英语更早退化;韩语词元在训练中更罕见,所以精度余量更少。如果韩语对你重要,能高就保持在 Q5+。
  5. 聊天流畅度与风格——几乎不显现。Q2 模型仍然听上去不错,这正是陷阱:流畅度是损伤的坏代理。

小模型更受害

量化误差吃冗余,而小模型冗余最少。Q4 的 70B 几乎不损失;Q4 的 3B 明显损失更多;~2B 以下,重量化能掏空模型。实用规则:~4B 参数以下一律 Q6_K 或 Q8_0——碾压小模型省下的绝对 GB 反正微不足道。决定比特花在哪之前,先在 参数 拿到尺寸-能力基线。

KV 缓存是另一个决定

量化权重对 KV 缓存毫无作为——那是它自己的内存行(默认 fp16,llama.cpp 中可另行量化到 q8_0/q4_0)。长上下文下缓存能与权重比肩;在 KV 缓存 里独立预算。

一个实用决策阶梯

算例——12 GB 卡、8B 稠密模型、8k 上下文:

weights    Q4_K_M                 4.9 GB
KV cache   8k tokens, fp16        1.0 GB    (8B GQA ≈ 128 KiB/token)
overhead   compute buffers + ctx  ~1.5 GB
─────────────────────────────────────────
total                             ~7.4 GB  → 装下且有余量

给定 显存计算,阶梯如下:

  1. 预算:显存 − 上下文 − 开销 = 留给权重的。
  2. Q6_K 装得下 → 跑 Q6_K。只有 Q4_K_M 装得下 → 无负罪感地跑 Q4_K_M。
  3. 只有为了装下上下文或避免 CPU 卸载才降到 IQ4_XS/Q3——卸载损失的速度,多于一档量化损失的质量。
  4. 如果目标模型 Q4 装不下,降一个尺寸档而不是量化到 Q2:Q4 的扎实 8B 实践中通常胜过被压碎的 14B。

相关: 显存计算 · KV 缓存 · 参数 · 模型格式