摘要:算法速度系統(tǒng)性能以及易用性的瓶頸,制約著目前機(jī)器學(xué)習(xí)的普及應(yīng)用,分布式深度機(jī)器學(xué)習(xí)開(kāi)源項(xiàng)目中文名深盟的誕生,正是要降低分布式機(jī)器學(xué)習(xí)的門檻。因此我們聯(lián)合數(shù)個(gè)已有且被廣泛使用的分布式機(jī)器學(xué)習(xí)系統(tǒng)的開(kāi)發(fā)者,希望通過(guò)一個(gè)統(tǒng)一的組織來(lái)推動(dòng)開(kāi)源項(xiàng)目。
算法速度、系統(tǒng)性能以及易用性的瓶頸,制約著目前機(jī)器學(xué)習(xí)的普及應(yīng)用,DMLC分布式深度機(jī)器學(xué)習(xí)開(kāi)源項(xiàng)目(中文名深盟)的誕生,正是要降低分布式機(jī)器學(xué)習(xí)的門檻。本文由深盟項(xiàng)目開(kāi)發(fā)者聯(lián)合撰寫(xiě),將深入介紹深盟項(xiàng)目當(dāng)前已有的xgboost、cxxnet、Minerva和Parameter Server等組件主要解決的問(wèn)題、實(shí)現(xiàn)方式及其性能表現(xiàn),并簡(jiǎn)要說(shuō)明項(xiàng)目的近期規(guī)劃。文章將被收錄到《程序員》電子刊(2015.06A)人工智能實(shí)踐專題,以下為全文內(nèi)容:
機(jī)器學(xué)習(xí)能從數(shù)據(jù)中學(xué)習(xí)。通常數(shù)據(jù)越多,能學(xué)習(xí)到的模型就越好。在數(shù)據(jù)獲得越來(lái)越便利的今天,機(jī)器學(xué)習(xí)應(yīng)用無(wú)論在廣度上還是在深度上都有了顯著進(jìn)步。雖然近年來(lái)計(jì)算能力得到了大幅提高,但它仍然遠(yuǎn)遠(yuǎn)不及數(shù)據(jù)的增長(zhǎng)和機(jī)器學(xué)習(xí)模型的復(fù)雜化。因此,機(jī)器學(xué)習(xí)算法速度和系統(tǒng)性能是目前工業(yè)界和學(xué)術(shù)界共同關(guān)心的熱點(diǎn)。
高性能和易用性的開(kāi)源系統(tǒng)能對(duì)機(jī)器學(xué)習(xí)應(yīng)用的其極大的推動(dòng)作用。但我們發(fā)現(xiàn)目前兼具這兩個(gè)特點(diǎn)的開(kāi)源系統(tǒng)并不多,而且分散在各處。因此我們聯(lián)合數(shù)個(gè)已有且被廣泛使用的C++分布式機(jī)器學(xué)習(xí)系統(tǒng)的開(kāi)發(fā)者,希望通過(guò)一個(gè)統(tǒng)一的組織來(lái)推動(dòng)開(kāi)源項(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)目將來(lái)自工業(yè)界和學(xué)術(shù)界的幾組開(kāi)發(fā)人員拉到了一起,希望能提供更優(yōu)質(zhì)和更容易使用的分布式機(jī)器學(xué)習(xí)系統(tǒng),同時(shí)也希望吸引更多的開(kāi)發(fā)者參與進(jìn)來(lái)。本文將介紹深盟項(xiàng)目目前已有的幾個(gè)部件,并簡(jiǎn)要說(shuō)明項(xiàng)目的近期規(guī)劃。
xgboost: 速度快效果好的Boosting模型
在數(shù)據(jù)建模中,當(dāng)我們有數(shù)個(gè)連續(xù)值特征時(shí),Boosting分類器是最常用的非線性分類器。它將成百上千個(gè)分類準(zhǔn)確率較低的樹(shù)模型組合起來(lái),成為一個(gè)準(zhǔn)確率很高的模型。這個(gè)模型會(huì)不斷地迭代,每次迭代就生成一顆新的樹(shù)。然而,在數(shù)據(jù)集較大較復(fù)雜的時(shí)候,我們可能需要幾千次迭代運(yùn)算,這將造成巨大的計(jì)算瓶頸。
xgboost正是為了解決這個(gè)瓶頸而提出。單機(jī)它采用多線程來(lái)加速樹(shù)的構(gòu)建,并依賴深盟的另一個(gè)部件rabbit來(lái)進(jìn)行分布式計(jì)算。為了方便使用,xgboost提供了 Python和R語(yǔ)言接口。例如在R中進(jìn)行完整的訓(xùn)練和測(cè)試:
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在性能上超過(guò)了最常用使用的R包gbm和Python包sklearn。例如在Kaggle的希格斯子競(jìng)賽數(shù)據(jù)上,單線程xgboost比其他兩個(gè)包均要快出50%,在多線程上x(chóng)gboost更是有接近線性的性能提升。由于其性能和使用便利性,xgboost已經(jīng)在Kaggle競(jìng)賽中被廣泛使用,并已經(jīng)有隊(duì)伍成功借助其拿到了第一名,如圖1所示。
圖1 xgboost和另外兩個(gè)常用包的性能對(duì)比
CXXNET:極致的C++深度學(xué)習(xí)庫(kù)
cxxnet是一個(gè)并行的深度神經(jīng)網(wǎng)絡(luò)計(jì)算庫(kù),它繼承了xgboost的簡(jiǎn)潔和極速的基因,并開(kāi)始被越來(lái)越多人使用。例如Happy Lantern Festival團(tuán)隊(duì)借助Cxxnet在近期的Kaggle數(shù)據(jù)科學(xué)競(jìng)賽中獲得了第二名。在技術(shù)上,cxxnet有如下兩個(gè)亮點(diǎn)。
靈活的公式支持和極致的C++模板編程
追求速度極致的開(kāi)發(fā)者通常使用C++來(lái)實(shí)現(xiàn)深度神經(jīng)網(wǎng)絡(luò)。但往往需要給每個(gè)神經(jīng)網(wǎng)絡(luò)的層和更新公式編寫(xiě)?yīng)毩⒌腃UDA kernel。很多以C++為核心的代碼之所以沒(méi)有向matlab/numpy那樣支持非常靈活的張量計(jì)算,是因?yàn)橐驗(yàn)檫\(yùn)算符重載和臨時(shí)空間的分配會(huì)帶來(lái)效率的降低。
然而,cxxnet利用深盟的mshadow提供了類似matlab/numpy的編程體驗(yàn),但同時(shí)保留了C++性能的高效性。其背后的核心思想是expression template,它通過(guò)模板編程技術(shù)將開(kāi)發(fā)者寫(xiě)的公式自動(dòng)展開(kāi)成優(yōu)化過(guò)的代碼,避免重載操作符等帶來(lái)的額外數(shù)據(jù)拷貝和系統(tǒng)消耗。另外,mshadow通過(guò)模板使得非常方便的講代碼切換到CPU還是GPU運(yùn)行。
通用的分布式解決方案
在分布式深度神經(jīng)網(wǎng)絡(luò)中,我們既要處理一臺(tái)機(jī)器多GPU卡,和多臺(tái)機(jī)器多GPU卡的情況。然而后者的延遲和帶寬遠(yuǎn)差于前者,因此需要對(duì)這種兩個(gè)情形做不同的技術(shù)考慮。cxxnet采用mshadow-ps這樣一個(gè)統(tǒng)一的參數(shù)共享接口,并利用接下來(lái)將要介紹Parameter Server實(shí)現(xiàn)了一個(gè)異步的通訊接口。其通過(guò)單機(jī)多卡和多機(jī)多卡采用不同的數(shù)據(jù)一致性模型來(lái)達(dá)到算法速度和系統(tǒng)性能的較佳平衡。
我們?cè)趩螜C(jī)4塊GTX 980顯卡的環(huán)境下測(cè)試了流行的圖片物體識(shí)別數(shù)據(jù)集ImageNet和神經(jīng)網(wǎng)絡(luò)配置AlexNet。在單卡上,cxxnet能夠處理244張圖片每秒,而在4卡上可以提供3.7倍的加速。性能超過(guò)另一個(gè)流行深度學(xué)習(xí)計(jì)算庫(kù)Caffe (均使用CUDA 6.5,未使用cuDNN加速)。
在多機(jī)情況下,我們使用Amazon EC2的GPU實(shí)例來(lái)測(cè)試性能。由于優(yōu)秀的異步通信,cxxnet打滿了機(jī)器的物理帶寬,并提供了幾乎是線性的加速比,如圖2所示。
?
圖2 cxxnet在Amazon EC2上的加速比
cxxnet的另外一些特性:
輕量而齊全的框架:推薦環(huán)境下僅需要CUDA、OpenCV、MKL或BLAS即可編譯。
cuDNN支持:Nvidia原生卷積支持,可加速計(jì)算30%。
及時(shí)更新的技術(shù):及時(shí)跟進(jìn)學(xué)術(shù)界的動(dòng)態(tài),例如現(xiàn)在已經(jīng)支持MSRA的ParametricRelu和Google的Batch Normalization。
Caffe模型轉(zhuǎn)換:支持將訓(xùn)練好的Caffe模型直接轉(zhuǎn)化為cxxnet模型。
Minerva: 高效靈活的并行深度學(xué)習(xí)引擎
不同于cxxnet追求極致速度和易用性,Minerva則提供了一個(gè)高效靈活的平臺(tái)讓開(kāi)發(fā)者快速實(shí)現(xiàn)一個(gè)高度定制化的深度神經(jīng)網(wǎng)絡(luò)。
Minerva在系統(tǒng)設(shè)計(jì)上使用分層的設(shè)計(jì)原則,將“算的快”這一對(duì)于系統(tǒng)底層的需求和“好用”這一對(duì)于系統(tǒng)接口的需求隔離開(kāi)來(lái),如圖3所示。在接口上,我們提供類似numpy的用戶接口,力圖做到友好并且能充分利用Python和numpy社區(qū)已有的算法庫(kù)。在底層上,我們采用數(shù)據(jù)流(Dataflow)計(jì)算引擎。其天然的并行性能夠高效地同時(shí)地利用多GPU進(jìn)行計(jì)算。Minerva通過(guò)惰性求值(Lazy Evaluation),將類numpy接口和數(shù)據(jù)流引擎結(jié)合起來(lái),使得Minerva能夠既“好用”又“算得快”。
圖 3 Minerva的分層設(shè)計(jì)
惰性求值
Minerva通過(guò)自己實(shí)現(xiàn)的ndarray類型來(lái)支持常用的矩陣和多維向量操作。在命名和參數(shù)格式上都盡量和numpy保持一致。Minerva同時(shí)支持讀取Caffe的配置文件并進(jìn)行完整的訓(xùn)練。Minerva提供了兩個(gè)函數(shù)與numpy進(jìn)行對(duì)接。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)系對(duì)任務(wù)進(jìn)行調(diào)度。沒(méi)有依賴的任務(wù)則可以并行執(zhí)行,因此數(shù)據(jù)流引擎具有天然的并行性。在Minerva中,我們利用數(shù)據(jù)流的思想將深度學(xué)習(xí)算法分布到多GPU上進(jìn)行計(jì)算。每一個(gè)ndarray運(yùn)算在Minerva中就是一個(gè)任務(wù),Minerva自身的調(diào)度器會(huì)根據(jù)依賴關(guān)系進(jìn)行執(zhí)行。用戶可以指定每個(gè)任務(wù)在哪塊卡上計(jì)算。因此如果兩個(gè)任務(wù)之間沒(méi)有依賴并且被分配到不同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é)合起來(lái)。每次用戶調(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í)行,并不會(huì)阻塞。這一做法帶來(lái)了許多好處:
在數(shù)據(jù)規(guī)模較大的機(jī)器學(xué)習(xí)任務(wù)中,文件I/O總是比較繁重的。而惰性求值使得用戶線程進(jìn)行I/O的同時(shí),系統(tǒng)底層能同時(shí)進(jìn)行計(jì)算。
由于用戶線程非常輕量,因此能將更多的任務(wù)交給系統(tǒng)底層。其中相互沒(méi)有依賴的任務(wù)則能并行運(yùn)算。
用戶能夠在接口上非常輕松地指定每個(gè)GPU上的計(jì)算任務(wù)。Minerva提供了set_device接口,其作用是在下一次set_device調(diào)用前的運(yùn)算都將會(huì)在指定的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)對(duì)前述的應(yīng)用提供分布式的系統(tǒng)支持。在大規(guī)模機(jī)器學(xué)習(xí)應(yīng)用里,訓(xùn)練數(shù)據(jù)和模型參數(shù)均可大到單臺(tái)機(jī)器無(wú)法處理。參數(shù)服務(wù)器的概念正是為解決此類問(wèn)題而提出的。如圖5所示,參數(shù)以分布式形式存儲(chǔ)在一組服務(wù)節(jié)點(diǎn)中,訓(xùn)練數(shù)據(jù)則被劃分到不同的計(jì)算節(jié)點(diǎn)上。這兩組節(jié)點(diǎn)之間數(shù)據(jù)通信可歸納為發(fā)送(push)和獲?。╬ull)兩種。例如,一個(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ò)通信開(kāi)銷
在分布式系統(tǒng)中,機(jī)器通過(guò)網(wǎng)絡(luò)通信來(lái)共同完成任務(wù)。但不論是按照延時(shí)還是按照帶寬,網(wǎng)絡(luò)通信速度都是本地內(nèi)存讀寫(xiě)的數(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)。我們可以通過(guò)異步執(zhí)行來(lái)提升資源利用率。例如,當(dāng)前一輪迭代的CPU繁忙階段完成時(shí),可直接開(kāi)始進(jìn)行下一輪的CPU繁忙階段,而不是等到前一輪的網(wǎng)絡(luò)繁忙階段完成。這里我們隱藏了網(wǎng)絡(luò)通信開(kāi)銷,從而將CPU的使用率較大化。但由于沒(méi)有等待前一輪更新的模型被取回,會(huì)導(dǎo)致這個(gè)計(jì)算節(jié)點(diǎn)的模型參數(shù)與服務(wù)節(jié)點(diǎn)處的參數(shù)不一致,由此可能會(huì)影響算法效率。
靈活的數(shù)據(jù)一致性模型
數(shù)據(jù)不一致性需要考慮提高算法效率和發(fā)揮系統(tǒng)性能之間的平衡。較好的平衡點(diǎn)取決于很多因素,例如CPU計(jì)算能力、網(wǎng)絡(luò)帶寬和算法的特性。我們發(fā)現(xiàn)很難有某個(gè)一致性模型能適合所有的機(jī)器學(xué)習(xí)問(wèn)題。為此,參數(shù)服務(wù)器提供了一個(gè)靈活的方式用于表達(dá)一致性模型。
首先執(zhí)行程序被劃分為多個(gè)任務(wù)。一個(gè)任務(wù)類似于一個(gè)遠(yuǎn)程過(guò)程調(diào)用(Remote Procedure Call, RPC),可以是一個(gè)發(fā)送或一個(gè)獲取,或者任意一個(gè)用戶定義的函數(shù),例如一輪迭代。任務(wù)之間可以并行執(zhí)行,也可以加入依賴關(guān)系的控制邏輯,來(lái)串行執(zhí)行,以確保數(shù)據(jù)的一致性。所有這些任務(wù)和依賴關(guān)系組成一個(gè)有向無(wú)環(huán)圖,從而定義一個(gè)數(shù)據(jù)一致性模型,如圖6所示。
圖6 使用有向無(wú)環(huán)圖來(lái)定義數(shù)據(jù)一致性模型
如圖7所示,我們可以在相鄰任務(wù)之間加入依賴關(guān)系的控制邏輯,得到順序一致性模型,或者不引入任何依賴關(guān)系的邏輯控制,得到最終一致性模型。在這兩個(gè)極端模型之間是受限延時(shí)模型。這里一個(gè)任務(wù)可以和最近的數(shù)個(gè)任務(wù)并行執(zhí)行,但必須等待超過(guò)較大延時(shí)的未完成任務(wù)的完成。我們通過(guò)使用較大允許的延時(shí)來(lái)控制機(jī)器在此之前的數(shù)據(jù)不一致性。
?
圖7 不同數(shù)據(jù)一致性下運(yùn)行時(shí)間
圖8展示了在廣告點(diǎn)擊預(yù)測(cè)中(細(xì)節(jié)描述見(jiàn)后文),不同的一致性模型下得到同樣精度參數(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ò)通信開(kāi)銷,從而明顯降低了等待時(shí)間。在這個(gè)實(shí)驗(yàn)里,較佳平衡點(diǎn)是較大延時(shí)為8。
選擇性通信
任務(wù)之間的依賴關(guān)系可以控制任務(wù)間的數(shù)據(jù)一致性。而在一個(gè)任務(wù)內(nèi),我們可以通過(guò)自定義過(guò)濾器來(lái)細(xì)粒度地控制數(shù)據(jù)一致性。這是因?yàn)橐粋€(gè)節(jié)點(diǎn)通常在一個(gè)任務(wù)內(nèi)有數(shù)百或者更多對(duì)的關(guān)鍵字和值(key, value)需要通信傳輸,過(guò)濾器對(duì)這些關(guān)鍵字和值進(jìn)行選擇性的通信。例如我們可以將較上次同步改變值小于某個(gè)特定閾值的關(guān)鍵字和值過(guò)濾掉。再如,我們?cè)O(shè)計(jì)了一個(gè)基于算法最優(yōu)條件的KKT過(guò)濾器,它可過(guò)濾掉對(duì)參數(shù)影響弱的梯度。我們?cè)趯?shí)際中使用了這個(gè)過(guò)濾器,可以過(guò)濾掉至少95%的梯度值,從而節(jié)約了大量帶寬。
緩沖與壓縮
我們?yōu)閰?shù)服務(wù)器設(shè)計(jì)了基于區(qū)段的發(fā)送和獲取通信接口,既能靈活地滿足機(jī)器學(xué)習(xí)算法的通信需求,又盡可能地進(jìn)行批量通信。在訓(xùn)練過(guò)程中,通常是值發(fā)生變化,而關(guān)鍵字不變。因此可以讓發(fā)送和接收雙方緩沖關(guān)鍵字,避免重復(fù)發(fā)送。此外,考慮到算法或者自定義過(guò)濾器的特性,這些通信所傳輸?shù)臄?shù)值里可能存在大量“0”,因此可以利用數(shù)據(jù)壓縮有效減少通信量。
容災(zāi)
大規(guī)模機(jī)器學(xué)習(xí)任務(wù)通常需要大量機(jī)器且耗時(shí)長(zhǎng),運(yùn)行過(guò)程中容易發(fā)生機(jī)器故障或被其他優(yōu)先級(jí)高的任務(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í))的失敗率超過(guò)了13%;而對(duì)于大任務(wù)(1萬(wàn)機(jī)器時(shí)),每4個(gè)中至少有1個(gè)會(huì)執(zhí)行失敗。因此機(jī)器學(xué)習(xí)系統(tǒng)必須具備容災(zāi)功能。
參數(shù)服務(wù)器中服務(wù)節(jié)點(diǎn)和計(jì)算節(jié)點(diǎn)采用不同的容災(zāi)策略。對(duì)于計(jì)算節(jié)點(diǎn),可以采用重啟任務(wù),丟棄失敗節(jié)點(diǎn),或者其他與算法相關(guān)的策略。而服務(wù)節(jié)點(diǎn)維護(hù)的是全局參數(shù),若數(shù)據(jù)丟失和下線會(huì)嚴(yán)重影響應(yīng)用的運(yùn)行,因此對(duì)其數(shù)據(jù)一致性和恢復(fù)時(shí)效性要求更高。
參數(shù)服務(wù)器中服務(wù)節(jié)點(diǎn)的容災(zāi)采用的是一致性哈希和鏈備份。服務(wù)節(jié)點(diǎn)在存儲(chǔ)模型參數(shù)時(shí),通過(guò)一致性哈希協(xié)議維護(hù)一段或者數(shù)段參數(shù)。這個(gè)協(xié)議用于確保當(dāng)有服務(wù)節(jié)點(diǎn)發(fā)生變化時(shí),只有維護(hù)相鄰參數(shù)段的服務(wù)節(jié)點(diǎn)會(huì)受到影響。每個(gè)服務(wù)節(jié)點(diǎn)維護(hù)的參數(shù)同時(shí)會(huì)在數(shù)個(gè)其他服務(wù)節(jié)點(diǎn)上備份。當(dāng)一個(gè)服務(wù)節(jié)點(diǎn)收到來(lái)自計(jì)算節(jié)點(diǎn)的數(shù)據(jù)時(shí),它會(huì)先將此數(shù)據(jù)備份到其備份節(jié)點(diǎn)上,然后再通知計(jì)算節(jié)點(diǎn)操作完成。中間的任何失敗都會(huì)導(dǎo)致這次發(fā)送失敗,但不會(huì)造成數(shù)據(jù)的不一致。
鏈備份適用于任何機(jī)器學(xué)習(xí)算法,但會(huì)使網(wǎng)絡(luò)通信量成倍增長(zhǎng),從而可能形成性能瓶頸。對(duì)于某些算法,我們可以采用先聚合再備份的策略來(lái)減少通信。例如,在梯度下降算法里,每個(gè)服務(wù)節(jié)點(diǎn)先聚合來(lái)自所有計(jì)算節(jié)點(diǎn)的梯度,之后再更新模型參數(shù),因此可以只備份聚合后的梯度而非來(lái)自每個(gè)計(jì)算節(jié)點(diǎn)的梯度。聚合可以有效減少備份所需通信量,但聚合會(huì)使得通信的延遲增加。不過(guò)這可以通過(guò)前面描述的異步執(zhí)行來(lái)有效地隱藏。
在實(shí)現(xiàn)聚合鏈備份時(shí),我們可以使用向量鐘(vector clock)來(lái)記錄收到了哪些節(jié)點(diǎn)的數(shù)據(jù)。向量鐘允許我們準(zhǔn)確定位未完成的節(jié)點(diǎn),從而對(duì)節(jié)點(diǎn)變更帶來(lái)的影響進(jìn)行最小化。由于參數(shù)服務(wù)器的通信接口是基于區(qū)段發(fā)送的,所有區(qū)段內(nèi)的關(guān)鍵字可以共享同一個(gè)向量鐘來(lái)壓縮其存儲(chǔ)開(kāi)銷。
??
圖8 三個(gè)系統(tǒng)在訓(xùn)練得到同樣精度的模型時(shí)所各花費(fèi)的時(shí)間
參數(shù)服務(wù)器不僅為深盟其他組件提供分布式支持,也可以直接在上面開(kāi)發(fā)應(yīng)用。例如,我們實(shí)現(xiàn)了一個(gè)分塊的Proximal Gradient算法來(lái)解決稀疏的Logistic Regression,這是最常用的一個(gè)線性模型,被大量的使用在點(diǎn)擊預(yù)測(cè)等分類問(wèn)題中。
為了測(cè)試算法性能,我們采集了636TB真實(shí)廣告點(diǎn)擊數(shù)據(jù),其中含有1700億樣本和650億特征,并使用1000臺(tái)機(jī)器共1.6萬(wàn)核來(lái)進(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%以上。我們?cè)趨?shù)服務(wù)器實(shí)現(xiàn)了與系統(tǒng)B同樣的算法,但將一致性模型放松至受限延時(shí)一致性模型并應(yīng)用了KKT過(guò)濾。與系統(tǒng)B相比,參數(shù)服務(wù)器需要略多的計(jì)算時(shí)間,但其等待時(shí)間大幅降低。由于網(wǎng)絡(luò)開(kāi)銷是這個(gè)算法的主要瓶頸,放松的一致性模型使得參數(shù)服務(wù)器的總體用時(shí)只是系統(tǒng)B的一半。
未來(lái)規(guī)劃
深盟目前已有的組件覆蓋三類最常用的機(jī)器學(xué)習(xí)算法,包括被廣泛用于排序的GBDT,用于點(diǎn)擊預(yù)測(cè)的稀疏線性模型,以及目前的研究熱點(diǎn)深度學(xué)習(xí)。未來(lái)深盟將致力于將實(shí)現(xiàn)和測(cè)試更多常用的機(jī)器學(xué)習(xí)算法,目前有數(shù)個(gè)算法正在開(kāi)發(fā)中。另一方面,我們將更好的融合目前的組件,提供更加一致性的用戶體驗(yàn)。例如我們將對(duì)cxxnet和Minerva結(jié)合使得其既滿足對(duì)性能的苛刻要求,又能提供靈活的開(kāi)發(fā)環(huán)境。
深盟另一個(gè)正在開(kāi)發(fā)中的組件叫做蟲(chóng)洞,它將大幅降低安裝和部署分布式機(jī)器學(xué)習(xí)應(yīng)用的門檻。具體來(lái)說(shuō),蟲(chóng)洞將對(duì)所有組件提供一致的數(shù)據(jù)流支持,無(wú)論數(shù)據(jù)是以任何格式存在網(wǎng)絡(luò)共享磁盤(pán),無(wú)論HDFS還是Amazon S3。此外,它還提供統(tǒng)一腳本來(lái)編譯和運(yùn)行所有組件。使得用戶既可以在方便的本地集群運(yùn)行深盟的任何一個(gè)分布式組件,又可以將任務(wù)提交到任何一個(gè)包括Amazon EC2、Microsfot Azure和Google Compute Engine在內(nèi)的云計(jì)算平臺(tái),并提供自動(dòng)的容災(zāi)管理。
這個(gè)項(xiàng)目較大的愿望就是能將分布式機(jī)器學(xué)習(xí)的門檻降低,使得更多個(gè)人和機(jī)構(gòu)能夠享受大數(shù)據(jù)帶來(lái)的便利。同時(shí)也希望能多的開(kāi)發(fā)者能加入,聯(lián)合大家的力量一起把這個(gè)事情做好。(責(zé)編/周建?。?/p>
參考文獻(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í)中國(guó)計(jì)算機(jī)學(xué)會(huì)通訊 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é)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/4315.html
摘要:國(guó)內(nèi)互聯(lián)網(wǎng)巨頭百度也在近期表明,將發(fā)起建立一個(gè)名為深盟的分布式機(jī)器學(xué)習(xí)開(kāi)源平臺(tái),由旗下深度學(xué)習(xí)研究院牽頭,聯(lián)合來(lái)自卡耐基梅隴大學(xué)華盛頓大學(xué)紐約大學(xué)香港科技大學(xué)的多位系統(tǒng)開(kāi)發(fā)者,共同推出旨在大幅降低機(jī)器深度學(xué)習(xí)門檻的蟲(chóng)洞項(xiàng)目。 當(dāng)前人工智能之所以能夠引起大家的興奮和廣泛關(guān)注,在很大程度上是源于深度學(xué)習(xí)的研究進(jìn)展。這項(xiàng)機(jī)器學(xué)習(xí)技術(shù)為計(jì)算機(jī)視覺(jué)、語(yǔ)音識(shí)別和自然語(yǔ)言處理帶來(lái)了巨大的、激動(dòng)人心的進(jìn)步,...
摘要:而道器相融,在我看來(lái),那煉丹就需要一個(gè)好的丹爐了,也就是一個(gè)優(yōu)秀的機(jī)器學(xué)習(xí)平臺(tái)。因此,一個(gè)機(jī)器學(xué)習(xí)平臺(tái)要取得成功,最好具備如下五個(gè)特點(diǎn)精辟的核心抽象一個(gè)機(jī)器學(xué)習(xí)平臺(tái),必須有其靈魂,也就是它的核心抽象。 *本文首發(fā)于 AI前線 ,歡迎轉(zhuǎn)載,并請(qǐng)注明出處。 摘要 2017年6月,騰訊正式開(kāi)源面向機(jī)器學(xué)習(xí)的第三代高性能計(jì)算平臺(tái) Angel,在GitHub上備受關(guān)注;2017年10月19日,騰...
摘要:亞馬遜和華盛頓大學(xué)今天合作發(fā)布了開(kāi)源的端到端深度學(xué)習(xí)編譯器。項(xiàng)目作者之一陳天奇在微博上這樣介紹這個(gè)編譯器我們今天發(fā)布了基于工具鏈的深度學(xué)習(xí)編譯器。陳天奇團(tuán)隊(duì)對(duì)的性能進(jìn)行了基準(zhǔn)測(cè)試,并與進(jìn)行了比較。 亞馬遜和華盛頓大學(xué)今天合作發(fā)布了開(kāi)源的端到端深度學(xué)習(xí)編譯器NNVM compiler。先提醒一句,NNVM compiler ≠ NNVM。NNVM是華盛頓大學(xué)博士陳天奇等人2016年發(fā)布的模塊化...
摘要:簡(jiǎn)稱,是基于聚焦行業(yè)應(yīng)用且提供商業(yè)支持的分布式深度學(xué)習(xí)框架,其宗旨是在合理的時(shí)間內(nèi)解決各類涉及大量數(shù)據(jù)的問(wèn)題。是負(fù)責(zé)開(kāi)發(fā)的用編寫(xiě),通過(guò)引擎加速的深度學(xué)習(xí)框架,是目前受關(guān)注最多的深度學(xué)習(xí)框架。 作者簡(jiǎn)介魏秀參,曠視科技 Face++ 南京研究院負(fù)責(zé)人。南京大學(xué) LAMDA 研究所博士,主要研究領(lǐng)域?yàn)橛?jì)算機(jī)視覺(jué)和機(jī)器學(xué)習(xí)。在相關(guān)領(lǐng)域較高級(jí)國(guó)際期刊如 IEEE TIP、IEEE TNNLS、Mac...
閱讀 834·2023-04-26 00:13
閱讀 2836·2021-11-23 10:08
閱讀 2455·2021-09-01 10:41
閱讀 2121·2021-08-27 16:25
閱讀 4205·2021-07-30 15:14
閱讀 2367·2019-08-30 15:54
閱讀 867·2019-08-29 16:22
閱讀 2744·2019-08-26 12:13