RL Games: 高性能强化学习库
Discord频道链接
论文和相关链接
- Isaac Gym: 用于机器人学习的高性能GPU物理模拟: https://arxiv.org/abs/2108.10470
- DeXtreme: 从模拟到现实的灵巧手部操作迁移: https://dextreme.org/ https://arxiv.org/abs/2210.13702
- 将灵巧操作从GPU模拟迁移到远程真实世界TriFinger: https://s2r2-ig.github.io/ https://arxiv.org/abs/2108.09779
- 在星际争霸多智能体挑战中,独立学习就足够了吗? https://arxiv.org/abs/2011.09533
- 超快对抗运动先验(AMP)实现: https://twitter.com/xbpeng4/status/1506317490766303235 https://github.com/NVIDIA-Omniverse/IsaacGymEnvs
- OSCAR: 数据驱动的操作空间控制,用于自适应和鲁棒的机器人操作: https://cremebrule.github.io/oscar-web/ https://arxiv.org/abs/2110.00704
- EnvPool: 高度并行的强化学习环境执行引擎: https://arxiv.org/abs/2206.10558 和 https://github.com/sail-sg/envpool
- TimeChamber: 大规模并行自我对弈框架: https://github.com/inspirai/TimeChamber
在不同环境中的一些结果
Pytorch实现:
- PPO,支持非对称演员-评论家变体
- 支持与Isaac Gym和Brax的端到端GPU加速训练流程
- 支持掩码动作
- 多智能体训练,去中心化和中心化评论家变体
- 自我对弈
Tensorflow 1.x实现(在此版本中已移除):
- Rainbow DQN
- A2C
- PPO
快速开始: 云端Colab
在Colab笔记本中快速轻松地探索RL Games:
- Mujoco训练 Mujoco envpool训练示例。
- Brax训练 Brax训练示例,所有观察和动作都保留在GPU上。
- 使用Cartpole的Onnx离散空间导出示例 envpool训练示例。
- 使用Pendulum的Onnx连续空间导出示例 envpool训练示例。
- 使用Pendulum的Onnx带LSTM的连续空间导出示例 envpool训练示例。
安装
为获得最大的训练性能,强烈建议预先安装Pytorch 2.2或更新版本,以及CUDA 12.1或更新版本:
conda install pytorch torchvision pytorch-cuda=12.1 -c pytorch -c nvidia
或:
pip install pip3 install torch torchvision
然后:
pip install rl-games
要运行基于CPU的环境,需要安装Ray或envpool pip install envpool
或 pip install ray
要运行Mujoco、Atari游戏或基于Box2d的环境训练,需要分别额外安装 pip install gym[mujoco]
、pip install gym[atari]
或 pip install gym[box2d]
。
要运行Atari还需要 pip install opencv-python
。此外,强烈建议安装envpool以获得Mujoco和Atari环境的最大模拟和训练性能: pip install envpool
引用
如果您在研究中使用rl-games,请使用以下引用:
@misc{rl-games2021,
title = {rl-games: A High-performance Framework for Reinforcement Learning},
author = {Makoviichuk, Denys and Makoviychuk, Viktor},
month = {May},
year = {2021},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/Denys88/rl_games}},
}
开发设置
poetry install
# 安装cuda相关依赖
poetry run pip install torch==1.11.0+cu113 torchvision==0.12.0+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html
训练
NVIDIA Isaac Gym
下载并按照Isaac Gym的安装说明进行操作: https://developer.nvidia.com/isaac-gym
以及IsaacGymEnvs: https://github.com/NVIDIA-Omniverse/IsaacGymEnvs
蚂蚁
python train.py task=Ant headless=True
python train.py task=Ant test=True checkpoint=nn/Ant.pth num_envs=100
人形机器人
python train.py task=Humanoid headless=True
python train.py task=Humanoid test=True checkpoint=nn/Humanoid.pth num_envs=100
Shadow Hand方块定向任务
python train.py task=ShadowHand headless=True
python train.py task=ShadowHand test=True checkpoint=nn/ShadowHand.pth num_envs=100
其他
Atari 乒乓
poetry install -E atari
poetry run python runner.py --train --file rl_games/configs/atari/ppo_pong.yaml
poetry run python runner.py --play --file rl_games/configs/atari/ppo_pong.yaml --checkpoint nn/PongNoFrameskip.pth
Brax蚂蚁
poetry install -E brax
poetry run pip install --upgrade "jax[cuda]==0.3.13" -f https://storage.googleapis.com/jax-releases/jax_releases.html
poetry run python runner.py --train --file rl_games/configs/brax/ppo_ant.yaml
poetry run python runner.py --play --file rl_games/configs/brax/ppo_ant.yaml --checkpoint runs/Ant_brax/nn/Ant_brax.pth
实验追踪
rl_games支持使用Weights and Biases进行实验追踪。
poetry install -E atari
poetry run python runner.py --train --file rl_games/configs/atari/ppo_breakout_torch.yaml --track
WANDB_API_KEY=xxxx poetry run python runner.py --train --file rl_games/configs/atari/ppo_breakout_torch.yaml --track
poetry run python runner.py --train --file rl_games/configs/atari/ppo_breakout_torch.yaml --wandb-project-name rl-games-special-test --track
poetry run python runner.py --train --file rl_games/configs/atari/ppo_breakout_torch.yaml --wandb-project-name rl-games-special-test -wandb-entity openrlbenchmark --track
多GPU
我们使用torchrun
来协调任何多GPU运行。
torchrun --standalone --nnodes=1 --nproc_per_node=2 runner.py --train --file rl_games/configs/ppo_cartpole.yaml
配置参数
字段 | 示例值 | 默认值 | 描述 |
---|---|---|---|
seed | 8 | 无 | PyTorch、NumPy等的随机种子 |
algo | 算法块 | ||
name | a2c_continuous | 无 | 算法名称。可能的值有:sac、a2c_discrete、a2c_continuous |
model | 模型块 | ||
name | continuous_a2c_logstd | 无 | 可能的值:continuous_a2c(期望sigma为(0, +inf))、continuous_a2c_logstd(期望sigma为(-inf, +inf))、a2c_discrete、a2c_multi_discrete |
network | 网络描述 | ||
name | actor_critic | 可能的值:actor_critic 或 soft_actor_critic | |
separate | False | 是否为评论家使用具有相同架构的独立网络。在几乎所有情况下,如果你标准化值,最好将其设为False | |
space | 网络空间 | ||
continuous | 连续或离散 | ||
mu_activation | None | mu的激活函数。在几乎所有情况下,None效果最佳,但我们可以尝试tanh | |
sigma_activation | None | sigma的激活函数。根据模型的不同,将被视为log(sigma)或sigma | |
mu_init | mu的初始化器 | ||
name | default | ||
sigma_init | sigma的初始化器。如果使用logstd模型,好的值是0 | ||
name | const_initializer | ||
val | 0 | ||
fixed_sigma | True | 如果为真,则sigma向量不依赖于输入 | |
cnn | 卷积块 | ||
type | conv2d | 类型:目前支持两种类型:conv2d或conv1d | |
activation | elu | 卷积层之间的激活函数 | |
initializer | 初始化器。我从tensorflow中借用了一些名称 | ||
name | glorot_normal_initializer | 初始化器名称 | |
gain | 1.4142 | 附加参数 | |
convs | 卷积层。参数与torch中的相同 | ||
filters | 32 | 过滤器数量 | |
kernel_size | 8 | 核大小 | |
strides | 4 | 步长 | |
padding | 0 | 填充 | |
filters | 64 | 下一个卷积层信息 | |
kernel_size | 4 | ||
strides | 2 | ||
padding | 0 | ||
filters | 64 | ||
kernel_size | 3 | ||
strides | 1 | ||
padding | 0 | ||
mlp | MLP块。也支持卷积。请参见其他配置示例 | ||
units | MLP层的大小数组,例如:[512, 256, 128] | ||
d2rl | False | 使用来自https://arxiv.org/abs/2010.09163的d2rl架构 | |
activation | elu | 密集层之间的激活函数 | |
initializer | 初始化器 | ||
name | default | 初始化器名称 | |
rnn | RNN块 | ||
name | lstm | RNN层名称。支持lstm和gru | |
units | 256 | 单元数量 | |
layers | 1 | 层数 | |
before_mlp | False | False | 是否在mlp块之前应用rnn |
config | RL配置块 | ||
reward_shaper | 奖励整形器。可以应用简单的变换 | ||
min_val | -1 | 你可以应用min_val、max_val、scale和shift | |
scale_value | 0.1 | 1 | |
normalize_advantage | True | True | 标准化优势 |
gamma | 0.995 | 奖励折扣 | |
tau | 0.95 | GAE的lambda值。很久以前误称为tau,因为lambda是python的关键字:( | |
learning_rate | 3e-4 | 学习率 | |
name | walker | 将在tensorboard中使用的名称 | |
save_best_after | 10 | 等待多少个epoch后开始保存最佳分数的检查点 | |
score_to_win | 300 | 如果分数>=该值,则训练将停止 | |
grad_norm | 1.5 | 梯度范数。如果truncate_grads为True则应用。好的值在(1.0, 10.0)之间 | |
entropy_coef | 0 | 熵系数。连续空间的好值是0。离散空间是0.02 | |
truncate_grads | True | 是否应用截断梯度。它可以稳定训练 | |
env_name | BipedalWalker-v3 | 环境名称 | |
e_clip | 0.2 | ppo损失的裁剪参数 | |
clip_value | False | 是否对值损失应用裁剪。如果使用normalize_value,则不需要 | |
num_actors | 16 | 运行的actor/环境数量 | |
horizon_length | 4096 | 每个actor的视野长度。总步数将是num_actorshorizon_lengthnum_agents(如果环境不是多智能体,num_agents==1) | |
minibatch_size | 8192 | 小批量大小。总步数必须能被小批量大小整除 | |
minibatch_size_per_env | 8 | 每个环境的小批量大小。如果指定,将用minibatch_size_per_env * nume_envs的值覆盖默认的小批量大小 | |
mini_epochs | 4 | 小epoch数。好的值在[1,10]之间 | |
critic_coef | 2 | 评论家系数。默认情况下,critic_loss = critic_coef * 1/2 * MSE | |
lr_schedule | adaptive | None | 调度器类型。可以是None、linear或adaptive。adaptive对连续控制任务最好。每个小epoch都会改变学习率 |
kl_threshold | 0.008 | 自适应调度的KL阈值。如果KL < kl_threshold/2,则lr = lr * 1.5,反之亦然 | |
normalize_input | True | 对输入应用运行平均标准差 | |
bounds_loss_coef | 0.0 | 连续空间辅助损失的系数 | |
max_epochs | 10000 | 运行的最大周期数。 | |
max_frames | 5000000 | 运行的最大帧数(环境步骤)。 | |
normalize_value | True | 使用值运行平均标准归一化。 | |
use_diagnostics | True | 在tensorboard中添加更多信息。 | |
value_bootstrap | True | 在情节结束时引导值。对不同的运动环境非常有用。 | |
bound_loss_type | regularisation | None | 为连续情况添加辅助损失。'regularisation'是平方动作的总和。'bound'是大于1.1的动作总和。 |
bounds_loss_coef | 0.0005 | 0 | 正则化系数 |
use_smooth_clamp | False | 使用平滑夹持代替常规裁剪 | |
zero_rnn_on_done | False | True | 如果为False,当环境重置时RNN内部状态不会重置(设为0)。在某些情况下可能改善训练,例如当开启域随机化时 |
player | 玩家配置块。 | ||
render | True | False | 渲染环境 |
deterministic | True | True | 使用确定性策略(argmax或mu)还是随机策略。 |
use_vecenv | True | False | 使用vecenv为玩家创建环境 |
games_num | 200 | 在玩家模式下运行的游戏数量。 | |
env_config | 环境配置块。它直接应用于环境。这个例子取自我的Atari包装器。 | ||
skip | 4 | 跳过的帧数 | |
name | BreakoutNoFrameskip-v4 | (Atari)gym环境的确切名称。这是一个例子,根据训练环境的不同,这些参数可能会有所不同。 | |
evaluation | True | False | 在训练时启用评估功能进行推理。 |
update_checkpoint_freq | 100 | 100 | 查找新检查点的步骤频率。 |
dir_to_monitor | 评估期间搜索检查点的目录。 |
自定义网络示例:
[简单测试网络](https://github.com/Denys88/rl_games/blob/master/rl_games/envs/test_network.py 该网络接受字典形式的观察值。 要注册它,你可以在你的 init.py 中添加如下代码:
from rl_games.envs.test_network import TestNetBuilder
from rl_games.algos_torch import model_builder
model_builder.register_network('testnet', TestNetBuilder)
[简单测试环境](https://github.com/Denys88/rl_games/blob/master/rl_games/envs/test/rnn_env.py [示例环境](https://github.com/Denys88/rl_games/blob/master/rl_games/envs/test/example_env.py
环境支持的额外属性和函数
字段 | 默认值 | 描述 |
---|---|---|
use_central_value | False | 如果为真,则返回的观察值预期是包含'obs'和'state'的字典 |
value_size | 1 | 返回奖励的形状。网络将自动支持多头值函数。 |
concat_infos | False | 默认vecenv是否应将字典列表转换为列表字典。如果要使用值提升非常有用。在这种情况下,你需要始终从环境返回'time_outs':True或False。 |
get_number_of_agents(self) | 1 | 返回环境中的智能体数量 |
has_action_mask(self) | False | 如果环境有无效动作掩码则返回True |
get_action_mask(self) | None | 如果has_action_mask为真则返回动作掩码。一个很好的例子是[SMAC环境](https://github.com/Denys88/rl_games/blob/master/rl_games/envs/test/smac_env.py |
发行说明
1.6.1
- 修复了在训练多智能体环境时出现的中心值RNN错误。
- 添加了Deepmind Control PPO基准测试。
- 添加了几种实验性的值预测训练方法(OneHot、TwoHot编码和交叉熵损失而不是L2)。
- 新方法尚未实现。目前无法通过yaml文件开启。一旦我们找到一个训练效果更好的环境,就会添加到配置中。
- 在tensorboard中添加了形状奖励图。
- 修复了SAC不使用save_frequency保存权重的错误。
- 为像Isaac Gym这样的GPU加速训练环境添加了多节点训练支持。无需更改训练脚本。感谢@ankurhanda和@ArthurAllshire的实现协助。
- 添加了训练过程中进行推理的评估功能。启用后,可以自动获取并更新训练过程中的检查点用于推理。
- 添加了用于运行时更新rl训练参数的get/set API。感谢@ArthurAllshire提供初始版本的快速PBT代码。
- 修复了SAC加载权重不正确的问题。
- 移除了不需要的Ray依赖。
- 为在RNN网络配置中使用已弃用的'seq_len'而不是'seq_length'添加了警告。
1.6.0
- 为离散和连续动作空间添加了ONNX导出colab示例。对于连续情况,还提供了LSTM策略示例。
- 改进了连续空间中RNN的训练,添加了
zero_rnn_on_done
选项。 - 添加了NVIDIA CuLE支持:https://github.com/NVlabs/cule
- 添加了player配置覆盖。Vecenv用于推理。
- 修复了使用中心值的多GPU训练。
- 修复了max_frames终止条件,以及它与线性学习率的交互:https://github.com/Denys88/rl_games/issues/212
- 修复了"deterministic"拼写错误问题。
- 修复了Mujoco和Brax SAC配置。
- 修复了多智能体环境统计报告。修复了Starcraft2 SMAC环境。
1.5.2
- 为SAC添加了观察值归一化。
- 恢复了自适应KL遗留模式。
1.5.1
- 修复了构建包问题。
1.5.0
- 添加了wandb支持。
- 添加了poetry支持。
- 修复了各种错误。
- 修复了字典观察值情况下cnn输入未除以255的问题。
- 添加了更多envpool mujoco和atari训练示例。一些结果:15分钟Mujoco人形机器人训练,2分钟atari乒乓。
- 添加了Brax和Mujoco colab训练示例。
- 添加了'seed'命令行参数。如果大于0,将覆盖配置中的种子。
- 弃用
horovod
,改用torch.distributed
(#171)。
1.4.0
- 添加了discord频道 https://discord.gg/hnYRq7DsQh :)
- 添加了envpool支持,并提供了几个atari示例。运行速度比ray快3-4倍。
- 添加了mujoco结果。比openai spinning up ppo结果好得多。
- 添加了tcnn(https://github.com/NVlabs/tiny-cuda-nn)支持。在IsaacGym环境中减少5-10%的训练时间。
- 各种修复和改进。
1.3.2
- 添加了'sigma'命令行参数。如果fixed_sigma为True,将覆盖连续空间的sigma。
1.3.1
- 修复了SAC不工作的问题
1.3.0
- 简化了rnn实现。运行稍慢但更加稳定。
- 现在如果策略是rnn,中心值可以不是rnn。
- 从yaml文件中移除了load_checkpoint。现在--checkpoint适用于训练和播放。
1.2.0
- 添加了Swish (SILU)和GELU激活函数,可以改善某些Isaac Gym环境的结果。
- 移除了tensorflow并初步清理了旧的/未使用的代码。
- 简化了runner。
- 现在网络在算法中使用load_network方法创建。
1.1.4
- 修复了当模拟和rl设备不同时,在播放(测试)模式下player崩溃的问题。
- 修复了各种多GPU错误。
1.1.3
- 修复了在播放(测试)模式下运行单个Isaac Gym环境时崩溃的问题。
- 添加了配置参数
clip_actions
用于关闭内部动作裁剪和重缩放
1.1.0
- 添加到pypi:
pip install rl-games
- 添加了报告环境(模拟)步骤fps的功能,不包括策略推理。改进了命名。
- 为提高可读性,在yaml配置中重命名:steps_num改为horizon_length,lr_threshold改为kl_threshold
故障排除
- 某些支持的环境不随setup.py一起安装,你需要手动安装它们
- 从rl-games 1.1.0开始,旧的yaml配置将与新版本不兼容:
steps_num
应更改为horizon_length
,lr_threshold
应更改为kl_threshold
已知问题
- 使用Isaac Gym运行单个环境可能导致崩溃,如果发生这种情况,请切换到至少2个并行模拟的环境