三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Ray RLlib 架构入门指导

Ray RLlib 架构入门指导

Ray RLlib 架构入门指导

面向:想快速理解 RLlib 在做什么、核心组件如何协作、如何跑通第一条分布式 RL 训练链路的读者。
依据:RLlib Key Concepts、Scaling Guide、New API Stack(Ray 2.4x+ 默认启用)。


1. 一句话理解 RLlib

RLlib是构建在 Ray 上的可扩展强化学习库。
它解决的核心问题是:

RL 训练天然包含「采样」与「学习」两件可并行的事;单机循环写起来简单,但要扩到多核 / 多机 / 多 GPU 时,环境交互、模型前向、损失与梯度更新会缠在一起。

RLlib 的答案是:Algorithm 做运行时编排,把采样交给EnvRunner,把更新交给Learner,中间用统一的Episode数据与RLModule神经网络抽象解耦。


2. 为什么需要这套架构

2.1 RL 训练的两段活

阶段含义例子
采样(Sample)在环境里按策略行动,攒轨迹CartPole 上跑若干 episode
学习(Learn)用轨迹算损失、反传、更新网络PPO clip loss + value loss

小规模时可以「一个进程里 for-loop 又采样又更新」。
规模上来后出现三条扩缩轴(见后文 §7):

  1. 更多EnvRunner并行采环境
  2. 每个 EnvRunner 上更多向量化子环境
  3. 更多Learner(DDP)并行算梯度

2.2 总览直觉图

┌──────────────────────────────────────────────┐ │ Algorithm + AlgorithmConfig │ ← 实验运行时 / 配置入口 │ (algo.train() 主循环) │ └───────────────┬──────────────────┬───────────┘ │ │ ┌──────────▼──────────┐ ┌────▼───────────────┐ │ EnvRunnerGroup │ │ LearnerGroup │ │ n × EnvRunner │ │ m × Learner │ │ (采样 / 推理) │ │ (损失 / 梯度 / 优化)│ └──────────┬──────────┘ └────┬───────────────┘ │ Episode 列表 │ 更新后的权重 └────────┬─────────┘ │ sync weights(inference_only) ▼ EnvRunner 上的 RLModule 副本

记住三句话即可入门:

  1. 配置用 AlgorithmConfig,运行用 Algorithm
  2. EnvRunner 采 Episode,Learner 吃 Episode 做更新
  3. RLModule 是网络本体;采样侧常是轻量inference_only副本,学习侧是完整训练副本。

3. 核心概念速查

概念是什么入门只需知道
AlgorithmConfig类型安全的配置构建器PPOConfig().environment(...).training(...).build()
Algorithm一次实验的运行时algo.train()跑一轮;也可交给 Ray Tune
EnvRunner环境 + 策略交互的 Actor产出SingleAgentEpisode/MultiAgentEpisode列表
EnvRunnerGroup一组 EnvRunner 的管理器含 1 个 local +n个 remote;故障可恢复
RLModule框架相关的神经网络封装三个前向:forward_exploration/forward_inference/forward_train
MultiRLModule多子模块字典多智能体 / 多网络时用,按ModuleID索引
Episode统一轨迹容器存 obs / actions / rewards / infos / 模型附加输出
Learner损失 + 优化器 + 更新逻辑算法相关(PPO Learner ≠ DQN Learner)
LearnerGroup一组 Learner自动做数据并行(DDP)
ConnectorV2可插拔数据变换管道env→module、module→env、Learner 三条管线

新 API 栈(默认开启):用RLModule/Learner/EnvRunner/Episode/ConnectorV2取代旧栈的Policy/ModelV2/RolloutWorker/SampleBatch等。除非维护旧代码,入门请直接学新栈。


4. 仓库 / 模块地图(先认路)

逻辑上可按这条路径读代码与文档:

