使用EHPC實現「完美並行」的高效批處理方案

2021-09-12 15:40:12 字數 4703 閱讀 5257

在高效能計算場景中,使用者一次業務計算可以劃分為大量的任務,每個任務的處理邏輯相同,但是輸入檔案、引數設定和輸出檔案不同。由於每個任務處理邏輯相似,執行時彼此沒有依賴,按照高效能計算的平行計算模式,可歸為 「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 ...