在高性能計算場景中,用戶一次業務計算能夠劃分爲大量的任務,每一個任務的處理邏輯相同,可是輸入文件、參數設置和輸出文件不一樣。因爲每一個任務處理邏輯類似,執行時彼此沒有依賴,按照高性能計算的並行計算模式,可歸爲 「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