当硬件说谎时:静默数据损坏遇上随机性软件
在你的推理集群中的某个地方,可能有一块芯片正在计算错误答案。不是崩溃 —— 而是错误答案。它通过了制造测试,通过了健康检查,但在指令序列、数据值、电压和温度的特定组合下,它会返回一个完全错误的数字。超大规模云服务商已经在大规模范围内记录了这一现象:大约每千台设备中就有一台会发生静默数据损坏(Silent Data Corruption),这一比率比我们过去担心的宇宙射线导致的比特翻转(bit flip)要高出几个数量级。
五十年来,软件拥有一种针对此情况的免疫系统:确定性(Determinism)。相同的输入,相同的输出 —— 因此你可以进行校验和(checksum)、回放,并与基准结果(golden results)进行对比,撒谎的硬件最终会被抓获。LLM 推理是第一个失去这种免疫系统的主要工作负载。当模型给出一个略差的答案时,是因为采样器的随机性,还是因为退化的 GPU 在你的 KV 缓存中翻转了比特?没人能通过检查来判断。一个不稳定的加速器可以在所有仪表盘显示正常的情况下,静默地拉低你的质量指标数周之久。
每千块芯片中就有一个在撒谎
证据自 2021 年以来一直在堆积。Google 的工程师将其描述为“反复无常的核心(mercurial cores)” —— 由于逃过了所有测试的制造缺陷,单个 CPU 核心会间歇性地计算出错误结果。一个反复无常的核心可能在 99.99% 的时间里都是正确的,仅当特定的指令在特定的温度下遇到特定的操作数时才会失败。Google 将实际损害追溯到了它们:损坏的加密密钥、崩溃的数据库索引、删除活动数据的垃圾回收。
Meta 对超过 100 万个生产环境中的 CPU 进行了系统性研究,并确认了问题的严重程度:静默数据损坏不是黑天鹅事件,而是大型集群的一种稳态属性,大约每千台设备就会发生一次故障。将其与历史上大约百万分之一的软错误基准相比,你就能理解为什么超大规模云服务商现在要进行持续的生产环境筛选。
有三种力量加剧了这一问题,且都在加速:
- 硅片密度(Silicon density)。 更小的晶体管意味着更多边缘化的晶体管,以及更多逃过测试覆盖的缺陷。
- 电压和频率缩放(Voltage and frequency scaling)。 为了达到效率目标,芯片运行在更接近其电力极限的状态,因此一个有轻微缺陷的电路在发生误操作前的余量更小。
- 加速器(Accelerators)。 GPU 封装了海量的算术单元,其单单元验证比 CPU 核心要少,而 AI 工作负载恰恰在持续的高温下全天候地锤炼这些单元。
对 AI 团队来说,结论是:你所运行的硬件 正以低但非零的比率在撒谎,而你恰好购买了大量的此类硬件。
确定性曾是免疫系统
回顾一下旧有的防御机制是很有意义的,因为它们的丧失正是故事的核心。
经典的分布式系统假设即使硬件不可信,软件也是确定的。这一单一假设支撑着每一层损坏防御:校验和验证字节在传输中幸存;写后读取(write-then-read-back)验证存储;在两台机器上运行相同的计算并比较输出,能以近乎绝对的把握抓获撒谎的核心;将可疑任务针对基准输出进行回放,能将“数字看起来很奇怪”转变为二进制的判定。Meta 的集群工具链就建立在此之上 —— 带有已知正确答案的有针对性的微基准测试,要么在维护窗口运行,要么切入生产任务之间毫秒级的间隙中运行。Google 在生产环境中持续对 CPU 进行模糊测试,将实际硅片的计算结果与架构定义的规范结果进行对比。
所有这些技术都归结为同一个原语:计算两次,精确比较。 精确比较是将静默损坏转化为显性损坏的关键。
现在看看 LLM 推理。采样是有意随机的。浮点数归约(Floating-point reductions)不满足结合律,因此结果会随执行顺序而产生合理的波动。而近年来最尖锐的发现是:即使在 Temperature 为 0 时,生产环境的推理也不是确定的,因为归约内核(reduction kernels)会根据批次大小(batch size)产生不同的数值结果,而批次的构成取决于那一毫秒内恰好到达的其他请求。一个团队在 Temperature 为 0 的情况下,通过一个流行的开源模型运行了 1,000 次相同的提示词 ,结果得到了 80 种不同的补全结果 —— 而这还是在健康的硬件上。比特级比较,这一作为五十年损坏防御基础的原语,在完全正常的集群上也会整天返回“不匹配”。
因此,曾经用于警示硬件撒谎的警报,现在会因为各种良性原因不断响起,这等同于警报从未响过。
撒谎的 GPU 在 LLM 中是什么样的
大多数工程师的直觉 —— “比特翻转会产生 NaN 或乱码,我们会注意到的” —— 被证明大错特错。对 LLM 工作负载中永久性 GPU 缺陷的故障注入研究发现,NaN 和无穷大值仅占静默损坏结果的 1% 左右。绝大多数损坏的值在数值上仍然是合理的:一个偏移了几个百分点的激活值,一个略微偏高的 logit,或者一个将概率权重转移到错误标记上的注意力分数。只有不到 40% 的比特翻转事件是单比特的;真实的缺陷会以更混乱、更有规律的方式损坏数值。
追踪一个有缺陷的乘加单元(multiply-accumulate unit)出现在你的推理服务器路径上会发生什么:
- 早期层的损坏值会传播到随后的每一层 —— Transformer 没有内部纠错机制,而归一化层会“贴心地”将损坏扩散到整个隐藏状态。
- KV 缓存中的比特翻转更糟糕:损坏的键或值在随后的每个解码步骤中都会被重复读取,因此一次翻转就会污染生成的整个剩余部分。
- 可见的症状不是胡言乱语。而是一个略微错误的答案,一个幻觉细节,一个在第四步脱轨的推理链 —— 这些输出与模型的普通失败模式难 以区分。
- https://research.google/pubs/cores-that-dont-count/
- https://dl.acm.org/doi/10.1145/3600006.3613149
- https://engineering.fb.com/2022/03/17/production-engineering/silent-errors/
- https://engineering.fb.com/2025/07/22/data-infrastructure/how-meta-keeps-its-ai-hardware-reliable/
- https://thinkingmachines.ai/blog/defeating-nondeterminism-in-llm-inference/
- https://arxiv.org/abs/2604.10390
- https://arxiv.org/abs/2502.12340
- https://arxiv.org/pdf/2407.21783
- https://arxiv.org/pdf/2110.11519
- https://www.tomshardware.com/tech-industry/artificial-intelligence/faulty-nvidia-h100-gpus-and-hbm3-memory-caused-half-of-the-failures-during-llama-3-training-one-failure-every-three-hours-for-metas-16384-gpu-training-cluster
