📌 什么是 Slurm?

  • 在使用高性能计算(HPC)集群时,Slurm 是最常见的任务调度器之一。
  • Slurm(Simple Linux Utility for Resource Management)是一个开源的集群资源管理和作业调度系统,用于管理节点资源、调度任务执行,广泛用于科研计算和深度学习训练

🧰 常用命令一览

命令 作用 示例
sinfo 查看当前集群节点状态 sinfo
squeue 查看正在运行或排队的任务 squeue -u $USER
srun 启动一个交互式任务或直接运行命令 srun --pty bash
sbatch 提交一个批处理任务脚本 sbatch job.sh
scancel 取消任务 scancel 123456

📝 1. sinfo —— 查看节点状态

1
sinfo

这个命令可以看到所有节点的状态,如哪些是空闲(idle)、正在使用(alloc)、维护中(down)等。例如:

1
2
3
4
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
cpu* up infinite 1 mix cpunode2
gpu up infinite 4 mix h800node[1-4]
a100 up infinite 1 mix a100node1

字段解释如下:

  • PARTITION:任务分区名。一个集群通常根据不同硬件资源(如 CPU、GPU)划分多个分区。

  • cpu* 表示默认分区。

  • AVAIL:分区是否可用,up 表示可用。

  • TIMELIMIT:任务最大运行时间,这里是 infinite 表示无限制。

  • NODES:该分区包含的节点数。

  • STATE:节点当前状态:

  • idle:空闲

  • alloc:被分配中

  • mix:部分资源被使用

  • NODELIST:节点名称列表


📋 2. squeue —— 查看任务队列

1
squeue -u $USER

显示你当前提交的所有任务状态。输出示例:

1
2
 JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
104981 a100 bash tlj R 5:08 1 a100node1

常用状态说明:

  • JOBID:任务编号,这里是 104981。

  • PARTITION:任务所在分区(如 a100)。

  • NAME:任务名称,这里是 bash,说明可能是你用 srun –pty bash 启动的交互式 shell。

  • USER:用户名,这里是 tlj。

  • ST(State):任务状态,这里是 R,表示任务正在运行。

  • 其他常见状态:

    • PD:Pending,排队等待中

    • CG:Completing,正在结束

    • F:Failed,任务失败

  • TIME:任务已运行的时间,这里是 5 分钟 8 秒。

  • NODES:使用的节点数量,这里是 1 个。

  • NODELIST(REASON):使用的节点名称,这里是 a100node1。


💻 3. srun —— 交互式运行命令或脚本

srun 通常用于:

  • 启动交互式 shell
  • 在分配的资源上直接运行命令(无需写脚本)

示例:

启动一个交互式 bash:

1
2
3
4
5
6
7
8
srun \
--partition=a100 \ # 使用A100分区
--nodes=1 \ # 请求1个节点
--cpus-per-task=4 \ # 每个任务分配4个CPU
--mem=8G \ # 分配8GB内存
--nodelist=a100node1 \ # 指定节点a100node1(可选)
--gres=gpu:1 \ # 请求1块GPU
--pty /bin/bash # 启动交互式bash终端

或者直接运行脚本:

1
srun --partition=gpu --nodes=1 --gres=gpu:2 --cpus-per-task=4 --mem=32G --time=02:00:00 /usr/local/opt/anaconda3/bin/python3 test_gpu.py

参数解释

参数 含义 示例
--partition 指定运行任务的分区,比如 gpua100 --partition=a100
--nodes 请求节点数,通常为 1 个节点 --nodes=1
--ntasks 启动的任务数,默认为 1 --ntasks=1
--cpus-per-task 每个任务请求的 CPU 核数,适用于多线程程序 --cpus-per-task=4
--mem 请求的内存大小,单位为 M/G/T --mem=8G
--gres=gpu:n 请求 GPU 资源,n 表示 GPU 数量 --gres=gpu:1
--nodelist 指定任务运行在哪个节点(调试常用) --nodelist=a100node1
--pty /bin/bash 启动一个交互式 shell(如 Bash) --pty /bin/bash
--time 设置作业的最大运行时间,格式为 hh:mm:ss --time=02:00:00

🧾 4. sbatch —— 提交作业脚本

你可以将运行任务的命令写入脚本中并通过 sbatch 提交。例如:

job.sh

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
#SBATCH --job-name=example # 设置任务名称
#SBATCH --partition=gpu # 提交到gpu分区
#SBATCH --nodes=1 # 请求1个节点
#SBATCH --ntasks=1 # 每个节点运行1个任务
#SBATCH --gres=gpu:1 # 请求1块GPU资源
#SBATCH --time=01:00:00 # 设置最长运行时间为1小时
#SBATCH --output=out.log # 输出重定向到out.log

python train.py

提交命令:

1
sbatch job.sh

❌ 5. scancel —— 取消任务

如果你提交了错误的任务,可以通过 JOBID 来取消:

1
scancel 123456

注意:在通过srun运行程序期间(包括直接运行或通过bash运行),务必不要输入Ctrl C或Ctrl Z。要终止程序运行,另外打开一个命令行窗口登录集群后用scancel job_id。


🔚 小结

如果你是初次接触 Slurm 的新手,可以先掌握以下基本流程:

  1. 编写 job.sh 脚本
  2. 使用 sbatch job.sh 提交任务
  3. 使用 squeue -u $USER 查看任务状态
  4. scancel 取消错误任务
  5. srun 进行调试或交互操作

如果你对具体参数不确定,也可以通过命令查看帮助文档:

1
2
man sbatch
man srun