前言

机器学习方法的复现性一直都是比较另人头痛的问题,因为很多因素都可能会影响最后的效果。而其中的强化学习还涉及与环境交互带来的随机性,情况更加严重。可能相同的环境配置,跑上几遍结果还不太一样。2017年McGill University和Microsoft的论文《Deep Reinforcement Learning that Matters》中研究了强化学习的可复现性,指出像随机种子、环境因素、超参以及使用的codebase带来的不确定性都会导致结果难以重现。这在一定程度上提高了实验成本。另一方面,除非是一些小型的实验benchmark,否则处理的数据维度有时会很大,因此有巨大的算力需求。比如几个著名的应用强化学习的项目对硬件都有较高的要求:

  • DeepMind的AlphaGo: 用于围棋。早期的AlphaGo版本使用了1202个CPUs和176个GPUs。到AlphaGo Zero时训练使用了64个GPU worker和19个CPU parameter server,推理使用了4个TPU。
  • OpenAI的OpenAI Five: 用于玩Dota 2。用到128000个CPU核和256 Nvidia P100 GPU。
  • DeepMind的AlphaStar:用于玩星际争霸II。每个agent使用16个TPU。
  • Stanford这段时间刚提出的DERL(Deep Evolutionary Reinforcement Learning):在强化学习中考虑形态的进化。使用了1152个CPU。

强化学习的应用还存在其它许多挑战。2018年的文章《Deep Reinforcement Learning Doesn’t Work Yet》中做了详细的讨论,如样本利用率低,依赖回报函数设计,训练不稳定,exploration vs. exploitation等等。虽然对于上面提及的问题,不少还没有非常通用的、彻底的解决方案,但通过学习过程的加速和优化可以很大程度上加以缓解。而加速优化的重要手段之一就是并行化。因此,这几年关于这方面的研究,比如强化学习的并行化,大规模训练等比较火热。

我们知道,监督学习中的大规模并行训练已经很成熟并被广泛采用。主要的方式是采用数据并行,将梯度的计算并行化,可以使用经典的All-Reduce计算模式。基本的常见结构是由一个(或多个)parameter server与多个worker组成。数据集被切分,然后分给多台worker。这些worker基于这些数据与本地的模型计算梯度,再将计算好的梯度发往parameter server。Parameter server中保存了全局的模型,在拿到梯度后进行聚合更新全局模型参数,然后将的模型参数发往各个worker,以此循环。而对于强化学习,这种训练模式无法完全照搬,因为其学习算法的模式是有所不同的。对于监督学习来说,它主要有网络的forward,backward和参数更新的过程。训练数据是提前准备好的。只要数据切分均匀,各步耗时可控,容易同步。而于强化学习而言,用于训练数的据来自于与环境的交互,也就是说agent可以影响训练数据分布。这使得学习过程更加复杂,需要多个差异很大的模块相互配合完成。如一个典型的Actor-Critic(AC)算法,一方面actor中有策略函数,agent基于这个函数根据状态得到动作,这个动作通过环境执行得到状态和回报,另一方面critic中有值函数,用于对actor的策略进行评估。这两个函数都可用神经网络表示。Learner模块用于学习神经网络的参数。

为了达到更高的吞吐率,需要将各种计算任务充分并行化。理想情况下,一些任务(如推理)可以用GPU、ASIC等芯片并行加速,多个actor间可以相互并行,actor和learner间也可以相互并行。为了达到更好的并行效果,还需要尽可能减少同步。因为老是同步的话容易让硬件空闲等待,降低硬件利用率。这就带来一些问题需要解决。比如,简单地让actor和learner异步执行的话会使on-policy算法训练不稳定等等。总得来说,目标是提高学习过程的吞吐率且不影响最终的训练效果。

业界发展

下面简单理了下业界这几年在强化学习加速,尤其是并行加速方面的方法。先画张草图总结下,后面再稍微展开下。
在这里插入图片描述

Gorila

比较早期的将深度强化学习拓展到大规模并行场景的经典工作之一是2015年DeepMind的《Massively Parallel Methods for Deep Reinforcement Learning》。它将分布式引入强化学习,提出了Gorila (General Reinforcement Learning Architecture)。当时深度强化学习的SOTA还是DQN算法,因此该工作基于DQN提出了变体,拓展到大规模的计算集群。在该架构中,类似分布式监督学习,learner中对于Q网络的参数梯度会发给parameter server。Parameter server收到后以异步SGD的方式更新网络模型。这个模型同步到actor中,actor基于该模型产生动作在环境中执行,产生的经验轨迹发往replay memory。Replay memory中的数据被learner采样拿去学习。另外,每过N步learner还会从parameter server同步最新的Q网络模型参数。在这个闭环中有四个角色:actor, learner, parameter server和replay memory。

