SLURM (Simple Linux Utility for Resource Management) 是一种可用于大型计算节点集群的高度可伸缩和容错的集群管理器和作业调度 系统

常用命令

  • sacct:查看历史作业信息
  • salloc:分配资源
  • sbatch:提交批处理作业
  • scancel:取消作业
  • scontrol:系统控制
  • sinfo:查看节点与分区状态
  • squeue:查看队列状态
  • srun:执行作业

系统实体

SLURM 资源管理系统的管理对象包括

  • 分区partition:节点的逻辑分组
  • 节点node:计算节点
  • 作业job:在一个分区内分配若干资源完成特定任务
  • 作业步jobstep: 多个可并发的作业步组成作业

作业的运行模式

  • 交互模式:可I/O或信号交互,srun命令
  • 批处理模式:编写提交作业脚本,sbathc命令
  • 分配模式:预分配资源,可交互salloc命令

状态查看

查看各分区和节点的状态

$ sinfo
关键词含义
PARTITION分区名,大型集群为了方便管理,会将节点划分为不同的分区设置不同权限
AVAIL可用状态:up 可用;down 不可用
TIMELIMIT该分区的作业最大运行时长限制, 30:00 表示30分钟,如果是2-00:00:00表示2天,如果是infinite表示不限时间
NODES数量
STATE状态:drain: 排空状态,表示该类结点不再分配到其他;idle: 空闲状态;alloc: 被分配状态;mix:部分被占用,但是仍有可用资源

查看分区的状态信息

$ scontrol show partition [PARTITION_NAME]

查看节点的状态信息

$ scontrol show node [NODE_NAME]

查看任务队列信息

$ squeue
关键词含义
JOBIDjob的id号,每个成功提交的任务都会有唯一的id
PARTITION计算分区名
NAME任务名,默认以提交脚本的名称当作任务名
USER用户名,提交该任务的用户名
ST任务状态:PD排队;R运行;S挂起;CG正在退出
TIME任务运行时间
NODES任务作占节点数
NODELIST(REASON)任务所占节点列表,如果是排队状态的任务,则会给出排队原因

配置运行环境

基本的在自己目录下的module使用

# 查看可用的module模块
$ module avail

# 加载module模块
$ module load [MODULE_NAME]

# 查看加载的模块
$ module list

# 卸载模块
$ module unload [MODULE_NAME]

定制conda环境

在运算节点上定制conda环境

# 新建交互式作业,先占用资源,成功后返回任务JOBID
$ salloc -p gpu --gres=gpu:2 bash

# 查看队列信息,可以在USER或JOBID中找到刚刚提交的任务
$ squeue

# 通过队列可以看到任务分配的节点,进入节点
$ ssh [NODE_ID]

# 在任务运算节点上加载anaconda模块
$ module load anaconda3

# 加载成功后可以检查Python版本
$ which python
$ python -V

# 查看conda环境信息
$ conda env list
# 查看conda包
$ conda liat

# 回到自己的目录
$ exit

# 新建conda配置文件
$ vim ~/.condarc

添加下面内容,主要更改自己的用户名:

channels:
- defaults
ssl_verify: true
envs_dirs:
- /gs/home/zzlzoro/anaconda/envs
pkgs_dirs:
- /gs/home/zzlzoro/anaconda/pkgs

# 添加清华源
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
# 回到任务的计算节点
$ ssh [NODE_ID]

# 创建自己的conda环境,并命名,从返回信息environment location可以看到,创建的环境自动指向我们的Home目录
conda create --quiet --yes --name [ENV_NAME]

# 初始化conda的bash
$ conda init bash

# 重启bash
$ exit
$ ssh [NODE_ID]

# 查看conda环境
$ conda env list

# 激活自定义的conda环境
$ conda activate [ENV_NAME]

# 查看conda包
$ conda list

# 如果不再需要,删除任务,[JOBID]可以通过squeue查看
$ scancel [JOBID]

今后计算节点可以直接切换使用自己挂在节点中的conda环境。

上传文件

当需要将文件从本地上传到服务器,或者从服务器下载运算结果时,我们可以通过ftp服务完成。

安装ftp服务

$ sudo apt-get install vsftpd

修改配置文件

$ sudo gedit /etc/vsftpd.conf

主要做以下修改

anonymous_enable=NO
local_enable=YES
write_enable=YES

重启服务,使得修改生效

$ sudo /etc/init.d/vsftpd restart

安装ssh服务

