当前位置: 首页 > ai >正文

第三章、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_typevecenv_config 获取对应的并行环境类(如 RayVecEnv)。
  • 创建实例:调用并行环境类的构造函数,传入 env_creator 函数批量创建环境。

2 如何基于 rl_games 扩展自定义强化学习任务

rl_games 提供了主流算法(如 PPOA2C)和环境的实现,但实际研究常需自定义环境或算法。扩展框架的目的是灵活支持新任务(如机器人控制、多智能体协作)或实验需求(如混合算法、特殊奖励机制)。

  • 参考架构: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...
http://www.xdnf.cn/news/4486.html

相关文章:

  • femap许可回收流程
  • mysql修改root密码
  • 东方泵业,室外消火栓泵 2#故障灯亮,报警生响
  • 蓝桥杯2025年第十六届省赛真题-水质检测
  • 【shardingsphere分布式主键无效】
  • Linux 系统命令使用指南1
  • 2025最新出版 Microsoft Project由入门到精通(二)
  • WPF 触发器 Trigger
  • java每日精进 5.07【框架之数据权限】
  • 【C++游戏引擎开发】第33篇:物理引擎(Bullet)—射线检测
  • 小数的二进制表示
  • 【卡特兰数】不同的二叉搜索树
  • 学习笔记:黑马程序员JavaWeb开发教程(2025.3.30)
  • (25.05)Ubuntu 20.04上安装和运行ORB-SLAM3(非ROS)
  • 操作指南*
  • 数通HCIE的通过率怎么样?
  • no main manifest attribute, in xxx.jar
  • 软件系统的可观测性 Observability
  • 【AI】模型与权重的基本概念
  • 《Python星球日记》 第45天:KNN 与 SVM 分类器
  • 从电话到V信语音:一款App实现全场景社交脱身
  • 28.成功解决i2c_transfer返回-6的问题并linux驱动mpu6050(适合一切linux学习者)
  • OpenCV 中用于背景分割(背景建模)的一个类cv::bgsegm::BackgroundSubtractorCNT
  • 【HarmonyOS 5】鸿蒙中常见的标题栏布局方案
  • Oracle 开窗函数
  • 高组装导轨的特点
  • Java中字符转数字的原理解析 - 为什么char x - ‘0‘能得到对应数字
  • 《Python星球日记》 第43天:机器学习概述与Scikit-learn入门
  • 旧版谷歌浏览器Chrome v116.0.5845.141下载
  • 38.机壳间接缝的处理