Slurm 作业调度系统 (Sugon)
SLURM 是一种开源的、功能强大的工作负载管理器,广泛用于高性能计算 (HPC) 集群。其主要功能包括作业调度、分配计算资源和管理作业队列。SLURM 通过将集群中的资源划分为多个作业队列,使研究人员能够高效地提交和管理计算任务。
官方用户指南 Slurm Documentation
作业队列和账户说明
作业队列 (paritition) 在 SLURM 中是用于管理和组织计算任务的逻辑结构。队列通过提供对集群资源的有序访问,帮助优化计算资源的利用率。
队列 A40-autoEM 和 RTX3090-autoEM 为电镜方向专用队列,使用该队列需显式声明账户 --account=cryoem
为了更高效地利用计算资源,我们对曙光集群的 SLURM 队列系统(电镜专用分区除外)作如下规定:
交互式资源申请 (srun, salloc) 仅限于 Interactive 分区,单个任务最长运行时间为 4 小时。
批量计算任务 请通过 sbatch 提交至生产节点 (A40、RTX3090、AMD)。每个任务默认运行时长为 24 小时,最长可达 7 天。
内存分配 方面,所有计算节点默认按系统核数和内存总量平均分配可用内存。用户可根据实际需求灵活调整所需内存配置。
小技巧
您可以使用以下命令查看各分区的详细配置信息:
scontrol show partition <partitionName>
常用命令
查看节点
# 节点状态及使用情况总览
pestat -G
# 查看队列
sinfo
# 查看所有作业
squeue
# 查看特定节点状态
scontrol show node <NODENAME>
# 查看特定作业状态
scontrol show job <JOBID>
申请交互式资源
为方便用户调试程序,集群仅允许在 Interactive 分区上通过 salloc 或 srun 提交交互式作业,单个任务最长运行时间为 4 小时。交互式作业主要用于:
验证脚本语法和环境
调试小规模数据的程序运行
进行少量手动操作
常用示例
通过 srun 直接分配 1 个 CPU 核心和 2GB 内存:
srun -p Interactive -n 1 --mem=2G --pty bash
这条命令将在 Interactive 分区分配 1 个核心和 2GB 内存,启动一个交互式 bash 会话。
通过 salloc 申请资源,然后运行调试命令:
salloc -p Interactive -n 1 --mem=2G
当资源分配完成后,您可使用 ssh 进入分配的节点,可以在其中手动执行 Python 脚本或其他调试命令。例如:
python my_script.py
指定运行时间(如需 30 分钟):
srun -p Interactive -n 1 --mem=2G -t 0:30:00 --pty bash
这会分配 30 分钟的计算时间,超过时间后作业会自动终止。
备注
交互式分区资源有限,如遇无资源情况请稍后重试。
超过 4 小时的任务请使用批量作业提交 sbatch 方式。
使用更多参数可参考
man srun
或man 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 来调整内存分配。