Is your engine lobotomizing your model? Kinda, and I measured it

Reddit r/LocalLLaMA 新闻

摘要

作者测量了有损推理引擎标志(路由偏置和尾部跳过)对模型质量的影响,结果表明:在显存充足的情况下,出厂默认设置会导致约 1.5 个准确率点的损失,而在小显存显卡上损失约为其 3 倍;若采取过于激进的设置,则会产生看似自信实则胡言乱语的输出。

我一直在大量阅读关于"引擎对其运行的模型进行脑叶切除术"的内容——要么是因为对已经量化的权重进行进一步量化,要么是因为自动开启有损标志以获得解码/预填充性能提升。我想亲自验证这一点,不仅用 KLD 指标,还要用真实任务来测试,于是使用 Qwen 3.8 Flash Next 搭配 Basalt(免责声明:我是该工具的开发者)设置了实验,测试了两个最常见的有损标志: - **路由偏置**:引擎会将模型推向已经在 GPU 上的专家,因此它有时会选择一个方便的专家,而不是实际想要的那个。 - **尾部跳过**:当模型选择的某个低优先级专家不在 GPU 上时,引擎会直接跳过它,而不是去取。 两者都更快,因为需要从 RAM 传输的专家更少,但两者都会改变模型的输出。我将它们添加为引擎中的可选标志,以便在其他条件不变的情况下精确测量它们的代价,只改变标志本身。 **免责声明**:本文和实验由我完成,但经过 AI 润色。 **测试环境**:RTX 5090(400 W)+ RTX 5060 Ti(180 W)+ 128 GB DDR5 内存。 **测试的设置**: - **出厂值**:偏置 1.5,跳过排名 ≥ 7。这是其他引擎在较小显卡上出厂(或曾出厂)的默认值。 - **最差值**:偏置 16,跳过排名 ≥ 1,加上宽松的草稿接受阈值。这是最坏情况场景,不是任何引擎会出厂的设置,也没有实际使用意义。 ## 1. KLD 100 个 wikitext 分块,解码路径,以 llama.cpp Q8_0 为参考基准。表中包含了精确的 IQ3_XXS 和 Q2_0 以供对照。 | 量化格式 + 设置 | 文件大小 | PPL | KLD 均值 | Top-1 相同比例 | |---|---|---|---|---| | Q8_0 精确 | 178 GiB | 3.276 | 0.031 | 94.1% | | NVFP4 精确 | 122 GiB | 3.304 | 0.068 | 91.4% | | IQ3_S 精确 | 81 GiB | 3.385 | 0.155 | 87.3% | | IQ3_XXS 精确 | 74 GiB | 3.470 | 0.243 | 84.0% | | IQ3_S + 出厂值 | 81 GiB | 3.583 | 0.244 | 84.3% | | NVFP4 + 出厂值 | 122 GiB | 3.931 | 0.348 | 81.8% | | Q8_0 + 出厂值 | 178 GiB | 4.221 | 0.401 | 79.4% | | Q2_0 精确 | 65 GiB | 3.949 | 0.436 | 78.2% | | NVFP4 + 最差值 | 122 GiB | 5.917 | 0.823 | 71.3% | | Q8_0 + 最差值 | 178 GiB | 12.858 | 1.616 | 56.8% | > 注意:即使是精确的 Q8_0 距离参考基准也有 0.031 的差距。这主要是参考基准自身的噪声,而非实际损伤:llama.cpp 的 Q8_0 在该模型的某些位置比 Basalt 量化得更粗,这给每一行都增加了约 0.01-0.02,因此各行之间的比较仍然公平。 使用出厂值时,所有量化格式的 KLD 都落在 IQ3_XXS 和 Q2_0 之间。量化格式越大,下降越严重,因为更多的权重位于显存之外并被重新路由:一个 178 GiB 的 Q8_0 最终落在了 65 GiB 的 Q2_0 旁边。 ## 2. 在真实任务上有没有影响? KLD 可能会夸大实际感知到的影响,所以我还运行了任务评测。关闭思考模式,使用模型卡片推荐的采样参数(temp 1.0,top_p 0.95,top_k 20),固定随机种子,每个配置使用全新的服务器实例。 **阶梯任务**:300 个级联步骤的阶梯,同时保持规则并反转数字复制。得分 = 通过的阶梯百分比。 **事实任务**:1,200 个闭卷问答题 × 3 个种子,来自 PopQA(5 个流行度区间,从罕见到著名)加上 SimpleQA。得分 = 正确率百分比。 每个差值都是与同一量化格式的精确运行相比,附带 95% 自助法置信区间。 | 配置 | 阶梯 | 事实 | 阶梯 Δ | 事实 Δ | 散文生成速度 tok/s | |---|---|---|---|---|---| | Q8_0 精确 | 45.4 | 38.1 | | | 117 | | NVFP4 精确 | 45.6 | 38.0 | | | 272 | | Q8_0 + 出厂值 | 43.8 | 36.6 | **-1.6 [-3.4, +0.2]** | **-1.5 [-2.5, -0.5]** | 202 | | NVFP4 + 出厂值 | 44.1 | 36.8 | **-1.5 [-3.2, +0.2]** | **-1.2 [-2.2, -0.4]** | 271 | | IQ3_S 精确,小卡* | 44.1 | 36.7 | | | 192 | | IQ3_S + 出厂值,小卡* | 38.9 | 34.3 | **-5.2 [-7.1, -3.2]** | **-2.3 [-3.4, -1.3]** | 299 | | Q8_0 + 最差值 | 26.6 | 2.7 | -18.8 | -35.3 | 379 | *小卡:仅使用 5090,将专家缓存限制为 5 GB,以模拟 16 GB 显卡的情况。* **加粗 = 置信区间不含零。** 实验之所以这样运行,是因为降频后的 5090 仍然比 5060 Ti 快得多。 **结论:** 显存充足时,出厂值的代价约为 1.5 分(≈模型已知事实的 4%),但换来的东西很少:NVFP4 上几乎没有收益(272 → 271 tok/s),Q8_0 上收益较大(117 → 202),但仍然比 NVFP4 精确模式更慢更差。 小显卡上则有实际的加速(散文生成 +56%),代价约为三倍。阶梯下降 5 分,事实下降 2.3 分,两者都明显。 最差设置给出的是自信的胡言乱语。事实从 38% 暴跌至 3%,答案形如"伟大的作曲家"。某些测试几乎看不出差异。"同时保持规则"任务即使在最差设置下也只下降了 -3.8,而此前一套更简单的测试集根本无法区分各配置。损伤体现在链式推理和回忆事实上——这正是被重新路由的专家所负责的内容。 ## 实际表现 同一个提示词("写一篇关于奥德赛的随笔"),Q8_0 配合出厂值:文笔流畅、论证有力,但十几处都是错的。Phemius 变成了女性,Helen 潜入了特洛伊,Odysseus 的真名意为"无人",一位名叫"Theso-mys"的吟游诗人唱到一半被杀死了。**人名和生僻词最先出问题。** 最差设置下则退化为"the n of n"并不断循环。 ## 额外发现:循环是模型自身的问题 并非每个糟糕输出都是引擎的锅。一个编码提示(模型检查一个数量解析器并编写前导零示例)会让 Qwen 3.8 Flash Next 在推理中陷入无尽的"0"循环: **相同请求,种子 1-4** | 配置 | 卡在零循环的比例 | |---|---| | Basalt, NVFP4 | 4/4 | | Basalt, IQ3_S | 4/4 | | Basalt, Q8_0 | 3/4 | | llama.cpp, 同一 IQ3_S GGUF | 3/4 | | 官方 API(OpenRouter 固定到阿里云) | 6/6 均已返回 | 在每个量化格式和两个引擎上,再输出一个"0"的概率是相同的:10 个零之后为 0.99,超过约 100 步后每一步都 ≥95%,因此 top_p 0.95 使得"0"成为唯一选择。这在 temperature 1.0 下同样会发生。官方 API 在约 500 个零后会用"......"截断并让模型回答,所以你在 API 上永远看不到这个循环。(我无法确认 API 提供的权重是否与本地完全一致,但它的循环方式相同。) **Basalt 现在在公开环境下也采取了同样的做法**:推理中连续出现 256 个相同 token 后,关闭思考区块,让模型回答,并记录触发事件。它只是终止循环,不会改变模型选择的任何 token。 ## 注意事项 - 一套测试环境,一个模型。阶梯任务使用一个种子,事实任务使用三个种子。 - KLD 是以 llama.cpp Q8_0 为参考基准的,因此即使是精确 Q8_0 也有 0.031 的偏差。 - 速度为单次冷启动运行,仅供参照。 - Basalt 这些标志默认关闭,开启时会打印警告。 - 这些标志在公开仓库中,你可以自行重跑 KLD 数值。 **总结:天下没有免费的午餐。** 引擎可以通过开启速度"黑科技"来加速 MoE 模型。使用某些引擎出厂的值,每个量化格式在 KLD 上都掉到 IQ3_XXS 和 Q2_0 之间。Q8_0 甚至掉到 Q2_0 旁边。这已经是最糟糕的了。 实际表现中,模型会忘记已知的知识,在多步问题上丢失推理线索。小显卡获得最大加速,也付出最大代价。 如果你的引擎在某个放不下的模型上运行速度出奇地快,请检查它是否还在运行你下载的那个模型。
查看原文