在这里插入图片描述

Gorila中可以配置多个learner、actor和parameter server,放在多个进程或多台机器上以分布式的方式并行执行。如实验中parameter server使用了31台机器,learner和actor进程都有100个。Parameter server有多个的情况下,模型可被切成不相交的多份,分别放于多台机器上。Replay memory分两种形式:local 模式下就存在actor所在的机器上;而global模式下将所有的经验数据聚合在分布式数据库中,这样的优点是可伸缩性好,缺点是会有额外的通信开销。一种简单的配置是actor,replay memory和learner间为1:1关系,称为bundled mode,也是实验中采用的方式。在分布式环境中,不可避免的就是稳定性问题(比如节点消失、网速变慢或机器变慢)。Gorila中采用了几个策略来解决这个问题,如丢弃过旧的和loss太过偏离均值时的梯度。实验部分与DQN一样基于Atari平台。在使用相同参数的情况下,该框架中的DQN变体在49中的41个游戏中表现好于非并行版本传统DQN,同时训练耗时也有显著减少。

A3C

我们知道强化学习中有两大类,即value-based和policy-based的方法,而AC结合了两种方法,吸收了它们的优点。前面的DQN将DNN引入经典的value-based方法-Q-learning。2016年DeepMind继DQN后在论文《Asynchronous Methods for Deep Reinforcement Learning》中又将DNN引入了AC算法,提出了A3C(Asynchronous Advantage Actor-Critic)算法,使强化学习可以用于连续动作空间,成为了当时的SOTA。为了充分地利用多核并行,架构中有多个worker在各自的线程中。每个worker都独立地进行环境交互与模型训练。每个worker将梯度传给一个global network,然后这个global network会取平均更新模型。更新完模型再把这个模型参数传给所有的worker。其实感觉有点类似于分布式监督学习框架中parameter server的思想。注意这个过程是异步的(这也是A3C得名原因),即每个worker得到梯度更新就回传。这样减少了同步开销。算法的实现使用了有16核CPU的单台机器跑16个agent,花了大约4天学习Atari游戏。

A3C引起了业界的关注,也出现了不少改进。2017年OpenAI在博文《OpenAI Baselines:
ACKTR & A2C》
中挑战了A3C中异步的作用,并提出了其同步版本-A2C(Advantage Actor-Critic)算法。这种模式下会等所有的worker都采样完了再统一进行梯度计算。这样因为batch size更大,因此能更好地利用 GPU。2017年Google的论文《The Reactor: A fast and sample-efficient Actor-Critic agent for Reinforcement Learning》提出一种称为Reactor的架构,比A3C性能更好。它提出一种称为distributional retrace的policy evaluation算法,将多步off-policy更新引入distributional RL,称为Distirbutioanl Retrace。在该架构中,agent可以被分布到多台机器上,每台机器中包含一对actor和learner。每个worker在每步学习前下载最新的网络参数,最后并发送delta-updates。Shared network存在parameter server,每个机器包含它的本地relay memory。训练中会下载shared network,然后用于计算本地梯度,接着将之发送并更新到shared network。

GA3C

前面的A3C算法虽然充分利用多核并行,但只用到了CPU。强大的GPU还没用起来。于是GPU大厂Nvidia在2017年的论文《Reinforcement Learning thorugh Asynchronous Advantage Actor-Critic on a GPU》提出了A3C算法的的CPU/GPU混合版本,称为GA3C(GPU Advantage Actor Critic)。和A3C算法一样,它也是单机器的算法。我们知道,原始的A3C算法中多个agent并行工作,每个worker都需要采样与训练,然后通过异步SGD训练神经网络。网络权重存在中央的parameter server上。每执行几个(如5个)动作,agent会计算梯度然后将梯度更新发给server。Parameter server在每次更新后将新的权重传播到agent来保证它们共享策略。A3C算法使用CPU而非GPU主要是因为强化学习的序列化特性。训练数据是在学习的过程中产生的,又没有用replay memory,因此训练和推理的batch都很小。这样用GPU的话在训练的大部分时间中都是空闲的,导致利用率很低。GA3C中将学习部分统一放到GPU,将收集数据环境交互部分放到CPU,会更加高效。A3C在16 core CPU上用16个agent跑4天学习一个Atari游戏,而GA3C用约一天完成收敛。

