DMLC深盟分布式深度机器学习开源平台解析
DMLC深盟分布式深度機(jī)器學(xué)習(xí)開源平臺解析
width="22" height="16" src="http://hits.sinajs.cn/A1/weiboshare.html?url=http%3A%2F%2Fwww.csdn.net%2Farticle%2F2015-05-21%2F2824742&type=3&count=&appkey=&title=%E6%9C%AC%E6%96%87%E7%94%B1DMLC%E5%88%86%E5%B8%83%E5%BC%8F%E6%B7%B1%E5%BA%A6%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE%EF%BC%88%E4%B8%AD%E6%96%87%E5%90%8D%E6%B7%B1%E7%9B%9F%EF%BC%89%E5%BC%80%E5%8F%91%E8%80%85%E8%81%94%E5%90%88%E6%92%B0%E5%86%99%EF%BC%8C%E4%BB%8B%E7%BB%8DDMLC%E5%B7%B2%E6%9C%89%E7%9A%84xgboost%E3%80%81cxxnet%E3%80%81Minerva%E3%80%81Parameter%20Server%E5%92%8CRabit%E7%AD%89%E7%BB%84%E4%BB%B6%E4%B8%BB%E8%A6%81%E8%A7%A3%E5%86%B3%E7%9A%84%E9%97%AE%E9%A2%98%E3%80%81%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F%E5%8F%8A%E5%85%B6%E6%80%A7%E8%83%BD%E8%A1%A8%E7%8E%B0%EF%BC%8C%E5%B9%B6%E7%AE%80%E8%A6%81%E8%AF%B4%E6%98%8E%E9%A1%B9%E7%9B%AE%E7%9A%84%E8%BF%91%E6%9C%9F%E8%A7%84%E5%88%92%E3%80%82&pic=&ralateUid=&language=zh_cn&rnd=1432472547536" frameborder="0" scrolling="no" allowtransparency="true">摘要:本文由DMLC分布式深度機(jī)器學(xué)習(xí)開源項(xiàng)目(中文名深盟)開發(fā)者聯(lián)合撰寫,介紹DMLC已有的xgboost、cxxnet、Minerva、Parameter Server和Rabit等組件主要解決的問題、實(shí)現(xiàn)方式及其性能表現(xiàn),并簡要說明項(xiàng)目的近期規(guī)劃。
【編者按】算法速度、系統(tǒng)性能以及易用性的瓶頸,制約著目前機(jī)器學(xué)習(xí)的普及應(yīng)用,DMLC分布式深度機(jī)器學(xué)習(xí)開源項(xiàng)目(中文名深盟)的誕生,正是要降低分布式機(jī)器學(xué)習(xí)的門檻。本文由深盟項(xiàng)目開發(fā)者聯(lián)合撰寫,將深入介紹深盟項(xiàng)目當(dāng)前已有的xgboost、cxxnet、Minerva、Parameter Server和Rabit等組件主要解決的問題、實(shí)現(xiàn)方式及其性能表現(xiàn),并簡要說明項(xiàng)目的近期規(guī)劃。文章將被收錄到《程序員》電子刊(2015.06A)人工智能實(shí)踐專題,以下為全文內(nèi)容:
機(jī)器學(xué)習(xí)能從數(shù)據(jù)中學(xué)習(xí)。通常數(shù)據(jù)越多,能學(xué)習(xí)到的模型就越好。在數(shù)據(jù)獲得越來越便利的今天,機(jī)器學(xué)習(xí)應(yīng)用無論在廣度上還是在深度上都有了顯著進(jìn)步。雖然近年來計(jì)算能力得到了大幅提高,但它仍然遠(yuǎn)遠(yuǎn)不及數(shù)據(jù)的增長和機(jī)器學(xué)習(xí)模型的復(fù)雜化。因此,機(jī)器學(xué)習(xí)算法速度和系統(tǒng)性能是目前工業(yè)界和學(xué)術(shù)界共同關(guān)心的熱點(diǎn)。
高性能和易用性的開源系統(tǒng)能對機(jī)器學(xué)習(xí)應(yīng)用的其極大的推動作用。但我們發(fā)現(xiàn)目前兼具這兩個(gè)特點(diǎn)的開源系統(tǒng)并不多,而且分散在各處。因此我們聯(lián)合數(shù)個(gè)已有且被廣泛使用的C++分布式機(jī)器學(xué)習(xí)系統(tǒng)的開發(fā)者,希望通過一個(gè)統(tǒng)一的組織來推動開源項(xiàng)目。我們?yōu)檫@個(gè)項(xiàng)目取名DMLC: Deep Machine Learning in Common,也可以認(rèn)為是Distributed Machine Learning in C++。中文名為深盟。代碼將統(tǒng)一發(fā)布在 https://github.com/dmlc。
這個(gè)項(xiàng)目將來自工業(yè)界和學(xué)術(shù)界的幾組開發(fā)人員拉到了一起,希望能提供更優(yōu)質(zhì)和更容易使用的分布式機(jī)器學(xué)習(xí)系統(tǒng),同時(shí)也希望吸引更多的開發(fā)者參與進(jìn)來。本文將介紹深盟項(xiàng)目目前已有的幾個(gè)部件,并簡要說明項(xiàng)目的近期規(guī)劃。
xgboost: 速度快效果好的Boosting模型
在數(shù)據(jù)建模中,當(dāng)我們有數(shù)個(gè)連續(xù)值特征時(shí),Boosting分類器是最常用的非線性分類器。它將成百上千個(gè)分類準(zhǔn)確率較低的樹模型組合起來,成為一個(gè)準(zhǔn)確率很高的模型。這個(gè)模型會不斷地迭代,每次迭代就生成一顆新的樹。然而,在數(shù)據(jù)集較大較復(fù)雜的時(shí)候,我們可能需要幾千次迭代運(yùn)算,這將造成巨大的計(jì)算瓶頸。
xgboost正是為了解決這個(gè)瓶頸而提出。單機(jī)它采用多線程來加速樹的構(gòu)建,并依賴深盟的另一個(gè)部件rabbit來進(jìn)行分布式計(jì)算。為了方便使用,xgboost提供了 Python和R語言接口。例如在R中進(jìn)行完整的訓(xùn)練和測試:
require(xgboost) data(agaricus.train, package='xgboost') data(agaricus.test, package='xgboost') train<- agaricus.train test<- agaricus.test bst<- xgboost(data = train$data, label = train$label, max.depth = 2, eta = 1, nround = 100, objective = "binary:logistic") pred<- predict(bst, test$data)由于其高效的C++實(shí)現(xiàn),xgboost在性能上超過了最常用使用的R包gbm和Python包sklearn。例如在Kaggle的希格斯子競賽數(shù)據(jù)上,單線程xgboost比其他兩個(gè)包均要快出50%,在多線程上xgboost更是有接近線性的性能提升。由于其性能和使用便利性,xgboost已經(jīng)在Kaggle競賽中被廣泛使用,并已經(jīng)有隊(duì)伍成功借助其拿到了第一名,如圖1所示。
?
圖1 xgboost和另外兩個(gè)常用包的性能對比
CXXNET:極致的C++深度學(xué)習(xí)庫
cxxnet是一個(gè)并行的深度神經(jīng)網(wǎng)絡(luò)計(jì)算庫,它繼承了xgboost的簡潔和極速的基因,并開始被越來越多人使用。例如Happy Lantern Festival團(tuán)隊(duì)借助Cxxnet在近期的Kaggle數(shù)據(jù)科學(xué)競賽中獲得了第二名。在技術(shù)上,cxxnet有如下兩個(gè)亮點(diǎn)。
靈活的公式支持和極致的C++模板編程
追求速度極致的開發(fā)者通常使用C++來實(shí)現(xiàn)深度神經(jīng)網(wǎng)絡(luò)。但往往需要給每個(gè)神經(jīng)網(wǎng)絡(luò)的層和更新公式編寫?yīng)毩⒌腃UDA kernel。很多以C++為核心的代碼之所以沒有向matlab/numpy那樣支持非常靈活的張量計(jì)算,是因?yàn)橐驗(yàn)檫\(yùn)算符重載和臨時(shí)空間的分配會帶來效率的降低。
然而,cxxnet利用深盟的mshadow提供了類似matlab/numpy的編程體驗(yàn),但同時(shí)保留了C++性能的高效性。其背后的核心思想是expression template,它通過模板編程技術(shù)將開發(fā)者寫的公式自動展開成優(yōu)化過的代碼,避免重載操作符等帶來的額外數(shù)據(jù)拷貝和系統(tǒng)消耗。另外,mshadow通過模板使得非常方便的講代碼切換到CPU還是GPU運(yùn)行。
通用的分布式解決方案
在分布式深度神經(jīng)網(wǎng)絡(luò)中,我們既要處理一臺機(jī)器多GPU卡,和多臺機(jī)器多GPU卡的情況。然而后者的延遲和帶寬遠(yuǎn)差于前者,因此需要對這種兩個(gè)情形做不同的技術(shù)考慮。cxxnet采用mshadow-ps這樣一個(gè)統(tǒng)一的參數(shù)共享接口,并利用接下來將要介紹Parameter Server實(shí)現(xiàn)了一個(gè)異步的通訊接口。其通過單機(jī)多卡和多機(jī)多卡采用不同的數(shù)據(jù)一致性模型來達(dá)到算法速度和系統(tǒng)性能的最佳平衡。
我們在單機(jī)4塊GTX 980顯卡的環(huán)境下測試了流行的圖片物體識別數(shù)據(jù)集ImageNet和神經(jīng)網(wǎng)絡(luò)配置AlexNet。在單卡上,cxxnet能夠處理244張圖片每秒,而在4卡上可以提供3.7倍的加速。性能超過另一個(gè)流行深度學(xué)習(xí)計(jì)算庫Caffe (均使用CUDA 6.5,未使用cuDNN加速)。
在多機(jī)情況下,我們使用Amazon EC2的GPU實(shí)例來測試性能。由于優(yōu)秀的異步通信,cxxnet打滿了機(jī)器的物理帶寬,并提供了幾乎是線性的加速比,如圖2所示。
圖2 cxxnet在Amazon EC2上的加速比
cxxnet的另外一些特性:
Minerva: 高效靈活的并行深度學(xué)習(xí)引擎
不同于cxxnet追求極致速度和易用性,Minerva則提供了一個(gè)高效靈活的平臺讓開發(fā)者快速實(shí)現(xiàn)一個(gè)高度定制化的深度神經(jīng)網(wǎng)絡(luò)。
Minerva在系統(tǒng)設(shè)計(jì)上使用分層的設(shè)計(jì)原則,將“算的快”這一對于系統(tǒng)底層的需求和“好用”這一對于系統(tǒng)接口的需求隔離開來,如圖3所示。在接口上,我們提供類似numpy的用戶接口,力圖做到友好并且能充分利用Python和numpy社區(qū)已有的算法庫。在底層上,我們采用數(shù)據(jù)流(Dataflow)計(jì)算引擎。其天然的并行性能夠高效地同時(shí)地利用多GPU進(jìn)行計(jì)算。Minerva通過惰性求值(Lazy Evaluation),將類numpy接口和數(shù)據(jù)流引擎結(jié)合起來,使得Minerva能夠既“好用”又“算得快”。
圖 3 Minerva的分層設(shè)計(jì)
惰性求值
Minerva通過自己實(shí)現(xiàn)的ndarray類型來支持常用的矩陣和多維向量操作。在命名和參數(shù)格式上都盡量和numpy保持一致。Minerva同時(shí)支持讀取Caffe的配置文件并進(jìn)行完整的訓(xùn)練。Minerva提供了兩個(gè)函數(shù)與numpy進(jìn)行對接。from_numpy函數(shù)和to_numpy函數(shù)能夠在numpy的ndarray與Minerva的類型之間互相轉(zhuǎn)換。因此,將Minerva和numpy混合使用將變得非常方便。
數(shù)據(jù)流引擎和多GPU計(jì)算
從Mapreduce到Spark到Naiad,數(shù)據(jù)流引擎一直是分布式系統(tǒng)領(lǐng)域研究的熱點(diǎn)。數(shù)據(jù)流引擎的特點(diǎn)是記錄任務(wù)和任務(wù)之間的依賴關(guān)系,然后根據(jù)依賴關(guān)系對任務(wù)進(jìn)行調(diào)度。沒有依賴的任務(wù)則可以并行執(zhí)行,因此數(shù)據(jù)流引擎具有天然的并行性。在Minerva中,我們利用數(shù)據(jù)流的思想將深度學(xué)習(xí)算法分布到多GPU上進(jìn)行計(jì)算。每一個(gè)ndarray運(yùn)算在Minerva中就是一個(gè)任務(wù),Minerva自身的調(diào)度器會根據(jù)依賴關(guān)系進(jìn)行執(zhí)行。用戶可以指定每個(gè)任務(wù)在哪塊卡上計(jì)算。因此如果兩個(gè)任務(wù)之間沒有依賴并且被分配到不同GPU上,那這兩個(gè)任務(wù)將能夠并行執(zhí)行。同時(shí),由于數(shù)據(jù)流調(diào)度是完全異步的,多卡間的數(shù)據(jù)通信也可以和其他任務(wù)并行執(zhí)行。由于這樣的設(shè)計(jì),Minerva在多卡上能夠做到接近線性加速比。此外,利用深盟的Parameter Server,Minerva可以輕松將數(shù)據(jù)流拓展到多機(jī)上,從而實(shí)現(xiàn)多卡多機(jī)的分布式訓(xùn)練。
圖4 ?Minerva和Caffe在單卡和多卡上訓(xùn)練GoogLeNet的比較
表1 Minerva在不同網(wǎng)絡(luò)模型和不同GPU數(shù)目上的訓(xùn)練速度
數(shù)據(jù)流引擎和多GPU計(jì)算
Minerva采用惰性求值的方式將類numpy接口和數(shù)據(jù)流引擎結(jié)合起來。每次用戶調(diào)用Minerva的ndarray運(yùn)算,系統(tǒng)并不立即執(zhí)行這一運(yùn)算,而是將這一運(yùn)算作為任務(wù),異步地交給底層數(shù)據(jù)流調(diào)度器進(jìn)行調(diào)度。之后,用戶的線程將繼續(xù)進(jìn)行執(zhí)行,并不會阻塞。這一做法帶來了許多好處:
- 在數(shù)據(jù)規(guī)模較大的機(jī)器學(xué)習(xí)任務(wù)中,文件I/O總是比較繁重的。而惰性求值使得用戶線程進(jìn)行I/O的同時(shí),系統(tǒng)底層能同時(shí)進(jìn)行計(jì)算。
- 由于用戶線程非常輕量,因此能將更多的任務(wù)交給系統(tǒng)底層。其中相互沒有依賴的任務(wù)則能并行運(yùn)算。
- 用戶能夠在接口上非常輕松地指定每個(gè)GPU上的計(jì)算任務(wù)。Minerva提供了set_device接口,其作用是在下一次set_device調(diào)用前的運(yùn)算都將會在指定的GPU上進(jìn)行執(zhí)行。由于所有的運(yùn)算都是惰性求值的,因此兩次set_device后的運(yùn)算可以幾乎同時(shí)進(jìn)行調(diào)度,從而達(dá)到多卡的并行。
Parameter Server: 一小時(shí)訓(xùn)練600T數(shù)據(jù)
深盟的組件參數(shù)服務(wù)器(Parameter Server)對前述的應(yīng)用提供分布式的系統(tǒng)支持。在大規(guī)模機(jī)器學(xué)習(xí)應(yīng)用里,訓(xùn)練數(shù)據(jù)和模型參數(shù)均可大到單臺機(jī)器無法處理。參數(shù)服務(wù)器的概念正是為解決此類問題而提出的。如圖5所示,參數(shù)以分布式形式存儲在一組服務(wù)節(jié)點(diǎn)中,訓(xùn)練數(shù)據(jù)則被劃分到不同的計(jì)算節(jié)點(diǎn)上。這兩組節(jié)點(diǎn)之間數(shù)據(jù)通信可歸納為發(fā)送(push)和獲取(pull)兩種。例如,一個(gè)計(jì)算節(jié)點(diǎn)既可以把自己計(jì)算得到的結(jié)果發(fā)送到所有服務(wù)節(jié)點(diǎn)上,也可以從服務(wù)節(jié)點(diǎn)上獲取新模型參數(shù)。在實(shí)際部署時(shí),通常有多組計(jì)算節(jié)點(diǎn)執(zhí)行不同的任務(wù),甚至是更新同樣一組模型參數(shù)。
圖5 參數(shù)服務(wù)器架構(gòu)
在技術(shù)上,參數(shù)服務(wù)器主要解決如下兩個(gè)分布式系統(tǒng)的技術(shù)難點(diǎn)。
降低網(wǎng)絡(luò)通信開銷
在分布式系統(tǒng)中,機(jī)器通過網(wǎng)絡(luò)通信來共同完成任務(wù)。但不論是按照延時(shí)還是按照帶寬,網(wǎng)絡(luò)通信速度都是本地內(nèi)存讀寫的數(shù)十或數(shù)百分之一。解決網(wǎng)絡(luò)通信瓶頸是設(shè)計(jì)分布式系統(tǒng)的關(guān)鍵。
異步執(zhí)行
在一般的機(jī)器學(xué)習(xí)算法中,計(jì)算節(jié)點(diǎn)的每一輪迭代可以劃分成CPU繁忙和網(wǎng)絡(luò)繁忙這兩個(gè)階段。前者通常是在計(jì)算梯度部分,后者則是在傳輸梯度數(shù)據(jù)和模型參數(shù)部分。串行執(zhí)行這兩個(gè)階段將導(dǎo)致CPU和網(wǎng)絡(luò)總有一個(gè)處于空閑狀態(tài)。我們可以通過異步執(zhí)行來提升資源利用率。例如,當(dāng)前一輪迭代的CPU繁忙階段完成時(shí),可直接開始進(jìn)行下一輪的CPU繁忙階段,而不是等到前一輪的網(wǎng)絡(luò)繁忙階段完成。這里我們隱藏了網(wǎng)絡(luò)通信開銷,從而將CPU的使用率最大化。但由于沒有等待前一輪更新的模型被取回,會導(dǎo)致這個(gè)計(jì)算節(jié)點(diǎn)的模型參數(shù)與服務(wù)節(jié)點(diǎn)處最新的參數(shù)不一致,由此可能會影響算法效率。
靈活的數(shù)據(jù)一致性模型
數(shù)據(jù)不一致性需要考慮提高算法效率和發(fā)揮系統(tǒng)性能之間的平衡。最好的平衡點(diǎn)取決于很多因素,例如CPU計(jì)算能力、網(wǎng)絡(luò)帶寬和算法的特性。我們發(fā)現(xiàn)很難有某個(gè)一致性模型能適合所有的機(jī)器學(xué)習(xí)問題。為此,參數(shù)服務(wù)器提供了一個(gè)靈活的方式用于表達(dá)一致性模型。
首先執(zhí)行程序被劃分為多個(gè)任務(wù)。一個(gè)任務(wù)類似于一個(gè)遠(yuǎn)程過程調(diào)用(Remote Procedure Call, RPC),可以是一個(gè)發(fā)送或一個(gè)獲取,或者任意一個(gè)用戶定義的函數(shù),例如一輪迭代。任務(wù)之間可以并行執(zhí)行,也可以加入依賴關(guān)系的控制邏輯,來串行執(zhí)行,以確保數(shù)據(jù)的一致性。所有這些任務(wù)和依賴關(guān)系組成一個(gè)有向無環(huán)圖,從而定義一個(gè)數(shù)據(jù)一致性模型,如圖6所示。
圖6 使用有向無環(huán)圖來定義數(shù)據(jù)一致性模型
如圖7所示,我們可以在相鄰任務(wù)之間加入依賴關(guān)系的控制邏輯,得到順序一致性模型,或者不引入任何依賴關(guān)系的邏輯控制,得到最終一致性模型。在這兩個(gè)極端模型之間是受限延時(shí)模型。這里一個(gè)任務(wù)可以和最近的數(shù)個(gè)任務(wù)并行執(zhí)行,但必須等待超過最大延時(shí)的未完成任務(wù)的完成。我們通過使用最大允許的延時(shí)來控制機(jī)器在此之前的數(shù)據(jù)不一致性。
圖7 不同數(shù)據(jù)一致性下運(yùn)行時(shí)間
圖8展示了在廣告點(diǎn)擊預(yù)測中(細(xì)節(jié)描述見后文),不同的一致性模型下得到同樣精度參數(shù)模型所花費(fèi)的時(shí)間。當(dāng)使用順序一致性模型時(shí)(0延時(shí)),一半的運(yùn)行時(shí)間花費(fèi)在等待上。當(dāng)我們逐漸放松數(shù)據(jù)一致性要求,可以看到計(jì)算時(shí)間隨著最大允許的延時(shí)緩慢上升,這是由于數(shù)據(jù)一致性減慢了算法的收斂速度,但由于能有效地隱藏網(wǎng)絡(luò)通信開銷,從而明顯降低了等待時(shí)間。在這個(gè)實(shí)驗(yàn)里,最佳平衡點(diǎn)是最大延時(shí)為8。
選擇性通信
任務(wù)之間的依賴關(guān)系可以控制任務(wù)間的數(shù)據(jù)一致性。而在一個(gè)任務(wù)內(nèi),我們可以通過自定義過濾器來細(xì)粒度地控制數(shù)據(jù)一致性。這是因?yàn)橐粋€(gè)節(jié)點(diǎn)通常在一個(gè)任務(wù)內(nèi)有數(shù)百或者更多對的關(guān)鍵字和值(key, value)需要通信傳輸,過濾器對這些關(guān)鍵字和值進(jìn)行選擇性的通信。例如我們可以將較上次同步改變值小于某個(gè)特定閾值的關(guān)鍵字和值過濾掉。再如,我們設(shè)計(jì)了一個(gè)基于算法最優(yōu)條件的KKT過濾器,它可過濾掉對參數(shù)影響弱的梯度。我們在實(shí)際中使用了這個(gè)過濾器,可以過濾掉至少95%的梯度值,從而節(jié)約了大量帶寬。
緩沖與壓縮
我們?yōu)閰?shù)服務(wù)器設(shè)計(jì)了基于區(qū)段的發(fā)送和獲取通信接口,既能靈活地滿足機(jī)器學(xué)習(xí)算法的通信需求,又盡可能地進(jìn)行批量通信。在訓(xùn)練過程中,通常是值發(fā)生變化,而關(guān)鍵字不變。因此可以讓發(fā)送和接收雙方緩沖關(guān)鍵字,避免重復(fù)發(fā)送。此外,考慮到算法或者自定義過濾器的特性,這些通信所傳輸?shù)臄?shù)值里可能存在大量“0”,因此可以利用數(shù)據(jù)壓縮有效減少通信量。
容災(zāi)
大規(guī)模機(jī)器學(xué)習(xí)任務(wù)通常需要大量機(jī)器且耗時(shí)長,運(yùn)行過程中容易發(fā)生機(jī)器故障或被其他優(yōu)先級高的任務(wù)搶占資源。為此,我們收集了一個(gè)數(shù)據(jù)中心中3個(gè)月內(nèi)所有的機(jī)器學(xué)習(xí)任務(wù)。根據(jù)“機(jī)器數(shù)×用時(shí)”的值,我們將任務(wù)分成大中小三類,并發(fā)現(xiàn)小任務(wù)(100機(jī)器時(shí))的平均失敗率是6.5%;中任務(wù)(1000機(jī)器時(shí))的失敗率超過了13%;而對于大任務(wù)(1萬機(jī)器時(shí)),每4個(gè)中至少有1個(gè)會執(zhí)行失敗。因此機(jī)器學(xué)習(xí)系統(tǒng)必須具備容災(zāi)功能。
參數(shù)服務(wù)器中服務(wù)節(jié)點(diǎn)和計(jì)算節(jié)點(diǎn)采用不同的容災(zāi)策略。對于計(jì)算節(jié)點(diǎn),可以采用重啟任務(wù),丟棄失敗節(jié)點(diǎn),或者其他與算法相關(guān)的策略。而服務(wù)節(jié)點(diǎn)維護(hù)的是全局參數(shù),若數(shù)據(jù)丟失和下線會嚴(yán)重影響應(yīng)用的運(yùn)行,因此對其數(shù)據(jù)一致性和恢復(fù)時(shí)效性要求更高。
參數(shù)服務(wù)器中服務(wù)節(jié)點(diǎn)的容災(zāi)采用的是一致性哈希和鏈備份。服務(wù)節(jié)點(diǎn)在存儲模型參數(shù)時(shí),通過一致性哈希協(xié)議維護(hù)一段或者數(shù)段參數(shù)。這個(gè)協(xié)議用于確保當(dāng)有服務(wù)節(jié)點(diǎn)發(fā)生變化時(shí),只有維護(hù)相鄰參數(shù)段的服務(wù)節(jié)點(diǎn)會受到影響。每個(gè)服務(wù)節(jié)點(diǎn)維護(hù)的參數(shù)同時(shí)會在數(shù)個(gè)其他服務(wù)節(jié)點(diǎn)上備份。當(dāng)一個(gè)服務(wù)節(jié)點(diǎn)收到來自計(jì)算節(jié)點(diǎn)的數(shù)據(jù)時(shí),它會先將此數(shù)據(jù)備份到其備份節(jié)點(diǎn)上,然后再通知計(jì)算節(jié)點(diǎn)操作完成。中間的任何失敗都會導(dǎo)致這次發(fā)送失敗,但不會造成數(shù)據(jù)的不一致。
鏈備份適用于任何機(jī)器學(xué)習(xí)算法,但會使網(wǎng)絡(luò)通信量成倍增長,從而可能形成性能瓶頸。對于某些算法,我們可以采用先聚合再備份的策略來減少通信。例如,在梯度下降算法里,每個(gè)服務(wù)節(jié)點(diǎn)先聚合來自所有計(jì)算節(jié)點(diǎn)的梯度,之后再更新模型參數(shù),因此可以只備份聚合后的梯度而非來自每個(gè)計(jì)算節(jié)點(diǎn)的梯度。聚合可以有效減少備份所需通信量,但聚合會使得通信的延遲增加。不過這可以通過前面描述的異步執(zhí)行來有效地隱藏。
在實(shí)現(xiàn)聚合鏈備份時(shí),我們可以使用向量鐘(vector clock)來記錄收到了哪些節(jié)點(diǎn)的數(shù)據(jù)。向量鐘允許我們準(zhǔn)確定位未完成的節(jié)點(diǎn),從而對節(jié)點(diǎn)變更帶來的影響進(jìn)行最小化。由于參數(shù)服務(wù)器的通信接口是基于區(qū)段發(fā)送的,所有區(qū)段內(nèi)的關(guān)鍵字可以共享同一個(gè)向量鐘來壓縮其存儲開銷。
圖8 三個(gè)系統(tǒng)在訓(xùn)練得到同樣精度的模型時(shí)所各花費(fèi)的時(shí)間
參數(shù)服務(wù)器不僅為深盟其他組件提供分布式支持,也可以直接在上面開發(fā)應(yīng)用。例如,我們實(shí)現(xiàn)了一個(gè)分塊的Proximal Gradient算法來解決稀疏的Logistic Regression,這是最常用的一個(gè)線性模型,被大量的使用在點(diǎn)擊預(yù)測等分類問題中。
為了測試算法性能,我們采集了636TB真實(shí)廣告點(diǎn)擊數(shù)據(jù),其中含有1700億樣本和650億特征,并使用1000臺機(jī)器共1.6萬核來進(jìn)行訓(xùn)練。我們使用兩個(gè)服務(wù)產(chǎn)品的私有系統(tǒng)(均基于參數(shù)服務(wù)器架構(gòu))作為基線。圖8展示的是這3個(gè)系統(tǒng)為了達(dá)到同樣精度的模型所花費(fèi)的時(shí)間。系統(tǒng)A使用了類梯度下降的算法(L-BFGS),但由于使用連續(xù)一致性模型,有30%的時(shí)間花費(fèi)在等待上。系統(tǒng)B則使用了分塊坐標(biāo)下降算法,由于比系統(tǒng)A使用的算法更加有效,因此用時(shí)比系統(tǒng)A少。但系統(tǒng)B也使用連續(xù)一致性模型,并且所需全局同步次數(shù)要比系統(tǒng)A更多,所以系統(tǒng)B的等待時(shí)間增加到了50%以上。我們在參數(shù)服務(wù)器實(shí)現(xiàn)了與系統(tǒng)B同樣的算法,但將一致性模型放松至受限延時(shí)一致性模型并應(yīng)用了KKT過濾。與系統(tǒng)B相比,參數(shù)服務(wù)器需要略多的計(jì)算時(shí)間,但其等待時(shí)間大幅降低。由于網(wǎng)絡(luò)開銷是這個(gè)算法的主要瓶頸,放松的一致性模型使得參數(shù)服務(wù)器的總體用時(shí)只是系統(tǒng)B的一半。
Rabit:靈活可靠的同步通信
除了Parameter Server提供的異步通信之外,以GBDT和L-BFGS為代表的許多機(jī)器學(xué)習(xí)算法依然適合采用同步通信 (BSP)的方式進(jìn)行交互。深盟的第二個(gè)通信框架Rabit提供了這一選擇。
傳統(tǒng)的同步通信機(jī)器學(xué)習(xí)程序往往采用MPI的Allreduce進(jìn)行計(jì)算,但是因?yàn)镸PI提供的接口過于復(fù)雜使得它并不容易提供容災(zāi)支持。Rabit簡化了MPI的設(shè)計(jì),抽取出機(jī)器學(xué)習(xí)最需要的Allreduce和Broadcast操作并加入了容災(zāi)的支持,使得基于分布式BSP的機(jī)器學(xué)習(xí)算法可以在部分節(jié)點(diǎn)出錯或丟失的情況下快速恢復(fù)計(jì)算,完成剩下的任務(wù)。目前的GBDT算法xgboost就是基于Rabit提供的接口。同時(shí),Rabit具有非常強(qiáng)的可移植性,目前支持在MPI、Hadoop Yarn和SunGrid Engine等各個(gè)平臺下直接執(zhí)行。異步的Parameter Server 接口加上同步的Rabit接口基本涵蓋了各種分布式機(jī)器學(xué)習(xí)算法需要的通信需求,使得我們可以很快地實(shí)現(xiàn)各種高效的分布式機(jī)器學(xué)習(xí)算法。
未來規(guī)劃
深盟目前已有的組件覆蓋三類最常用的機(jī)器學(xué)習(xí)算法,包括被廣泛用于排序的GBDT,用于點(diǎn)擊預(yù)測的稀疏線性模型,以及目前的研究熱點(diǎn)深度學(xué)習(xí)。未來深盟將致力于將實(shí)現(xiàn)和測試更多常用的機(jī)器學(xué)習(xí)算法,目前有數(shù)個(gè)算法正在開發(fā)中。另一方面,我們將更好的融合目前的組件,提供更加一致性的用戶體驗(yàn)。例如我們將對cxxnet和Minerva結(jié)合使得其既滿足對性能的苛刻要求,又能提供靈活的開發(fā)環(huán)境。
深盟另一個(gè)正在開發(fā)中的組件叫做蟲洞,它將大幅降低安裝和部署分布式機(jī)器學(xué)習(xí)應(yīng)用的門檻。具體來說,蟲洞將對所有組件提供一致的數(shù)據(jù)流支持,無論數(shù)據(jù)是以任何格式存在網(wǎng)絡(luò)共享磁盤,無論HDFS還是Amazon S3。此外,它還提供統(tǒng)一腳本來編譯和運(yùn)行所有組件。使得用戶既可以在方便的本地集群運(yùn)行深盟的任何一個(gè)分布式組件,又可以將任務(wù)提交到任何一個(gè)包括Amazon EC2、Microsfot Azure和Google Compute Engine在內(nèi)的云計(jì)算平臺,并提供自動的容災(zāi)管理。
這個(gè)項(xiàng)目最大的愿望就是能將分布式機(jī)器學(xué)習(xí)的門檻降低,使得更多個(gè)人和機(jī)構(gòu)能夠享受大數(shù)據(jù)帶來的便利。同時(shí)也希望能多的開發(fā)者能加入,聯(lián)合大家的力量一起把這個(gè)事情做好。(責(zé)編/周建丁)
參考文獻(xiàn)
[1] M. Li, D. G. Andersen, J. Park, A. J. Smola, A. Amhed, V. Josi- fovski, J. Long, E. Shekita, and B. Y. Su, Scaling distributed machine learning with the parameter server, in USENIX Symposium on Operating System Design and Implementation, 2014.?
[2] M. Li, D. G. Andersen, and A. J. Smola.Communication Efficient DistributedMachine Learning with the Parameter Server.In Neural Information Processing Systems, 2014.
[3] M. Li, 大數(shù)據(jù):系統(tǒng)遇上機(jī)器學(xué)習(xí)中國計(jì)算機(jī)學(xué)會通訊 2014 年 12 月
[4]Tianqichen, cxxnet和大規(guī)模深度學(xué)習(xí)http://www.weibo.com/p/1001603821399843149639
[5] Tianqi Chen, Tong He, Higgs Boson Discovery with Boosted Trees, Tech Report.
[6] 何通, xgboost: 速度快效果好的boosting模型, 統(tǒng)計(jì)之都http://cos.name/2015/03/xgboost/
[7] Minjie Wang, Tianjun Xiao, Jianpeng Li, Jiaxing Zhang, Chuntao Hong, Zheng Zhang, Minerva: A Scalable and Highly Efficient Training Platform for Deep Learning, Workshop, NIPS 14
作者背景
李沐 百度IDL深度學(xué)習(xí)實(shí)驗(yàn)室,卡內(nèi)基梅隆大學(xué)
陳天奇 華盛頓大學(xué)
王敏捷 紐約大學(xué)
余凱 百度IDL深度學(xué)習(xí)實(shí)驗(yàn)室
張崢 上海紐約大學(xué)
總結(jié)
以上是生活随笔為你收集整理的DMLC深盟分布式深度机器学习开源平台解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java开发与技术挑战——关于技术的技术
- 下一篇: 深度学习 vs. 大数据:神经网络权值的