Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

PaddlePaddle作者

PARL1.1一个修饰符实现并行强化学习算法

WAVE SUMMIT 2019深度学习开发者峰会,基于PaddlePaddle打造的深度强化学习框架PARL发布了聚焦于并行的1.1版本。本篇文章为大家带来PARL在并行算法优化方面的最新进展。

强化学习是近年来机器学习领域的研究热点,在游戏操作、围棋对弈、多智能体控制等场景取得了不少令人瞩目的进展。在逐步挑战这些难题的同时,训练强化学习模型的计算力要求也在大幅度提升。虽然显卡设备经历了K40/P40/V100等提升,CPU主频也在不断提升,但是大规模的并行化仍然是提供巨大算力的主要手段。在并行化这个问题上,python由于其全局锁的存在使得自身的多线程在计算密集型任务上显得鸡肋。多进程虽然可以绕开全局锁问题,但是进程间通讯会提升开发复杂度,并且性能提升空间受限于机器的CPU数量。

项目地址:https://github.com/PaddlePaddle/PARL

PARL1.1 

PARL是一款基于百度PaddlePaddle打造的深度强化学习框架,继1.0版本开源了NeurIPS 2018假肢挑战赛冠军训练代码以及主流强化学习模型后,我们发布了聚焦于并行的1.1版本。PARL1.1新增支持高质量的并行算法,包括IMPALA、GA3C、A2C,并提供了高性能的并行开发接口。以通过PARL实现的IMPALA算法的评估结果为例,在雅达利这个经典评测环境中 ,pong 游戏最快可在7分钟内达到20分,breakout游戏在25分钟达到400分(1个P40GPU +32CPU)。


并行修饰符

PARL1.1通过一个简单的修饰符(@parl.remote_class)即可实现并行化。数据预处理以及simulator仿真等计算密集型的任务经过这个修饰符之后,会自动部署到用户指定的计算资源上运行,不再占用主线程的计算资源。下面我们先通过一个简单的Hello World程序来了解这种设计的简单易用之处。

      #============Agent.py=================         @parl.remote_class         class Agent(object):             def say_hello(self):                 print("Hello World!")             def sum(self, a, b):                 return a+b                  #============Server.py=================       remote_manager = parl.RemoteManager()      agent = remote_manager.get_remote()      agent.say_hello()      ans = agent.sum(1,5) #在远端执行,不占用当前线程计算资源。

并行化改造:单看Agent的定义是一个很普通的python类定义,但是通过@parl.remote_class修饰之后,Agent就完成了并行化的改造。

Server端获取计算资源:通过把Agent类部署到别的机器上或者CPU集群中,Server这端通过RemoteManager就可以获取到远端的Agent类,此后在Server这边可以通过获取到的Agent执行任何函数。

远端计算资源调用:但与没有修饰符的Agent不同的是,并行化后的Agent执行所有函数时不再占用当前线程的计算资源,Server这边只需要执行Agent的计算函数,等待部署在其他计算资源上的Agent计算完成之后返回结果。

从这个简单的例子可以看出,用户实现单机到多机并行的改造成本相当低——利用修饰符来Wrap一个需要在远端调起的类。在Server端可以通过相应接口获取远端的对象,通过执行该对象的函数就可以实现远端计算资源的调用。

新增并行算法示例:IMPALA

PARL1.1 新增了对IMPALA、A2C、GA3C等并行算法的支持,下面以实现难度最大的IMPALA算法为例,介绍下如何通过并行修饰符轻松实现这个算法。IMPALA是强化学习领域目前引用数量最多的并行算法,相对之前主流的A3C算法拥有更高的数据吞吐量以及收敛速度。IMPALA算法为了实现性能的最大化,将整个实现分为Actor/Learner两个部分:Actor负责与simulator交互,生成数据提供给Learner;Learner 负责收集数据来进行训练,同时把最新的模型推送给Actor。

在IMPALA算法这种Actor与Learner的组成结构中,Actor与Learner间需要进行两种数据交互:训练数据传输以及模型传输。如果用传统的多进程实现这种数据交互的话,用户需要维护两个单独的进程间队列来进行数据传输,开发成本相当高。

在PARL中,我们通过parl.remote_class对Actor进行并行化改造,就可以像在本地操作一样对Actor进行操作,比如Leaner需要给Actor传输参数,只需要在Learner端执行actor.set_param(params)函数即可。从这里可以看出,在实际的编码过程中,用户不需要关心数据是如何通过网络传输过去的,也不需要维护多线程队列这些数据结构来实现数据的同步,用户写并行代码和写多线程代码一样简单,十分容易上手。


