1. 项目概述

ROLLART是一个面向大规模智能体强化学习(RL)训练的高效分布式系统,其核心创新在于通过硬件亲和性(Hardware-Affinity)驱动的架构设计,将传统RL训练流程中的环境交互、模型推理和参数更新等阶段进行智能解耦与调度。该系统特别针对当前LLM-based智能体训练中存在的硬件利用率低、跨阶段耦合性强、长尾延迟显著等痛点问题,提出了一套完整的解决方案。

在实际部署中,ROLLART展现出显著优势:在数学推理、代码生成等典型智能体任务上,相比传统同步训练框架可实现2.65-4.58倍的吞吐提升;在资源调度层面,通过异构GPU集群(如H20与H800)的协同工作,训练效率提升1.30–1.68倍;其特有的冗余环境回放机制可将轨迹收集速度最高提升1.62倍。这些突破性表现使其成为当前RL训练系统领域的前沿实践。

2. 核心设计原理

2.1 硬件亲和性调度

硬件亲和性设计是ROLLART的基石理念,其核心在于根据计算特征动态分配硬件资源:

  • 计算密集型任务 :如LLM的预填充(prefill)阶段,优先调度至H800等计算优化型GPU。实测表明,在Qwen3-32B模型上,H800处理预填充的速度可达H20的3.2倍
  • 带宽密集型任务 :如LLM的解码(decoding)和环境交互,更适合部署在H20等带宽优化型硬件。在SWE-bench代码任务中,H20的解码吞吐比H800高41%

关键技术实现包括:

  1. 动态路由策略 :通过实时监控各任务的FLOPs与内存带宽需求,使用加权决策算法分配硬件资源。数学类任务默认路由至H20,游戏类任务倾向H800
  2. 资源池化 :采用Ray的分布式对象存储实现跨集群资源共享,避免静态分区导致的利用率波动

实践发现:当H20与H800的配比为1:3时,在混合负载下可实现最佳性价比,GPU利用率稳定在85%以上

2.2 异步工作流引擎

2.2.1 轨迹级并行架构

ROLLART突破传统批次(batch)级并行限制,实现细粒度的轨迹级并行:

  • LLMProxy :作为中央调度器,采用事件驱动架构管理vLLM/SGLang实例。其核心是一个非阻塞的命令处理循环,支持动态请求插入(ADD)和取消(ABORT),单命令延迟<5ms
  • EnvManager :每个环境实例独立运行,通过gRPC流式接口与LLMProxy交互。关键优化包括:
    • 上下文缓存:保存最近10步的(observation, action)序列,减少LLM输入重构开销
    • 提前终止:对超过异步边界(α)的轨迹实施熔断,避免无效计算
# EnvManager事件循环伪代码
while True:
    obs = env.step(last_action)
    trajectory.append((obs, last_action))
    if len(trajectory) > α: 
        abort_trajectory()
        break
    action = llm_proxy.query(trajectory)
    last_action = action
2.2.2 跨阶段流水线

系统通过三级流水线实现阶段重叠:

  1. 生成阶段 :LLM推理与环境执行重叠,利用CUDA Graph捕获计算图,减少内核启动延迟
  2. 奖励阶段 :通过Serverless架构(如阿里云Function Compute)异步计算奖励,延迟敏感型任务使用预热实例
  3. 训练阶段 :采用Megatron-LM的3D并行策略,同时通过Mooncake实现跨集群参数同步,带宽利用率达92%

2.3 容错与优化机制

2.3.1 冗余环境回放

针对环境执行的长尾问题,ROLLART引入动态冗余度控制:

  • 冗余系数λ = 当前平均延迟 / 基线延迟
  • 自动扩缩EnvManager实例数,实测显示当λ=1.5时,吞吐提升57%而资源消耗仅增加22%
2.3.2 KV缓存重组

为解决异步训练中的版本不一致问题:

  1. 对中断的轨迹记录其初始LLM版本号
  2. 训练时通过Prefix-aware Attention机制重组KV缓存
  3. 使用FP8量化存储历史轨迹,内存占用减少4倍

