胡常禮,邵劍飛
(昆明理工大學(xué) 信息工程與自動化學(xué)院,云南 昆明 650500)
大數(shù)據(jù)技術(shù)的不斷發(fā)展,促進了大數(shù)據(jù)在機器學(xué)習(xí)領(lǐng)域的使用。基于大數(shù)據(jù)技術(shù)的機器學(xué)習(xí)能夠精準(zhǔn)實現(xiàn)訓(xùn)練機器學(xué)習(xí)的能力,對機器學(xué)習(xí)的研究是當(dāng)前人工智能系統(tǒng)重要的研究方向。在機器學(xué)習(xí)的基礎(chǔ)上對大數(shù)據(jù)進行智能分析處理,可以得到有價值的信息[1]。使用數(shù)據(jù)規(guī)模越大,機器從數(shù)據(jù)學(xué)習(xí)到的有用信息就越多,學(xué)習(xí)的效果就越好,就不容易出現(xiàn)欠擬合和過擬合問題。創(chuàng)建分布式機器學(xué)習(xí)系統(tǒng),涉及大數(shù)據(jù)處理和機器學(xué)習(xí)兩方面,多種不同因素的影響提高了系統(tǒng)設(shè)計的復(fù)雜性和穩(wěn)定性,為設(shè)計人員開發(fā)系統(tǒng)帶來了挑戰(zhàn)。因此,在機器學(xué)習(xí)系統(tǒng)的設(shè)計過程中,設(shè)計人員要重視分布式與并行化大數(shù)據(jù)技術(shù),從而在可接受的時間內(nèi)實現(xiàn)計算[2]。
Spark 是使用scala 實現(xiàn)的基于內(nèi)存計算的大數(shù)據(jù)開源集群計算環(huán)境。Spark 設(shè)計方法具有以下特點:其一,計算方式比較迅速,通過有向無環(huán)圖支持循環(huán)數(shù)據(jù)流,在內(nèi)存存儲中間數(shù)據(jù),運行效率更快;其二,通用性較強,具有豐富的組件;其三,使用比較方便,可實現(xiàn)多開發(fā)語言的兼容。Spark 設(shè)計工作相關(guān)流程如圖1 所示。

圖1 Spark 設(shè)計工作流程
Spark 工作流程中,利用分布式數(shù)據(jù)集RDD 的可分區(qū)特性將數(shù)據(jù)集進行劃分,并通過RDD 之間的關(guān)聯(lián)形成DAG 有向無環(huán)圖。有向無環(huán)圖DAG 被劃分成多個stage,每個stage 含有多個任務(wù),而Driver設(shè)置好任務(wù)調(diào)度組件,將任務(wù)分配到Workers。Spark 通過模型參數(shù)在driver 節(jié)點中存儲,并且與workers進行信息交互,通過不斷迭代更新相關(guān)參數(shù)。在大模型的數(shù)據(jù)處理過程中,由于模型的相關(guān)參數(shù)無法完全存儲在driver 里,使得RDD 數(shù)據(jù)存儲成為問題。將參數(shù)以分布式方式存儲數(shù)據(jù)集RDD 里,通過并行計算可以使參數(shù)同時更新[3]。
機器學(xué)習(xí)模型指的是利用人工智能技術(shù)讓計算機能夠完成類似人的主動學(xué)習(xí),智能地完成相關(guān)計算,提高計算速度。計算機對數(shù)據(jù)進行分析處理,并從分析處理后相關(guān)有價值的信息中進行學(xué)習(xí),在學(xué)習(xí)中形成自己的知識體系。機器學(xué)習(xí)從學(xué)習(xí)環(huán)境中獲取原始信息即數(shù)據(jù),通過從原始信息中學(xué)習(xí)構(gòu)建學(xué)習(xí)元,然后在學(xué)習(xí)中不斷更新知識庫,通過形成的知識體系指導(dǎo)和糾正學(xué)習(xí)。本文設(shè)計的機器學(xué)習(xí)模型結(jié)構(gòu)如圖2 所示。

圖2 機器學(xué)習(xí)模型的結(jié)構(gòu)
機器學(xué)習(xí)系統(tǒng)設(shè)計為R 語言中包(Package)的方式,通過上層用戶加載此包實現(xiàn)系統(tǒng)提供矩陣運算的功能。圖3 為機器學(xué)習(xí)系統(tǒng)的矩陣編程模型統(tǒng)一接口,包括矩陣API 接口設(shè)計與運行模式。對于此運行模式,用戶在R 語言編程環(huán)境中采用交互式運行和批量解釋運行方式使用系統(tǒng)[4]。

