第 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/<exp>/<时间戳>"]
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。