当前位置: 首页 > news >正文

HPC超算系列3——新手指南2

可以参考我的上一篇博客:

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 核小时!

  1. 读写压缩文件的小窍门(压缩状态下分析文件的方法)(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都计算超过硬盘

相关文章:

  • 基于Asp.net的度假村管理系统
  • 【弹性计算】异构计算云服务和 AI 加速器(二):适用场景
  • 快乐数 力扣202
  • Windows下安装kafka
  • WebGL 深度解析:从原理到实践的全方位指南
  • ClusterIP、Headless Service 和 NodePort 的比较
  • 整理了一下网络编程中TCP的状态
  • 小程序 wxml 语法 —— 38 setData() - 修改数组类型数据
  • 如何在vscode里像typora那样插入图片?
  • Django Form 组件
  • K8S学习之基础十八:k8s的灰度发布和金丝雀部署
  • Python使用入门(一)
  • 从0开始的操作系统手搓教程27:下一步,实现我们的用户进程
  • C++第十节:map和set的介绍与使用
  • Ubuntu 22.04 LTS 入门教学文档
  • LeetCode1137 第N个泰波那契数
  • 每日一练之移除链表元素
  • 匿名GitHub链接使用教程(Anonymous GitHub)2025
  • 【梦的开始】图布局算法
  • function uuid_generate_v4()不存在(二)
  • 毕设做网站可以用模板吗/网站推广方案模板
  • 网站建设 asp 武汉/网站提交
  • 网站建设网页设计用什么软件/今日最近的新闻大事10条
  • 电商网站建设技术交流问题/大连seo按天付费
  • 真分析对比他们的功能及特点_提出自己对政府门户网站建设的见解./青岛seo精灵
  • wordpress调用页面标题/北京网站优化专家