Open RL Benchmark 是一个综合性强化学习(RL)跟踪实验数据集。旨在帮助 RL 从业者便捷地从 Stable-baselines3、Tianshou、CleanRL 等主流 RL 库中拉取和对比各类指标。
可通过 pip 安装或使用开发环境。
pip install openrlbenchmark --upgrade
前置条件:
* Python >=3.10
* uv
git clone https://github.com/openrlbenchmark/openrlbenchmark.git
cd openrlbenchmark
uv sync
Open RL Benchmark 提供一个 RLops 命令行工具,用于从 Weights and Biases 拉取和对比指标。以下示例展示如何比较 SB3 的 ppo、a2c、ddpg、ppo_lstm、sac、td3、trpo 以及 CleanRL 的 sac 在 HalfCheetahBulletEnv-v0 上的表现。
uv run python -m openrlbenchmark.rlops \
--filters '?we=openrlbenchmark&wpn=cleanrl&ceik=env_id&cen=exp_name&metric=charts/episodic_return' \
'ppo_continuous_action?tag=v1.0.0-27-gde3f410&seed=1&seed=2&seed=3&cl=CleanRL PPO' \
--filters '?we=openrlbenchmark&wpn=baselines&ceik=env&cen=exp_name&metric=charts/episodic_return' \
'baselines-ppo2-mlp?cl=openai/baselines PPO2' \
--env-ids HalfCheetah-v2 Hopper-v2 Walker2d-v2 \
--env-ids HalfCheetah-v2 Hopper-v2 Walker2d-v2 \
--no-check-empty-runs \
--pc.ncols 3 \
--pc.ncols-legend 3 \
--rliable \
--rc.score_normalization_method maxmin \
--rc.normalized_score_threshold 1.0 \
--rc.sample_efficiency_plots \
--rc.sample_efficiency_and_walltime_efficiency_method Median \
--rc.performance_profile_plots \
--rc.aggregate_metrics_plots \
--rc.sample_efficiency_num_bootstrap_reps 10 \
--rc.performance_profile_num_bootstrap_reps 10 \
--rc.interval_estimates_num_bootstrap_reps 10 \
--output-filename static/0compare \
--scan-history
这里我们创建了多个过滤器。第一个过滤器的第一个字符串是 '?we=openrlbenchmark&wpn=cleanrl&ceik=env_id&cen=exp_name&metric=charts/episodic_return',这是一个查询字符串,指定了以下内容:
we:W&B 实体名称wpn:W&B 项目名称ceik:环境 ID 的自定义键cen:实验名称的自定义键metric:我们感兴趣的指标第一个过滤器的第二个字符串是 'ppo_continuous_action?tag=v1.0.0-27-gde3f410&seed=1&seed=2&seed=3&cl=CleanRL PPO',这是一个查询字符串,指定了以下内容:
exp_name:我们感兴趣的实验名称,例如本例中的 ppo_continuous_actiontag:我们感兴趣的标签params:感兴趣的参数或配置,例如 seedkey 或 key.value 索引。因此,在尝试索引 https://wandb.ai/openrlbenchmark/cleanrl/runs/1bvy71i6/overview 中的此参数时,seed 或 seed.value 可能是正确的键。然而,对于嵌套配置,正确的引用必须遍历结构,例如使用 trl_ppo_trainer_config.value.lam 来索引 lam 参数。要查看完整配置,请单击 W&B 实验概览页面配置部分上的“查看原始数据”按钮,例如 https://wandb.ai/costa-huang/cleanRL/runs/3nhnaboz/overview 上可用的内容。ceik)和实验名称(cen))的自定义键遵循与参数相同的索引约定。因此,我们从 https://wandb.ai/openrlbenchmark/cleanrl 获取指标。环境 ID 存储在 env_id 键中,实验名称存储在 exp_name 键中。我们感兴趣的指标是 charts/episodic_return。
类似地,我们从 https://wandb.ai/openrlbenchmark/baselines 获取指标。环境 ID 存储在 env 键中,实验名称存储在 exp_name 键中。我们感兴趣的指标是 charts/episodic_return。您还可以通过 cl 查询字符串自定义图例,例如 baselines-ppo2-mlp?cl=openai/baselines PPO2。
图的标签可以通过 --pc.xlabel 和 --pc.ylabel 标志自定义。您还可以使用 --pc.max_steps 指定要绘制的最大时间步数。--pc.ncols 标志指定图中的列数。--pc.ncols-legend 标志指定图例中的列数。--output-filename 标志指定输出图的文件名。
--rliable 启用我们的 rliable 集成,其配置可以通过 --rc 进行调整。上述命令生成以下图像:






