1.2.Cluster

0) Introduction of cluster

生物信息学中的大多数数据处理任务比日常工作中需要更多的计算能力,这意味着我们必须使用大型服务器或计算集群。集群(cluster)就是一组相互独立的计算机,通过高速的网络组成一个计算机系统。对外表现为单一的系统,协同起来向用户提供系统资源,系统服务。高性能计算集群(High-perfomance clusters),简称HPC,采用将计算任务分配到集群的不同计算节点儿提高计算能力,因而主要应用在科学计算领域。
下面以清华大学生物计算平台的生物信息计算集群(P/T cluster) 为例,介绍集群的具体使用。

1) Log in a cluster remotely

1a) Mac用户:
从“/Applications⁩/⁨Utilities” 中打开 "Terminal" 软件,使用SSH登录远程计算集群。
ssh -p 11*** [email protected]*.*
在本地机器和远程机器之间传输文件 1. 使用Linux下的scp或者rsync命令; 2. 使用独立软件例如FileZilla: FileZilla是一个免费开源的FTP软件,分为客户端版本和服务器版本,具备所有的FTP软件功能。可控性、有条理的界面和管理多站点的简化方式使得Filezilla客户端版成为一个方便高效的FTP客户端工具,传输速度很快,而且稳定。下载地址:https://www.filezilla.cn/ 选择导航菜单的文件 --> 站点管理,输入名称和主机IP,协议默认SSH,端口默认22。
1b) Windows用户:
安装 Xshell, 下载地址:https://xshell.en.softonic.com/ ,选择家庭/学校免费版下载。或者安装FinalShell, 下载地址:http://www.hostbuf.com/
名称
内容
主机IP
166.111.*.* (申请得到)
端口
11** (申请得到)
用户名
user_??(申请得到)
密码
password(申请得到)
协议
SSH or STPF-SSH

2) First and last things to do

First: source

1
source /WORK/Samples/singularity.sh
Copied!

Last: exit

1
exit
Copied!

3) Singularity

本节主要讲解在P/T cluster中如何使用singularity,本机无法配置Docker的同学可以使用cluster上的singularity。大家首先要登陆cluster,以下命令默认都在cluster上运行。
singularity类似Docker,是一种容器(container)技术,用户可以在本地将软件打包成镜像,上传到服务器上运行。因为用户在本地计算机上拥有root权限,在制作软件的容器镜像时也拥有root权限,相对于Docker,在部署安装应用的时候更加灵活,更适合在公共的cluster上的非root的用户使用。

(1) Create and run a container (容器)

1
source /WORK/Samples/singularity.sh
2
singularity run /data/images/bioinfo_tsinghua.simg
Copied!
这里我们新建了一个名为 bioinfo_tsinghua 的 container (容器), 除非有特殊说明,接下来的章节中所有操作均在该容器中进行。
注意
与Docker的容器不同的是,我们进入singularity的容器后默认是在每个用户自己的家目录下进行操作,例如/home/zhangsan。用户需相应文件夹拷贝至自己的目录下进行操作,例如:
1
cp -r /home/test/linux /home/zhangsan/linux
Copied!

(2) Exit the container

1
exit
Copied!
  • cluster上的singularity 使用演示动画如下:
注意:
我们使用 singulairy run是会创建一个container的环境,然后可以在这个环境中进行多次命令操作,但最后的时候需要利用exit命令退出这个环境。而在下文的example 2中,我们在job中使用singularity exec命令进行一次性的命令操作,就不需要exit这个命令来结束了。

4) How to use cluster

cluster是为多用户同时使用而设计,包含多个运算节点。为了不发生多用户同时使用相同运算节点造成拥堵和死机,需要按照queue(队列)进行使用。
注意
每个用户需要严格按照如下脚本遵循运算任务队列(queue)提交任务(jobs),千万不能登录进cluster后直接运行大的运算任务。
注意: 下面的脚本中会生成一些新的文件和文件夹,如果需要多次测试脚本,第二次执行时最好清空之前的文件和文件夹,不然容易出现文件或者文件夹已经存在的报错信息。

