乐于分享
好东西不私藏

为什么 AI 集群必须设计故障域?

为什么 AI 集群必须设计故障域?

这里是「算力网络架构手记」北京

  • 专注 AI 集群网络架构与性能优化

  • 深入 GPU×RoCE×NCCL×K8s 跨层瓶颈

  • 只拆真实问题,不写概念科普


👇 试听内容

👉 AI 训练网络全路径拆解 → 私信:AI网络

👉 AI 推理网络全路径拆解 → 私信:推理

👉 AI 网络架构工程指南手册 → 私信:工程指南

👉 AI 算力网络架构系统(真机实验环境) → 私信:系统

👉 日常工作1对1答疑 → 私信:答疑


00

刚说完可降级,又来一个故障域?

设计 AI 集群时,首先考虑这些问题:

  1. GPU 数量够不够?

  2. 网络带宽够不够?

  3. 交换机是不是无阻塞?

  4. RoCE / IB 能不能跑满?

  5. NCCL AllReduce 性能怎么样?

肯定是没错!

我只是想提醒你:

故障域怎么设计也需要考虑

因为难免有人以为故障域就是传统数据中心里的概念:

  • 一台服务器坏了

  • 一个机柜掉电

  • 一台交换机故障

  • 一个区域不可用

但在 AI 集群里,故障域远比这个复杂。

因为 AI 任务不是普通 Web 服务。

训练里,一个 rank 慢,可能拖住整个 AllReduce。推理里,一个 Decode 副本慢,可能拉高整组服务 p99。RoCE 里,一个 priority 触发 PFC,可能影响同一队列里的所有流。多轨网络里,一条 rail 异常,可能让 NCCL 通信路径不均衡。

所以 AI 集群设计故障域,不只是为了回答:

哪台设备坏了?

更是为了回答:

这个故障会影响多少 GPU、多少任务、多少租户、多少 token、多少 step?

01

故障域不是“故障在哪里”,而是“故障会被放大到哪里”

传统系统里,一个故障的影响范围通常比较直观。

一台机器坏了,影响这台机器上的服务。一个 ToR 坏了,影响这个机柜里的服务器。一个存储节点坏了,影响部分数据访问。

但 AI 集群不一样。

AI 集群里,很多故障会被同步机制放大。

比如训练任务:

  • 128 张 GPU 一起训练
  • 每一步都要做 AllReduce
  • 其中一个 rank 网络慢
  • 其他 127 张 GPU 都要等

这时候,真正的故障点可能只是一张 NIC、一个端口、一个 GPU、一个 rank。

但影响范围是整个训练任务。

再比如推理任务:

  • 某个 D 副本网络拥塞
  • KV Cache 迁移变慢
  • Decode 开始等待
  • 一批请求 TTFT 变高
  • 用户看到 p99 抖动

故障点可能只是一个 D 组或一个 Leaf 出口队列。

但影响的是一批在线请求。

所以 AI 集群里的故障域,本质是:

故障影响被同步通信、队列拥塞、调度路径、KV 状态和尾延迟机制放大后的边界。

AI 集群必须设计故障域,是因为局部故障很容易被放大全局影响。

02

为什么普通故障域思维不够?

普通业务系统里,一个请求通常只依赖少数服务实例。

服务 A 慢了,不一定拖住所有服务。某个副本异常,负载均衡可以绕开。某台机器故障,系统可以通过副本继续服务。

但 AI 训练不同。

一个分布式训练任务,通常是强耦合的。

比如:

  • 64 卡训练
  • 128 卡训练
  • 1024 卡训练

这些 GPU 不是各跑各的。

它们会在每个 step 里频繁同步:

  • 梯度同步
  • 参数同步
  • ReduceScatter
  • AllGather
  • AllReduce
  • MoE All-to-All

这意味着:

一个局部慢点,会被同步点放大。

在 AllReduce 里,最快的 GPU 没法自己往下走。它必须等最慢的 rank。

所以 AI 训练的故障域不能只按设备画。

还要按通信组画。

