计算生物学是重要的科研工具。在大数据时代,计算常辅以并行计算技术以加快计算速度。我一直认为数据处理最重要的步骤不在分析阶段,而在预分析,也就是数据探索阶段。掌握了并行计算方法,可以更自由地探索大数据。比如,在我们医学领域里,进行探索研究时会不断地形成各种假设,也会突然冒出新的想法,需要一一去探索。没有高效率的计算能力,繁琐的运算会让大部分人中途而止,研究得不到尽兴。数据越大,这种瓶颈越明显。
1.并行运算
简单理解,并行运算就是利用多个CPU同时运算,以加快计算速度。根据可以利用的计算机资源,有两类场景:
- 一个node里使用多个CPU,对应OpenMP(Open Multi-processing)
- 多个node里使用多个CPU,对应MPI(Message Passing Interface)
一定把握好二者的区别: OpenMP共享内存,实现简单;MPI里不同node的CPU使用各自的内存。对一些耗费不大的计算生物学问题,不见的MPI速度更快,因为数据在不同node间传输的速度拖累了多个CPU带来的好处。
R语言里通过doParallel包等可以方便地实现并行计算。但MPI难以实现,只能通过脚本方式;MATLAB通过pool可以实现OpenMP和MPI;其它程序,可以通过Linux里PBS的Batch功能,利用脚本实现OpenMP和MPI。
除了通过CPU实现并行运算外,GPU也可进行并行运算。GPU运算在机器学习领域里很成熟了,但用户可操作性不高。若程序支持GPU,就可以用;不支持,用户无法作为。想玩玩,可以试试Python里TensorFlow的GPU运算。
2.Linux下实现并行运算
大多数计算任务是用多个CPU集中完成一个任务,结束之后再进行下个任务。这既是合理利用计算资源的要求,也更是因为大部分计算生物学(生物信息学)的程序已经在内部实现了OpenMP功能。特别是单个任务就需要耗费大量的计算资源时,如序列比对。当遇见一些较为简单但却杂而多的任务时,可以通过Linux命令或脚本实现并行运算。注意,此时有些任务不需要并行运算,甚至在单机上串行即可。
2.1 Linux命令
★ &命令
command1 & command2 & command3
# 本质是利用&的后台功能
★ xargs命令
cat list.txt | xargs command
# 适用于向同一个程序传递不同的参数,-P参数可以控制最大进程数
★ parallel命令
- 用法1:
parallel command1 command2 command3
# 类似&,但可以用-j等参数 - 用法2:
cat file | parallel -j 8 --block 10M --pipe command
#把file每隔10M行拆分,传递给—pipe
指定的command;-j
job的数量,默认为CPU个数
2.2 bash脚本
可任意组合各种生物信息学命令,通过for+&循环启动多个进程。
可以通过命名管道FIFO(first in first out)控制进程数
2.3 R、MATLAB等程序自带OpenMP
参考R和MATLAB
2.4 MPI的两种实现方式
- Open MPI的
mpirun
- MPICH的
mpexec
3. Linux的PBS
PBS (Portable Batch System),最初由NASA的Ames研究中心开发,主要为了提供一个能满足异构计算网络需要的软件包,用于灵活的批处理,特别是满足高性能计算的需要。有Interactive mode和Batch mode两种。除非任务量巨大,个人喜欢Interactive方式,可以用于正式运算前的调试或自由探索,也可以方便利用X-window软件(Xming等),运行桌面软件,如同在本地使用。
PBS主要命令为qsub (queue submit)
- Interactive mode:
msub -I -X -l nodes=1:ppn=4 -l mem=20G -l walltime=01:00:00
# -I interactive; -X foward to x11; 无法使用MPI - Batch mode: 将各种命令写入bash,让后通过
qsub
提交 #一般使用MPI的方法12345678910#!bin/bash#MSUB -A account#MSUB -N currentjobname#MSUB -l cores=1:ppn=10#MSUB -l walltime=00:30:00#MSUB -m bea [b:begin, e:end, a:abort]#MSBU -M your@email.eduexport PATH=$PATH:/project/b1024module load RRscript name.r
提交命令时: msub myscript.shqstat
, qdel
等各种命令处理job