繁体   English   中英

python 脚本的 mpirun 未按预期运行

[英]mpirun for python script is not running as expected

首先,我对 mpi 很陌生,所以我对可能是一个极其微不足道的问题深表歉意。

我试图在我的笔记本电脑上并行运行 python 程序,然后我提前 go 并在我大学的本地集群上运行它。 我在多处理中使用 Pool 取得了成功; 但是,我现在需要使用来自 schwimmbad 的 MPIPool 创建一个池。

将事物并行化的代码的主要组成部分如下。

from schwimmbad import MPIPool

"""
Various other components of the code...
"""

with MPIPool() as pool:


    if not pool.is_master():
        pool.wait()
        sys.exit(0)

"""
The code continues....
"""

然后将“池”从一个不同的库中输入到 object 中,该库自己做事。 这与用于多处理的代码相同,将 schwimmbad 的 MPIPool 替换为多处理的 Pool 并删除“if not pool.is_master()...”代码块。 我的笔记本电脑上有两个内核,所以要执行这个程序,我在终端中输入以下内容。

mpirun -n 2 python3 script.py

我希望这个命令运行一个程序并让池将进程分布在这两个核心上。 看起来实际发生的是两个副本 script.py 分别在每个核心上运行。 事实证明,在执行代码的主要部分之前我告诉程序打印的所有内容都会打印两次,并且与使用多处理模块的运行方式相比,程序运行速度相当慢。

我还尝试运行其他人的代码,该代码也使用相同的命令使用 MPIPool,并且发生了同样的事情——他们的程序运行了两次。

如何让 mpirun 只运行一个程序,其进程分布在我机器上的两个内核上,就像我刚刚使用多处理模块一样?

感谢您的时间!

MPI 和 Python 的多处理实际上是运行分布式进程的两个完全不同的系统。

  • 多处理基于您的主程序在需要时启动新进程的原则。 为了减少启动新进程的开销,您可以在一开始就创建一个其他进程池,然后使用该池。 但即便如此,它仍然是你的主程序产生了所有其他进程。
  • 另一方面, MPI是基于您在不同的进程中运行相同的脚本并使这些不同的副本相互通信的想法(MPI 是一个消息传递接口)。 不同的进程既不是由您的程序的任何单独副本启动,也不受其直接控制。 相反,您为此有一个外部经理mpirun

下图显示了差异:左侧的 MPI 有一个管理器,它启动相同脚本的四个等效副本——每个副本都有不同的等级来区分它们。 右边的多处理有一个主程序,然后产生其他实例。 因此,多处理可以像普通的 Python 脚本一样运行,不需要mpirun之类的东西。

在此处输入图像描述

回到您的问题:使用多处理时,主脚本可以将任务发送到其他进程。 即使在池的情况下:除非这些辅助进程之一收到要做的事情,否则它们通常只是等待。 使用 MPI,每个进程仅通过同一个程序并行工作,并且每个进程的行为就像它是运行脚本的唯一进程一样。 在这里,您使用进程的等级来区分他们在做什么,并使用通信来同步他们的动作和处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM