面向 RL 后训练的角色级容错系统(OSDI 2026)

原题:RobustRL: Role-based Fault Tolerance System for RL Post-Training

一句话总结:RL 后训练中的 trainer、rollout 和工具交互具有不同的正常空闲行为,而且长 rollout 一旦因整任务重启而重做会非常昂贵;RobustRL 按角色检测故障,只重启失败角色,用每步 checkpoint 保持权重一致,再以 UCX 动态重连,在论文的 256-GPU 高频 trainer 故障压力测试中把 ETTR 从 ByteRobust 的约 60% 提高到 80% 以上,但检测准确率、真实故障 trace 和控制面故障没有被验证。

问题与动机

大模型的强化学习后训练(RL post-training)不是一段纯训练。rollout 先生成回答并调用外部工具,trainer 再根据 reward 更新策略;同步、异步和半同步系统还会用不同方式交错这两个阶段。rollout 可能在等待 sandbox 或搜索服务时长期没有 GPU 活动,这在它的角色中是正常行为,却很像训练进程 hang。

现有 pre-training 容错系统通常把所有 rank 看成执行相同步骤的整体。一个 trainer 或 rollout machine 出错,系统便重启整个 RL job。这样不只丢掉最近的模型进度,还会丢掉已经生成的 trajectory 和 agent environment 状态。图 3 的 Search-R1/HotPotQA trace 显示 rollout 是一步中的主要时间,SWE 任务的一条长尾 rollout 还能达到 1,050 s(图 16),重做它的代价远大于只恢复一台机器。

RobustRL 的核心观点是:故障域应该与 RL 角色对齐。系统把 trainer、rollout 和管理角色视为不同 distributed subtask,以 Detect–Restart–Reconnect 三步恢复 GPU machine error;能保留的角色继续工作,失败角色恢复后再接回当前 job。

关键观察 / 隐含假设

  • 观察 1:不同角色的“健康”表现不同。 trainer 在训练阶段应持续使用 TensorCore;rollout 等待 request 或 tool 时可以合法地零 GPU 利用率。统一的 rank-level idle detector 会误报,等整个 cluster 都 idle 又会延迟发现 trainer 故障(图 2、§4)。
    • 依赖假设:runtime 能准确标出当前角色和 phase,固定的 5 分钟与 60 s 阈值适合实际 workload。
    • 可能失效:advantage computation 超过 5 分钟、rollout 请求本来就稀疏、tool service 卡住但 GPU machine 健康,或机器发生 silent data corruption。
  • 观察 2:保留 rollout 比保留一个普通训练 step 更重要。 多轮工具调用和长输出造成很长的 rollout tail;role-local recovery 可以让 async rollout 在 trainer 恢复时继续生成,也能在 sync 模式保留本轮已完成 trajectory(图 3、6、16)。
    • 依赖假设:RequestManager 和外部 AgentWorker/sandbox 没有和故障 rollout 一起丢失,并且 trajectory prefix 可以安全地转交给另一个 rollout。
  • 观察 3:RL step 很长,因此每步 checkpoint 可以接受。 论文测得 GPU-to-memory blocking 约 3 s,而一个 RL step 通常持续数分钟到数小时;每步保存能避免恢复 trainer 与仍在运行的 rollout 使用不同权重(§2.3、图 20–22)。
    • 依赖假设:host memory 容得下 shard,异步写 HDFS 能在下一次 checkpoint 前完成,训练 step 也确实足够长。
  • 观察 4:async/semi-sync 的 rollout machine 可以临时补 trainer gang。 这避免另外准备完全空闲的 warm standby(图 8)。
    • 依赖假设:trainer 与可借 rollout 在同一 datacenter,硬件和软件环境同质,并有与受损 parallel group 兼容的 rollout 数量。
  • 假设 1:一次异常能被可靠地区分为 machine fault 或可复现的软件错误。 首步异常、同一步再次异常、恢复再次失败时,RobustRL 放弃局部恢复并重启整个 job(§5.1.2)。
    • 证据强度:弱到中。规则能阻止无限重启,但论文没有 root-cause accuracy 实验。

