胡常禮,邵劍飛
(昆明理工大學(xué) 信息工程與自動(dòng)化學(xué)院,云南 昆明 650500)
大數(shù)據(jù)技術(shù)的不斷發(fā)展,促進(jìn)了大數(shù)據(jù)在機(jī)器學(xué)習(xí)領(lǐng)域的使用。基于大數(shù)據(jù)技術(shù)的機(jī)器學(xué)習(xí)能夠精準(zhǔn)實(shí)現(xiàn)訓(xùn)練機(jī)器學(xué)習(xí)的能力,對(duì)機(jī)器學(xué)習(xí)的研究是當(dāng)前人工智能系統(tǒng)重要的研究方向。在機(jī)器學(xué)習(xí)的基礎(chǔ)上對(duì)大數(shù)據(jù)進(jìn)行智能分析處理,可以得到有價(jià)值的信息[1]。使用數(shù)據(jù)規(guī)模越大,機(jī)器從數(shù)據(jù)學(xué)習(xí)到的有用信息就越多,學(xué)習(xí)的效果就越好,就不容易出現(xiàn)欠擬合和過(guò)擬合問(wèn)題。創(chuàng)建分布式機(jī)器學(xué)習(xí)系統(tǒng),涉及大數(shù)據(jù)處理和機(jī)器學(xué)習(xí)兩方面,多種不同因素的影響提高了系統(tǒng)設(shè)計(jì)的復(fù)雜性和穩(wěn)定性,為設(shè)計(jì)人員開發(fā)系統(tǒng)帶來(lái)了挑戰(zhàn)。因此,在機(jī)器學(xué)習(xí)系統(tǒng)的設(shè)計(jì)過(guò)程中,設(shè)計(jì)人員要重視分布式與并行化大數(shù)據(jù)技術(shù),從而在可接受的時(shí)間內(nèi)實(shí)現(xiàn)計(jì)算[2]。
Spark 是使用scala 實(shí)現(xiàn)的基于內(nèi)存計(jì)算的大數(shù)據(jù)開源集群計(jì)算環(huán)境。Spark 設(shè)計(jì)方法具有以下特點(diǎn):其一,計(jì)算方式比較迅速,通過(guò)有向無(wú)環(huán)圖支持循環(huán)數(shù)據(jù)流,在內(nèi)存存儲(chǔ)中間數(shù)據(jù),運(yùn)行效率更快;其二,通用性較強(qiáng),具有豐富的組件;其三,使用比較方便,可實(shí)現(xiàn)多開發(fā)語(yǔ)言的兼容。Spark 設(shè)計(jì)工作相關(guān)流程如圖1 所示。
圖1 Spark 設(shè)計(jì)工作流程
Spark 工作流程中,利用分布式數(shù)據(jù)集RDD 的可分區(qū)特性將數(shù)據(jù)集進(jìn)行劃分,并通過(guò)RDD 之間的關(guān)聯(lián)形成DAG 有向無(wú)環(huán)圖。有向無(wú)環(huán)圖DAG 被劃分成多個(gè)stage,每個(gè)stage 含有多個(gè)任務(wù),而Driver設(shè)置好任務(wù)調(diào)度組件,將任務(wù)分配到Workers。Spark 通過(guò)模型參數(shù)在driver 節(jié)點(diǎn)中存儲(chǔ),并且與workers進(jìn)行信息交互,通過(guò)不斷迭代更新相關(guān)參數(shù)。在大模型的數(shù)據(jù)處理過(guò)程中,由于模型的相關(guān)參數(shù)無(wú)法完全存儲(chǔ)在driver 里,使得RDD 數(shù)據(jù)存儲(chǔ)成為問(wèn)題。將參數(shù)以分布式方式存儲(chǔ)數(shù)據(jù)集RDD 里,通過(guò)并行計(jì)算可以使參數(shù)同時(shí)更新[3]。
機(jī)器學(xué)習(xí)模型指的是利用人工智能技術(shù)讓計(jì)算機(jī)能夠完成類似人的主動(dòng)學(xué)習(xí),智能地完成相關(guān)計(jì)算,提高計(jì)算速度。計(jì)算機(jī)對(duì)數(shù)據(jù)進(jìn)行分析處理,并從分析處理后相關(guān)有價(jià)值的信息中進(jìn)行學(xué)習(xí),在學(xué)習(xí)中形成自己的知識(shí)體系。機(jī)器學(xué)習(xí)從學(xué)習(xí)環(huán)境中獲取原始信息即數(shù)據(jù),通過(guò)從原始信息中學(xué)習(xí)構(gòu)建學(xué)習(xí)元,然后在學(xué)習(xí)中不斷更新知識(shí)庫(kù),通過(guò)形成的知識(shí)體系指導(dǎo)和糾正學(xué)習(xí)。本文設(shè)計(jì)的機(jī)器學(xué)習(xí)模型結(jié)構(gòu)如圖2 所示。
圖2 機(jī)器學(xué)習(xí)模型的結(jié)構(gòu)
機(jī)器學(xué)習(xí)系統(tǒng)設(shè)計(jì)為R 語(yǔ)言中包(Package)的方式,通過(guò)上層用戶加載此包實(shí)現(xiàn)系統(tǒng)提供矩陣運(yùn)算的功能。圖3 為機(jī)器學(xué)習(xí)系統(tǒng)的矩陣編程模型統(tǒng)一接口,包括矩陣API 接口設(shè)計(jì)與運(yùn)行模式。對(duì)于此運(yùn)行模式,用戶在R 語(yǔ)言編程環(huán)境中采用交互式運(yùn)行和批量解釋運(yùn)行方式使用系統(tǒng)[4]。
圖3 機(jī)器學(xué)習(xí)系統(tǒng)的矩陣編程模型統(tǒng)一接口
針對(duì)矩陣API 接口設(shè)計(jì),為了區(qū)分矩陣運(yùn)算編程接口的性質(zhì),實(shí)現(xiàn)底層計(jì)算平臺(tái)接口,將API 接口劃分為3 個(gè)模塊。
(1)矩陣生成接口模塊。實(shí)現(xiàn)生成矩陣接口,比如內(nèi)存生成矩陣、分布式文件生成矩陣以及隨機(jī)初始矩陣。
(2)矩陣輸出接口模塊。實(shí)現(xiàn)矩陣的保存和展示,比如矩陣數(shù)據(jù)打印和保存在分布式文件系統(tǒng)中。
(3)矩陣運(yùn)算接口模塊。包括矩陣操作接口,比如用戶自定義函數(shù)執(zhí)行、四則運(yùn)算等。
為了使上層程序在多種底層計(jì)算機(jī)平臺(tái)中執(zhí)行,系統(tǒng)要對(duì)所有計(jì)算平臺(tái)使用矩陣庫(kù)實(shí)現(xiàn)以上矩陣模型接口,并且通過(guò)用戶矩陣接口封裝多種底層計(jì)算平臺(tái)矩陣函數(shù)實(shí)現(xiàn)[5]。
此模型是機(jī)器學(xué)習(xí)和大數(shù)據(jù)的結(jié)合,運(yùn)用SymboMaxtrix 接口是為了簡(jiǎn)化矩陣表達(dá)式,DAG邏輯優(yōu)化優(yōu)化分布式數(shù)據(jù)集RDD 之間的關(guān)系,OctMatrix 使得在不同的平臺(tái)都可以進(jìn)行矩陣操作,通過(guò)定義Spark、MPI、R 等矩陣庫(kù)的在不同平臺(tái)優(yōu)先級(jí),之后再通過(guò)Alluxio 文件系統(tǒng)實(shí)現(xiàn)在不同平臺(tái)矩陣運(yùn)算[6]。網(wǎng)絡(luò)模型的結(jié)構(gòu)如圖4 所示。
圖4 網(wǎng)絡(luò)模型的結(jié)構(gòu)
2.3.1 用戶自定義函數(shù)
MPI 的矩陣庫(kù)iPLAR 是將R 的pbdr 包實(shí)現(xiàn),通過(guò)MPI 執(zhí)行用戶自定義R 函數(shù)。OctMatrix 是以Spark 為基礎(chǔ)實(shí)現(xiàn)的分布式矩陣庫(kù),能夠提供Scala接口,機(jī)器學(xué)習(xí)系統(tǒng)只是利用JVM 反射機(jī)制應(yīng)用,所以用戶自定義R函數(shù)不能夠通過(guò)Spark平臺(tái)執(zhí)行。R 中用戶自定義函數(shù)(UDP)通過(guò)Spark 執(zhí)行,利用apply(m,margin,func)函數(shù)實(shí)現(xiàn)。在apply 函數(shù)中,m 為矩陣,func 為用戶自定義函數(shù)或者R 原生函數(shù)。margin 包含c(1,2),指的是使func 在矩陣每個(gè)元素中使用。假如m 類型為R,由于func 為R 的函數(shù),能夠使func 在矩陣m 中使用。通過(guò)R 包的pbdR實(shí)現(xiàn)MPI,所以能夠使func 直接在矩陣中使用。在矩陣為Spark 類型的時(shí)候,JVM 無(wú)法對(duì)R 函數(shù)進(jìn)行識(shí)別。
圖5 為apply 調(diào)用實(shí)現(xiàn)結(jié)構(gòu),在Spark 集群中的slave 中運(yùn)行Rserve 守護(hù)進(jìn)程,此進(jìn)程能夠使java傳輸數(shù)據(jù)在R 中操作,在java 中返回結(jié)果。利用func 函數(shù)和依賴序列化構(gòu)成數(shù)組Array[Byte]傳輸?shù)紻river 端,之后在Worker 進(jìn)行廣播,每個(gè)Worker和本地Rserve 通信,使結(jié)果在Worker 中傳輸,執(zhí)行apply 函數(shù)[7]。
圖5 Spark 執(zhí)行R 函數(shù)
2.3.2 跨平臺(tái)矩陣調(diào)用
由于矩陣計(jì)算平臺(tái)包括Spark、MRI、R,所以將矩陣劃分為這3 種類型。在矩陣類型轉(zhuǎn)變的過(guò)程中,要實(shí)現(xiàn)矩陣跨平臺(tái)調(diào)用??缙脚_(tái)矩陣調(diào)用模塊結(jié)構(gòu)如圖6 所示,利用矩陣讀寫Alluxio 兩個(gè)模塊。在矩陣寫模塊中,平臺(tái)能夠?qū)慉lluxio 函數(shù);在矩陣讀模塊中,平臺(tái)能夠讀Alluxio 函數(shù)。利用矩陣先寫到Alluxio 中調(diào)用矩陣,之后通過(guò)Alluxio 讀取矩陣進(jìn)行實(shí)現(xiàn)。
圖6 跨平臺(tái)矩陣調(diào)用結(jié)構(gòu)
2.3.3 不同平臺(tái)矩陣函數(shù)的計(jì)算
用戶在使用OctMatrix 時(shí),不會(huì)只是使用同個(gè)平臺(tái),矩陣操作中的計(jì)算平臺(tái)不同。比如,乘法的兩個(gè)矩陣包括R 平臺(tái)和Spark 平臺(tái)。對(duì)于此情況,系統(tǒng)設(shè)計(jì)統(tǒng)一化處理規(guī)則。首先對(duì)平臺(tái)優(yōu)先級(jí)進(jìn)行定義,Spark >MPI >Hadoop >R。在矩陣操作過(guò)程包括多個(gè)矩陣時(shí),假如底層計(jì)算平臺(tái)一致,使用此計(jì)算平臺(tái)對(duì)矩陣操作進(jìn)行執(zhí)行;假如底層計(jì)算平臺(tái)不同,使低優(yōu)先級(jí)計(jì)算平臺(tái)矩陣朝著高優(yōu)先級(jí)轉(zhuǎn)變,之后通過(guò)高優(yōu)先級(jí)計(jì)算平臺(tái)對(duì)矩陣執(zhí)行操作。比如A%*%B,流程如圖7 所示。
圖7 工作流程
本文利用VMware 虛擬軟件進(jìn)行實(shí)驗(yàn),虛擬5臺(tái)機(jī)器,集群配置如表1 所示。
表1 集群配置
此實(shí)驗(yàn)基于QJM 中的HM 大數(shù)據(jù)平臺(tái),利用HDFS 和Aookeeper 兩大工具,實(shí)現(xiàn)對(duì)本文中集群配置分布式管理。本文有5 個(gè)節(jié)點(diǎn)配置,如表1 所示,利用yarn 模型和局域網(wǎng)接入本平臺(tái),完成對(duì)平臺(tái)的線管資源分配和分布執(zhí)行任務(wù)。
3.1.1 和數(shù)據(jù)Partition 的關(guān)系
為了對(duì)訓(xùn)練中不同模型對(duì)訓(xùn)練時(shí)間的影響進(jìn)行評(píng)估,使用MovieLens 數(shù)據(jù)集(1 000 萬(wàn))進(jìn)行分區(qū)計(jì)算實(shí)驗(yàn),分區(qū)數(shù)和運(yùn)行時(shí)間之間的影響關(guān)系如圖8 所示。
圖8 分區(qū)數(shù)和運(yùn)行時(shí)間
通過(guò)圖8 可以看出,隨著分區(qū)數(shù)目的增多,對(duì)模型訓(xùn)練的運(yùn)行時(shí)間也減少;然后隨著分區(qū)數(shù)的增加,運(yùn)行時(shí)間并沒(méi)有隨著減少,而是在一定程度上增多。這是因?yàn)榉謪^(qū)使得計(jì)算機(jī)可以并行執(zhí)行,運(yùn)行時(shí)間會(huì)隨著分區(qū)數(shù)的增多而下降;但是隨著分區(qū)數(shù)的增多,負(fù)責(zé)傳輸?shù)耐ㄐ啪W(wǎng)絡(luò)的負(fù)擔(dān)會(huì)增加,導(dǎo)致對(duì)機(jī)器的訓(xùn)練時(shí)間增加,因此運(yùn)行時(shí)間沒(méi)有繼續(xù)下降反而小幅度上升。
3.1.2 算法運(yùn)行時(shí)間
通過(guò)算法在不同節(jié)點(diǎn)下的訓(xùn)練效果測(cè)試以及執(zhí)行時(shí)間測(cè)試展現(xiàn)算法的分布計(jì)算的效果,在MovieLens 數(shù)據(jù)集的m1-100k(1 萬(wàn)~10 萬(wàn))、m1-1m(100 萬(wàn))、m1-10m100k(1 000 萬(wàn))情況下開展實(shí)驗(yàn),最終實(shí)驗(yàn)結(jié)果如圖9 所示。
圖9 最終實(shí)驗(yàn)結(jié)果
圖9 中Spark 下Kmeans 算法在不同規(guī)模的節(jié)點(diǎn)數(shù)和不同大小的數(shù)據(jù)規(guī)模的運(yùn)行時(shí)間結(jié)果對(duì)比,發(fā)現(xiàn)在數(shù)據(jù)集在較小規(guī)模時(shí)使用KMeans 分類訓(xùn)練時(shí)間比較少,是因?yàn)榧河?jì)算要對(duì)任務(wù)進(jìn)行初始化,會(huì)消耗大量的時(shí)間和成本。在數(shù)據(jù)規(guī)模不斷增加的過(guò)程中,節(jié)點(diǎn)規(guī)模也會(huì)同時(shí)增加。另外發(fā)現(xiàn)在Spark 下的KMearns 算法下訓(xùn)練執(zhí)行并行計(jì)算有一定程度的優(yōu)勢(shì),主要是因?yàn)樵赟park 下Kmeans 算法在信息交互和任務(wù)調(diào)度相關(guān)初始化所用時(shí)間比較少,使得機(jī)器對(duì)數(shù)據(jù)載入學(xué)習(xí)的時(shí)間減少,且Spark下Kmeans 算法能夠?qū)?shù)據(jù)集均勻分成Data Block塊,在Worker 中開展并行計(jì)算,降低訓(xùn)練時(shí)間。實(shí)驗(yàn)結(jié)果表明,本文所設(shè)計(jì)系統(tǒng)的運(yùn)行時(shí)間、訓(xùn)練時(shí)間都比較優(yōu),并且在數(shù)據(jù)處理延遲方面表現(xiàn)良好。
對(duì)分布式計(jì)算框架和機(jī)器學(xué)習(xí)模型對(duì)不同分區(qū)數(shù)的學(xué)習(xí)效率的分析和研究表明,分布式計(jì)算對(duì)于機(jī)器學(xué)習(xí)有效地處理大數(shù)據(jù),對(duì)于人工智能的領(lǐng)域研究具有實(shí)際意義。本文的仿真實(shí)驗(yàn)和對(duì)比分析表明,基于分布式計(jì)算框架的機(jī)器學(xué)習(xí)系統(tǒng)可以提高訓(xùn)練樣本的大小,即增強(qiáng)了機(jī)器對(duì)大數(shù)據(jù)集的學(xué)習(xí)和充分挖掘有用信息的處理能力。機(jī)器學(xué)習(xí)利用大量數(shù)據(jù)樣本實(shí)現(xiàn)訓(xùn)練,通過(guò)不斷的優(yōu)化融合機(jī)器學(xué)習(xí)和大數(shù)據(jù)、分布式計(jì)算框架,提高兩者關(guān)聯(lián)性,實(shí)現(xiàn)數(shù)據(jù)挖掘過(guò)程與機(jī)器訓(xùn)練。在未來(lái)發(fā)展中,需要重點(diǎn)研究的內(nèi)容是以常用機(jī)器學(xué)習(xí)和數(shù)據(jù)分析算法針對(duì)矩陣函數(shù)實(shí)現(xiàn)更多功能,以應(yīng)用特性與平臺(tái)特性提煉更多物理與邏輯的優(yōu)化方法,針對(duì)已有多平臺(tái)調(diào)度優(yōu)化創(chuàng)建理論、精準(zhǔn)的實(shí)踐模型,使模型誤差得到降低。