李 輝,和志成
(1.云南電網(wǎng)有限責(zé)任公司信息中心,云南 昆明 650011;2.玉溪供電局,云南 玉溪 653100)
隨著大數(shù)據(jù)時(shí)代的到來(lái),電力行業(yè)有關(guān)數(shù)據(jù)的存儲(chǔ)總量已達(dá)一定規(guī)模。這些數(shù)據(jù)蘊(yùn)含豐富的知識(shí),若能從中挖掘有關(guān)模式,將有利于電力行業(yè)的發(fā)展。為建設(shè)快速靈活、簡(jiǎn)便易用、支持分布式以及可復(fù)用的企業(yè)算法中臺(tái),需要充分考慮算法封裝方法及分布式架構(gòu)的設(shè)計(jì)與實(shí)現(xiàn),使其兼具實(shí)用性與易用性。本文提出了一種基于分布式的算法封裝框架,該框架不僅能夠支持分布式并行計(jì)算,而且融合了算法優(yōu)化、參數(shù)擇優(yōu)以及數(shù)據(jù)采樣等多種功能,能夠滿足電力行業(yè)數(shù)據(jù)分析方向的基本需要。
傳統(tǒng)的算法封裝框架有Weka、MADLib以及Mahout。Weka是一個(gè)用于數(shù)據(jù)挖掘的機(jī)器學(xué)習(xí)工具包,它的UI非常簡(jiǎn)單,但需要專業(yè)人員來(lái)選擇合適的機(jī)器學(xué)習(xí)算法并調(diào)整有關(guān)參數(shù),這降低了它的易用性。此外,Weka還是一個(gè)單節(jié)點(diǎn)式的,無(wú)法實(shí)現(xiàn)分布式計(jì)算,即無(wú)法滿足并行化數(shù)據(jù)分析的需要。在數(shù)據(jù)庫(kù)和分布式領(lǐng)域,Mahout的目標(biāo)是建立一個(gè)可擴(kuò)展的機(jī)器學(xué)習(xí)庫(kù),它是Hadoop技術(shù)棧的一部分。MADLib則為關(guān)系型數(shù)據(jù)庫(kù)提供機(jī)器學(xué)習(xí)庫(kù)。這些框架的共同點(diǎn)是沒有自動(dòng)的算法優(yōu)化過(guò)程,然而這個(gè)過(guò)程對(duì)于非專業(yè)數(shù)據(jù)分析人員來(lái)說(shuō)非常重要。
Google Predict是谷歌開發(fā)的Web服務(wù),用于解決預(yù)測(cè)類問題,但它能支持最大訓(xùn)練數(shù)據(jù)量?jī)H為250 MB,遠(yuǎn)遠(yuǎn)無(wú)法滿足人們的需求。文獻(xiàn)[1]提出了數(shù)據(jù)庫(kù)應(yīng)該原生支持預(yù)測(cè)模型的觀點(diǎn),并基于此觀點(diǎn)展示了一個(gè)稱為L(zhǎng)ongview的模型。近期,在針對(duì)新型分析任務(wù)的分布式實(shí)時(shí)計(jì)算領(lǐng)域有很多重要的發(fā)現(xiàn),如Hyracks和AMPLab’s Spark均支持基于內(nèi)存的迭代式計(jì)算,能夠?qū)C(jī)器學(xué)習(xí)算法起到很好的支撐作用。SystemML提供了一個(gè)類R語(yǔ)言的功能,并且提供了算法優(yōu)化功能,最后將它編譯到MapReduce中,該思想值得借鑒。但是,SystemML嘗試支持機(jī)器學(xué)習(xí)專家來(lái)對(duì)分布式算法進(jìn)行開發(fā)而忽略了對(duì)算法易用性的考慮。文獻(xiàn)[2]表明很多機(jī)器學(xué)習(xí)算法都能夠被簡(jiǎn)化為一個(gè)凸優(yōu)化問題,文獻(xiàn)[3]展示了一種在概率數(shù)據(jù)庫(kù)中對(duì)算法進(jìn)行優(yōu)化的技術(shù)。
如圖1所示,框架主要結(jié)構(gòu)由驅(qū)動(dòng)器、執(zhí)行器以及集群管理器所構(gòu)成。驅(qū)動(dòng)器是框架的核心,它位于集群的某個(gè)節(jié)點(diǎn)上,主要負(fù)責(zé)以下內(nèi)容。一是維護(hù)會(huì)話,以保存應(yīng)用程序的相關(guān)信息,二是和用戶進(jìn)行交互,管理輸入輸出,三是分析任務(wù)并將任務(wù)分發(fā)至執(zhí)行器。執(zhí)行器接收驅(qū)動(dòng)器分配的任務(wù)并執(zhí)行,然后將計(jì)算結(jié)果狀態(tài)返回給驅(qū)動(dòng)器。集群管理器負(fù)責(zé)計(jì)算資源的統(tǒng)一調(diào)度,將計(jì)算資源統(tǒng)一按某種策略分配給應(yīng)用程序[4]。
圖1 框架結(jié)構(gòu)
如圖2所示,當(dāng)用戶將聲明式機(jī)器學(xué)習(xí)任務(wù)作為請(qǐng)求輸入后,框架將對(duì)其進(jìn)行解析。解析后的請(qǐng)求會(huì)經(jīng)歷兩個(gè)階段。第一個(gè)階段稱為計(jì)劃階段,該階段不對(duì)具體數(shù)據(jù)進(jìn)行操作,而僅僅用于描述完成用戶請(qǐng)求的通用流水線。該流水線涉及算法選擇、特征工程、算法調(diào)參以及數(shù)據(jù)采樣等功能。此外,框架內(nèi)部會(huì)自動(dòng)搜索優(yōu)化空間來(lái)對(duì)此階段進(jìn)行優(yōu)化。第二個(gè)階段稱為執(zhí)行階段,它是由計(jì)劃階段轉(zhuǎn)化過(guò)來(lái)的。一個(gè)執(zhí)行階段主要包含一系列的可執(zhí)行操作,如過(guò)濾或特征值縮放,這些操作和MapReduce所實(shí)現(xiàn)的功能類似[5]。與計(jì)劃階段不同的是,執(zhí)行階段使用具體參數(shù)對(duì)數(shù)據(jù)集進(jìn)行測(cè)試。在測(cè)試過(guò)程中,主節(jié)點(diǎn)會(huì)將這些任務(wù)分配到從節(jié)點(diǎn)上執(zhí)行。執(zhí)行的過(guò)程有兩種,所產(chǎn)生的結(jié)果也會(huì)不同。一種是對(duì)數(shù)據(jù)特征進(jìn)行處理,如數(shù)據(jù)降維等,所產(chǎn)生的結(jié)果是數(shù)據(jù)的某種表現(xiàn)形式,可用于后續(xù)預(yù)測(cè)或數(shù)據(jù)綜述;另一種是利用數(shù)據(jù)對(duì)模型進(jìn)行訓(xùn)練,所產(chǎn)生的結(jié)果即是已經(jīng)訓(xùn)練好的模型。同時(shí),框架會(huì)總結(jié)模型的訓(xùn)練過(guò)程,以便于用戶了解詳細(xì)情況[6]。
圖2 內(nèi)部流程
當(dāng)獲取到第一次計(jì)算結(jié)果時(shí),計(jì)算任務(wù)仍未結(jié)束,而是會(huì)通過(guò)額外的探索來(lái)提高模型性能。在每一次計(jì)算過(guò)程中,框架會(huì)將中間步驟存儲(chǔ)起來(lái),包括已訓(xùn)練的模型、處理過(guò)的特征值以及和模型相應(yīng)的核心統(tǒng)計(jì)指標(biāo)。根據(jù)指標(biāo)比對(duì),可能會(huì)修改計(jì)劃以提高模型的最終效果[7]。
用戶提交當(dāng)前請(qǐng)求后,在提交下一個(gè)請(qǐng)求之前,框架不會(huì)閑置,而是會(huì)持續(xù)在后臺(tái)搜索當(dāng)前請(qǐng)求的更優(yōu)解。若發(fā)現(xiàn)更優(yōu)解,即質(zhì)量更好的算法或參數(shù),它會(huì)及時(shí)通知用戶。
框架優(yōu)勢(shì)如下,一是通過(guò)讓用戶早期對(duì)初始模型進(jìn)行評(píng)估試驗(yàn),使其具備交互性特點(diǎn),二是使得用戶創(chuàng)建整個(gè)數(shù)據(jù)處理流水線變得更容易,三是降低了早停的風(fēng)險(xiǎn),四是當(dāng)用戶輸入新數(shù)據(jù)時(shí),它能夠立即使用新數(shù)據(jù)更新模型并提升模型性能,即實(shí)現(xiàn)在線學(xué)習(xí),五是框架具有良好的可擴(kuò)展性,能夠容納新型機(jī)器學(xué)習(xí)算法[8]。一旦有需求,開發(fā)者就能通過(guò)指定的協(xié)議將新的機(jī)器學(xué)習(xí)算法源源不斷地添加到算法庫(kù)中。協(xié)議明確了算法的類別(如聚類算法)、參數(shù)以及時(shí)間復(fù)雜度等。
框架內(nèi)部集成了算法優(yōu)化的功能,主要體現(xiàn)在計(jì)劃階段。算法優(yōu)化需要用到優(yōu)化器,優(yōu)化器通過(guò)參數(shù)調(diào)整和數(shù)據(jù)采樣多種策略組合優(yōu)化已有的計(jì)劃階段,然后進(jìn)行評(píng)估。為了滿足時(shí)間約束條件,優(yōu)化器將基于統(tǒng)計(jì)模型,利用啟發(fā)式算法及最新的模型選擇工具來(lái)估計(jì)流水線的執(zhí)行時(shí)間和算法綜合表現(xiàn)[9]。優(yōu)化器能夠根據(jù)已有數(shù)據(jù)的表征形式來(lái)估計(jì)模型的運(yùn)行時(shí)間。針對(duì)每一個(gè)模型,優(yōu)化器會(huì)估計(jì)它的效果,選出一個(gè)最佳候選。
圖3顯示了一個(gè)具體的優(yōu)化過(guò)程。在該過(guò)程中,優(yōu)化器對(duì)數(shù)據(jù)進(jìn)行特征標(biāo)準(zhǔn)化并采樣,接下來(lái)優(yōu)化器采用10折交叉驗(yàn)證進(jìn)行檢驗(yàn)。在每次實(shí)驗(yàn)中,將其中一份數(shù)據(jù)用于驗(yàn)證[10]。評(píng)價(jià)指標(biāo)則采用通用標(biāo)簽基線準(zhǔn)則、誤分類率以及近鄰數(shù)。需要注意的是,最終的模型仍然是用全量數(shù)據(jù)集生成的。此外,優(yōu)化器能夠建立多維索引結(jié)構(gòu)并提前完成距離矩陣的計(jì)算工作,以便對(duì)算法進(jìn)行加速。
圖3 算法優(yōu)化步驟
驅(qū)動(dòng)器運(yùn)行在客戶端,因此不受主節(jié)點(diǎn)的管理和約束。執(zhí)行器則不同,它運(yùn)行在集群中的從節(jié)點(diǎn)上,因此會(huì)受到主節(jié)點(diǎn)的管理和約束。一個(gè)分布式應(yīng)用程序在集群中的流程如下:(1)用戶向客戶端提交應(yīng)用程序,本機(jī)啟動(dòng)驅(qū)動(dòng)器;(2)客戶端向集群提交應(yīng)用程序、所需執(zhí)行器的數(shù)目及相應(yīng)資源;(3)主結(jié)點(diǎn)收到請(qǐng)求,根據(jù)合適的調(diào)度策略,尋找從結(jié)點(diǎn)并啟動(dòng)執(zhí)行器;(4)執(zhí)行器與驅(qū)動(dòng)器建立連接;(5)執(zhí)行器分配并調(diào)度任務(wù);(6)所有任務(wù)運(yùn)行完畢,應(yīng)用程序退出。
本文根據(jù)電力行業(yè)對(duì)于數(shù)據(jù)分析的需求及特點(diǎn),提出了一種面向行業(yè)的分布式算法封裝框架。該框架具有輕便、智能、可擴(kuò)容以及支持并行化等特點(diǎn)。本文所涉及的主要內(nèi)容如下,一是基于主從模式和實(shí)時(shí)內(nèi)存計(jì)算實(shí)現(xiàn)了分布式并行計(jì)算框架,為海量數(shù)據(jù)計(jì)算提供基礎(chǔ)支撐。二是通過(guò)設(shè)計(jì)優(yōu)化器,將聲明式機(jī)器學(xué)習(xí)任務(wù)轉(zhuǎn)換成精密的學(xué)習(xí)計(jì)劃。在這個(gè)過(guò)程中,優(yōu)化器在后臺(tái)嘗試快速給用戶返回一個(gè)優(yōu)質(zhì)的算法,讓用戶避開了煩瑣的算法選擇過(guò)程。此外,本文展示了在分布式架構(gòu)基礎(chǔ)上優(yōu)化器的強(qiáng)大潛力,為非專業(yè)開發(fā)人員進(jìn)行數(shù)據(jù)分析提供了較好的幫助。