可以参考我的上一篇博客:
https://blog.csdn.net/weixin_62528784/article/details/146122850?sharetype=blogdetail&sharerId=146122850&sharerefer=PC&sharesource=weixin_62528784&spm=1011.2480.3001.8118
这一节主要是对上一节的一些内容的补充:
1,Pi2.0 超算介绍:
我们教学用的队列主要是这个队列
2,作业递交脚本模板
#!/bin/bash
#SBATCH --job-name=xxx #作业名称
#SBATCH --partition=xx #节点类型,即要使用哪个队列
#SBATCH -n xx #作业指定使用总核数,核心core数,有时也称之为进程数
#SBATCH --ntasks-per-node=xx #指定每个节点使用核数
#SBATCH --mail-type=end # 作业结束发送邮件
#SBATCH --mail-user=[your_mail_address] #指定发送邮件的地址
#SBATCH --output=%j.out #指定输出文件
#SBATCH --error=%j.err #指定报错文件
xxx #实际执行的命令
我们需要注意的是1个节点(我们可以理解为超算集群中的1台电脑)是有很多核心core数的,详情见1中的每个队列的展示;
我们此处再举几个例子,来加深一下最基本的slurm脚本理解,主要是其中的一些参数,都是我上课用的教学例子。
编写作业脚本(*.slurm),作业脚本示例:
该作业指定作业名字为 fastqc,指定 cpu 节点,作业使用总核数为 16 个核,每个节点分配 16 个核,作业计算结束给用户发送邮件,有标准的报错文件。
#!/bin/bash
#SBATCH --job-name=fastqc
#SBATCH --partition=cpu
#SBATCH -n 16
#SBATCH --ntasks-per-node=16
#SBATCH --mail-type=end
#SBATCH --mail-user=[your_mail_address] #请改成自己邮件的地址
#SBATCH --output=%j.out
#SBATCH --error=%j.err
module load fastqc
fastqc -t 40 -o ./ /lustre/share/class/BIO8402/lab/data/SRR5811639.fastq.gz
注:①其他可选参数: (Note: optional parameters)
#SBATCH -n XX #占用节点数(number of nodes)
#SBATCH --exclusive #独占节点 (number of exclusive nodes)
#SBATCH –time=[dd-hh:mm:ss] #指定作业最多运行时间 (max run time)
#SBATCH –nodelist=[nodes] #指定在该节点运行作业(specify a node(s))
#SBATCH --exclude=[nodes] #指定不在该节点运行作业 (specify not run on these nodes)
#SBATCH -o %J.out #输出结果文件 (output file name)
★区分-n 和--ntasks-per-node (Note:-n and --ntasks-per-node is different)
②当任务不支持 MPI 时时,假如要指定 cpu 节点 8 个核,-n 和--ntasks-per- node 要一起使用才能保证 8 个核心都来自同一个节点上。
(If MPI is not required for a task, if you want to assign 8 coresto a cpu node, you
should use options -n and -ntasks-per-node simultaneously to ensure the 8 cores are
from the same node.)
#SBATCH -n 8
#SBATCH --ntasks-per-node=8
尤其是MPI这一点,要非常关注
因为有很多软件运行的时候是不支持MPI即跨节点运行的,
所以我们在运行的时候需要注意,
如果要保证运行某个程序时所有的核心也就是进程都是来自于同一个节点,也就是用同一台电脑计算运行的,
我们就需要确保我们每个节点设置的核心数和我们指定的任务总核心数是一致的,这样才能确保这些核心都是来自于同一个节点运行,减少不可控因素的影响。
3,常用命令:
这一部分详细可以参考我的上一篇博客:
https://blog.csdn.net/weixin_62528784/article/details/146122850?spm=1001.2014.3001.5501
(1) 提交任务(task submission):sbatch blastn.slurm
(2) 杀掉任务(kill a task):scancel jobid
(3) 查看任务(check the status of a task):squeue
squeue –u “clswcc-wmz” 只展示个人目录下任务情况(only show tasks under an individual directory)
l PARTITION: 节点类型(queue name) ****cpu
l ST: 任务状态——R****:正在运行,PD:排队(task status—R: running, PD: pending)
l NODES: 任务所用节点数目(the number of nodes for a task) ****1
l NODESLIST: 任务所在节点,可通过**ssh**** **登陆该节点,例:ssh node220
(the list of node to run the task. You can use ssh to login to this node. For example, ssh node220. )
(4) 查看节点状态:sinfo (check the status of a node:sinfo)
sinfo –p cpu /gpu/fat: 查看某一类型节点状态(check the status of nodes in a queue)
STATE: drain:节点有问题,alloc:正在全部正在使用,mix:部分可以用,idle:闲置,down:节点不可用
(5) 监控和再修改作业(monitor or revise a task)
scontrol show job JOB_ID 显示该作业的一些信息
scontrol -dd show job JOB_ID 显示该作业的作业脚本
(6) module avail: 显示超算已安装的软件(show the modules installed)
module purge: 清理现有环境
module load :加载某个软件
module unload: 卸载某个软件
module list: 显示自己目录下已加载的软件
6、超算计时方法(the method to measure the computational time)
这个是我们需要掌握并且理解的,考虑到超算的计费标准。
(1)CPU 计时方法(CPU time measuring method)
单个作业所消耗的机时,与其运行时长及使用的CPU 核心数有关,
计算公式为T= t * n
n 为作业使用的CPU 核心数,t 为作业的运行时长(单位:小时,作业排队时间不计入消耗的机时),T 为该作业消耗的机时量(单位:核小时)。
例:一个作业在独占一个16 核的cpu 节点,运行一个小时则消耗机时为16 核小时。Pi2.0 单个cpu 节点上的核数可能有所增加。请注意查看具体情况。
(2)GPU 计时方法(GPU time measuring method)
运行在GPU 队列上的作业,机时使用是按照CPU 耗时折算而来的。一个GPU
节点上配置了96 个CPU 核,包括16 块GPU 加速卡。
GPU 机时的计费单位是“卡小时”(cardhours),卡小时与用于计算CPU 机时费的单位“核小时”(corehours) 换算关系为1 cardhour = 120 corehours(该换算关系比较老了,现在交大的换算关系应该不是这个了)
例:一个作业独占一个GPU 节点运行一个小时则消耗机时为16*120 核小时!
- 读写压缩文件的小窍门(压缩状态下分析文件的方法)(tricks using compressed files)
8,除了超算,生科院生信系的小超算:使用系教学集群时参考(任务递交系统为 torque),而非slurm
(1)Environment Module
• 可用Environment Modules 切换多个版本的工具软件
• 查看可用软件及版本:module avail
• 加载工具:module load
• 卸载工具:module unload
• 查看当前加载工具:module list
(2)作业调度系统常用命令
qstat(查看作业状态,作业结束一段时间后不能查看)
(3)作业调度系统脚本示例,脚本模板如下:
请在你自己熟悉的编辑器中按如上模板编辑如下脚本,保存为test.pbs
另外一个例子:
RNA 序列比对——以 blast 为例建库+比对
9,对于我之前测试运行时间的脚本的更正:
参考我的博客:
https://blog.csdn.net/weixin_62528784/article/details/146118720
(1)之前的写法我是slurm中写个循环,也就是在同一个脚本内依次执行 4/8/16/32/64 线程
#!/bin/bash
#SBATCH --job-name=blast
#SBATCH --partition=cpu
#SBATCH -n 64 # 申请最多 64 核
#SBATCH --ntasks-per-node=64
#SBATCH --output=%j.out
#SBATCH --error=%j.err
#SBATCH --mail-type=end
#SBATCH --mail-user=zht161932@sjtu.edu.cn
module load blast-plus
# 声明一个线程列表
THREADS_LIST=(4 8 16 32 64)
for THREADS in "${THREADS_LIST[@]}"; do
echo -e "Testing -num_threads=$THREADS starts at $(date).\n"
start=$(date +%s)
blastn -query /lustre/share/class/BIO8402/lab/data/SRR5029637.fasta \
-db /lustre/share/class/BIO8402/lab/test/chr21 \
-evalue 1e-5 \
-outfmt 7 \
-max_target_seqs 1 \
-num_threads "$THREADS" \
-out /lustre/home/acct-stu/stu542/hw/test_class3/blast_time_test/n${THREADS}t${THREADS}
end=$(date +%s)
time=$(( end - start ))
echo -e "difftime for -num_threads=$THREADS is $time s\n"
done
(2)第2种方法就是提供shell脚本的$1参数:通过脚本参数 $1 指定线程数
将下方脚本另存为 blast_param.sh,提交作业时通过 sbatch blast_param.sh 8 等方式指定线程参数
#!/bin/bash
#SBATCH --job-name=blast
#SBATCH --partition=cpu
#SBATCH -n 64
#SBATCH --ntasks-per-node=64
#SBATCH --output=%j.out
#SBATCH --error=%j.err
#SBATCH --mail-type=end
#SBATCH --mail-user=zht161932@sjtu.edu.cn
module load blast-plus
if [ -z "$1" ]; then
echo "Usage: sbatch $0 <threads>"
exit 1
fi
THREADS=$1
start=$(date +%s)
blastn -query /lustre/share/class/BIO8402/lab/data/SRR5029637.fasta \
-db /lustre/share/class/BIO8402/lab/test/chr21 \
-evalue 1e-5 \
-outfmt 7 \
-max_target_seqs 1 \
-num_threads "$THREADS" \
-out /lustre/home/acct-stu/stu542/hw/test_class3/blast_time_test/n${THREADS}t${THREADS}
end=$(date +%s)
time=$(( end - start ))
echo "Blast job with $THREADS threads took $time s"
(3)在脚本中写一个循环,依次提交多个作业:
此方法会自动为列表中的每个线程数提交一个独立作业:
#!/bin/bash
THREADS_LIST=(4 8 16 32 64)
for THREADS in "${THREADS_LIST[@]}"; do
sbatch <<EOF
#!/bin/bash
#SBATCH --job-name=blast
#SBATCH --partition=cpu
#SBATCH -n $THREADS # 申请 $THREADS 核(如有需要,可改为更大值)
#SBATCH --ntasks-per-node=$THREADS
#SBATCH --output=%j.out
#SBATCH --error=%j.err
#SBATCH --mail-type=end
#SBATCH --mail-user=zht161932@sjtu.edu.cn
module load blast-plus
start=\$(date +%s)
blastn -query /lustre/share/class/BIO8402/lab/data/SRR5029637.fasta \
-db /lustre/share/class/BIO8402/lab/test/chr21 \
-evalue 1e-5 \
-outfmt 7 \
-max_target_seqs 1 \
-num_threads $THREADS \
-out /lustre/home/acct-stu/stu542/hw/test_class3/blast_time_test/n${THREADS}t${THREADS}
end=\$(date +%s)
time=\$(( end - start ))
echo "Blast job with $THREADS threads took \$time s"
EOF
done
————————————————》
一些draft
每个节点(机器)有40个核,每个核有4内存
内存需要20G的话,如果一个节点是4G内存,需要多核至少5核
单个节点最大40G,最高192G内存
时间也要省(时间复杂度+计算资源计算),空间也要省(压缩+压缩形式下读写)
压缩时间忽略不计:
读写在硬盘上,cpu都计算超过硬盘