使用子进程Popen运行MPI程序

问题描述

我有一个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 scrip实际上并不使用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

解决方法

至少对于Open MPI,您不能从MPI程序派生并执行$suffix = ":r ""$CurrentDir\$DeleteTempTableScript""`r`nGO" (Get-ChildItem $TFSDirectory"Schemas" -Filter *.sql -Recurse).FullName | ForEach-Object { "PRINT '$_'" "GO" ":r ""$_""" "GO" $suffix } | Set-Content -Path $MasterSQLFileName -Encoding UTF8 (Get-ChildItem $TFSDirectory"Functions" -Filter *.sql -Recurse).FullName | ForEach-Object { "PRINT '$_'" "GO" ":r ""$_""" "GO" $suffix } | Add-Content -Path $MasterSQLFileName -Encoding UTF8 (Get-ChildItem $TFSDirectory"Sequences" -Filter *.sql -Recurse).FullName | ForEach-Object { "PRINT '$_'" "GO" ":r ""$_""" "GO" $suffix } | Add-Content -Path $MasterSQLFileName -Encoding UTF8

由于您mpirun,python脚本以单例模式运行,因此您无法from mpi4py import MPI

摆脱Popen(["mpirun",...)这一行应该可以解决您的问题。