ResiHP:大模型训练故障下的动态混合并行

Reference reading: 大模型训练遇到 GPU 故障怎么办?我们的做法是动态调整 3D 并行.

大规模 LLM 训练不是一个单独的分布式系统问题,而是好几个问题叠在一起。

当训练规模达到数百甚至数千张 GPU 时,故障不再是罕见事件。有些设备会直接消失;另一些设备还活着,但变慢了。后者尤其麻烦:fail-slow GPU 不会让训练任务崩溃,却会拖慢整个同步训练迭代。在 hybrid parallel training 中,这个延迟会沿着 tensor parallelism、pipeline parallelism 和 data parallelism 传播,最后让一张变慢的设备悄悄决定整个任务的速度。

ResiHP 就是为这个场景设计的。它的核心思想是让 hybrid parallelism 变成动态结构。ResiHP 不把 3D parallel layout 当作启动后固定不变的配置,而是在检测到异常设备后,围绕剩余资源重新组织训练计划。

为什么故障检测很难

最直观的信号是 iteration time。如果某一次 iteration 变慢了,也许就有设备故障。

这个逻辑对 LLM 训练来说太脆弱。

现代 LLM workload 经常使用 variable-length sequences。即使用 sequence packing 控制 token budget,真实 attention cost 仍然取决于每个 micro-batch 内部的 sequence length。一个包含许多长序列的 packed batch,自然会比短序列更多的 packed batch 更慢。Pipeline scheduling 又增加了一层噪声:观测到的 iteration time 不只是某个 micro-batch cost,而是多个 pipeline stage 上 forward、backward 和 weight-update chunk 共同形成的 critical path。

这也是知乎文章强调的点:detector 不能盯着 raw iteration time,把每个 spike 都判成故障。它首先要估计,如果所有设备都健康,这个 iteration 本来应该花多少时间。

用 FLOPs 归一化检测信号

ResiHP 的 Detector 会用期望计算量对 iteration time 做归一化。

在 micro-batch 层面,它根据 packed sequence structure 估计工作量。Attention cost 并不是 sequence length 的线性函数,所以模型不仅数 token,还会考虑 quadratic attention cost。在 pipeline 层面,ResiHP 模拟 forward、backward 和 weight-update chunk 的 schedule,预测健康 iteration 的 critical path。

只有在完成这种归一化之后,ResiHP 才比较 observed time 和 expected time。如果二者之间的 gap 仍然异常,系统才把它当作 fail-slow signal,而不是普通的 sequence-length variation。Fail-stop 则通过 missing heartbeat 另行处理。

这个区分很重要,因为 false positive 代价很高。如果一个 resilient training system 经常把正常工作负载偏斜误判成硬件故障,它就会毫无必要地反复重组训练任务。ResiHP 试图让检测足够轻量,能够在线使用;同时也足够准确,让 adaptation 只在真正出问题时发生。

为什么混合并行让恢复更棘手

一旦某个设备被识别为不健康,最简单的反应是把它移除。

但这通常不够。

在纯 data parallelism 中,少一个 worker 主要意味着 replica 数量下降。在 hybrid parallelism 中,一个设备参与的是结构。它可能同时是 tensor-parallel group 里的一个 rank、pipeline 的一个 stage,以及 data-parallel replica 的成员。如果一个 tensor-parallel rank 故障,整个 TP group 都受影响。如果一个 pipeline stage 变慢,上游和下游 stage 都会等待。如果一个 data-parallel replica 落后,同步也会被拖慢。

故障是局部的,但性能损伤是全局的。

因此 ResiHP 不采用单一 workaround,而是在多个层面适配。它会改变 parallelism group size,重新划分 pipeline stage 上的 model layer,调整工作调度,并在 replica 之间重新分配任务。

动态重组 3D 并行

ResiHP 的 Scheduler 负责把检测结果转化为新的训练计划。

对于 tensor parallelism,ResiHP 可以围绕健康设备收缩或重组 TP group。目标不是简单丢弃受影响 group 里的所有设备,因为那可能浪费太多健康 GPU。调度器会搜索更合适的 group size 和 membership,在避开慢 rank 或故障 rank 的同时保留尽可能多的有效计算。

对于 pipeline parallelism,ResiHP 可以重新平衡 model partitioning。慢 stage 不应该继续承担和健康 stage 一样多的 layer。如果某个 stage 变慢,调度器可以给它分配更少 layer,并把工作转移给更健康的 stage,从而降低 pipeline bottleneck。

对于 data parallelism,ResiHP 使用 workload migration。如果某个 replica 落后,而另一个 replica 还有余量,调度器可以迁移一部分工作,让整体进度更平衡。这一点尤其有用,因为 data-parallel replica 在逻辑上对称,但在设备故障或性能退化之后,实际速度可能分化。

关键工程点在于,这些 adaptation 是协调发生的。只调 TP 可能制造 pipeline imbalance;只调 PP 可能让健康 GPU 利用不足;只调 DP 可能没有消除原始瓶颈。ResiHP 把 layout 当作一个相互连接的 3D object 来处理。

Executor 如何兜住重配置

新的 plan 只有在 runtime 能执行时才有意义,而且 recovery 本身不能变成第二次故障。

ResiHP 的 Executor 负责动态重配置的具体机制。它在新的 parallel layout 下重建 model 和 optimizer state,更新通信策略,并支持针对新 group 的高效 data movement。也正是在这里,系统从调度策略进入真正的 fault-tolerant training。

Executor 对 fail-stop recovery 也很重要。如果 GPU 消失了,系统必须在重新分布受影响 model shard 和工作负载的同时保持训练连续性。如果 GPU 只是变慢了,系统又必须避免过度反应,同时降低它对全局 critical path 的影响。

ResiHP 带来了什么

ResiHP 在 256-GPU 集群上、多个故障场景中进行了评估。论文报告称,它达到接近最优的故障检测准确率,并相比已有 resilient training system 将训练吞吐提升 1.13x 到 2.22x。

更大的经验是:LLM 训练的 resilience 不能只是一个 checkpoint-and-restart loop。Hybrid parallelism 本来就是大规模训练能够成立的结构,因此 resilience 也必须理解这个结构。ResiHP 把问题拆成三个层次:

  • 这次 slowdown 是真实故障,还是 sequence-length variation?
  • 3D parallel layout 中真正受损的是哪一部分?
  • TP、PP 和 DP 应该如何一起改变,才能让训练任务持续前进?

我喜欢 ResiHP 的地方就在这里:它把故障处理看成一个 dynamic parallelism 问题,而不只是 device replacement 问题。

Paper: ResiHP: Taming LLM Training Failures with Dynamic Hybrid Parallelism
Preprint: arXiv:2605.06374

Zhisheng YE
Zhisheng YE
机器学习系统研究员

研究兴趣包括面向大模型的 AI Infra、机器学习系统的算法-系统协同设计,以及资源管理。

相关