使用mpi4py将进程发送到不同的节点

时间:2014-09-18 23:52:24

标签: python numpy cluster-computing mpi4py

我有一个函数,我希望在集群中的多个节点上进行评估。我已经使用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之上并做我正在寻找的东西?

1 个答案:

答案 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。它不处理每个作业的线程数,但我喜欢它使用不同消息类型的标记的方式。

相关问题