如何让Slurm根据分区制定作业节点分配策略?
异构集群Slurm配置方案(适配不同分区的任务布局)
一、先搞定集群分区的基础配置(slurm.conf)
首先确保两个分区的节点归属和基础参数配置正确,在slurm.conf里添加/修改:
- 小节点分区:
NodeName=small[01-xx] CPUs=64 Partition=partition_smallnodes - 大节点分区:
NodeName=large[01-xx] CPUs=256 Partition=partition_largenodes - 分区状态配置:
PartitionName=partition_smallnodes Default=NO MaxTime=INFINITE State=UP PartitionName=partition_largenodes Default=NO MaxTime=INFINITE State=UP
这里Default=NO是避免作业默认提交到某一分区,需手动指定可选分区。
二、作业提交的核心配置
你的需求核心是:同一作业的2个MPI任务,在大节点分区要挤在同一个独占节点,小节点分区要各占一个独占节点。直接用Slurm参数+简单脚本逻辑就能实现,不用复杂的集群钩子。
1. 单作业通用提交脚本
写一个通用作业脚本,让Slurm自动适配分区:
#!/bin/bash #SBATCH --job-name=test_job #SBATCH --ntasks=2 # 固定每个作业的MPI任务数为2 #SBATCH --partition=partition_smallnodes,partition_largenodes # 允许提交到两个分区 #SBATCH --exclusive # 强制节点独占,彻底避免跨作业混放线程 # 根据实际分配的分区调整任务布局 if [[ $SLURM_JOB_PARTITION == "partition_largenodes" ]]; then # 大节点分区:2个任务放同一节点 srun --ntasks-per-node=2 ./你的MPI程序路径 else # 小节点分区:每个任务单独占一个节点 srun --ntasks-per-node=1 ./你的MPI程序路径 fi
关键说明:
--exclusive是核心:不管大节点还是小节点,都会让分配的节点完全属于当前作业,完美满足大节点分区“禁止跨作业混放线程”的要求。$SLURM_JOB_PARTITION是Slurm分配作业后自动设置的环境变量,用来判断实际使用的分区,动态调整srun的任务分配规则。
2. 批量提交数百个作业
要是要提交几百个这类作业,写个循环脚本就行,不用一个个写作业脚本:
#!/bin/bash # 循环提交100个作业,按需修改数字 for job_id in {1..100}; do sbatch --job-name=job_${job_id} \ --ntasks=2 \ --partition=partition_smallnodes,partition_largenodes \ --exclusive \ --wrap="if [[ \$SLURM_JOB_PARTITION == \"partition_largenodes\" ]]; then srun --ntasks-per-node=2 ./你的MPI程序路径; else srun --ntasks-per-node=1 ./你的MPI程序路径; fi" done
用--wrap参数直接把执行逻辑嵌到提交命令里,省得写一堆重复的脚本。
3. 更简洁的方式:给分区设默认任务数
不想写脚本判断的话,直接在slurm.conf里给每个分区设置默认的单节点任务数:
- 小节点分区加
DefaultNTasksPerNode=1:PartitionName=partition_smallnodes Default=NO MaxTime=INFINITE State=UP DefaultNTasksPerNode=1 - 大节点分区加
DefaultNTasksPerNode=2:PartitionName=partition_largenodes Default=NO MaxTime=INFINITE State=UP DefaultNTasksPerNode=2
之后提交作业就不用判断分区了,直接提交就行:
sbatch --job-name=job_x --ntasks=2 --partition=partition_smallnodes,partition_largenodes --exclusive --wrap="srun ./你的MPI程序路径"
Slurm会自动用对应分区的默认单节点任务数,自动适配布局。
三、验证方法
提交作业后,用sacct -j <作业ID> -o JobID,Partition,NodeList,NTasks,NTasksPerNode查看分配情况,确认:
- 分到大节点的作业,
NodeList是单个节点,NTasksPerNode=2 - 分到小节点的作业,
NodeList是两个节点,NTasksPerNode=1
内容的提问来源于stack exchange,提问作者Amr ALHOSSARY
相关产品推荐
相关产品推荐

