使用MPI4PY在多节点运行Python程序遇阻塞问题求助
多节点运行MPI Python程序无输出问题
问题描述
我在多节点集群测试Python MPI程序,先写了一个hello world脚本(代码见下文)。单节点场景下,用swrun或srun申请1个计算节点,加载opence/1.5.1模块后,通过mpirun运行脚本可正常输出结果。但用指定srun命令申请2个节点后,执行mpirun python hello_mpi.py或mpirun -np 2 python hello_mpi.py时,程序既无输出也无报错,一直处于运行状态。
环境信息:
- mpirun(Open MPI)4.1.1
- Python 3.9.12
相关代码与命令
hello_mpi.py 代码
from mpi4py import MPI comm = MPI.COMM_WORLD rank = comm.Get_rank() size = comm.Get_size() print('hello world from process %d/%d' %(rank,size))
申请2节点的srun命令
srun --partition=cpu --time=4:00:00 --nodes=2 --ntasks-per-node=1 --sockets-per-node=1 --cores-per-socket=1 --threads-per-core=1 --mem-per-cpu=1200 --wait=0 --export=ALL --gres=gpu:v100:0 --pty /bin/bash
环境路径验证命令及输出
which python /opt/miniconda3/envs/opence-v1.5.1/bin/python
which mpirun /opt/miniconda3/envs/opence-v1.5.1/bin/mpirun.
which mpi /usr/bin/which: no mpi in (/opt/miniconda3/envs/opence-v1.5.1/bin:/opt/miniconda3/condabin:/usr/local/cuda-11.2/bin:/opt/openmpi-v4.1.1/bin:/home/jbtrejo2/.local/bin:/home/jbtrejo2/bin:/opt/swsuite/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin).
排查与解决建议
- 避免MPI启动嵌套:用
srun申请交互式节点后再执行mpirun,容易出现启动嵌套导致的通信阻塞。建议直接用srun启动MPI程序,比如执行srun python hello_mpi.py。 - 指定MPI通信方式:多节点运行时,强制Open MPI使用TCP通信,执行
mpirun --mca btl tcp,self -np 2 python hello_mpi.py,避免默认通信组件在跨节点场景下失效。 - 验证mpi4py绑定版本:检查
mpi4py是否与当前Open MPI版本兼容,执行python -c "from mpi4py import MPI; print(MPI.Get_version())",确认输出的版本为4.1.1。若版本不匹配,需重新编译mpi4py绑定当前集群的Open MPI。 - 检查节点连通性:确认两个计算节点之间能正常通信,可通过
ping命令测试节点间网络,同时检查集群防火墙是否拦截MPI通信端口。 - 显式指定节点列表:在
mpirun中通过--host参数指定两个节点的主机名,确保MPI能正确识别并调度到申请的节点上。
内容的提问来源于stack exchange,提问作者Jacob Trejo
相关产品推荐
相关产品推荐