比如:

  • 一个 DP group 影响多少 GPU?
  • 一个 TP group 影响多少 GPU?
  • 一个 PP stage 影响多少 GPU?
  • 一个 NCCL communicator 覆盖多少节点?
  • 一个 rail 故障会影响哪些 rank?

AI 训练的故障域,不只看物理位置。

还要看这些 GPU 在通信逻辑上是否绑在一起。

03

第一类故障域:GPU 故障域

AI 集群里最基础的故障域是 GPU。

GPU 可能出现:

  • Xid 错误
  • ECC 异常
  • 掉卡
  • 显存错误
  • 温度过高
  • 功耗异常
  • 频率异常
  • NVLink 异常

问题是:

一张 GPU 异常,到底影响多大?

这取决于任务形态。

单卡推理

一张 GPU 异常,可能只影响这个推理副本。调度器可以摘除这个副本,其他副本继续服务。

单机 8 卡推理

如果一个模型需要 8 卡 TP 才能跑,一张 GPU 异常,可能导致整个 8 卡副本不可用。

多机训练

如果这张 GPU 是某个 NCCL communicator 的一员,它异常可能导致整个训练 job 失败。

所以 GPU 故障域不能只按“卡”理解。

要问:

  • 这张 GPU 属于哪个任务?
  • 是否属于某个 TP group?
  • 是否属于某个 DP group?
  • 是否属于某个推理副本?
  • 是否能只摘除这张卡?
  • 还是必须摘除整台服务器?
  • 任务是否支持弹性恢复?
  • 是否有 checkpoint?

GPU 故障不是硬件清单问题。

它决定的是调度系统能否把坏卡影响限制在最小任务单元内。

04

第二类故障域:NIC / Rail 故障域

AI 服务器常见设计是:

  • 8 GPU
  • 8 NIC
  • 8 rail

很多人以为多轨只是为了叠加带宽。

这只说对了一半。

多轨还有一个很重要的价值:

限制故障影响范围。

如果所有 GPU 的通信都压在一张 NIC 上,这张 NIC 一抖,全节点通信都抖。

如果每个 GPU 对应一条 rail,当某条 rail 异常时,理论上可以把影响限制在:

  • 对应 GPU
  • 对应 HCA
  • 对应 rail
  • 对应 Leaf 路径
  • 对应 NCCL channel

当然,前提是你真的设计了 rail 边界。

否则多轨只是多张网卡,运行时仍然可能乱用。

NIC / rail 故障会表现为:

  • 某条 rail 带宽低
  • 某个 HCA error 增长
  • 某个端口 PFC pause 异常
  • NCCL 某些 channel 慢
  • 多轨流量不均
  • 某些 rank 等待

所以 rail 故障域要问:

  • 每条 rail 对应哪些 GPU?
  • 每条 rail 接哪个 Leaf?
  • 每条 rail 是否独立故障?
  • 一条 rail 故障后能否摘除?
  • NCCL 是否能避开故障 HCA?
  • 调度器是否感知 rail health?
  • 多租户是否共享同一 rail?

多轨网络的成熟度,不只看满血时带宽多高。

还要看一条 rail 异常时,影响是否可控。

05

第三类故障域:Leaf 故障域

Leaf 是 AI 网络里的关键故障边界。

一台 Leaf 可能连接:

  • 一组服务器
  • 一个 rack
  • 一条 rail
  • 多个租户
  • 多个训练任务
  • 一批推理副本

如果 Leaf 故障域设计不好,一台 Leaf 出问题,可能影响非常大。

常见问题包括:

  • 一台 Leaf down,整排服务器掉一条 rail
  • 某个 Leaf buffer 异常,多个训练任务慢
  • 某个 Leaf 上 PFC pause 异常,影响同 priority 流量
  • 某个 Leaf 上行拥塞,推理 D 组 p99 变差

Leaf 故障域设计要问:

  • 每台 Leaf 下挂多少服务器?
  • 每台 Leaf 对应哪些 rail?
  • 每台服务器的多张 NIC 是否分散到多个 Leaf?
  • 一个 Leaf 故障后,每台服务器损失多少带宽?
  • 是否会导致某些节点完全失联?
  • 是否会导致某个租户整片不可用?
  • 是否有 ECMP / 上行冗余?
  • Leaf 故障后 NCCL 是否还能降级运行?

