单机超越分布式?!强化学习新姿势,并行环境模拟器EnvPool实现速度成本双赢

2022 年 7 月 9 日 机器之心
机器之心专栏

机器之心编辑部

在训练强化学习智能体的时候,你是否为训练速度过慢而发愁?又是否对昂贵的大规模分布式系统加速望而却步?来自 Sea AI Lab 团队的最新研究结果表明,其实鱼和熊掌可以兼得:对于强化学习标准环境 Atari 与 Mujoco,如果希望在短时间内完成训练,需要采用数百个 CPU 核心的大规模分布式解决方案;而使用 EnvPool,只需要一台游戏本就能完成相同体量的训练任务,并且用时不到 5 分钟,极大地降低了训练成本。


目前, EnvPool  项目已在 GitHub 开源,收获超过 500 Stars,并且受到众多强化学习研究者的关注。

  • 项目地址:https://github.com/sail-sg/envpool
  • 在线文档:https://envpool.readthedocs.io/en/latest/
  • arXiv 链接:https://arxiv.org/abs/2206.10558

EnvPool 是一个基于 C++ 、高效、通用的强化学习并行环境(vectorized environment)模拟器 ,不仅能够兼容已有的 gym/dm_env API,还支持了多智能体环境。除了 OpenAI Gym 本身拥有的环境外,EnvPool 还支持一些额外的复杂环境。

目前支持的环境有:

  • Atari games
  • Mujoco(gym)
  • Classic control RL envs: CartPole, MountainCar, Pendulum, Acrobot
  • Toy text RL envs: Catch, FrozenLake, Taxi, NChain, CliffWalking, Blackjack
  • ViZDoom single player
  • DeepMind Control Suite

追求极致速度

EnvPool 采取了 C++ 层面的并行解决方案 。根据现有测试结果,使用 EnvPool 并行运行多个强化学习环境,能在正常笔记本上比主流的 Python Subprocess 解决方案快近 3 倍;使用多核 CPU 服务器能够达到更好的性能。

例如在 NVIDIA DGX-A100(256 核 CPU 服务器)上的测试结果表明,Atari 游戏能够跑出每秒一百多万帧的惊人速度,Mujoco 物理引擎的任务更是能跑出每秒三百多万模拟步数的好成绩,比 Python Subprocess 快近二十倍,比之前最快的 CPU 异步模拟器 Sample Factory 还快两倍。

与此同时,EnvPool + CleanRL 的整系统测试表明,使用原始的 PPO 算法,直接把原来基于 Python Subprocess 的主流解决方案替换成 EnvPool,整体系统在标准的 Atari 基准测试中能快近三倍!

标准测试结果表明,对于数量稍大(比如超过 32)的并行环境,Subprocess 的运行效率十分堪忧。

为此有研究者提出分布式解决方案(比如 Ray)和基于 GPU 的解决方案(比如 Brax 和 Isaac-gym)进行加速。分布式方案经过测试,计算资源利用率其实并不高;基于 GPU 的解决方案虽然可以达到千万 FPS,但并不是所有环境都能使用 CUDA 重写,不能很好兼容生态以及不能复用一些受商业保护的代码。

EnvPool 由于采用了 C++ 层面的并行解决方案,并且大部分强化学习环境都使用 C++ 实现来保证运行效率,因此只需要在 C++ 层面实现接口即可完成高效的并行。

打造开放生态

EnvPool 对上下游的生态都有着良好的支持:

  • 对于上游的强化学习环境而言,目前最多使用的是 OpenAI Gym,其次是 DeepMind 的 dm_env 接口。EnvPool 对两种环境 API 都完全支持,并且每次 env.step 出来的数据都是经过 numpy 封装好的,用户不必每次手动合并数据,同时也提高了吞吐量;
  • 对于下游的强化学习算法库而言,EnvPool 支持了目前 PyTorch 最为流行的两个算法库 Stable-baselines3 和 Tianshou,同时还支持了 ACME、CleanRL 和 rl_games 等强化学习算法库,并且达到了令人惊艳的效果(在笔记本电脑上,2 分钟训练完 Atari Pong、5 分钟训练完 Mujoco Ant/HalfCheetah,并且通过了 Gym 原本环境的验证)。

为了更好地营造生态, EnvPool 采用了 Bazel 进行构建,拥有完善的软件工程标准,也提供了高质量的代码、单元测试和在线文档

使用示例

以下是一些简单的 EnvPool 使用示例。首先导入必要的包:

import numpy as np, envpool

以 gym.Env 接口为例,初始化 100 个 Atari Pong 的并行环境,只需要一行代码:

env = envpool.make_gym("Pong-v5", num_envs=100)

访问 observation_space 和 action_space 和 Gym 如出一辙:

observation_space = env.observation_spaceaction_space = env.action_space

在同步模式下,API 与已有的 Gym API 无缝衔接,只不过第一维大小是并行环境个数:

obs = env.reset()  # should be (100, 4, 84, 84)act = np.zeros(100, dtype=int)obs, rew, done, info = env.step(act)

当然也可以只 step/reset 部分环境,只需多传一个参数 env_id 即可:

while True:  act = policy(obs)  obs, rew, done, info = env.step(act, env_id)  env_id = info["env_id"]

为了追求极致性能,EnvPool 还支持异步模式的 step/reset,于在线文档和论文中对此进行了详细阐述与实验。

实际体验效果