相似文章

过拟合推理引擎的崛起

Reddit r/LocalLLaMA

一篇博客文章论证称,高度专为特定硬件与特定模型定制的推理运行时(Strata、ninfer、DwarfStar、Splash、llamAmpere、gufo)如今在固定消费级硬件上的表现已超越 llama.cpp、vLLM、Ollama 等通用引擎,性能高出 2.5-4 倍;其中 Strata 在单张 12GB RTX 4070 上对 Qwen3.8-Flash-Next 的解码速度可达 53-90 tok/s。

## 在几乎不占用 VRAM 的前提下检测本地模型的幻觉:我们在 1.5B 到 120B 模型上实测后学到的东西

Reddit r/LocalLLaMA

这篇文章将一种零 GPU、纯 CPU 的字符串归一化熵指标(Spanda)与语义熵进行了对比基准测试,覆盖了从 1.5B 到 120B 的本地模型与前沿模型。结果发现,7B 到 27B 的模型使用廉价的精确匹配熵即可获得良好效果,而 120B 的模型则会塌缩为完全相同的自信幻觉——这类幻觉连 NLI(自然语言推理)模型也无法识别。

@mylifcc: 你想象中的所谓大模型升级:多买 H100、花几百万美元重训练、把参数从 70B 堆到 700B……

X AI KOLs Timeline

Apple 研究人员的论文《Decoding Looped Transformers Better for (Almost) Free》表明,通过对比解码(Contrastive Decoding)复用推理时被丢弃的中间状态,可以在零训练成本的前提下将计算消耗降低 47%,同时将数学问题的 pass@1 从 61% 提升到 73%——这标志着大模型发展正从硬件堆叠转向算法层面的精细优化。