跳转至

第 5 章 RL 训练流水线

环境配好(第 3 章)、物理跑起来(第 4 章)之后,训练是把它们与一个 RL 库缝合成"给个任务名、跑一条命令就出策略"的流水线。Isaac Lab 用 Gymnasium 的任务注册把环境配置和各 RL 库的算法配置绑在一起,再用一个统一 CLI 分派到对应库的入口。本章以 RSL-RL 为主线走通这条链,讲清任务注册与配置解析、命令入口、监控产出与复现性,末尾一句横向其余库。

1. 任务注册与配置解析

一个可训练任务在 gym.register 里登记:entry_point 指向环境类,kwargs 里按 RL 库挂各自的算法配置入口(*_cfg_entry_point)。同一个任务可同时对多库登记:

gym.register(
    id="Isaac-Cartpole-Direct-v0",
    entry_point="...cartpole_direct_env:CartpoleEnv",
    kwargs={
        "env_cfg_entry_point": "...cartpole_direct_env_cfg:CartpoleEnvCfg",
        "rsl_rl_cfg_entry_point": "...rsl_rl_ppo_cfg:CartpoleDirectPPORunnerCfg",
        "skrl_cfg_entry_point": "...:skrl_direct_ppo_cfg.yaml",
        "sb3_cfg_entry_point": "...:sb3_ppo_cfg.yaml",
    },
)

训练入口据此解析出 (env_cfg, agent_cfg):resolve_task_config(task, rl_library) 读取任务元数据里对应库的配置点,交给 Hydra 合成。配置覆写走两条路——常用运行参数是 argparse 标志(--num_envs、--max_iterations、--viz),更细的超参是 Hydra 键值覆写(physics=newton_mjwarp 选后端、agent.experiment_name=... 改日志名)。

注意二者不是一回事:像 save_interval 这类属于 agent 配置字段,只能经配置/agent.save_interval=… 设,直接写 --save_interval 会报"unrecognized arguments"。

2. 统一命令入口

3.0 的入口收敛到 isaaclab CLI 的 train / play / export 子命令,用 --rl_library 选后端,落到 isaaclab_rl/entrypoints/backends/ 下对应的 train_<lib>.py:

## 主线:RSL-RL 训练一个 Direct 任务,Newton 后端、离屏
uv run isaaclab train \
  --rl_library rsl_rl \
  --task Isaac-Cartpole-Direct-v0 \
  --num_envs 1024 --max_iterations 300 --viz none \
  physics=newton_mjwarp

--rl_library 的可选后端为 rsl_rl / sb3 / skrl / rl_games / torchrl / rlinf。每个后端都有对称的 train / play / export 入口(第 8 章用 play 与 export)。多卡用 train_multigpu(entrypoints/multigpu.py)。

3. RSL-RL 的训练闭环

RSL-RL 侧把 Isaac Lab 的向量化环境包成它的 VecEnv(RslRlVecEnvWrapper),算法与运行器由 RslRlOnPolicyRunnerCfg 声明。一次训练的三段节奏——采集、学习、存档——由这几个字段控制:

字段 含义
num_steps_per_env 每环境每代采样步数(如 16);一代总步数 = num_envs × num_steps_per_env
max_iterations 训练代数
save_interval 每隔多少代存一次 checkpoint
experiment_name / seed 日志目录名 / 随机种子
policy(RslRlPpoActorCriticCfg) 策略网络结构(隐藏层、是否 RNN、初始化噪声)
algorithm(RslRlPpoAlgorithmCfg) PPO 超参(学习率、clip、熵系数、num_learning_epochs 等)

num_steps_per_env 正是第 4 章"每代总步数"公式里的因子,把建模侧的环境数与训练侧的采样节奏接上。

一条训到收敛的典型曲线(配置:Newton/MJWarp、1024 环境、300 代):首代 Mean reward 约 0.10、Mean episode length 约 8.8;末代 Mean reward 升至约 4.95、Mean episode length 撑满 300 步、success_rate 稳定 1.0——即每个并行环境都能把 pole 平衡到整回合上限。需注意 success_rate 在 cartpole 上度量的是"车在范围内",初代即接近 1,判据要看 episode 长度与 reward 的抬升,而非 success_rate 本身(这也是第 8 章"训练收敛 ≠ 策略可用"的前置伏笔)。

