Slurm (Slurm Workload Manager)介绍

Slurm (Slurm Workload Manager),前身为 Simple Linux Utility for Resource Management,是一个开源、高度可扩展且容错的集群管理和作业调度系统

它被广泛应用于全球许多超级计算机和大型计算集群中(在 Top500 超级计算机中占有极大份额)。简单来说,Slurm 就像是机房里的“大管家”和“交警”,负责指挥谁可以使用服务器、什么时候用、用多少资源。


核心功能

Slurm 主要做三件事:

  • 资源分配:在特定时间内,为用户分配独占或共享的计算机节点(服务器)资源。
  • 作业管理:提供一个框架,用于在分配的节点上启动、执行和监控工作(通常是并行作业,如 MPI、OpenMP 或大型深度学习训练)。
  • 排队调度:通过管理一个待处理作业的队列,解决大量用户争夺有限计算资源的问题。

核心概念与术语

  • Node(节点):集群中的单个物理服务器。
  • Partition(分区):节点的逻辑分组。类似于“队列”,不同的分区可能有不同的配置(如 gpu 分区、cpu 分区、high 高优先级分区、long 长时间运行分区)。
  • Job(作业):用户提交给 Slurm 的一个计算任务。
  • Job Step(作业步):一个作业内部的一组具体任务(通常用 srun 启动)。

命令指南

1. 查看集群状态

  • **sinfo**:查看集群所有分区和节点的状态(如 idle 空闲、alloc 已分配、down 故障等)。
  • **squeue**:查看当前排队或正在运行的作业列表。

2. 提交与运行作业

  • sbatch最常用的方式。通过读取一个脚本文件,将作业提交到后台排队运行。即使你退出了终端,作业也会继续运行。
  • **srun**:实时运行一个作业或作业步(通常用于测试,或在 sbatch 脚本内部启动并行任务)。
  • **salloc**:为交互式作业申请资源。比如你想临时借用一台 GPU 节点来调试代码。

3. 管理作业

  • **scancel <job_id>**:取消/终止一个作业。
  • **scontrol show job <job_id>**:查看某个作业的详细状态和配置信息。

一个标准的 sbatch 脚本示例

通常,你会写一个形如 submit.sh 的脚本,然后使用 sbatch submit.sh 提交:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
#SBATCH --job-name=my_test_job # 作业名称
#SBATCH --partition=gpu # 指定在 gpu 分区运行
#SBATCH --nodes=1 # 申请 1 个节点
#SBATCH --ntasks-per-node=1 # 每个节点运行 1 个任务
#SBATCH --cpus-per-task=4 # 每个任务需要 4 个 CPU 核心
#SBATCH --gres=gpu:1 # 申请 1 块 GPU
#SBATCH --time=02:00:00 # 最大运行时间 2 小时
#SBATCH --output=res_%j.log # 标准输出日志文件 (%j 会被替换为作业 ID)

# 激活你的虚拟环境(例如 conda)
source activate my_env

# 运行你的程序
python train.py

为什么大家都用 Slurm?

  1. 高效的资源利用:防止多人同时在一台机器上跑满 CPU/GPU 导致死机。
  2. 公平性:通过内置的调度算法(如 Fairshare),确保每个团队或用户都能公平地分到算力,不会出现“先到的人一直占着不走”的情况。
  3. 可扩展性:小到几台机器的实验室集群,大到包含数万个节点的国家超级计算机,Slurm 都能轻松应对。