ray.rllib/ algorithms/ # PPO、DQN、SAC、APPO、IMPALA… algorithm.py # Algorithm 基类:train / checkpoint / eval algorithm_config.py # AlgorithmConfig 链式 API env/ env_runner.py # EnvRunner 抽象 single_agent_env_runner.py multi_agent_env_runner.py single_agent_episode.py multi_agent_episode.py core/ rl_module/ # RLModule / MultiRLModule / Spec learner/ # Learner / LearnerGroup connectors/ # ConnectorV2 管道 offline/ # OfflineData(离线 RL,基于 Ray Data)

官方文档入口:Key Concepts。


5. 用「像单机一样」的代码读懂架构

5.1 最小可运行示例

fromray.rllib.algorithms.ppoimportPPOConfig config=(PPOConfig().environment("CartPole-v1").env_runners(num_env_runners=2).training(train_batch_size_per_learner=2000,lr=0.0004,))algo=config.build()print(algo.train())# 一轮:采样 → 更新 → 同步权重algo.stop()

5.2 一轮train()里实际发生了什么

PPO这类 on-policy 算法,逻辑近似:

1. EnvRunnerGroup 并行 sample → 得到若干 Episode(或片段) 2. 凑够 train_batch_size_per_learner,交给 LearnerGroup.update(...) 3. Learner:Connector 把 Episode → train batch → forward_train → loss → 反传 → optimizer.step 4. Algorithm 从 Learner 取 inference_only 权重,sync 回所有 EnvRunner 5. 返回 metrics(回报、loss、吞吐等)

读这段时请对照:

  • sample:环境交互 +forward_exploration(训练采样时常带探索)。
  • update:真正的分布式学习步。
  • sync weights:保证下一轮采样用的是最新策略。
  • 评估可用单独的eval_env_runner_group,走forward_inference(更贪心 / 少随机)。

这就是 RLlib 的可编程性:换算法 ≈ 换 Algorithm/Learner 的采样-更新编排与损失,而 EnvRunner / Episode / 扩缩机制可复用。


6. 一次完整上手链路(从安装到跑通)

推荐顺序:

  1. 环境:安装匹配版本的ray[rllib]、PyTorch、gymnasium(按 Installation)。
  2. 先单机小环境CartPole-v1/Pendulum-v1,确认algo.train()有回报上升趋势。
  3. 调扩缩:先加num_env_runners,再试num_envs_per_env_runner;有 GPU 再设learners(num_learners=..., num_gpus_per_learner=1)
  4. 换环境:自定义gymnasium.Env,用.environment(env=YourEnv, env_config={...})
  5. 观察指标episode_return_mean、采样步数、learner loss、耗时。
  6. 可选 Tune:用tune.Tuner("PPO", param_space=config, ...)做停条件与超参搜索。

6.1 入门必懂的几个配置旋钮

