OpenMPI 4.0.5无法将任务分发至多节点问题求助
集群多节点OpenMPI运行故障原因及解决方案
故障根因
- OpenMPI版本冲突:你使用的OpenMPI 4.0.5和集群系统默认预装的OpenMPI(从报错栈可判断为1.x版本,对应
libopen-rte.so.12)冲突。手动指定-host跨节点运行时,远程节点默认调用了系统路径下的旧版本orted守护进程,新旧版本接口不兼容直接触发段错误。 - OpenMPI未正确集成Slurm调度器:通过Slurm申请多节点资源后,OpenMPI没有读取Slurm分配的节点列表和slot配额,默认只识别当前首节点的CPU核心数,所以申请多节点后还是只能用单节点的slot,超出就报slot不足,加
--oversubscribe也只能在单节点超量跑,无法调度到其他节点。 - 编译链匹配问题:使用gcc 9.1.0编译的程序如果和系统默认OpenMPI的编译版本不一致,也会出现运行时接口调用异常。
分步解决方案
- 排查运行环境一致性
- 提交任务前先执行
module purge清空所有环境变量,再手动加载你使用的OpenMPI 4.0.5模块:module load openmpi/4.0.5-gcc9.1.0(模块名以集群实际提供的为准,如果是自行编译的OpenMPI,需手动export对应的PATH和LD_LIBRARY_PATH,确保OpenMPI的路径优先级高于系统默认路径) - 验证当前mpi路径是否正确:执行
which mpirun、which orted,确认返回的路径是你使用的4.0.5版本的路径,不是/usr/bin或者/usr/lib64下的系统默认路径。
- 提交任务前先执行
- 正确使用Slurm提交任务,不要手动指定
-host参数- 可使用sbatch脚本提交任务,示例配置如下:
#!/bin/bash #SBATCH -N 2 # 申请2个节点 #SBATCH --ntasks-per-node=12 # 每个节点12个任务 #SBATCH -p 替换为集群实际队列名 # 加载统一运行环境 module purge module load openmpi/4.0.5-gcc9.1.0 # 不需要加--host、--oversubscribe参数,OpenMPI会自动读取Slurm分配的资源 mpirun -np $SLURM_NTASKS ./hello_world
- 如需交互式测试,执行命令申请资源:
salloc -N 2 --ntasks-per-node=12 -p 队列名,分配成功后直接在交互式shell里执行mpirun -np 24 ./hello_world即可。
- 验证OpenMPI的Slurm支持
- 执行
ompi_info | grep slurm,确认输出中有slurm相关的组件,如果没有说明你使用的OpenMPI编译时没有开启Slurm支持,需要联系集群管理员重新编译OpenMPI,编译时添加--with-slurm参数。
- 执行
- 临时绕过方案(如果暂时无法修复OpenMPI编译配置)
- 可以通过指定Slurm生成的hostfile运行,命令如下:
mpirun -np 24 --hostfile $SLURM_JOB_NODELIST ./hello_world
该方案需要确保所有节点的OpenMPI环境变量一致,还是建议优先修复OpenMPI的Slurm集成问题。
- 可以通过指定Slurm生成的hostfile运行,命令如下:
内容的提问来源于stack exchange,提问作者johanna_teresa
相关产品推荐
相关产品推荐