$ sudo apt-get install openssh-server
$ sudo apt-get install openssh-client

查看ssh端口,验证

$ ps -e | grep sshd

通过scp命令上传文件

# 上传
$ scp 本地的需上传的文件路径 用户名@服务器ip:服务器中文件的保存路径

# 下载
$ scp 用户名@服务器ip:服务器中需下载的文件路径 文件的本地保存路径

输入密码即可看到文件传输过程和成功的提示。

提交任务

交互式任务

使用 salloc 命令来分配交互式任务所需的资源

$ $ salloc -N 1 --cpus-per-task=4 -t 5:00 -p cpu

可选参数包括:

-N <节点数量>
--cpus-per-task=<单进程 CPU 核心数>
--gres=gpu:<单节点 GPU 卡数>
-t <最长运行时间>
-p <使用的分区>
--qos=<使用的 QoS>

批处理任务

推荐使用批处理方式提交任务,批处理任务模式的核心在编写一个 SLURM 脚本,模板如下:

#!/bin/bash
#SBATCH -J test                   # 指定作业名
#SBATCH -o test.out               # 屏幕上的输出文件重定向到 test.out
#SBATCH -p gpu                    # 作业提交的分区为 cgpu
#SBATCH -N 1                      # 作业申请 1 个节点
#SBATCH --cpus-per-task=4         # 单任务使用的 CPU 核心数为 4
#SBATCH -t 1:00:00                # 任务运行的最长时间为 1 小时
#SBATCH --gres=gpu:1              # 单个节点使用 1 块 GPU 卡

# 加载运行环境
module load anaconda3

# conda初始化bash
conda init bash

# 重新进入conda环境
source activate

# conda激活自定义环境
conda activate wfenv

# 运行程序
python /gs/home/zzlzoro/test/abc.py

其中第一行表示使用 /bin/bash 来执行脚本,下面通过 #SBATCH 前缀设置服务的各个属性,没有指定的属性将使用默认值,其他属性见官方文档。可以根据自己的需要申请适当的资源。
提交任务

$ sbatch [BATCH_NAME].slurm

任务执行的结果可以通过test.out查看,也可以通过提示的错误消息更改脚本,重新提交。

分配式任务

通过salloc执行创建分配式任务

$ salloc [options] command

如果后面的 command 为空,则执行 slurm 的配置 slurm.conf 中通过 SallocDefaultCommand 设定的命令。如果 SallocDefaultCommand 没有设置,则将执行用户默认的 shell。
salloc主要参数包括:

--core-per-socke=cores
分配的节点需要至少每颗 CPU 核
-I, --immediate=seconds
在 seconds 秒内资源未满足的情况下立即退出。
-J, --job-name=job name
设定作业名
-N, --nodes=minnodes[-maxnodes]
请求为作业至少分配 minnodes 个结点。
-n, --ntasks=number
指定要运行的任务数。请求为 number 个任务分配资源,默认为每个任务一个处理器核。
-p, --partitions=partition name
在指定分区中分配资源。如未指定,则由控制进程在系统默认分区中分配资源。
-w, --nodelist=node name
请求指定的结点名字列表。
-x, --exclude=node name
不要将指定的节点分配作业。

任务状态

在提交任务后,可以查看任务状态

$ squeue

正常情况下任务的状态为“R”,代表任务正在运行,但是经常会因为各种原因作业未被运行,我们需要继续等待或者修改任务脚本才能够正常运行计算,其中常见原因包括:

原因代码详细说明
BeginTime未到用户所指定的任务开始时间
Dependency该作业所依赖的作业尚未完成
InvalidAccount用户的 SLURM 账号无效
InvalidQOS用户指定的 QoS 无效
ParitionTimeLimit用户申请的时间超过该分区时间上限
QOSMaxCpuPerUserLimit超过当前 QoS 用户最大 CPU 限制
QOSMaxGRESPerUser超过当前 QoS 用户最大 GRES(GPU) 限制
Priority存在一个或多个更高优先级的任务,该任务需要等待
ReqNodeNotAvail所申请的部分节点不可用
Resources暂无闲置资源,该任务需等待其他任务完成

其中InvalidAccount,InvalidQOS,ParitionTimeLimit属于异常原因,应该再次确认脚本的正确性和账户情况。

Ref.

  1. MrZhengGang: slurm作业管理系统怎么用?
  2. slurm Documentation
  3. pku_工作站使用指南
分类: Uncategorized

0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注