国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

利用LSF API實(shí)現(xiàn)GPU集群的并行機(jī)時(shí)統(tǒng)計(jì)

2020-12-07 06:08盛樂(lè)標(biāo)游偉倩張予倩周慶林
計(jì)算機(jī)時(shí)代 2020年11期

盛樂(lè)標(biāo) 游偉倩 張予倩 周慶林

摘? 要: 近年來(lái)GPU的使用越來(lái)越廣泛,更多的高性能計(jì)算集群采用CPU和GPU的異構(gòu)架構(gòu)。準(zhǔn)確的GPU計(jì)算機(jī)時(shí)統(tǒng)計(jì),是大型計(jì)算機(jī)集群執(zhí)行計(jì)費(fèi)政策的基礎(chǔ),但作業(yè)調(diào)度軟件LSF并未提供簡(jiǎn)便直觀的GPU計(jì)算機(jī)時(shí)統(tǒng)計(jì)功能。文章提出利用LSF API結(jié)合C語(yǔ)言、MPI和Shell腳本語(yǔ)言等進(jìn)行編程來(lái)解決,實(shí)現(xiàn)多樣化、可定制的GPU計(jì)算機(jī)時(shí)統(tǒng)計(jì)和報(bào)表制作,為高性能計(jì)算中心和超級(jí)計(jì)算中心的管理帶來(lái)便利。

關(guān)鍵詞: 高性能計(jì)算; 集群管理; GPU集群; 機(jī)時(shí)統(tǒng)計(jì)

中圖分類號(hào):G482? ? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A? ? ? 文章編號(hào):1006-8228(2020)11-63-03

Abstract: In recent years, GPUs have become more and more widely used, and more high-performance computing clusters have adopted heterogeneous architectures of CPU and GPU. Accurate GPU computation time accounting are the basis for large computer clusters to implement billing policies, but the job scheduling software LSF does not provide simple and intuitive methods for GPU computation time accounting. By using LSF API, programming with C language combined with MPI and Shell scripting language etc. is a good resolution, which can realize diverse and customizable GPU computation time statistics and make corresponding reports, so as to bring convenience to the management of high-performance computing centers and supercomputing centers.

Key words: high performance computing; cluster management; GPU cluster; computation time accounting

0 引言

高性能計(jì)算在科學(xué)研究、國(guó)防建設(shè)以及科技發(fā)展中發(fā)揮著重要作用,人們對(duì)此已經(jīng)取得廣泛共識(shí)[1]。隨著計(jì)算需求的不斷增長(zhǎng),國(guó)內(nèi)外對(duì)高性能計(jì)算集群的建設(shè)興趣也有增無(wú)減,歐美、日本、中國(guó)等在E級(jí)超級(jí)計(jì)算機(jī)的研發(fā)和建設(shè)方面更是投資巨大。在國(guó)內(nèi),除了建設(shè)多個(gè)國(guó)家超級(jí)計(jì)算中心,高校和科研院所也不斷地增加高性能計(jì)算方面的投入[2-4]。近年來(lái),隨著人工智能的迅速發(fā)展,對(duì)GPU服務(wù)器的需求急劇增加,新建的大型集群往往都采用CPU和GPU的混合架構(gòu)。由于各地高性能計(jì)算中心或超級(jí)計(jì)算中心都采取收費(fèi)政策,因此,準(zhǔn)確的CPU和GPU計(jì)算機(jī)時(shí)統(tǒng)計(jì)數(shù)據(jù)是超算中心或高性能計(jì)算中心進(jìn)行計(jì)費(fèi)的前提,并且可以為管理者提供可靠的分析數(shù)據(jù),輔助管理者進(jìn)行相關(guān)決策。目前,LSF、PBS Pro等作業(yè)調(diào)度軟件所提供的計(jì)算機(jī)時(shí)統(tǒng)計(jì)功能還不太完善,并不適合高性能計(jì)算中心的個(gè)性化需求[5-7]。以IBM公司的Spectrum LSF 10.1為例,其提供的bacct命令只能查詢某段時(shí)間內(nèi)用戶累計(jì)使用的CPU time,而不能提供對(duì)應(yīng)的wall time,同時(shí)也無(wú)法直觀獲取計(jì)算作業(yè)使用的GPU卡數(shù)量。因此,對(duì)GPU機(jī)時(shí)的統(tǒng)計(jì)會(huì)遇到諸多困難,但高性能計(jì)算中心又的確在這方面有切實(shí)的需求。之前,我們?cè)O(shè)計(jì)過(guò)利用LSF API實(shí)行CPU機(jī)時(shí)的統(tǒng)計(jì)[7],在前面工作的基礎(chǔ)上,本文將探討一種利用LSF API實(shí)現(xiàn)對(duì)GPU計(jì)算機(jī)時(shí)進(jìn)行高效統(tǒng)計(jì)的并行程序設(shè)計(jì)方法。

