>似乎导入h5py会阻止使用子进程运行mpi任务。
请考虑以下代码:
#!/usr/bin/python3
#import h5py
import subprocess
result=subprocess.run(['mpirun','-np','2','uptime'],shell=False)
print(result.returncode)
第一行注释后,输出如下所示:
15:44:04 up 5 days, 6:34, 4 users, load average: 29,16, 29,89, 25,09
15:44:04 up 5 days, 6:34, 4 users, load average: 29,16, 29,89, 25,09
0
如果我取消注释第一行,则输出如下所示:
1
未执行任何内容,未打印任何错误消息,返回代码为 1。
一切都在 Ubuntu 19.10 上进行了测试。 在 Ubuntu 18.04 上没有这样的问题。
可能是因为 h5py 在 18.04 中与串行 hdf5 链接,在 19.04 中与并行 hdf 链接
是错误还是功能? 在这种情况下启动 mpi 任务的正确方法是什么?
好的,问题与子进程无关。 与os.system,os.execvp相同的行为,...
看起来这个版本的h5py的简单导入会初始化进程的 MPI 环境。 因此,任何子进程都会接收大量与openmpi相关的环境变量。
您可以使用以下代码看到其中一些变量:
import h5py
import os
os.system('env | grep PMIX')
输出可能如下所示:
PMIX_RANK=0
PMIX_NAMESPACE=4066967553
PMIX_GDS_MODULE=ds21,ds12,hash
PMIX_SYSTEM_TMPDIR=/tmp
PMIX_SERVER_URI2=4066967552.0;tcp4://127.0.0.1:39583
PMIX_SERVER_URI3=4066967552.0;tcp4://127.0.0.1:39583
PMIX_BFROP_BUFFER_TYPE=PMIX_BFROP_BUFFER_NON_DESC
...
使用这样的环境变量,mpirun静默退出,错误代码为 1。
奇怪,但这些环境变量在os.environ中看不到。 但是,这提供了该问题的解决方法: 只需显式地将os.environ传递给子进程。 要么使用os.execvpe的第三个参数,要么将env=os.environ传递给子进程。波彭。
因此,问题中更正的程序可能如下所示:
import h5py
import subprocess
import os
result=subprocess.run(['mpirun','-np','2','uptime'], env=os.environ, shell=False)
print(result.returncode)
对我来说,解决方法就足够了。