Slurm 作业调度系统 (Sugon)

  • SLURM 是一种开源的、功能强大的工作负载管理器,广泛用于高性能计算 (HPC) 集群。其主要功能包括作业调度、分配计算资源和管理作业队列。SLURM 通过将集群中的资源划分为多个作业队列,使研究人员能够高效地提交和管理计算任务。

  • 官方用户指南 Slurm Documentation

作业队列和账户说明

作业队列 (paritition) 在 SLURM 中是用于管理和组织计算任务的逻辑结构。队列通过提供对集群资源的有序访问,帮助优化计算资源的利用率。

队列 A40-autoEM 和 RTX3090-autoEM 为电镜方向专用队列,使用该队列需显式声明账户 --account=cryoem

为了更高效地利用计算资源,我们对曙光集群的 SLURM 队列系统(电镜专用分区除外)作如下规定:

  1. 交互式资源申请 (srun, salloc) 仅限于 Interactive 分区,单个任务最长运行时间为 4 小时。

  2. 批量计算任务 请通过 sbatch 提交至生产节点 (A40、RTX3090、AMD)。每个任务默认运行时长为 24 小时,最长可达 7 天。

  3. 内存分配 方面,所有计算节点默认按系统核数和内存总量平均分配可用内存。用户可根据实际需求灵活调整所需内存配置。

小技巧

您可以使用以下命令查看各分区的详细配置信息:

scontrol show partition <partitionName>

常用命令

  • 查看节点

# 节点状态及使用情况总览
pestat -G

# 查看队列
sinfo

# 查看所有作业
squeue

# 查看特定节点状态
scontrol show node <NODENAME>

# 查看特定作业状态
scontrol show job <JOBID>
  • 申请交互式资源

为方便用户调试程序,集群仅允许在 Interactive 分区上通过 sallocsrun 提交交互式作业,单个任务最长运行时间为 4 小时。交互式作业主要用于:

  • 验证脚本语法和环境

  • 调试小规模数据的程序运行

  • 进行少量手动操作

常用示例

  1. 通过 srun 直接分配 1 个 CPU 核心和 2GB 内存:

srun -p Interactive -n 1 --mem=2G --pty bash

这条命令将在 Interactive 分区分配 1 个核心和 2GB 内存,启动一个交互式 bash 会话。

  1. 通过 salloc 申请资源,然后运行调试命令:

salloc -p Interactive -n 1 --mem=2G

当资源分配完成后,您可使用 ssh 进入分配的节点,可以在其中手动执行 Python 脚本或其他调试命令。例如:

python my_script.py
  1. 指定运行时间(如需 30 分钟):

srun -p Interactive -n 1 --mem=2G -t 0:30:00 --pty bash

这会分配 30 分钟的计算时间,超过时间后作业会自动终止。

备注

  • 交互式分区资源有限,如遇无资源情况请稍后重试。

  • 超过 4 小时的任务请使用批量作业提交 sbatch 方式。

  • 使用更多参数可参考 man srunman salloc

  • 删除作业

scancel <JOBID>
  • 提交作业脚本

脚本示例 my.script

#!/bin/sh
#SBATCH --time=1
#SBATCH --output=my.stdout
#SBATCH --error=my.stderr
#SBATCH --time=1-00:00:00
/bin/hostname
srun -l /bin/hostname
srun -l /bin/pwd

执行脚本:

# 指定使用节点 gpu5 到 gpu7 执行任务,并各自生成 4 个任务,每个任务使用 1 个处理器
sbatch -n4 -w "gpu[5:7]" -o my.stdout my.script

备注

  • 可以在脚本的开头(在任何需要执行的命令之前)使用 “#SBATCH” 前缀加上选项来提供其他选项。也可以在 sbatch 命令执行时提供选项,此时会覆盖脚本中指定的选项。

  • 与任务分配相关的常用参数:

  • -N 或 –nodes :指定要分配的计算节点的数量

  • -n 或 –ntasks :指定总任务数

  • –ntasks-per-node :指定每个节点上运行的任务数,默认值为 1

  • -c 或 –cpus-per-task :指定每个任务使用的 CPU 核心数,默认值为 1

  • -G 或 –gpus :指定请求 GPU 的数量

  • –gpus-per-node :指定每个节点上分配的 GPU 数量

  • –gpus-per-task :指定每个任务使用的 GPU 数量

    关于内存分配:每个队列都有默认的内存分配上限,请根据需求使用 –mem-per-cpu=MB 来调整内存分配。