1. 前言
砚上三五笔,落墨鹧鸪啼
原文链接: https://thinkingmachines.ai/
相关分析链接:https://www.gongjiyun.com/blog/2025/9/fu1xw1spci9vnokjipecs9y9nzn/
最近看到一篇名为《击败 LLM 推理中的非确定性:从“玄学”到可控》的文章,这里将一些知识盲区简单记录下。
如有不对,欢迎评论区指正!
2. 正文
2.1 抛出问题
LLM的输出即便是同一个输入,每次也都会完全不同。这就很费解,难道这是一个玄学问题吗?
2.2 推测原因-浮点运算顺序
浮点数运算的顺序,考虑到浮点数精度的问题。。。
不符合加法结合律。(a+b)+c=a+(b+c)
2.3 推测原因-执行内核的原子操作陷阱
CUDA kernel执行,不同的CUDA core上使用原子计算并行操作,一个thread操作时,其他thread不能打断。但是却没有规定哪些thread先计算,哪些后计算,结合2.2中的浮点运算顺序,可能导致结果不同。
并行归约
原文是:
GPU的并发执行可能导致浮点累加顺序的不确定性。原子加法虽然能确保数据一致性,但其固有的串行特性导致效率低下,因此,现代 GPU 内核通常采用并行归约(parallel reduction的方式来累加部分和。并行归约是一种巧妙的算法,它能以固定且可预测的顺序完成累加,从而保证了计算结果的确定性。
我的理解是一种递归函数(归约),累加只执行这个递归函数,最终递归N次,完成一个相对复杂的运算。
然而,这并非绝对。有些内核确实可能表现出真正的非确定性行为。例如,在一个将值映射到计数(如哈希表)的累加操作中,如果多个并发线程同时尝试写入同一个位置,那么最终结果将取决于线程写入的顺序。这类操作会引入真正的非确定性。但值得庆幸的是,在 LLM 推理的算子实现中,这类真正的非确定性内核并未被广泛使用。通常情况下,LLM 推理中的底层计算内核都是确定性的。
2.4 推测原因-确定kernel产生不确定性结果
证明内核本身是不会产生随机性结果了。那么就可以分析出大概是:动态内核的调度。
矩阵乘法计算(matmuls)的最优算法和矩阵大小有关系;和GPU架构有关;这些量会影响所谓的内核调度。
举例来说,一个处理 2048x2048 矩阵的 bfloat16 矩阵乘法内核,其实现方式可能与处理 4096x4096 矩阵的内核大相径庭。这是因为矩阵乘法的最优算法会随着矩阵大小的变化而调整。所以,GPU 会根据矩阵的具体尺寸来选择不同的内核版本。
而内核的差异不仅体现在输入尺寸上,还与硬件平台息息相关。比如,为 NVIDIA A100 GPU 优化的 CUDA 内核,很可能与为 NVIDIA H100 GPU 优化的内核有所不同,因为底层硬件架构的差异会影响最优算法的选择。
这种根据输入大小、输入类型和硬件动态选择最佳内核的过程,就是所谓的“内核调度(Kernel Dispatch)”。更重要的是,这是一个动态过程,意味着最终调度哪个内核,完全取决于实际传递给 GPU 的输入数据。
计算sum(a)+sum(b),可以先分别计算sum(a)、sum(b)然后相加;或者计算a+b的和c,然后计算sum(c),两种方式不同,调度的kernel顺序不同。GPU 可能会在不同时间点选择不同的内核来计算 sum(A)、sum(B) 甚至 sum(C)。一旦选择的内核不同,其浮点数累加顺序就可能改变,进而导致最终结果的差异。这便是 LLM 推理中非确定性产生的一个重要原因。
2.5 易受上述原因影响的因素
2.5.1 RMS Norm
向量的均方根归一化,root-mean-square 均方根。举个例子,如果你的批次(batch)中包含多个序列,并且这些序列的长度各不相同,那么 RMSNorm 内核可能会针对每个序列选择不同的归约策略。这种动态选择机制,恰恰是导致非确定性结果的潜在原因。
采用批次不变(batch-invariant)的 RMSNorm 内核。来处理这个问题。。
2.5.1 Attention注意力机制
注意力机制是 LLM 的另一个核心组件,它通过计算查询(queries)和键(keys)之间的相似度来生成权重,进而对值(values)进行加权求和。这个加权求和同样是一个归约操作
batch norm
2.6 解决方法
使用批次不变(batch-invariant)的 RMSNorm 内核。一个批次不变内核的特点是,无论输入批次的大小或序列长度如何变化,它始终采用相同的、固定的归约策略。这样一来,就能确保 RMSNorm 的计算结果始终是确定性的,从而消除了这一环节的随机性。
2.7 真正的在线强化学习(True On-policy RL):确定性带来的新可能
研究人员已经指出,训练和推理之间存在的数值差异,会隐式地将我们的在线强化学习(On-policy RL)转化为离线强化学习(Off-policy RL)。这意味着训练时模型学到的策略,在实际推理时可能无法完全复现,从而影响学习效率和效果。
显然,如果连两个相同的推理请求都无法获得位级别相同的结果,那么在训练和推理之间实现位级别完全一致更是无从谈起。然而,确定性推理的实现,为我们提供了一个修改训练堆栈的契机,使得在采样(sampling)和训练之间也能获得位级别相同的结果。这将最终带来真正的在线强化学习。
3. 后记
To be continued.......