--report 标签还会生成一个 wandb 报告。
该命令还会在当前目录中生成 compare.png、compare.md 和 compare.csv。
学习曲线: compare.png 显示学习曲线,该曲线对 10000 个数据点进行子采样并进行插值。曲线通过窗口大小为 100 的滚动平均值进行平滑处理,其阴影区域代表标准差。
结果表: compare.md 和 compare.csv 显示最后 100 个情节的平均情节回报。对于每个随机种子 $i$(每组实验我们有 3 个随机种子),我们计算最后 100 个训练情节的平均情节回报,记为 $a_i$。然后我们对所有随机种子的 $a_i$ 求平均值,得到最终的平均情节回报,并报告其标准差。这种评估方法被称为隐式评估方法(Machado et al., 2017),它更符合 RL 的总体目标——持续学习。与评估最佳模型的评估方法相比,此方法还能检测出灾难性遗忘的问题。
警告
我们建议使用--scan-history,它会拉取所有数据点,但最初会缓存数据,可能需要一些时间才能运行。如果不使用--scan-history,它将仅从 wandb 随机拉取 500 个数据点,这可能会在每次运行命令时生成不同的学习曲线。
我们引入了一个实验性的离线模式。有时即使使用 --scan-history 缓存,如果环境或实验太多,脚本仍可能需要很长时间。这是因为我们在后台仍然调用了许多 wandb.Api().runs(..., filters)。
不过不用担心。当使用 --scan-history 运行时,我们还会自动构建一个本地 sqlite 数据库来存储运行的元数据。然后,您可以运行 python -m openrlbenchmark.rlops ... --scan-history --offline 来生成图像,而无需访问互联网。这应该也会大大加快绘图过程。我们仍在努力改进离线模式,因此如果您遇到任何问题,请告知我们。
ceik:env_idcen:exp_name(例如,sac_continuous_action,ppo_continuous_action,ppo_atari)metric:charts/episodic_returnceik:envcen:algo(例如,sac,ppo,a2c)metric:rollout/ep_rew_mean 或 eval/mean_rewardceik:env_namecen:algo(例如,sac)metric:training/return 或 evaluation/average_returnsceik:envcen:alg(例如,ppo2)metric:charts/episodic_return 或 eprewmeanceik:envcen:alg(例如,sac,tqc)metric:rollout/ep_rew_mean 或 eval/mean_rewardceik:taskcen:algo_name(例如,ppo,iqn)metric:test/rewardceik:env_idcen:algo(例如,PGMORL,PCN)metric:eval/hypervolume,eval/igd,eval/sparsity,eval/eum,eval/mul以下库有一些记录在案的实验:
ceik:env_namecen:arch(shared)metric:charts/episodic_returnceik:envcen:policy(例如,TD3)metric:charts/episodic_returnopenai/baselines 的 PPO2:有时,相同的环境在不同库中可能具有不同的名称。例如,openai/baselines 使用 BreakoutNoFrameskip-v4,而 EnvPool 使用 Breakout-v5。要比较这两个库,我们需要为每个过滤器指定相应的 env_ids。
对于 Atari 游戏,我们可以切换 --rc.score_normalization_method atari 选项,以使用人类标准化分数进行 rliable 分析。
python -m openrlbenchmark.rlops \
--filters '?we=openrlbenchmark&wpn=baselines&ceik=env&cen=exp_name&metric=charts/episodic_return' 'baselines-ppo2-cnn' \
--filters '?we=openrlbenchmark&wpn=envpool-atari&ceik=env_id&cen=exp_name&metric=charts/avg_episodic_return' 'ppo_atari_envpool_xla_jax_truncation' \
--env-ids AlienNoFrameskip-v4 AmidarNoFrameskip-v4 AssaultNoFrameskip-v4 AsterixNoFrameskip-v4 AsteroidsNoFrameskip-v4 AtlantisNoFrameskip-v4 BankHeistNoFrameskip-v4 BattleZoneNoFrameskip-v4 BeamRiderNoFrameskip-v4 BerzerkNoFrameskip-v4 BowlingNoFrameskip-v4 BoxingNoFrameskip-v4 BreakoutNoFrameskip-v4 CentipedeNoFrameskip-v4 ChopperCommandNoFrameskip-v4 CrazyClimberNoFrameskip-v4 DefenderNoFrameskip-v4 DemonAttackNoFrameskip-v4 DoubleDunkNoFrameskip-v4 EnduroNoFrameskip-v4 FishingDerbyNoFrameskip-v4 FreewayNoFrameskip-v4 FrostbiteNoFrameskip-v4 GopherNoFrameskip-v4 GravitarNoFrameskip-v4 HeroNoFrameskip-v4 IceHockeyNoFrameskip-v4 PrivateEyeNoFrameskip-v4 QbertNoFrameskip-v4 RiverraidNoFrameskip-v4 RoadRunnerNoFrameskip-v4 RobotankNoFrameskip-v4 SeaquestNoFrameskip-v4 SkiingNoFrameskip-v4 SolarisNoFrameskip-v4 SpaceInvadersNoFrameskip-v4 StarGunnerNoFrameskip-v4 SurroundNoFrameskip-v4 TennisNoFrameskip-v4 TimePilotNoFrameskip-v4 TutankhamNoFrameskip-v4 UpNDownNoFrameskip-v4 VentureNoFrameskip-v4 VideoPinballNoFrameskip-v4 WizardOfWorNoFrameskip-v4 YarsRevengeNoFrameskip-v4 ZaxxonNoFrameskip-v4 JamesbondNoFrameskip-v4 KangarooNoFrameskip-v4 KrullNoFrameskip-v4 KungFuMasterNoFrameskip-v4 MontezumaRevengeNoFrameskip-v4 MsPacmanNoFrameskip-v4 NameThisGameNoFrameskip-v4 PhoenixNoFrameskip-v4 PitfallNoFrameskip-v4 PongNoFrameskip-v4 \
--env-ids Alien-v5 Amidar-v5 Assault-v5 Asterix-v5 Asteroids-v5 Atlantis-v5 BankHeist-v5 BattleZone-v5 BeamRider-v5 Berzerk-v5 Bowling-v5 Boxing-v5 Breakout-v5 Centipede-v5 ChopperCommand-v5 CrazyClimber-v5 Defender-v5 DemonAttack-v5 DoubleDunk-v5 Enduro-v5 FishingDerby-v5 Freeway-v5 Frostbite-v5 Gopher-v5 Gravitar-v5 Hero-v5 IceHockey-v5 PrivateEye-v5 Qbert-v5 Riverraid-v5 RoadRunner-v5 Robotank-v5 Seaquest-v5 Skiing-v5 Solaris-v5 SpaceInvaders-v5 StarGunner-v5 Surround-v5 Tennis-v5 TimePilot-v5 Tutankham-v5 UpNDown-v5 Venture-v5 VideoPinball-v5 WizardOfWor-v5 YarsRevenge-v5 Zaxxon-v5 Jamesbond-v5 Kangaroo-v5 Krull-v5 KungFuMaster-v5 MontezumaRevenge-v5 MsPacman-v5 NameThisGame-v5 Phoenix-v5 Pitfall-v5 Pong-v5 \
--no-check-empty-runs \
--pc.ncols 5 \
--pc.ncols-legend 2 \
--rliable \
--rc.score_normalization_method atari \
--rc.normalized_score_threshold 8.0 \
--rc.sample_efficiency_plots \
--rc.sample_efficiency_and_walltime_efficiency_method Median \
--rc.performance_profile_plots \
--rc.aggregate_metrics_plots \
--rc.sample_efficiency_num_bootstrap_reps 50000 \
--rc.performance_profile_num_bootstrap_reps 2000 \
--rc.interval_estimates_num_bootstrap_reps 2000 \
--output-filename static/cleanrl_vs_baselines_atari \
--scan-history
此外,--rliable 集成会生成 cleanrl_vs_baselines_iqm_profile.png(四分位均值 (IQM) 和性能概况(Agarwal et al., 2022))和 cleanrl_vs_baselines_hns_aggregate.png(带分层自举置信区间的聚合人类标准化分数(请参阅 @araffin 的精彩博文解释)。






openai/baselines 的 PPO2 和 jaxrl 的 SAC:python -m openrlbenchmark.rlops \
--filters '?we=openrlbenchmark&wpn=baselines&ceik=env&cen=exp_name&metric=charts/episodic_return' 'baselines-ppo2-mlp' \
--filters '?we=openrlbenchmark&wpn=cleanrl&ceik=env_id&cen=exp_name&metric=charts/episodic_return' 'ppo_continuous_action?tag=v1.0.0-27-gde3f410' \
--filters '?we=openrlbenchmark&wpn=jaxrl&ceik=env_name&cen=algo&metric=training/return' 'sac' \
--env-ids HalfCheetah-v2 Walker2d-v2 Hopper-v2 InvertedPendulum-v2 Humanoid-v2 Pusher-v2 \
--no-check-empty-runs \
--pc.ncols 3 \
--pc.ncols-legend 3 \
--output-filename static/baselines_vs_cleanrl_vs_jaxrl \
--scan-history

实验性!API 可能更改。
有时您希望同时比较多个指标。
python -m openrlbenchmark.rlops_multi_metrics \
--filters '?we=openrlbenchmark&wpn=cleanrl&ceik=env_id&cen=exp_name&metrics=charts/episodic_return&metrics=charts/episodic_length&metrics=charts/SPS&metrics=losses/actor_loss&metrics=losses/qf1_values&metrics=losses/qf1_loss' \
'ddpg_continuous_action?tag=pr-371' \
'ddpg_continuous_action?tag=pr-299' \
'ddpg_continuous_action?tag=rlops-pilot' \
'ddpg_continuous_action_jax?tag=pr-371-jax' \
'ddpg_continuous_action_jax?tag=pr-298' \
--env-ids HalfCheetah-v2 Hopper-v2 Walker2d-v2 \
--no-check-empty-runs \
--pc.ncols 3 \
--pc.ncols-legend 2 \
--output-filename static/multi-metrics \
--scan-history --offline

openai/baselines 的 PPO2:python -m openrlbenchmark.rlops \
--filters '?we=tianshou&wpn=atari.benchmark&ceik=task&cen=algo_name&metric=test/reward' 'iqn' 'ppo' 'rainbow' 'fqf' 'c51' 'dqn' 'qrdqn' \
--filters '?we=openrlbenchmark&wpn=baselines&ceik=env&cen=exp_name&metric=charts/episodic_return' 'baselines-ppo2-cnn' \
--env-ids BreakoutNoFrameskip-v4 SpaceInvadersNoFrameskip-v4 SeaquestNoFrameskip-v4 MsPacmanNoFrameskip-v4 EnduroNoFrameskip-v4 PongNoFrameskip-v4 QbertNoFrameskip-v4 \
--no-check-empty-runs \
--pc.ncols 4 \
--pc.ncols-legend 4 \
--output-filename static/baselines_vs_tianshou --scan-history

openai/phasic-policy-gradient 的 PPG:python -m openrlbenchmark.rlops \
--filters '?we=openrlbenchmark&wpn=phasic-policy-gradient&ceik=env_name&cen=arch&metric=charts/episodic_return' 'shared' \
--filters '?we=openrlbenchmark&wpn=cleanrl&ceik=env_id&cen=exp_name&metric=charts/episodic_return' 'ppo_procgen?tag=v1.0.0b1-4-g4ea73d9' 'ppg_procgen?tag=v1.0.0b1-4-g4ea73d9' \
--env-ids starpilot bossfight bigfish \
--no-check-empty-runs \
--pc.ncols 3 \
--pc.ncols-legend 3 \
--output-filename static/ppg_vs_cleanrl \
--scan-history

sfujim/TD3 的 TD3:python -m openrlbenchmark.rlops \
--filters '?we=openrlbenchmark&wpn=sfujim-TD3&ceik=env&cen=policy&metric=charts/episodic_return' 'TD3' \
--filters '?we=openrlbenchmark&wpn=cleanrl&ceik=env_id&cen=exp_name&metric=charts/episodic_return' 'td3_continuous_action_jax?tag=pr-285' 'ddpg_continuous_action_jax?tag=pr-298' \
--env-ids HalfCheetah-v2 Walker2d-v2 Hopper-v2 \
--no-check-empty-runs \
--pc.ncols 3 \
--pc.ncols-legend 3 \
--output-filename static/td3_vs_cleanrl \
--scan-history

注意使用 --pc.max_steps 400000 调整时间步数。
python -m openrlbenchmark.rlops_multi_metrics \
--filters '?we=openrlbenchmark&wpn=MORL-Baselines&ceik=env_id&cen=algo&metrics=eval/hypervolume&metrics=eval/sparsity&metrics=eval/eum' \
'PGMORL?cl=PGMORL' \
'CAPQL?cl=CAPQL' \
'GPI-LS Continuous Action?cl=GPI-LS' \
'GPI-PD Continuous Action?cl=GPI-PD' \
--env-ids mo-halfcheetah-v4 mo-hopper-2d-v4 \
--pc.ncols 2 \
--pc.ncols-legend 4 \
--pc.xlabel 'Training steps' \
--pc.ylabel '' \
--pc.max_steps 400000 \
--output-filename morl/morl_continuous \
--scan-history


python -m openrlbenchmark.hns --files static/cleanrl_vs_baselines.csv static/machado_10M.csv static/machado_50M.csv
baselines-ppo2-cnn ({})
┣━━ median hns: 0.7959851540635047
┣━━ mean hns: 4.54588939893709
ppo_atari_envpool_xla_jax_truncation ({})
┣━━ median hns: 0.9783505154639175
┣━━ mean hns: 6.841083973256849
ppo_atari_envpool_xla_jax_truncation_machado_10M ({})
┣━━ median hns: 0.7347972972972973
┣━━ mean hns: 2.919095857954249
ppo_atari_envpool_xla_jax_truncation ({'metric': ['charts/avg_episodic_return']})
┣━━ median hns: 0.9783505154639175
┣━━ mean hns: 6.841083973256849
ppo_atari_envpool_xla_jax_truncation_machado ({'metric': ['charts/avg_episodic_return']})
┣━━ median hns: 1.5679929625118418
┣━━ mean hns: 8.352308370550299
这是一个我们正在缓慢推进的项目。没有具体的时间表或路线图,但如果你想参与其中,欢迎联系我或提出 Issue。我们正在寻找志愿者来帮助我们完成以下工作:
如果你在你的工作中使用了本软件,请使用以下引用信息。
@article{Huang_Open_RL_Benchmark_2024,
title = {{Open RL Benchmark: Comprehensive Tracked Experiments for Reinforcement Learning}},
author = {Huang, Shengyi and Gallouédec, Quentin and Felten, Florian and Raffin, Antonin and Dossa, Rousslan Fernand Julien and Zhao, Yanxiao and Sullivan, Ryan and Makoviychuk, Viktor and Makoviichuk, Denys and Danesh, Mohamad H. and Roumégous, Cyril and Weng, Jiayi and Chen, Chufan and Rahman, Md Masudur and M. Araújo, João G. and Quan, Guorui and Tan, Daniel and Klein, Timo and Charakorn, Rujikorn and Towers, Mark and Berthelot, Yann and Mehta, Kinal and Chakraborty, Dipam and KG, Arjun and Charraut, Valentin and Ye, Chang and Liu, Zichen and Alegre, Lucas N. and Nikulin, Alexander and Hu, Xiao and Liu, Tianlin and Choi, Jongwook and Yi, Brent},
journal = {arXiv preprint arXiv:2402.03046},
year = {2024},
url = {https://arxiv.org/abs/2402.03046}
}