圖3 機器學(xué)習(xí)系統(tǒng)的矩陣編程模型統(tǒng)一接口
針對矩陣API 接口設(shè)計,為了區(qū)分矩陣運算編程接口的性質(zhì),實現(xiàn)底層計算平臺接口,將API 接口劃分為3 個模塊。
(1)矩陣生成接口模塊。實現(xiàn)生成矩陣接口,比如內(nèi)存生成矩陣、分布式文件生成矩陣以及隨機初始矩陣。
(2)矩陣輸出接口模塊。實現(xiàn)矩陣的保存和展示,比如矩陣數(shù)據(jù)打印和保存在分布式文件系統(tǒng)中。
(3)矩陣運算接口模塊。包括矩陣操作接口,比如用戶自定義函數(shù)執(zhí)行、四則運算等。
為了使上層程序在多種底層計算機平臺中執(zhí)行,系統(tǒng)要對所有計算平臺使用矩陣庫實現(xiàn)以上矩陣模型接口,并且通過用戶矩陣接口封裝多種底層計算平臺矩陣函數(shù)實現(xiàn)[5]。
此模型是機器學(xué)習(xí)和大數(shù)據(jù)的結(jié)合,運用SymboMaxtrix 接口是為了簡化矩陣表達式,DAG邏輯優(yōu)化優(yōu)化分布式數(shù)據(jù)集RDD 之間的關(guān)系,OctMatrix 使得在不同的平臺都可以進行矩陣操作,通過定義Spark、MPI、R 等矩陣庫的在不同平臺優(yōu)先級,之后再通過Alluxio 文件系統(tǒng)實現(xiàn)在不同平臺矩陣運算[6]。網(wǎng)絡(luò)模型的結(jié)構(gòu)如圖4 所示。

圖4 網(wǎng)絡(luò)模型的結(jié)構(gòu)
2.3.1 用戶自定義函數(shù)
MPI 的矩陣庫iPLAR 是將R 的pbdr 包實現(xiàn),通過MPI 執(zhí)行用戶自定義R 函數(shù)。OctMatrix 是以Spark 為基礎(chǔ)實現(xiàn)的分布式矩陣庫,能夠提供Scala接口,機器學(xué)習(xí)系統(tǒng)只是利用JVM 反射機制應(yīng)用,所以用戶自定義R函數(shù)不能夠通過Spark平臺執(zhí)行。R 中用戶自定義函數(shù)(UDP)通過Spark 執(zhí)行,利用apply(m,margin,func)函數(shù)實現(xiàn)。在apply 函數(shù)中,m 為矩陣,func 為用戶自定義函數(shù)或者R 原生函數(shù)。margin 包含c(1,2),指的是使func 在矩陣每個元素中使用。假如m 類型為R,由于func 為R 的函數(shù),能夠使func 在矩陣m 中使用。通過R 包的pbdR實現(xiàn)MPI,所以能夠使func 直接在矩陣中使用。在矩陣為Spark 類型的時候,JVM 無法對R 函數(shù)進行識別。
圖5 為apply 調(diào)用實現(xiàn)結(jié)構(gòu),在Spark 集群中的slave 中運行Rserve 守護進程,此進程能夠使java傳輸數(shù)據(jù)在R 中操作,在java 中返回結(jié)果。利用func 函數(shù)和依賴序列化構(gòu)成數(shù)組Array[Byte]傳輸?shù)紻river 端,之后在Worker 進行廣播,每個Worker和本地Rserve 通信,使結(jié)果在Worker 中傳輸,執(zhí)行apply 函數(shù)[7]。

圖5 Spark 執(zhí)行R 函數(shù)
2.3.2 跨平臺矩陣調(diào)用
由于矩陣計算平臺包括Spark、MRI、R,所以將矩陣劃分為這3 種類型。在矩陣類型轉(zhuǎn)變的過程中,要實現(xiàn)矩陣跨平臺調(diào)用。跨平臺矩陣調(diào)用模塊結(jié)構(gòu)如圖6 所示,利用矩陣讀寫Alluxio 兩個模塊。在矩陣寫模塊中,平臺能夠?qū)慉lluxio 函數(shù);在矩陣讀模塊中,平臺能夠讀Alluxio 函數(shù)。利用矩陣先寫到Alluxio 中調(diào)用矩陣,之后通過Alluxio 讀取矩陣進行實現(xiàn)。

圖6 跨平臺矩陣調(diào)用結(jié)構(gòu)
2.3.3 不同平臺矩陣函數(shù)的計算
用戶在使用OctMatrix 時,不會只是使用同個平臺,矩陣操作中的計算平臺不同。比如,乘法的兩個矩陣包括R 平臺和Spark 平臺。對于此情況,系統(tǒng)設(shè)計統(tǒng)一化處理規(guī)則。首先對平臺優(yōu)先級進行定義,Spark >MPI >Hadoop >R。在矩陣操作過程包括多個矩陣時,假如底層計算平臺一致,使用此計算平臺對矩陣操作進行執(zhí)行;假如底層計算平臺不同,使低優(yōu)先級計算平臺矩陣朝著高優(yōu)先級轉(zhuǎn)變,之后通過高優(yōu)先級計算平臺對矩陣執(zhí)行操作。比如A%*%B,流程如圖7 所示。

