大家好哇!随着时代的不断发展,我们在做项目时所使用的数据也越来越大。当进行计算量很大的任务时,我们不可避免地会使用超级计算机(以下简称超算)来帮助我们完成。常见的超级计算机作业调度系统有SLURM和Torque PBS,但我自己在实际应用过程中常见到的是slurm,以下就slurm作业调度系统进行一些简单的介绍!
1
Slurm作业调度系统简介
什么是作业调度系统呢?可以从下面这张图中进行理解:我们(User)从各自的终端通过ssh连接到登陆节点(login node)以后,编写了自己的一些任务(jobs,如执行一个python程序),现在想把这个任务交给超算来运行。但要知道,超算上不止只有我们一个用户,其他用户也会有自己的计算任务要交给超算来跑。而且,大家各自任务所申请的计算资源也不一样,(比如申请的节点数,cpu数等不同),但超算的计算资源是有限的。那在这种情况下,该怎么分配这些计算资源,如何安排任务的先后执行顺序呢?这里,就需要用到作业调度系统了,可以进行计算资源的分配等工作。SLURM 是其中一个优秀的开源作业调度系统,和 Torque PBS 相比,SLURM 集成度更高,对 GPU 和 MIC 等加速设备支持更好。最完整的文档可访问 SLURM 官网(https://www.schedmd.com/)。
2
选择超算工作站进行计算的优势
前面已经简单提到了为什么要使用超算工作站,在这里我们更详细地说明使用超算工作站的优势。
1、它可以将我们的个人电脑从繁重的任务中解放出来。利用工作站,你可以运行更大规模的程序。 在此期间你可以用你的个人电脑做其他的事情,甚至关机,都不会影响工作站的进度。
2、它在并行计算方面有极大的优势。工作站服务器的处理器特点是核心数量很多,虽然每个核心 的运算能力不算最强,但是协同工作时会提供很高的加速比。
3、它可以加深你对软件运行环境的理解。从而会让你产生编写可移植性更强的程序的意识。
3
一个案例
在这里,我们先给出一个使用slurm作业系统最常用的方式:提交 SLURM 作业脚本的批处理方式。至于slurm的具体使用及参数介绍,我们会在后面另推出文章进行讲解。
首先我们需要编写一个slurm脚本,假设命令为test.slurm。
代码语言:javascript复制#!/bin/bash
#SBATCH -J test # 作业名是 test
#SBATCH -p cpu # 提交到 cpu分区
#SBATCH -N 1 # 使用一个节点
#SBATCH --cpus-per-task=1 # 每个进程占用一个 cpu核心
#SBATCH -t 5:00 # 任务最大运行时间是5分钟
#SBATCH -o test.out # 将屏幕的输出结果保存到当前文件夹的test.out
hostname # 执行我的hostname命令
以上的脚本的第一行为 shebang,它指定了这个脚本的解释器为 bash。每次编写脚本 都必须写上这一行。之后有 # 开头的若干行表示 SLURM 作业的设置区域,它告诉工作站运行任务的详细设定:它被提交到 cpu 分区当中,申请 1 个节点的 1 个 核心,限制任务最大运行时间是五分钟,将标准输出和标准错误放在test.out 中。它的主体内容就是在当前目录执行hostname命令。
接着我们需要提交任务到超算上。在准备好slurm脚本后,使用如下命令就可以将刚才的任务提交上去,这里 sbatch 是提交 SLURM 脚本的命令。 如果工作站有空闲资源,那么我的程序将会被放在某一个节点的某 一个核心上运行。我只需要等待我的程序完成即可。
代码语言:javascript复制sbatch test.slurm
成功提交任务后会返回一条类似” Submitted batch job 38’’的信息,这表示我的任务已经成功提交,任务号是 38。此时可以通过如下命令查看任务运行状态,会返回作业id、运行时间、运行状态等信息。
代码语言:javascript复制squeue -u user_name
当程序完成后,可以到指定的文件中去寻找程序的输出。 系统默认会将标准输出文件和标准错误文件复制到调用 sbatch 的目录下。默认的文件名是 slurm-<JOBID>.out,其中 JOBID 是作业号。如果在 SLURM 脚本中使用了 -o 选项,则这些文件会被复制到用户所指定的目录下。
总结起来,在工作站上进行运算的步骤如下:
1、登录主节点,准备程序和数据。
2、编写 SLURM 脚本,设置作业属性(例如占用的资源,最长运行时间)。
3、提交作业脚本,检查任务状态(使用 squeue)。
4、等待运行结束,验收结果。
参考资料:北大超算指导手册