gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:42:01 26 4
gpt4 key购买 nike

我有一个函数,我想在集群中的多个节点上对其进行评估。我已经得到了使用 MPI4py 在我们的集群上运行的简单示例,但我希望找到一个 python 包,使事情更加用户友好(比如实现 map 功能multiprocessing),但也可以更好地控制生成多少进程以及在哪些节点上生成进程。我见过一些实现 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 消息告诉所有 worker 关闭:

comm.send(None, dest=worker_rank)

写完之后,我找到了jbornschein's mpi4py task pull example .它不处理每个作业的线程数,但我喜欢它为不同的消息类型使用标签的方式。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com