使用MPI4PY快速失败

时间:2018-04-17 01:08:16

标签: openmpi mpi4py

当使用mpi4py运行MPI脚本时,我想要以下行为:当任何进程抛出异常时,mpirun(及其生成的进程)应立即以非零错误代码退出。但相反,我发现即使一个或多个进程抛出异常,执行仍会继续。

我正在使用mpi4py 3.0.0和OpenMPI 2.1.2。我正在运行这个脚本 mpirun --verbose -mca orte_abort_on_non_zero_status 1 -n 4 python my_script.py。我预计这会在睡眠被击中之前立即结束,而是有排名的进程!= 0 sleep:

import time
import mpi4py

def main():
    import mpi4py.MPI
    mpi_comm = mpi4py.MPI.COMM_WORLD
    if mpi_comm.rank == 0:
        raise ValueError('Failure')


    print('{} continuing to execute'.format(mpi_comm.rank))
    time.sleep(10)
    print('{} exiting'.format(mpi_comm.rank)


if __name__ == '__main__':
    main()

如何获得我想要的行为(如果任何进程失败,则很快失败)?

谢谢!

2 个答案:

答案 0 :(得分:3)

这似乎是mpi4py的一个已知问题。从https://groups.google.com/forum/#!topic/mpi4py/RovYzJ8qkbc开始,我读到了:

  

mpi4py为您初始化/完成MPI。初始化发生在   导入时间,以及Python进程即将完成的最终化   finalize(我正在使用Py_AtExit()C-API调用来执行此操作)。如   MPI_Finalize()是集体的,可能在大多数MPI impls中受阻,   你得到了僵局。

解决方案是覆盖sys.excepthook并在其中明确调用MPI.COMM_WORLD.Abort

以下是您修改的代码:

import sys
import time
import mpi4py.MPI
mpi_comm = mpi4py.MPI.COMM_WORLD

def mpiabort_excepthook(type, value, traceback):
    mpi_comm.Abort()
    sys.__excepthook__(type, value, traceback)

def main():
    if mpi_comm.rank == 0:
        raise ValueError('Failure')


    print('{} continuing to execute'.format(mpi_comm.rank))
    time.sleep(10)
    print('{} exiting'.format(mpi_comm.rank))

if __name__ == "__main__":
    sys.excepthook = mpiabort_excepthook
    main()
    sys.excepthook = sys.__excepthook__

答案 1 :(得分:0)

事实证明,mpi4py可以作为修复此问题的模块运行(内部通过调用Abc(),如jcgiret所说):

mpirun --verbose -mca orte_abort_on_non_zero_status 1 -n 4 python -m mpi4py my_script.py