1 GPU計(jì)算機(jī)時(shí)統(tǒng)計(jì)策略

超算中心對(duì)計(jì)算資源的計(jì)費(fèi),往往是依據(jù)用戶對(duì)計(jì)算資源的實(shí)際占用時(shí)間,這樣比較客觀和公平。GPU服務(wù)器的計(jì)算機(jī)時(shí),主要分為兩部分,即CPU計(jì)算機(jī)時(shí)和GPU計(jì)算機(jī)時(shí)。CPU計(jì)算機(jī)時(shí)一般采用wall-clock time(簡(jiǎn)稱wall time)與所用CPU核數(shù)的乘積進(jìn)行CPU計(jì)算資源使用量統(tǒng)計(jì),單位為核時(shí);GPU計(jì)算機(jī)時(shí)與此類似,也可采用wall time與所用GPU卡數(shù)量的乘積進(jìn)行GPU計(jì)算資源使用量統(tǒng)計(jì),單位為卡時(shí)。CPU計(jì)算機(jī)時(shí)的統(tǒng)計(jì)方法,我們?cè)谥暗奈恼轮幸延谐浞株U述[7],本文重點(diǎn)闡述的 GPU 計(jì)算機(jī)時(shí)的統(tǒng)計(jì),主要解決兩方面的問(wèn)題:一是獲得作業(yè)占用的GPU卡的數(shù)量;二是機(jī)時(shí)統(tǒng)計(jì)程序的并行化。這里需要特別提醒的是,不宜大范圍使用CPU time作為作業(yè)CPU機(jī)時(shí)的統(tǒng)計(jì),因?yàn)镃PU time忽略了I/O和系統(tǒng)開銷等對(duì)計(jì)算資源的實(shí)際占用時(shí)間;在過(guò)去一些不支持CGROUP的舊版操作系統(tǒng)和舊版LSF,有些多線程程序在實(shí)際運(yùn)行時(shí)會(huì)占用節(jié)點(diǎn)內(nèi)比申請(qǐng)數(shù)更多的CPU核資源,這時(shí)CPU time會(huì)高于wall time與所用CPU核數(shù)的乘積,出現(xiàn)這種情況時(shí)使用CPU time是對(duì)機(jī)時(shí)損失的一種補(bǔ)償。隨著虛擬化技術(shù)的不斷進(jìn)步,新的Linux操作系統(tǒng)內(nèi)核已支持CGROUP資源隔離,新版LSF也加入了相應(yīng)支持,計(jì)算節(jié)點(diǎn)和LSF同時(shí)啟用CGROUP功能,則可以規(guī)避上述問(wèn)題。

2 軟件設(shè)計(jì)

由于IBM Spectrum LSF 10.1的計(jì)算機(jī)時(shí)統(tǒng)計(jì)程序bacct本身并不包含對(duì)作業(yè)wall time和GPU機(jī)時(shí)的統(tǒng)計(jì),因此我們必須通過(guò)編程手段來(lái)實(shí)現(xiàn)相關(guān)統(tǒng)計(jì)。Spectrum LSF提供了應(yīng)用程序接口API,方便我們靈活地通過(guò)編程實(shí)現(xiàn)一些個(gè)性化的需求。本文中介紹的GPU計(jì)算機(jī)時(shí)統(tǒng)計(jì)軟件主要由一個(gè)C語(yǔ)言程序和一個(gè)Shell腳本程序構(gòu)成,軟件框架圖見圖1。

