推理引擎为什么缺少「批不变性」?——Thinking Machines Lab 研究解读
阅读对象:LLM 推理 / 训练工程实践者。核心材料是 Thinking Machines Lab 2025 年 9 月博文《Defeating Nondeterminism in LLM Inference》,本文是对一次技术调研的整理。
一句话结论
LLM 推理结果无法复现,真正的主因不是「并发 + 浮点随机性」,而是内核(kernel)缺少「批不变性(batch invariance)」:同一个请求的逐位输出会随前向传播时的 batch size 改变,而在线服务里的 batch size 由不可预测的服务器负载决定。两个不确定性一相乘,从用户视角看,整个推理服务就是不确定的。
一、问题的起点:temperature=0 也复现不了
即使把温度调到 0,「同一问题问多次得到不同回答」依然存在;用 vLLM / SGLang 在自己的硬件上跑,采样过程同样不是确定性的。
流行的解释是「浮点非结合性 + 并发执行顺序」:(a+b)+c ≠ a+(b+c),多线程归约顺序不同,结果就不同。这个解释不完全错,但不是全貌。
二、反直觉的事实:内核其实是确定性的
原文把「确定性」层层拆开,下面几句同时成立:
- GPU 上某些内核确实不确定;
- 但前向传播用到的所有内核都是确定的(同样输入反复跑,比特级一致);
- 因此 vLLM 这类推理服务器的前向传播本身是 run-to-run 确定的;
- 然而从任何一个用户的角度看,结果仍然不可复现。
关键证据是:LLM 前向传播里实际上不需要原子加法(atomic add)。通常 batch 维度的并行度已经足够,不必再切归约维度,也就无需跨核通信与原子累加 —— 唯一常用到原子加法的是 FlashAttention 的反向传播,而前向不涉及。所以前向「本质上是 run-to-run deterministic」。
三、元凶:批不变性缺失
前向确定 ≠ 系统确定。如果某个请求的输出依赖于并行的其他用户请求(负载决定 batch size),那么从单请求视角看,系统就是不确定的。
但要强调:这不是跨 batch 泄漏信息,而是前向传播缺乏批不变性 —— batch size 一变,同一个元素的计算结果就变。
按定义,矩阵乘在 batch 维度上相互独立,batch 里其他元素存在与否不该影响某个元素的结果;但实验证据显示,现实中并非如此。
把一个内核「不具备不变性」的属性(batch size),与该属性自身的不可预测性(服务器负载)组合起来,就得到一个不确定的系统。
由此得出结论:几乎所有 LLM 推理端点都是不确定的,主因就是负载(及其决定的 batch size)不可预测;而且这与硬件无关 —— GPU、CPU、TPU 上的推理端点都一样。
四、为什么内核不批不变:三个算子逐个看
要求是:无论 batch size 多大,每个元素的归约顺序必须固定。注意这不等于「归约策略永远不变」—— 参与归约的元素数量变了,策略可以变;只有「batch size 影响了归约策略」时才破坏批不变性。
| 算子 | 默认为什么不批不变 | 修法 |
|---|---|---|
| RMSNorm | 并行度不足或 batch 太小时,工程师会用原子加法 / 分段求和(split reduction)补并行度,从而改变求和策略 | 一个 batch 元素交给一个核(data-parallel);或始终采用在极小 batch 下也有足够并行度的固定归约策略(大 batch 时轻微过度并行,牺牲一点峰值性能) |
| 矩阵乘法 | M/N 太小时不得不沿归约维拆分(Split-K);张量核心指令(如 wgmma.mma_async … m64n128k16)内部归约顺序不同,batch=1 时最快的核甚至不用张量核心 | 编译一个固定的核配置,对所有形状复用;把 Split-KV 的切分改成固定大小切分 |
| 注意力 | 归约维度从特征维扩到序列维,还要应对分块预填充、前缀缓存等不同切分方式 | 数值必须同时对两个因素不变:单次处理的请求数 + 每个请求在引擎里的切分方式 |
也就是说,要让整个 Transformer 批不变,必须让每一个内核对 batch size 不变(逐点运算天然满足)。
五、代价与收益
性能代价可控。 单卡 Qwen-3-8B、1000 条序列、输出 90–110 token 的实验中:vLLM 默认约 26 秒 → 未优化的确定性版本约 55 秒 → 换成更优的 attention 内核后约 42 秒。慢主要来自 vLLM 里 FlexAttention 集成尚未优化。
更大的收益在训练侧:True On-Policy RL。 训练与推理数值不一致,会把「on-policy RL」悄悄变成 off-policy RL。实现确定性推理后,采样器与训练器可以比特级一致,得到 KL 散度恒为 0 的 True On-Policy RL:实验中不加重要性权重(off-policy 修正)的训练会中途 reward 崩塌、KL 散度出现尖峰,而比特级一致时训练平滑进行。
六、三条可以带走的结论
- 区分三层确定性:单内核运行间确定性 → 前向传播确定性 → 服务端(用户视角)确定性。不确定性出现在第三层,根因是 batch size 随负载变化 × 内核不批不变。
- 批不变性的判据:不是「归约策略永远不变」,而是「归约顺序不因 batch size 而变」。凡是「为小 batch 补并行度」的优化(原子加法、Split-K、按 batch 选张量核心指令 / padding 策略)都是破坏点。
- 工程做法:固定核配置、固定切分策略(fixed-size split-KV),用少量性能损失换比特级可复现 —— 对 RL 训练对齐、调试定位、评测复现都有直接价值。
参考来源
- 原文:Defeating Nondeterminism in LLM Inference — Thinking Machines Lab(2025 年 9 月),https://thinkingmachines.ai/blog/defeating-nondeterminism-in-llm-inference/
- 中文解读:机器之心《刚刚,Thinking Machines Lab 首次发长文,揭开 LLM 推理不确定性真相》(2025-09-11)
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/weixin_44128977/article/details/168024678