理想情况下,Leaf 故障不应该导致所有路径同时消失。

至少应该让系统有机会:

  • 降速运行
  • 摘除部分 rail
  • 迁移推理副本
  • 训练任务从 checkpoint 恢复
  • 限制影响范围

Leaf 不是普通接入交换机。

在 AI 集群里,它经常是 GPU 通信故障域的第一层放大器。

06

第四类故障域:Spine 故障域

Spine 故障和 Leaf 故障不同。

Leaf 故障通常影响某个接入范围。

Spine 故障更容易表现为:

全局容量下降。

比如一个 Clos 网络里,有多台 Spine 提供上行等价路径。

一台 Spine 故障后,网络不一定断。

但问题是:

  • 总上行容量下降
  • ECMP 路径减少
  • 剩余 Spine 压力增加
  • 某些通信阶段更容易 Incast
  • 队列更容易升高
  • ECN / PFC 更容易触发
  • step time / p99 开始变差

这类故障很容易被误判。

因为链路还通。任务还能跑。但性能开始下降。

所以 Spine 故障域要看:

  • 一台 Spine 故障后,收敛比变成多少?
  • 训练 AllReduce 性能下降多少?
  • 推理 p99 是否受影响?
  • 是否触发更多 ECN marked?
  • 是否增加 PFC pause 风险?
  • ECMP 是否重新均衡?
  • 是否有可观测基线对比?

Spine 故障最危险的地方,不一定是断。

而是网络还通,但从无阻塞变成有拥塞,业务开始慢。

07

第五类故障域:PFC / QoS 故障域

RoCE 网络里,PFC 故障域必须单独设计。

因为 PFC 的影响不是按 IP、Pod、租户来划分的。

它是按 priority 生效。

这意味着:

只要多个业务流量共享同一个 PFC priority,它们就可能被一起 pause。

比如:

  • 租户 A 训练流量进入 priority 3
  • 租户 B 推理流量也进入 priority 3
  • 存储流量被错误映射进 priority 3
  • 某个出口队列拥塞触发 PFC
  • 同 priority 的流量都被影响

这就是 PFC 故障域。

它的边界不是设备。

而是:

同一个 lossless priority 上承载了哪些业务。

如果 PFC 故障域设计不好,就会出现:

  • 一个租户的 Incast,pause 其他租户
  • 一个存储大流,误伤 RoCE 训练
  • 一个错误映射,让普通流量污染 RDMA 队列
  • pause storm 扩散到多个端口

所以 RoCE 故障域设计要问:

  • 哪些流量进入 lossless priority?
  • 训练和推理是否共用 priority?
  • 热路径和冷路径是否共用 queue?
  • CNP 是否独立处理?
  • PFC 是否只作为兜底?
  • ECN 是否先于 PFC 触发?
  • 是否能按 priority 监控 pause?
  • 是否能按租户或任务关联 pause 影响?

PFC 故障域不是按网络拓扑画的。

它是按 priority、queue 和 buffer 共享关系画的。

08

第六类故障域:NCCL 通信组故障域

NCCL 的故障域经常被忽略。

很多人只看物理设备:

这台服务器属于哪个 rack。这张网卡接哪个 Leaf。

但 NCCL 看的是通信组。

比如:

  • 8 卡单机通信组
  • 16 卡跨 2 机通信组
  • 128 卡训练 group
  • 1024 卡大规模 communicator
  • TP group
  • DP group
  • PP stage group

一个故障影响多大,和它落在哪个通信组里高度相关。

比如:

  • 某张 NIC 慢,如果它只影响一个小通信组,影响可控
  • 如果它位于一个 512 卡 AllReduce group,影响会被放大
  • 某个 rank 出现抖动,会拖慢所有等待它的 rank

所以 AI 集群设计故障域时,要把 NCCL 拓扑纳入设计。