核心方法

1. 角色与状态分离。 控制面由 phase-aware analyzer 和 runtime controller 组成;数据面分别管理 trainer 与 rollout。TaskRunner、RolloutManager、RequestManager 和 AgentWorker 放在 CPU machine,并通过 affinity 避开 trainer/rollout node(图 4)。GPU 角色可以局部恢复,但这些管理角色一旦失败,当前实现仍会重启整个 RL task。

2. 按 phase 检测。 trainer detector 只在 training phase 开启,连续 5 分钟没有 TensorCore activity 就触发恢复;context switch、weight update 等短空闲阶段不检测。rollout 先看每个 replica 的 token throughput,连续 60 s 为零才发送 heartbeat;heartbeat 也超时才判 machine failure(图 5、§4)。这个两段检查避免把等待工具和高负载下延迟处理 heartbeat 直接当成故障,但论文没有报告 false positive、false negative 或检测时间分布。

3. 只重启 trainer,并从每步 checkpoint 接着走。 trainer 任一 machine 失败时,系统终止并重建全部 trainer worker,加载最近一次每步 checkpoint,更新 rollout 拉权重的地址,再从 RequestManager 取回当前 batch 的 trajectory。ByteCheckpoint 只让 GPU-to-memory copy 阻塞,memory-to-HDFS 在后台执行。若异常看起来可复现或局部恢复连续失败,系统退回 whole-task restart(图 7、§5.1)。

4. 用 rollout 预热 trainer,独立恢复 rollout。 async 和 semi-sync 下,系统可杀掉一台同质 rollout,把已初始化的 machine 立即加入 trainer gang,再后台补一台 rollout;代价是暂时减少生成并发。sync mode 没有独立 rollout,不能使用该技巧。rollout failure 时,每个 tool turn 已保存的 prefix 会重新分配给其他存活 replica;AgentWorker 和 sandbox 留在外部,因此不必从头执行整个对话(图 8、§5.2.2)。

5. 用 UCX 动态重连。 NCCL collective 的成员固定,恢复到新 machine 的 rollout 不易加入。RobustRL 先把 trainer 权重 reshard 成 rollout 所需布局,再让多个 DP rank 通过 RDMA 直接向对应 rollout GPU 传 shard;PyTorch tensor 经 DLPack 零拷贝映射成 CuPy array。完成更新的 rollout 成为 relay,其他旧版本或刚恢复的 rollout 可从任一 relay 继续拉取。拉取中 relay 失败时保留已完成进度并换源;trainer 中途失败则丢弃部分更新,等 trainer 恢复后重新拉(图 9、§5.2)。

6. 实现边界。 系统基于 verl 0.5.x 及其 async 扩展,新增约 8K 行 Python;ElasticRayWorkerGroup 统一封装 worker 创建、销毁、存活检测和扩缩容策略(图 10)。当前贡献主要位于 framework 层,并不替代底层的 GPU/网络诊断工具。

设计取舍

  • 局部恢复换跨组件一致性。 RequestManager 的 trajectory、trainer checkpoint、rollout relay 的权重版本必须协调;整任务重启简单得多,但会丢更多工作。
  • 每步 checkpoint 换 host memory、HDFS 带宽和写放大。 对分钟级 step 占比较小,对短 rollout 或高频 optimizer step 不一定如此。
  • 借 rollout 换恢复时间。 不占用额外空闲机器,却暂时降低 rollout capacity;异构部署仍要保留至少一组同质、同 DC 的 rollout。
  • UCX 动态连接换协议复杂度。 它支持新成员和 retry,但系统要自己维护 shard mapping、relay set、版本与部分传输清理。
  • 保守 fallback 换可用性。 无法明确归因的异常仍重启 whole task,RobustRL 并没有消除所有 job-level failure。
  • 适用边界。 故障越频繁、trajectory 越长、trainer/rollout 越解耦,收益越大;低故障率、小模型、短 step 或纯 sync 部署中收益明显缩小。

