SLURM 入门:概念与常用命令
一篇面向「提交作业、看队列、取消作业」的 SLURM 简明入门,适合在集群上跑训练、数据处理时查阅。
一、SLURM 是什么
SLURM (Simple Linux Utility for Resource Management)是当前最常用的集群作业调度系统之一。你登录的往往是「登录节点」,真正跑程序的是「计算节点」;SLURM 负责:
- 资源管理:有多少 CPU/GPU、多少内存、哪些节点空闲
- 作业调度:谁先跑、谁排队、在哪个节点跑
- 隔离与限流:按用户/分区限制同时作业数、避免把集群跑崩
所以:你通过提交「作业」(job)来算题 ,而不是在登录节点直接 python train.py。提交后由 SLURM 排队、分配资源、在计算节点上执行。
二、核心概念速览
| 概念 | 含义 |
|---|---|
| Job(作业) | 你提交的一整次任务,对应一个 Job ID(如 712、718) |
| Node(节点) | 一台物理/虚拟机器,上有若干 CPU、GPU、内存 |
| Partition(分区) | 把节点划分成不同队列,如 main、gpu、debug,不同分区有不同的资源与限制 |
| QOS(Quality of Service) | 服务质量策略,常用来限制「每用户同时运行作业数」「每用户总 CPU 时长」等 |
| Resource / GRES | 可申请的资源类型,常见如 gpu、gpu:h200:2,有的集群还有自定义资源(如 shard) |
| sbatch 脚本 | 一个 shell 脚本,头部用 #SBATCH 写作业参数,用 sbatch 脚本名 提交 |
一次典型流程:写一个带 #SBATCH 的脚本 → sbatch 提交 → 作业进入队列(Pending)→ 资源满足后到某节点运行(Running)→ 跑完后结束,标准输出/错误写到指定 log 文件。
三、写一个 sbatch 脚本:常用参数
在脚本最前面(在任意可执行命令之前)用注释形式写 SLURM 参数,例如:
bash
#!/bin/bash
#SBATCH --job-name=my_job # 作业名,squeue 里会显示
#SBATCH --output=/path/to/log_%j.out # 标准输出,%j 会替换成 Job ID
#SBATCH --error=/path/to/log_%j.err # 标准错误(不写则和 output 合并)
#SBATCH --nodes=1 # 用几个节点
#SBATCH --ntasks=1 # 总任务数(单机单任务通常 1)
#SBATCH --cpus-per-task=16 # 每个任务要多少 CPU 核
#SBATCH --gres=gpu:h200:2 # 每节点 GPU:类型:数量,如 2 张 H200
#SBATCH --time=2-00:00:00 # 最长运行时间,格式 天-时:分:秒
#SBATCH --partition=main # 分区名(有的集群默认 main 可省略)
#SBATCH --mem=64G # 可选:申请内存
# 下面写你要真正执行的命令
conda activate myenv
python train.py
注意:
- output/error 的目录要先存在,否则可能写不进去或写到提交目录。
- 若只用 CPU、不占 GPU ,不要写
--gres=gpu:...;若集群有自定义资源再按需写。 --time别设得过大,否则排队时间可能更长;设成你预估的 1.2~1.5 倍即可。
四、提交与查看:常用命令
1. 提交作业:sbatch
bash
sbatch /path/to/your_script.sh
成功会打印 Submitted batch job 712,712 就是 Job ID,后面查状态、取消都要用这个 ID。
2. 看自己的作业:squeue
bash
squeue -u $USER # 只看自己的作业(推荐)
squeue -u swd # 或直接写用户名
squeue -u $USER -l # 列表更详细(节点、分区、时间等)
squeue -u $USER -t RUNNING # 只看正在跑的
squeue -u $USER -t PENDING # 只看排队的
输出里常见列:
- JOBID:作业 ID
- ST :状态,
R= Running(运行中),PD= Pending(排队) - NODELIST(REASON) :在哪个节点跑,或排队原因,如
(QOSMaxJobsPerUserLimit)表示「每用户作业数上限到了,在等前面的结束」
3. 取消作业:scancel
bash
scancel 718 # 取消单个作业
scancel 712 714 718 # 取消多个
scancel -u swd # 取消自己名下所有作业(慎用)
4. 看作业详情:scontrol
bash
scontrol show job 712 # 某条作业的详细配置、状态、节点等
5. 看历史记录:sacct
bash
sacct -u $USER # 自己最近结束的作业
sacct -u $USER --starttime 2026-03-01 # 从某天起
sacct -j 712 # 某条作业的统计(运行时间、退出码等)
五、常见状态与排队原因
| 状态 / 原因 | 含义 |
|---|---|
| R (Running) | 正在计算节点上跑 |
| PD (Pending) | 排队中,等资源或策略放行 |
| QOSMaxJobsPerUserLimit | 该 QOS 下「每用户同时作业数」已满,等已有作业结束 |
| Resources | 暂时没有满足你申请的资源(如 GPU 型号/数量) |
| PartitionTimeLimit | 分区/作业时间限制导致暂时不调度 |
遇到长时间 PD,先看 NODELIST(REASON),再根据需要减资源或等前面作业结束。
六、小抄:一条命令对应一件事
| 想做的事 | 命令 |
|---|---|
| 提交作业 | sbatch script.sh |
| 看自己作业 | squeue -u $USER |
| 看作业详情 | scontrol show job <JOBID> |
| 取消作业 | scancel <JOBID> |
| 看历史 | sacct -u $USER |
| 看分区/节点资源 | sinfo、sinfo -N -l |
七、实用建议
- log 路径 :
#SBATCH --output和--error用绝对路径,并确保目录存在(可脚本里mkdir -p或事先建好)。 - 脚本名别拼错 :
sbatch dit_traaining_example.sh若拼错,可能提交到错误脚本或失败,log 就不会出现在你期望的目录。 - CPU 作业 :只占 CPU 时不要写
--gres=gpu:...;若集群有shard等自定义资源,按管理员说明填写。 - 限流 :遇到
QOSMaxJobsPerUserLimit时,要么等,要么用scancel取消不需要的作业腾出名额。
把上面几条命令和概念记牢,日常「提交 → 看队列 → 必要时取消」就够用了。更细的(如多节点 MPI、数组作业、依赖关系)可以再查官方文档或问集群管理员。