在高效能計算場景中,使用者一次業務計算可以劃分為大量的任務,每個任務的處理邏輯相同,但是輸入檔案、引數設定和輸出檔案不同。由於每個任務處理邏輯相似,執行時彼此沒有依賴,按照高效能計算的平行計算模式,可歸為 「embarrassing parallel」一類(又被稱為完美並行問題),這類問題很少或根本不需要將問題分成許多並行任務的工作,通這些並行任務之間很少或沒有依賴或需要通訊,這類問題有乙個另外的名稱,叫做「批處理」,是高效能計算領域最「完美」的一種場景。在此,給出了基於阿里雲彈性高效能計算場景的陣列作業解決方案——利用e-hpc整合的作業排程系統,將使用者的批處理任務自動分配到陣列作業,實現在雲超算集群上高併發執行。同時,依靠「雲」彈性,動態擴充套件集群的計算資源,控制批處理的完成時間。
背景介紹
本節先通過乙個示例介紹批處理的場景,然後討論高效能計算集群以及陣列作業。
批處理在高效能計算領域中,存在大批量、可同時處理的計算場景,如以下freebayes應用場景,不同任務均使用freebayes應用程式,但是每個任務處理不同的輸入檔案(--bam-list)、不同的引數(-r)和不同的結果檔案(--vcf)。由於作業量巨大,需要任務的併發執行,以縮短任務處理時間。
高效能計算集群與陣列作業介紹
高效能計算集群是將大量的計算節點通過網路互聯,進行統一的管理和排程,為大規模應用執行提供計算環境,包括賬號管理、排程管理、檔案系統、集群監控等模組。
由於集群包含大量計算節點,通常為多個使用者共同使用,每個使用者可以提交多個作業,每個作業需要乙個或多個計算節點。集群資源的分配是由排程管理協調,以避免資源使用衝突,常用的排程管理軟體包括pbs,slurm,sge,lsf等。
陣列作業是一組作業的集合,可以執行一條提交作業的命令,提交作業集合中的所有作業,每個作業用各自的index取值進行區分。
如使用pbs排程器提交1個陣列作業,檔名為 **ob.sh,內容如下:
echo $pbs_array_id # 每個作業的編號在pbs_array_id 環境變數中
**ob.sh指令碼定義了乙個陣列作業,包含3個作業。作業編號範圍用-j指定,取值為1-3。在具體作業執行時,每個作業的編號通過環境變數$pbs_array_id獲取。通過以下命令就可以提交**ob.sh 作業:
qsub ./**ob.sh
此時,建立了3個作業,而作業能否立刻執行,需要排程器根據集群空閒資源和作業的資源需求來定。若資源充裕,3個作業可以同時執行。
使用陣列作業解決批處理任務
從批處理和陣列作業介紹看,陣列作業適用批處理計算的場景,但做到簡易使用,還存在以下問題:
批處理任務與作業的對應關係?當任務數量巨大時,是乙個任務就是乙個作業,還是乙個作業包含多個任務?
如何從$pbs_array_id到不同任務的關聯?並能夠方便對應不同任務的不同引數?
如何跟蹤任務的執**況?如何方便檢視任務日誌?在個別任務執行失敗後,如何能夠快速的篩選,並在調整後重新執行?
為此,我們給出使用陣列作業解決批處理的方案,包括批處理任務到作業分配、批處理任務定義和任務執行及追蹤功能。
批處理任務到作業分配
當批處理任務數目巨大時,如果每個任務都分配乙個作業,排程器的負載就加重,雖然排程器能夠顯示不同作業的執行狀態,作業數目過大,也會導致檢視不方便。此外,相鄰任務在乙個節點執行,如果使用相同檔案,可以重用節點的本地快取。
為此,若任務數為nt,作業數為nj,每個作業處理的任務數為 nt/nj,如果不能整除,作業編號小於nt%nj的作業多處理乙個任務。如之上批處理任務,如果nt/nj=2,但不能整除,作業編號小的作業會處理3個任務,而編號大的作業,會處理2個任務。
批處理任務定義
從批處理任務示例中我們可以看出,每個任務進行部分引數不同,若將這些變化的部分用變數代替,則批處理任務的處理指令碼為(存放在檔案 task.sh中):
$ cat task.sh
echo "process $bamlist and $chrvar"
freebayes --bam-list $bamlist -r $chrvar --vcf /home/user/result/out-$bamlist.vcf
ret=$? # 保留主要程式的退出狀態
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 指令碼,進行處理,陣列作業的指令碼名若為**ob.sh,其內容為:
$ cat **ob.sh
pbs -n bayes.job
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啟動批處理任務執行,如**ob.sh。
用qsub提交作業,進入」作業id「的目前檢視任務處理進度以及又問題的任務列表。作業的執行狀態根據集群的資源狀態進行判斷,如果集群節點充足,所有作業均可以執行;如果資源不滿足,少量作業可以先執行。
同時e-hpc「雲」超算方案還有以下優勢:
具備hpc集群原有特性,方便使用者登陸集群進行編譯和除錯單個任務的處理邏輯,並通過e-hpc內建應用級監控模組集諦進行監控、分析、優化應用執行行為。
借助e-hpc,可以直接將配置好的環境擴充套件到新加的計算節點上。同時,使用低配置的登陸和管控節點長久保留已配置環境。
根據當前的任務處理效率,在「雲」上動態地更換計算例項型別,並擴充計算資源來調整任務的處理時間,以應對緊急的任務處理。
使用EHPC實現「完美並行」的高效批處理方案
在高效能計算場景中,使用者一次業務計算可以劃分為大量的任務,每個任務的處理邏輯相同,但是輸入檔案 引數設定和輸出檔案不同。由於每個任務處理邏輯相似,執行時彼此沒有依賴,按照高效能計算的平行計算模式,可歸為 embarrassing parallel 一類 又被稱為完美並行問題 這類問題很少或根本不需...
使用EHPC實現「完美並行」的高效批處理方案
在高效能計算場景中,使用者一次業務計算可以劃分為大量的任務,每個任務的處理邏輯相同,但是輸入檔案 引數設定和輸出檔案不同。由於每個任務處理邏輯相似,執行時彼此沒有依賴,按照高效能計算的平行計算模式,可歸為 embarrassing parallel 一類 又被稱為完美並行問題 這類問題很少或根本不需...
foreach高效並行的例子
在foreach包的mannual中,高效並行的例子 將行分塊後,傳送到各個workers foreach x iblkcol newx,3 combine c packages foreach dopar 會報錯 error in eval expr,envir,enclos could not ...