Python多处理性能差

Python多处理性能差,python,performance,multiprocessing,pool,ray,Python,Performance,Multiprocessing,Pool,Ray,我必须使用prophet对一定数量的系列(几千个)进行预测。 prophet工作正常,但不使用多个CPU。每个预测大约需要36秒(实际上是整个函数,它还进行了一些数据预处理和后处理)。如果我按顺序运行(仅针对15个系列进行测试),则需要540秒才能完成。代码如下: for i in G: predictions = list(make_prediction(i, c, p)) 其中G是一个迭代器,每次返回一个序列(对于15个序列的测试,上限为),c和p是两个数据帧(函数仅用于读取)

我必须使用prophet对一定数量的系列(几千个)进行预测。 prophet工作正常,但不使用多个CPU。每个预测大约需要36秒(实际上是整个函数,它还进行了一些数据预处理和后处理)。如果我按顺序运行(仅针对15个系列进行测试),则需要540秒才能完成。代码如下:

for  i in G:
    predictions = list(make_prediction(i, c, p))
其中G是一个迭代器,每次返回一个序列(对于15个序列的测试,上限为),c和p是两个数据帧(函数仅用于读取)

然后,我尝试了joblib

predictions = Parallel(n_jobs=5)( delayed(make_prediction)(i, c, p) for i in G)
p = Pool(5)
predictions = list(p.imap(make_prediction2, G))
p.close()
p.join()
耗时420秒

然后我试着去游泳池:

predictions = Parallel(n_jobs=5)( delayed(make_prediction)(i, c, p) for i in G)
p = Pool(5)
predictions = list(p.imap(make_prediction2, G))
p.close()
p.join()
因为使用map我只能传递一个参数,所以我调用了一个调用make_prediction(G,c,p)的函数。耗时327秒

最后我尝试了ray: 我用#@ray.remote进行了#u预测,并打电话:

predictions = ray.get([make_prediction.remote(i, c, p) for i in G])
所用时间:340秒!我还尝试使用c_-ray=ray.put(c)创建c和p-ray对象,并将c_-ray和p_-ray传递给函数,但我看不到性能有任何改进

我理解分叉所需的开销,实际上从函数中花费的时间并不多,但我希望性能更好(最多不到40%,使用5倍CPU似乎并不令人惊讶),尤其是ray。我是错过了什么还是做错了什么?有没有什么好办法来提高表演水平

让我指出,RAM的使用是在控制之下的。在最坏的情况下,每个进程使用的内存少于2GB,因此总共少于10个,可用内存为26GB

Mac os X 10.14.6 i7上的Python 3.7.7 Ray 0.8.5 joblib 0.14.1,具有4个物理内核和8个线程(cpu_count()=8;5个cpu工作pmset-g thermlog报告没有节流)

PS将测试大小增加到50系列,性能会提高,尤其是使用ray,这意味着在这样一个小测试中分叉的开销是相关的。我会做一个更长的测试,以获得更准确的性能指标,但我想我不会偏离50%的值,这似乎与我看到的其他帖子一致,他们使用了50个CPU,可以减少90%

****************************更新***********************************

将要工作的系列数增加到100,ray并没有显示出良好的性能(可能我在其实现中遗漏了一些东西)Pool,相反,使用初始值设定函数和imap_无序进行的效果更好。分叉和准备每个流程环境会造成明显的开销,但我得到了非常奇怪的结果:
  • 单CPU完成作业(100系列)需要2685秒
  • 如上所述,使用带有2个CPU的池需要1808秒(-33%,看起来还不错)
  • 对4个CPU使用相同的配置需要1582秒(与单CPU相比减少了41%,但与2个CPU作业相比仅减少了12.5%)

将CPU数量增加一倍,仅减少12%的时间?更糟糕的是,使用5个CPU所需的时间几乎相同(请注意,100可以被1、2、4和5等分,因此队列总是满的)!没有节流,没有交换,机器有8个内核,即使在运行测试时也有大量未使用的CPU电源,因此没有瓶颈。怎么了

你的计算机有多少核?如何知道prophet不使用多个CPU?可以运行
top
或类似程序来查看您的机器实际在做什么。我建议把你的评论放到实际问题中去,它们是相关的细节(版本/操作系统也是如此)你的员工返回了什么?Python中一个非常常见的多处理问题是数据传输。工人进出的数据使用队列进行处理,队列可以工作,但不是一流的执行者。如果您的返回结构很大,您可以通过返回非常小的内容而不是大量的列表或字典来了解这是否是问题所在。如果性能提高,你需要考虑其他方法来提高效率。如果我运行先知,它将创建一个不超过100%的CPU的进程。如果我使用多进程,我可以有“n”个进程并行运行,所有进程都接近100%。不,返回集只是一个月的预测数据,非常小。问题已更新,请显示您的计算机有多少内核?如何知道prophet不使用多个CPU?可以运行
top
或类似程序来查看您的机器实际在做什么。我建议把你的评论放到实际问题中去,它们是相关的细节(版本/操作系统也是如此)你的员工返回了什么?Python中一个非常常见的多处理问题是数据传输。工人进出的数据使用队列进行处理,队列可以工作,但不是一流的执行者。如果您的返回结构很大,您可以通过返回非常小的内容而不是大量的列表或字典来了解这是否是问题所在。如果性能提高,你需要考虑其他方法来提高效率。如果我运行先知,它将创建一个不超过100%的CPU的进程。如果我使用多进程,我可以有“n”个进程并行运行,所有进程都接近100%。不,返回集只是一个月的预测数据,非常小。问题更新,谢谢