Lazy loaded image
Lazy loaded image大模型“不确定性”的真相:不是温度而已,关键在 batch invariance
Words 1335Read Time 4 min
2025-9-13
2025-12-8
slug
大模型“不确定性”的真相:不是温度而已,关键在 batch invariance
type
Post
status
Published
date
Sep 13, 2025
tags
观察分析
推荐
大模型
summary
LLM 推理“不确定性”的根因不在温度或“并发+浮点”,而在于 batch invariance 缺失:同一请求的数值会随拼批规模与切分策略改变。通过对 RMSNorm、Matmul、Attention 做 batch-invariant 改造(统一 KV 布局、固定 split-size 等),在 temperature=0 下可实现位级一致的可复现输出,代价是可接受的性能损失,为金融/法律等高确定性场景及 True On-Policy RL 奠定基础。
category
随笔杂谈
icon
password
Thinking Machines Lab  大名鼎鼎的thinking machine lab
 
最近读到一篇硬核长文《Defeating Nondeterminism in LLM Inference》,瞬间把我之前的困惑都串起来了。 我们常说:大模型像“文字接龙”。想要更有创意,就把 temperature 调高一点;若把温度调成 0,理论上每次都选概率最大的词,应该是确定的。可现实是:温度 0 也经常不确定,同样的输入,结果有时仍不一样。 很多解释会把锅甩给“并发 + 浮点非结合性”。但这篇文章指出:这解释不完整。事实是,许多前向 kernel(比如常见的矩阵乘法)在相同形状下是 run-to-run 位级相同 的;给定一模一样的整批请求,前向也可以被视为确定。
那用户为啥还会遇到不确定?关键在一个词:batch invariance(批次不变性)。 当你的请求被放进推理引擎时,这一次的 batch 大小(由并发和负载决定)会影响底层 kernel 的归约/并行策略,从而改变数值细节→最终的解码路径。 负载对你来说是“随机”的,因此同样输入、一次次调用就体感不确定。
作者给的解法是:把涉及归约的关键算子都做成 batch-invariant—— RMSNorm:保持数据并行,避免小 batch 时切到改变归约顺序的策略; Matmul:回避随形状切换到 Split-K/stream-k,尽量用固定的 tiles/指令组合; Attention:让 KV cache 与当前 token 的 K/V 在 kernel 里统一布局与归约顺序,并用 “固定 split 大小”的 Split-KV,保证不因切片/并发不同而改顺序。 结果很硬气:温度 0、同一提示跑 1000 次,默认栈出现约 80 种不同;启用 batch-invariant kernels 后,1000/1000 次完全一致。性能会慢一些,但在优化后仍在可接受范围。
我的看法: 创作/营销场景里,我们有意用温度造“好不确定”; 金融、法律、医疗里,需要的是底层可复现的“好确定”。 这篇文章的价值,就在于直指根因:不是简单“浮点+并发”,而是kernel 缺乏 batch invariance;只要把 RMSNorm/Matmul/Attention 做到 batch-invariant,推理就能“所见即所得”。 这一步迈过去,True On-Policy RL 也就有了现实基础。
最近读到一篇硬核长文《Defeating Nondeterminism in LLM Inference》,瞬间把我之前的困惑都串起来了。
我们常说:大模型像“文字接龙”。想要更有创意,就把 temperature 调高一点;若把温度调成 0,理论上每次都选概率最大的词,应该是确定的。可现实是:温度 0 也经常不确定,同样的输入,结果有时仍不一样。
很多解释会把锅甩给“并发 + 浮点非结合性”。但这篇文章指出:这解释不完整。事实是,许多前向 kernel(比如常见的矩阵乘法)在相同形状下是 run-to-run 位级相同 的;给定一模一样的整批请求,前向也可以被视为确定
那用户为啥还会遇到不确定?关键在一个词:batch invariance(批次不变性)
当你的请求被放进推理引擎时,这一次的 batch 大小(由并发和负载决定)会影响底层 kernel 的归约/并行策略,从而改变数值细节→最终的解码路径。
负载对你来说是“随机”的,因此同样输入、一次次调用就体感不确定
作者给的解法是:把涉及归约的关键算子都做成 batch-invariant——
  • RMSNorm:保持数据并行,避免小 batch 时切到改变归约顺序的策略;
  • Matmul:回避随形状切换到 Split-K/stream-k,尽量用固定的 tiles/指令组合
  • Attention:让 KV cache 与当前 token 的 K/V 在 kernel 里统一布局与归约顺序,并用 “固定 split 大小”的 Split-KV,保证不因切片/并发不同而改顺序。
结果很硬气:温度 0、同一提示跑 1000 次,默认栈出现约 80 种不同;启用 batch-invariant kernels 后,1000/1000 次完全一致。性能会慢一些,但在优化后仍在可接受范围。
我的看法:
  • 创作/营销场景里,我们有意用温度造“好不确定”;
  • 金融、法律、医疗里,需要的是底层可复现的“好确定”。
  • 这篇文章的价值,就在于直指根因:不是简单“浮点+并发”,而是kernel 缺乏 batch invariance;只要把 RMSNorm/Matmul/Attention 做到 batch-invariant,推理就能“所见即所得”。
    • 这一步迈过去,True On-Policy RL 也就有了现实基础。
 
 
 
 
 
 
 
 
 
 
上一篇
异或的挫败与注意力的胜利:AI如何理解语言
下一篇
后厨里的数学革命:用“灶台与菜”看懂 LoRA 大模型微调