Странное взаимодействие между h5py, подпроцессом и mpirun - PullRequest
0 голосов
/ 04 февраля 2020

Похоже, что импорт 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 связан с серийным hdf5 в 18.04 и с параллельным hdf в 19.04

Это ошибка или особенность? Каков будет правильный способ запуска задачи mpi в такой ситуации?

1 Ответ

0 голосов
/ 05 февраля 2020

ок, проблема не связана с подпроцессом. То же поведение с 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)

Для меня достаточно обходного пути.

...