OA0
OA0 是一个探索 AI 的社区
现在注册
已注册用户请  登录
OA0  ›  代码  ›  OpenRLBenchmark — 强化学习实验对比与可视化基准工具

OpenRLBenchmark — 强化学习实验对比与可视化基准工具

 
  titan ·  2026-07-12 11:00:20 · 1 次点击  · 0 条评论  

Open RL Benchmark:强化学习的全面跟踪实验


Code style: black
Imports: isort
Open In Colab

Open RL Benchmark 是一个综合性强化学习(RL)跟踪实验数据集。旨在帮助 RL 从业者便捷地从 Stable-baselines3、Tianshou、CleanRL 等主流 RL 库中拉取和对比各类指标。

安装

可通过 pip 安装或使用开发环境。

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_action
  • tag:我们感兴趣的标签
  • params:感兴趣的参数或配置,例如 seed
  • 由于 W&B 处理嵌套配置数据的方式,参数的确切键可能会有所不同。大多数情况下,参数可以直接通过其 keykey.value 索引。因此,在尝试索引 https://wandb.ai/openrlbenchmark/cleanrl/runs/1bvy71i6/overview 中的此参数时,seedseed.value 可能是正确的键。然而,对于嵌套配置,正确的引用必须遍历结构,例如使用 trl_ppo_trainer_config.value.lam 来索引 lam 参数。要查看完整配置,请单击 W&B 实验概览页面配置部分上的“查看原始数据”按钮,例如 https://wandb.ai/costa-huang/cleanRL/runs/3nhnaboz/overview 上可用的内容。
  • 用于引用特定配置(例如环境 ID(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.pngcompare.mdcompare.csv

学习曲线: compare.png 显示学习曲线,该曲线对 10000 个数据点进行子采样并进行插值。曲线通过窗口大小为 100 的滚动平均值进行平滑处理,其阴影区域代表标准差。

结果表: compare.mdcompare.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 来生成图像,而无需访问互联网。这应该也会大大加快绘图过程。我们仍在努力改进离线模式,因此如果您遇到任何问题,请告知我们。

当前支持的库

  • CleanRL
    • ceikenv_id
    • cenexp_name(例如,sac_continuous_actionppo_continuous_actionppo_atari
    • metriccharts/episodic_return
  • Stable-baselines3
    • ceikenv
    • cenalgo(例如,sacppoa2c
    • metricrollout/ep_rew_meaneval/mean_reward
  • ikostrikov/jaxrl
    • ceikenv_name
    • cenalgo(例如,sac
    • metrictraining/returnevaluation/average_returns
  • baselines
    • ceikenv
    • cenalg(例如,ppo2
    • metriccharts/episodic_returneprewmean
  • sbx
    • ceikenv
    • cenalg(例如,sactqc
    • metricrollout/ep_rew_meaneval/mean_reward
  • Tianshou
    • ceiktask
    • cenalgo_name(例如,ppoiqn
    • metrictest/reward
  • MORL-Baselines
    • ceikenv_id
    • cenalgo(例如,PGMORLPCN
    • metriceval/hypervolumeeval/igdeval/sparsityeval/eumeval/mul

以下库有一些记录在案的实验:

  • openai/phasic-policy-gradient(有一些指标)
    • ceikenv_name
    • cenarchshared
    • metriccharts/episodic_return
  • sfujim/TD3(有一些指标)
    • ceikenv
    • cenpolicy(例如,TD3
    • metriccharts/episodic_return

更多示例

在 Atari 游戏上比较 CleanRL 的 PPO 与 openai/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 的精彩博文解释)。






在 Mujoco 上比较 CleanRL 的 PPO、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

在 Atari 上比较 Tianshou 的算法与 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

在 procgen 上比较 CleanRL 的 PPG、PPO 与 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

在 Mujoco 上比较 CleanRL 的 TD3 与 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

比较 MORL Baselines 算法

注意使用 --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。我们正在寻找志愿者来帮助我们完成以下工作:

  • 添加来自其他库的实验
  • 为当前支持的库运行更多实验
  • 文档和设计标准
  • 下载跟踪实验的 TensorBoard 指标并在本地加载以节省时间

引用

如果你在你的工作中使用了本软件,请使用以下引用信息。

@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}
}
1 次点击  ∙  0 人收藏  
登录后收藏  
0 条回复
关于 ·  帮助 ·  PING ·  隐私 ·  条款   
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
耗时 22 ms
Developed with Cursor