SLURM同一节点运行多进程遇异常:程序重复执行求解决方案
问题原因分析
你遇到的重复执行问题,核心是对SLURM中srun的默认行为理解有误:当你在提交脚本里使用srun但未指定任务数(-n/--ntasks)时,它会继承SBATCH指令里设置的-n 100参数。也就是说,你循环里的每一次srun ./program ${i},都会启动100个program进程(而非你预期的1个),100次循环下来就会产生10000个进程,这就是每个i对应的程序被多次执行的根源。
正确的实现方式
针对你的需求(100个带不同参数的任务,分配到5个24核节点),有两种推荐的实现方式:
方式1:使用SLURM任务数组(最推荐)
SLURM的任务数组(Job Array)专门用于处理这类批量参数化任务,无需手动写循环,SLURM会自动完成任务的节点分配。脚本修改如下:
#!/bin/bash #SBATCH -N 5 #SBATCH -n 100 #SBATCH --ntasks-per-node=24 #SBATCH --array=1-100 # 创建100个任务,ID从1到100 # 用SLURM提供的任务ID作为程序输入参数 ./program ${SLURM_ARRAY_TASK_ID}
这个脚本会自动生成100个独立任务,每个任务对应唯一的SLURM_ARRAY_TASK_ID值(1到100),SLURM会按照你设置的节点数和每节点任务数,将任务均匀分配到5个节点(4个节点各24个,第5个4个),完全匹配你的资源规划。
方式2:修改循环中的srun指令
如果你一定要保留循环写法,需要给每个srun明确指定仅启动1个任务,避免继承全局的-n 100参数:
#!/bin/bash #SBATCH -N 5 #SBATCH -n 100 #SBATCH --ntasks-per-node=24 for i in `seq 100`; do # 用-n 1强制每个srun只启动1个进程 srun -n 1 ./program ${i} & done wait
这样每次循环里的srun只会启动1个program进程,100次循环正好启动100个进程,SLURM会将它们分配到指定的5个节点上,满足你的资源配置要求。
内容的提问来源于stack exchange,提问作者rhmtsang
相关产品推荐
相关产品推荐

