Slurm和mpi4py:用一个进程重复n次操作,而不是用n个进程重复一次

问题描述

我是Slurm和mpi4py的新用户,所以我想测试一下在这里找到的一些代码https://researchcomputing.princeton.edu/mpi4py

我的python代码test.py如下:

from mpi4py import MPI
import sys

def print_hello(rank,size,name):
  msg = "Hello World! I am process {0} of {1} on {2}.\n"
  sys.stdout.write(msg.format(rank,name))

if __name__ == "__main__":
  size = MPI.COMM_WORLD.Get_size()
  rank = MPI.COMM_WORLD.Get_rank()
  name = MPI.Get_processor_name()

  print_hello(rank,name)

我的bash脚本是:

#!/bin/bash
#SBATCH --job-name=mpi4py-test 
#SBATCH --nodes=1                
#SBATCH --ntasks=3              
#SBATCH --cpus-per-task=1 

srun python test.py

运行sbatch run.sh时,我希望得到类似的东西:

Hello World! I am process 0 of 3 on node1.
Hello World! I am process 1 of 3 on node1.
Hello World! I am process 2 of 3 on node1.

但是我得到了:

Hello World! I am process 0 of 1 on node1.
Hello World! I am process 0 of 1 on node1.
Hello World! I am process 0 of 1 on node1.

如果我将srun python test.py更改为srun mpiexec -n 3 python test.py,我会得到:

Hello World! I am process 0 of 3 on node1.
Hello World! I am process 2 of 3 on node1.
Hello World! I am process 1 of 3 on node1.
Hello World! I am process 1 of 3 on node1.
Hello World! I am process 0 of 3 on node1.
Hello World! I am process 2 of 3 on node1.
Hello World! I am process 0 of 3 on node1.
Hello World! I am process 1 of 3 on node1.
Hello World! I am process 2 of 3 on node1.

该过程执行了3次,但我只希望它执行一次。 预先感谢。

解决方法

可能是因为其中之一

  • Mpi4py使用的MPI版本未通过Slurm支持进行编译;或
  • 您有一个非常老的OpenMPI;或
  • 您有一个很老的Slurm。

运行

mpiexec -n 3 python test.py

可能会为您带来想要的东西。