悲:并行处理选项 - 有人可以解释这些差异吗?

Oli*_*ier 1 python parallel-processing multiprocessing parallelism-amdahl pathos

我试图在python下运行并行进程(在ubuntu上).

我开始使用多处理,它适用于简单的例子.
然后是泡菜错误,所以我切换到了悲.. 我对不同的选项感到困惑,所以写了一个非常简单的基准测试代码.

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))
Run Code Online (Sandbox Code Playgroud)

我得到
- 0.001s使用普通的串行代码,没有并行,
- 0.100s带multiprocessing选项,
- 0.100s带pathos.multiprocessing,
- 4.470s带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的远程计算机上运行该选项,性能比10倍差multiprocessing.

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

Mik*_*rns 8

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

使用"新"(建议)界面pathos.pools.旧接口链接到相同的对象,因此它实际上是两种方式来实现相同的目标.

multiprocess.Pool是一个分支multiprocessing.Pool,唯一的区别是multiprocessing使用picklemultiprocess使用dill.所以,我希望在大多数简单的情况下速度都是一样的.

上面的游泳池也可以在pathos.pools._ProcessPool. pathos提供围绕几种类型池的小包装器,具有不同的后端,提供扩展功能.该pathos-wrapped池pathos.pools.ProcessPool(和旧的接口提供了它的pathos.multiprocessing.Pool).

首选的界面是pathos.pools.ProcessPool.

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

因此,pathos.pools.ParallelPool首选接口和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)>
Run Code Online (Sandbox Code Playgroud)

你可以看到ParallelPoolservers...因此用于分布式计算.

唯一剩下的问题是为什么AssertionError?那是因为pathos添加的包装器使池对象可以重用.因此,当您ParallelPool第二次呼叫时,您正在呼叫一个封闭的池.您需要restart使用池才能再次使用它.

>>> 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
Run Code Online (Sandbox Code Playgroud)

ProcessPool具有相同的接口ParallelPool,相对于重启和清除保存的实例.

  • `pathos.ParallelPool` 构建于 `ppft` 之上,并以与 `ppft` 相同的方式使用 `servers`。检查“pathos/examples”文件夹,例如:https://github.com/uqfoundation/pathos/blob/master/examples/test_ppmap2.py。 (2认同)