import parl
[32m[10-06 21:25:01 MainThread @utils.py:73][0m paddlepaddle version: 2.1.2.
使用parl实现并行计算
PARL(PAddlepaddle Reinfocement Learning)是百度推出的基于PaddlePaddle(飞桨)的深度强化学习框架,具有可复用性强、扩展性好、支持大规模并行计算等优点,详细介绍见官网。百度凭借PARL连续两年(2018、2019)在人工智能顶会NeurIPS的强化学习挑战赛上夺魁,足见其性能的强大。
事实上,除了用来开发强化学习算法,PARL提供了十分便捷的Python多线程并行计算接口,可以单独拿来做运算加速。
众所周知,Python由于GIL(全局锁)的存在,不能充分利用多核CPU实现真正意义的多线程并行运算。多进程虽然可以避免全局锁的问题,但进程间通讯会增加开发难度。
PARL在底层解决了这些问题,用户在写代码时只需在需要并行计算的地方添加修饰符(@parl.remote_class),然后按照一般多线程的写法编程即可利用多CPU实现真正的并行化。PARL可以在命令行直接输入pip install parl来安装。推荐在Linux、Mac OS下安装,目前PARL在Windows下会出现一些bug。
PARL通过xparl指令维护一个集群(Cluster),用户可以向集群中添加CPU资源,然后在程序中配置好端口号,便能用这个集群去做并行计算了。以在Linux环境下用PARL实现并行计算为例,需要以下几个步骤:
1.开启一个集群,指定一个端口号
xparl start --port 8010
这样便创建了一个管理所有计算资源的主节点,并(默认)将本机所有CPU添加到集群中
2.在代码中配置对应的端口号
@parl.remote_class
class A(object):
def run(self):
ans = 0
for i in range(100000000):
ans += i
parl.connect("localhost:8010")
3.程序运行完后关闭集群
xparl stop
下面用一个简单的程序验证下PARL并行计算对计算速度的提升。
1. 不使用并行计算
import parl
import time
class A(object):
def run(self):
ans = 0
for i in range(100000000):
ans += 1
if __name__ == '__main__':
a = A()
t_start = time.time()
for _ in range(5):
a.run()
print('time:', time.time()-t_start)
time: 17.954527139663696
2.使用threading并行计算
import time
import threading
class A(object):
def run(self):
ans = 0
for i in range(100000000):
ans += 1
if __name__ == '__main__':
a = A()
t_start = time.time()
threads = []
for _ in range(5):
a = A()
th = threading.Thread(target=a.run)
th.start()
threads.append(th)
for th in threads:
th.join()
print('time:', time.time()-t_start)
time: 17.211843729019165
3.使用parl实现并行计算
@parl.remote_class
class A(object):
def run(self):
ans = 0
for i in range(100000000):
ans += 1
if __name__ == '__main__':
parl.connect("localhost:8010")
threads = []
t_start = time.time()
for _ in range(5):
a = A()
th = threading.Thread(target=a.run)
th.start()
threads.append(th)
for th in threads:
th.join()
print('time:', time.time()-t_start)
time: 3.1107637882232666