我有一个函数,我希望在集群中的多个节点上进行评估。我已经使用MPI4py
在我们的集群上运行了简单的示例,但希望找到一个python包,使事情更加用户友好(比如实现map
的{{1}}功能)还可以更多地控制生成的进程数和节点数。我见过一些实现multiprocessing
的软件包,但没有任何软件包可以控制每个节点上生成的进程数。
以下代码接近说明我的意思。但是,不是像map
那样以典型的方式编写它,而是像使用MPI4py
函数一样编写它。我是这样编写的,因为这最终是我想要实现代码的方式(使用模拟map
的模块),因为我不太确定如何使用MPI来实现它我想做什么。
map
我想控制发送到每个节点的进程数的原因是from numpy import *
from multiprocessing import Pool
def foo(n):
random.seed(n)
a = random.randn(1000,1000)
b = random.randn(1000,1000)
c = dot(a, b)
return c.mean()
if __name__ == '__main__':
pool = Pool(processes=4)
results = pool.map(foo, range(4))
print results
内部的一些指令可以是多线程的(如foo
,它也可以链接到MKL库)。
如果我有一台12台计算机的集群,每台计算机有2个核心,我只想向12个节点中的每个节点发送一个作业,它将隐含地利用这两个核心。我不想生成24个作业(每个核心一个),因为当两个进程都试图使用两个核心时,我担心可能的线程抖动。我也不能只生成12个进程,因为我不能确定它会向每个节点发送一个进程而不是向前6个节点发送2个进程。
首先,这应该是一个主要问题吗?运行24个流程而不是12个流程会对性能产生多大影响?
如果它会有所作为,是否有一个python包将叠加在dot
之上并做我正在寻找的东西?
答案 0 :(得分:1)
我想要同样的事情,所以我写了一个proof of concept来跟踪每个主机上有多少工作进程空闲。如果你有一个将使用两个线程的作业,那么它会等待一个主机有两个空闲工作者,将作业分配给其中一个工作者,并让另一个工作者保持空闲状态直到作业结束。
要指定在每台主机上启动的进程数,请使用a hostfile。
关键是让根进程从任何其他进程接收消息:
source_host, worker_rank, result = MPI.COMM_WORLD.recv(source=MPI.ANY_SOURCE)
这样,一旦每项工作完成,它就会发现。然后,当它准备就绪时,它会将作业发送给特定的工作人员:
comm.send(row, dest=worker_rank)
最后,它通过发送None
消息告诉所有工作人员关闭:
comm.send(None, dest=worker_rank)
在我写完这篇文章之后,我找到了jbornschein's mpi4py task pull example。它不处理每个作业的线程数,但我喜欢它使用不同消息类型的标记的方式。