mpiexec 和 python mpi4py 给出等级 0 和大小 1

Posted

技术标签:

【中文标题】mpiexec 和 python mpi4py 给出等级 0 和大小 1【英文标题】:mpiexec and python mpi4py gives rank 0 and size 1 【发布时间】:2015-05-29 15:41:12 【问题描述】:

我在虚拟机上运行 python Hello World mpi4py 代码时遇到问题。

hello.py 代码是:

#!/usr/bin/python
#hello.py
from mpi4py import MPI

comm = MPI.COMM_WORLD

size = comm.Get_size()
rank = comm.Get_rank()

print "hello world from process ", rank,"of", size

我尝试使用 mpiexec 和 mpirun 运行它,但它运行得并不好。 输出:

$ mpirun -c 4 python hello.py 
hello world from process  0 of 1
hello world from process  0 of 1
hello world from process  0 of 1
hello world from process  0 of 1

来自 mpiexec:

$ mpiexec -n 4 python hello.py 
hello world from process  0 of 1
hello world from process  0 of 1
hello world from process  0 of 1
hello world from process  0 of 1

他们似乎没有获得通信的排名和规模。什么会导致这种情况?如何解决?

mpiexec --version
mpiexec (OpenRTE) 1.6.5

mpirun --version
mpirun (Open MPI) 1.6.5

系统是虚拟机上的 Ubuntu 14.04。

任何想法为什么?谢谢!

【问题讨论】:

MPI_Rank return same process number for all process的可能重复 很可能,您的 mpi4py 是针对与您用于运行程序的 mpiexec/mpirun 不同的 MPI 实现构建的。 mpi4py.get_config() 是否返回与您的 mpirun 在同一路径中的编译器? mpi4py.get_config() 返回'mpicxx': '/usr/bin/mpicxx', 'mpif77': '/usr/bin/mpif77', 'mpicc': '/usr/bin/mpicc', 'mpif90': '/usr/bin/mpif90' 但是我在本地主机上尝试了相同的操作并获得了相同的输出(相同的配置),并且在我的本地主机上代码有效。 好的 - 看起来为 MPI 安装了 MPICH 和 OpenMPI 版本(或至少是版本的存根)。这是这个问题的典型来源——你有一个用一个实现编译的 mpi4py 并试图用另一个实现运行它。尝试同时使用 mpirun.mpich 和 mpirun.openmpi 显式运行,或者完全卸载其中一个(包括所有库) 是的,openmpi mpiexec 版本返回 0 和 1。mpich mpiexec 工作得很好。非常感谢您的帮助! 【参考方案1】:

我在运行 python 模块emcee 时遇到了同样的问题。它会给我一个错误:

"ValueError: Tried to create an MPI pool, but there was only one MPI process available. 
Need at least two."

我为我的特定集群找到的解决方案是使用不同的 MPI。我的代码适用于intel-mpimpich2,但不适用于openmpi。对于这个系统,我所要做的就是切换 MPI。在我的PBS 脚本中,我使用了module load mpich2 而不是module load openmpi。在这种情况下,mpiexecmpirun 工作正常。

【讨论】:

切换什么?在哪里切换?我正在努力理解你的帖子,我遇到了和 OP 一样的问题。 我编辑了答案以澄清我为我的特定系统切换了 MPI。【参考方案2】:

正如上面和 C 的 this question 中所建议的,这与 mpirun 来自与 mpi4py 关联的不同 MPI 有关。

就我而言,我怀疑许多其他 Python 用户也是如此,这是因为最初安装了 mpi4pyconda,这将非系统版本的 MPI 拉入了我的 conda --即which mpirun 在我的conda 环境中提供了一条路径。

为了解决问题,我运行了conda remove mpi4py,然后运行了pip install mpi4py,这似乎在conda 环境中针对MPI 重建mpi4py 并解决了问题。

【讨论】:

以上是关于mpiexec 和 python mpi4py 给出等级 0 和大小 1的主要内容,如果未能解决你的问题,请参考以下文章

mpi4py传递dict对象

如何在执行 time.sleep() 之前让 mpi4py 进程完成打印?

PBS 作业管理系统

mpi4py 返回排名差异

如何在程序中返回 mpiexec -n 参数?

python 来自mpi4py存储库的Pi计算脚本的修改版本。