【问题标题】:Sending process to different nodes with mpi4py使用 mpi4py 将进程发送到不同的节点
【发布时间】:2014-09-18 23:52:24
【问题描述】:

我有一个函数,我想跨集群中的多个节点进行评估。我已经使用MPI4py 在我们的集群上运行了一些简单的示例,但是希望找到一个python 包,它可以让事情变得更加用户友好(比如实现multiprocessingmap 功能)但也有一点更多地控制产生多少进程以及在哪些节点上产生。我见过一些实现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 之上并执行我正在寻找的操作?

【问题讨论】:

    标签: python numpy cluster-computing mpi4py


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 2015-08-20
      • 1970-01-01
      相关资源
      最近更新 更多