python 脚本的 mpirun 不是预期的 运行
mpirun for python script is not running as expected
首先,我是 mpi 的新手,所以对于这可能是一个极其微不足道的问题,我深表歉意。
我正在尝试 运行 在我的笔记本电脑上并行 python 程序,然后再继续 运行 它在我大学的本地集群上。我已经成功地使用了多处理中的 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....
"""
"pool" 然后被送入一个来自不同库的对象,该库做自己的事情。这与用于多处理的代码相同,只是将来自 schwimmbad 的 MPIPool 替换为来自多处理的 Pool 并删除了 "if not pool.is_master()..." 代码块。我的笔记本电脑上有两个内核,所以要执行这个程序,我在终端中输入以下内容。
mpirun -n 2 python3 script.py
我希望此命令能够 运行 单个程序,并让池在这两个核心上分配进程。看起来实际发生的是两个副本 script.py 分别在每个核心上 运行。事实证实了这一点,在代码的主要部分执行之前,我告诉程序打印的所有内容都会打印两次,并且程序 运行s 与使用多处理的方式 运行s 相比相当慢模块。
我也尝试 运行 其他人的代码也使用相同命令的 MPIPool 并且发生了同样的事情 - 他们的程序 运行s 两次。
我怎样才能让 mpi运行 只是 运行 一个程序,它的进程分布在我机器上的两个内核上,就像我刚刚使用多处理模块一样?
感谢您的宝贵时间!
MPI 和 Python 的多处理实际上是 运行ning 分布式进程的两个完全不同的系统。
- Multiprocessing 是基于你的主程序在需要时启动新进程的原则。为了减少启动新进程的开销,您可以在一开始就创建一个其他进程的池,然后使用该池。但即便如此,它仍然是您的主程序,它会产生所有其他进程。
另一方面,- MPI 是基于您 运行 不同进程中的相同脚本并使这些不同的副本相互通信的想法( MPI 是一个消息接口)。不同的进程既不由程序的任何单个副本启动,也不直接受其控制。相反,您有一个外部经理
mpirun
。
下图显示了不同之处:左边的 MPI 有一个管理器,它启动了相同脚本的四个等效副本——每个副本都有不同的 rank 来区分它们。右边的多处理有一个主程序,然后产生其他实例。因此,多处理可以 运行 就像普通的 Python 脚本一样,不需要像 mpirun
.
这样的东西
回到你的问题:使用多进程时,主脚本可以将任务发送给其他进程。即使在池的情况下:除非这些辅助进程之一收到要做的事情,否则它们通常只是等待。使用 MPI,每个进程仅通过相同的程序并行工作,并且每个进程的行为就好像它是脚本中唯一的进程 运行 一样。在这里,您使用进程的等级来区分它们在做什么,并使用通信来同步它们的动作和处理。
首先,我是 mpi 的新手,所以对于这可能是一个极其微不足道的问题,我深表歉意。
我正在尝试 运行 在我的笔记本电脑上并行 python 程序,然后再继续 运行 它在我大学的本地集群上。我已经成功地使用了多处理中的 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....
"""
"pool" 然后被送入一个来自不同库的对象,该库做自己的事情。这与用于多处理的代码相同,只是将来自 schwimmbad 的 MPIPool 替换为来自多处理的 Pool 并删除了 "if not pool.is_master()..." 代码块。我的笔记本电脑上有两个内核,所以要执行这个程序,我在终端中输入以下内容。
mpirun -n 2 python3 script.py
我希望此命令能够 运行 单个程序,并让池在这两个核心上分配进程。看起来实际发生的是两个副本 script.py 分别在每个核心上 运行。事实证实了这一点,在代码的主要部分执行之前,我告诉程序打印的所有内容都会打印两次,并且程序 运行s 与使用多处理的方式 运行s 相比相当慢模块。
我也尝试 运行 其他人的代码也使用相同命令的 MPIPool 并且发生了同样的事情 - 他们的程序 运行s 两次。
我怎样才能让 mpi运行 只是 运行 一个程序,它的进程分布在我机器上的两个内核上,就像我刚刚使用多处理模块一样?
感谢您的宝贵时间!
MPI 和 Python 的多处理实际上是 运行ning 分布式进程的两个完全不同的系统。
- Multiprocessing 是基于你的主程序在需要时启动新进程的原则。为了减少启动新进程的开销,您可以在一开始就创建一个其他进程的池,然后使用该池。但即便如此,它仍然是您的主程序,它会产生所有其他进程。 另一方面,
- MPI 是基于您 运行 不同进程中的相同脚本并使这些不同的副本相互通信的想法( MPI 是一个消息接口)。不同的进程既不由程序的任何单个副本启动,也不直接受其控制。相反,您有一个外部经理
mpirun
。
下图显示了不同之处:左边的 MPI 有一个管理器,它启动了相同脚本的四个等效副本——每个副本都有不同的 rank 来区分它们。右边的多处理有一个主程序,然后产生其他实例。因此,多处理可以 运行 就像普通的 Python 脚本一样,不需要像 mpirun
.
回到你的问题:使用多进程时,主脚本可以将任务发送给其他进程。即使在池的情况下:除非这些辅助进程之一收到要做的事情,否则它们通常只是等待。使用 MPI,每个进程仅通过相同的程序并行工作,并且每个进程的行为就好像它是脚本中唯一的进程 运行 一样。在这里,您使用进程的等级来区分它们在做什么,并使用通信来同步它们的动作和处理。