实验设置

  • testbed 有 32 台 machine、共 256 张 H20 96 GB GPU;每机 8 GPU、900 GB/s NVLink、4×200 Gbps NIC、2 TB memory。软件为 CUDA 12.4、PyTorch 2.4.1、NCCL 2.21.5、verl 0.5.x、FSDP2、vLLM、ByteCheckpoint/HDFS(§7.1)。
  • 任务包括 Qwen3-8B/32B 的 DAPO-Math-17K,以及 Qwen3-32B 的 SWE-bench 工具学习;GRPO、global batch 512、每 batch 64 prompts、每 prompt 8 responses,默认训练 100 steps。
  • 主端到端图 11 明确写的是 128 GPU;摘要另报告一个 256-GPU Qwen3-8B-Math 结果。二者不能当成同一实验规模。
  • RobustRL 与 ByteRobust 都在每 10 个训练 step 的随机时刻注入一次 trainer fault,远高于论文给出的 256-GPU production 投影约 117 小时一次。论文没有具体说明注入的是哪一种 GPU、网络或进程故障。
  • ByteRobust baseline 只保留 in-place restart,去掉 machine rescheduling;这让比较更保守,但也不是完整生产恢复路径。

实验与结果

  • 端到端训练:在 128-GPU、每 10 step 一次 trainer fault 的压力测试中,相对 ByteRobust,RobustRL 在 8B-Math、32B-Math、32B-SWE 分别节省 0.8–2.1 h、1.4–1.6 h、3.5–4.5 h;局部恢复开销少于总时间 5%,ByteRobust 约为 20%(图 11、§7.2)。摘要另报 256-GPU Qwen3-8B-Math 上 ETTR 大于 80%,ByteRobust 约 60%,训练时间快 8.4%–17.4%。
  • 故障频率:在 64-GPU、semi-sync、50-step Qwen3-8B-Math 中,把注入故障从 1 次增到 5 次,也就是 2%–10% steps,RobustRL 相对 ByteRobust 的完成时间改善从 2.2% 增至 12.2%,ETTR 改善从 2.7% 增至 15.7%;无故障时两者接近(图 14)。
  • 恢复路径:8B trainer 局部恢复为 173.0 s,ByteRobust whole-task restart 为 277.8 s;32B 分别为 182.6 s 和 305.5 s,整体改善 1.5–1.7 倍(图 15)。32B rollout 从调度到恢复服务约 119 s,但其他 replica 维持 token throughput(图 17)。
  • 动态同步:235B FP16 权重约 470 GB,在 4×200 Gbps NIC 上理论传输为 4.7 s,UCX 实测约 6 s;8B/32B 上,rollout 数量超过 trainer 后,relay 方案的扩展曲线优于必须从 trainer 拉取的 NCCL 方案(图 18–19)。
  • checkpoint:ByteCheckpoint 每步 GPU-to-memory blocking 约 3 s,论文按分钟级 step 估算为约 1%;memory-to-HDFS 约 10 s 且异步。故障每 10 step 发生时,3-step 和 5-step checkpoint 会分别回退 1 和 5 个 offline step,reward 曲线比每步 checkpoint 更慢上升(图 20–22)。
  • 训练一致性:Qwen3-8B-Math 的 sync 和 semi-sync 运行 100 steps 后,Baseline、ByteRobust、RobustRL 的 normalized reward 走势大体接近,但没有完全对齐;作者明确归因于 FlashAttention、CUDA atomic 和 streaming schedule 的非确定性(图 13)。这只是趋势检查,不是统计等价或最终 benchmark accuracy 证明。

论断—证据表