目前,IMPALA算法的实现已经完整开源在PARL仓库中,相关的性能指标见下图。


值得一提的是,PARL继续保持着1.0版本的高复用性,用户如果想在别的环境中尝试IMPALA算法只需要定义自己的model(前向网络),然后需要复用algorithms下的IMPALA算法即可。

性能对比

为了让用户更好地了解PARL的并行性能,我们将PARL与基于Ray实现的强化学习并行框架Rllib进行对比。Rllib是伯克利开源的分布式强化学习框架,是目前开源社区中对于分布式强化学习训练支持最好的框架之一。在强化学习框架中,最为重要的一个指标是单位时间内的数据吞吐量,也就是在同等计算资源下对比不同框架实现同样的算法后的数据收集速度。为此,我们对比了PARL以及Rllib实现的IMPALA算法在雅达利游戏上的数据吞吐量(1 P40 GPU+32CPU):


可以看到,PARL在单位时间内的数据收集量相对于Rllib提升了159.4%,这说明PARL在并行性能上达到了业界领先的水准。

第二个对比的指标是收敛速度,这里我们着重对比了在一小时内两个框架在多个Benchmark上的收敛效果见下图。

表格中的数据体现了,在4个Benchmark上跑多次实验的整体指标比Rllib更高。

结束语

可以看到,PARL 1.1的并行设计非常简单易于上手,而在并行性能方面也具有很大的优势。希望为广大强化学习的研究者提供更好的支持和帮助。


飞桨PaddlePaddle
飞桨PaddlePaddle

飞桨(PaddlePaddle)是中国首个自主研发、功能完备、开源开放的产业级深度学习平台。

https://www.paddlepaddle.org
专栏二维码
工程算法PaddlePaddle
1
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

深度强化学习技术

强化学习(Reinforcement Learning)是主体(agent)通过与周围环境的交互来进行学习。强化学习主体(RL agent)每采取一次动作(action)就会得到一个相应的数值奖励(numerical reward),这个奖励表示此次动作的好坏。通过与环境的交互,综合考虑过去的经验(exploitation)和未知的探索(exploration),强化学习主体通过试错的方式(trial and error)学会如何采取下一步的动作,而无需人类显性地告诉它该采取哪个动作。强化学习主体的目标是学习通过执行一系列的动作来最大化累积的奖励(accumulated reward)。 一般来说,真实世界中的强化学习问题包括巨大的状态空间(state spaces)和动作空间(action spaces),传统的强化学习方法会受限于维数灾难(curse of dimensionality)。借助于深度学习中的神经网络,强化学习主体可以直接从原始输入数据(如游戏图像)中提取和学习特征知识,然后根据提取出的特征信息再利用传统的强化学习算法(如TD Learning,SARSA,Q-Learnin)学习控制策略(如游戏策略),而无需人工提取或启发式学习特征。这种结合了深度学习的强化学习方法称为深度强化学习。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

收敛技术

在数学,计算机科学和逻辑学中,收敛指的是不同的变换序列在有限的时间内达到一个结论(变换终止),并且得出的结论是独立于达到它的路径(他们是融合的)。 通俗来说,收敛通常是指在训练期间达到的一种状态,即经过一定次数的迭代之后,训练损失和验证损失在每次迭代中的变化都非常小或根本没有变化。也就是说,如果采用当前数据进行额外的训练将无法改进模型,模型即达到收敛状态。在深度学习中,损失值有时会在最终下降之前的多次迭代中保持不变或几乎保持不变,暂时形成收敛的假象。

强化学习技术

强化学习是一种试错方法,其目标是让软件智能体在特定环境中能够采取回报最大化的行为。强化学习在马尔可夫决策过程环境中主要使用的技术是动态规划(Dynamic Programming)。流行的强化学习方法包括自适应动态规划(ADP)、时间差分(TD)学习、状态-动作-回报-状态-动作(SARSA)算法、Q 学习、深度强化学习(DQN);其应用包括下棋类游戏、机器人控制和工作调度等。

百度智能云机构

百度是全球最大的中文搜索引擎,是一家互联网综合信息服务公司,更是全球领先的人工智能平台型公司。2000年1月1日创立于中关村,公司创始人李彦宏拥有“超链分析”技术专利,也使中国成为美国、俄罗斯、和韩国之外,全球仅有的4个拥有搜索引擎核心技术的国家之一。

http://www.baidu.com
推荐文章
暂无评论
暂无评论~