English | 简体中文
PARL 是一个高性能、灵活的强化学习框架。
可复现性保证。我们提供了高质量的主流强化学习算法实现,严格地复现了论文对应的指标。
大规模并行支持。框架最高可支持上万个CPU的同时并发计算,并且支持多GPU强化学习模型的训练。
可复用性强。用户无需自己重新实现算法,通过复用框架提供的算法可以轻松地把经典强化学习算法应用到具体的场景中。
良好扩展性。当用户想调研新的算法时,可以通过继承我们提供的基类可以快速实现自己的强化学习算法。
PARL的目标是构建一个可以完成复杂任务的智能体。以下是用户在逐步构建一个智能体的过程中需要了解到的结构:Model
用来定义前向 (Forward
)网络,这通常是一个策略网络 (Policy Network
)或者一个值函数网络 (Value Function
),输入是当前环境状态 (State
)。
Algorithm
定义了具体的算法来更新前向网络 (Model
),也就是通过定义损失函数来更新Model
。一个Algorithm
包含至少一个Model
。
Agent
负责算法与环境的交互,在交互过程中把生成的数据提供给Algorithm
来更新模型 (Model
),数据的预处理流程也一般定义在这里。
提示: 请访问教程 and API 文档以获取更多关于基础类的信息。
在PARL中,一个修饰符(parl.remote_class)就可以帮助用户实现自己的并行算法。
以下我们通过Hello World
的例子来说明如何简单地通过PARL来调度外部的计算资源实现并行计算。 请访问我们的教程文档以获取更多的并行训练信息。
#============Agent.py=================
@parl.remote_class
class Agent(object):
def say_hello(self):
print("Hello World!")
def sum(self, a, b):
return a+b
parl.connect('localhost:8037')
agent = Agent()
agent.say_hello()
ans = agent.sum(1,5) # run remotely and not comsume any local computation resources
两步调度外部的计算资源:
- 使用
parl.remote_class
修饰一个类,之后这个类就被转化为可以运行在其他CPU或者机器上的类。 - 调用
parl.connect
函数来初始化并行通讯,通过这种方式获取到的实例和原来的类是有同样的函数的。由于这些类是在别的计算资源上运行的,执行这些函数不再消耗当前线程计算资源。
如上图所示,真实的actor(橙色圆圈)运行在CPU集群,learner(蓝色圆圈)和remote actor(黄色圆圈)运行在本地的GPU上。对于用户而言,完全可以像写多线程代码一样来实现并行算法,相当简单,但是这些多线程的运算利用了外部的计算资源。我们也提供了并行算法示例,更多细节请参考IMPALA, A2C。
- Python 3.6+. (Python 3.8+ 更适合用于并行训练)
- paddlepaddle>=2.3.1 (非必须的,如果你只用并行部分的接口不需要安装paddle)
pip install parl
请查看一下几个教程帮助您快速上手PARL:
同时,我们还为零基础开发者提供强化学习入门课程 : ( 视频 | 代码 )
- QuickStart
- DQN
- ES
- DDPG
- A2C
- TD3
- SAC
- QMIX
- MADDPG
- PPO
- CQL
- IMPALA
- 冠军解决方案:NIPS2018强化学习假肢挑战赛
- 冠军解决方案:NIPS2019强化学习仿生人控制赛事
- 冠军解决方案:NIPS2020强化学习电网调度赛事
xparl
提供了跨多机集群的多进程并行功能,类似于 Python 自带的单机多进程。这意味着在某个客户端上编写代码后,可以在集群内的任意机器上执行任意代码,例如获取其他机器上的数据、增删文件等。
这是设计的初衷,因为强化学习环境多种多样,env_wrapper
需要具备执行各种可能操作的能力。xparl
使用了 pickle
实现这一功能(类似于 ray
)。与大多数情况下将 pickle
视为可注入代码的漏洞不同,这里使用 pickle
是一种特性。
由于支持任意代码执行,用户需要确保集群环境是安全的:
- 不要允许不信任的机器加入集群。
- 不要让不信任的用户访问集群,例如不要将
xparl
的端口暴露在公网。 - 不要在集群上执行不信任的代码。