要问:

  • 一个 NCCL job 跨多少 Leaf?
  • 跨多少 Spine?
  • 跨多少 rack?
  • 一个 TP group 是否跨故障域?
  • 一个 DP group 是否跨多个电源域?
  • 任务调度是否尽量让通信组落在可控范围内?
  • 是否有拓扑感知调度?
  • 是否能定位 slow rank 到物理设备?

NCCL 故障域是逻辑故障域。

它不一定和物理 rack、Leaf、VLAN 完全一致,但它决定慢点会影响多少 GPU。

09

第七类故障域:推理服务故障域

推理系统的故障域和训练不一样。

训练看 step。推理看请求和 token。

推理故障域常见边界包括:

  • 一个模型副本
  • 一个 Decode 组
  • 一个 Prefill 池
  • 一个 KV Cache 分片
  • 一个调度分区
  • 一个租户服务
  • 一个 D 节点所在 Leaf
  • 一个长上下文缓存池

比如 P/D 分离架构里:

Prefill 在 P 池执行。Decode 在 D 池执行。P 生成 KV Cache 后发给 D。

如果某个 D 组过载或其接入网络拥塞,就会出现:

  • KV 到位变慢
  • Decode 排队
  • TTFT 上升
  • p99 拉高
  • 一批请求变慢

这个故障域不是单台服务器那么简单。

它可能包括:

  • 该 D 组上的所有请求
  • 调度到该 D 组的租户
  • 迁移到该 D 组的 KV 流量
  • 对应 Leaf / rail / queue

所以推理故障域设计要问:

  • D 组是否有独立故障边界?
  • 调度器是否感知 D 组健康?
  • KV 迁移是否会集中到少数 D 组?
  • D 组过载时是否限流?
  • 是否支持请求迁移或副本摘除?
  • 是否有 p99 分组监控?
  • 是否能按副本、租户、D 组看 TTFT?

推理故障域不是“哪台机器坏了”。

而是“哪些请求被同一个慢副本、慢 KV 路径、慢 Decode 组拖住了”。

10

第八类故障域:存储故障域

AI 集群里,存储不是外围系统。

训练要读数据。训练要写 checkpoint。

推理要加载模型。推理可能要读远端 KV 或会话状态。

如果存储故障域设计不好,会出现:

  • 数据加载慢,GPU 等数据
  • checkpoint 慢,训练周期性卡住
  • 模型加载慢,推理扩容失败
  • 远端 KV 缓存慢,TTFT 变差
  • 存储流量挤压训练网络

存储故障域设计要回答:

  • 哪些任务依赖同一存储集群?
  • checkpoint 是否共享同一出口?
  • 数据集读取是否会影响训练通信?
  • 模型加载是否会影响在线推理?
  • 存储网络是否和训练网络隔离?
  • 存储异常时是否能降级?
  • 是否支持本地缓存?
  • checkpoint 失败是否会导致任务失败?
  • 存储慢是否有监控与限流?

存储故障域不是只影响文件读写。

它可能通过数据等待、checkpoint 阻塞和网络拥塞,间接拖慢 GPU。

11

故障域设计的核心原则

故障域设计不是简单多买设备。

它的核心是:

让同一种故障,不要同时影响太多关键资源。

比如:

  • 不要让同一训练任务的所有 rail 都落在同一 Leaf
  • 不要让同一租户的所有推理副本都落在同一 rack
  • 不要让训练热流、存储大流、管理控制流都进同一队列
  • 不要让所有 checkpoint 都打向同一存储出口
  • 不要让所有 D 副本都依赖同一 KV 缓存节点
  • 不要让所有高优先级任务共用一个 PFC priority 且无边界

故障域设计要做的是风险分散。

但也不能无限分散。

因为分散过度会带来:

  • 跨域通信增加
  • 延迟增加
  • 运维复杂
  • 成本上升
  • 调度困难

所以故障域设计本质是平衡:

  • 性能
  • 成本
  • 可用性
  • 故障影响范围
  • 调度复杂度

故障域不是越碎越好。

而是要让故障影响范围可预测、可隔离、可恢复。

12

如何落地故障域设计?

AI 集群设计故障域,不能只靠口头描述。

建议至少画 8 张图。

