[英]dramatic slow down using multiprocess and numpy in python
我为Q学习算法编写了python代码,由于该算法具有随机输出,因此必须多次运行。 因此,我使用multiprocessing
模块。 代码的结构如下
import numpy as np
import scipy as sp
import multiprocessing as mp
# ...import other modules...
# ...define some parameters here...
# using multiprocessing
result = []
num_threads = 3
pool = mp.Pool(num_threads)
for cnt in range(num_threads):
args = (RL_params+phys_params) # arguments
result.append(pool.apply_async(Q_learning, args))
pool.close()
pool.join()
我的代码中没有I / O操作,并且我的工作站有6个核心(12个线程)和足够的内存来完成此工作。 当我使用num_threads=1
运行代码时,只用了13秒,此任务仅占用1个线程,CPU使用率为100%(使用top
命令)。
但是,如果我以num_threads=3
(或更多)运行它,则将花费40秒钟以上的时间,并且此任务将占用3个线程,每个线程使用100%CPU内核。
我无法理解这种速度下降的原因,因为所有自定义函数都没有并行化,也没有I / O操作。 还有趣的是,当num_threads=1
,CPU使用率始终小于100%,但是当num_threads
大于1时,CPU使用率有时可能为101%或102%。
另一方面,我编写了另一个简单的测试文件,该文件不导入numpy和scipy,因此此问题从不显示。 我已经注意到了这个问题, 为什么numpy.mean不是多线程的? 似乎我的问题是由于numpy
中某些方法的自动并行化(例如dot
)。 但是,正如我在图片中所显示的,运行单个作业时看不到任何并行化。
使用多处理池时,所有参数和结果都将通过pickle
发送。 这可能是非常耗费处理器时间的。 这可能是问题的根源,尤其是当您的论点和/或结果很大时。 在这些情况下,Python可能比在运行计算上花费更多的时间来进行数据的选取和取消选取。
但是, numpy
在计算过程中会释放全局解释器锁,因此,如果您的工作是numpy密集型的,则可以通过使用线程而不是多处理来加快它的速度。 这样可以避免酸洗步骤。 请参阅此处以获取更多详细信息: https : //stackoverflow.com/a/38775513/3830997
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.