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

使用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個作業可以同時運行。

使用數組作業解決批處理任務

從批處理和數組作業介紹看,數組作業適用批處理計算的場景,但做到簡易使用,還存在以下問題:

  1. 批處理任務與作業的對應關係?當任務數量巨大時,是一個任務就是一個作業,還是一個作業包含多個任務?

  2. 如何從$PBS_ARRAY_ID到不同任務的關聯?並能夠方便對應不同任務的不同參數?

  3. 如何跟蹤任務的執行情況?如何方便查看任務日誌?在個別任務執行失敗後,如何能夠快速的篩選,並在調整後重新執行?

爲此,我們給出使用數組作業解決批處理的方案,包括批處理任務到作業分配、批處理任務定義和任務運行及追蹤功能。

批處理任務到作業分配

當批處理任務數目巨大時,如果每個任務都分配一個作業,調度器的負載就加重,雖然調度器能夠顯示不同作業的運行狀態,作業數目過大,也會導致查看不方便。此外,相鄰任務在一個節點執行,如果使用相同文件,可以重用節點的本地緩存。

爲此,若任務數爲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方案用戶僅需要通過以下幾個步驟:

  1. 將批處理任務中變化的取值提取出來,單獨存儲到一個文件中,文件名符合shell規範,如bamlist, chrvar。

  2. 編寫任務處理的腳本,使用變量名(文件名同名)替換任務中的變化取值,如task.sh。

  3. 編寫數組作業腳本,指明每個作業的資源需求,總作業數,調用 ehpcarrayjob.py啓動批處理任務執行,如qjob.sh。

用qsub提交作業,進入”作業id“的目前查看任務處理進度以及又問題的任務列表。作業的運行狀態根據集羣的資源狀態進行判斷,如果集羣節點充足,所有作業均可以運行;如果資源不滿足,少量作業可以先執行。

同時E-HPC“雲”超算方案還有以下優勢:

  1. 具備HPC集羣原有特性,方便用戶登陸集羣進行編譯和調試單個任務的處理邏輯,並通過E-HPC內置應用級監控模塊集諦進行監控、分析、優化應用運行行爲。

  2. 藉助E-HPC,可以直接將配置好的環境擴展到新加的計算節點上。同時,使用低配置的登陸和管控節點長久保留已配置環境。

  3. 根據當前的任務處理效率,在“雲”上動態地更換計算實例類型,並擴充計算資源來調整任務的處理時間,以應對緊急的任務處理。


原文鏈接

本文爲雲棲社區原創內容,未經允許不得轉載。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章