合作研究

FP8 会改变模型的答案吗?120 道题只翻转了 1 道

与 Anagha Langhe · 在一块 NVIDIA L4 上自托管大语言模型

半分钟读完

Anagha Langhe 自己在一块 NVIDIA L4 显卡上运行一个语言模型,她想知道换成 FP8 会不会损失准确率。在 120 道题上,两个版本分别答对 72 和 71 道。光看这个说明不了多少,所以我们去数了翻转:只有 1 道题变了,而且是 bf16 占优。有 49 个答案一字不差;两个版本都答错时,它们给出同一个错误答案的有 42 次,总共 48 次。Anagha 在自己的两次运行结果上跑了一个公开的比较脚本,得到了完全一样的数字,并自己得出了结论:错误来自检索,而不是量化。

问题

用 FP8 代替 bf16 运行模型,所需内存大约减半,在单块 GPU 上这正是这么做的全部意义。担心也很简单:这种更小的格式会不会悄悄让答案变差?

Anagha 直接做了测量。她把同样的 120 道题交给两个版本,并在 LinkedIn 上写了出来:bf16 答对 72 道,FP8 答对 71 道,精确 McNemar 检验 p = 1.0。同一篇帖子里,她还分享了她的环境里的另一个数字:前缀缓存命中率从 12% 升到了 26%。

72 对 71,看上去像"没有差别"。但只有 120 道题,这样的检验只能排除大幅下降。如果掉了三四个百分点,大概仍然不会显示为显著。所以有意思的问题不是 p 值,而是每一道题实际发生了什么。

谁做了什么

  • Anagha 搭建了环境,在同样的 120 道题上跑了两个版本,给答案打分,之后又在自己的文件上运行了比较。
  • 我们(Vadym Chernets)问她两个方向各有多少题翻转,然后给我们维护的一个用于检查模型一致性的公开脚本加了一个小小的 compare 模式,并根据她的汇总数据算出了区间和规划用的数字。
  • Anagha 在她的完整数据上运行该脚本,得到了相同的数字,外加一个我们从汇总里看不出来的数字:两个版本以同样方式答错的频率有多高。

数字是什么样子

120 道题 两者完全相同 bf16 答对 72 FP8 答对 71 71两者都对 1仅 bf16答对 0仅 FP8答对 48两者都错 两者都答错的 48 道里: 42 道错得一模一样 · 6 道各错各的
120 道题各自落入四个格子之一,只有一道偏离了对角线。大多数共同的错误,都是完全相同的答案。
120 道里 1 道两个版本之间翻转的题目,结果偏向 bf16
49个答案一字不差
48 里的 42共同的错误是同一个错误答案
指标 数值
准确率,bf16 72 / 120
准确率,FP8 71 / 120
翻转:仅 bf16 对 / 仅 FP8 对 1 / 0
精确 McNemar 检验 p = 1.0
差值 bf16 − FP8 +0.8 个百分点,95% 区间约为 −2.3 到 +4.6
一字不差的答案 120 个里的 49 个
两者都错且错误答案相同 48 个里的 42 个

怎么解读。只翻转了 1 道,完全符合 FP8 没有任何代价这一说法,但这并不证明它没有代价:下降一两个百分点仍然落在区间之内。翻转少于六个时,不论方向如何,精确 McNemar 检验都不可能达到 p < 0.05,所以这里有用的数字是翻转数本身和区间。要看出一个百分点的下降,大约需要 800 道题,哪怕所有翻转都朝同一个方向。

48 里的 42 是最让我们意外的部分。如果 FP8 版只是噪声更大,它的错误应该是分散的。实际上,两个版本在同样的题目上栽跟头,还落在同一个错误答案上。用 Anagha 的话说,这"符合我的判断:错误来自检索,而不是量化"——检索到的上下文不好时,两个版本读的是同一份坏上下文,说出的也是同一件事。

在你自己的运行结果上试试

如果你有两次针对同样题目的运行结果,格式为 JSONL(题目 id、答案,以及一个 correct 字段或一个标准答案文件),比较只需一条命令。它是公开仓库 memory-agreement-check 的一部分,MIT 许可证,无任何依赖:

git clone https://github.com/vadimchernets/memory-agreement-check
cd memory-agreement-check
python -m memcheck compare bf16.jsonl fp8.jsonl --label-a bf16 --label-b FP8

每道题一行,形如:

{"qid": "q001", "answer": "Paris", "correct": true, "category": "factual"}

它会输出 2×2 表格、精确 McNemar 检验、准确率差值的区间、一字不差的答案数、两次运行一致且都答错的频率,如果你的题目有分类,还会按类别拆分。--md report.md 可以保存报告。

这说明了什么,没说明什么

  • 120 道题足以看出 FP8 没有毁掉这个模型,但不足以保证没有一两个百分点的下降。
  • 检验把各题视为相互独立。如果很多题来自同一份文档或同一个模板,真实的样本量就比 120 小。
  • "错误来自检索"是 Anagha 对她自己系统的判断。48 里的 42 支持这一点;要直接验证,就得让同样的题目分别在好的上下文和坏的上下文下各答一次。

接下来

Anagha 同意把她的 FP8 与 bf16 检查作为一个实例放进仓库,并署上她的名字,这样下一个比较两个版本的人就有了一个真实的案例作起点,而不只是合成的。

时间线

  1. Anagha 在 LinkedIn 上发布了她的 FP8 检查:120 道题中 71 对 72,McNemar p = 1.0。我们评论说,翻转的数量比 p 值更能说明问题。她回复了我们,我们便问两个方向各翻转了多少题。
  2. 她的回答:只有一道,bf16 对而 FP8 错,反方向没有,并且 120 个答案中有 49 个一字不差。当晚,公开脚本加上了 compare 模式,我们把根据她的汇总算出的区间和规划数字发给了她。
  3. Anagha 在自己的两次运行上跑了它:数字完全吻合,而且两个版本都答错时,48 次中有 42 次给出了同一个错误答案。她同意做成实例。

← 所有合作 · 提议一项合作