DPPO

2017年时OpenAI基于TRPO的思想进行改进提出了PPO算法,成为了SOTA,到今天还广泛使用。2017年DeepMind的论文《Emergence of Locomotion Behaviours in Rich Environment》尝试将它应用到大规模问题。我们知道,在运动控制场景中如果要学习复杂的行为,设计回报函数会是一个头疼的问题。而这个工作研究通过丰富的环境来帮助复杂行为的学习。它想证明的是通过在多样化的环境中学习,只要简单的回报就可以学习到鲁棒的策略。另外从易到难,循序渐进(curriculum training)学习可以加快学习速度。随之而来的,为了能在丰富的环境中训练,就需要有可伸缩性强的训练架构支撑。于是这篇文章提出一种policy gradient的变体,称为DPPO(Distributed PPO)。它适合大型分布式的高维连续控制优化问题。该架构中数据采集和梯度的计算被分布式地放到worker上。参数放于parameter server中。这些worker在每步梯度计算中会同步这些参数。文中还通过实验比较了同步和异步方式,发现同步地计算梯度均值和更新有更好的结果。

CuLE

Nvidia为了进一步在强化学习中推广GPU的应用,在2019年的论文《GPU-Accelerated Atari Emulation for Reinforcement Learning》中将环境执行也用GPU进行了加速。Atari是深度强化学习开山之作DQN算法中的经典实验场景,后面几乎成了所有深度强化学习方法的基础benchmark。Arcade Learning Environment(ALE)是一个构建于Atari模拟器Stella之上的框架。训练的过程中,环境的执行也可能成为瓶颈。传统的框架一般是环境模拟在CPU上跑,而GPU用来做DNN相关操作。这种架构中使用CPU生成数据有几个性能瓶颈:1) CPU无法同时运行大量Atari 2600 simulator,数量难以增加;2)CPU与GPU间存在通信带宽瓶颈,导致总体GPU利用率低。本文实现了Atari环境的CUDA移植,称为CUDA Learning Environment(CuLE),可以扩展到多个GPU的系统。它充分利用GPU的并行能力,并可以同时跑上千个Atari游戏,而且直接通过GPU渲染,省去了CPU和GPU之间的通信开销。CuLE可以通过单GPU产生40M到190M帧每小时的速率。它的局限是在环境数量有限时,CuLE可能不如基于CPU的方案产生数据的效率,因为GPU的利用率不高。但当环境数量足够大时就会有优势。

img

PAAC

2017年Norwegian University of Science和Technology & Telenor Research的论文《Efficient Parallel Methods for Deep Reinforcement Learning》中提出了一种可以使深度强化学习算法有效并行化的框架,使算法可以从单个机器中的多个actor进行学习。这个框架可以在GPU上实现,并用于on-policy, off-policy, value based和policy gradient的算法。文中在该框架上基于GPU实现了A2C算法,称为PAAC(Parallel Advantage Actor-Critic)算法。它是on-policy方法并采用同步更新的方式。

在这里插入图片描述
架构中有一组环境实例。每步中,由master基于当前策略生成所有环境实例的动作。一组worker将这些动作并行地应用到环境,然后将观察到的经验保存起来。Master根据这些经验进行策略的更新。这种框架允许evaluation和training使用batching,从而有效并行。基于本框架的算法可以从上百个并行的actor进行学习,并和A3C和GA3C算法一样运行在一台机器上。但和A3C与Gorila不同的是,该架构中只会有一份参数的拷贝,因此参数的更新是同步的,从而避免了异步更新带来的问题。本框架与GA3C有不少类似之处。相比下,本框架没有队列,因此可以更简单,计算量也更少,同时允许on-policy学习,收敛速度更快。实验中,PAAC算法在Atari 2600上获得SOTA的效果,且只用了几个小时(GA3C算法耗时的一半,A3C算法耗时的1/8)。

IMPALA