配置项含义
environment(...)环境 ID 或类、env_config
env_runners(num_env_runners=n)远程采样 Actor 数;0= 只用 local
env_runners(num_envs_per_env_runner=p)每个 Actor 上的向量环境数
learners(num_learners=m)远程 Learner 数;0= local Learner
learners(num_gpus_per_learner=1)每个 Learner 占几张 GPU(可为小数)
training(train_batch_size_per_learner=...)每个 Learner 一轮更新的 batch 规模
training(lr=..., gamma=...)学习率、折扣等通用训练项
rl_module(model_config=...)默认网络宽度/深度等(新栈不用旧model={...}

7. 三条扩缩轴(入门版)

吞吐 ≈ f( num_env_runners , num_envs_per_env_runner , num_learners )
配置典型用途
更多采样进程num_env_runners环境慢、需要更多并行轨迹
向量化环境num_envs_per_env_runner单进程内 batched 推理;可再开 ASYNC 向量化
更多学习卡num_learners+ GPU加大有效 batch、多卡 DDP

入门实践建议:

  • 先采样后学习:多数瓶颈在环境步进 → 先加 EnvRunner / 向量环境。
  • GPU 给 Learner:EnvRunner 默认 CPU 即可;除非环境或推理本身要 GPU。
  • IMPALA/APPO:单卡时num_learners=0 + num_gpus_per_learner=1num_learners=1 + CPU的性能选择不同,见官方 Scaling Guide。

8. Episode:数据长什么样

长度 20 的SingleAgentEpisode示意:

obs: (21, ...) # 含 reset 的初始观测,比动作多 1 actions: (20, ...) rewards: (20, ...) infos: 长度 21 的 dict 列表 extra_model_outputs: 如 action_dist_inputs / logp is_terminated / is_truncated: 结束原因

设计要点(入门记住即可):

  • 不单独存next_obs:与下一时刻obs重叠,约省一半观测内存。
  • 复杂Dict观测保持嵌套结构,叶子是 NumPy,便于网络传输。
  • 多智能体用MultiAgentEpisode(内含多个单智能体轨迹 + 步进时序关系)。

9. 和周边组件的关系(心智对齐)

组件在 RLlib 里通常扮演
Ray Core(Actors)EnvRunner / Learner 进程与 RPC
Ray Tune实验管理、停条件、超参搜索(Algorithm 是 Trainable)
Ray Data新栈离线 RL 的读写与预处理
Gymnasium环境标准接口;向量环境 API
PyTorch主流 RLModule / Learner 实现框架

RLlib 不是「又一个 PPO 脚本」,而是把采样与学习拆成可独立扩缩的 Actor 图,上面挂统一的模块与数据协议。


10. 入门学习路径(建议 1–2 周)

阶段目标材料
Day 1–2建立 Algorithm / EnvRunner / Learner / RLModule 心智模型本文 §1–5;Key Concepts
Day 3–4跑通 CartPole PPO,改扩缩轴Scaling Guide
Day 5–6自定义环境 + 读默认 RLModule 配置RL Environments、RLModules
Day 7+试 DQN/SAC 或简单多智能体;了解新栈迁移词表Algorithms、Migration Guide

入门验收标准:

  • 能画 Algorithm ↔ EnvRunnerGroup ↔ LearnerGroup 关系图
  • 能解释为何采样侧常用inference_onlyRLModule
  • 能独立改环境、batch、EnvRunner/Learner 数量并跑通
  • 能说明 Episode 相对旧 SampleBatch 的基本职责

11. 常见坑(入门版)

  1. 还在用旧栈配置model={...}num_workers)→ 新栈请用rl_module(...)num_env_runners
  2. num_gpus_per_learner>0但集群无卡 / 未开 autoscaler→ 实验像「卡住」在等资源。
  3. 把 GPU 全分给 EnvRunner、Learner 没卡→ 学习极慢或落在 CPU。
  4. 一上来就自定义 Policy/ModelV2→ 新栈应扩展RLModule+Learner
  5. 忽略权重同步→ 改 Learner 后 EnvRunner 仍用旧权重(正常由 Algorithm 处理;自写循环时容易漏)。

12. 小结

RLlib 入门只需抓住一条主线:

AlgorithmConfig 描述实验 → Algorithm 编排采样与学习 → EnvRunner 产 Episode → Learner 更新 RLModule → 权重同步回采样侧。

搞清这条主线后,再深入自定义 RLModule/Learner、ConnectorV2、多智能体 MultiRLModule、离线 RL、高吞吐 APPO/IMPALA 等,请阅读同目录下的《Ray RLlib 架构精通指导》。


参考链接

  • Key Concepts:https://docs.ray.io/en/latest/rllib/key-concepts.html
  • Scaling Guide:https://docs.ray.io/en/latest/rllib/scaling-guide.html
  • Algorithms:https://docs.ray.io/en/latest/rllib/rllib-algorithms.html
  • RLModules:https://docs.ray.io/en/latest/rllib/rl-modules.html
  • New API Stack 迁移:https://docs.ray.io/en/latest/rllib/new-api-stack-migration-guide.html
  • 代码:https://github.com/ray-project/ray/tree/master/rllib
← 返回列表