(1) Example 1. submit a mapping job

(1.1) 准备任务提交脚本 test1.sh

任务提交脚本有自己的固定格式,如下:
1
#!/bin/bash
2
#SBATCH -J tophat_test
3
#SBATCH -p CN_BIOT
4
#SBATCH --nodes=1
5
#SBATCH --ntasks=4
6
#SBATCH --output=%j.out
7
#SBATCH --error=%j.err
8
9
# Get the software
10
export PATH=/WORK/teaching/bin:$PATH
11
12
# run code.
13
data=/WORK/teaching/diff-exp/
14
mkdir -p ~/mapping
15
mapping=~/mapping
16
tophat --bowtie1 -p 4 -G ${data}yeast_annotation.gff --no-coverage-search -o ${mapping}/wt1_thout ${data}bowtie_index/YeastGenome ${data}Raw_reads_10k/wt1.fq
17
tophat --bowtie1 -p 4 -G ${data}yeast_annotation.gff --no-coverage-search -o ${mapping}/wt2_thout ${data}bowtie_index/YeastGenome ${data}Raw_reads_10k/wt2.fq
18
tophat --bowtie1 -p 4 -G ${data}yeast_annotation.gff --no-coverage-search -o ${mapping}/wt1X_thout ${data}bowtie_index/YeastGenome ${data}Raw_reads_10k/wt1X.fq
19
tophat --bowtie1 -p 4 -G ${data}yeast_annotation.gff --no-coverage-search -o ${mapping}/wt2X_thout ${data}bowtie_index/YeastGenome ${data}Raw_reads_10k/wt2X.fq
Copied!
Name
mean
#SBATCH -J echo
命名job name为“tophat_test”
#SBATCH -p ptest-computer
使用ptest-computer这个队列(queue)
#SBATCH --nodes=1
使用的节点数为1,对于平行运算的程序,希望多线程都在1个node上
#SBATCH --ntasks=4
使用的任务线程数为4(每个节点有16个核,所以1个节点的最大线程数为16)
#SBATCH --output=%j.out
运行日志输出到当前目录中,以 .out 结尾
#SBATCH --error=%j.err
运行错误日志输出到当前目录中,以 .err 结尾

(1.2) 使用sbatch命令提交 test1.sh

1
sbatch test1.sh
Copied!

(2) Example 2. submit a RNAediting job

该例子一共需要准备4个文件,具体见(2.1)-(2.4)。

(2.1) 主提交脚本 test2.sh

1
#!/bin/bash
2
#SBATCH -J rnaeditor_test
3
#SBATCH -p CN_BIOT
4
#SBATCH --nodes=1
5
#SBATCH --ntasks=10
6
#SBATCH --output=%j.out
7
#SBATCH --error=%j.err
8
9
export SINGULARITY_BINDPATH='/WORK,/Share'
10
11
/WORK/app/singularity-2.0-20191204/bin/singularity exec /WORK/teaching/image/rnaeditor_1.8.simg bash run_RNAeditor.sh
Copied!

(2.2) 运行脚本 run_RNAeditor.sh

上述test2.sh中嵌套了一个run_RNAeditor.sh,里面的内容可以按如下准备:
1
sh RNAeditor_env.bashrc
2
mkdir -p ~/output2/
3
cp -r /apps/RNAEditor/ui/ ./
4
RNAEditor.py -i /WORK/teaching/rna_regulation/rnaeditor/chr1.fq -c ~/RNAeditor_config
Copied!

(2.3) 环境变量文件 RNAeditor_env.bashrc

1
# ~/.bashrc: executed by bash(1) for non-login shells.
2
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
3
# for examples
4
export PATH=/apps/RNAEditor/ui:\
5
/apps/RNAEditor/ui:\
6
/apps/RNAEditor/scripts:\
7
/apps/RNAEditor/website:\
8
/apps/RNAEditor/ressources:$PATH
Copied!

