Press "Enter" to skip to content

伯克利提出综合深度强化学习工具包rlpyt,同时调和3个深度学习无模型算法

From: BAIR; 编译: T.R

 

从2013年起深度强化学习就逐渐在游戏对抗和模拟机器人控制等领域崭露头角,各种各样的算法走入了繁荣的深度学习时代。 目前大部分是无模型的算法(model-free),可以分为三个主要的类别: 深度Q学习,策略梯度法和Q值策略梯度法 。 由于这三类算法基于不同的学习机制,聚焦于不同的控制问题,面对着离散或连续的行为序列,它们各自发展出了彼此独立的研究路线, 目前很少有可以同时调和这三个方向的代码实现 。

 

这使得研究人员在使用不同类别的方法时需要 从截然不同的起点开始实现 ,需要学习新的代码及其使用方法投入巨大的时间精力来重新造轮子,阻碍了这一领域的发展。

 

由于这些算法在强化学习领域都有着广泛的应用,并且都有着很多共同的强化学习机制,这为构建统一的计算框架提供了可能。 伯克利的研究人员们发布了一个涵盖了这三类算法的工具包rlpyt,基于共享和优化的基础结构将三类算法涵盖到了统一的工具包中。 这一工具包利用Pytorch实现包含了大量深度强化学习中常用的模块,相较于当前的强化学工具包,rlpyt是一个更为全面丰富的研究工具。

除了兼容性外rlpyt还是一个具有高通量的代码实现,适用于中小规模强化学习的研究,可以充分释放工作站的计算潜力。

它包含了高性能的计算能力实现、良好的兼容性、串并行运行等特性:

 

串行实验模式,利于调试和实验;

 

并行实验模式,将采样和优化并行;

 

异步/同步采样域优化;

 

CPU/GPU兼容特性;

 

支持循环主体;

 

支持在线或离线测评和日志;

 

支持在本地电脑上使用堆或队列进行实验;

 

模块化设计便于使用和改造,与已有模块兼容;

 

与OpenAI Gym兼容;

 

算法上包含了以下 多种常用深度学习算法 的高效实现:

 

Policy Gradient: A2C, PPO

 

DQN + variants: Double, Dueling, Categorical, Rainbow minus Noisy

Nets, Recurrent (R2D2-style) (coming soon: Implicit Quantile Networks)

 

Q-value Policy Gradients: DDPG, TD3, SAC (coming soon: Distributional DDPG)

 

并行计算架构加速研究实验

 

/采样/

 

无模型的强化学习重要包含两个主要阶段, 环境交互采样 及 主体训练 ,而这两个过程是可以通过不同的方式进行并行化的。 对于采样来说,rlpyt包含了三种不同的基本选择,包括 串行、CPU并行和GPU并行 三种模式。

 

串行采样 是其中最简单的策略,整个程序在单个python进程中运行对于调试十分有用。 但工作站并行采样机制可以大幅度提升采样效率,加速整体采集率。

 

CPU采样 同时可以运行主体的神经网络用于行为选择。

 

GPU采样 则将所有的环境观察一起出了,以便在主进程中进行行为选择,高效地利用了GPU的强大算力。

 

下图中详细展示了这几种不同的配置方式,分别展示了串行、并行CPU和并行GPU采样。 其中在GPU采样中有两组worker,一组用于执行环境模拟而另一组则等待新的行动,当行为选择的时间小于环境批模拟的时间时将大大加快运行的速度。

 

 

串行方式下主体和环境在一个python进程中执行、并行CPU方式下主体和环境在CPU的多个负载上并行执行、并行GPU方式下环境在多个CPU上并行执行,主体则在GPU上运行实现批量行为选择。

 

/优化/

 

在pytorch的工具包中已经包含了同步多GPU优化方法,整个采样-优化过程被复制到多个独立GPU中去,模型可以在反向传播过程中隐式地同步。 分布式数据并行工具可以在反向传播过程中自动的减少梯度以适应大型网络的规模。 下图展示了同步多进程强化学习,其中的采样器可以串行也可以是并行的。

 

 

/异步采样优化/

 

前述的采样器和优化器都是在相同的python进程中序列进行的,如果异步地运行采样器和优化器将会带来硬件使用率的大幅提升。 在异步模式下运行训练和采样的python进程互相独立,双份的数据buffer使得采样过程不会被打断。 优化器和采样器可以独立并行运行,甚至可以在不同的型号的GPU上运行,达到最高的硬件使用率和训练速度。

 

 

异步采样和优化模式。相互独立的python进程通过内容共享分别运行优化和采样。内存将复制到重放buffer中,使得采样器可以持续处理收集信息。

 

这幺多方法到底该使用哪一个呢?研究人员表示对于创建/修改主体、模型和算法环境的调试,串行模式是最好的方法,可以方便调整算法的各种细节。当串行程序运行平滑后,就可以探索并行化、多GPU、异步运行等更为复杂的配置。几乎相同的接口模式为研究人员研究开发算法提供了很大的便捷。

 

而优化策略则依赖于学习问题,计算硬件、实验数量等。虽然模块可以用于分布式架构运行的构建,但 rlpyt的并行化更多集中于单个节点或工作站的运行,适用于中小规模的强化学习研究 。

 

下面就一起来看看利用这个工具包在Atari中训练R2D2机器人的实际表现。

 

R2D2实例实验

 

下图展示了在Atari中训练R2D2的学习曲线,此前这种训练只能在大型分布式系统中才有可能进行。这一基准包含了100亿样本(400亿帧)量级的循环主体训练,非分布式的R2D1通过rlpyt中先进的架构实现了这一训练目标。在多GPU异步采样模式和交替GPU采样器的支持下实现了超过先前算法的性能。下图中显示了基于单个计算机对不同游戏进行训练的学习曲线:

 

 

最早的分布式R2D2在256个CPU采样1个GPU做训练的请款下可以实现每秒66k步训练,而在rlpyt中 仅需要24个CPU和3个GPU即可达到16k的训练速度 ,这使得实验可以在常规工作站上进行,而无序复杂的分布式系统。下图显示了在达到80亿步和一百万次更新只需要 不到138个小时 的训练时间:

 

 

新数据结构namedarraytuple

 

rlpyt中还提出了新的数据结构namedarraytuples, 用于更好地组织和管理程序中使用的numpyarray和tensor。 namedarraytuples本质上是一种命名的元祖,可以通过索引和切片来操作数据。 下面的代码在这种新的数据结构下就可以进行简化:

 

//原来的代码:

 

for k, v in src.items():

 

if isinstance (dest[k], dict ):

 

..recurse..

 

dest[k][slice_or_indexes] = v

 

//新的代码:

 

dest[slice_or_indexes] = src

 

rlpyt 可以使用这种数据结构拓展到不同的训练数据上,在相同的维度上进行组织和管理,使得在时间和批的维度上可以很好的交互。 namedarraytuples 天然支持环境中的多模态行为和观测,这对于网络中不同层不同模态的交互十分有效。

 

最后如果想了解工具包的细节和算法实现的流程,可以参考详细的白皮书和代码:

 

工具包白皮书:

https://arxiv.org/pdf/1909.01500.pdf

 

代码库:

https://github.com/astooke/rlpyt

 

ref:

 

https://spinningup.openai.com/en/latest/index.html

 

https://github.com/openai/spinningup

 

https://github.com/astooke/accel_rl

 

https://github.com/rll/rllab

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注