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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:12:02