圖7 工作流程
本文利用VMware 虛擬軟件進行實驗,虛擬5臺機器,集群配置如表1 所示。

表1 集群配置
此實驗基于QJM 中的HM 大數(shù)據(jù)平臺,利用HDFS 和Aookeeper 兩大工具,實現(xiàn)對本文中集群配置分布式管理。本文有5 個節(jié)點配置,如表1 所示,利用yarn 模型和局域網(wǎng)接入本平臺,完成對平臺的線管資源分配和分布執(zhí)行任務(wù)。
3.1.1 和數(shù)據(jù)Partition 的關(guān)系
為了對訓(xùn)練中不同模型對訓(xùn)練時間的影響進行評估,使用MovieLens 數(shù)據(jù)集(1 000 萬)進行分區(qū)計算實驗,分區(qū)數(shù)和運行時間之間的影響關(guān)系如圖8 所示。

圖8 分區(qū)數(shù)和運行時間
通過圖8 可以看出,隨著分區(qū)數(shù)目的增多,對模型訓(xùn)練的運行時間也減少;然后隨著分區(qū)數(shù)的增加,運行時間并沒有隨著減少,而是在一定程度上增多。這是因為分區(qū)使得計算機可以并行執(zhí)行,運行時間會隨著分區(qū)數(shù)的增多而下降;但是隨著分區(qū)數(shù)的增多,負(fù)責(zé)傳輸?shù)耐ㄐ啪W(wǎng)絡(luò)的負(fù)擔(dān)會增加,導(dǎo)致對機器的訓(xùn)練時間增加,因此運行時間沒有繼續(xù)下降反而小幅度上升。
3.1.2 算法運行時間
通過算法在不同節(jié)點下的訓(xùn)練效果測試以及執(zhí)行時間測試展現(xiàn)算法的分布計算的效果,在MovieLens 數(shù)據(jù)集的m1-100k(1 萬~10 萬)、m1-1m(100 萬)、m1-10m100k(1 000 萬)情況下開展實驗,最終實驗結(jié)果如圖9 所示。

圖9 最終實驗結(jié)果
圖9 中Spark 下Kmeans 算法在不同規(guī)模的節(jié)點數(shù)和不同大小的數(shù)據(jù)規(guī)模的運行時間結(jié)果對比,發(fā)現(xiàn)在數(shù)據(jù)集在較小規(guī)模時使用KMeans 分類訓(xùn)練時間比較少,是因為集群計算要對任務(wù)進行初始化,會消耗大量的時間和成本。在數(shù)據(jù)規(guī)模不斷增加的過程中,節(jié)點規(guī)模也會同時增加。另外發(fā)現(xiàn)在Spark 下的KMearns 算法下訓(xùn)練執(zhí)行并行計算有一定程度的優(yōu)勢,主要是因為在Spark 下Kmeans 算法在信息交互和任務(wù)調(diào)度相關(guān)初始化所用時間比較少,使得機器對數(shù)據(jù)載入學(xué)習(xí)的時間減少,且Spark下Kmeans 算法能夠?qū)?shù)據(jù)集均勻分成Data Block塊,在Worker 中開展并行計算,降低訓(xùn)練時間。實驗結(jié)果表明,本文所設(shè)計系統(tǒng)的運行時間、訓(xùn)練時間都比較優(yōu),并且在數(shù)據(jù)處理延遲方面表現(xiàn)良好。
對分布式計算框架和機器學(xué)習(xí)模型對不同分區(qū)數(shù)的學(xué)習(xí)效率的分析和研究表明,分布式計算對于機器學(xué)習(xí)有效地處理大數(shù)據(jù),對于人工智能的領(lǐng)域研究具有實際意義。本文的仿真實驗和對比分析表明,基于分布式計算框架的機器學(xué)習(xí)系統(tǒng)可以提高訓(xùn)練樣本的大小,即增強了機器對大數(shù)據(jù)集的學(xué)習(xí)和充分挖掘有用信息的處理能力。機器學(xué)習(xí)利用大量數(shù)據(jù)樣本實現(xiàn)訓(xùn)練,通過不斷的優(yōu)化融合機器學(xué)習(xí)和大數(shù)據(jù)、分布式計算框架,提高兩者關(guān)聯(lián)性,實現(xiàn)數(shù)據(jù)挖掘過程與機器訓(xùn)練。在未來發(fā)展中,需要重點研究的內(nèi)容是以常用機器學(xué)習(xí)和數(shù)據(jù)分析算法針對矩陣函數(shù)實現(xiàn)更多功能,以應(yīng)用特性與平臺特性提煉更多物理與邏輯的優(yōu)化方法,針對已有多平臺調(diào)度優(yōu)化創(chuàng)建理論、精準(zhǔn)的實踐模型,使模型誤差得到降低。