随着各种组学技术和生物信息学技术的发展,高通量测序现在已经广泛应用到生命科学的多个领域,这些测序数据动辄几个G甚至几十上百G(主要看物种和测序深度),个人电脑对这些大量的数据处理时有些力不从心。
比如我的小破电脑,4核,2G运行内存,在对16个10X测序深度的拟南芥转录组数据进行回帖参考基因组时,cpu满载的情况下跑了整整一个晚上,拟南芥的参考基因组还是比较小的(只有116M大小)。因此在需要做大量数据处理的时候我们往往都会用到计算机集群。
先放有用的东西:slurm官网快速开始手册
以及武汉大学测绘学院做的中文手册:点击浏览和下载
1. 计算机集群介绍
先上一段百度百科的介绍
计算机集群简称集群,是一种计算机系统, 它通过一组松散集成的计算机软件或硬件连接起来高度紧密地协作完成计算工作。在某种意义上,他们可以被看作是一台计算机。
集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接方式。集群计算机通常用来改进单个计算机的计算速度和/或可靠性。一般情况下集群计算机比单个计算机,比如工作站或超级计算机性能价格比要高得多。
简单来说集群就是一群电脑连接在一起完成同一个工作,自然是比单个电脑工作效率高得多。
塔大有着南疆最大的超算中心,我用测试账号登录大致看了下节点配置信息和存储规模:
可以看到塔大集群有三个分区:debug、normal和operation,其中debug是默认分区。
每个分区下都有admin91、admin92和computer1-6共计8个节点,从状态栏可以看到admin91节点处于down状态,一般来说只有故障节点才会显示状态down,但是我看了下登录节点的hostname就是admin91(admin91是登录节点),可能就是这样设置的,防止用户申请到登录节点资源(学校规定禁止在登录节点运行脚本程序,为了防止用户占用太多登录节点资源)。computer1-6都是计算节点,可以看到状态栏是idle也就是空闲的。admin92是个胖节点,状态却是drain也就是不能分配,这个我不理解,如果要运行并行命令就要用到胖节点。
裸储存容量算个大概450TB左右,不算大不算小,够用就行。
顺便看一下各个节点的性能:
稍微计算一下可以发现,计算节点computer1-6每个节点有128个核,每个核2G运行内存;登录节点admin91有64个核,每个核4G运行内存(不是很理解登录节点为什么要这么豪华……);胖节点admin92有256个核,每个核4G运行内存。总的来说,放在内地比可能确实不怎么样,但是在新疆可以说是奢华顶配了……
2. slurm调度系统介绍
塔大集群用的是slurm调度系统,简单来说就是借助slurm这个资源管理系统,将超算中心的集群计算机统一管理。slurm是个开源分布式资源管理软件,管理这种大型的计算机集群还是比较高效的,比如天河二号上就使用了 该资源管理系统。集群操作和个人电脑操作不一样的地方是,我们需要申请计算节点然后才能运行计算的命令,需要了解一下slurm的作业调度系统。
了解一下基本概念:一个分区(partition)就是节点的逻辑分组,可以有不同的节点(node);可以调用几个节点的资源创建作业步(job step),一个作业(job)就是一次资源分配,可以有多个作业步并且可以并发运行。
再来看一下slurm调度系统的组成成分:
主要有控制进程slurmcld,记账存储进程Slurmdbd(有的集群是收费的),节点监控进程slurmd,作业管理进程slurmstepd和用户命令工具组成,我们可以不用了解这些进程之间的相互关系,熟悉用户命令比如创建作业,提交作业和查看作业状态即可。
2.1 创建和提交作业
slurm作业调度系统有三种模式创建和提交作业:交互模式——srun,批处理模式——sbatch和分配模式——salloc,分别介绍一下~还是再次强调一下,学校集群禁止在登录界面直接运行计算命令,第一次发现会强制终止进程,第二次管理员会注销用户账号。
2.1.1 交互模式——srun
交互模式说白了就是我们通过命令行与集群产生可以互动的“交流”,具体过程如下:
- 通过终端提交资源分配请求,指定资源数目和限制
- 等待资源分配
- 获得资源后,自动加载计算任务
- 运行中,任务I/O传递终端,可与任务进行交互
- 任务结束后,资源被释放
一次执行srun生成一个作业步,也就是一次任务加载,执行一次最简单的hostname命令如下:
-n 参数指定核数,-w参数指定节点,因此显示的hostname就是computer3。运行结束后直接释放资源。
上面的例子可能没有体现出交互的意义,因为程序比较简单。有些程序在运行的过程中需要人为调整,srun才能体现出优势。
2.1.2 批处理模式——sbatch
批处理模式顾名思义特点在于需要自己写批处理脚本,具体过程如下:
- 编写作业脚本,指定资源数目和限制
- sbatch提交作业
- 作业排队等待资源分配
- 分配到资源后在首节点加载执行作业脚本
- 任务结束释放资源
- 运行结果定向到指定文件夹
这个模式也是用的最多的,登录塔大集群可以在用户家目录下找到job_example文件夹,里面有不同的slurm脚本提供参考,举个最简单的例子sleep.slurm,我们cat一下看看脚本内容:
第一行#! 指定解释器类型,和其他脚本都一样;
第二行开始后面几行的#SBATCH都被识别为sbatch命令,因此后面都加上了对应参数,这里只有sbatch这一行会被识别成命令,注意不是被注释了。如果脚本里写了对应参数内容,命令运行脚本的时候就可以不用加入这些参数。
第六行开始也就是#以后的部分,才是我们编写脚本要运行的命令。
参考这个格式,我写了如下一个建立拟南芥参考基因组索引文件的hisat2.slurm脚本:
申请了job名为job1,一个节点,一个核,显示队列,显示程序运行开始时间,运行程序,显示结束时间。
提交直接用sbatch hisat2.slurm
,很快就获得资源跑完了程序,当前目录下生成了索引文件和默认输出文件slurm-job号.out
因为输出结果在结果文件里,所以我们屏幕上是看不到运行过程的,要想监控运行过程只能在运行时输入squeue查看,后面会说。运行结束后同样会自动释放资源。
2.1.3 分配模式——salloc
分配模式相比前面两个模式更灵活一些,简单来说就是申请资源,执行运算任务后手动释放资源,可以用来在正式提交sbatch前做程序测试,检查代码正确后再写成脚本提交(不过也可以直接提交,不用sbatch)。流程如下:
- 提交资源分配请求
- 排队等待资源分配
- 命令行执行指定的命令
- 命令执行结束,exit手动释放资源
这个比较简单,直接salloc后面接参数申请指定的资源就行,最后一定要exit手动释放资源。
申请后可以用hostname命令看看申请的是哪个节点,确认是计算节点后再运行计算命令。
2.1.4 作业提交参数
知道了三个模式的具体用法,只需要添加对应的参数就行了。没有人会具体记住所有参数,上面只有常用的几个需要记一下。这里记录一下其他常用提交参数:
参数 | 含义 | 类型 | 示例 |
---|---|---|---|
-J | 作业名,squeue看到的作业名 | 字符串 | -J wrf;表示作业名称为“wrf” |
-n | 作业申请的总cpu核心数 | 数值 | -n 4;表示作业申请4个cpu核心 |
-N | 作业申请的节点数 | 数值 | -N 1 表示作业申请1个计算节点 |
-p | 指定作业提交的分区 | 字符串 | -psilicon表示将作业提交到silicon分区 |
-t | 指定作业的执行时间 | 数值 | -t 30 表示作业的执行时间不超过30分钟 |
-o | 指定作业标准输出文件的名称 | 字符串 | -o %j,表示使用作业号作为作业标准输出文件的名称 |
-e | 指定作业标准错误输出文件名称 | 字符串 | -e %j,表示使用作业号作为作业标准错误输出文件名 |
-w | 指定分配特定的计算节点 | 字符串 | -w computer3 表示使用computer3节点 |
-d | 作业依赖关系设置 | 字符串 | -d after:123 表示本作业须待作业123开始以后再执行 |
顺便最后再提一下交互模式和批处理模式是可以相互结合的,脚本中可以加入srun命令,可以自行尝试。
如上,可以用sbatch一次性创建100个job,每个job运行一次srun后面的内容,也就是提交并行的100个计算作业。也可以不加–array这个参数,srun最后加上符号&在后台挂起,下一行继续用srun命令,以此来实现并行计算,不过要注意最后一行命令用wait等待所有命令运行结束后一起结束,否则读完sbatch就结束了。
2.2 其他用户命令
这里再简单列举记录一些常用的用户命令和参数,方便自己后续用到时查阅~
2.2.1 sinfo 查询信息
参数 | 含义 |
---|---|
-a | 查看所有分区信息(含隐藏分区) |
-d | 查看dead状态(通信异常)的节点和分区的信息,与-r参数对应 |
-l | 打印分区(或节点)的详细信息 |
-n | 查看指定节点的信息 |
-p | 查看指定分区的状态 |
-r | 查看计算节点(内部通信)正常的节点和分区的状态,与-d参数对应 |
-R | 查看节点不可用的原因,包括管理操作设置的异常 |
-t | 查询指定节点状态的分区或节点的信息 |
–federation | 显示所有集群的分区(或节点)的信息 |
–local | 仅显示当前集群的分区(或节点)的信息 |
2.2.2 squeue 查询作业
参数 | 含义 |
---|---|
-A | 查看指定账号的作业 |
-a | 显示所有分区(包含隐藏)下的作业和作业步 |
-r | 按行显示作业组的每一个作业 |
–hide | 不显示隐藏分区或者无权访问的分区中的作业 |
-j | 根据指定的作业号查询作业信息 |
-l | 长格式显示作业信息 |
–federation | 显示所有集群下的作业 |
–local | 仅仅查看当前集群的作业 |
-n | 按作业名查询作业或作业步 |
-p | 按分区查询作业 |
-s | 查询作业步 |
-t | 指定要显示的作业的状态 |
2.2.3 scancel 删除作业
参数 | 含义 |
---|---|
<job id> | 删除指定job id作业 |
–t | 删除指定状态的作业 |
–account= | 删除指定账号的作业 |
–name= | 删除指定名称的作业 |
–partition= | 删除指定分区的作业 |
–reservation= | 删除指定预约名称的作业 |
–user= | 删除指定用户的作业 |
–nodelist= | 删除指定节点的作业 |
2.2.4 scontrol 查询详细信息
这个命令和sinfo相比更为详细,主要能获得4个方面的详细信息
命令 | 含义 |
---|---|
scontrol show node <name> | 查询指定节点信息 |
scontrol show partition <name> | 查询指定分区信息 |
scontrol show job | 查询job信息,注意是所有的 |
scontrol show config | 查询配置信息,也是所有的 |
2023/02/23 补充
因为经常要用到scontrol show job
来查看当前作业得运行情况、占用资源情况等等,因此更新一下该命令主要输出项:
参数名 | 解释 |
---|---|
JobId | 作业号 |
UserId | 用户名(用户ID) |
GroupId | 用户组(组ID) |
Priority | 优先级,越大越优先,如果为0则表示被管理员挂起,不允许运行 |
Nice | Nice值,越小越优先,20到19 |
Account | 记账用户名 |
JobState | 作业状态。– PENDING:排队中;– RUNNING:运行中;– COMPLETED:已完成;– CANCELLED:已取消 |
Requeue | 节点失效时,是否重排队,0为否,1为是 |
Restarts | 失败时,是否重运行,0为否,1为是 |
BatchFlag | 是否为批处理作业,0为否,1为是 |
Reboot | 节点空闲时是否重启节点,0为否,1为是 |
RunTime | 已运行时间 |
TimeLimit | 作业允许的剩余运行时间 |
TimeMin | 最小时间 |
SubmitTime | 提交时间 |
EligibleTime | 获得认可时间 |
StartTime | 开始运行时间 |
EndTime | 预计结束时间 |
Partition | 队列名 |
AllocNode:Sid | 分配的节点:系统ID号 |
NodeList | 实际运行节点列表 |
BatchHost | 批处理节点名 |
NumNodes | 节点数 |
NumCPUs | CPU核数 |
NumTasks | 任务数 |
Command | 作业命令 |
WorkDir | 工作目录 |
StdErr | 标准出错输出文件 |
StdIn | 标准输入文件 |
StdOut | 标准输出文件 |