gpt4 book ai didi

python - pathos: parallel processing options - 有人能解释一下差异吗?

转载 作者:太空宇宙 更新时间:2023-11-04 06:59:09 26 4
gpt4 key购买 nike

我正在尝试在 python(在 ubuntu 上)下运行并行进程。

我开始使用 multiprocessing,对于简单的示例来说效果很好。
然后出现了 pickle 错误,所以我转向了 pathos。我对不同的选项感到有点困惑,因此编写了一个非常简单的基准测试代码。

import multiprocessing as mp
from pathos.multiprocessing import Pool as Pool1
from pathos.pools import ParallelPool as Pool2
from pathos.parallel import ParallelPool as Pool3
import time

def square(x):
# calculate the square of the value of x
return x*x

if __name__ == '__main__':

dataset = range(0,10000)

start_time = time.time()
for d in dataset:
square(d)
print('test with no cores: %s seconds' %(time.time() - start_time))

nCores = 3
print('number of cores used: %s' %(nCores))


start_time = time.time()

p = mp.Pool(nCores)
p.map(square, dataset)

# Close
p.close()
p.join()

print('test with multiprocessing: %s seconds' %(time.time() - start_time))


start_time = time.time()

p = Pool1(nCores)
p.map(square, dataset)

# Close
p.close()
p.join()

print('test with pathos multiprocessing: %s seconds' %(time.time() - start_time))


start_time = time.time()

p = Pool2(nCores)
p.map(square, dataset)

# Close
p.close()
p.join()

print('test with pathos pools: %s seconds' %(time.time() - start_time))


start_time = time.time()

p = Pool3()
p.ncpus = nCores
p.map(square, dataset)

# Close
p.close()
p.join()

print('test with pathos parallel: %s seconds' %(time.time() - start_time))

我知道了
- 0.001s 纯串行代码,无并行,
- 0.100s multiprocessing 选项,
- 0.100 秒,pathos.multiprocessing
- 4.470 秒,pathos.pools
- AssertionError 错误与 pathos.parallel

我从 http://trac.mystic.cacr.caltech.edu/project/pathos/browser/pathos/examples.html 复制了如何使用这些不同的选项

我知道对于这样一个简单的例子,并行处理比普通的串行代码要长。我不明白的是悲情的相对表现。

我检查了讨论,但无法理解为什么 pathos.pools 如此长,以及为什么我会收到错误(不确定最后一个选项的性能如何)。

我还尝试了一个简单的平方函数,为此即使 pathos.multiprocessing 也比 multiprocessing

长得多

谁能解释一下这些不同选项之间的区别?

此外,我在远程计算机上运行了 pathos.multiprocessing 选项,运行的是 centOS,性能比 multiprocessing 差了大约 10 倍 .

根据租用电脑的公司的说法,它应该像家用电脑一样工作。我知道如果没有关于机器的更多详细信息,可能很难提供信息,但如果您对它的来源有任何想法,那将会有所帮助。

最佳答案

我是 pathos 的作者。对困惑感到抱歉。您正在处理新旧编程接口(interface)的混合。

"new"(建议)接口(interface)是使用 pathos.pools。旧界面链接到相同的对象,因此实际上有两种方法可以达到相同的目的。

multiprocessing.Poolmultiprocessing.Pool 的分支,唯一的区别是 multiprocessing 使用 picklemultiprocess 使用 dill。因此,我希望在大多数简单情况下速度相同。

上述池也可以在 pathos.pools._ProcessPool 中找到。 pathos 为几种类型的池提供了一个小的包装器,具有不同的后端,提供了扩展的功能。 pathos 包装的池是 pathos.pools.ProcessPool(旧接口(interface)在 pathos.multiprocessing.Pool 中提供)。

首选接口(interface)是 pathos.pools.ProcessPool

还有 ParallelPool,它使用不同的后端——它使用 ppft 而不是 multiprocessppft 是“并行 python”,它通过 subprocess 生成 python 进程并传递源代码(使用 dill.source 而不是序列化对象)——它是用于分布式计算,或者当通过源代码传递时是更好的选择。

因此,pathos.pools.ParallelPool 是首选接口(interface),而 pathos.parallel.ParallelPool(以及 pathos 中的一些其他类似引用>) 由于遗留原因而徘徊——但它们在下面是同一个对象。

总结:

>>> import multiprocessing as mp
>>> mp.Pool()
<multiprocessing.pool.Pool object at 0x10fa6b6d0>
>>> import multiprocess as mp
>>> mp.Pool()
<multiprocess.pool.Pool object at 0x11000c910>
>>> import pathos as pa
>>> pa.pools._ProcessPool()
<multiprocess.pool.Pool object at 0x11008b0d0>
>>> pa.multiprocessing.Pool()
<multiprocess.pool.Pool object at 0x11008bb10>
>>> pa.pools.ProcessPool()
<pool ProcessPool(ncpus=4)>
>>> pa.pools.ParallelPool()
<pool ParallelPool(ncpus=*, servers=None)>

你可以看到 ParallelPoolservers...因此是为分布式计算而设计的。

唯一剩下的问题是为什么 AssertionError?那是因为 pathos 添加的包装器保留了一个池对象以供重用。因此,当您第二次调用 ParallelPool 时,您调用的是一个封闭池。您需要重新启动 池才能再次使用它。

>>> f = lambda x:x
>>> p = pa.pools.ParallelPool()
>>> p.map(f, [1,2,3])
[1, 2, 3]
>>> p.close()
>>> p.join()
>>> p.restart() # throws AssertionError w/o this
>>> p.map(f, [1,2,3])
[1, 2, 3]
>>> p.close()
>>> p.join()
>>> p.clear() # destroy the saved pool

ProcessPoolParallelPool 具有相同的接口(interface),关于重新启动和清除已保存的实例。

关于python - pathos: parallel processing options - 有人能解释一下差异吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48990688/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com