关于 “Thinking Machines Lab首次发长文” 的一些知识的学习和补充

news/2025/9/18 21:42:55/文章来源:https://www.cnblogs.com/myleaf/p/19099257

1. 前言

砚上三五笔,落墨鹧鸪啼

原文链接: https://thinkingmachines.ai/
相关分析链接:https://www.gongjiyun.com/blog/2025/9/fu1xw1spci9vnokjipecs9y9nzn/

最近看到一篇名为《击败 LLM 推理中的非确定性:从“玄学”到可控》的文章,这里将一些知识盲区简单记录下。
如有不对,欢迎评论区指正!

2. 正文

2.1 抛出问题

LLM的输出即便是同一个输入,每次也都会完全不同。这就很费解,难道这是一个玄学问题吗?

image

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.......

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/907451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python编程练习(Day4) - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

CF1630F 题解 | 网络流

传送门 题意 给你一个长度为 \(n\) 的序列 \(a\),构建一个无向图:若 \(a_i | a_j\),则在 \(i\) 和 \(j\) 中连边。 求最少删除多少个点,才能使得剩下的图是二分图。 思路 首先,我们知道倍数关系是一个偏序关系,即…

攻防世界-secret-galaxy-300 - xxx

先查壳,无壳,32位程序先运行一下这个exe程序,发现闪一下就消失了,也没有什么提示字符串可查看。打算先去od里面运行看看 打开后没看到什么,查看字符串一时间也没看出什么,不过这个task函数倒是让控制台输出一堆奇…

完整教程:运维安全05,iptables规则保存与恢复

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实用指南:LeetCode 面试经典 150_哈希表_单词规律(41_290_C++_简单)

实用指南:LeetCode 面试经典 150_哈希表_单词规律(41_290_C++_简单)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &…

代码随想录算法训练营第二天 | leetcode 209

长度最小的子数组(没做出来) 题目要求:寻找一个数组中满足大于等于目标要求的最小子数组 解题思路:返回结果可能是不存在,所以需要定义一个合适的初始值,可以使用java的最大数Integer.MAX_VALUE,然后使用滑动窗…

mpv硬件解码

mpv --hwdec=yes --vo=vappi 3e559881c836c30321894b20ae102c4e.mp4

2025.9.78——卷6-8选择

卷6选择 大O表示法 大O表示法由​​德国数学家保罗巴赫曼(Paul Bachman)提出,用于表示算法的最坏情况下时间复杂度 Θ表示法 Θ表示法通常归功于​​计算机科学家Donald Knuth​​等人,用于描述算法的平均时间复杂…

07-日期和时间相关函数

07-日期和时间相关函数$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");获取当前日期和时间now()和sysdate()的区别:now():获取的是执行select语句的时刻。…

关于pytorch的读书报告

PyTorch 读书报告 一、引言 PyTorch 是由 Facebook(现 Meta)人工智能研究实验室开发的一款开源机器学习框架,自 2016 年推出以来,凭借其动态计算图特性、简洁直观的 API 设计以及强大的生态系统,迅速成为学术界和…

Emacs 折腾日记(三十)——打造C++ IDE 续

上一篇博客中,我完成了C++ IDE初步工作,包括代码的高亮、折叠、跳转以及补全等工作。但是作为IDE来说功能还有点不够,就我个人而言作为IDE来说它还需要具备一键编译运行和调试功能。这篇文章就来记录我是如何实现上…

数据结构 项目一

一:数据结构的基本概念 数据结构----研究数据的特性及数据之间存在的关系 算法+数据结构=程序。其中数据结构是指数据逻辑结构和物理结构,算法是对数据运算的描述。 用计算机解决一个具体问题时,首先从具体问题中抽…

好烦

我不行了,一做初赛题就有一种莫名其妙的烦躁,根本就写不进去,一点都冷静不下来

完整教程:.NET驾驭Word之力:玩转文本与格式

完整教程:.NET驾驭Word之力:玩转文本与格式2025-09-18 21:15 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

用 Go 语言与 Tesseract OCR 识别英文数字验证码

一、安装与配置 安装 Tesseract OCR 你需要先安装 Tesseract OCR 引擎。具体步骤如下: Ubuntu: 更多内容访问ttocr.com或联系1436423940 sudo apt-get update sudo apt-get install tesseract-ocr macOS: brew instal…

FreeRTOS和LVGL组合使用教程

前言 关于这两者组合使用的教程,网上可以说是各种方法都有,移植的时候我也有遇到各种问题,在此处记录一下解决过程 问题 栈空间的分配问题 FreeRTOS和LVGL的栈分配都尽量多一点,不然后面的任务可能创建失败 lvgl心…

Codeforces 1646 记录

目录C. Factorials and Powers of Two / 阶乘数与二的幂 D. Weight the Tree / 树上赋权 E. Power Board / 乘方表 F. Playing Around the Table / 圆桌打牌C. Factorials and Powers of Two / 阶乘数与二的幂 题意简述…

综合与实现流程【p3】--(DSP-存储)优化PS系统集成

(一)资源优化 1 DSP优化 创建优化的DSP映射 创建文件 dsp_optimized_pe.v: `timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // 优化的PE模块 - 直接使…

Linux中 sed命令忽略大小写匹配

001、[root@localhost test]# ls a.txt [root@localhost test]# cat a.txt ## 测试数据 22 abc44 88 32 ABC11 43 14 aBc44 86 [root@localhost test]# sed -n /abc/p a.txt ## 匹配abc 22 abc44 88 [r…

VISA Resource name

VISA Resource name📌 步骤放置 VISA Open在 Block Diagram 放一个 VISA Open 节点。Resource name 输入 TCPIP0::192.168.2.121::inst0::INSTR(就是你之前的地址)。VISA Write在 VISA Open 的 session 输出连到 V…