两行 AutoRound 配置错误,却让量化模型效果差了一半

0 阅读

两行配置错了几个月

我们一直在 Hugging Face 上发布 Archsloth 品牌的 GGUF 量化模型。最近一次对 Qwen3-4B 的重新量化过程中,意外发现两个看似微小却影响巨大的配置错误。这两个错误导致过去几个月发布的模型,虽然文件大小、张量布局与竞品完全一致,但实际输出分布却偏离原始模型更远。

ARCHSLOTH

具体来说,对比 unsloth 发布的 Qwen3-4B-Q4_K_M.gguf(2,497,280,800 字节),我们在修正配置后得到的同名文件,在 KL 散度(衡量量化模型输出分布与原始 bf16 模型差异)上全面领先。在韩语任务上差距高达 54.4%,代码任务上也有 52.9% 的优势。即使在未用于校准的语种如泰语、印地语上,优势依然显著,说明并未过拟合。

第一个错误:优化了没用的量化器

AutoRound 工具通过 --scheme 参数指定优化目标。我们此前一直使用 W4A16,这是为 GPU 张量核心设计的 4-bit 权重 + 16-bit 激活方案。但导出时却用 --format gguf:q4_k_m 生成 GGUF 文件。

问题在于,W4A16Q4_K_M 在分组方式、缩放因子计算、零点位置等关键细节上完全不同。这意味着 AutoRound 花费大量时间优化的舍入策略,针对的是最终根本不会使用的量化器。导出阶段会重新根据 Q4_K_M 规则计算所有参数,导致前期优化成果大部分被丢弃。

修正方法很简单:

- --scheme W4A16   --format gguf:q4_k_m
+ --scheme GGUF:Q4_K_M   --format gguf:q4_k_m

这个错误很难被发现,因为流程不会报错,生成的 GGUF 文件也完全合法,只是效果不如预期而已。

第二个错误:漏开关键算法开关

AutoRound 有个默认关闭的参数 --enable_alg_ext,它启用了 SignRoundV2 算法(arXiv:2512.04746)。这个基于符号梯度的舍入搜索能显著提升精度,代价是约 1.7 倍的调优时间(4B 模型在 H100 上从 6 分钟增至 11 分钟)。

我们之前完全忽略了这个开关。打开后,配合正确的 --scheme,就构成了表格中性能差异的全部来源。

校准语料不是中立变量

社区普遍认为,imatrix 校准语料的语言选择影响不大。这个结论对 llama.cpp 内置的量化流程成立,但不适用于 AutoRound。

原因在于机制不同:imatrix 只是在 llama.cpp 自身的缩放搜索中加权,而 AutoRound 的舍入搜索直接替换了整个量化过程。每个权重的舍入方向(向上或向下)完全由校准激活值上的重建误差决定,下游没有其他步骤来“冲淡”这个选择。

换句话说,校准文本不只影响结果,它直接决定舍入方向。

我们做了对照实验:保持其他条件不变,仅更换校准语料。使用韩英混合语料(样本级交错)相比纯英语语料,韩语 KL 散度降低 29.6%。在 27B 模型上,同样对比带来 31.9% 的提升。

有意思的是,交错方式比语种比例更重要。严格按样本交替韩英文本,比先韩后英的拼接方式更能提升英语表现(+11.4%)。加入代码语料后,代码任务指标提升 52.9%,但韩语和英语分别损失 3.4% 和 5.3%——这是一个明确的权衡。

其他模型和量化等级的表现

我们在 Qwen3-4B 上测试了三个量化等级,均与竞品保持字节级一致:

  • Q4_K_M:韩语 -54.4%,英语 -33.2%
  • Q6_K:韩语 -41.5%,英语 -30.2%
  • Q8_0:韩语 -11.1%,英语 -8.7%

随着比特数增加,优势缩小,符合预期。但即使在 Q8_0 上仍有差距,略超预期。

更大的 Qwen3.5-9B 和 Qwen3.8-27B(均为多模态模型)也验证了该方法的有效性:

  • 9B Q4_K_M:韩语 -25.4%,英语 -11.4%
  • 27B Q6_K:韩语 -36.9%,英语 -15.0%

我们没赢的地方

透明起见,必须说明失败案例:

  • 27B 的 Q4_K_M 版本因英语表现变差(+15.8%)而未发布,尽管韩语提升了 12.8%。不占优的版本我们不会放出。
  • 整个系列没有 Q5_K_M,因为工具链在 Q5_K 格式下存在系统性偏差(优化权重与打包张量偏差 5–6%),导致效果甚至不如自家 Q4_K_M
  • 推理速度无差异:pp512 约 12,200 tok/s,tg128 约 305 tok/s,符合同尺寸同布局的预期。
  • 大模型只测了韩英双语,十语种评测仅限 4B 模型。

无效的调优尝试

以下是在修正基础配置后,额外尝试但无效的方法(基于 4B 测试):

  • 校准样本量 ×4:无收益,成本 ×4
  • 样本长度从 2048 增至 4096:韩语 -2%,英语 +23%(变差)
  • 纯韩语校准语料:英语 +14%(变差)
  • 工具默认英语语料:韩语 +76%,英语 +9%(均变差)
  • 量化感知修复(healing):+57%(显著变差)
  • 关键张量额外比特:0 到 +10%(无改善或变差)
  • 同尺寸混合精度(4/8-bit):均匀增比特 好 10%

值得注意的是,最后三项(修复、比特分配、混合精度)在基础舍入较差时(如 RTN)确实有效(-6% 到 -37%),但一旦启用正确的舍入搜索,反而全部变成负优化(+9% 到 +57%)。这说明:评估新方法时,必须同时在舍入开启和关闭状态下测试,否则可能被弱基线误导。

如何自行验证

完整复现命令如下:

# 下载竞品模型
hf download unsloth/Qwen3-4B-GGUF Qwen3-4B-Q4_K_M.gguf --local-dir rival

# 转换原始 bf16 模型作为教师
python llama.cpp/convert_hf_to_gguf.py Qwen/Qwen3-4B --outtype bf16 --outfile ref-BF16.gguf

# 生成教师 logits(每份评测文本一次)
llama-perplexity -m ref-BF16.gguf -f eval/eval_ko.txt \
  --kl-divergence-base base_ko.dat -ngl 99 -c 512 --chunks 60

# 评测候选模型
llama-perplexity -m <candidate>.gguf -f eval/eval_ko.txt \
  --kl-divergence --kl-divergence-base base_ko.dat -ngl 99 -c 512 --chunks 60

构建命令(仅此而已):

auto-round --model Qwen/Qwen3-4B \
  --scheme GGUF:Q4_K_M --enable_alg_ext \
  --iters 200 --nsamples 128 --seqlen 2048 \
  --dataset cal_archsloth.jsonl \
  --format gguf:q4_k_m --output_dir out

KL divergence by language, ARCHsloth against unsloth, ten axes

特别提醒:困惑度(perplexity)无法反映这种差异。在韩语任务上,两个模型的困惑度差距仅 2.8%,但 KL 散度差距达 54.4%。困惑度衡量模型是否“自信”,而 KL 散度衡量是否“对同样的事情自信”——后者对量化评估才真正关键。

The calibration text, and nothing else

模型发布

Size against KL divergence — the ARCHsloth curve sits under the unsloth curve

所有模型已发布在 Archsloth MODELs

Three models against the file of the same name

所有仓库均包含校准语料、评测文本及原始日志。Apache-2.0 许可,基于原始权重量化,兼容 stock llama.cpp