训练闭环的连接关系:

flowchart LR
    env["Isaac Lab 向量化环境"] --> wrap["RslRlVecEnvWrapper<br/>VecEnv 适配"]
    wrap --> runner["RslRlOnPolicyRunner<br/>采集 → 学习 → 存档"]
    runner -->|"num_steps_per_env × num_envs"| roll["rollout 批量采样"]
    roll --> ppo["PPO 更新<br/>policy / algorithm 配置"]
    ppo --> runner
    runner --> tb["TensorBoard<br/>logs/rsl_rl/&lt;exp&gt;/&lt;时间戳&gt;"]
    runner --> ckpt["checkpoint<br/>save_interval"]

判据:看 episode 长度与 reward,不看 success_rate

cartpole 上 success_rate 初代就接近 1(它量的是“车在范围内”);训练是否真的起来,要看 episode 长度撑满与 reward 抬升。

4. 监控与产出

训练期 RSL-RL 把每代的 reward、loss、episode 统计写入 TensorBoard(SummaryWriter),日志目录在 logs/rsl_rl/<experiment_name>/<时间戳>/,其中:

  • events.out.tfevents.* — TensorBoard 标量,tensorboard --logdir logs/rsl_rl 观察。
  • model_<iter>.pt —按 save_interval 存的 checkpoint;model.pt 为最新。
  • params/ —该次的 agent/env 配置快照,便于复现。
  • 额外指标经环境的 extras["log"] 汇入(任务自定义的 success、距离等)。

5. 复现性与随机种子

复现由 isaaclab.utils.seed.configure_seed(seed, torch_deterministic) 统一播种——它一次性覆盖 random、numpy、torch、Warp 与 PYTHONHASHSEED。要点:

  • seed 缺省为 42;torch_deterministic=True 时取固定种子并(尽力)启用 torch 确定性算法。
  • 即便全播了种,GPU 并行物理与原子归约仍可能带来非确定性位级差异——复现目标应定在"指标趋势与收敛性一致",而非逐位相等。需要严格对照时,固定 num_envs、后端、种子,并记录配置快照(第 4 节的 params/)。

6. 其余库的横向

一句分界:RSL-RL 是 Isaac Lab 里四足/ locomotion 训练事实上的默认,接口最贴合其向量化环境;SB3、skrl、rl_games、torchrl、rlinf 经同一注册机制与 --rl_library 切换,各库算法配置形态不同(yaml 或 dataclass),但环境侧零改动。后续实操一律以 RSL-RL 演示,其余库本章不逐一展开(API 形态变化快,以 RSL-RL 为基准)。

7. 要点

  • 训练可跑源于任务注册:gym.register 的 kwargs 按库挂 *_cfg_entry_point,resolve_task_config 读取后交 Hydra 合成 (env_cfg, agent_cfg)。
  • 运行参数分两层:argparse 标志(--num_envs/--max_iterations/--viz)与 Hydra 键覆写(physics=…、agent.…);save_interval 属后者,写成 --save_interval 会报错。
  • 统一入口 isaaclab train --rl_library … 分派到各库 train_<lib>.py,与 play/export/train_multigpu 对称。
  • RSL-RL 闭环由 RslRlVecEnvWrapper + RslRlOnPolicyRunnerCfg 驱动;num_steps_per_env × num_envs 接上第 4 章的每代步数。
  • 产出落在 logs/rsl_rl/<实验名>/<时间戳>/:tfevents(TensorBoard)、model_<iter>.pt、params/ 配置快照。
  • 复现靠 configure_seed 全播种,但 GPU 并行下只求指标一致、不逐位相等;判收敛看 reward/episode 抬升而非 success_rate。

参考文献与延伸阅读

  • RSL-RL. 训练库仓库. 仓库
  • Isaac Lab. 文档入口. 文档
  • Schulman, J., Wolski, F., Dhariwal, P., Radford, A., & Klimov, O. Proximal Policy Optimization Algorithms. arXiv:1707.06347, 2017. arXiv