Slurm多节点运行含多作业数组批量脚本警告问题的解决咨询
解决Slurm作业数组多节点分配问题
你遇到的警告是因为Slurm的资源配置逻辑:你请求了3个节点,但只设置了--ntasks=1——单个MPI任务默认不会跨多个节点运行,所以Slurm自动把节点数调整为1,这显然不符合你“每个作业用3个节点”的需求。
问题根源分析
你的原脚本是在一个Slurm作业里手动循环后台启动多个mpirun进程,但Slurm只给这个作业分配了1个节点(因为--ntasks=1的限制),这会导致多个mpirun在同一个节点上抢资源,既达不到多节点并行的目的,还会造成性能下降。
正确解决方案:使用Slurm作业数组
Slurm的--array参数专门用来处理批量作业,每个数组任务可以独立分配资源。针对你的需求,我们可以让每个数组任务分配3个节点,每个节点跑满28核。
修改后的脚本如下:
#!/bin/bash #SBATCH --job-name=Littest #SBATCH --array=0-2 # 对应3个输入文件,生成3个独立作业任务 #SBATCH --nodes=3 # 每个数组任务分配3个节点 #SBATCH --ntasks-per-node=28 # 每个节点启动28个MPI进程(刚好匹配节点28核) #SBATCH --cpus-per-task=1 # 每个MPI进程占用1个CPU核心 #SBATCH --output=output_%a.txt # %a会替换为数组任务索引,每个任务输出独立文件 #SBATCH --exclude=node2,node11,node43,node44 # 定义输入文件数组 declare -a arrK=(Li2.in Li6.in Li8.in) # 通过Slurm环境变量获取当前数组任务对应的输入文件 current_file=${arrK[$SLURM_ARRAY_TASK_ID]} # 加载依赖模块 module load intel module load qe/6.5 echo "启动数组任务 $SLURM_ARRAY_TASK_ID,处理文件:$current_file" # 使用srun替代mpirun,Slurm会自动根据配置分配进程数 srun pw.x -i $current_file > out.$current_file echo "数组任务 $SLURM_ARRAY_TASK_ID 完成"
关键参数说明
--array=0-2:创建3个独立的作业任务,索引从0到2,分别对应你的3个输入文件。--nodes=3:明确告诉Slurm每个数组任务需要3个节点。--ntasks-per-node=28:确保每个节点用满28核,3个节点总共84个MPI进程,和你原脚本中mpirun -np 84的需求一致。%a:在输出文件名中使用该占位符,每个数组任务的输出会保存到不同文件,避免互相覆盖。srun:Slurm推荐的并行任务启动命令,它能自动识别Slurm分配的资源,不需要手动指定-np参数,比mpirun更适配Slurm环境。
为什么原脚本不行?
原脚本中,你请求了3个节点但只设置--ntasks=1,Slurm认为单个任务无法利用多节点资源,因此自动调整节点数为1。同时,你在这个单节点上后台启动多个mpirun -np 84,会导致每个mpirun都试图占用84核,但单个节点只有28核,必然引发资源冲突。
额外建议
如果你的输入文件数量不确定,可以用--array=0-$((${#arrK[@]}-1))来自动生成数组范围,避免手动修改数字。
内容的提问来源于stack exchange,提问作者NikithaSrinivas
相关产品推荐
相关产品推荐

