Slurm sbatch任务数组分配异常:多节点单核心而非单节点多核心并发
Slurm单核心任务调度问题:节点分配与并发运行解决方案
问题概述
- 拥有多个单核心任务,集群共5节点,每节点96核
- 提交任务时,任务被分散到多节点;任务数超5时,串行运行而非并发
- 限制节点后仍无法并发,集群配置为
cons_tres - 使用
$SLURM_PROCID的包装脚本可正常运行,但$SLURM_ARRAY_TASK_ID更适配需求(需全程访问模型数据) - 尝试在sbatch脚本中加入
srun无效,示例脚本运行后5个任务被分配到5个节点各1核,而非同一节点的5核
用户提交脚本示例
#!/bin/tcsh ## SLURM TEST #SBATCH --job-name=seatest #SBATCH --nodes=1-1 #SBATCH --ntasks=5 #SBATCH --ntasks-per-node=5 #SBATCH --array=1-5 #SBATCH --output=slurm-%A_%03a.out hostname set CASE_NUM=`printf %03d $SLURM_ARRAY_TASK_ID` [srun] program-name seatest.$CASE_NUM.in
问题根源
你混淆了Slurm数组任务与多任务参数的逻辑:
--array=1-5会生成5个独立的数组任务实例,每个实例默认单独申请资源- 同时设置
--ntasks=5和--nodes=1,会让每个数组任务都尝试申请5个核心,资源需求冲突导致调度异常,最终出现任务分散或串行
解决方案与配置说明
方案1:单节点并发运行数组任务(推荐)
修改脚本参数,去掉冲突的--ntasks和--ntasks-per-node,明确每个任务仅需1核心,同时约束所有数组任务到同一节点:
#!/bin/tcsh ## SLURM TEST #SBATCH --job-name=seatest #SBATCH --nodes=1 # 强制所有任务分配到同一节点 #SBATCH --cpus-per-task=1 # 每个任务仅需1核心 #SBATCH --array=1-5 # 5个任务实例 #SBATCH --output=slurm-%A_%03a.out #SBATCH --exclusive # 可选,确保节点不被其他任务抢占(按需添加) hostname set CASE_NUM=`printf %03d $SLURM_ARRAY_TASK_ID` program-name seatest.$CASE_NUM.in
提交后,Slurm会将5个数组任务调度到同一节点的5个空闲核心,实现并发运行。
方案2:用srun批量启动任务(不依赖数组)
若需用ntasks参数,可去掉数组配置,通过srun结合SLURM_PROCID区分任务:
#!/bin/tcsh ## SLURM TEST #SBATCH --job-name=seatest #SBATCH --nodes=1 #SBATCH --ntasks=5 #SBATCH --ntasks-per-node=5 #SBATCH --output=slurm-%A_%03d.out srun --ntasks=5 --ntasks-per-node=5 bash -c ' CASE_NUM=$(printf %03d $SLURM_PROCID) program-name seatest.$CASE_NUM.in '
关键概念解析
- 数组任务:每个数组实例是独立任务,默认分散调度,需通过
--nodes=1强制集中到同一节点 - cons_tres配置:基于资源类型(TRES)计算资源消耗,参数冲突会导致调度行为偏离预期
- cpus-per-task:明确单个任务的核心需求,单核心任务设为1,让Slurm准确分配资源
内容的提问来源于stack exchange,提问作者lucky1969
相关产品推荐
相关产品推荐