大规模分布式深度强化学习的一个非常有影响力的工作是2018年DeepMind的论文《IMPALA: Importance Weighted Actor-Learner Architectures》。它提出了IMPALA(Importance-Weighted Actor Leaner Architecture),后面的不少工作都是基于它或将它作为对标对象。在多个任务中训练一个agent的主要挑战在于scalability。现有SOTA算法(如A3C,UNREAL)训练需要十亿级别的帧,且需要数天来掌握一个新的领域。在基于A3C的方法中,workers需要与中心parameter server通信(传输梯度)。而IMPALA中,产生的经验轨迹传给中心式的learner。IMPALA是一个分布式的强化学习架构,产生经验的过程与学习策略及值函数参数的过程是分开的。架构中包含一组actor,它们不断产生经验轨迹;另有一个或多个learner,使用actor发来的经验来学习策略。这些learner间使用同步的方式参数更新。IMPALA比基于A3C的算法样本效率更高。
在这里插入图片描述
本质上,IMPALA实现的是分布式的advantage actor-critic(A2C) agent。这是一个on-policy方法。但是,
用于产生轨迹的策略可能滞后于learner的策略,如在梯度计算时的那若干mini-batch update。针对这个问题,文中提出了经典的V-trace off-policy actor-critic算法。它主要用于修正off-policy的影响。通过称之为V-trace的off-policy 修正方法将原本分开的acting和learning结合起来。一般要解决off-policy bias常常会采用importance sampling correction,这样能得到梯度的无偏估计,但是缺点是variance会更高。因此,V-trace correction中会进一步截断importance sampling weight。它的效果是当轨迹变得太过于off-policy时会被切掉。通过该机制,虽然作为on-policy方法但训练中无需同步,从而达到隐藏延迟的目的。IMPALA可扩展到上百个CPU core,可在分布式的CPU集群上运行上百个环境或learner。

Ape-X

2018年DeepMind在论文《Distributed Prioritized Experience Replay》中提出了Ape-X。该方法主要通过一个中心式的共享replay memory解耦了acting和learning过程。Actor们基于共享的神经网络与它们各自的环境实例进行交互,然后积累经验放到共享的经验replay memory中。Learner从该replay memory中采样然后更新神经网络。和前面提到的Gorila一样,该架构将深度强化学习分为可以并行执行的两部分:一是acting,即运行环境,评估策略和保存经验;二是learning,即采样经验和更新策略参数。上百个actor运行在CPU上产生数据,一个learner运行在GPU上采样经验进行学习。但和Gorila不同的是,这里用的是共享的,中心式的replay memory。另外它不是均匀采样,而是优先考虑其中的一些样本,从而让算法专注于那些重要的数据。该思想来自2016年Google的论文《Prioritized experience replay》。
在这里插入图片描述
结合了经典的强化学习算法,本文提出了Ape-X DQN与Ape-X DPG算法。前者基于DQN以及Rainbow中的一些方法,后者基于DPG和DDPG。在Atari实验环境中,Ape-X DQN的actor用了360个机器。Actor积累一段时间数据以异步方式发送。Learner以异步方式拿数据。实验结果表示Ape-X比DQN,Prioritized DQN,Distributional DQN,Rainbow和Gorila在训练速度和最终得分上都有优势。另外在humanoid和manipulator等连续控制任务中,能达到~14K FPS。

accel_rl

2018年Berkeley论文《Accelerated Methods for Deep Reinforcement Learning》研究如何在CPU+GPU的单台计算机(8 GPU和40核CPU的DGX-1)上优化现有的深度强化学习算法。 本文构建了一个并行化的统一框架。其中所有的神经网络计算(推理和训练)放在GPU上进行加速。该框架既适用于PG也适用于Q-learning方法。基于该框架,文中展示了A2C, PPO, DQN, Categorical DQN和Rainbow算法的多GPU版本。
在这里插入图片描述
本文主要优化点之一在于同步采样以利用GPU善于处理大batch任务的特点。多个simulator以同步方式并行跑在CPU 核上。它们得到的经验会以batch方式给到GPU上做推理。由于是单机内,可以用共享内存作为动作产生与simulator进程间的通信方式。同步的采样会有straggler effect,而且当并行进程数量多时更明显,本文用在每个进程中层叠多个独立的simulator实例来缓解该问题。每个进程内序列化地执行这些simulator。如果simulation和inference的workload差不多时,为了防止空闲,可以分两个组。当一组等待动作时,另一组可以执行环境。这样GPU交替地服务两个组,从而提高硬件利用率。在同步多GPU优化中,所有GPU会维护相同的参数值。每个GPU使用本地收集的样本计算梯度,并通过all-reduce聚合所有GPU上的梯度并更新本地参数。在异步多GPU优化中,每个GPU先本地计算梯度,然后从中央的参数存储(CPU上)拉最新的参数,并用本地计算的梯度更新它,再将更新的参数写回中央的参数存储中。

