slurm 作业调度系统指南(一)
在超算中心离不开 slurm 刚参加工作时,学校没学过,也没有系统的培训。刚开始还不了解登录节点、运算节点的,(超算系统上还是魔改的slurm)。甚至一段时间都在登录节点跑过作业。工作至今偶然也会遇到新人不会使用slurm把账号跑崩的情况。 在此记录一下常用到的命令。
查看空闲节点
交任务前先看看交到是什么分区~
sinfo提交任务
srun
最基础的提交任务指令
srun -N 1 -n 1 -p cp1 python test.py
# -N 节点数
# -n 进程数
# -p 分区
# 更多参数具体看 srun --helpsbatch
批量提交任务, 其中 #SBATCH 对应 srun 的参数
- 准备脚本
test.sh
#!/bin/bash
#SBATCH -o job-nvidia.out
#SBATCH -p XXXX
#SBATCH -n 1
#SBATCH -N 1
#SBATCH --time=00:00:30
module add cuda/11.8
nvidia-smi- 执行脚本
sbatch test.shor
# 那就不用设置 SBATCH
sbatch -n 1 -N 1 test.shsinfo
查看分区节点情况
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
cpu* up 14-00:00:0 4 alloc node[01-04]
cpu* up 14-00:00:0 2 idle node[05-06]
gpu up 2:00:00 2 mix gpu[01-02]PARTITION:分区(队列)名称。带星号 的(如 cpu)表示这是集群的默认分区,如果你提交作业时不指定分区,就会被投递到这里。
AVAIL:分区的可用状态。up 表示正常运行接收作业,down 表示分区已关闭。
TIMELIMIT:该分区允许的作业最长运行时间(格式为 天-小时:分钟:秒)。
NODES:处于当前状态的节点数量。
STATE:节点当前的状态(下文详述)。
NODELIST:具体的节点名称列表,Slurm 通常会把连续的节点缩写为中括号形式,如 node[01-04]。
🟢 idle (空闲):节点完全空闲,没有任何作业在上面运行。随时可以接收新作业。
🟡 mix (混合):节点上部分资源(如 CPU 核心或内存)被占用,但还有剩余资源。如果你的作业很小,仍可能被分配到这里。
🔴 alloc (已分配):节点的所有资源都已经被作业占满,也就是“满载”状态。新作业需要排队等待。
🟣 drain / drng (排空):管理员人为设置的状态,通常是为了硬件维护。节点上现有的作业会继续运行直到结束,但不会再接收新作业。
⚫ down (宕机):节点出现故障或已离线,无法使用。
⚠️ 带星号的状态 (如 down, alloc):星号表示 Slurm 控制节点(slurmctld)无法与该计算节点取得联系(通常是网络断开或节点死机)。
查看空闲节点数
sinfo -o "%P %D %t" | grep idlesacct
查看任务状态 (统计运行时间等)
sacct -j <job_id> --format=JobID,JobName,Partition,Account,AllocCPUS,State,ExitCode,Start,End,Elapsed进阶使用
提交任务并进入运行节点
类似进入docker screen ,方便调试程序。
srun -p XXX -N 1 -n 1 -t 0-01:00 --pty /bin/bash #一小时通过命令行传递参数
创建动态sbatch脚本的方法实现cmd传递参数 ⬇️
vim main.sh#!/bin/bash
cpus=$1
nodes=$2
name=$3
# 创建一个具有动态SBATCH指令的新脚本
cat > generated_script.sh <<EOF
#!/bin/bash
#SBATCH --partition=cp5
#SBATCH -n $cpus
#SBATCH -N $nodes
#SBATCH --time=00:15:00
#SBATCH -J LLMTEST.
#SBATCH --output=./output/cp5-${name}-${cpus}-${nodes}.output
source /fs2/home/test653/zeta/.bashrc
conda activate chatglm
python main.py
EOF
# 提交新生成的作业脚本
sbatch generated_script.sh./main.sh 1 1