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
早就应该发布一个版本,基本上,在新的稳定版本被削减之前,需要解决一些错误和界面变化.
baz*_*zel 11
这里的派对有点晚了,但由于我也在寻找类似的解决方案,而且这个问题仍然没有得到回答,我想我会贡献我的发现.
我最终使用SCOOP.它提供了一个并行映射实现,可以跨多个主机跨多个内核工作.map
如果需要,它也可以在调用期间回退到Python的串行函数.
从SCOOP的介绍页面,它引用了以下功能:
SCOOP与期货,多处理和类似模块相比的特点和优势如下:
- 通过网络利用多台计算机的强大功能;
- 能够在任务中生成多个任务;
- API与PEP-3148兼容;
- 只需稍加修改即可并行化串行代码;
- 高效的负载平衡.
它确实有一些怪癖(函数/类必须是pickleable),并且如果它们不共享相同的文件系统模式,那么在多个主机上顺利运行的设置可能会很繁琐,但总的来说我对结果非常满意.为了我们的目的,做了相当多的Numpy和Cython,它提供了出色的性能.
希望这可以帮助.
归档时间: |
|
查看次数: |
13963 次 |
最近记录: |