【问题标题】:Strange interaction between h5py, subprocess and mpirunh5py、子进程和mpirun之间的奇怪交互
【发布时间】:2020-05-20 10:38:52
【问题描述】:

似乎导入 h5py 会阻止使用 subprocess 运行 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 任务的正确方法是什么?

【问题讨论】:

  • h5py 依赖于mpi4py,这意味着MPI_Init_thread() 被调用之前 mpirun。由于内部原因,Open MPI 应用程序无法调用mpirun。一种选择是重建h5py,使其不依赖于mpi4py,另一种选择是使用MPI_Comm_spawn()而不是subprocess.run()

标签: python python-3.x subprocess mpi h5py


【解决方案1】:

好的,问题与子进程无关。 与 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 传递给 subprocess.Popen

所以问题的更正程序可能如下所示:

import h5py
import subprocess
import os

result=subprocess.run(['mpirun','-np','2','uptime'], env=os.environ, shell=False)

print(result.returncode)

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

【讨论】:

    猜你喜欢
    • 2015-12-24
    • 1970-01-01
    • 2015-07-30
    • 2016-12-13
    • 2019-05-25
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多