1)物理 rack / 机柜故障域图

标出服务器、交换机、电源、机柜边界。

2)Leaf 故障域图

标出每台 Leaf 下挂哪些服务器、哪些 rail、哪些租户。

3)Spine 容量故障域图

标出一台 Spine 故障后容量下降比例。

4)GPU-NIC-Rail 映射图

标出每张 GPU 对应哪张 NIC、哪条 rail、哪个 Leaf。

5)NCCL 通信组覆盖图

标出一个训练任务的 TP / PP / DP group 覆盖哪些节点和网络路径。

6)RoCE QoS 故障域图

标出 priority、TC、PG、PFC、ECN、租户和业务流量映射关系。

7)推理 P/D 故障域图

标出 P 池、D 池、KV Cache、调度域、D 组边界。

8)存储与 checkpoint 故障域图

标出训练数据、checkpoint、模型加载、KV 缓存路径。

这些图的价值在于:

以后任何故障出现,你可以快速判断:

  • 属于哪个故障域
  • 影响哪些任务
  • 是否会跨租户扩散
  • 是否需要摘节点
  • 是否需要限流
  • 是否需要降级
  • 是否需要回滚

没有故障域图,故障发生时只能靠经验猜影响范围。

有了故障域图,故障处理才有边界。

13

故障域设计必须进入验收,而不是只停留在方案里

故障域不能只写在方案里。

必须进入验收。

验收时要做几个动作:

1)单节点故障演练

验证节点摘除、任务迁移、推理副本摘除。

2)单 GPU 故障演练

验证 GPU 健康检查、资源下线、任务重调度。

3)单 NIC / rail 故障演练

验证多轨降级、NCCL HCA 排除、流量是否重新均衡。

4)Leaf 上联故障演练

验证容量下降后,AllReduce 和推理 p99 是否仍可接受。

5)PFC / 队列异常演练

验证 pause 是否局限在预期 priority,是否影响其他租户。

6)推理 D 组过载演练

验证调度器能否限流、摘除、迁移。

7)存储慢速演练

验证训练是否能继续、checkpoint 是否可降级、推理是否受影响。

验收报告里应记录:

  • 故障注入方式
  • 影响范围
  • 告警是否触发
  • 恢复动作
  • 恢复时间
  • 业务指标变化
  • 是否符合预期故障域边界

故障域设计如果不演练,就只是拓扑图上的假设。

真正的故障域,必须在故障注入中被验证。

14

敲黑板

AI 集群设计故障域,不是为了避免故障。而是为了让故障发生时,影响范围可预测、可隔离、可恢复。
  • GPU 故障域,决定坏一张卡影响一个 Pod、一个副本,还是整个任务
  • NIC / rail 故障域,决定坏一条路径是降速还是全挂
  • Leaf 故障域,决定一台交换机影响多少服务器和 GPU
  • Spine 故障域,决定容量下降后是否触发全局拥塞
  • PFC / QoS 故障域,决定 pause 是否误伤其他业务
  • NCCL 通信组故障域,决定一个慢 rank 影响多少 GPU
  • 推理故障域,决定一个慢 D 组影响多少请求
  • 存储故障域,决定存储慢是否拖死 GPU

故障域设计的本质,是提前回答:

这类故障最多影响到哪里?怎么发现?怎么隔离?怎么降级?怎么恢复?

如果这些问题没想清楚,AI 集群一旦出问题,就很容易从局部故障变成全局事故。

传统网络故障域,关注设备影响范围。

AI 集群故障域,还要关注通信组、队列、租户、任务和 token 的影响范围。

真正成熟的 AI 集群,不是不出故障,而是故障不会无限扩散。


👉 AI 训练网络全路径拆解 → 私信:AI网络

👉 AI 推理网络全路径拆解 → 私信:推理

👉 AI 网络架构工程指南手册 → 私信:工程指南

👉 AI 算力网络架构系统(真机实验环境) → 私信:系统

👉 日常工作1对1答疑 → 私信:答疑


如果你也在做 AI 集群架构  

欢迎关注「算力网络架构手记」  

长期拆解真实算力网络问题