3. 关键组件实现

3.1 分布式运行时层

3.1.1 滚动调度器

采用多级队列管理轨迹生命周期:

  • 高优先级队列:存放剩余步数<5的轨迹
  • 弹性队列:根据集群负载动态调整容量
  • 淘汰策略:对超过TTL(Time-To-Live)的轨迹实施LRU淘汰
3.1.2 跨集群通信

权重同步协议优化:

  1. 增量更新 :仅传输梯度变化超过阈值的参数块(block),通信量减少63%
  2. 流水线传输 :将大模型切分为1MB的chunk,通过RDMA实现零拷贝传输
  3. 失败重试 :采用指数退避策略,最大重试间隔控制在5s内

3.2 资源管理器

3.2.1 异构资源抽象

定义统一的资源描述符:

resource_profile:
  h800: 
    count: 32
    mem_per_gpu: 80GB
  h20:
    count: 64 
    mem_per_gpu: 48GB
  cpu:
    cores: 128
    numa: balanced
3.2.2 动态绑定

通过cgroup v2实现资源隔离:

  • GPU内存:采用比例分配策略,预留15%作为应急缓冲区
  • PCIe带宽:为跨NUMA通信预留专用通道

4. 性能优化实践

4.1 负载均衡策略

4.1.1 弹性批次处理

动态调整推理批次大小:

  • 高负载时:增大批次至最大硬件容忍度(H800为256,H20为128)
  • 低负载时:启用小批次模式(8-16),延迟降低40%
4.1.2 热点缓解

通过实时监控发现并处理热点:

  1. 检测到GPU利用率>90%持续10s时,触发负载迁移
  2. 对频繁超时的EnvManager实例实施隔离
  3. 使用BPF工具追踪内核级瓶颈

4.2 生产级调优

4.2.1 环境稳定性

Kubernetes部署优化:

  • 镜像预热:在节点维护期间预拉取所有环境镜像
  • 健康检查:自定义探针检测Python解释器状态
  • 资源限制:严格限制单个环境的内存增长(<4GB)
4.2.2 故障恢复

三级恢复策略:

  1. 瞬时故障:立即重试,最多3次
  2. 硬件故障:迁移至备用节点,耗时<30s
  3. 逻辑错误:保存检查点后终止,支持断点续训

5. 典型问题排查

5.1 跨集群延迟高

现象 :权重同步耗时超过预期 排查步骤

  1. 使用 ethtool 检查网卡状态
  2. 通过 nccl-test 测量实际带宽
  3. 检查Mooncake日志中的重传记录 解决方案
  • 启用Jumbo Frame(MTU=9000)
  • 调整Mooncake的TCP窗口大小至16MB

5.2 训练震荡

现象 :验证指标波动大于15% 可能原因

  • 异步边界α设置过大
  • 奖励计算出现NaN
  • 梯度裁剪阈值不合理 调优方法
  1. 逐步减小α直至波动<5%
  2. 在奖励函数中添加epsilon(1e-6)防除零
  3. 采用动态梯度裁剪(阈值从2.0开始线性衰减)

6. 扩展与演进

当前系统仍存在两方面改进空间:

  1. 自动硬件映射 :未来计划引入LLM-based调度器,自动学习任务-硬件匹配关系
  2. 混合精度训练 :试验BF16与FP8混合精度策略,预计可再提升20%训练速度

在实际部署中,我们发现当集群规模超过512张GPU时,需要特别注意元数据服务的分片策略。采用基于一致性哈希的分片方案,可将ZooKeeper的写入延迟控制在50ms以内。

Logo

欢迎来到AMD开发者中国社区,我们致力于为全球开发者提供 ROCm、Ryzen AI Software 和 ZenDNN等全栈软硬件优化支持。携手中国开发者,链接全球开源生态,与你共建开放、协作的技术社区。

更多推荐