比如,支持灵活的环境定义,模型定义,多机多卡训练,包含多种常见的强化学习演算法,样例丰富等等


本科毕设中期之前摸鱼凑数的成果,自卖自夸一波:

https://github.com/thu-ml/tianshou?

github.com

这个小轮子代码少(目前除去atari和mujoco的wrapper之后,7个演算法加上replay buffer在符合pep8规范下一共1100行),实现简单,速度还挺快,平均10秒内一个PG/DQN/A2C在CartPole,反观某些平台代码又臭又长100万step花一个小时还train不出来(狗头保命

下图是一个三秒在我自己笔记本上用PG train出来的CartPole,其实还有更快的(有1.6s一个DQN的)但就这样吧,再录一次屏幕有些麻烦:(正式训练之前等待大概三秒我测了测是net.to(cuda)要申请一堆内存所花的时间)

说一下其他框架我认为的不足之处:(反正我今后再也不发RL的paper,直接在这里开始喷了

  1. OpenAI Baselines: 代码写的和***一样早有听人耳闻,各种不遵守规范乱来,函数调来调去也就算了,我train一个DQN都很难train上去……大概是我太菜了8
  2. rllib:不得不说是一个很好的框架,但是包的也太heavy了,class一层包一层,果然是Google的风格和TensorFlow有的一拼,想要更改某一个演算法的某一个地方要读一圈代码+费好大劲才能改……大概还是我太菜了8

这两个应该是RL平台star最多的两个了,其他比如Spinning up支持的演算法有限(只有Policy-based一块的),Dopamine 好像只有DQN那一个family的。

只针对PyTorch的:PyTorch目前的RL实现还没做到像rllib那么成熟,有几个分散的实现但我觉得不是太好,而且没有做到真正模块化。其实用PyTorch写RL代码真的要比Tensorflow少太太太太太太太多了!

  1. PyTorch DRL 是GitHub我找了一圈之后PyTorch RL平台Star最多的,侧重于实现hierarchical RL的演算法,但是代码emmm和baseline好像几乎是同一个风格……还难改!(2.3K star我真的不知道怎么来的,可能就是时间早?
  2. rlpyt是PyTorch RL star第二多的,目前(15000行)实现的功能和我没到1500行代码实现的功能几乎一样,代码也是一层包一层,继承了一堆theano的历史代码,文档不全,我想改example跑gym的cartpole都跑不起来……用户体验不太行,但也至少比上面那个好一些。

剩下的就没对比了,结果在这里:

Tianshou的优势:

  1. 实现简洁,不拖泥带水,是一看就懂的那种轻量级框架,方便修改来实现idea水paper和Berkeley争抢一席之地(x
  2. 速度快,在已有的toy scenarios上面完胜所有其他平台,夸张到比如3秒一个Policy Gradient连我自己第一次跑出来都不敢相信
  3. 模块化,把所有policy都拆成4个模块,只要完善了这些给定的介面就能在100行之内完整实现一个强化学习演算法
  4. 可复现性:我把GitHub Actions给用起来了,每一次单元测试除了基本功能的测试之外,还包括针对所有演算法的完整训练过程,也就是说一旦有一个演算法没办法train出来,单元测试不给过。据我所知,目前RL平台应该没一个敢这么干的(因为都太慢了
  5. 介面灵活:用户可以定制各种各样的training方法,而且没几行就能实现,可以参考这里

欢迎大家使用天授这个小轮子,它会近期(&等我先水过0331毕设中期答辩之后&已经划水飘过了)完善所有文档和教程,增加更多的example(比如更大规模的atari),目前虽然只实现了model-free,但是一些诸如Multi-agent的功能也会添加(&因为这是我毕设一定要搞的东西……搞不出来就GG&)和导师商量了下可以all in tianshou了!

最后如果您觉得它好用,给个GitHub star如何?别光点赞,谢谢各位大哥大姐(鞠躬

也许Tianshou还不是最好用的那个,但是它会朝著这个方向前进。以及顺带感谢学弟 @张鸣昊 帮忙写了些example和上手测评了一下。

看机器之心下面有人对project名称有误会……是这样的:百度百科 - 天授,取天授的意思是没有「老师」来教,而是自己通过跟环境交互学习的。

完整版故事在这里:https://mp.weixin.qq.com/s/68r8evMK2t1zE-qs81WVGQ,其实也就是评论区内容...

update:marl已加,今天下午(7.22)发新版本0.2.5

自定义环境请先阅读这个:https://tianshou.readthedocs.io/en/stable/tutorials/cheatsheet.html#user-defined-environment-and-different-state-representation


以下回答纯属个人认知,欢迎交流讨论~

paper方面我调研过Scalable/Distributed RL的相关的演算法(Ape-X,R2D2,IMPALA,A3C,G-A3C,SEED_RL,Agent57等);框架库方面我因为项目需要也做过一定的调研,也基于很多轮子进行了一些使用。因此我觉得我应该可以给题主分享一些经验

我觉得一开始题主要明确两个问题:「大规模/分散式」对与你来说具体指哪方面?你需要的大规模/分散式到什么程度?然后需要基于上面的结论根据你做的research或者项目来思考:「我需要做到什么程度的框架」。我们来依次讨论这两方面的问题

我了解的大规模/分散式目前主要有三方面:

  1. 环境的并行:这里我特指单机条件下使用wrapper对环境进行封装,使得可以同时运行很多环境,打batch使用网路进行inference。当然这个其实不怎么算大规模,不过一般的Research我觉得可能环境并行就差不多了,上升不到真正的大规模
  2. Actor的并行:这里主要是值Ape-X、A3C等Scalable RL演算法中的Actor,其作用主要是在每个机器/线程上运行一个Actor同若干数量的envs进行交互来收集数据
  3. Learner并行:这里主要是类似分散式深度学习,基於单机多卡或者多机多卡进行大batch的训练

大规模强化学习我觉得本质上首先需要在工程上解决「高效快速收集大规模数据」的问题,然后才是从演算法角度解决「基于大规模数据进行高效神经网路训练」。下面说一下支持上面三种层面我推荐的相关库

环境并行:环境的并行一般来说取决于你做的问题:假如你做的是Atari、Mujoco这种,其实绝大多数库都提供了相关的wrapper,一般是基于多进程/线程来同时跑若干个环境,最后提供一个vector_envs;如果你只是觉得DQN类演算法基于一个环境交互训练太慢需要多几个环境同时交互那我觉得大多数框架基本上都可以满足需求。也就说如果你就是要在在单机多核单卡的机器上跑rl演算法,更加需要关注的反而是这个框架有没有实现你想看想改的演算法,复现了之后能不能打平paper里面的benchmark。这里我推荐几个repo,基本上复现的演算法不少,效果有一定保证。

  • openai的baselines,还有第三方复现的stable baselines:优点是经典RL演算法均有复现,是很多Research跑benchmark都使用的repo;缺点是太工程化,套娃严重,想读懂需要话很长时间,修改的话也比较费事,而且据我周围的人说貌似openai复现的dqn效果不是特别好
  • openai的spinningup:里面提供了经典Policy-based演算法的复现,优点是写的通俗易懂上手简单,并且效果有保障,而且同时tf和Pytorch的支持;缺点是没有value-based的演算法,做DQN系列的就没办法了
  • Intel AI LAB的Coach:这是一个基于tf1.14的rl库,实现了经典RL演算法,甚至有一些上面两个没实现的演算法它也实现了。优点我觉得是他对RL Framework的设计很模块化,比如整体流程,演算法模块定义,网路定义,探索策略定义等等,把常见的演算法全部分成相互独立的模块拼接到一起,让研究人员可以高效的focus到要修改的地方而不需要考虑其他部分。建议题主可以看一下他的design doc看看适不适合你的需求,同时也支持分散式和AWS训练等,支持绝大多数游戏环境;缺点的话可能是模块化的有点死,看代码学习结构的时候有点不太友好
  • Google的dopamine,实现了Distributional DQN的一系列演算法,其他演算法没有
  • UCB两个大佬开源的rlpyt:专门基于pytorch实现的rl框架,有单机/多机分配资源的黑科技,挂arxiv的paper里面介绍的也效果也不错。contributor以前也写过如何加速DQN训练的调参方法
  • Kei Ohta开源tf2rl:感觉和上面这个差不太多,基于的是tf2.0。我只看过里面实现的Ape-x,所以不过多介绍

Actor并行和Learner并行:如果你要做的演算法就是类似Scalable RL topic的新演算法,或者你使用的环境有运行限制(比如一台机器只能运行一个环境,我真的遇到过这种……),或者你的机器是单机多卡核数不多导致并行效率很慢但是你有其他的多CPU机器可以单独进行数据收集,那这种情况下你需要考虑的就是怎么在多机多核环境下并行运行很多环境,然后把分散式的数据收集起来。这个领域目前通用性高一些的据我了解主要是ray还有这两年在NIPS仿生骨骼人挑战上蝉联冠军的PARL。这些环境都可以单机多核和多机多核方便的拓展

  • Ray(含RLlib,tune)是UCB基于通用RL框架设计的框架,优点是涵盖了你能想到的一切有关RL可能用到的东西,包括使用redis进行Remote Procedure Call,distributed tf/pytorch,超参搜索调优,自定义trainer/environment/optimizer/policy。里面复现了Ape-X,D4PG,A3C,IMPALA,APPO,MADDPG,ES等演算法(Scalable RL+Multi-Agent),效果也有保障,你只要学会了其实现思路分散式演算法它都能搞定;缺点就是因为太大太general导致上手很困难,我看了rllib部分的源码
  • PARL:百度出品,基于PaddlePaddle的RL框架,其核心卖点一是使用了黑科技可以消除python多线程GIL锁的限制,使得可以高效利用多核CPU来环境并行。本质是还是基于RPC那一套让环境和agent step可以在远程集群上运行从而不使用本地资源。经过测试PARL的吞吐效率是比Ray高一些的,可能得益于其黑科技外加简易RPC流程(PARL使用的是zmq+pyarrow序列化简单object,ray可以序列化更加复杂的object),另外PARL里面也定义了Agent、Model、Algorithm类让研究人员高效修改演算法。核心卖点二是PARL里面复现的演算法是100%保证和paper里面的数值差不多的,这点其实我觉得大多数repo并不能做到这一点,恰恰对修改经典演算法做Research来说这点反而额外重要;至于缺点可能就是要学PaddlePaddle,虽然目前里面增加了pytorch但是复现的演算法还很少

在一些项目里面其实可能需要的是ray/PARL里面提供的远程通讯轮子而非全部,大规模并行的收集数据可能演算法研发更加重要(纯属个人观点)

其他大规模分散式repo:按照我调研过的Scalable RL演算法来看,目前业界主流使用的基本都是基于Apex-X、R2D2的Actor-Learner-Buffer框架或者是类似IMPALA的框架,因此其实有很多repo都基于这两个两个演算法进行复现,也就是说是没有其他演算法就只有R2D2或者IMPALA,我也给题主推荐几个我调研过的repo,首先声明这两个我没有具体跑过,只是看了一下arxiv挂的paper,感觉还不错^_^,至少大厂出品品质有保证

  • Google Research的SEED_RL:ICLR2020 google的提出的分散式框架,在repo中基于Atari,google-football,DM Lab环境复现了R2D2和IMPALA,而且耗时更短,主要原因是他们让环境集中step,基于gRPC每次返回很大batch的state,然后把inference和training都放在TPU上面(详情可以去读他们的paper)
  • Facebok AI Research的TorchBeast:也挂了arxiv,主要是基于python pytorch复现了IMPALA,支持单机和多机,通信部分和batch 打包部分是基于C++写的,他们的目标是让研究者只需要关注python演算法部分
  • Facebook AI Research的ELF(pytorch官方也实现了一个简易版只针对围棋的ELF):田渊栋大神的代表作之一,适用于RTS的分散式训练框架。具体可以看repo里面的tutorial

另外额外提一个repo,NVIDIA Lab的CuLE:把Atari全部放到了GPU上面,一块卡可以跑上千个环境,官方提供了一些examples,其中基于CuLE的A2C+VTrace,一块卡,在Pong游戏上3min跑到19分。如果是做Atari的话可以考虑一下这个(详情见repo中提到的paper)

总结一下,没有所谓的「最好的大规模强化学习框架」,只能说基于题主你的需求来选框架,你需要什么程度的并行,然后希望框架做到什么程度,甚至可能出现市面上开源框架都不符合你要求的情况,这种情况可能就只能基于RPC通讯的轮子自己造框架的了。比如近几年几家大厂(OpenAI,DeepMind,腾讯等)在现实游戏(Dota2,SC2,王者荣耀等)上面的进展,都是肯定要自研框架的。题主如果是偏Research的话可能要根据研究的topic,使用的环境等方面来选择框架;如果是有很多机器来完成一些项目的话可能需要根据项目的实际情况来确定并行程度再来看市面上的框架有没有适合的。当然我上面提到的RL框架一定是不全的,只是基于我的调研给题主进行的推荐,而且其实还有很多个人实现的repo但是我发现都没有什么可复现性保证和比较广的演算法覆盖范围所以就没推荐了,可能会有更好的框架,如果题主发现了记得告诉我一下~


强烈不推荐openAI的codebase

Github上写得清晰的baseline多起来了就应该淘汰根本没有可用性的轮子。


推荐一下Agent Learning Framework(ALF) 不敢说最好用的,不过个人觉得还算比较好用

之前在地平线时参与的项目https://github.com/hobotrl/hobotrl/tree/master/hobotrl 后期变成 Agent Learning Framework https://github.com/HorizonRobotics/alf

ALF由徐伟老师(百度杰出科学家,PaddlePaddle项目的核心创始人和曾经的负责人)亲自操刀。具体支持的演算法和特性可以参见页面。一方面,框架的工程实现非常好,容易部署、方便大规模训练。另一方面,框架的抽象非常到位,方便复用演算法中的各类组件和快速更改演算法。另外,最吸引人的是,该框架囊括了很多具有挑战性的任务,比如导航,抓取和放置物体,踢球,人形机器人的行走等:

我们当时也曾基于hobotrl和ALF做了一些现实性的任务,比如自动驾驶的决策部分、星际争霸(https://github.com/witwolf/pysc2-rl)、打乒乓球、机械臂抓取以及训练的策略在真实机械臂上的执行等一系列任务,发几个手机里还能找到的之前录的视频:

使用强化学习训练机器人打乒乓球Jeungtao的视频 · 1226 播放强化学习策略在真实环境的机械臂上的的执行Jeungtao的视频 · 50 播放

另外我们还做了一个强化学习的模拟器环境SocialRobot ,里面有一系列的任务和不同种类的机器人本体 https://github.com/HorizonRobotics/SocialRobot 其中的大部分任务都有ALF中的训练而来的例子,感兴趣的同学可以关注一下。


Distributed Accelerated Reinforcement Learning on memoire

NeurIPS19的Divergence-Augmented Policy Optimization 和NeurIPS18的Exponentially Weighted Imitation Learning for Batched Historical Data 的实现是基于本框架。

以下专栏文章讲了讲我们在这个框架上做的策略优化演算法Divergence-Augmented Policy Optimization

我们知道深度强化学习的训练速度一大瓶颈主要在数据生成采集,如何高效利用异构计算架构(多CPU+多GPU)来加速深度强化学习是一个重要的问题。我们通过针对策略优化演算法设计异构分散式采样和计算来解决数据生成采集速率和优化计算速度较慢这一问题。

我们的解决方案是memoire框架,其特色是将Replay memory模块和神经网路训练模块解耦,这样不论你在训练端是用什么DRL框架,基于tensorflow的也好,基于pytorch的也好,都可以轻松的用到分散式数据采样,更好的利用异构计算资源,加速训练。

Memorie架构

如图所示,多个Actor进程在多个CPU上并行运行,Actor负责根据本地网路参数对应的策略与环境交互和探索,并生成轨迹数据供Learner训练。Learner进程运行在GPU[1]上,负责通过Actor产生的数据更新深度神经网路的模型参数。

具体而言,Actor在主循环中使用来自当前本地节点的策略与本地节点的环境交互生成动作,并将生成的观察和动作数据缓存在本地内存中。本地节点Actor上正在运行的策略会定期更新为Learner的最新策略;本地节点Actor同时将生成的数据非同步发送到学习者

Learner 向 Actor 传递神经网路模型参数采用 Pub/Sub Messaging 模式

在Learner节点,Learner以先进先出FIFO的方式保留每个执行者Actor分别产生的最多20个最近的episode。Learner从这些轨迹中有放回地随机抽取批量数据用于神经网路训练。

Actors

  1. 从Learner处「获取(Subscribe)」已发布的最新策略神经网路模型参数,
  2. 根据当前获取的策略模型在环境中进行交互,
  3. 将与环境交互产生的轨迹数据存在经验回放记忆存储(Replay memory)的客户端,
  4. Replay memory客户端将采样数据push到Replay memory伺服器端.

Learners

  1. 从Replay memory 伺服器端取得批量轨迹样本,
  2. 根据不同的策略优化演算法用批量样本更新模型,
  3. 一定更新步骤后,将最新的策略神经网路模型参数「发布(Publish)」.

框架部分设计细节

Replay memory的客户端存储由本地Actor生成的最近轨迹。Local replay memory的存储大小受总步数/状态转移数和总episode数目的限制。我们提供3种方法来为新的episode创建空间,向当前episode添加状态转移轨迹以及关闭终止的episode。当episode结束时,将自动计算每个步骤的 [公式] 返回值,并更新其采样优先顺序

我们还提供了一种对当前正在运行的未完成轨迹进行采样以形成缓存并将其推送到Learner的方法。伺服器端会自动从客户端接收push的缓存。当Learner需要一批样本进行训练时,Learner可以从这些从客户端push的缓存中获取一批次样本,并在这些样本中进行第二阶段的采样。在客户端和伺服器端分别进行两阶段采样,最终大致等价于从Actor生成的所有轨迹样本中进行采样。

注意到在此框架中,客户端只有采样过的状态转移轨迹而不是所有生成的轨迹会被push到Learner。在我们有大量Actors的情况下,这种设计可以减少Leaner的带宽负担和内存使用量。同时,Learner仍然可以通过优先采样的方式获得具有较高优先顺序的样本,以至于更高效地更新神经网路模型。

实验结果

我们在小型集群上部署非同步并行分散式训练框架。Learner在GPU机器上使用M40卡运行,而执行者Actor在2.5GHz Xeon Gold 6133 CPU上以16个并行进程运行。

最后我们展示在Atari game 58个环境下和STOA演算法的相对优势。我们可以从实验结果看到,通过增加实际KL散度的返回值(即我们提出的Divergence-augmented Policy Optimization),我们演算法的性能要比基准演算法PPO更好。Divergence-augmented Policy Optimization 在可能具有局部最优值且需要更深入探索的游戏中性能提高更为明显。更多的详细实验结果感兴趣的读者可以参考原论文的第五章和附录。

在58个Atari 实验环境下,我们提出的Divergence-augmented Policy Optimization 对于 PPO 的相对提高值。Atari环境分类为易探索的环境和难探索的环境.

同时Memorie架构已经支持以下features:

  • Prioritized Sampling
  • Frame Stacking
  • N-Step Learning
  • Multidimensional Reward
  • TD-lambda return computing
  • Sampling from unfinished episode

memorie的资源消耗与带宽使用情况

https://github.com/lns/dapo?

github.com

https://github.com/lns/memoire?

github.com

参考

  1. ^可以运行多个Learner进程进行分散式训练。


推荐阅读:
相关文章