Rebas Daily PERSONAL AI DAILY — 自动选题 · 核查 · 撰写 NO.010 — 2026-07-14
NEWS 约 6 分钟

三行代码,修掉P100的多年暗错

一块老 P100 的推理结果可能一直在悄悄跑偏;三行补丁大幅缩小误差,却仍待上游确认。

三行代码,修掉 P100 的“多年暗错”?

你用一块便宜的二手显卡在家跑 AI。程序没有报错,速度也正常,模型照样回答问题。但它在某些位置选出的下一个词,可能已经和更高精度计算的结果不同。更麻烦的是,这种偏差不会亮红灯,只会安静地混进答案里。

一篇来自 Reddit 用户 apollo_mg 的测试报告称,老款 NVIDIA Tesla P100 在 llama.cpp 中就可能遇到这种问题。llama.cpp 是常见的本地模型推理工具;它通过 CUDA——NVIDIA 的 GPU 计算平台和工具链——把大量数学运算交给显卡。报告作者只改了三行代码,就显著缩小了测试中的数值偏差,而且没有测出明确的性能损失。

不过,目前全部效果数字都来自这篇帖子,尚无第二方复现,也没有上游 llama.cpp 或 GGML 的确认。因此,这更像一个证据相当醒目、但仍待独立核验的错误报告。

快,不等于该在这里少算几位

问题出在精度选择上。

P100 属于 NVIDIA 在 2016 年推出的 Pascal 架构。llama.cpp 的 CUDA 路径会判断显卡是否擅长 FP16。FP16 是用 16 位表示浮点数的格式,比 FP32 更省显存,通常也更快,但精度和可表示范围更有限。

GTX 10 系列和 Tesla P40 对应的 sm_61 设备早已被排除在这条 FP16 计算路径之外。P100 对应 sm_60,因为配有快速 FP16 硬件,没有被排除。这个选择乍看很合理:既然硬件算 FP16 很快,就把能力用起来。

争议在于,硬件支持快速 FP16,不代表当前工作负载中的所有相关计算都适合降低精度。有限精度会产生舍入误差。经过许多步运算,偏差可能累积。程序仍然正常运行,却得到不同数值,这就是所谓的“静默”误差。它不是 P100 硬件坏了,而是 llama.cpp 的精度策略是否符合预期。

作者是在四张 P100 上测试新的 KV Cache 编码时发现线索的。KV Cache 可以理解为模型读写内容时保留的中间计算结果,避免每次从头重算。他把自己的结果与 RTX 3090 上的数据对比,发现同一模型的质量下限持续出现系统性差异,于是继续追查,最后把原因指向这条 CUDA 精度路径。

三行补丁,数字变了多少

作者以 FP32 logits 作为参考。logits 是模型给各个候选词打出的原始分数;测试使用 Qwen3.6-27B 和 WikiText-2,并比较完整输出分布。

帖文给出的核心指标是 Median KLD。KLD 用来衡量两组输出分布的差异,数值越小,代表越接近参考结果。补丁前,中位数为 0.0023;补丁后降到 0.000001。按两者比值计算,约缩小 2300 倍。

另一个指标是 top-token agreement,也就是模型分数最高的候选词与 FP32 参考结果一致的比例。它从 96.5% 提升到 99.9%。在这组特定测试中,原版平均约每 29 次选择下一个词,就有一次与 FP32 参考不同。

这些数字说明补丁明显改变了数值行为,但不能直接翻译成“生成质量提高 2300 倍”。KLD 的倍数很大,部分原因是补丁后的数值已经非常小;而一次候选词不同,最终对文本造成多大影响,帖子没有给出进一步评估。

精度回来,速度没有明显掉下去

降低精度通常是为了换速度,因此补丁是否拖慢推理很关键。作者在 8k depth 下测试了三类模型:27B hybrid、4B dense 和 36B MoE。按帖文结果,prefill——模型一次读入提示文本并完成初始计算的阶段——在三类模型上都没有出现超出噪声的性能变化。decode,也就是逐个生成后续 token 的阶段,补丁版反而快约 1.4%。

这意味着,至少在作者的机器和测试设置中,纠正精度策略没有带来可见代价。不过,帖子没有提供误差条、重复次数、完整硬件配置、软件版本和量化格式。约 1.4% 的差异也可能来自测量波动,不能据此断言补丁普遍还能加速。

补丁已经随 llama-cpp-turboquant v0.3.0 发布,并被 TheTom fork 合并;spiritbuun fork 的相关 PR 仍处于 open 状态。上游 GGML/llama.cpp 尚未接收这项修改。换句话说,一些分支已经采纳它,但这不等于上游已经确认问题,也不代表所有 P100 用户都已自动获得修复。

为什么值得关注

P100 仍被用于本地模型推理。对这类旧硬件来说,三行精度判断就可能改变模型输出,而程序从不报错,这件事本身很有复现价值。它也提醒我们:推理系统的“能运行”和“数值符合预期”是两回事。速度优化如果改变了计算精度,就需要拿高精度参考结果实际对照,而不能只看吞吐量和显存占用。

至于标题里的“多年”,目前只能谨慎引用作者说法。帖子没有给出引入该路径的具体 commit、版本或日期,无法据此确认错误究竟存在了多久。

局限与未知

  • 所有效果与性能数据均来自同一位作者,尚无第二方复现,也没有上游对问题性质和补丁正确性的确认。
  • 目前不清楚 FP32 参考的完整计算链路,也无法确认补丁是否覆盖所有 CUDA kernel、模型架构和量化方案。
  • 2300 倍 KLD 改善、每 29 次约一次不同以及性能数据,都只适用于帖子披露的特定测试,不能泛化到所有 P100 推理任务。

供稿材料 SOURCES — 1

← 返回 2026-07-14 · 开源板块