h5py,子进程和mpirun之间的奇怪交互



>似乎导入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)

对我来说,解决方法就足够了。

最新更新