You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:52:15