【问题标题】:Run MPI program using subprocess Popen使用子进程 Popen 运行 MPI 程序
【发布时间】:2021-02-11 08:33:49
【问题描述】:

我有一个 python 代码,它使用subprocess.Popenmpirun 运行另一个应用程序。 代码是否会在一台机器上运行得很好,而在另一台机器上我会遇到问题。 但我也有一个较旧的 conda 环境。 重现的最少代码如下:

from subprocess import Popen
from mpi4py import MPI

proc = Popen("mpirun -n 2 echo 1".split())

在这一行proc 立即终止并且proc.poll() 返回1。 python 脚本实际上并不使用 MPI,它只是以python script.py 运行,但它依赖于另一个调用 MPI 的程序。我需要用mpirun重复运行另一个代码(当然我实际上并没有执行echo 1)。

我认为这取决于安装的 MPI:

工作

$ conda list -n ForkTPS | grep mpi
WARNING: The conda.compat module is deprecated and will be removed in a future release.
fftw                      3.3.8           mpi_mpich_hc19caf5_1012    conda-forge
h5py                      2.10.0          nompi_py38h7442b35_105    conda-forge
hdf5                      1.10.6          mpi_mpich_hc096b2c_1010    conda-forge
mpi                       1.0                       mpich    conda-forge
mpi4py                    3.0.3            py38h4a80816_2    conda-forge
mpich                     3.3.2                hc856adb_2    conda-forge

还有

conda list | grep mpi
dask-mpi                  2.21.0                   pypi_0    pypi
fftw                      3.3.8           mpi_mpich_h3f9e1be_1011    conda-forge
hdf5                      1.10.5          mpi_mpich_ha7d0aea_1004    conda-forge
impi_rt                   2019.8                intel_254    intel
libnetcdf                 4.7.4           mpi_mpich_h755db7c_1    conda-forge
mpi                       1.0                       mpich  
mpi4py                    3.0.3            py37hf484d3e_7    intel
mpich                     3.3.2                hc856adb_0    conda-forge
netcdf4                   1.5.3           mpi_mpich_py37h91af3bc_3    conda-forge

不工作

conda list | grep mpi
fftw                      3.3.8           mpi_openmpi_h6dd7431_1011    conda-forge
hdf5                      1.10.6          mpi_openmpi_hac320be_1    conda-forge
mpi                       1.0                     openmpi    conda-forge
mpi4py                    3.0.3            py38h246a051_2    conda-forge
openmpi                   4.0.5                hdf1f1ad_1    conda-forge

是否有合理且可重现的方法来避免此问题?我必须将我的代码提供给几个合作者。乍一看,我想说区别在于使用MPICHOpenMPI

【问题讨论】:

  • 如果您只是从命令行运行mpirun -np 1 echo 1 会怎样?然后mpirun -np 2 echo 1?
  • 如果我只是手动执行命令,我会得到正确的结果 '1' '1\n1'。

标签: python mpi mpi4py


【解决方案1】:

至少对于 Open MPI,您不能从 MPI 程序中 fork&exec mpirun

因为你from mpi4py import MPI,python脚本是在单例模式下运行的,所以你不能Popen(["mpirun", ...)

删除mpi4py 行应该可以解决您的问题。

【讨论】:

  • 是的,显然删除from mpi4py import MPI 解决了这个问题,但伴随着必须维护一个非常复杂项目的私有分支的成本。您的回答表明,避免 OpenMPI 并使用例如MPICHI.
  • “python 脚本实际上并没有使用 MPI”是一个不正确的陈述,有些人可能会发现它很明显,但觉得没有必要说明它。无论如何,不​​要在字里行间错误地阅读:Open MPI 单独在这里对你不起作用,但不要断定MPICH 将永远有效。您可以考虑使用构建在Open MPI 之上的mpi4py 运行您的python 脚本,并从MPICH 调用mpirun。或者反过来。处理此问题的规范方法是使用 MPI_Comm_spawn() 而不是 fork&exec mpirun
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多