可靠性基础
单个加速器故障率很低,但扩展到数千节点后,组件故障率会成倍放大,直至中断成为常态运行条件。在集群规模下,平均故障间隔时间(MTBF)从数年降至数小时,故障恢复因此成为核心执行路径。本附录收集了本书容错章节背后的定量可靠性计算,推导故障概率、Young-Daly 最优检查点间隔以及可用性叠加模型。以 C³ 术语而言,它发展了协同轴,即检查点、恢复与可用性如何决定集群计算与通信中有多少转化为有用工作。
如何使用本附录
本附录设计为参考材料,旨在帮助从直觉(“规模越大故障越频繁”)过渡到定量工程决策(“多久检查点一次?”或”需要多少备用节点?“)。
本附录中的算例采用标准 10,000 GPU 训练集群,除非另有说明。
规模下的故障概率
考虑一次运行 30 天的 10,000-GPU 集群训练任务。在这段时间内,至少有一个建模节点组件发生故障的概率是多少?答案——实际上是接近 100%——决定了系统是否需要将容错作为核心设计要求,还是仅仅是一项锦上添花的能力。
单个硬件组件的可靠性非常突出。数据中心级 GPU 在故障前可运行数万年。然而,大规模系统的物理规律却对可靠性不利:每增加一个组件就多一次故障机会,而总故障率随组件数量线性增长。组件级故障率会系统性地聚合为集群级故障预测。
组件故障率
可靠性工程师使用两个互补的指标来刻画组件。 失效强度(FIT) 速率表示每 \(10^9\) 设备运行小时数的故障次数——之所以选择该单位,是因为单个组件故障极为罕见,若以”每小时故障次数”表示会产生不便的小数。其倒数量 平均失效时间(MTTF) 计算平均寿命(小时)(公式 1):
\[ \text{MTTF} = \frac{10^9}{\text{FIT}} \tag{1}\]
参考 FIT 速率与 MTTF 值(组件故障率)刻画了典型 GPU 训练节点中组件的可靠性,其依据来自大规模集群与仓库级规模的经验 Barroso 等 (2019年)。这些值假设处于浴盆曲线的稳态”有效寿命”阶段,此时故障率近似恒定——既不由早期失效(婴儿死亡率)主导,也不由磨损失效(寿命末期)主导 (Klutke 等 2003年)。
| 组件 | FIT 速率 | MTTF | MTTF(年) | 典型失效模式 |
|---|---|---|---|---|
| GPU | 20,000 | 50,000 hours | 5.7 years | 芯片缺陷、热疲劳 |
| HBM | 5,000 | 200,000 hours | 22.8 years | 比特翻转累积、TSV |
| NIC | 6,666.7 | 150,000 hours | 17.1 years | 收发器劣化 |
| PSU | 10,000 | 100,000 hours | 11.4 years | 电容老化 |
| PCIe Switch | 5,000 | 200,000 hours | 22.8 years | 焊点、静电放电损伤 |
| Optical Cable | 20,000 | 50,000 hours | 5.7 years | 光纤弯曲、连接器磨损 |
| ToR Switch | 3,333.3 | 300,000 hours | 34.2 years | ASIC 故障、风扇轴承 |
每个组件单独看都显得非常可靠——单个 GPU 平均可运行 5.7 years。困难始于当大量此类组件同时运行时,节点的行为表现。
MTBF 级联
计算节点是一个串联系统:只要任一组件发生故障,节点即发生故障。对于具有恒定故障率的独立组件,公式 2 将各组件的故障率相加,得到节点级故障率:
\[ \frac{1}{\text{MTBF}_{\text{node}}} = \frac{n_{\text{gpu}}}{\text{MTTF}_{\text{gpu}}} + \frac{n_{\text{nic}}}{\text{MTTF}_{\text{nic}}} + \frac{n_{\text{psu}}}{\text{MTTF}_{\text{psu}}} + \cdots \tag{2}\]
把每个组件看作一个倒计时直至故障的时钟。一个包含 8 个 GPU、2 张网络接口卡(NIC)和 2 个电源(PSU)的节点共有 12 个独立时钟——当第一个时钟归零时节点即发生故障。时钟越多,预期等待时间越短。
对于由 \(N_{\text{nodes}}\) 个相同节点组成的集群,同样的逻辑向上推进一层,如 公式 3 所示:
\[ \text{MTBF}_{\text{cluster}} = \frac{\text{MTBF}_{\text{node}}}{N_{\text{nodes}}} \tag{3}\]
这是 MTBF 级联:每一层的可靠性随组件数量线性下降,而各层之间相互叠加。单个节点的 MTBF 为 5,172.4 hours 时听起来相当可靠;但由 1,250 个这样的节点组成的集群,其 MTBF 仅为 4.14 hours——每几小时发生一次故障才是预期的稳态。
按规模的集群 MTBF 展示了集群 MTBF 如何随集群规模增大而缩短。
| 集群 GPU 数量 | 节点数 | 集群 MTBF | 预期故障数/天 |
|---|---|---|---|
| 256 | 32 | 161.6 hours | 0.1 |
| 1,024 | 128 | 40.4 hours | 0.6 |
| 2,048 | 256 | 20.2 hours | 1.2 |
| 8,192 | 1,024 | 5.1 hours | 4.8 |
| 10,000 | 1,250 | 4.1 hours | 5.8 |
| 100,000 | 12,500 | 24.8 minutes | 58 |
从数百个 GPU 到数万乃至数十万个 GPU 的转变,是一次量级的根本性变化。在 256 个 GPU 时,两次故障之间可能经过一整天;在 10,000 个 GPU 时,集群预计每个班次出现多次故障;在 100,000 个 GPU 时,故障成为一种持续的背景条件——系统从未处于完全健康状态。
作业期间的故障概率
MTBF 决定了故障之间的平均时间间隔,但训练作业具有固定时长。从业者关心的是:其作业至少被中断一次的概率。
在指数故障模型(恒定故障率)下,公式 4 给出作业时长为 \(T_{\text{job}}\) 期间至少发生一次故障的概率:
\[ \Pr(\geq 1\ \text{failure}) = 1 - e^{-T_{\text{job}}/\text{MTBF}} \tag{4}\]
当 \(T_{\text{job}} \gg \text{MTBF}\) 时,该概率迅速趋近于 1。至少一次故障的概率 给出了各种集群规模与作业时长对应的具体数值。
| 集群 GPU 数量 | 1 天 (24 h) | 1 周 (168 h) | 30 天 (720 h) |
|---|---|---|---|
| 256 | 13.8% | 64.6% | 98.8% |
| 1,024 | 44.8% | 98.4% | > 99.9% |
| 2,048 | 69.5% | > 99.9% | > 99.9% |
| 8,192 | 99.1% | > 99.9% | > 99.9% |
| 10,000 | 99.7% | > 99.9% | > 99.9% |
| 100,000 | > 99.9% | > 99.9% | > 99.9% |
对于任何超过数千个 GPU 的集群,只要作业时长超过一天,至少发生一次故障的概率实际上接近 100%。这正是 容错 将容错视为基本架构要求而非防御性措施的原因。
指数故障模型假设故障率为常数,该假设在稳态有效寿命阶段成立。在 burn-in(最初几百小时)和 wear-out(接近寿命末期)阶段,故障率更高。实践中,集群运营方观察到,新部署节点在其首周内的故障率比稳态高 2–3\(\times\) 倍,因此节点接入生产集群前进行 burn-in 测试至关重要。
长训练作业中故障的不可避免性提出了一个实际问题:既然故障会中断执行,那么如何最小化损失掉的进度?
检查点优化
每次检查点都会保存进度,但也会消耗时间。检查点保存得太少,一次故障就会毁掉数小时训练;保存得过于频繁,则写入检查点本身的开销会成为瓶颈。Young-Daly 公式给出了数学上的最优平衡点,且仅依赖两个可测量量:写入检查点所需的时间,以及故障发生的频率 Daly (2006年)。
Young-Daly 模型
最优检查点间隔需要在两种相互竞争的开销之间取得平衡。写入检查点需要花费时间 \(T_{\text{write}}\)(即检查点成本),在此期间不会产生任何有用的训练进展。然而,检查点之间的间隔越长,故障发生时损失的工作量就越多——平均而言损失半个间隔。公式 5 给出了最小化期望总开销的 Young-Daly 公式:
\[ \tau_{\text{opt}} = \sqrt{2 \times T_{\text{write}} \times \text{MTBF}_{\text{system}}} \tag{5}\]
其中 \(T_{\text{write}}\) 为检查点写入时间(秒),\(\text{MTBF}_{\text{system}}\) 为集群或作业级系统的 MTBF(秒)。
公式 5 背后的直觉具有类似几何平均的性质:当检查点成本相对于 MTBF 较低时(\(T_{\text{write}} \ll \text{MTBF}_{\text{system}}\),常见情形),最优间隔介于这两个时间尺度之间。若检查点写入耗时为零,则最优节奏为每步保存一次;若系统永不故障,则完全不需要检查点。平方根在这两种极端之间进行插值。
该公式假设故障服从指数分布(无记忆性),且检查点成本 \(T_{\text{write}}\) 远小于 \(\text{MTBF}_{\text{system}}\)。这两个假设在生产训练集群中都很好地成立:指数模型能够拟合观测到的故障数据,而现代检查点系统可在数十秒内写入高速并行存储,而 MTBF 则以小时计。
检查点规模
检查点规模决定了输入 Young-Daly 公式的写入时间 \(T_{\text{write}}\)。对于常见的混合精度训练检查点(使用自适应矩估计 Adam 优化器),每个参数大约需要 14 字节持久化状态:
- BF16 模型权重 2 字节
- FP32 主权重 4 字节
- FP32 一阶矩(Adam \(m\))4 字节
- FP32 二阶矩(Adam \(v\))4 字节
公式 6 将这些逐参数成本汇总为检查点总占用空间:
\[ \text{Checkpoint Size} = P \times 14 \text{ bytes/parameter} \tag{6}\]
其中 \(P\) 是需要序列化持久化优化器与权重状态的训练模型参数数量。
混合精度 Adam 检查点大小估算(混合精度 Adam 训练的检查点大小)展示了状态如何从可管理的 GB 级扩展到前沿规模的 TB 级:
| 模型规模 | 检查点大小 | 在 100 GB/s 下的写入时间 |
|---|---|---|
| 7B | 98 GB | 0.98 s |
| 13B | 182 GB | 2 s |
| 70B | 980 GB | 10 s |
| 175B | 2450 GB | 24 s |
| 1T | 14000 GB | 140 s |
在前沿规模(175B+ 参数)下,这些大小达到 TB 量级。这使得检查点写入时间成为一项显著成本,直接影响 Young-Daly 最优间隔。容错 中的检查点策略讨论了降低 \(T_{\text{write}}\) 的技术—异步检查点、增量差分和分布式存储—这些技术都通过缩小平方根下的 \(T_{\text{write}}\) 因子来改善 Young-Daly 结果。
算例:最优检查点间隔
将检查点写入时间与 10,000 个 GPU 的 MTBF 相结合,可以得到具体的检查点保存周期。
Napkin Math 1.1: Young-Daly:10,000 GPU 集群上的 175B 模型
Step 1(第 1 步):检查点写入时间(\(T_{\text{write}}\))。 \[T_{\text{write}} = \frac{\text{Checkpoint Size}}{\text{Write Bandwidth}} = \frac{2,450 \text{ GB}}{100 \text{ GB/s}} = 24.5 \text{ s}\]
Step 2(第 2 步):套用 Young-Daly 公式(公式 5)。 \[\tau_{\text{opt}} = \sqrt{2 \times T_{\text{write}} \times \text{MTBF}_{\text{system}}} = \sqrt{2 \times 24.5 \text{ s} \times 4.14 \text{ h} \times 3{,}600 \text{ s/h}} = 14.2 \text{ min}\]
Interpretation(解读):最优检查点间隔约为 14.2 minutes。仅由检查点带来的开销占训练时间的 \(T_{\text{write}}/\tau_{\text{opt}} \approx\) 2.9 percent。
Systems insight(系统洞见):若集群规模翻倍至 20,000 GPU,则 MTBF 减半,最优间隔缩小为 10.1 minutes——因为故障更频繁,需要更频繁地检查点。这体现了大规模下的根本性张力:更大的集群更快,但也要求更频繁地中断以保护进度。
The boundary conditions of the Young-Daly formula merit attention. When \(T_{\text{write}}\) approaches \(\text{MTBF}_{\text{system}}\)(检查点成本接近 MTBF),检查点与返工开销会大到使仅靠检查点/重启都无法维持有用的前向进度。在这种情况下,就需要冗余或弹性训练,正如 节 1.4.1 中所讨论的。
恢复预算
当故障发生时,系统并不会立即恢复训练。检测、重新调度、重新加载状态以及重放丢失的工作各自都消耗时间。理解这一恢复过程的结构,可以揭示哪个阶段占主导,以及工程投入应投向何处。
恢复时间的构成
恢复并非单一事件,而是一系列阶段组成的流水线,每个阶段都有各自的时间预算。公式 7 将它们求和为总恢复时间:
\[ T_{\text{recovery}} = T_{\text{detect}} + T_{\text{reschedule}} + T_{\text{reload}} + T_{\text{replay}} \tag{7}\]
各项均为持续时间:故障检测、替换调度、检查点重新加载,以及自上次检查点以来丢失的训练工作重放。它们的总和是作业返回有效训练之前所经历的墙钟时间。
恢复时间分解 Recovery Time Breakdown 将恢复分解为决定集群在故障后多久才能恢复满产的那些阶段。
| 阶段 Phase | 典型持续时间 Typical Duration | 发生了什么 What Happens |
|---|---|---|
| \(T_{\text{detect}}\) | 30 s | 心跳超时;工作节点被判定为故障(确认过程会占用 容错 中的预算) |
| \(T_{\text{reschedule}}\) | 60 s | 从备用池分配替换节点 |
| \(T_{\text{reload}}\) | 24.5 s | 从存储读取检查点到 GPU 内存 |
| \(T_{\text{replay}}\) | ~7.1 min | 重算自上次检查点以来的训练步骤 |
| Total \(T_{\text{recovery}}\) | ~9 min | 系统重新达到满产 |
分解这一序列表明,重放时间 \(T_{\text{replay}}\) 通常占主导,并且直接受检查点间隔控制:平均而言,需要重放约一半的间隔。这与 Young-Daly 公式形成一种自我强化的循环——更短的间隔意味着更少的重放,但也意味着更多的检查点开销,而该公式正是找到这一总和的最小值。
其他阶段则提供了工程优化的目标。\(T_{\text{detect}}\) 可以通过更具攻击性的心跳间隔来降低(代价是误报增加)。\(T_{\text{reschedule}}\) 取决于是否预先分配了热备用节点,这属于集群编排决策,在 集群编排 中有覆盖。\(T_{\text{reload}}\) 随检查点大小和存储带宽增长,这推动了在 容错 中讨论的检查点压缩与分片技术。
吞吐率 Goodput vs. rawput
并非在训练集群上花费的全部时间都会产生有用的进度。Rawput 是配置好的集群在不考虑检查点或恢复中断的情况下能够维持的步速率。Goodput 是贡献于最终模型的已提交训练步骤速率:
\[ \text{Goodput Ratio} = \frac{\text{Committed Useful-Step Rate}}{\text{Fault-Free Step Rate}} \approx \frac{T_{\text{useful}}}{T_{\text{wall}}} \]
模型化的 rawput 与 goodput 之间的差距来自两个来源:
- 检查点开销 Checkpoint overhead(\(\sim\) 2.9 percent):每次检查点写入期间训练都会暂停。
- 恢复与返工开销 Recovery and rework overhead(\(\sim\) 3.6 percent):因检测、重新调度、重新加载以及重放每次故障后被丢弃的工作而损失的时间。
在 10,000-GPU 规模下,Meta、Google 等发布的报告一致显示,故障与检查点合计的总开销为 10–25%。因此,一个名义上可在 30 天内完成训练运行的集群,实际需要 33–38 天的墙钟时间。集群编排 和 规模化机器学习运维 中的集群编排策略旨在缩小这一差距——每回收 1 个百分点的开销,都直接转化为节省的美元和缩短的训练时间。
策略选择 Strategy Selection
检查点/重启并非唯一的容错策略。对于停机意味着收入损失的推理服务负载,冗余提供了根本不同的权衡。对于弹性训练,系统可以围绕故障收缩,而不是停止。选择哪种策略取决于负载对延迟、成本和复杂度的容忍度。
检查点/重启 vs. 冗余 vs. 弹性训练
这三种经典策略分别代表成本、复杂度与恢复速度之间权衡空间中的不同位置。
检查点/重启 Checkpoint/restart 会周期性地保存完整系统状态,并在故障后回滚到最后一个检查点。它是大规模训练的主力:概念简单、理解充分,且在 MTBF 远大于检查点成本时有效。其弱点在于恢复需要停止全部工作节点并重放丢失的计算。
冗余 Redundancy 会维护状态或计算的重复副本。若某个副本发生故障,另一个副本会立即接管。这是推理服务领域的主导策略,因为即使数秒的停机也不可接受。代价是 2–3\(\times\) 的计算资源,这对训练而言是难以承受的,但对以收入为核心的服务而言则是合理的。
弹性训练 Elastic training 允许在故障发生时以较少的工作节点继续训练,而不是完全停止。当替换节点可用时再补回工作节点。这最大限度地减少了墙钟时间的中断,但需要支持动态 world-size 变化的框架(例如 TorchElastic),并且会引入学习率调整和梯度归一化方面的复杂度。容错策略对比 Fault Tolerance Strategy Comparison 总结了这些权衡。
| 准则 Criterion | 检查点/重启 Checkpoint/Restart | 冗余 Redundancy | 弹性训练 Elastic Training |
|---|---|---|---|
| 恢复延迟 Recovery latency | 分钟(重放) | 毫秒(故障切换) | 秒(重新配置) |
| 资源开销 Resource overhead | ~3–13%(存储 + IO) | 100–200%(副本) | ~5–10%(备用容量) |
| 负载适配 Workload fit | 训练(批处理) | 服务(在线) | 训练(长运行) |
| 实现 Implementation | 简单 | 中等 | 复杂 |
| 状态管理 State management | 周期性快照 | 持续复制 | 分布式并重新分片 |
| 故障模式 Failure mode | 作业暂停并重放 | 对用户透明 | 吞吐率下降,继续运行 |
可用性叠加公式 The availability stacking formula
对于服务负载,可用性通常以百分比表示:99%(“两个九”)、99.9%(“三个九”)等。冗余通过运行 \(k\) 个独立副本来提高可用性。系统仅在所有副本同时不可用时才不可用,这由 公式 8 刻画:
\[ A_{\text{system}} = 1 - (1 - A)^k \tag{8}\]
其中 \(A\) 是单个副本的可用性,\(k\) 是副本数量。
评估独立副本的可用性叠加(独立副本的可用性叠加 Availability Stacking with Independent Replicas)量化了增加服务容量的收益。
| 副本 Replicas \(k\) | 系统可用性 System Availability | 九位小数 Nines | 每年停机 Downtime per Year |
|---|---|---|---|
| 1 | 99.00% | 2.0 | 87.6 hours |
| 2 | 99.9900% | 4.0 | 52.6 minutes |
| 3 | 99.9999% | 6.0 | 31.5 seconds |
叠加独立的冗余副本可实现显著的可用性提升:两个可用性为 99% 的副本可得到 99.99% 的可用性,将年停机时间从约 87 小时降至不足 1 小时。这就是推理服务系统几乎普遍在负载均衡器背后部署多个副本的原因——额外副本的成本相对于四九可用性所带来的业务价值而言很小。
然而,独立性假设至关重要。相关故障——影响整个机架的断电、由特定输入触发的软件缺陷,或隔离故障域的网路分区——都会使可用性叠加失效。这正是 容错 强调故障域隔离的原因:副本必须部署在不同的机架、不同的供电分区,理想情况下位于不同的数据中心,以确保它们的故障模式真正相互独立。
摘要 Summary
Key Takeaways: 故障作为物理约束
- 故障率随组件数量线性增长:单块 GPU 每 5.7 years 发生一次故障;拥有 10,000 块 GPU 的集群每 4.14 hours 发生一次故障。在大规模集群中,故障是一种持续存在的背景状态,而非异常事件。
- MTBF 的级联效应在系统各层级逐层累积:节点 MTBF 由各独立组件故障率之和决定;集群 MTBF 则由节点 MTBF 除以节点数量得到。按规模的集群 MTBF 提供了容量规划所需的参考数值。
- 作业失败概率迅速趋近于必然:对于拥有数千块以上 GPU 且运行持续数日作业的集群,至少发生一次故障的概率超过 99%。在这一规模下,容错并非可选项——它是完成任何一次训练运行的前提条件。
- Young-Daly 检查点间隔:公式 \(\tau_{\text{opt}} = \sqrt{2 T_{\text{write}} \, \text{MTBF}_{\text{system}}}\)(原理 12)通过权衡写入检查点的成本与丢失计算工作的成本,优化检查点频率。它只需要两个可测量的输入:检查点写入时间和系统 MTBF。
- 恢复包含四个阶段:检测、重新调度、重新加载和重放。重放通常占据主要耗时,其耗时由检查点间隔决定。每个阶段都有不同的优化机会。
- 策略选择取决于工作负载类型:检查点/重启适合批量训练。冗余适合对延迟敏感的服务。弹性训练衔接了两者,但也增加了复杂性。
- 可用性随独立副本呈指数提升:独立副本可使可用性呈指数提升,但相关故障会使这一收益丧失。故障域隔离是冗余发挥作用的前提条件。
二阶 Daly 检查点间隔的推导
Young 公式(\(\tau_{\text{opt}} = \sqrt{2 T_{\text{write}} \text{MTBF}}\))在检查点写入时间相对于系统 MTBF(\(\delta \ll M\))可忽略时提供了准确的基线;然而,前沿规模集群的写入时间不可忽略。Daly(2006)推导了更精确的二阶最优间隔,将检查点执行期间的故障概率纳入考虑。
数学表述与泰勒展开证明
设 \(M = \text{MTBF}_{\text{system}}\) 和 \(\delta = T_{\text{write}}\)。假设故障到达服从速率为 \(\lambda = 1/M\) 的泊松过程,则期望总时间 \(E[T_{\text{total}}]\) 对应于每个计算间隔 \(\tau\),其表达式为:
\[ E[T_{\text{total}}] = M \left( e^{\frac{\tau + \delta}{M}} - 1 \right) \tag{9}\]
对指数项 \(e^{x}\) 在 \(x = 0\) 附近进行二阶泰勒展开:
\[ e^{\frac{\tau + \delta}{M}} \approx 1 + \frac{\tau + \delta}{M} + \frac{(\tau + \delta)^2}{2 M^2} + \frac{(\tau + \delta)^3}{6 M^3} \]
将该展开式代入 公式 9,得到每个间隔的期望浪费时间 \(E[T]\),如 公式 10 所示:
\[ E[T] = E[T_{\text{total}}] - \tau \approx \delta + \frac{\tau^2}{2M} + \frac{\delta \tau}{M} \tag{10}\]
为最小化浪费时间比例 \(W(\tau) = \frac{E[T]}{\tau}\),令 \(\frac{d W}{d \tau} = 0\),得到二次方程:
\[ \tau^2 + 2 \delta \tau - 2 \delta M - \frac{\delta^2}{3} = 0 \]
应用二次方程求根公式并取正根,得到二阶 Daly 最优检查点间隔,如 公式 11 所示:
\[ \tau_{\text{opt}} = \sqrt{2 \delta M + \frac{\delta^2}{3}} - \delta \tag{11}\]
一阶 Young 与二阶 Daly 的比较
随着检查点写入时间与 MTBF 之比(\(\gamma = T_{\text{write}}/\text{MTBF} = \delta/M\))增大,一阶 Young(\(\sqrt{2 \delta M}\))对 公式 11 中计算出的最优计算间隔的高估程度不断增加,因为它忽略了较长的检查点执行窗口内发生多次故障的非零概率。当 \(\delta/M = 0.10\) 时,一阶 Young 将最优间隔高估了 27.44%,导致检查点保存延迟,并在故障发生后产生过多的重新计算工作。
静默数据损坏(SDC)注意力扰动模型
并非所有硬件故障都会表现为显式的系统崩溃、ECC 双比特错误或内核陷阱。静默数据损坏(SDC) 是指单比特错误或算术逻辑单元(ALU)故障未被奇偶校验检测到,导致 SRAM、高带宽内存(HBM)或寄存器文件中的张量值损坏,却未触发异常。在深度学习工作负载中,SDC 尤其危险,因为单个损坏的浮点值会通过非线性运算传播,使整个集群的训练失去稳定性 (Dixit 等 2021年)。
FP16 中的指数位翻转模型
考虑一个 IEEE 754 半精度浮点(FP16)张量元素,它表示查询向量 \(Q_{i,k}\)、激活值或权重矩阵元素。FP16 共分配 16 个比特:1 个符号位(\(s\))、5 个指数位(\(e\))和 10 个尾数位(\(m\))。
标量值 \(x\) 由位串 \((s, e, m)\) 表示,其表达式为:
\[ x = (-1)^s \times 2^{e - 15} \times \left(1 + \frac{m}{1024}\right) \]
假设宇宙射线、电压下降或 SRAM 故障导致指数的最高有效位(第 14 位)发生单比特翻转。指数值从 \(e\) 变为 \(e' = e \pm 16\):
\[ x_{\text{corrupt}} = (-1)^s \times 2^{(e \pm 16) - 15} \times \left(1 + \frac{m}{1024}\right) = x \times 2^{\pm 16} \]
单个指数位翻转会使浮点数的绝对值乘以 \(2^{\pm 16} = 65,536\times\)。
Softmax 概率饱和与梯度爆炸
设 \(S = \frac{Q K^T}{\sqrt{d_k}} \in \mathbb{R}^{B \times H \times N \times N}\) 为 softmax 运算前的注意力分数矩阵,序列长度为 \(N\),投影维度为 \(d_k\)。假设一次 SDC 事件使词元元素 \(i\) 在查询矩阵 \(Q\) 中受到 \(\Delta Q\) 的扰动,其中 \(\Delta Q_{i} \approx 2^{16} \cdot Q_i\):
\[ S_{\text{corrupt}} = \frac{(Q + \Delta Q) K^T}{\sqrt{d_k}} = S + \Delta S \]
其中,扰动矩阵 \(\Delta S\) 在行 \(i\) 上具有非零元素:\(\Delta S_{i, j} = \frac{\Delta Q_i K_j^T}{\sqrt{d_k}}\)。
注意力概率扰动 \(\Delta \text{Attention}\) 对应于词元行 \(i\),其表达式为:
\[ \Delta \text{Attention}_i = \text{Softmax}\left( S_{i, \cdot} + \Delta S_{i, \cdot} \right) - \text{Softmax}\left( S_{i, \cdot} \right) \]
由于 \(\Delta S_{i, j} \approx 65,536 \cdot S_{i, j}\),指数项 \(e^{S_{i, j} + \Delta S_{i, j}}\) 在该行分母中完全占据主导地位,压倒其余所有项:
\[ \text{Softmax}(S_{i, \cdot} + \Delta S_{i, \cdot})_j \to 1.0, \qquad \text{Softmax}(S_{i, \cdot} + \Delta S_{i, \cdot})_{k \neq j} \to 0.0 \]
这种概率饱和迫使注意力分布坍缩为集中在损坏的键位置上的 δ 函数。在反向传播过程中,损失相对于查询权重参数 \(\mathbf{W}_Q\) 的梯度会受到一个未经裁剪、与 \(\Delta Q \cdot 2^{16}\) 成比例的标量乘数的影响:
\[ \|\nabla_{\mathbf{W}_Q} L\| \to \infty \]
这会在随后的优化器更新步骤中导致所有并行进程的参数发生灾难性损坏,使模型此后的所有输出失效,并要求回滚到最近一个经验证未受损的检查点。