python脚本的mpirun未按预期运行

2024-04-25 18:24:43 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我对mpi非常陌生,所以我为这一极其琐碎的问题深表歉意

在我继续在我大学的本地集群上运行python程序之前,我正在尝试在我的笔记本电脑上并行运行python程序。我成功地使用了多处理中的池;但是,我现在需要使用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....
"""

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

mpirun -n 2 python3 script.py

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

我还试着用相同的命令运行其他人的代码,这些代码也使用MPIPool,但同样的情况发生了——他们的程序运行了两次

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

谢谢你抽出时间


Tags: 代码程序masterifisscriptnotcode
1条回答
网友
1楼 · 发布于 2024-04-25 18:24:43

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

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

下图显示了不同之处:左侧的MPI有一个管理器,它启动同一脚本的四个等效副本,每个副本具有不同的等级,以区分它们。右侧的“多处理”有一个主程序,该程序随后派生出其他实例。因此,多处理可以像普通Python脚本一样运行,不需要像mpirun这样的东西

enter image description here

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

相关问题 更多 >