给本地大模型下 GGUF 量化文件的人,对 bartowski 这个名字不会陌生:他长期维护一份自己的 llama-quant.cpp 分支,专门改进 MoE 模型的量化处理。9 月 10 日,他在 Hugging Face 博客发布长文,宣布把沿用多年的量化启发式规则整个推翻重写——依据不再是经验,而是约 96 小时、超过 1000 组的对照实验。

老规则的天花板

llama.cpp 上游的量化分配代码多年未大改,靠的是模型无关的启发式:比如 use_more_bits 检查当前层是否落在前 1/8、后 1/8 或中间每第三层,再决定给哪些张量加码。这套逻辑的依据是几年前的少量测试;MoE 模型专家数超过 8 个就没有特殊处理(上游只写了 Mixtral 恰好 8 专家的特例),小而敏感的 shexp 张量也长期被低估。

1000 组实验怎么跑

核心方法是"degrade-one":把全部张量设为 q8_0,只把其中一个压到 q2_k,逐个测量它单独劣化的代价。指标是量化模型与 bf16 原模型 token 概率之间的 KL 散度(KLD,越低越好),用 llama-perplexity --kl-divergence 在 wikitext-2 上以 512 上下文测得。主实验在 Qwen3.5-0.8B 和 4B 上完成,再用 Gemma 4、Granite 4.2、Ling、Muse 等家族交叉验证趋势。实验跑在一台 Framework Desktop 上,测试框架由 Claude 协助编写。

三个硬结论

敏感度规律相当清晰:其一,embedding 张量(token_embd)主导整个敏感度尺度,压坏的代价约是最差权重张量的 8 倍(0.8B)到 16 倍(4B),但它从 q4_k 就能找回大部分性能;其二,深度呈 U 形,模型首尾层最怕压缩;其三,小的注意力投影按 bit 算最敏感(attn_v、attn_output、ffn_up、ssm_out 都很突出),而 ffn_gate 基本不值得额外加码。

命名重新变得可信

基于这批数据,作者发布了一个 solver:输入模型形状、prior.json 和目标量化类型,输出"最优"张量排布。配套的新规则让命名重新有含义——Q3_K_S 里 90% 的张量真的是 Q3_K,_M 档是 70%,_L 档最多 50% 加码。直接效果:Qwen3.5-4B 的 Q3_K_M 缩小 15%;Q4_K_M 在 KLD 略差的情况下小了 5% 以上,按 bit 计算反而更划算。每个新模型形状还要先过"金丝雀测试":新方法与旧启发式各出三档量化,画在 KLD-per-bit 曲线上,超标就自动回退旧方法——MiniCPM5-2B 就这样被拦下过。

所以呢

对本地推理玩家,影响很直接:同一块显卡,按同样的文件大小去挑新量化,单位 bit 的质量更高;下载 bartowski 新发布的 GGUF 时,模型页新增的 per-tensor layouts 数据值得看一眼。更大的样本意义在于,量化排布这件长期靠手感的事,被拆成了可测量、可复现、可自动校验的工程问题。方法论原文见 Hugging Face 博客