大数跨境
0
0

使用Makefile规则文档编写程序执行规则

使用Makefile规则文档编写程序执行规则 Dr.X的基因空间
2023-12-24
0
导读:Makefile可以用于在高性能计算服务器上递交分析作业

Makefile规则文档编译

写在前面的
来到新的环境后需要不断地去适应和学习新的内容,最近我感受最大的是研究生阶段所在的单位没有太多做生物信息学的资源及高性能计算设备。所以以前几乎没有条件接触到更好的资源。特别是,以前在课题组只有自己一个人做dry-expriment,来到新环境后接触到新的内容总有一种很强烈的感觉是自己以前在闭门造车。以至于我开始感觉对于一个有意向在生物信息学领域取得一定成就的研究生,还是尽可能不要选择一个纯实验背景的实验室。并不是说生物信息学要脱离实验,而是指要选择一个有生物信息学团体的实验室。要去一个有生物信息学氛围的环境中。否则,一个人在纯实验背景下单打独斗,认知和能力的提升真的非常非常有限。来到新环境的几天,我第一次真正接触到高性能计算资源,甚至在一开始,我都不知道哪些节点具有哪些功能。安装软件传输数据执行程序等不同的操作都需要在指定的节点和指定的路径下完成。不好意思地说,我刚登陆进入超算后连基本的生物信息软件安装都完不成。最后从IT-team那里获知,我在一个没有file lock功能的路径下安装软件。怪不得怎么都安装不上。

SGE系统实现多节点并行计算

       从新课题组的IT-team和同事这边了解到,咱们课题组使用的高性能服务器是基于SGE开源集群管理软件的作业管理和集群调度的。SGE是Sun Grid Engine的缩写,该软件最初由Sun Microsystem开发,后来被Oracle收购进行继续开发和支持。SGE的核心目标是搭建高性能计算环境、最大程度允许用户有效充分利用计算资源。SGE能够允许用户实现多节点并行处理自己的任务。对比之下,以前旧课题组的工作站虽然也可以通过巧妙地编写命令实现并行运算,但是受制于工作站内存(最大才64G)和线程(最大才80个逻辑CPU)的限制。少部分任务最多可以并行计算两个,大部分需要耗费内存的任务无法并行。因此,以前在旧课题组工作时,我都是写的串行式分析程序,确保每个样本都能以最大的计算资源最快完成分析。但是在新的环境,遇到新的资源,就需要使用新的方法来实现并行计算。所以我的第一步便是学习如何使用SGE作业调度系统完成程序提交、运行。从而实现高效率数据分析。

Makefile规则文档编写

       新课题组的IT-team和同事告诉我,他们一般是利用Makefile文件来提交作业分析数据。其实Makefile我是知道的,因为自己以前通过源码安装软件时经常使用shell的make命令来编译程序,而make命令则是让Linux系统自动搜索工作目录下的GUNmakefile/makefile/Makefile,从而实现软件的编译。以前从来没有想过Makefile文件是做什么的,也从来没有意识到Makefile文件还可以用于作业提交和程序编写。同事们向我讲解了Makefile的本质,它其实是一个规则文档,主要目的是告诉系统去按照一系列规则和步骤完成一个任务。从同事那边了解了Makefile的大概后,我立马开始了尝试和摸索。下面是我学习到的Makefile文件编写规则。

<target><dependence1> <dependence2>...<dependencen>
[TAB] <command>

  其实,Makefile的规则(rule)语法非常简单,它是由三部分构成,目标(target)、完成目标需要的依赖(dependence)和完成目标需要执行的命令(command)构成。一个简单的Makefile文件可以由多个显式规则构成,它们共同组成一个Protocal去完成目标任务。复杂的Makefile文件则会搭配多种Shell语法和隐式规则。我想,后面有了数据和明确的分析目标后应该会构建复杂的Makefile文档。
为了便于自己理解,我构建了一个简单的Makefile文档

all: step-00.finished step-01.finished final.finished
step-00.finished:
        mkdir ./temp_record && touch step-00.finished
step-01.finished:step-01.pl
        perl step-01.pl && touch step-01.finished
final.finished:step-00.finished step-01.finished
        mv *finished ./temp_record/

   在这个Makefile文档中,我首先申明了我的总目标是完成step-00.finished、step-01.finished和final.finished三个目标。为了实现这三个目标,首先实现子目标1,是step-00.finished文档生成,该目标不需要任何依赖,直接在当前目录下创建了临时文件夹temp_record,并创建空文档step-00.finished,完成第一个目标后,达成了第二个目标执行的依赖之一。同时我自己预先写了一个perl程序(step-01.pl)放在同样的目录下,step-00.finished和step-01.pl共同达成第二个目标的依赖,第二个目标命令开始执行,运行perl程序,创建第二个空文档step-01.finished。当第二个空文档被创建后它和第一个空文档共同达成了第三个目标的依赖,第三个目标开始执行。将全部的finish空文档移动至子目标1创建的文件夹中。其中,我的perl程序写了如下内容:

#!/usr/bin/perl -w
use strict;
use warnings;

print "This is step-01.pl\n"

     执行Makefile文件,终端就会输出下面#部分的内容,因为perl程序是打印This is step-01.pl,所以终端除了打印出command以外,还打印了Perl程序的输出内容。

make -f Makefile

#mkdir ./temp_record && touch step-00.finished
#perl step-01.pl && touch step-01.finished
#This is step-01.pl
#mv *finished ./temp_record/

   当makefile文件编写好了,就需要使用PBS命令提交makefile至服务器开始分析数据。这部分我还没有开始尝试。接下来会尽快尝试。

写在后面的
学会并适应使用高性能计算资源只是第一步,更重要的是接下来如何利用高性能计算资源构建自己的分析程序,挖掘更多的数据。

【声明】内容源于网络
0
0
Dr.X的基因空间
【中国科学院博士】10年生命科学数据挖掘研究经验,关注生物医药领域体外诊断(IVD)方向,如肿瘤早筛、传染病未知病原快速检测中的技术创新及其与人工智能(AI)的赋能应用
内容 176
粉丝 0
Dr.X的基因空间 【中国科学院博士】10年生命科学数据挖掘研究经验,关注生物医药领域体外诊断(IVD)方向,如肿瘤早筛、传染病未知病原快速检测中的技术创新及其与人工智能(AI)的赋能应用
总阅读0
粉丝0
内容176