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