使用實(shí)現(xiàn)EHPC完美并行的高效批處理方案的示例分析,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
公司專注于為企業(yè)提供網(wǎng)站設(shè)計制作、成都網(wǎng)站建設(shè)、微信公眾號開發(fā)、商城網(wǎng)站建設(shè),微信小程序定制開發(fā),軟件按需設(shè)計網(wǎng)站等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。憑借多年豐富的經(jīng)驗(yàn),我們會仔細(xì)了解各客戶的需求而做出多方面的分析、設(shè)計、整合,為客戶設(shè)計出具風(fēng)格及創(chuàng)意性的商業(yè)解決方案,成都創(chuàng)新互聯(lián)公司更提供一系列網(wǎng)站制作和網(wǎng)站推廣的服務(wù)。
在高性能計算場景中,用戶一次業(yè)務(wù)計算可以劃分為大量的任務(wù),每個任務(wù)的處理邏輯相同,但是輸入文件、參數(shù)設(shè)置和輸出文件不同。由于每個任務(wù)處理邏輯相似,執(zhí)行時彼此沒有依賴,按照高性能計算的并行計算模式,可歸為 “embarrassing parallel”一類(又被稱為完美并行問題),這類問題很少或根本不需要將問題分成許多并行任務(wù)的工作,通這些并行任務(wù)之間很少或沒有依賴或需要通信,這類問題有一個另外的名稱,叫做“批處理”,是高性能計算領(lǐng)域最“完美”的一種場景。在此,給出了基于阿里云彈性高性能計算場景的數(shù)組作業(yè)解決方案——利用E-HPC集成的作業(yè)調(diào)度系統(tǒng),將用戶的批處理任務(wù)自動分配到數(shù)組作業(yè),實(shí)現(xiàn)在云超算集群上高并發(fā)執(zhí)行。同時,依靠“云”彈性,動態(tài)擴(kuò)展集群的計算資源,控制批處理的完成時間。
先通過一個示例介紹批處理的場景,然后討論高性能計算集群以及數(shù)組作業(yè)。
在高性能計算領(lǐng)域中,存在大批量、可同時處理的計算場景,如以下freebayes應(yīng)用場景,不同任務(wù)均使用freebayes應(yīng)用程序,但是每個任務(wù)處理不同的輸入文件(--bam-list)、不同的參數(shù)(-r)和不同的結(jié)果文件(--vcf)。由于作業(yè)量巨大,需要任務(wù)的并發(fā)執(zhí)行,以縮短任務(wù)處理時間。
高性能計算集群是將大量的計算節(jié)點(diǎn)通過網(wǎng)絡(luò)互聯(lián),進(jìn)行統(tǒng)一的管理和調(diào)度,為大規(guī)模應(yīng)用運(yùn)行提供計算環(huán)境,包括賬號管理、調(diào)度管理、文件系統(tǒng)、集群監(jiān)控等模塊。
由于集群包含大量計算節(jié)點(diǎn),通常為多個用戶共同使用,每個用戶可以提交多個作業(yè),每個作業(yè)需要一個或多個計算節(jié)點(diǎn)。集群資源的分配是由調(diào)度管理協(xié)調(diào),以避免資源使用沖突,常用的調(diào)度管理軟件包括PBS,Slurm,SGE,LSF等。
數(shù)組作業(yè)是一組作業(yè)的集合,可以執(zhí)行一條提交作業(yè)的命令,提交作業(yè)集合中的所有作業(yè),每個作業(yè)用各自的index取值進(jìn)行區(qū)分。
如使用PBS調(diào)度器提交1個數(shù)組作業(yè),文件名為 qjob.sh,內(nèi)容如下:
#!/bin/bash #PBS -N arrjob # 作業(yè)名稱 #PBS -l nodes=1:ppn=1 # 每個作業(yè)需要1個計算節(jié)點(diǎn),每個節(jié)點(diǎn)1個核的資源 #PBS -J 1-3 # 數(shù)組作業(yè)的作業(yè)編號為1,2,3 echo $PBS_ARRAY_ID # 每個作業(yè)的編號在PBS_ARRAY_ID 環(huán)境變量中
qjob.sh腳本定義了一個數(shù)組作業(yè),包含3個作業(yè)。作業(yè)編號范圍用-J
指定,取值為1-3。在具體作業(yè)執(zhí)行時,每個作業(yè)的編號通過環(huán)境變量$PBS_ARRAY_ID
獲取。通過以下命令就可以提交qjob.sh 作業(yè):
qsub ./qjob.sh
此時,創(chuàng)建了3個作業(yè),而作業(yè)能否立刻執(zhí)行,需要調(diào)度器根據(jù)集群空閑資源和作業(yè)的資源需求來定。若資源充裕,3個作業(yè)可以同時運(yùn)行。
從批處理和數(shù)組作業(yè)介紹看,數(shù)組作業(yè)適用批處理計算的場景,但做到簡易使用,還存在以下問題:
批處理任務(wù)與作業(yè)的對應(yīng)關(guān)系?當(dāng)任務(wù)數(shù)量巨大時,是一個任務(wù)就是一個作業(yè),還是一個作業(yè)包含多個任務(wù)?
如何從$PBS_ARRAY_ID
到不同任務(wù)的關(guān)聯(lián)?并能夠方便對應(yīng)不同任務(wù)的不同參數(shù)?
如何跟蹤任務(wù)的執(zhí)行情況?如何方便查看任務(wù)日志?在個別任務(wù)執(zhí)行失敗后,如何能夠快速的篩選,并在調(diào)整后重新執(zhí)行?
為此,我們給出使用數(shù)組作業(yè)解決批處理的方案,包括批處理任務(wù)到作業(yè)分配、批處理任務(wù)定義和任務(wù)運(yùn)行及追蹤功能。
當(dāng)批處理任務(wù)數(shù)目巨大時,如果每個任務(wù)都分配一個作業(yè),調(diào)度器的負(fù)載就加重,雖然調(diào)度器能夠顯示不同作業(yè)的運(yùn)行狀態(tài),作業(yè)數(shù)目過大,也會導(dǎo)致查看不方便。此外,相鄰任務(wù)在一個節(jié)點(diǎn)執(zhí)行,如果使用相同文件,可以重用節(jié)點(diǎn)的本地緩存。
為此,若任務(wù)數(shù)為Nt,作業(yè)數(shù)為Nj,每個作業(yè)處理的任務(wù)數(shù)為 Nt/Nj,如果不能整除,作業(yè)編號小于Nt%Nj的作業(yè)多處理一個任務(wù)。如之上批處理任務(wù),如果Nt/Nj=2,但不能整除,作業(yè)編號小的作業(yè)會處理3個任務(wù),而編號大的作業(yè),會處理2個任務(wù)。
從批處理任務(wù)示例中我們可以看出,每個任務(wù)進(jìn)行部分參數(shù)不同,若將這些變化的部分用變量代替,則批處理任務(wù)的處理腳本為(存放在文件 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=$? # 保留主要程序的退出狀態(tài) # other shell commands # ... ... exit $ret # 任務(wù)執(zhí)行狀態(tài),0為成功,非0表示失敗
其中,用$bamlist
表示 --bam-list 選項(xiàng)的變化取值和--vcf參數(shù)取值的變化部分,用$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
在批處理任務(wù)定義后之后,需要實(shí)現(xiàn)任務(wù)與作業(yè)映射、變量文件的解析和賦值。這些通用功能,E-HPC提供了ehpcarrayjob.py
python 腳本,進(jìn)行處理,數(shù)組作業(yè)的腳本名若為qjob.sh,其內(nèi)容為:
$ cat qjob.sh #!/bin/bash PBS -N bayes.job #PBS -l nodes=1:ppn=1 #PBS -J 1-Nj cd $PBS_O_WORKDIR # 表示打開提交作業(yè)的目錄。 python ehpcarrayjob.py -n Nj -e ./task.sh bamlist chrvar
通過qsub命令提交到集群上,有PBS進(jìn)行調(diào)度,實(shí)現(xiàn)批量執(zhí)行(其中Nj為作業(yè)的數(shù)目,根據(jù)需求進(jìn)行替換)。
$ 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表示有多少個作業(yè)
-e指明每個任務(wù)的處理腳本(需要帶路徑)
argfiles 一個或多個,指定多個參數(shù)文件。
作業(yè)提交后,數(shù)組作業(yè)會分配一個作業(yè)id,如“1[].manager”,每個子作業(yè)都有自己的子作業(yè)編號,如從1-Nj。
ehpcarrayjob.py會生成以”作業(yè)id“為名的目錄(如1[].manager),每個子作業(yè)在該目錄下有“l(fā)og.子作業(yè)編號”命名的日志文件,記錄每個作業(yè)的執(zhí)行情況。
當(dāng)任務(wù)的返回作狀態(tài)為非0(失?。r,會將任務(wù)變量的取值在”作業(yè)id“目錄下記錄到名為”fails.變量名.子作業(yè)編號“的文件中。待確定失敗原因,修改處理腳本后,方便重新提交作業(yè)。
站在用戶的角度,每次數(shù)值計算任務(wù)來了,除了要劃分好批量的任務(wù),即使有遺留的腳本,還需要改寫每個任務(wù)的處理腳本。
此外,還要面對以下運(yùn)行場景的問題:
這次計算需要多少資源?
到那里找這些資源?
任務(wù)能運(yùn)行起來嗎,出錯了怎么找原因?
任務(wù)會不會重算、漏算?
機(jī)器利用能不能銜接上,會不會出現(xiàn)長時間空閑?
使用阿里云彈性高性能計算(E-HPC)的批處理處理方案可以解決以上問題,讓工作更專注。
可以看出,借助E-HPC方案用戶僅需要通過以下幾個步驟:
將批處理任務(wù)中變化的取值提取出來,單獨(dú)存儲到一個文件中,文件名符合shell規(guī)范,如bamlist, chrvar。
編寫任務(wù)處理的腳本,使用變量名(文件名同名)替換任務(wù)中的變化取值,如task.sh。
編寫數(shù)組作業(yè)腳本,指明每個作業(yè)的資源需求,總作業(yè)數(shù),調(diào)用 ehpcarrayjob.py啟動批處理任務(wù)執(zhí)行,如qjob.sh。
用qsub提交作業(yè),進(jìn)入”作業(yè)id“的目前查看任務(wù)處理進(jìn)度以及又問題的任務(wù)列表。作業(yè)的運(yùn)行狀態(tài)根據(jù)集群的資源狀態(tài)進(jìn)行判斷,如果集群節(jié)點(diǎn)充足,所有作業(yè)均可以運(yùn)行;如果資源不滿足,少量作業(yè)可以先執(zhí)行。
同時E-HPC“云”超算方案還有以下優(yōu)勢:
具備HPC集群原有特性,方便用戶登陸集群進(jìn)行編譯和調(diào)試單個任務(wù)的處理邏輯,并通過E-HPC內(nèi)置應(yīng)用級監(jiān)控模塊集諦進(jìn)行監(jiān)控、分析、優(yōu)化應(yīng)用運(yùn)行行為。
借助E-HPC,可以直接將配置好的環(huán)境擴(kuò)展到新加的計算節(jié)點(diǎn)上。同時,使用低配置的登陸和管控節(jié)點(diǎn)長久保留已配置環(huán)境。
根據(jù)當(dāng)前的任務(wù)處理效率,在“云”上動態(tài)地更換計算實(shí)例類型,并擴(kuò)充計算資源來調(diào)整任務(wù)的處理時間,以應(yīng)對緊急的任務(wù)處理。
看完上述內(nèi)容,你們掌握使用實(shí)現(xiàn)EHPC完美并行的高效批處理方案的示例分析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!