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-mpi
和mpich2
,但不适用于openmpi
。对于这个系统,我所要做的就是切换 MPI。在我的PBS
脚本中,我使用了module load mpich2
而不是module load openmpi
。在这种情况下,mpiexec
和 mpirun
工作正常。
【讨论】:
切换什么?在哪里切换?我正在努力理解你的帖子,我遇到了和 OP 一样的问题。 我编辑了答案以澄清我为我的特定系统切换了 MPI。【参考方案2】:正如上面和 C 的 this question 中所建议的,这与 mpirun
来自与 mpi4py
关联的不同 MPI 有关。
就我而言,我怀疑许多其他 Python 用户也是如此,这是因为最初安装了 mpi4py
到 conda
,这将非系统版本的 MPI 拉入了我的 conda
--即which mpirun
在我的conda
环境中提供了一条路径。
为了解决问题,我运行了conda remove mpi4py
,然后运行了pip install mpi4py
,这似乎在conda
环境中针对MPI 重建mpi4py
并解决了问题。
【讨论】:
以上是关于mpiexec 和 python mpi4py 给出等级 0 和大小 1的主要内容,如果未能解决你的问题,请参考以下文章