【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、数组作业、依赖关系)可以再查官方文档或问集群管理员。

相关推荐
FourAu1 分钟前
2026 前端突围指南:从 ESR 边缘渲染到封装 Web AI SDK,聊聊 AI 时代的职业进化
前端·人工智能
前端开发江鸟4 分钟前
模型返回了 JSON,为什么还不能调用工具?Runtime 的结构化输出校验链路
人工智能
Urbano5 分钟前
卫衣生产工艺科普与智能自动化设备应用解析
大数据·运维·人工智能
吴梓穆13 分钟前
Python 基础 正则表达式
python
kp0000020 分钟前
Prompt注入攻击(Prompt Injection Attack)
人工智能·安全·网络安全·信息安全·ai安全
巧克力男孩dd29 分钟前
Python超典型练习题(第一次作业)
开发语言·python·算法
这张生成的图像能检测吗30 分钟前
(论文速度)RE-NET递归事件网络:时态知识图上的自回归结构推理
人工智能·图神经网络·时序模型
larance41 分钟前
机器学习特征预处理之删移除无关特征
人工智能·机器学习·数据挖掘
QC777LX1 小时前
运营岗位怎么借AI提升内容、活动和复盘效率?
大数据·人工智能
小李@Free2FA1 小时前
AI Agent 在操作你的账号时,2FA 怎么配合
人工智能·ai编程·2fa·账号安全·二次验证