【SLURM 入门】sbatch 等概念与常用命令

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(分区) 把节点划分成不同队列,如 maingpudebug,不同分区有不同的资源与限制
QOS(Quality of Service) 服务质量策略,常用来限制「每用户同时运行作业数」「每用户总 CPU 时长」等
Resource / GRES 可申请的资源类型,常见如 gpugpu: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
看分区/节点资源 sinfosinfo -N -l

七、实用建议

  1. log 路径#SBATCH --output--error 用绝对路径,并确保目录存在(可脚本里 mkdir -p 或事先建好)。
  2. 脚本名别拼错sbatch dit_traaining_example.sh 若拼错,可能提交到错误脚本或失败,log 就不会出现在你期望的目录。
  3. CPU 作业 :只占 CPU 时不要写 --gres=gpu:...;若集群有 shard 等自定义资源,按管理员说明填写。
  4. 限流 :遇到 QOSMaxJobsPerUserLimit 时,要么等,要么用 scancel 取消不需要的作业腾出名额。

把上面几条命令和概念记牢,日常「提交 → 看队列 → 必要时取消」就够用了。更细的(如多节点 MPI、数组作业、依赖关系)可以再查官方文档或问集群管理员。

相关推荐
全栈凯哥2 小时前
09.Python 中元组完全指南
python
汉堡go2 小时前
SLAM数学基础1
人工智能·算法·机器学习
AsDuang2 小时前
Python 3.12 MagicMethods - 39 - __mod__
开发语言·python
艾莉丝努力练剑2 小时前
【MYSQL】MYSQL学习的一大重点:MYSQL库的操作
android·linux·运维·数据库·人工智能·学习·mysql
qzhqbb2 小时前
不可检测水印
人工智能·算法
小鸡吃米…2 小时前
Python 中的并发 —— 简介
服务器·数据库·python
devnullcoffee2 小时前
OpenClaw + Pangolinfo API 接入实战:AI Agent 跨境电商自动化完整技术方案(2026)
人工智能·自动化·ai agent·open claw·pangolinfo api·跨境电商自动化
pp今天努力突破java地板2 小时前
bert文本情感分类
人工智能·深度学习·bert
Bruce_Liuxiaowei2 小时前
[特殊字符]OpenClaw爆火背后的安全冷思 MEMORY.md与SKILL.md:安全架构与最佳实践
人工智能·安全·ai·agent·安全架构·智能体