在高性能计算场景中,用户一次业务计算能够划分为大量的任务,每一个任务的处理逻辑相同,可是输入文件、参数设置和输出文件不一样。因为每一个任务处理逻辑类似,执行时彼此没有依赖,按照高性能计算的并行计算模式,可归为 “embarrassing parallel”一类(又被称为完美并行问题),这类问题不多或根本不须要将问题分红许多并行任务的工做,通这些并行任务之间不多或没有依赖或须要通讯,这类问题有一个另外的名称,叫作“批处理”,是高性能计算领域最“完美”的一种场景。在此,给出了基于阿里云弹性高性能计算场景的数组做业解决方案——利用E-HPC集成的做业调度系统,将用户的批处理任务自动分配到数组做业,实如今云超算集群上高并发执行。同时,依靠“云”弹性,动态扩展集群的计算资源,控制批处理的完成时间。node
本节先经过一个示例介绍批处理的场景,而后讨论高性能计算集群以及数组做业。python
在高性能计算领域中,存在大批量、可同时处理的计算场景,如如下freebayes应用场景,不一样任务均使用freebayes应用程序,可是每一个任务处理不一样的输入文件(--bam-list)、不一样的参数(-r)和不一样的结果文件(--vcf)。因为做业量巨大,须要任务的并发执行,以缩短任务处理时间。shell
高性能计算集群是将大量的计算节点经过网络互联,进行统一的管理和调度,为大规模应用运行提供计算环境,包括帐号管理、调度管理、文件系统、集群监控等模块。数组
因为集群包含大量计算节点,一般为多个用户共同使用,每一个用户能够提交多个做业,每一个做业须要一个或多个计算节点。集群资源的分配是由调度管理协调,以免资源使用冲突,经常使用的调度管理软件包括PBS,Slurm,SGE,LSF等。缓存
数组做业是一组做业的集合,能够执行一条提交做业的命令,提交做业集合中的全部做业,每一个做业用各自的index取值进行区分。bash
如使用PBS调度器提交1个数组做业,文件名为 qjob.sh,内容以下:微信
#!/bin/bash #PBS -N arrjob # 做业名称 #PBS -l nodes=1:ppn=1 # 每一个做业须要1个计算节点,每一个节点1个核的资源 #PBS -J 1-3 # 数组做业的做业编号为1,2,3 echo $PBS_ARRAY_ID # 每一个做业的编号在PBS_ARRAY_ID 环境变量中
qjob.sh脚本定义了一个数组做业,包含3个做业。做业编号范围用-J
指定,取值为1-3。在具体做业执行时,每一个做业的编号经过环境变量$PBS_ARRAY_ID
获取。经过如下命令就能够提交qjob.sh 做业:网络
qsub ./qjob.sh
此时,建立了3个做业,而做业可否马上执行,须要调度器根据集群空闲资源和做业的资源需求来定。若资源充裕,3个做业能够同时运行。并发
从批处理和数组做业介绍看,数组做业适用批处理计算的场景,但作到简易使用,还存在如下问题:高并发
$PBS_ARRAY_ID
到不一样任务的关联?并可以方便对应不一样任务的不一样参数?为此,咱们给出使用数组做业解决批处理的方案,包括批处理任务到做业分配、批处理任务定义和任务运行及追踪功能。
当批处理任务数目巨大时,若是每一个任务都分配一个做业,调度器的负载就加剧,虽然调度器可以显示不一样做业的运行状态,做业数目过大,也会致使查看不方便。此外,相邻任务在一个节点执行,若是使用相同文件,能够重用节点的本地缓存。
为此,若任务数为Nt,做业数为Nj,每一个做业处理的任务数为 Nt/Nj,若是不能整除,做业编号小于Nt%Nj的做业多处理一个任务。如之上批处理任务,若是Nt/Nj=2,但不能整除,做业编号小的做业会处理3个任务,而编号大的做业,会处理2个任务。
从批处理任务示例中咱们能够看出,每一个任务进行部分参数不一样,若将这些变化的部分用变量代替,则批处理任务的处理脚本为(存放在文件 task.sh中):
$ cat task.sh #!/bin/bash echo "process $bamlist and $chrvar" #other shell commands 如经过cd $bamlist freebayes --bam-list $bamlist -r $chrvar --vcf /home/user/result/out-$bamlist.vcf ret=$? # 保留主要程序的退出状态 # other shell commands # ... ... exit $ret # 任务执行状态,0为成功,非0表示失败
其中,用$bamlist
表示 --bam-list 选项的变化取值和--vcf参数取值的变化部分,用$chrvar
表示 -r选型的变化取值。
将具体变化的取值,存储在变量名同名的文件中,每一行表明不一样的取值,示例中有2个变量,所以须要两个文件——bamlist和chrvar。
$ cat bamlist bam1_100 bam101_200 bam201_300 bam301_400 bam401_500 bam501_600 bam601_700 bam701_800 bam801_900 ... ... bam901_1000 bam1001_1100
$ cat chrvar chr01:1-1000 chr01:1001-2000 chr03:100-200 chr12:1000-2000 chr02:100-1100 chr03:1000-2000 chr05:1000-2000 chr08:1000-2000 chr08:3000-6000 ... ... chr01:8000-9000 chr06:1000-2000
在批处理任务定义后以后,须要实现任务与做业映射、变量文件的解析和赋值。这些通用功能,E-HPC提供了ehpcarrayjob.py
python 脚本,进行处理,数组做业的脚本名若为qjob.sh,其内容为:
$ cat qjob.sh #!/bin/bash PBS -N bayes.job #PBS -l nodes=1:ppn=1 #PBS -J 1-Nj cd $PBS_O_WORKDIR # 表示打开提交做业的目录。 python ehpcarrayjob.py -n Nj -e ./task.sh bamlist chrvar
经过qsub命令提交到集群上,有PBS进行调度,实现批量执行(其中Nj为做业的数目,根据需求进行替换)。
$ python ehpcarrayjob.py -h usage: ehpcarrayjob.py [-h] -n NJOBS -e EXECFILE argfiles [argfiles ...] positional arguments: argfiles optional arguments: -h, --help show this help message and exit -n NJOBS, --njobs NJOBS number of jobs -e EXECFILE, --execfile EXECFILE job command file
其中:
-n表示有多少个做业
-e指明每一个任务的处理脚本(须要带路径)
argfiles 一个或多个,指定多个参数文件。
做业提交后,数组做业会分配一个做业id,如“1[].manager”,每一个子做业都有本身的子做业编号,如从1-Nj。
ehpcarrayjob.py会生成以”做业id“为名的目录(如1[].manager),每一个子做业在该目录下有“log.子做业编号”命名的日志文件,记录每一个做业的执行状况。
当任务的返回做状态为非0(失败)时,会将任务变量的取值在”做业id“目录下记录到名为”fails.变量名.子做业编号“的文件中。待肯定失败缘由,修改处理脚本后,方便从新提交做业。
站在用户的角度,每次数值计算任务来了,除了要划分好批量的任务,即便有遗留的脚本,还须要改写每一个任务的处理脚本。
此外,还要面对如下运行场景的问题:
此次计算须要多少资源?
到那里找这些资源?
任务能运行起来吗,出错了怎么找缘由?
任务会不会重算、漏算?
机器利用能不能衔接上,会不会出现长时间空闲?
使用阿里云弹性高性能计算(E-HPC)的批处理处理方案能够解决以上问题,让工做更专一。
能够看出,借助E-HPC方案用户仅须要经过如下几个步骤:
用qsub提交做业,进入”做业id“的目前查看任务处理进度以及又问题的任务列表。做业的运行状态根据集群的资源状态进行判断,若是集群节点充足,全部做业都可以运行;若是资源不知足,少许做业能够先执行。
同时E-HPC“云”超算方案还有如下优点:
原文连接 更多技术干货 请关注阿里云云栖社区微信号 :yunqiinsight