使用EHPC實現“完美並行”的高效批處理方案
在高性能計算場景中,用戶一次業務計算可以劃分爲大量的任務,每個任務的處理邏輯相同,但是輸入文件、參數設置和輸出文件不同。由於每個任務處理邏輯相似,執行時彼此沒有依賴,按照高性能計算的並行計算模式,可歸爲 “embarrassing parallel”一類(又被稱爲完美並行問題),這類問題很少或根本不需要將問題分成許多並行任務的工作,通這些並行任務之間很少或沒有依賴或需要通信,這類問題有一個另外的名稱,叫做“批處理”,是高性能計算領域最“完美”的一種場景。在此,給出了基於阿里雲彈性高性能計算場景的數組作業解決方案——利用E-HPC集成的作業調度系統,將用戶的批處理任務自動分配到數組作業,實現在雲超算集羣上高併發執行。同時,依靠“雲”彈性,動態擴展集羣的計算資源,控制批處理的完成時間。
背景介紹
本節先通過一個示例介紹批處理的場景,然後討論高性能計算集羣以及數組作業。
批處理
在高性能計算領域中,存在大批量、可同時處理的計算場景,如以下freebayes應用場景,不同任務均使用freebayes應用程序,但是每個任務處理不同的輸入文件(--bam-list)、不同的參數(-r)和不同的結果文件(--vcf)。由於作業量巨大,需要任務的併發執行,以縮短任務處理時間。
高性能計算集羣與數組作業介紹
高性能計算集羣是將大量的計算節點通過網絡互聯,進行統一的管理和調度,爲大規模應用運行提供計算環境,包括賬號管理、調度管理、文件系統、集羣監控等模塊。
由於集羣包含大量計算節點,通常爲多個用戶共同使用,每個用戶可以提交多個作業,每個作業需要一個或多個計算節點。集羣資源的分配是由調度管理協調,以避免資源使用衝突,常用的調度管理軟件包括PBS,Slurm,SGE,LSF等。
數組作業是一組作業的集合,可以執行一條提交作業的命令,提交作業集合中的所有作業,每個作業用各自的index取值進行區分。
如使用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方案用戶僅需要通過以下幾個步驟:
將批處理任務中變化的取值提取出來,單獨存儲到一個文件中,文件名符合shell規範,如bamlist, chrvar。
編寫任務處理的腳本,使用變量名(文件名同名)替換任務中的變化取值,如task.sh。
編寫數組作業腳本,指明每個作業的資源需求,總作業數,調用 ehpcarrayjob.py啓動批處理任務執行,如qjob.sh。
用qsub提交作業,進入”作業id“的目前查看任務處理進度以及又問題的任務列表。作業的運行狀態根據集羣的資源狀態進行判斷,如果集羣節點充足,所有作業均可以運行;如果資源不滿足,少量作業可以先執行。
同時E-HPC“雲”超算方案還有以下優勢:
具備HPC集羣原有特性,方便用戶登陸集羣進行編譯和調試單個任務的處理邏輯,並通過E-HPC內置應用級監控模塊集諦進行監控、分析、優化應用運行行爲。
藉助E-HPC,可以直接將配置好的環境擴展到新加的計算節點上。同時,使用低配置的登陸和管控節點長久保留已配置環境。
根據當前的任務處理效率,在“雲”上動態地更換計算實例類型,並擴充計算資源來調整任務的處理時間,以應對緊急的任務處理。
本文爲雲棲社區原創內容,未經允許不得轉載。