繁体   English   中英

在python中使用多进程和numpy的速度急剧下降

[英]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命令)。

点击查看CPU状态图

但是,如果我以num_threads=3 (或更多)运行它,则将花费40秒钟以上的时间,并且此任务将占用3个线程,每个线程使用100%CPU内核。

点击查看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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM