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

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

在高性能計算場景中,用戶一次業務計算能夠劃分爲大量的任務,每一個任務的處理邏輯相同,可是輸入文件、參數設置和輸出文件不一樣。因爲每一個任務處理邏輯類似,執行時彼此沒有依賴,按照高性能計算的並行計算模式,可歸爲 「embarrassing parallel」一類(又被稱爲完美並行問題),這類問題不多或根本不須要將問題分紅許多並行任務的工做,通這些並行任務之間不多或沒有依賴或須要通訊,這類問題有一個另外的名稱,叫作「批處理」,是高性能計算領域最「完美」的一種場景。在此,給出了基於阿里雲彈性高性能計算場景的數組做業解決方案——利用E-HPC集成的做業調度系統,將用戶的批處理任務自動分配到數組做業,實如今雲超算集羣上高併發執行。同時,依靠「雲」彈性,動態擴展集羣的計算資源,控制批處理的完成時間。node

背景介紹

本節先經過一個示例介紹批處理的場景,而後討論高性能計算集羣以及數組做業。python

批處理

在高性能計算領域中,存在大批量、可同時處理的計算場景,如如下freebayes應用場景,不一樣任務均使用freebayes應用程序,可是每一個任務處理不一樣的輸入文件(--bam-list)、不一樣的參數(-r)和不一樣的結果文件(--vcf)。因爲做業量巨大,須要任務的併發執行,以縮短任務處理時間。shell

batchjob.jpg

高性能計算集羣與數組做業介紹

高性能計算集羣是將大量的計算節點經過網絡互聯,進行統一的管理和調度,爲大規模應用運行提供計算環境,包括帳號管理、調度管理、文件系統、集羣監控等模塊。數組

因爲集羣包含大量計算節點,一般爲多個用戶共同使用,每一個用戶能夠提交多個做業,每一個做業須要一個或多個計算節點。集羣資源的分配是由調度管理協調,以免資源使用衝突,經常使用的調度管理軟件包括PBS,Slurm,SGE,LSF等。緩存

數組做業是一組做業的集合,能夠執行一條提交做業的命令,提交做業集合中的全部做業,每一個做業用各自的index取值進行區分。bash

如使用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-map-job.jpg

批處理任務定義

從批處理任務示例中咱們能夠看出,每一個任務進行部分參數不一樣,若將這些變化的部分用變量代替,則批處理任務的處理腳本爲(存放在文件 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. 根據當前的任務處理效率,在「雲」上動態地更換計算實例類型,並擴充計算資源來調整任務的處理時間,以應對緊急的任務處理。

 

原文連接 更多技術乾貨 請關注阿里云云棲社區微信號 :yunqiinsight

相關文章
相關標籤/搜索