EnvPool 只需要一句命令 pip install envpool 就能安装,目前仅支持 Linux 操作系统并且 Python 版本为 3.7/3.8/3.9 。EnvPool 在短期内会对其他操作系统(Windows 和 macOS)进行支持。

在 EnvPool 的论文中,作者们给出了如下 rl_games 的惊艳结果:只用一台游戏本,在其他条件都完全相同的情况下,把基于 ray 的 vectorized env 实现直接换成 EnvPool,能够直接获得免费的加速。

Atari Pong 使用了 EnvPool,可以在大约 5 分钟的时候训练完成,相比而言 ray 的方案需要在大约 15 分钟的时候训练完成(达到接近 20 的 reward);Mujoco Ant 更为明显,使用原始 PPO 算法在不到 5 分钟的时间内达到了超过 5000 的 reward,而基于 ray 的解决方案运行了半小时还没达到 5000。



为了验证上述结果的真实性,我们尝试着运行了一下在 EnvPool README 提供的 colab 示例:

  • Pong:https://colab.research.google.com/drive/1iWFv0g67mWqJONoFKNWUmu3hdxn_qUf8?usp=sharing
  • Ant:https://colab.research.google.com/drive/1C9yULxU_ahQ_i6NUHCvOLoeSwJovQjdz?usp=sharing

我们找了台和论文 appendix 中与 rl_games 的实验类似配置的机子:

  • OS: Debian GNU/Linux 11 (bullseye) x86_64
  • Kernel: 5.16.0-0.bpo.4-amd64
  • CPU: AMD Ryzen 9 5950X (32) @ 3.400GHz
  • GPU: NVIDIA GeForce RTX 3080 Ti
  • Memory: 128800MiB

从 colab 的结果来看,Pong 跑到 200 个 epoch 结果已经收敛了,于是设置 200 个 epoch 跑测试,发现在这台测试机上运行代码,居然只需要要 2 分 17 秒就能跑完,并且 reward 能超过 19:


Ant 跑到 1000 个 epoch 结果差不多收敛了。设置 max_epochs 为 1000 之后运行,在 2 分 36 秒之后运行完毕,并且 reward 超过了 5300:



相比 RLLib 和 SeedRL 等工作,使用几百个 CPU 核心的分布式计算,EnvPool + rl_games 只用了单机做到了同样的效果(甚至更好),确实不错。

项目作者

Jiayi Weng(翁家翌)是强化学习算法库 Tianshou(天授)的第一作者,目前的研究兴趣主要是对机器学习与强化学习系统进行加速。该项目是他在 Sea AI Lab 的实习项目。CMU 硕士毕业后入职 OpenAI 当任 Research Engineer。

Min Lin(林敏)是 Network in network 的第一作者,在图灵奖获得者 Yoshua Bengio 下从事多年博士后研究,目前就职于 Sea AI Lab;

Shengyi Huang(黄晟益)是 CleanRL 的第一作者,目前在 Drexel University 攻读计算机博士学位。

Bo Liu(刘博)是 TorchOpt 的共同第一作者,目前在北京大学担任研究助理。

Denys Makoviichuk 是 rl_games 的第一作者,目前就职于 Snap 担任多年机器学习部门经理。

Viktor Makoviychuk 目前就职于 NVIDIA,是 Isaac-gym 的第一作者。

Zichen Liu (刘梓辰)就职于 Sea AI Lab,同时也是新加坡国立大学 NUS 的博士生。

Yufan Song(宋宇凡)、Ting Luo(罗婷)、Yukun Jiang(蒋宇昆)是 CMU MCDS 项目的在读学生。

Zhongwen Xu(徐仲文)曾在 DeepMind 担任 Research Scientist,目前就职于 Sea AI Lab。

Shuicheng Yan(颜水成),Sea AI Lab负责人、Sea集团首席科学家


© THE END 

转载请联系本公众号获得授权

投稿或寻求报道:content@jiqizhixin.com

登录查看更多
0

相关内容

《基于强化学习开发战斗行为》美国海军研究生院
专知会员服务
90+阅读 · 2022年6月27日
【CMU博士论文】机器人深度强化学习,128页pdf
专知会员服务
128+阅读 · 2020年8月27日
【强化学习】深度强化学习初学者指南
专知会员服务
179+阅读 · 2019年12月14日
实践教程 | PyTorch分布式测试踩坑小结
极市平台
19+阅读 · 2022年4月1日
可定制算法和环境,这个开源强化学习框架火了
机器之心
1+阅读 · 2021年11月20日
FedJAX:使用 JAX 进行联邦学习模拟
TensorFlow
3+阅读 · 2021年11月2日
借助新的物理模拟引擎加速强化学习
TensorFlow
1+阅读 · 2021年8月16日
Github 项目推荐 | YOLOv3 的最小化 PyTorch 实现
AI研习社
25+阅读 · 2018年5月31日
国家自然科学基金
20+阅读 · 2015年12月31日
国家自然科学基金
23+阅读 · 2014年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
3+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
1+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
国家自然科学基金
0+阅读 · 2008年12月31日
Arxiv
0+阅读 · 2022年9月6日
Arxiv
0+阅读 · 2022年9月4日
VIP会员
相关基金
国家自然科学基金
20+阅读 · 2015年12月31日
国家自然科学基金
23+阅读 · 2014年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
3+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
1+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
国家自然科学基金
0+阅读 · 2008年12月31日
Top
微信扫码咨询专知VIP会员