混合式模式#

../../../_images/hybrid.svg

RLinf 在共享式模式和分离式模式的基础上,进一步引入了混合式模式: 有些任务共享同一组 GPU,而有些任务使用独立的 GPU。

上图展示了一个具身 RL 训练的具体放置与执行示例。 仿真 Worker 被放置在 GPU 0-1 上,生成 Worker 被放置在 GPU 2-3 上。两个 数据队列 将生产者和消费者的速率解耦,帮助平滑流水线、平衡负载,并几乎消除性能瓶颈。在 rollout 阶段(即仿真+生成)结束后,推理 Worker 被放置并运行在 GPU 0-3 上,随后训练 Worker 也运行在 GPU 0-3 上。可以看到,混合式模式结合了共享式和分离式模式。RLinf 中的通信工具 (弹性通信) 支持这种灵活的放置和执行方式。

示例配置

混合式模式的配置风格与共享式/分离式模式一致,如下所示: env (即仿真 Worker)放置在 GPU 0-3 上,rollout (即生成 Worker)放置在 GPU 4-7 上,它们通过流水线运行。actor (即训练 Worker)放置在 GPU 0-7 上。当 rollout 阶段结束后,envrollout 会卸载到 CPU 内存,actor 会加载到 GPU 内存。

cluster:
  num_nodes: 1
  component_placement:
    actor: 0-7
    env: 0-3
    rollout: 4-7

在大多数情况下,envrolloutactor 应该启用如下的卸载功能,以避免 OOM 错误。

env:
  enable_offload: True
rollout:
  enable_offload: True
actor:
  enable_offload: True

完整配置请参考 YAML 配置

ComponentPlacement 编程

与共享式和分离式模式不同,混合式模式使用 HybridComponentPlacement, 它对 Worker 放置的限制更少。

from rlinf.utils.placement import HybridComponentPlacement

component_placement = HybridComponentPlacement(cfg, cluster)
# 创建 actor Worker 组
actor_placement = component_placement.get_strategy("actor")
actor_group = FSDPActor.create_group(cfg).launch(
     cluster, name=cfg.actor.group_name, placement_strategy=actor_placement
 )

完整代码请参考 具身模型训练