胡亞輝,朱宗衛(wèi),劉黃河,王 超
1(中國科學(xué)技術(shù)大學(xué) 計算機(jī)科學(xué)與技術(shù)學(xué)院,合肥 230027)
2(中國科學(xué)技術(shù)大學(xué) 軟件學(xué)院,蘇州 215123)
深度學(xué)習(xí)作為機(jī)器學(xué)習(xí)的一個分支,近年來取得了飛躍式的發(fā)展,在眾多領(lǐng)域如計算機(jī)視覺、語音識別等都取得了令人矚目的成果.以AlexNet 將ImageNet數(shù)據(jù)集上的圖像識別top-5 準(zhǔn)確率由73.8% 提高至84.7%為標(biāo)志,深度學(xué)習(xí)中所使用的神經(jīng)網(wǎng)絡(luò)模型開始朝著更深、更復(fù)雜的方向發(fā)展,隨后又出現(xiàn)了VGG和ResNet 等更加復(fù)雜的網(wǎng)絡(luò)模型[1].然而,伴隨著使用更加復(fù)雜的網(wǎng)絡(luò)來實現(xiàn)準(zhǔn)確率的提高,傳統(tǒng)的CPU 已經(jīng)遠(yuǎn)遠(yuǎn)滿足不了其性能需求,因此,以GPU 為代表的具有高度數(shù)據(jù)并行性的計算設(shè)備逐漸被用于深度學(xué)習(xí)計算的加速.除GPU 以外,還有眾多基于FPGA[2-5]或基于ASIC[6,7]的深度學(xué)習(xí)加速器.這些工作都大大提升了單節(jié)點上深度學(xué)習(xí)推理計算的性能,然而在面臨海量數(shù)據(jù)處理的應(yīng)用場景,單個節(jié)點的性能仍顯不足.一直以來分布式系統(tǒng)都是提供計算力的重要途徑,因此也被用作深度學(xué)習(xí)推理的加速平臺,并與深度學(xué)習(xí)加速器相結(jié)合使用.例如,谷歌早在2015年就部署了TPU集群專用于加速神經(jīng)網(wǎng)絡(luò)的推理過程[8].然而,構(gòu)建分布式深度學(xué)習(xí)推理系統(tǒng)依然面臨著如下挑戰(zhàn).第一,以GPU 為代表的深度學(xué)習(xí)加速器如今正處于快速發(fā)展階段,不斷涌現(xiàn)的新型硬件使得系統(tǒng)必須具有高度靈活的硬件兼容性以適應(yīng)其快速的更新迭代;第二,任務(wù)調(diào)度對系統(tǒng)整體性能影響顯著,而不同深度學(xué)習(xí)應(yīng)用之間所呈現(xiàn)的計算和訪存特征差別巨大,因此系統(tǒng)必須具有靈活調(diào)整任務(wù)調(diào)度策略的能力.為應(yīng)對分布式系統(tǒng)軟硬件環(huán)境的動態(tài)性以及各類深度學(xué)習(xí)應(yīng)用特點的多樣性,本文設(shè)計并實現(xiàn)了可擴(kuò)展的系統(tǒng)信息管理框架,支持對系統(tǒng)信息收集策略和處理策略的定制化,一方面提高系統(tǒng)對各類深度學(xué)習(xí)加速器的兼容性,另一方面使得分布式深度學(xué)習(xí)推理系統(tǒng)具有根據(jù)軟硬件環(huán)境以及實際應(yīng)用的特點動態(tài)調(diào)整調(diào)度策略的能力.
分布式系統(tǒng)中任務(wù)調(diào)度起著至關(guān)重要的作用,選擇合適的調(diào)度算法有利于提高系統(tǒng)整體的資源利用率和吞吐率,從而提升系統(tǒng)性能.因其重要性,分布式系統(tǒng)調(diào)度算法一直是分布式系統(tǒng)研究領(lǐng)域的一個熱點問題.隨著異構(gòu)計算平臺的產(chǎn)生和發(fā)展,集群中硬件資源越來越豐富多樣,各類芯片對于不同類型的計算在性能、功耗上表現(xiàn)各不相同,尤其是對于深度學(xué)習(xí)類應(yīng)用,不同計算部件的處理能力相差巨大,因此在面向大規(guī)模數(shù)據(jù)集的深度學(xué)習(xí)推理的場景下,考慮針對具體的應(yīng)用特點進(jìn)行任務(wù)負(fù)載劃分以及任務(wù)調(diào)度策略的設(shè)計是非常有必要的.此外,從用于加速深度學(xué)習(xí)推理的硬件的發(fā)展角度來看,此次人工智能熱潮中,涌現(xiàn)了大批的深度學(xué)習(xí)加速硬件及平臺,其中有代表性的有谷歌的TPU、寒武紀(jì)公司的智能芯片系列、微軟公司的基于FPGA 的深度學(xué)習(xí)加速平臺BrainWave[9]等.深度學(xué)習(xí)加速硬件的快速迭代迫使分布式系統(tǒng)應(yīng)該對于新型計算資源具有更好的兼容性,然而現(xiàn)今的分布式計算系統(tǒng)中一般對這些新型資源的支持都不夠友好,如Hadoop 的資源管理器Yarn 在默認(rèn)情況下僅支持對CPU、內(nèi)存、硬盤等資源的管理[10].為了適應(yīng)硬件的快速迭代,用于深度學(xué)習(xí)的分布式推理系統(tǒng)應(yīng)該支持對資源種類的易擴(kuò)展性,并且在任務(wù)調(diào)度時應(yīng)根據(jù)系統(tǒng)資源以及作業(yè)特點的變化動態(tài)調(diào)整任務(wù)調(diào)度策略.
近年來,每年有上百篇與分布式系統(tǒng)下的任務(wù)調(diào)度問題相關(guān)的論文發(fā)表,然而據(jù)統(tǒng)計,2005年至2015年期間發(fā)表的1050 篇論文中,22%從未被引用過,在所有引用中,超過60%僅來自其中12%的文章[11].這足以說明目前大部分的研究成果屬于一次性工作.并且如此大量的研究成果的發(fā)表也增加了后來研究者的困難,為此,目前有大量的關(guān)于分布式系統(tǒng)任務(wù)調(diào)度問題的綜述性文章,對該領(lǐng)域的研究脈絡(luò)進(jìn)行梳理,以期為研究人員提供理論基礎(chǔ).Lopes 等人中從工作負(fù)載、資源、調(diào)度需求三個維度出發(fā),并進(jìn)一步對每個維度進(jìn)行細(xì)分,對分布式系統(tǒng)中的調(diào)度問題和解決方案進(jìn)行分類以及形式化描述[11],來幫助研究人員方便地對之前的研究成果加以利用.Gautam 等人針對Hadoop 集群中的任務(wù)調(diào)度常見算法(FIFO、Fari、Capacity、Delay 等)從多個方面進(jìn)行了歸類總結(jié),包括是否支持任務(wù)優(yōu)先級、資源共享是否公平、適用環(huán)境為同構(gòu)還是異構(gòu)、任務(wù)分配策略為動態(tài)還是靜態(tài)等,分析各算法的優(yōu)勢和劣勢[12].
諸如此類的綜述性文章為以后的研究工作提供了一定的理論基礎(chǔ),但是對于最大規(guī)模的重復(fù)利用已有成果,仍遠(yuǎn)遠(yuǎn)不夠.究其原因,系統(tǒng)規(guī)模擴(kuò)大、軟硬件資源復(fù)雜、應(yīng)用負(fù)載多樣性等因素都為分布式系統(tǒng)下的任務(wù)調(diào)度帶來了更大的挑戰(zhàn),設(shè)計合理的調(diào)度算法必須將大量的因素考慮在內(nèi).然而,考慮大量因素所帶來的大量重復(fù)的細(xì)節(jié)工作使得調(diào)度算法的設(shè)計難以進(jìn)行,目前大多數(shù)算法都是針對少量具體的影響因素進(jìn)行設(shè)計或優(yōu)化.例如,Hammoud 等人考慮了數(shù)據(jù)局部性以及網(wǎng)絡(luò)傳輸對任務(wù)的影響,對MapReduce 框架中的Reduce 任務(wù)調(diào)度進(jìn)行優(yōu)化,將任務(wù)放置在更靠近數(shù)據(jù)所在節(jié)點進(jìn)行處理[13].Arslan 等人綜合考慮了文件訪問代價以及CPU 負(fù)載等因素,做為MapReduce 框架中Reduce任務(wù)調(diào)度優(yōu)化的依據(jù)[14].這類工作由于出發(fā)點本身的局限性,在設(shè)計時僅考慮具體的某一個或兩個因素,因而難以適應(yīng)集群軟硬件環(huán)境以及工作負(fù)載的變化.
對現(xiàn)有的分布式系統(tǒng)下任務(wù)調(diào)度的相關(guān)工作進(jìn)行總結(jié)可以發(fā)現(xiàn),目前有大量工作都是面向特定場景對調(diào)度算法進(jìn)行優(yōu)化;另外有大量綜述性的工作,對調(diào)度問題進(jìn)行抽象及形式化表述,以更好地為研究人員提供理論上的依據(jù);但尚缺乏從如何簡化調(diào)度器設(shè)計的角度出發(fā)的工作,考慮將大量與算法核心設(shè)計無關(guān)的系統(tǒng)信息收集與處理的工作獨立出來,以提升分布式系統(tǒng)中調(diào)度算法研究工作的效率和質(zhì)量.
分布式系統(tǒng)中任務(wù)調(diào)度可以看作是在滿足某些約束條件的前提下,將一個作業(yè)分解成為若干任務(wù),并將這些分解后的任務(wù)分配給一組處理單元進(jìn)行處理的過程,處理單元一般對應(yīng)于一個能夠完成任務(wù)處理的資源組合,例如CPU、內(nèi)存和網(wǎng)卡的組合,一個物理機(jī)、虛擬機(jī)、容器都可以看作是一個處理單元.而調(diào)度策略則決定了如何劃分作業(yè)以及各個劃分后的任務(wù)在哪個處理單元于何時開始處理,因此,任務(wù)調(diào)度策略是整個調(diào)度器的最關(guān)鍵部分.在實際設(shè)計中,調(diào)度器通常會對多種信息進(jìn)行綜合分析,包括系統(tǒng)中的軟硬件資源、作業(yè)執(zhí)行需要滿足的指標(biāo)、任務(wù)執(zhí)行的歷史信息等,最終得到一個合理的調(diào)度策略.分析的方法可以是某種啟發(fā)式算法,如蟻群算法、遺傳算法,也可以是神經(jīng)網(wǎng)絡(luò)等機(jī)器學(xué)習(xí)類算法.上述過程如圖1所示,為了實現(xiàn)調(diào)度器的可用性和高效性,需要解決兩方面的挑戰(zhàn).
圖1 分布式系統(tǒng)任務(wù)調(diào)度主要過程示意圖
(1)生產(chǎn)信息的數(shù)據(jù)源以及信息本身的表示形式均豐富多樣且容易隨時間發(fā)生變化,例如,在集群的使用過程中,隨著機(jī)器的更新迭代,系統(tǒng)中會加入各種各樣的新型硬件或者不同類型的操作系統(tǒng)及基于此的各種軟件系統(tǒng),調(diào)度器必須有獲取并處理這些信息的能力.即使這些信息的收集及處理在調(diào)度算法設(shè)計中并非核心問題,但對調(diào)度器的實現(xiàn)以及實際的調(diào)度效果有重要的影響,是否具有對某種信息的獲取能力,以及獲取和處理的方法是否高效可靠,則直接決定了所設(shè)計的調(diào)度算法是否具有可行性.
(2)采用啟發(fā)式或者機(jī)器學(xué)習(xí)算法對大量系統(tǒng)信息進(jìn)行分析以尋求合理調(diào)度策略的過程具有極高的計算復(fù)雜度,并且實現(xiàn)難度較高,不僅使得此類算法在實際系統(tǒng)中的實現(xiàn)或者或者移植變得困難,且可能成為系統(tǒng)性能的瓶頸,這大大限制了各種復(fù)雜分析算法在調(diào)度器中的使用,如何保證這部分計算邏輯的正確性以及健壯性值得深入探究.
本文所描述的系統(tǒng)信息管理框架的核心設(shè)計思想是將系統(tǒng)信息收集與處理這兩部功能的實現(xiàn)獨立于調(diào)度器,調(diào)度器只需通過RESTful API 接口進(jìn)行數(shù)據(jù)訪問以獲取所需信息,信息的收集和分析處理分別由信息收集器和信息處理器負(fù)責(zé),信息收集器以及信息處理器均可獨立優(yōu)化且具有功能可擴(kuò)展性,從而保證系統(tǒng)可用性和高效性.如圖2所示,收集器負(fù)責(zé)采集各種數(shù)據(jù)源生產(chǎn)的信息,具體的數(shù)據(jù)源可以是操作系統(tǒng)、硬件設(shè)備、應(yīng)用軟件、日志文件或分布式系統(tǒng)軟件等等,對于不同數(shù)據(jù)源,收集器可以根據(jù)數(shù)據(jù)源以及數(shù)據(jù)表示形式的不同進(jìn)行設(shè)計和擴(kuò)充,以實現(xiàn)對不同類型信息的支持.
圖2 系統(tǒng)信息管理框架功能框圖
信息處理器則是對收集的基礎(chǔ)數(shù)據(jù)做進(jìn)一步加工處理,得到更具使用價值的信息.例如,將各節(jié)點CPU負(fù)載和節(jié)點間文件訪問代價作為MapReduce 框架中renduce 任務(wù)調(diào)度的依據(jù),則可以使用信息收集器從操作系統(tǒng)獲取各節(jié)點的網(wǎng)絡(luò)帶寬以及硬盤性能等相關(guān)信息,從MapReduce 框架中獲取數(shù)據(jù)塊的分布信息,信息處理器使用這些信息計算出節(jié)點間數(shù)據(jù)訪問的代價并通過數(shù)據(jù)管理服務(wù)提供的數(shù)據(jù)寫入接口保存數(shù)據(jù),調(diào)度器僅需通過數(shù)據(jù)讀取接口獲取數(shù)據(jù),并依此完成任務(wù)調(diào)度,使得大量復(fù)雜的信息獲取和處理邏輯對調(diào)度器透明化.
系統(tǒng)信息管理框架的核心服務(wù)模塊包括3 個,分別為:
(1)注冊服務(wù),負(fù)責(zé)完成信息收集器以及信息處理器的注冊.
(2)管理服務(wù),負(fù)責(zé)管理各信息收集器和信息處理器,包括啟動、停止、副本控制等.
(3)數(shù)據(jù)服務(wù),負(fù)責(zé)完成數(shù)據(jù)的存儲和讀寫,收集器和信息處理器產(chǎn)生數(shù)據(jù)之后通過數(shù)據(jù)服務(wù)中的寫入接口將數(shù)據(jù)寫入存儲系統(tǒng),信息處理器和調(diào)度器在需要使用數(shù)據(jù)時則通過數(shù)據(jù)服務(wù)的數(shù)據(jù)讀取接口獲取數(shù)據(jù).
接下來分別對這三者的設(shè)計與實現(xiàn)進(jìn)行詳細(xì)說明.
注冊服務(wù)的核心功能是維護(hù)框架中所有的信息收集器與信息處理器的注冊信息.信息收集齊與處理器本質(zhì)上都是采用特定方法獲取所需的數(shù)據(jù)并生產(chǎn)供系統(tǒng)中其他模塊所用的的數(shù)據(jù),可獨立實現(xiàn)及優(yōu)化,具體實現(xiàn)可以是任意完成數(shù)據(jù)采集或處理功能的可執(zhí)行文件.例如,一個信息收集器的功能是收集節(jié)點的內(nèi)存使用情況,則其實現(xiàn)方式之一是使用shell 腳本讀取proc 文件系統(tǒng)中的數(shù)據(jù)來獲取相關(guān)信息.信息處理器與此類似,不同的是其數(shù)據(jù)輸入通常為某信息收集器或另一信息處理器的輸出,這些數(shù)據(jù)由數(shù)據(jù)服務(wù)維護(hù)并提供訪問接口.數(shù)據(jù)來源體現(xiàn)在具體數(shù)據(jù)處理器或收集器的程序設(shè)計中,可以通過操作系統(tǒng)的接口、系統(tǒng)健康監(jiān)測程序的輸出文件或數(shù)據(jù)數(shù)據(jù)服務(wù)提供的數(shù)據(jù)訪問接口等方式獲取數(shù)據(jù).
注冊服務(wù)的功能如圖3所示,設(shè)計者通過命令行客戶端或者在程序中使用注冊接口向框架內(nèi)添加一個收集器或處理器,注冊信息需包含數(shù)據(jù)對象,以及獲取該數(shù)據(jù)的信息處理器或者信息收集器的信息,可以是某一個可執(zhí)行文件的路徑.注冊服務(wù)接收并處理注冊信息,并存入存儲系統(tǒng).注冊完成后,任何程序可以通過注冊服務(wù)提供的數(shù)據(jù)查詢接口來獲取當(dāng)前系統(tǒng)中已注冊的數(shù)據(jù)及其獲取方式.當(dāng)某類數(shù)據(jù)的信息處理器或者信息收集器的設(shè)計者對其邏輯進(jìn)行更改后,通過更新接口對注冊信息進(jìn)行更新.
信息收集器與處理器管理服務(wù)的功能是控制收集器與處理器的具體實力在各個節(jié)點的啟動與停止,決定了具體的收集器或者處理器的工作模式,包括何時啟動、何時停止以及收集或處理數(shù)據(jù)的時間間隔等,這些信息在注冊時已經(jīng)指定.
運(yùn)行管理服務(wù)的實現(xiàn)架構(gòu)如圖4所示,管理服務(wù)采用的是Master-Slave 架構(gòu),Master 端程序負(fù)責(zé)通知運(yùn)行與各個節(jié)點之上的Slave 端程序進(jìn)行運(yùn)行實例的啟動或停止,二者之間通過RESTful API 進(jìn)行通信.Slave 端程序在接收到Master 端程序所發(fā)送的信息收集器/處理器的啟動命令后,對啟動命令進(jìn)行解析,獲取該收集器/處理器所負(fù)責(zé)生產(chǎn)的數(shù)據(jù)的標(biāo)識以及執(zhí)行運(yùn)行實例的命令.之后,為運(yùn)行實例分配運(yùn)行槽,運(yùn)行槽負(fù)責(zé)啟動具體的運(yùn)行實例并與其進(jìn)行交互,運(yùn)行實例從數(shù)據(jù)源獲取數(shù)據(jù),最后運(yùn)行槽對所獲取的數(shù)據(jù)進(jìn)行包裝并通過數(shù)據(jù)服務(wù)提供的數(shù)據(jù)寫入接口對獲取的數(shù)據(jù)進(jìn)行保存.
注冊服務(wù)的核心功能在于維護(hù)了數(shù)據(jù)在節(jié)點上的獲取方式,在不同的節(jié)點上可能存在多個副本而產(chǎn)生多個具體數(shù)據(jù),對這些具體數(shù)據(jù)必須進(jìn)行有效的組織與管理,并提供相應(yīng)的讀寫接口,此即數(shù)據(jù)管理服務(wù)的功能.如圖5所示,數(shù)據(jù)服務(wù)負(fù)責(zé)存儲具體的數(shù)據(jù),提供數(shù)據(jù)的讀寫、更新等接口,數(shù)據(jù)的使用者直接通過數(shù)據(jù)讀取接口獲取數(shù)據(jù),數(shù)據(jù)的使用者包括數(shù)據(jù)處理器和任務(wù)調(diào)度器等.數(shù)據(jù)的生產(chǎn)者通過寫入接口寫入數(shù)據(jù),數(shù)據(jù)服務(wù)接收到寫入請求后,對請求進(jìn)行解析后將獲取的信息寫入存儲系統(tǒng).
圖3 注冊服務(wù)功能示意圖
圖4 運(yùn)行管理服務(wù)功能示意圖
系統(tǒng)信息管理框架的核心功能及設(shè)計目標(biāo)之一是支持調(diào)度器靈活高效的獲取所需數(shù)據(jù)以靈活調(diào)整其調(diào)度策略.而數(shù)據(jù)服務(wù)能否提供高效的數(shù)據(jù)訪問機(jī)制則決定了整個系統(tǒng)信息管理框架的可用性.在設(shè)計中我們采用了異步的數(shù)據(jù)訪問機(jī)制來保證數(shù)據(jù)訪問的高效性.所謂異步的數(shù)據(jù)訪問機(jī)制,是指將數(shù)據(jù)的收集與處理和數(shù)據(jù)獲取異步進(jìn)行.通常情況下,當(dāng)任務(wù)調(diào)度器需要某些數(shù)據(jù)時,會通過一定方式臨時性地從系統(tǒng)中獲取基礎(chǔ)信息,再通過一系列的處理最終獲取所需的數(shù)據(jù).這樣做的好處是可以保證數(shù)據(jù)的準(zhǔn)確性和有效性較高,然而伴隨著的是較長的數(shù)據(jù)獲取時間,尤其是在所需的信息量非常大的情況下,并且在分布式系統(tǒng)的環(huán)境中,還需要面臨各種不確定性.設(shè)計所采用的異步數(shù)據(jù)訪問機(jī)制中,各運(yùn)行槽的數(shù)據(jù)寫入過程和調(diào)度器的數(shù)據(jù)訪問過程完全分離.這雖然犧牲了一定的數(shù)據(jù)準(zhǔn)確性,但提升了調(diào)度器數(shù)據(jù)訪問的效率和穩(wěn)定性.
在構(gòu)建原型系統(tǒng)的過程中,主要使用了SpringBoot框架.Spring 框架是一個開源的用于企業(yè)級應(yīng)用開發(fā)的編程框架,SpringBoot 是由Pivotal 團(tuán)隊開發(fā)的用于簡化Spring 應(yīng)用的初始搭建以及開發(fā)過程.依賴于SpringBoot 我們可以較快地實現(xiàn)各個服務(wù)模塊的功能并對外提供RESTful API 接口,接口設(shè)計如表1所示.本次原型系統(tǒng)的設(shè)計中,數(shù)據(jù)存儲通過輕量級的關(guān)系型數(shù)據(jù)庫mysql 實現(xiàn),具體的,包含表t_Data、t_DP.表t_Data 用于存儲數(shù)據(jù),包含id、data_name、data_value和node_name 等列,其中data_name 為數(shù)據(jù)名稱,data_value 為數(shù)據(jù)的值,node_name 為產(chǎn)生該條數(shù)據(jù)的節(jié)點名稱,id 為data_name 與node_name 的組合作為主鍵;表t_DP 用于存儲注冊信息,包含data_name、cmd 和time_max 等列,data_name 為所注冊的信息收集器/處理器所生產(chǎn)的數(shù)據(jù)名稱,cmd 為執(zhí)行該信息收集器/處理器實例的命令,time_max 為兩次運(yùn)行之間的時間間隔.
圖5 數(shù)據(jù)管理服務(wù)功能示意圖
表1 API 接口設(shè)計
本節(jié)將通過一個具體實例介紹如何通過系統(tǒng)信息管理框架來輔助調(diào)度器完成更合理的調(diào)度.分兩個主要步驟:(1)系統(tǒng)信息收集的可執(zhí)行程序設(shè)計完成后,通過注冊模塊提供的注冊接口進(jìn)行注冊并生成數(shù)據(jù)訪問接口.(2)通過設(shè)計不同的信息處理邏輯來對所獲取的數(shù)據(jù)進(jìn)行加工,并生成相應(yīng)數(shù)據(jù)訪問接口.
為了說明本文所描述的系統(tǒng)信息管理框架對任務(wù)調(diào)度器的支持,本次實驗中,針對分布式系統(tǒng)中使用深度神經(jīng)網(wǎng)絡(luò)模型對含量圖片進(jìn)行分類處理的應(yīng)用場景,設(shè)計并實現(xiàn)了一個任務(wù)調(diào)度器,其主要功能是對作業(yè)負(fù)載進(jìn)行靜態(tài)劃分,即將待處理的數(shù)據(jù)集劃分為多個子集,指定各個節(jié)點所需處理的數(shù)據(jù)子集.實驗中選取的實際任務(wù)為,在具有1 個主節(jié)點和4 個工作節(jié)點的集群中使用基于AlexNet 的物體分類程序?qū)Υ笈繄D片進(jìn)行分類處理,數(shù)據(jù)集為從ImageNet 中選取的包含400 張圖片的子集.主節(jié)點及各個工作節(jié)點的配置為,英特爾至強(qiáng)W1505 型CPU,主頻2.53 GHz,4 GB 內(nèi)存,各個節(jié)點配有千兆網(wǎng)卡,節(jié)點之間通過萬兆交換機(jī)互連.圖片存儲于分布式存儲系統(tǒng)HDFS 中.
調(diào)度器采用的負(fù)載劃分算法的主要步驟為:
算法1.調(diào)度器負(fù)載劃分算法輸入:數(shù)據(jù)集合D,節(jié)點集合N (Node1,…,Noden).輸出:D 的一個劃分{D1,…,Dn},Di 為節(jié)點Nodei 負(fù)責(zé)處理的數(shù)據(jù)子集,D=D1∪D2∪…∪Dn.1.得出數(shù)據(jù)在節(jié)點上的存儲分布作為初始劃分{D1,…,Dn};2.獲取各個節(jié)點當(dāng)前負(fù)載量{L1,…,Ln};3.獲取每個節(jié)點的處理能力{C1,…,Cn};4.按節(jié)點i 的處理能得出節(jié)點i 的目標(biāo)負(fù)載量Loi= Cin∑ ×n∑j=1 Lj k=1 Ck 5.將N 劃分為3 個子集H={Ni|Loi <Li},E={Ni|Loi=Li},L={Ni|Loi >Li}6.若H=?||L=?,則算法結(jié)束,{D1,…,Dn}為劃分結(jié)果,否則進(jìn)入步驟7;7.從H 中選取一個節(jié)點Nh,從L 中選取一個節(jié)點N1 8.分別計算Nh 與Nl 載的差值Δh 與Δl,并將Nh 的部分負(fù)載轉(zhuǎn)移至Nl 轉(zhuǎn)移量為min{Δh,Δl};將達(dá)到理想負(fù)載的節(jié)點轉(zhuǎn)移至集合E;跳轉(zhuǎn)至步驟6.
算法核心思想為,步驟1-2 先按照數(shù)據(jù)在節(jié)點上的分布對數(shù)據(jù)做初始劃分,得到節(jié)點初始負(fù)載量,各節(jié)點負(fù)責(zé)所持有的本地數(shù)據(jù)進(jìn)行處理;由于各節(jié)點的數(shù)據(jù)量以及處理能力的不匹配,需要對數(shù)據(jù)進(jìn)行重新劃分.步驟3-4 首先按照節(jié)點的計算能力占總計算能力的比值得出各節(jié)點的理想負(fù)載量,步驟5 按照節(jié)點的處理能力與理想負(fù)載量是否匹配將所有節(jié)點劃分為3 個子集,H集合內(nèi)節(jié)點負(fù)載過高、L集合內(nèi)節(jié)點負(fù)載過低、E集合內(nèi)結(jié)點負(fù)載程度較為理想.步驟6-8 循環(huán)多次,將高負(fù)載節(jié)點的負(fù)載劃分至低負(fù)載節(jié)點,直到各節(jié)點之間達(dá)到負(fù)載均衡.
算法1 的關(guān)鍵之處在于對各個節(jié)點的處理能力以及計算負(fù)載的評估,直接決定了任務(wù)劃分結(jié)果,而節(jié)點處理能力的評估方法應(yīng)是隨著系統(tǒng)的實際情況變化的,例如向系統(tǒng)中添加具有加速器的節(jié)點則會影響性能評估的方式,原先的算法可能會喪失其有效性.而對計算負(fù)載的評估則應(yīng)結(jié)合具體任務(wù)而定.通過系統(tǒng)信息管理框架中的信息收集器以及信息處理器的修改來完成節(jié)點性能評估以及負(fù)載評估,算法步驟2 中僅需通過固定的API 接口獲取評估結(jié)果,從而在避免修改調(diào)度算法的前提下完成調(diào)度策略的動態(tài)調(diào)整.
在不對調(diào)度算法做任何修改的前提下,通過采用不同的信息收集器及信息處理器來實現(xiàn)不同的節(jié)點性能評估方法,以適應(yīng)實際需求.實驗中設(shè)計了3 種評估方法,分別如表2所示.
對應(yīng)于3 種評估方法,需分別實現(xiàn)相應(yīng)的數(shù)據(jù)收集器或者處理器,并向系統(tǒng)完成注冊.在此,我們以CPU 使用率作為評估指標(biāo)為例進(jìn)行說明.
4.2.1 信息收集器實現(xiàn)
信息收集器可以通過任意編程語言或工具進(jìn)行實現(xiàn),這里使用Linux Shell 腳本進(jìn)行實現(xiàn),關(guān)鍵代碼如圖6所示,通過讀取/proc 文件系統(tǒng)的信息獲取CPU 狀態(tài),進(jìn)一步計算并輸出CPU 總體使用率.腳本設(shè)計完成并進(jìn)行功能正確性驗證后,分發(fā)至各個節(jié)點的統(tǒng)一路徑下,這里假設(shè)在/usr/Apps/bin 路徑下,則運(yùn)行該腳本的命令為/usr/Apps/bin/getCpuUsage.sh.用于收集數(shù)據(jù)的腳本部署完畢之后,通過注冊服務(wù)的注冊接口完成注冊.注冊完成后,管理模塊運(yùn)行各個節(jié)點之上的腳本程序,并將獲取的數(shù)據(jù)通過數(shù)據(jù)服務(wù)的寫入接口寫入數(shù)據(jù)表,而其他任意程序則可通過該數(shù)據(jù)的訪問接口獲取數(shù)據(jù).
4.2.2 信息處理器實現(xiàn)
針對使用CPU 負(fù)載為評估指標(biāo)的節(jié)點性能評估方法,我們在本次實驗依據(jù)式(1)對節(jié)點的處理能力進(jìn)行計算.CpuFree為處理器當(dāng)前的總體空閑比率,CpuReq為程序?qū)PU 的需求占CPU 總體性能的比率,得出的性能結(jié)果為相對值,1 為最好.
在具體實現(xiàn)上,流程如圖7所示,首先通過數(shù)據(jù)管理服務(wù)提供的RESTful API 風(fēng)格的數(shù)據(jù)訪問接口獲取當(dāng)前各個節(jié)點的CPU 負(fù)載,再根據(jù)式(1)對節(jié)點的處理性能進(jìn)行評估,最后將評估結(jié)果輸出.
表2 評估方法
圖6 獲取CPU 使用率關(guān)鍵代碼
圖7 根據(jù)CPU 使用率進(jìn)行性能評估主要步驟
需要指出的是,評估方法的改變,對應(yīng)的只是相關(guān)信息收集器與處理器的變化,并不對算法的計算過程造成任何影響,算法實現(xiàn)中僅是通過數(shù)據(jù)訪問的API 直接獲取節(jié)點處理性能.
在采用3 種不同節(jié)點處理能力評估方法的情況下,對作業(yè)負(fù)載進(jìn)行不同的劃分,各個節(jié)點的任務(wù)處理時間完成時間如圖8所示.可以看出,在不修改調(diào)度算法的前提下,通過改進(jìn)節(jié)點性能評估方法而使得負(fù)載均衡的程度發(fā)生了改變.在本次實驗中,各個節(jié)點的處理器配置相同,但集群中運(yùn)行的其他各類應(yīng)用導(dǎo)致了各個節(jié)點的負(fù)載情況不同,因此如圖8(a)所示,在采用按照處理器配置也即在各個節(jié)點間平均分配負(fù)載時,效果并不理想.
如圖8(b)所示是按照CPU 負(fù)載來評估節(jié)點性能,這種方法依賴于具體采用的計算公式,需要合理分析應(yīng)用對處理器的需求,例如應(yīng)用中是否針對多處理器進(jìn)行了優(yōu)化,是否是計算密集型等.通常采用這種方法,需要綜合考慮應(yīng)用對處理器、內(nèi)存、IO 的敏感程度而得出一個合理的性能評估公式.在這次實驗中,我們的目的并不是為了尋求一個非常合理的公式,而是為了說明通過我們提出的框架可以方便地對評估邏輯進(jìn)行修改,從而使得設(shè)計、開發(fā)和驗證的效率更高.
從如圖8(b)所示的實驗結(jié)果來看,該評估方法采用式(1)進(jìn)行節(jié)點性能評估的效果并不理想,但如前所述,可通過重新設(shè)計該處理器的評估邏輯進(jìn)行優(yōu)化,或啟用另一個數(shù)據(jù)處理器,直接從各個節(jié)點的歷史運(yùn)行信息中獲取節(jié)點在運(yùn)行該程序時的處理速度來評估節(jié)點性能,這種方法的運(yùn)行結(jié)果如圖8(c)所示,其較好的效果得益于在本次實驗中,即使各個節(jié)點之間的運(yùn)行性能差異較大,但節(jié)點各自的運(yùn)行狀態(tài)均比較穩(wěn)定,因此程序歷史運(yùn)行信息對下一次運(yùn)行的處理速率有較高的指導(dǎo)意義.這種方法在運(yùn)行應(yīng)用環(huán)境發(fā)生變化時很可能會變得不再適用,這種情況下我們?nèi)耘f可以通過調(diào)整信息處理器的邏輯來適應(yīng)新的變化.
本文介紹了面向分布式深度學(xué)習(xí)推理系統(tǒng)優(yōu)化而設(shè)計的系統(tǒng)信息管理子系統(tǒng),該子系統(tǒng)的設(shè)計目的是為了將任務(wù)調(diào)度時需要的各類系統(tǒng)信息的收集工作從調(diào)度器設(shè)計中獨立出來,一方面是為了簡化任務(wù)調(diào)度器的設(shè)計復(fù)雜性,另一方面是為了提高調(diào)度器的靈活性.當(dāng)前的主流分布式系統(tǒng)能夠提供的系統(tǒng)信息有限,留給任務(wù)調(diào)度器的發(fā)揮空間不足,如果設(shè)計者希望在調(diào)度中考慮復(fù)雜多變的系統(tǒng)信息,這些信息的收集工作本身就會制約設(shè)計者的工作.本文所描述的系統(tǒng)系統(tǒng)信息管理子系統(tǒng)支持靈活的功能擴(kuò)展,設(shè)計者可以通過對信息收集器與處理器的定制化來獲取所需的系統(tǒng)信息.同時在設(shè)計時,通過Restful API 接口對外提供服務(wù),保證了平臺及語言無關(guān)性.
圖8 不同節(jié)點性能評估方法下各節(jié)點的處理時間(s)