D4PG

2018年DeepMind的论文《Distributed Distributional Deterministic Policy Gradients》将distributional RL结合到分布式框架中(注意别把distributional和distributed搞混了),提出一种基于DDPG改进的off-policy AC方法,称为D4PG(Distributed Distributional Deterministic Policy Gradient)算法。D4PG的non-distributional变体称为D3PG。它结合了几种常用的做法,如N-step return和prioritized experience replay。本文主要关注高维状态与动作空间的复杂控制任务 。对于连续控制任务,一种常见的方法是显式地参数化策略,然后直接优化长效累积回报。本方法结合了2017年DeepMind的论文《A Distributional Perspective on Reinforcement Learning》中的方法,使用distributional版本的critic update。它提供了更稳定的学习信号。本文用Ape-X框架并行运行多个独立的actor,它们产生的经验放到一个统一的replay table中。每个actor有网络参数的拷贝。另有一个learner进程负责从replay table中采样,然后基于这些数据进行网络更新。实验中关注指标为perf/wall clock time,用于衡量训练的效率。在一系列较难的连续控制问题(standard control suite,dexterous,parkour)中,D4PG优于PPO,D3PG算法。

R2D2

2019年DeepMind在论文《Recurrent Experience Replay in Distributed Reinforcement Learning》扩展了Ape-X DQN,提出了Recurrent Replay Distributed DQN(R2D2)算法,它主要特点是结合了recurrent network(在Q-network中使用了LSTM)。 LSTM因为可以学习时间序列下的隐状态,因此在强化学习中可被用于克服部分观察问题。但是引入它也会带来一些挑战。本文主要研究experience replay对于parameter lag的影响,它会导致representational drift和recurrent state staleness。在分布式环境中这个问题更加严重,从而影响训练的稳定性和最终效果。

R2D2和Ape-X类似,也用了dueling network,prioritized distributed replay和n-step double Q-learning。与之相比最大区别是引入了RNN。架构上,由一大堆actor(如256)来生成经验,然后由一个learner学习。网络方面也是用了dueling network架构,但不同的是在卷积后面加了LSTM。为了从经验回放中训练RNN,整个状态和动作的轨迹需要被存于经验数据中。对于从回放经验中训练LSTM,以往的工作中比较了两种策略:一是在采样序列的开始将开始状态置零(即zero start state)来初始化网络,优点是简单;二是回放整个episode的经验轨迹,但会因为轨迹中状态高度关联带来一系列问题。本文认为zero start state策略虽对于完全观察的Atari够用,但会使网络无法学习真正的long-term依赖,如在需要记忆的场景中(如DMLab)。因此,本文提出两种方法来从随机采样的回放序列中训练RNN。1) Stored state:即将recurrent state存在回放数据中,然后在训练时用于初始化网络。但仍会受representational drift的影响,导致recurrent state staleness。2) Burn-in:允许网络有一个burn-in过程。这个过程中使用部分的回放序列数据,只用于unrolling网络,产生start state,然后在剩余的序列上更新网络。Burn-in的好处是防止了一些RNN参数的destructive update(由于不准确的初始值)。两种方法与zero state训练策略相比都有优势。

实验基于Atari-27和DMLab-30与Ape-X和IMPALA做了比较。Atari中R2D2在游戏中所达到的成绩比以往单actor的方法有数量级的提升,是多actor方法Ape-X的四倍,且用了更少的actor。DMLab中R2D2的表现与IMPALA相当。

SEED

2019年Google在论文《SEED RL: Scalable and Efficient Deep-RL with Accelerated Central Inference》中提出了SEED(Scalable, Efficient Deep-RL),推了一把自家的TPU。该架构采用中心式推理和优化的通信层,有效利用加速芯片,可以以百万张每秒的速度训练,从而降低成本。SEED框架上实现了两个分布式算法:PG系的IMPALA/V-trace和Q-learning系的R2D2。R2D2集成了DQN以来的一坨改进点,如double Q-learning, multi-step bootstrap, dueling network architecture, prioritized distributed replay buffer, value-fucntion rescaling, LSTM, burn-in(除最后三项其它沿自Ape-X)。

