同一个模型文件,两块显卡给出不同答案:追到浮点加法的那一位
来源:dev.to — 2026-11-06
📋 概述
同样的 GGUF 文件、同样的 llama.cpp 构建、温度设为零,笔记本电脑上的 GTX 1650 Ti 把一道小学算术题答成 20 美元,云上的 Tesla T4 答成 2000 美元。两块卡各自都极其稳定,跑多少次逐 token 完全一致,差别来自芯片的处理器数量:llama.cpp 把大矩阵乘按流多处理器切分,笔记本 16 份、T4 40 份,同样 8960 个 float32 数按不同分组累加,末位结果就不一样。这些末位误差逐层累积,生成到第 124 个 token 时模型在「spent」和「saved」之间几乎打平(51.4% 对 47.8%),两块卡各落一边,后面整段话都跟着变。一个 llama.cpp 原生选项 -ub 1 就让两块卡完全一致,代价是 14%~15% 的运行时间。
🔑 核心要点
- 贪心解码下的差异不是随机性,而是浮点累加顺序造成的确定性偏移,因此可复现、可定位。
- 8960 个数分 16 份加得 47.0389595,分 40 份加得 47.0389099,末位差别被逐层放大成一道题的错。
- 分歧发生在某一个 token 的近平分点:一块选 spent(51.4%),另一块选 saved(59.1%),之后全盘不同。
- 模型自己的置信分数救不了你:要覆盖全部 18 道判分变化的题,得标出 250 题里的 164 道。
💡 金句
“Adding the same 8,960 float32 numbers in 16 shares gives 47.0389595; in 40 shares it gives 47.0389099.”
译:同样是 8960 个 float32 数,分 16 份累加得 47.0389595,分 40 份累加得 47.0389099。
👍 0
👎 0
← 返回 dev.to 首页