使用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,可以直接将配置好的環境擴充到新加的計算節點上。同時,使用低配置的登陸和管控節點長久保留已配置環境。
- 根據目前的任務處理效率,在“雲”上動态地更換計算執行個體類型,并擴充計算資源來調整任務的處理時間,以應對緊急的任務處理。