SEED与前面提到的IMPALA关系紧密。在IMPALA架构中,很多actor不断地从learner读模型参数。每个actor通过本地模型采样动作产生完整的轨迹 。这个轨迹连同recurrent state传到共享的队列或relay buffer。另一方面,learner以异步方式从队列或buffer中读取这些轨迹并优化网络模型。但是,它有几个问题:1) CPU做推理效率低:Actor通常是基于CPU的,而用CPU做神经网络推理效率不高。2) 资源利用率低:Actor需要交替做环境和推理两步。这两个任务的计算需求往往不同。3) 带宽需求:Actor和learner间需要传输模型参数,recurrent state和观察状态。针对这些问题,SEED架构中将推理移到learner,让actor只做环境的计算。区别于IMPALA中每个actor都有模型拷贝,SEED中模型只有一份拷贝,这会改变off-policy的形式。这样,所有与模型相关的东西都在learner中,只有观察状态和动作需要在actor与learner间传输。为了减少这些数据的传输开销,该架构中引入了一个基于gRPC的高性能的RPC库,降低远程调用带来的延迟。另外,为了防止actor在等待learner回复时的空闲,单个actor中会运行多个环境来提高利用率。可以看到,与IMPALA架构相比,SEED架构将更多任务放到learner中加速。Learner模块中有三类线程来完成这些任务:数据预取,推理和训练。

在这里插入图片描述
在这里插入图片描述
实验部分它在Atari-57, DeepMind Lab和Google Research Football上作了效果评估。在Football上超越了SOTA方法,另外与SOTA方法相比,在Atari-57上训练快了三倍。成本上,在实验场景中减少40%到80%。考虑到大部分成本在于actor的CPU服务器,因此关注点是减少actor。在IMPALA中,每个actor有一个core,而SEED中每个actor运行多个环境。

DD-PPO

2019年Georgia Institute of Technology和Facebook等机构的论文《DD-PPO: Learning Near-Perfect PointGoal Navigators from 2.5 Billion Frames》提出了DD-PPO(Decentralized Distributed Proximal Policy Optimization)方法。它是一个用于GPU集群的去中心化的分布式框架。另外为了避免stale数据,采用了同步的方式。

一般情况下,仿真环境中的强化学习中的计算任务有四个:simulation, inference, learner和parameter server。同步的分布式强化学习方法会将simulation、inference和learner放到到多个GPU上,然后通过AllReduce同步梯度。这种方式会带来同步和通信开销。而异步的分布式强化学习方法很多使用单个或多个进程执行simulation和inference,另有一个独立的进程以异步方式完成learner和parameter server的角色。如果将这种方式应用到非常耗资源的环境会有些问题:一方面是inference/simulation进程只用CPU的话扛不住,尤其是像本文提到的这种环境执行也用GPU加速的场景。虽然可以用GPU实现,但batch不大的话会导致硬件利用率低。另一方面是单进程的learner/parameter server只能利用单个GPU节点的算力,而为处理高维输入所需的大型网络在计算梯度时需要很高的算力。针对这两个问题,DD-PPO让每个GPU对应一个进程,并将多个环境的观察状态进行batching来做推理。每个worker交替执行两个任务:在GPU加速的仿真环境中收集经验和优化模型。作为去中心化的架构,DD-PPO没有parameter server,每个GPU都计算梯度,因此可以支持更大的网络。Worker之间是同步的,即有一个显式的通信阶段让worker们同步它们的更新到模型。但如同上面提到过的,同步模式会有straggler effect,导致需要等最慢的那个worker完成经验采集。为了减轻这个问题,那些过慢的会被抢占掉。

文中采用的实验环境为Habitat-Sim,是一个室内导航3D的仿真平台。文中的方法也是Habitat Autonomous Navigation Challenge的第一名。在该实验中,DD-PPO能达到近线性的scaling能力 (128 GPU上107x加速)。

Acme

