MAKER的并行化初探

MAKER并行分为两种,一种基于MPI,运行方式为mpiexec -n 线程数 maker, 一种是在同一个项目中运行多次maker。前者需要在安装MAKER时进行设置,后者相当于你手动按照染色体数目进行拆分,然后分开运行MAKER。本片主要介绍基于MPI的并行策略。

下图是MAKER是基于MPI的并行化流程。分为三个层次,contig水平,更小的片段水平,不同程序的并行。

contig水平就是对每条contig进行分别注释。而由于每个contig的长度不一,当较短的contig运行结束后,我们还需要等待较长的contig结束。因此,我们还需要将contig继续拆分,让每条contig分成更小的片段,成为基本的分析单元。对于每个分析单元,还可以考虑将不同程序进行并行。

Fig1

在MAKER实际运行时,如果用gotop进行查看你会发现系统中会出现很多maker进程(以mpiexec -n 10为例)

Fig2

但是你发现只有少量的和注释有关的程序(如blastx)。如果用ps aux | grep maker查找和maker有关的进程,你会发现大量的maintain.pl进程,并且这些进程后面跟着一大串你不认识的符号

1
/usr/bin/perl /opt/biosoft/maker/bin/../lib/File/maintain.pl 46535 30 %04%09%08%31%3...

为了理解MAKER的并行,你需要通过pstree -ap [mpiexec进程ID]更细致的了解MAKER的进程树

Fig3

从中你可以发现,因为我们用mpiexec启动了10个maker进程,所以hydra_pmi_proxy有10个maker子进程。对于这10个maker子进程,每个进程都至少会有一个maintain.pl。通过阅读maintain.pl的源代码,我们可以得知该程序后接参数中的46535是PID(进程号), 30是sleep time, 最后一个是URI编码字符,是利用Storable::freeze持久化的数据结构,可以通过如下的代码进行解码(命名为decode.pl)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/env perl
use warnings;
use strict;

use URI::Escape;
use Storable;
use vars qw($LOCK);

my $serial = shift;

$serial = uri_unescape($serial);
$LOCK = Storable::thaw($serial);

print "$LOCK->{lock_file} \n"

可以批量对maintain.pl里的信息进行解码

1
ps aux | grep maintain.pl | grep -v grep | awk '{print $15}' | xargs -i perl decode.pl {}

因此,那么多的maker并不是在话说,而是在负责任务调度,差不多一个任务会有3个maker进程保驾护航。

回到之前的进程数,这里有一些maker进程下会跟着一些正在运行的命令,blastx, exonerate

Fig4

而有些只有maker和maintain.pl进程。

Fig5

如果等待一会,再次运行pstree -ap [mpiexec进程ID],你会发现这两种状态会发生转换,这说明任务启动也需要一段时间。