论断证据评测边界置信度
role-local recovery 比 whole-task restart 少丢 RL 工作图 11:节省 0.8–4.5 h,恢复开销少于 5% 对约 20%128 GPU、三种 Qwen3 workload、高频 trainer fault injection
收益随故障频率上升图 14:2%–10% 注入下完成时间改善 2.2%–12.2%64 GPU、8B-Math、semi-sync、50 steps
rollout warmup 与局部 trainer restart 缩短恢复图 15:173.0/182.6 s 对 277.8/305.5 s8B/32B;同质 rollout;ByteRobust 无 machine reschedule
UCX 动态重连的传输代价接近链路下界图 18:235B 为约 6 s,对理论 4.7 s4×200 Gbps NIC、FP16、等量 trainer/rollout GPU中到强
role-aware detector 能减少误报与延迟§4 的 5 min/60 s 规则和图 2 的例子没有 detection precision、recall 或真实 fault replay

批判性分析

论证链条

“角色行为不同→按角色检测”“rollout 昂贵→不要整任务重启”“恢复节点变化→使用动态 point-to-point”三条设计链都合理。端到端和分解实验也证明,在作者构造的高频 trainer fault 下,保留 rollout 能节省大量时间。最大的论证跳步在 Detect:论文把减少 false positive/delay 写成核心贡献,却没有 detector 的 confusion matrix、实际硬件故障集合或和强诊断系统的量化对照。

假设压力测试

如果 rollout 与 trainer 使用不同代际 GPU、不同镜像或不同 datacenter,rollout 不能直接加入 trainer gang;论文建议额外放一台同质 warm rollout,这会重新引入预留成本。短答案 RL、纯规则环境或更频繁的 optimizer step 会让每步 checkpoint 占比上升。tool outage、RequestManager hang 和跨角色 memory leak 还可能被错误归因为 GPU role fault,最终仍走 whole-task restart。

实验可信度

论文覆盖 sync、semi-sync、async,Math 与 SWE,两种模型规模,并给出 restart、weight transfer、checkpoint 和 reward trend,组件证据较完整。局限是主结果只注入高频 trainer fault,注入类型没有说明;rollout failure 主要看 throughput trace;没有 production fault trace、检测准确率或多点相关故障。主图为 128 GPU,摘要的 256-GPU数字缺少同样细的分解,不能据此声称已验证千卡扩展。

系统性缺陷

约 8K 行 framework 逻辑增加了新的状态机和 failure surface。RequestManager 保存 trajectory,checkpoint 保存 trainer state,relay 保存最新 rollout weight;论文没有给出 TaskRunner/RequestManager crash 后的 durable recovery、exactly-once trajectory 消费或版本不一致检测。管理角色失败仍会整任务重启,SDC、fail-slow、Byzantine output 和外部 tool/sandbox 故障也不在当前恢复范围内。

局限与后续工作

  • 局限 1:端到端收益来自高频、未说明类型的 trainer fault injection,和真实 256-GPU 故障率差距很大。
  • 局限 2:role-aware detector 没有 precision、recall、P50/P99 detection delay 或误恢复成本。
  • 局限 3:warm rollout 只适合 async/semi-sync 的同质、同 datacenter 部署;sync 与异构场景收益较少。
  • 局限 4:控制面、silent corruption、fail-slow 和外部环境故障仍可能导致 whole-task restart 或错误恢复。
  • 后续工作 1:重放包含 GPU disconnect、ECC、NIC hang、process crash、tool timeout 和 slow worker 的真实 trace,逐角色报告 detection precision/recall、P99 delay、错误重启数和 ETTR。
  • 后续工作 2:分别注入 TaskRunner、RequestManager、relay 和 HDFS failure,检查恢复后 checkpoint version、trajectory ID 与 rollout weight hash 是否一致。
  • 后续工作 3:联合扫描 step duration、checkpoint interval、storage bandwidth 和实际 failure rate,报告净 GPU-hours、HDFS write bytes 与最终 reward,而不是只测高频 stress case。
  • 后续工作 4:在 H800 trainer/H20 rollout、跨 DC 和纯 sync 三种部署下测 warm capacity、重调度时间和 lost rollout throughput,量化同质假设的成本。

相关