2020年,来自Google的论文《Acme: A Research Framework for Distributed Reinforcement Learning》提出了Acme框架。Acme是一个用于表示和训练强化学习agent的软件库和轻量框架,还提供了一些agent baseline。它提供多种组件来构建agent,试图用统一的框架解决复杂性和伸缩性问题,适用于分布式与非分布式环境(官方开源的版本貌似还没有分布式的版本)。Acme的设计哲学是在平衡简易性、模块化和规模化。框架可以适用小规模也可以用于大规模场景。为了使相同模块适用于构建小和大规模版本,框架将代码分解成组件。这些组件可以相互组合构建on-policy或者off-policy的算法 。组件有acting, dataset和learning。这里概念上比较绕的是它定义了一种特殊的actor称为agent。它既包含了一个acting组件又包含了一个learning组件。Dataset组件位于actor和learner组件之间,它向learner提供采样的mini-batches。数据集管理使用数据存储系统Reverb。它提供了高效的插入和灵活的采样机制。

在这里插入图片描述
在分布式的agent中,Acme将acting, learning和storage组件分离,放在不同的线程或者进程中。这样一方面可以让acting和learning并行,另一方面可以充分利用更多的并行actor。比如每个分布式的agent会有一个data storage进程,一个learner进程和一到多个分布式的actor进程(每个都有environment loop)。Actor中还有子模块负责从learner中pull变量更新。在同步的学习循环中,第一步中acting和learning的比例会对长期的学习效果稳定性产生很影响。但是,让它们独立运行又会使variance变高。这个问题Acme通过Reverb的RateLimiter来缓解。它指定了learning和acting间的期望的相对速率。

在这里插入图片描述

实验环境基于DeepMind Control suite,Arcade Learning Environment和Behaviour Suite(bsuite)。性能衡量测度采用actor steps(用于衡量sample efficiency)和learner wall-time(衡量训练速度)。实验在control suite上比较了D4PG、DDPG、DMPO和MPO方法,Atari上比较了DQN、R2D2和IMPALA方法,bsuite上比较了DQN、R2D2、IMPALA和MCTS方法。结果表示从learner wall-time指标上来看分布式的acting有优势。IMPALA学得快但是不稳定,相比而言R2D2学得慢但能得到得好的结果和更小的variance。DQN起步比R2D2更快但最终结果更差。

Sample Factory

2020年Intel和University of Sourhern Californi的论文《Sample Factory: Egocentric 3D Control From Pixels at 100000 FPS with Asynchronous Reinforcement Learning》提出了Sample Factory,它是为单机设计的高吞吐训练系统,基于APPO(Asynchronous Proximal PolicyOptimization)算法。能在3D控制场景达到100000 FPS。

一个典型的强化学习中有三个主要的计算任务:环境仿真,模型推理和反向传播。设计的原则是让最慢的任务不要等其它的任务,因为系统的吞吐取决于最慢任务的吞吐。每种任务对应一种类型的组件。组件之间通过高速的FIFO队列和共享内存通信。三种组件分别为:1) Rollout worker:每个rollout worker可以有多个环境实例,与这些环境交互采集经验。Rollout worker一方面将经验通过共享内存给policy worker,另一方面通过共享内存给learner。2)Policy worker:收集多个rollout worker来的状态,通过策略得到动作,通过共享内存传回给rollout worker。3)Learner:前面两个一般有多个,只有这个是只有一份的。它通过共享内存从rollout worker拿到经验轨迹,更新策略,然后通过GPU memory(因policy worker与learner都跑在GPU上)发往policy worker。Policy worker就可以用新的策略生成动作了。Rollout worker和policy worker一起称为sampler子系统。为了解决rollout worker等待policy worker返回动作的问题,文中使用了Double-Buffered Sampling的技巧。即在rollout worker上存一组环境 ,并分成两组,通过轮流来提高CPU利用率。

在这里插入图片描述
在这个框架中,一次迭代中从并行环境中收集的多个经验轨迹在learner中无法在一次mini-batch中消化掉。这会导致policy lag问题,即behavior policy与target policy的不一致。对PG方法来说这种off-policy学习比较困难。因为policy lag越大,从behavior policy采样来准确估计梯度就越难。减少环境中执行步数或者增大mini-batch size可以减少policy lag。除此之外,有两大技术用来处理off-policy学习:trust region(如PPO clipping)和importance sampling(如V-trace)。两者可以同时使用。Sample Factory中两种都实现了。

实验的机器配置为10核CPU+GTX1080 Ti GPU和36核CPU+RTX 2080 Ti GPU。实验中以training frame rate为指标,在三个仿真器(Atari, VizDoom和DeepMind Lab)上与几个baseline算法 (RLlib、DeepMind和SEED的IMPALA,以及rlpyt的PPO)做了对比,在大多训练场景上超越了它们。