C語(yǔ)言程序負(fù)責(zé)調(diào)用LSF API庫(kù)函數(shù)進(jìn)行作業(yè)wall time統(tǒng)計(jì)和作業(yè)使用的gpu卡數(shù)量的統(tǒng)計(jì),是整個(gè)軟件的核心部分;MPI相關(guān)語(yǔ)句實(shí)現(xiàn)核心計(jì)算部分的并行化;腳本語(yǔ)言則在調(diào)用C語(yǔ)言程序的基礎(chǔ)上分析出各個(gè)用戶在不同隊(duì)列不同時(shí)間段的計(jì)算資源使用量。

2.1 LSF API

Spectrum LSF API主要包含兩種類型的庫(kù):一種是LSLIB,這是LSF的基礎(chǔ)庫(kù),為外部應(yīng)用使用LSF的基礎(chǔ)服務(wù)提供支持;另一種是LSBLIB,LSF的批處理庫(kù),為外部應(yīng)用提供作業(yè)查詢、提交、控制、操作等的批量處理服務(wù)接口,也可實(shí)現(xiàn)對(duì)批量日志文件的讀取與分析。本文中介紹的程序主要涉及LSBLIB庫(kù)中的兩個(gè)數(shù)據(jù)結(jié)構(gòu)eventRec、jobFinishLog和一個(gè)函數(shù)lsb_geteventrec()。lsb_geteventrec()函數(shù)需要讀取LSF的lsb.events或lsb.acct文件,這些文件記錄了與用戶作業(yè)有關(guān)的關(guān)鍵信息。在使用LSF API的LSBLIB庫(kù)函數(shù)前,需要調(diào)用lsb_init()函數(shù)進(jìn)行LSBLIB的初始化。

2.2 C語(yǔ)言編程

此部分主要是利用lsb_geteventrec()函數(shù)來(lái)實(shí)現(xiàn)對(duì)作業(yè)從開始到結(jié)束的所用時(shí)間進(jìn)行統(tǒng)計(jì),程序設(shè)計(jì)時(shí)涉及到多個(gè)C語(yǔ)言頭文件,包括:stdio.h、stdlib.h、string.h、time.h;另外還包括兩個(gè)LSF軟件所提供的頭文件:lsf.h和lsbatch.h。

2.2.1 時(shí)間格式轉(zhuǎn)換

由于該程序操作的主要對(duì)象就是時(shí)間,然而LSF的bacct程序?qū)r(shí)間有一定的格式要求,為了程序設(shè)計(jì)的統(tǒng)一,我們將此C程序所需讀入的時(shí)間參數(shù)格式確定為“年/月/日/小時(shí):分鐘:秒”,如“2020/7/10/0:0:0”。另外,由于歷史原因,計(jì)算機(jī)的計(jì)時(shí)系統(tǒng)存在一個(gè)千年問(wèn)題,因此也需要在時(shí)間格式轉(zhuǎn)換時(shí)加以考慮。時(shí)間格式轉(zhuǎn)換的具體實(shí)現(xiàn)方法可以參考我們之前的相關(guān)工作[7]。

2.2.2 獲取作業(yè)wall time

該部分需要實(shí)現(xiàn)對(duì)某段時(shí)間范圍內(nèi)某用戶在某個(gè)隊(duì)列或某些隊(duì)列中的作業(yè)使用的wall time、CPU核數(shù)和GPU卡數(shù)進(jìn)行統(tǒng)計(jì)。Wall time可以通過(guò)作業(yè)結(jié)束時(shí)間減去作業(yè)開始時(shí)間獲得,作業(yè)所用的CPU核數(shù)也可以通過(guò)finishJob->numExHosts獲得,但是LSBLIB的jobFinishLog函數(shù)中并未直接提供作業(yè)所用GPU卡數(shù)量的相關(guān)變量,這就給我們提取GPU卡數(shù)量帶來(lái)了困難。不過(guò),jobFinishLog函數(shù)提供了gRusage結(jié)構(gòu)化數(shù)據(jù),在該結(jié)構(gòu)化數(shù)據(jù)中包含了GPU_ALLOC、GPU Models、GPU Factors等信息,這些信息經(jīng)過(guò)處理,可以分析出實(shí)際使用的GPU卡數(shù)量。以GPU Models為例,在gRusage的結(jié)構(gòu)化數(shù)據(jù)中,通過(guò)提取JOB_GPU_ALLOC鍵值對(duì),可以獲得類似GPU_MODELS="TeslaK40c-11441{0[0,1]1[0,1]}"這樣的信息,該信息明確了作業(yè)使用了哪些GPU計(jì)算節(jié)點(diǎn)的哪些GPU卡,而GPU卡的計(jì)數(shù)通過(guò)上述信息則很容易統(tǒng)計(jì)。