(2.4) 参数配置文件 RNAeditor_config

特别注意,下面的 yourname 写的是自己的用户名。
output = /home/[yourname]/rna_regulation/rnaeditor/output2/chr1
下面是以 user_02 为例子`
1
# This file is used to configure the behaviour of RNAeditor
2
3
# Standard input files
4
refGenome = /WORK/teaching/rna_regulation/rnaeditor/data/Homo_sapiens.GRCh38.ch1.fa
5
gtfFile = /WORK/teaching/rna_regulation/rnaeditor/data/Homo_sapiens.GRCh38.chr1.gtf
6
dbSNP = /WORK/teaching/rna_regulation/rnaeditor/data/dbSNP.vcf.new
7
hapmap = /WORK/teaching/rna_regulation/rnaeditor/data/HAPMAP.vcf
8
omni = /WORK/teaching/rna_regulation/rnaeditor/data/1000GenomeProject.vcf
9
esp = /WORK/teaching/rna_regulation/rnaeditor/data/ESP.chr1.vcf
10
aluRegions = /WORK/teaching/rna_regulation/rnaeditor/data/Repeats.chr1.bed
11
output = /home/user_02/output2/chr1
12
sourceDir = /usr/local/bin/
13
maxDiff = 0.04
14
seedDiff = 2
15
standCall = 0
16
standEmit = 0
17
edgeDistance = 3
18
intronDistance = 5
19
minPts = 5
20
eps = 50
21
paired = False
22
keepTemp = True
23
overwrite = False
24
threads = 5
Copied!

(2.5) 提交任务脚本

准备好上述4个文件后,用sbatch命令提交test2.sh
1
sbatch test2.sh
Copied!
文件产生 chr1.editingSites.vcf,chr1.editingSites.gvf 表示运行成功。由于RNAeditor软件运行的最后一步是画图,需要root权限。在集群上一般我们没有办法取得root权限,所以到这步就完成了。
如果想查看最后一步的图,可以按照 6.1.RNA Editing Detection 重新运行一遍。
chr1.editingSites.vcf
1
#CHROM POS ID REF ALT QUAL FILTER INFO
2
1 27206932 . A G 66.28 . ExcessHet=3;ABHom=1;FS=0;MLEAF=1;MLEAC=2;AF=1;GI=ENSG00000225159:noncoding-exon;AC=2;AN=2;MQ0=0;Dels=0;SOR=3;MQ=37;QD=11;HaplotypeScore=0;BaseCounts=0,1,6,0;DP=7;
3
1 27207408 . T C 625.77 . ExcessHet=3;ABHom=1;FS=0;MLEAF=1;MLEAC=2;AF=1;GI=ENSG00000225159:noncoding-exon;AC=2;AN=2;MQ0=0;Dels=0;SOR=6;MQ=33;QD=22;HaplotypeScore=5;BaseCounts=0,28,0,0;DP=28;
4
1 225790429 . T C 12.99 . ExcessHet=3;AC=1;BaseQRankSum=-1;MLEAF=0;AF=0;ABHet=0;GI=ENSG00000143742:3'UTR;MLEAC=1;AN=2;MQ0=0;Dels=0;FS=0;MQ=37;QD=2;SOR=0;HaplotypeScore=1;MQRankSum=1;BaseCounts=0,2,0,4;DP=6;ReadPosRankSum=-1;
5
1 236981402 . T C 1224.77 . ExcessHet=3;ABHom=1;FS=0;MLEAF=1;MLEAC=2;AF=1;GI=ENSG00000237991:noncoding-exon;AC=2;AN=2;MQ0=0;Dels=0;SOR=7;MQ=30;QD=27;HaplotypeScore=0;BaseCounts=0,44,2,0;DP=46;
6
1 87046554 . T C 185.78 . ExcessHet=3;ABHom=1;FS=0;MLEAF=1;MLEAC=2;AF=1;GI=ENSG00000153936:intron,ENSG00000267561:intron,ENSG00000225568:noncoding-exon;AC=2;AN=2;MQ0=0;Dels=0;SOR=1;MQ=37;QD=23;HaplotypeScore=0;BaseCounts=0,8,0,0;DP=8;
7
1 220698670 . T C 3.98 . ExcessHet=3;AC=1;BaseQRankSum=1;MLEAF=0;AF=0;ABHet=0;GI=ENSG00000162817:3'UTR;MLEAC=1;AN=2;MQ0=0;Dels=0;FS=0;MQ=37;QD=0;SOR=0;HaplotypeScore=0;MQRankSum=-1;BaseCounts=0,2,0,9;DP=11;ReadPosRankSum=0;
Copied!
chr1.editingSites.gvf
1
#Gene_ID Name SEGMENT #CHROM GENE_START GENE_STOP VAR_ID VAR_POS REF ALT QUAL #A #C #G #T Reads_Total Edited_Reads Editing_Ratio
2
ENSG00000225159 NPM1P39 noncoding-exon 1 27206930 27207796 . 27206932 A G 66.28 0 1 6 0 7 6 0.86
3
ENSG00000225159 NPM1P39 noncoding-exon 1 27206930 27207796 . 27207408 T C 625.77 0 28 0 0 28 28 1.0
4
ENSG00000143742 SRP9 3'UTR 1 225777813 225790466 . 225790429 T C 12.99 0 20 4 6 2 0.33
5
ENSG00000237991 RPL35P1 noncoding-exon 1 236981339 236981708 . 236981402 T C 1224.77 0 44 2 0 46 44 0.96
6
ENSG00000153936 HS2ST1 intron 1 86914648 87109998 . 87046554 T C 185.78 0 80 0 8 8 1.0
7
ENSG00000267561 RP5-1052I5.2 intron 1 86993009 87169204 . 87046554 T C 185.78 0 8 0 0 8 8 1.0
8
ENSG00000225568 RP11-384B12.3 noncoding-exon 1 87045875 87046700 . 87046554 T C 185.78 0 8 0 0 8 8 1.0
9
ENSG00000162817 C1orf115 3'UTR 1 220689845 220699157 . 220698670 T C 3.980 2 0 9 11 2 0.18
Copied!

(3) Monitor and manage jobs

  • 查看队列信息
1
squeue
Copied!
  • 查看节点信息
1
sinfo
Copied!
  • 取消任务
1
scancel jobid
Copied!
  • 查看节点
1
pestat
Copied!

5) Tips

  • 任务(jobs)要尽量小而多
尽可能把大的任务拆分成小的,可以用bash等脚本的for loop写出多个提交脚本(test1.sh, test2.sh, ..., test100.sh), 然后在用for命令在命令行里一次提交多个。
建议一次提交的任务数是总线程数的5-10倍,比如一个集群容许每个用户最多跑50个jobs,那么可以一次提交250-500个jobs的脚本。
但是每个脚本的时间要尽可能短(建议每个大约~10min - 2hour)。
  • 对于大内存软件要注意多占线程数
注意在1个node上同时多人运行多个大内存程序时,会造成内存不够和溢出而死机。
例如, 运行 star 时,推荐 core=6,这样的话, 如果1个node有128G memory、20 core,一次用6 core,不仅可以平行运算提速,而且至少占用 128G/(20/6) = 38.4G的内存, 应该不太容易内存溢出而死机了 (如果还是溢出就增加 core=8,10,12...)。
对于P集群,一个node有64G, 16 core, 运行star这样的程序时,我们推荐独占一个node,1个node上运行1个star(最多可以2个)程序:
1
#SBATCH --nodes=1
2
#SBATCH --ntasks=16
Copied!
Advanced: 如果我们担心其他人的程序也在自己的node上跑,挤压自己的内存,但一个脚本只用8个线程也足够了,还空余8个(一个node总共是16个core)。 这时可以同时提交两个脚本,虽然每个脚本只指定8个线程,但可以在两个脚本中指定相同的node的名称。具体如何操作课查看队列管理程序的help。
Last modified 7mo ago