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

标签 python numpy cluster-computing mpi4py

我有一个函数,希望在集群中的多个节点上进行评估。我已经使用 MPI4py 在我们的集群上运行了简单的示例,但希望找到一个 python 包,使事情变得更加用户友好(例如实现 map 功能) 多处理),而且还可以更好地控制生成多少个进程以及在哪个节点上生成。我见过一些实现 map 的包,但没有看到任何控制每个节点上生成多少进程的包。

下面的代码很接近地说明了我的意思。但是,我没有像使用 MPI4py 那样以典型方式编写它,而是像使用 map 函数那样编写它。我这样写是因为这最终是我想要实现代码的方式(使用模拟 map 的模块),并且因为我不太确定如何使用MPI 来实现我想做的事情。

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 内部的一些指令可以是多线程的(例如 dot ,它也可以是多线程的)链接到 MKL 库)。

如果我有一个由 12 台计算机组成的集群,每台计算机有 2 个核心,我只想向 12 个节点中的每一个节点发送一项作业,其中它将隐式利用两个核心。我不想生成 24 个作业(每个核心一个),因为我担心当两个进程都尝试使用两个核心时可能会出现线程抖动。我也不能只生成 12 个进程,因为我无法确定它会向每个节点发送一个进程,而不是向前 6 个节点发送 2 个进程。

首先,这应该是一个主要问题吗?运行 24 个进程(而不是 12 个)对性能有多大影响?

如果它会有所作为,是否有一个 python 包将覆盖在 MPI4py 之上并执行我正在寻找的操作?

最佳答案

我想要同样的东西,所以我写了一个 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 。它不处理每个作业的线程计数,但我喜欢它为不同消息类型使用标签的方式。

关于python - 使用 mpi4py 将进程发送到不同节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25924258/

相关文章:

python - 权限错误: [WinError 5] Access is Denied when Installing goose-extractor

python - 格式化 numpy 数组并保存到 *.txt

python - Google App Engine - 缺少 numpy.core.multiarray

Python - 在二进制 numpy 数组中找到一维质心的最佳方法

python - 将零设置为第一行包含一个的那些列

python - 如何使用 mod_wsgi 和 Django 提供静态文件?

python - ffmpeg的子进程调用返回负值

mysql - 为什么分开写和读更好?

多个节点(网络上的计算机)支持的 Java(暴力应用程序)

erlang - 如何在 Elixir/Phoenix 集群中分配持久连接?