一,平台简介:
主要是官方手册指南、B站视频(培训视频、软件视频)
1,超算平台架构:
和普通的家用电脑的架构不同,
主要区别在于:层次化的结构
(1)超算是有很多张cpu卡、gpu卡,以及硬盘,然后通过高速网络联合起来;
(2)一般情况下,多个核心首先会组织成一个节点,然后多个节点联合起来就形成了一个集群
然后节点部分又分为3个部分:
(1)功能节点:登入节点+可视化平台节点+数据传输节点,
都是一些特殊的节点,设计用来执行不同的任务;比如说登入节点,承载用户的登入,类似于前台;
可视化节点用于在可视化平台上的访问服务;
数据传输节点:用户数据传输的服务
——》专事专用,比如说禁止在登入节点上进行大型数据传输,当然一些小文件是可以的
(2)计算系统:一些节点,也就是计算资源,用于处理我们所提交的计算任务;
用户实际上是不直接面对计算节点的,但是我们的作业需要在计算节点上去运行;
我们一般是在登入节点上用一种特定的格式,提交我们的作业,然后这个命令/作业会被提交给slurm作业调度系统——》这个系统其实就相当于是一种排队机制,有好几种队列,就相当于是食堂的窗口,我们的作业来了就是排在队尾;当前面的任务执行完毕之后,我们的作业就会被投入到某一个空闲的计算节点当中去运行
(3)文件系统:简单理解来说就是硬盘,存储远程的数据
但是这个硬盘不是铁板一块,也是分层的:
最高层的是一个全闪存文件系统,如果我们的作业有一个高输入输出的高频率的需求,我们一般会将我们作业中用到的data copy到这个全闪存系统中,然后再去运行我们的作业;
当然,一般的文件传输需求就是我们的主文件系统;
最底层的归档文件系统:冷存储,就是长时间不用的数据放在这里
2,slurm作业调度系统
在登入节点提交slurm脚本,然后由slurm作业调度系统分配作业到不同计算节点进行任务执行
3,集群登入:
这个其实就很基本了,学生信的基本功;
我们在主校区一般是登入pi2.0节点
登入集群我首推vscode,毕竟以后要做coding,也得多平台;其次是在没办法了再用mobaxterm
集群中一般使用的都是zsh,当然bash都可以随时切换。
然后这里要提一嘴免密登入的问题了:
可以参考我之前的博客:https://blog.csdn.net/weixin_62528784/article/details/146028231?spm=1001.2014.3001.5501
比如说,这是一个我们的账户主界面:
申请免密证书需要验证邮箱,但是鉴于这是一个教学用临时账号,我们此处不进行免密登入。
总之传统的方式是不管用的
4,数据传输:
和登入节点类似,数据传输节点也有专门的节点,如果需要大批量数据的传输,建议登入到数据传输节点再进行;
登入方式和ssh类似
但是教学用账号是没有权限登入数据传输节点的,需要科研用正式实验室账号以及子账号,才有权限登入(ssh stu542@dataxxxx,亲测)
小白的话当然使用图形化处理界面的SFTP:
其实可视化登入界面上也没有什么,就很正常的linux-desktop
进入之后是这样的:
非小白的话,使用正常的文件传输命令操作即可:
也是常识,可以参考我之前博客:
https://blog.csdn.net/weixin_62528784/article/details/146071769?spm=1001.2014.3001.5501
5,作业提交与查询:
各种字母,后续在作业提交以及后台监控时候会经常遇见
sbatch就很基本了,最基本的任务投递命令
(1)sinfo:
我们能够查看每一个队列的每一个状态的节点到底有多少个
比如说上面,每一行都是一个队列的一个状态的节点情况,比如说cpu队列中idle空闲的节点数目有233个
然后比如说上面的gpu节点,就完全没有空闲的了,就全被占用了,说明深度学习炼丹跑模型的人很多。
我们一般关注的是空闲也就是idle的节点,一般来说我们应该在队列任务投递之前先查看一下这个队列中节点的运行情况,如果说其中idle的节点比较多,那就意味着我们在任务投递之后很快就可以轮到我们的任务执行了。
比如说我想查看一下无论哪个队列中什么节点是空闲的:
可以看到cpu队列中很多节点都是空闲的
当前cpu队列中有124个节点都是空闲的
当然可以实时查看
(2)squeue:
查看作业排队情况,
比如说下面的sleep的c程序,
我们就可以看到作业状态是在运行
然后不一会就failed
(3)scontrol:
查看作业提交详细情况;
比如说下面提交的一个hello world的c程序,
(4)sacct:
查看作业记录,其实也是看不到细节的;
所以说sacct和squeue都是只能查看任务的排队情况,或者说是作业的提交情况,至于详细的细节,都需要使用scontrol命令中去查看;
如果不加命令的话,sacct只能查看当天中所有的运行记录;
比如说上面运行的hello world的程序就是完成了的
如果需要查看所有的运行记录的话,需要指定参数
比如说上面就是我从上周3开始执行的示例任务,有很多是完成了,部分是fail了,还有被取消的
(5)scancel:
取消作业提交,尤其是在超算收费情况下,对于不需要或者说是fail的任务job,有必要及时cancel也就是kill
然后至于每个队列也就是带有不同资源的这些食堂窗口,提供不同的食品;
我们常用的是在pi2.0集群上的cpu队列,如果要用gpu,则是dgx2队列。
然后就是我们最关心的了:
sluram脚本的细节
其实就是前面“#”细节的差异,其余都和shell脚本没有区别
1核就是最小1个cpu的核心、最小单位。
注意:“%j”就是作业号的意义!!!
**示例:
**
——》
当然,除了我们上面写出来的,需要在slurm中提交到后台计算节点的运行任务;
还有一种作业提交或者说是任务运行方式,需要我们注意
这个其实也很常见,就是排队申请计算节点资源,申请到了,我们就相当于ssh进入了这个计算节点,然后一切操作就相当于是在前台操作了,就和个人主机或者说是小型服务器很像了。
需要即时编译,或者即时修改,即时debug时候操作。
可以参考我的上一篇博客:
https://blog.csdn.net/weixin_62528784/article/details/146118720?spm=1001.2014.3001.5502
在这一篇博客中,我就是使用了srun即时前台申请了一个计算节点,然后安装conda软件seqtk,做了一个简单的处理,然后稍微复杂一点的任务,我再将处理好之后的数据进行sbatch提交。
6,软件模块使用:
超算另外一个比较特殊的地方在于,那些非自己编译的软件、非本地软件,常规方法是无法获取的;
基本上需要你在执行某个任务的环境中去加载,module load,然后然后就相当于在你load的那个环境中将该程序添加到环境变量当中了,然后你就可以使用该软件了。
我们以加载g++(c语言的编译器)的演示来做示例:
首先当前环境中无任何模块加载:
然后这是当前的gcc版本,也就是登入节点中默认的版本,v8.5.0
我们可以先查看一下可用的gcc版本(注意是gcc/去搜索,否则会搜到很多也是gcc编译但不是我们想要的软件)
然后D就是默认版本,比如说我们module load gcc,然后没有指定版本的话,那么加载的就是这个默认版本;
但是如果我们想要加载特定版本的gcc,
我们就需要指定版本参数,比如说我们想要加载11.2.0这个版本
可以发现这个模块被加载了
然后版本也确实对应变了;
我们可以接着卸载这个模块,可以发现一切都变回来了:
二,slurm作业调度系统详解
Slurm(Simple Linux Utility for Resource Management)是一个常用的作业调度系统,已被全世界的国家超级计算机中心广泛采用,它可以管理计算集群上的资源,并调度和执行作业(例如脚本或分析任务),帮助用户高效地在多个计算节点上运行任务。
我们需要知道的是:1台计算机就是1个节点(1个cpu节点,对应着1个台电脑;1个gpu节点,1张gpu卡)
Slurm 的基本概念
作业 (Job): 用户提交给集群去执行的任务,例如运行一个脚本。
- 节点 (Node): 集群中的一台计算机,负责执行作业。
- 登录节点 (Login Node): 用户通过 SSH 进入集群后最初登录的节点。它用于准备作业、编写脚本和提交作业,但不是作业执行的地方。
- 分配节点 (Allocated Node): 当你提交作业并成功分配资源时,作业将在这些节点上运行,它们由 Slurm 根据你的资源需求来选择。
- 分区 (Partition): 一组节点的集合(也可以叫做“队列”),不同分区可能有不同的资源配置或策略。
- 调度器 (Scheduler): Slurm 根据资源可用性和作业的优先级,决定作业何时、在哪些节点上执行。
基本工作流程
- 提交作业: 用户通过
sbatch
命令提交编写好的作业脚本,描述作业的资源需求(如节点数、CPU数、内存等)和执行命令,或者使用srun
运行交互式作业。 - 资源分配:Slurm的调度器根据当前的资源可用情况和作业队列中的优先级,分配资源给新提交的作业。
- 监控作业: 使用
squeue
查看作业的状态(例如,正在运行或等待中)。 - 作业输出: 作业完成后,输出通常会保存在用户指定的文件中。
Slurm 概览
Slurm | 功能 |
---|---|
sinfo | 集群状态 |
srun | 启动交互式作业 |
squeue | 排队作业状态,当前作业状态监控 |
sbatch | 作业/脚本提交 |
scontrol | 查看和修改作业参数 |
sacct | 显示用户的作业历史,默认情况下,sacct显示过去 24小时 的账号作业信息。 |
scancel | 删除作业 |
sreport | 生成使用报告 |
sinfo
查看集群状态和信息
Slurm | 功能 |
---|---|
sinfo -s | 简要格式输出 |
sinfo -N | 查看节点级信息 |
sinfo -N --states=idle | 查看可用节点信息 |
sinfo --partition=cpu | 查看队列信息 |
sinfo --help | 查看所有选项 |
输出字段:
- PARTITION: 分区名称
- AVAIL: 节点可用性状态(up/down)
- TIMELIMIT: 分区的时间限制
- NODES: 分区中的节点数量
- STATE: 节点状态:
drain
(节点故障),alloc
(节点在用),idle
(节点可用),down
(节点下线),mix
(节点被占用,但仍有剩余资源) - NODELIST: 节点名称列表
查看总体资源信息:
sinfo
#PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
#cpu up 7-00:00:0 656 idle cas[001-656]
#dgx2 up 7-00:00:0 8 idle vol[01-08]
查看某个特定节点的信息:
sinfo -n <节点名称>
sacct
显示用户作业历史
- 用途: 查询作业历史记录,显示已完成和正在进行的作业信息,默认情况下,sacct显示过去 24小时 的账号作业信息。
- 参数:
-j <jobid>
查询特定作业-S <YYYY-MM-DD>
查询指定开始日期的作业-u <username>
查询特定用户的作业
- 输出字段:
- JobID: 作业ID
- JobName: 作业名称
- Partition: 分区名称
- Account: 用户账户
- State: 作业状态(COMPLETED、FAILED、CANCELLED等)
- Elapsed: 作业运行时间
squeue
查看作业信息
Slurm | 功能 |
---|---|
squeue -j <作业的jobid> | 查看作业信息 |
squeue -l | 查看细节信息 |
squeue --nodelist=<节点名称> | 查看特定节点作业信息 |
squeue | 查看USER_LIST的作业 |
squeue --state=R | 查看特定状态的作业 |
squeue --help | 查看所有的选项 |
输出字段:
- JOBID: 作业ID
- PARTITION: 分区名称
- NAME: 作业名称
- USER: 用户名
- ST: 作业状态包括
R
(正在运行),PD
(正在排队),CG
(即将完成),CD
(已完成) - TIME: 作业运行时间
- NODES: 作业使用的节点数量
- NODELIST(REASON): 作业所在节点或排队原因
默认情况下,squeue
只会展示在排队或在运行的作业。
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
18046 dgx2 ZXLing eenl R 1:35:53 1 vol04
17796 dgx2 python eexdl R 3-00:22:04 1 vol02
显示您自己账户下的作业:
squeue -u <用户名>
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
17923 dgx2 bash hpcwj R 1-12:59:05 1 vol05
-l
选项可以显示更细节的信息。
squeue -u <用户名> -l
JOBID PARTITION NAME USER STATE TIME TIME_LIMI NODES NODELIST(REASON)
17923 dgx2 bash hpcwj RUNNING 1-13:00:53 30-00:00:00 1 vol05
srun
启动交互式作业
srun --partition=<分区> --nodes=<节点数> --ntasks=<任务数> --t=<时长> --mem=<内存> --c=<调用的CPU数量> --pty bash
运行此命令后,你会获得一个交互式的 shell,能够在该节点上直接执行命令。但是srun的缺点是一旦断线就无法重新连接回去,因此推荐使用Linux终端复用神器tmux/screen+srun配合运行
sbatch
作业提交
准备作业脚本然后通过sbatch
提交是 Slurm 的最常见用法。为了将作业脚本提交给作业系统,Slurm 使用
sbatch my_job_script.sh
Slurm 具有丰富的参数集。以下最常用的。
Slurm | 含义 |
---|---|
-n [count] | 总进程数 |
--ntasks-per-node=[count] | 每台节点上的进程数 |
-p [partition] | 作业队列 |
--job-name=[name] | 作业名 |
--output=[file_name] | 标准输出文件 |
--error=[file_name] | 标准错误文件 |
--time=[dd-hh:mm:ss] | 作业最大运行时长 |
--exclusive | 独占节点 |
--mail-type=[type] | 通知类型,可选 all, fail, end,分别对应全通知、故障通知、结束通知 |
--mail-user=[mail_address] | 通知邮箱 |
--nodelist=[nodes] | 偏好的作业节点 |
--exclude=[nodes] | 避免的作业节点 |
--depend=[state:job_id] | 作业依赖 |
--array=[array_spec] | 序列作业 |
这是一个名为cpu.slurm
的作业脚本,该脚本向cpu队列申请1个节点40核,并在作业完成时通知。在此作业中执行的命令是/bin/hostname
。
#SBATCH --job-name
作业名称#SBATCH --output
标准输出文件:如/share/home/pengchen/work/%x_%A_%a.out#SBATCH --error
ERROR输出文件:如/share/home/pengchen/work/%x_%A_%a.err#SBATCH --partition
工作分区,我们用cpu之类的#SBATCH --nodelist
可以制定在哪个节点运行任务#SBATCH --exclude
可以设置不放在某个节点跑任务#SBATCH --nodes
使用nodes数量#SBATCH --ntasks
tasks数量,可能分配给不同node#SBATCH --ntasks-per-node
每个节点的tasks数量,由于我们只有1 node,所以ntasks和ntasks-per-node是相同的#SBATCH --cpus-per-task
每个task使用的core的数量(默认 1 core per task),同一个task会在同一个node#SBATCH --mem
这个作业要求的内存 (Specified in MB,GB)#SBATCH --mem-per-cpu
每个core要求的内存 (Specified in MB,GB)
#!/bin/bash
#SBATCH --job-name=hostname
#SBATCH --partition=cpu
#SBATCH -N 1
#SBATCH --mail-type=end
#SBATCH --mail-user=YOU@EMAIL.COM
#SBATCH --output=%j.out
#SBATCH --error=%j.err
/bin/hostname
用以下方式提交作业:
sbatch cpu.slurm
squeue
可用于检查作业状态。用户可以在作业执行期间通过SSH登录到计算节点。输出将实时更新到文件[jobid] .out和[jobid] .err。
这里展示一个更复杂的作业要求,其中将启动80个进程,每台主机40个进程。
#!/bin/bash
#SBATCH --job-name=LINPACK
#SBATCH --partition=cpu
#SBATCH -n 80
#SBATCH --ntasks-per-node=40
#SBATCH --mail-type=end
#SBATCH --mail-user=YOU@EMAIL.COM
#SBATCH --output=%j.out
#SBATCH --error=%j.err
以下作业请求4张GPU卡,其中1个CPU进程管理1张GPU卡。
#!/bin/bash
#SBATCH --job-name=GPU_HPL
#SBATCH --partition=dgx2
#SBATCH -n 4
#SBATCH --ntasks-per-node=4
#SBATCH --gres=gpu:4
#SBATCH --mail-type=end
#SBATCH --mail-user=YOU@MAIL.COM
#SBATCH --output=%j.out
#SBATCH --error=%j.err
以下作业启动一个3任务序列(从0到2),每个任务需要1个CPU内核。
#!/bin/bash
#SBATCH --job-name=python_array
#SBATCH --mail-user=YOU@MAIL.COM
#SBATCH --mail-type=ALL
#SBATCH --ntasks=1
#SBATCH --time=00:30:00
#SBATCH --array=0-2
#SBATCH --output=python_array_%A_%a.out
#SBATCH --output=python_array_%A_%a.err
module load miniconda2/4.6.14-gcc-4.8.5
source activate YOUR_ENV_NAME
echo "SLURM_JOBID: " $SLURM_JOBID
echo "SLURM_ARRAY_TASK_ID: " $SLURM_ARRAY_TASK_ID
echo "SLURM_ARRAY_JOB_ID: " $SLURM_ARRAY_JOB_ID
python < vec_${SLURM_ARRAY_TASK_ID}.py
在提交到SLURM的作业脚本中,可以激活Conda环境以确保作业在正确的软件环境中运行。以下是一个示例SLURM作业脚本:
#!/bin/bash
#SBATCH --job-name=myjob # 作业名称
#SBATCH --output=myjob.out # 标准输出和错误日志
#SBATCH --error=myjob.err # 错误日志文件
#SBATCH --ntasks=1 # 运行的任务数
#SBATCH --time=01:00:00 # 运行时间
#SBATCH --partition=compute # 作业提交的分区
# 加载Conda
source ~/miniconda3/etc/profile.d/conda.sh
# 激活环境
conda activate myenv
# 运行命令
python my_script.py
scancel
取消指定作业
- 用途: 取消一个或多个作业。
- 示例:
scancel 12345
- 参数:
-u <username>
取消特定用户的所有作业-p <partition>
取消特定分区中的作业
Slurm环境变量
Slurm | 功能 |
---|---|
$SLURM_JOB_ID | 作业ID |
$SLURM_JOB_NAME | 作业名 |
$SLURM_JOB_PARTITION | 队列的名称 |
$SLURM_NTASKS | 进程总数 |
$SLURM_NTASKS_PER_NODE | 每个节点请求的任务数 |
$SLURM_JOB_NUM_NODES | 节点数 |
$SLURM_JOB_NODELIST | 节点列表 |
$SLURM_LOCALID | 作业中流程的节点本地任务ID |
$SLURM_ARRAY_TASK_ID | 作业序列中的任务ID |
$SLURM_SUBMIT_DIR | 工作目录 |
$SLURM_SUBMIT_HOST | 提交作业的主机名 |
参考:
https://docs.hpc.sjtu.edu.cn/index.html
https://mp.weixin.qq.com/s/sTTCokxsYFaffdt2aZyoDw