【问题标题】:mpirun for python script is not running as expectedpython 脚本的 mpirun 未按预期运行
【发布时间】:2020-05-22 13:25:37
【问题描述】:

首先,我对 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 分别在每个核心上运行。事实证明,在执行代码的主要部分之前我告诉程序打印的所有内容都会打印两次,并且与使用多处理模块的运行方式相比,程序运行速度相当慢。

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

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

感谢您的宝贵时间!

【问题讨论】:

  • 你有什么问题?
  • 我已经在最后澄清了这个问题,我很抱歉。

标签: python python-multiprocessing


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 2021-11-03
    相关资源
    最近更新 更多