程序的關(guān)鍵部分如下(省去了變量聲明、參數(shù)檢查、lsb.events/lsb.acct文件檢查等部分):

/* gpu_s為gRusage中獲取的結(jié)構(gòu)化數(shù)據(jù),gpu_np為

GPU_FACTORS字符串的長(zhǎng)度*/

for (;;) {

record=lsb_geteventrec(fp, &lineNum);

finishJob=&(record->eventLog.jobFinishLog);

if (strcmp(finishJob->userName, userName)==0 &&

strcmp(finishJob->queue, queue)==0) {

np2=finishJob->numExHosts;

if (finishJob->endTime>startt && finishJob->

endTime<=endt) {

walltime=walltime+(finishJob->endTime-

finishJob->startTime)*np2;

if(gpu_s) {

strncpy(gpufactors, gpu_s, gpu_np);

strtok(gpufactors, delim3);

while((numchar=strtok(NULL, delim3))) {

ngpus++; }

gpuwalltime=gpuwalltime+(st2-st1)*ngpus; }

cput=cput+finishJob->cpuTime; }}

else {

continue;}}

2.3 代碼的并行化

基于上一節(jié)的內(nèi)容,我們獲得了某用戶在某段時(shí)間內(nèi)某個(gè)隊(duì)列的計(jì)算資源占用時(shí)間;然而,隨著集群規(guī)模的不斷增大、集群用戶數(shù)的增多和完成作業(yè)數(shù)的急速增長(zhǎng),如果沿用串行的編程方法進(jìn)行一次完整的計(jì)算機(jī)時(shí)統(tǒng)計(jì)就相當(dāng)費(fèi)時(shí)。因此,對(duì)串行代碼的并行化變得非常必要。為了實(shí)現(xiàn)并行化,我們需要在某個(gè)或某些維度,對(duì)串行程序進(jìn)行切分,比如用戶維度、作業(yè)隊(duì)列維度等;但是,由于不同用戶在不同隊(duì)列的計(jì)算作業(yè)數(shù)是個(gè)動(dòng)態(tài)變化的量,因此,通過(guò)用戶維度或隊(duì)列維度并不能有效地使計(jì)算量均衡分布于各個(gè)計(jì)算節(jié)點(diǎn)。另外,通過(guò)進(jìn)一步研究LSF API處理事件日志的工作機(jī)制發(fā)現(xiàn),其并未提供批量的事件文件和記賬文件的讀取方法,但LSF基礎(chǔ)配置中可以對(duì)事件文件和記賬文件按文件大小或記錄時(shí)間進(jìn)行存檔。在我們的并行化方案中,選擇按文件大小來(lái)進(jìn)行事件文件和記賬文件的存檔,然后通過(guò)不同計(jì)算節(jié)點(diǎn)計(jì)算不同存檔文件,實(shí)現(xiàn)程序的并行化。除了最新的未存檔文件,每個(gè)存檔文件的大小相同,在存檔文件足夠多的情況下,這也將使計(jì)算負(fù)載可以較為均衡地分布于各個(gè)計(jì)算節(jié)點(diǎn)。

奉节县| 玛多县| 微博| 额尔古纳市| 冕宁县| 阜宁县| 庄河市| 当雄县| 土默特右旗| 卢氏县| 大竹县| 南涧| 德兴市| 驻马店市| 从江县| 华亭县| 姜堰市| 即墨市| 宝丰县| 安溪县| 淳安县| 泰来县| 姜堰市| 墨江| 万源市| 方城县| 龙岩市| 印江| 大埔县| 太原市| 梓潼县| 德化县| 南宫市| 芜湖县| 乐业县| 米脂县| 山阴县| 朔州市| 孙吴县| 汪清县| 博野县|