Python脚本内提交含mpirun的SLURM独立作业遇递归调用错误
问题分析与解决方法
错误根源
你遇到的问题核心在于:MPI进程的环境变量被传递给了新提交的SLURM作业。
你的Main.py是通过mpirun启动的,每个MPI进程的环境中都带有OpenMPI(或所用MPI实现)的专属变量(比如OMPI_COMM_WORLD_RANK、OMPI_COMM_WORLD_SIZE)。当你在MPI进程里用os.system提交execute.sub时,sbatch会默认继承当前进程的所有环境变量。新启动的mpirun检测到这些变量后,会误以为自己是在一个已有的MPI环境中被递归调用,从而抛出"mpirun does not support recursive calls"错误。
另外,默认情况下所有MPI进程都会执行Main.py中的os.system代码,这会导致重复提交多个相同作业,进一步加剧环境干扰。
解决方法
1. 仅让主MPI进程提交作业
修改Main.py,只让rank为0的主进程执行sbatch提交操作,避免多进程重复提交和环境变量干扰:
from mpi4py import MPI import os comm = MPI.COMM_WORLD rank = comm.Get_rank() if rank == 0: # 仅主进程提交作业 os.system("sbatch execute.sub")
2. 清除MPI相关环境变量
在提交作业时,先清除MPI专属环境变量,再执行sbatch,避免传递给新作业:
# 结合主进程判断的写法 if rank == 0: os.system("unset OMPI_COMM_WORLD_RANK OMPI_COMM_WORLD_SIZE OMPI_MCA_* && sbatch execute.sub")
或者直接在execute.sub脚本开头添加清除命令,从源头隔断环境变量传递:
#!/bin/bash #SBATCH --nodes=3 # 其他SLURM参数... # 清除MPI环境变量 unset OMPI_COMM_WORLD_RANK OMPI_COMM_WORLD_SIZE OMPI_MCA_* # 启动作业,建议用SLURM环境变量指定任务数 mpirun --np $SLURM_NTASKS other_application
3. 适配SLURM的mpirun调用方式
确保execute.sub中的mpirun正确使用SLURM调度的资源,避免手动指定节点/任务数,改用SLURM提供的环境变量(比如$SLURM_NTASKS),让mpirun自动适配SLURM分配的资源,减少环境冲突概率。
内容的提问来源于stack exchange,提问作者yvrob
相关产品推荐
相关产品推荐

