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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:55:12