开源框架实现

业界也有不少开源强化学习框架会进行并行加速或者有大规模训练能力,下面列举了其中一些:

名称(链接)机构年份对应论文算法环境
RLlibBerkeley2017《RLlib: Abstractions for distributed reinforcement learning》A2C,A3C,ARS,BC,ES,DDPG,TD3,APEX-DDPG,Dreamer,DQN,Rainbow, APEX-DQN,IMPALA,PG,PPO,APPO,SAC,etc.Atari,Mujoco,etc.
rlpytBerkeley2019《rlpyt: A research code base for deep reinforcement learning in PyTorch》DQN,Categorical-DQN,Recurrent DQN(R2D1),DDPG,TD3,A3CAtari,Mujoco
TorchBeastFacebook2019《TorchBeast: A PyTorch Platform for Distributed RL》IMPALAGym
PARLBaidu2019N/ADQN,ES,DDPG,PPO,IMPALA,A2C,GA3C,TD3,SAC,MADDPGGym,Mujoco,osim-rl
ReAgent(Horizon)Facebook2018《Horizon: Facebook’s open source applied reinforcement learning platform》DQN,DDQN,Dueling DQN & DDQN,C51,QR-DQN,TD3,SACGym
ELFFacebook2017《ELF: An Extensive, Lightweight and Flexible Research Platform for Real-time Strategy Games》A3C variantMiniRTS,Atari,Go
SURREALStanford2018《SURREAL: Open-Source Reinforcement Learning Framework and Robot Manipulation Benchmark》DDPG,PPOSurreal Robotics Suite,Gym
SEEDGoogle2019SEED RL: Scalable and Efficient Deep-RL with Accelerated Central InferenceIMPALA,R2D2,SAC,VPG,PPO, etc.Atari,DeepMind Lab,Google Research Football,Mujoco
TianshouTsinghua University2020N/APG,DQN,C51,A2C,DDPG,PPO,TD3,SAC,etc.Atari,Mujoco
AcmeGoogle2020《Acme: A Research Framework for Distributed Reinforcement Learning》IMPALA,DQN,DDPD,D4PG,R2D2,etc.Atari,DeepMind Control Suite,Behaviour Suite

结语

在AI这个快速更新与演进的领域,训练效率显得格外重要。更快的训练意味着可以更快地试验和迭代算法,从而提升竞争力。并行化是减少耗时、提高硬件利用率、降低成本的最为有效的手段之一。除了提升性能外,对于强化学习它还能额外带来的好处是训练数据更加多样化,这会使学习出来的策略更加鲁棒,泛化能力更强。从前面可以看到,业界对强化学习并行加速的方案既有单机的也有多机分布式的。前者通过多进程或多线程可达到并行的目的,其好处是通信成本低,可利用共享内存免除拷贝的开销。而后者具有更好的可伸缩性,但缺点是有较高的通信开销,组件间难以同步。

相比监督学习,强化学习很大的一点区别是其数据来源于环境交互,而交互依赖于策略,策略又依赖于交互中产生的经验,形成了闭环。根据环境中生成动作的行为策略与用于评估与学习的目标策略是否相同,衍生出on-policy与off-policy两类方法。On-policy与off-policy方法相比,更稳定也更易于使用,但它要求这个闭环中的各步是同步。而我们知道同步则是并行优化中的最大阻碍之一。理想情况下我们希望各个组件可以独立工作,这样便不会因为有等待而出现硬件空闲导致资源浪费的情况。可以看到,业界的趋势是将框架越来越组件化。即将环境执行、推理、训练等工作任务交由专门的模块执行,并相互解耦。这样它们之间便可以充分并行,并且可以调节数量以达到数据生产与消费之间的平衡。推理与训练这些与网络模型相关的操作倾向交由GPU、AISC这些擅长并行计算的处理器上完成。同时为了提高利用率,会对输入进行batching。为了更高的效率,我们希望充分解耦acting和learning两个任务的组件,但这就会面临它们之间的同步问题。一种方式就是同步模式。它对于算法,尤其是on-policy算法是比较友好的。对于同步所带来的性能影响,需要通过抢占或者分组交替的方式来解决或者缓解。另一类是异步模式。它对off-policy算法的影响会小一些,但对于on-policy算法会有较大影响,会让其训练不稳定。这就需要使用一些像V-trace的技术来做处理。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