使用分布式群集的Python多处理

Mic*_*ael 26 python distributed-computing multiprocessing

我正在寻找一个python包,它不仅可以在一台计算机中的不同内核之间进行多处理,而且还可以在多台机器上分布一个集群.分布式计算有许多不同的python包,但大多数似乎需要更改代码才能运行(例如,前缀表明对象在远程计算机上).具体来说,我希望尽可能接近多处理pool.map功能.因此,例如,如果在一台机器上,脚本是:

from multiprocessing import Pool
pool = Pool(processes = 8)
resultlist = pool.map(function, arglist)
Run Code Online (Sandbox Code Playgroud)

然后,分布式集群的伪代码将是:

from distprocess import Connect, Pool, Cluster

pool1 = Pool(processes = 8)
c = Connect(ipaddress)
pool2 = c.Pool(processes = 4)
cluster = Cluster([pool1, pool2])
resultlist = cluster.map(function, arglist)
Run Code Online (Sandbox Code Playgroud)

Rob*_*ara 12

我建议看看Ray,它的目的就是做到这一点.

Ray使用相同的语法来并行化单机多核设置中的代码,就像在分布式设置中一样.如果您愿意使用for循环而不是地图调用,那么您的示例将如下所示.

import ray
import time

ray.init()

@ray.remote
def function(x):
    time.sleep(0.1)
    return x

arglist = [1, 2, 3, 4]

result_ids = [function.remote(x) for x in arglist]
resultlist = ray.get(result_ids)
Run Code Online (Sandbox Code Playgroud)

这将使用本地具有的许多核心并行运行四个任务.要在群集上运行相同的示例,唯一可以更改的行是调用ray.init().相关文档可在此处找到.

请注意,我正在帮助开发Ray.


Mik*_*rns 11

如果你想要一个非常简单的解决方案,那就没有一个.

但是,有一个解决方案具有multiprocessing接口 - pathos- 能够通过并行映射建立与远程服务器的连接,并进行多处理.

如果你想拥有一个ssh-tunneled连接,你可以这样做......或者你可以使用不太安全的方法,你也可以这样做.

>>> # establish a ssh tunnel
>>> from pathos.core import connect
>>> tunnel = connect('remote.computer.com', port=1234)
>>> tunnel       
Tunnel('-q -N -L55774:remote.computer.com:1234 remote.computer.com')
>>> tunnel._lport
55774
>>> tunnel._rport
1234
>>> 
>>> # define some function to run in parallel
>>> def sleepy_squared(x):
...   from time import sleep
...   sleep(1.0)
...   return x**2
... 
>>> # build a pool of servers and execute the parallel map
>>> from pathos.pp import ParallelPythonPool as Pool
>>> p = Pool(8, servers=('localhost:55774',))
>>> p.servers
('localhost:55774',)
>>> y = p.map(sleepy_squared, x)
>>> y
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Run Code Online (Sandbox Code Playgroud)

或者,您可以配置直接连接(没有ssh)

>>> p = Pool(8, servers=('remote.computer.com:5678',))
# use an asynchronous parallel map
>>> res = p.amap(sleepy_squared, x)
>>> res.get()
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Run Code Online (Sandbox Code Playgroud)

这有点挑剔,remote.computer.com要使远程服务器工作,您必须事先启动在指定端口上运行的服务器- 并且您必须确保localhost和远程主机上的设置都允许直接连接或ssh-tunneled连接.此外,您需要在每台主机上运行相同版本的pathos和运行的pathos分支pp.此外,对于ssh,您需要运行ssh-agent以允许使用ssh进行无密码登录.

但是,希望它一切正常......如果您的功能代码可以传输到远程主机上dill.source.importable.

仅供参考,pathos早就应该发布一个版本,基本上,在新的稳定版本被削减之前,需要解决一些错误和界面变化.

  • 我应该提到我是`pathos`的作者。 (3认同)
  • 我强烈建议您从头到尾创建详细的设置指南,以便在服务器上运行 server.py 文件和客户端上的 client.py 文件后,客户端可以实际访问服务器并运行跨池的作业客户端和服务器。阅读此答案以及您对我的其他问题的回答后,我仍然不确定如何 (a) 设置服务器或 (b) 与服务器建立安全连接。 (2认同)

baz*_*zel 11

这里的派对有点晚了,但由于我也在寻找类似的解决方案,而且这个问题仍然没有得到回答,我想我会贡献我的发现.

我最终使用SCOOP.它提供了一个并行映射实现,可以跨多个主机跨多个内核工作.map如果需要,它也可以在调用期间回退到Python的串行函数.

从SCOOP的介绍页面,它引用了以下功能:

SCOOP与期货,多处理和类似模块相比的特点和优势如下:

  • 通过网络利用多台计算机的强大功能;
  • 能够在任务中生成多个任务;
  • API与PEP-3148兼容;
  • 只需稍加修改即可并行化串行代码;
  • 高效的负载平衡.

它确实有一些怪癖(函数/类必须是pickleable),并且如果它们不共享相同的文件系统模式,那么在多个主机上顺利运行的设置可能会很繁琐,但总的来说我对结果非常满意.为了我们的目的,做了相当多的Numpy和Cython,它提供了出色的性能.

希望这可以帮助.

  • @MikeMcKerns:我们在 SCOOP 上使用**字面**两行代码并行化我们的代码。一行用于导入语句(“from scoop import futures”),另一行用 SCOOP 的映射替换 Python 的内置串行映射(“futures.map(func,arraydata)”)。再简单不过了。 (2认同)