第三章、RL Games:High performance RL library
0 前言
官方连接:https://github.com/Denys88/rl_games
RL Games 是由 NVIDIA 开发的一个专注于强化学习(Reinforcement Learning, RL)的高性能开源框架,主要用于快速训练和部署强化学习模型。其设计目标是为复杂环境(如机器人控制、游戏AI、多智能体系统等)提供高效的训练工具,同时支持分布式训练和GPU加速。
本文介绍了rl_games强化学习库的一些基本功能。此外,本文还提供了使用类似IsaacGymEnvs包的结构(IsaacLab可参考)创建新环境和算法,为 rl_games 的扩展指南。
主要内容包括:
- rl_games 的各个组件(运行器、算法、环境…)
- 使用 rl_games 完成你自己的任务
- 为rl_games添加一个新的类似于gym的环境
- 使用非gym环境或模拟器(直白的来说就是在isaacgym或isaacsim环境中)使用rl_games算法。
- 在rl_games中添加一个新的算法
1 rl_games 中的常规设置
runner.py
是 RL Games 框架的主入口脚本,用于启动强化学习的训练(Training)或策略执行(Playing)流程。用户通过命令行参数指定任务类型(训练/执行)和配置文件路径。
关键命令行参数:
--train:启动训练模式,根据配置文件从头开始训练策略。--play:启动执行模式,加载已训练好的策略模型并在环境中运行。--file <path>:必须参数,指定训练或执行的配置文件路径(YAML 格式)。该文件定义了算法超参数、环境配置、网络结构等关键信息。
示例命令解析:
1、训练 PPO 策略(Pong 环境)
python runner.py --train --file rl_games/configs/atari/ppo_pong.yaml
功能:使用 PPO 算法在 Pong 环境中训练一个新模型。
流程:
- 框架会读取 ppo_pong.yaml 中的配置(如学习率、批量大小、网络结构、环境参数等)。
- 根据配置启动训练进程,定期保存模型检查点(checkpoint)到指定目录(通常在配置文件中定义,如 checkpoint_path: ppo_pong.pth)
2、执行训练好的 PPO 策略(Pong 环境)
python runner.py --play --file rl_games/configs/atari/ppo_pong.yaml --checkpoint nn/PongNoFrameskip.pt
ppo_pong.yaml 配置文件说明
# ==== 基础设置 ====
params:seed: 322 # 随机种子,保证实验可重复性(修改为其他值会改变初始随机状态)# ==== 算法配置 ====algo:name: a2c_discrete # 离散A2C# ==== 模型定义 ====model:name: discrete_a2c # 离散A2C# ==== 网络结构 ====network:name: actor_critic # 网络类型:Actor-Critic架构separate: False # 是否分离策略网络和价值网络(False表示共享基础层)space: discrete: # 动作空间类型为离散(Pong是离散动作环境)# --- CNN部分(处理图像输入)---cnn:type: conv2d # 卷积层类型activation: elu # 激活函数(ELU比ReLU更平滑)initializer:name: default # 权重初始化方法(默认是均匀分布)regularizer:name: None # 无正则化(可改为L2正则化防止过拟合)convs: - filters: 32 # 第一层卷积:32个滤波器,8x8核,步长4kernel_size: 8strides: 4padding: 0- filters: 64 # 第二层卷积:64个滤波器,4x4核,步长2kernel_size: 4strides: 2padding: 0- filters: 64 # 第三层卷积:64个滤波器,3x3核,步长1kernel_size: 3strides: 1padding: 0# --- MLP部分(全连接层)---mlp:units: [512] # 全连接层神经元数(可改为[256, 256]增加深度)activation: elu # 激活函数initializer:name: orthogonal_initializer # 正交初始化(适合RNN/强化学习)gain: 1.41421356237 # 初始化缩放因子(与ELU激活匹配)# ==== 训练配置 ====config:name: PongNoFrameskip_ray # 实验名称(自定义标识)env_name: PongNoFrameskip-v4 # 环境名称(Atari Pong去帧跳版本)score_to_win: 20.0 # 胜利分数阈值(Pong中一方得分达21即胜利)# --- 输入/价值归一化 ---normalize_value: True # 对价值函数输出归一化(稳定训练)normalize_input: True # 对观测输入归一化(缩放像素值到0-1)normalize_advantage: True # 对优势函数归一化(防止梯度爆炸)# --- 奖励重塑 ---reward_shaper:min_val: -1 # 奖励裁剪下限(限制极端奖励)max_val: 1 # 奖励裁剪上限# --- 折扣因子与GAE参数 ---gamma: 0.99 # 折扣因子(0.99=关注长期奖励)tau: 0.95 # GAE参数(平衡偏差-方差)# --- 优化与梯度控制 ---grad_norm: 1.0 # 梯度裁剪阈值(防止梯度爆炸)entropy_coef: 0.01 # 熵正则化系数(鼓励探索,增大到0.1可增强探索)truncate_grads: True # 是否截断梯度(True=启用梯度裁剪)learning_rate: 3e-4 # 学习率(增大到1e-3加速收敛但可能不稳定)lr_schedule: adaptive # 学习率调整方式(自适应根据KL散度调整)# --- PPO专用参数 ---e_clip: 0.2 # PPO的策略更新裁剪范围(增大到0.3允许更大更新)clip_value: False # 是否裁剪价值损失(True可能稳定训练但偏差增大)mini_epochs: 4 # 每个大批次内的小迭代次数(增大到8增强样本重用)kl_threshold: 0.01 # KL散度阈值(触发学习率调整的条件)# --- 并行与批次设置 ---num_actors: 64 # 并行环境数量(增大到128加速采样,但需更多内存)horizon_length: 128 # 每个环境的时间步数(增大到256增加序列长度)minibatch_size: 2048 # 小批次大小(减小到1024降低显存占用)# --- 训练控制 ---critic_coef: 2 # 价值函数损失权重(增大到5更关注价值准确性)max_epochs: 500 # 最大训练轮次(增加到1000延长训练时间)use_diagnostics: False # 是否记录详细诊断信息(True会降低速度)# --- 环境配置 ---env_config:env_name: PongNoFrameskip-v4has_lives: False # 环境是否包含“生命”机制(Pong中为False)# --- 策略执行参数 ---player:render: True # 执行时是否渲染环境画面games_num: 100 # 执行时运行多少局游戏n_game_life: 1 # 每个线程运行多少次游戏deterministic: True # 是否使用确定性策略(False时按概率采样动作)
以下是关于 rl_games 框架核心组件及其工作流程的详细解释,涵盖算法实例化、环境管理、日志记录等关键机制:
1、主脚本:rl_games.torch_runner.Runner
核心功能
- 入口类:负责根据配置文件初始化算法、执行训练或策略执行。
- 自动注册机制:通过 ObjectFactory 自动注册所有已实现的算法(如PPO、A2C)和对应的策略执行器(Player)。
- 模式选择:根据命令行参数(
--train
或--play
)调用self.run_train()
或self.run_play()
。
关键行为
- 日志与模型保存:
- 默认在
./nn
目录下保存训练日志和模型检查点(checkpoint
)。 - 使用
DefaultAlgoObserver
通过TensorBoard
记录训练指标(如回报、熵、损失等)。
- 默认在
- 自定义扩展:
- 可自定义
AlgoObserver
实现更复杂的日志记录(如自定义指标监控)。 - 支持注入自定义算法或环境(需通过
ObjectFactory
注册)。
- 可自定义
2、算法工厂:rl_games.common.ObjectFactory
核心机制
注册与创建:通过 register_builder() 方法将算法名称映射到对应的类构造器。
# 示例:注册A2C连续动作空间算法
register_builder('a2c_continuous', lambda **kwargs: a2c_continuous.A2CAgent(**kwargs))
动态实例化:调用 create(name, **kwargs) 根据名称创建算法实例。
# 创建A2C算法实例
algo = factory.create('a2c_continuous', config=config, ...)
3、强化学习算法
- 基类与继承
- 基类:如 rl_games.algos_torch.A2CBase,定义了算法通用逻辑(如数据采样、损失计算、模型更新)。
- 子类继承示例:
- A2CAgent(离散/连续动作)
- PPOAgent
- SACAgent
算法工作流程:
1、初始化环境:根据配置文件中的 env_name 创建环境实例。
2、构建网络:根据配置中的 network 定义策略网络(Actor)和价值网络(Critic)。
3、数据采集:通过并行环境(num_actors)批量生成经验数据。
4、训练循环:计算损失(策略损失、价值损失、熵正则项)。反向传播与梯度裁剪(grad_norm)。更新模型参数(learning_rate)。
4、 环境管理
环境工厂:rl_games.common.vecenv
- 并行环境支持:通过
vecenv
类(如RayVecEnv
)管理多个并行环境实例,加速数据采集。 - 环境类型注册:
vecenv_config
字典存储环境类型与对应类的映射:
vecenv_config = {'RAY': RayVecEnv, # 使用Ray框架的并行环境'MULTIAGENT': MultiAgentVecEnv, # 多智能体环境'CULE': CuleEnv, # CUDA加速的Atari环境
}
环境配置:rl_games.common.env_configurations
- 环境名称映射:configurations 字典将环境名称映射到其类型和创建函数:
configurations = {'CartPole-v1': {'vecenv_type': 'RAY', # 使用RayVecEnv类'env_creator': lambda **kwargs: gym.make('CartPole-v1'), # 创建单个环境的函数},'PongNoFrameskip-v4': {'vecenv_type': 'CULE','env_creator': lambda **kwargs: make_atari_env('PongNoFrameskip-v4'),}
}
环境实例化流程
- 读取配置:从YAML文件的
env_name
获取环境名称(如CartPole-v1
)。 - 查找类型:通过
configurations
找到该环境的vecenv_type
(如RAY
)。 - 选择并行类:根据
vecenv_type
从vecenv_config
获取对应的并行环境类(如RayVecEnv
)。 - 创建实例:调用并行环境类的构造函数,传入
env_creator
函数批量创建环境。
2 如何基于 rl_games 扩展自定义强化学习任务
rl_games
提供了主流算法(如 PPO
、A2C
)和环境的实现,但实际研究常需自定义环境或算法。扩展框架的目的是灵活支持新任务(如机器人控制、多智能体协作)或实验需求(如混合算法、特殊奖励机制)。
- 参考架构:IsaacGymEnvs: NVIDIA 的 IsaacGymEnvs 是基于 rl_games 的扩展库,专为物理仿真环境(如 Isaac Gym)设计。其核心设计模式为:
- 模块化配置:通过 Hydra 管理超参数,避免硬编码。
- 动态注册:允许运行时加载自定义环境和算法,无需修改框架源码。
- 关键工具:Hydra
- 功能:动态配置管理框架,支持 YAML 文件分层配置、命令行参数覆盖。
- 优势:解耦代码与配置,便于实验复现和参数调优。
工程结构如下:
project dir
│ train.py (replacement to the runner.py script)
│
└───tasks dir (sometimes also called envs dir)
│ │ customenv.py
│ │ customenv_utils.py
|
└───cfg dir (main hydra configs)
│ │ config.yaml (main config for the setting up simulators etc. if needed)
│ │
│ └─── task dir (configs for the env)
│ │ customenv.yaml
│ │ otherenv.yaml
│ │ ...
|
│ └─── train dir (configs for training the algorithm)
│ │ customenvPPO.yaml
│ │ otherenvAlgo.yaml
│ │ ...
|
└───algos dir (custom wrappers for training algorithms in rl_games)
| │ custom_network_builder.py
| │ custom_algo.py
| | ...
|
└───runs dir (generated automatically on executing train.py)
│ └─── env_name_alg_name_datetime dir (train logs)
│ └─── nn
| | checkpoints.pth
│ └─── summaries| events.out...