最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

參數(shù)服務(wù)器(Parameter Server)逐段精讀【論文精讀】

2022-05-06 23:33 作者:如果我是泡橘子  | 我要投稿

Scaling Distributed Machine Learning with the Parameter Server


如果說(shuō) AI 相對(duì)于計(jì)算機(jī)別的領(lǐng)域,比如編程領(lǐng)域已經(jīng)算比較小的i情況下,那么系統(tǒng)領(lǐng)域相對(duì)于 AI 來(lái)講就小了十倍不止了,作為 AI 和系統(tǒng)相結(jié)合的交叉方向就更小了,因此受眾也比較少


這篇文章發(fā)表于 2014 年,會(huì)議的名稱叫做操作系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)(Operating Systems Design and Implementation,OSDI)


這里的系統(tǒng)指的是操作系統(tǒng),類似的方向還有編譯器方向、編程語(yǔ)言方向、高性能計(jì)算方向或者是體系結(jié)構(gòu)方向等,對(duì)于 AI 來(lái)講,這些方向可能看起來(lái)都是偏編程、偏底層的方向,但是實(shí)際上領(lǐng)域和領(lǐng)域之間的區(qū)分度還是比較大的


操作系統(tǒng)

  • 一開始大家所關(guān)注的是 Linux、Windows 這樣的操作系統(tǒng)的實(shí)現(xiàn)
  • 但是多年之后,現(xiàn)在能做的東西也不多了,這個(gè)領(lǐng)域的論文也在過(guò)去一些年發(fā)生了一些變化:二零零年比較有名的論文包括互聯(lián)網(wǎng)公司的一些技術(shù)架構(gòu),比如 Google 的文件系統(tǒng) GFS 或者是 Google 的計(jì)算框架 MapReduce


OSDI 會(huì)議

  • 當(dāng)時(shí)是兩年開一次
  • 整個(gè)系統(tǒng)領(lǐng)域兩大頂級(jí)會(huì)議之一,另外一個(gè)頂級(jí)會(huì)議叫做 SOSP(OS 也是操作系統(tǒng)的意思,也是兩年開一次),OSDI 和 SOSP 這兩個(gè)會(huì)議是每年輪著開的,現(xiàn)在隨著人數(shù)的增加也改成一年開一次了





標(biāo)題


使用參數(shù)服務(wù)器來(lái)拓展分布式機(jī)器學(xué)習(xí)


學(xué)術(shù)界對(duì)大數(shù)據(jù)的理解和工業(yè)界對(duì)大數(shù)據(jù)的理解的差別:

學(xué)術(shù)界對(duì)大數(shù)據(jù)的理解是一個(gè)數(shù)據(jù)不能用一個(gè)郵件來(lái)發(fā),而是要通過(guò) U 盤來(lái)拷貝了。這也就意味著數(shù)據(jù)其實(shí)是能夠拷貝在 U 盤上面的,可能最大也就幾個(gè) GB

工業(yè)界的大數(shù)據(jù)是 TB 起步的,不可能一下子就拷貝到 U 盤上面,而且耗時(shí)比較長(zhǎng)


本文的寫作目的旨在介紹什么是真正的大規(guī)模機(jī)器學(xué)習(xí)





論文結(jié)構(gòu)


摘要

  • 比較短



引言

  • 引言比較長(zhǎng),大概有兩頁(yè)多
  • 雖然里面包含了相關(guān)工作,但是為了把整個(gè)故事講得足夠清楚,所以引言花的篇幅比較長(zhǎng)



機(jī)器學(xué)習(xí)

  • 也是比較長(zhǎng),大概有兩頁(yè)半
  • 為什么叫機(jī)器學(xué)習(xí)?因?yàn)楫?dāng)時(shí)系統(tǒng)領(lǐng)域?qū)C(jī)器學(xué)習(xí)是不太熟悉的,所以需要花很長(zhǎng)的篇幅用系統(tǒng)領(lǐng)域研究人員能懂的語(yǔ)言來(lái)解釋機(jī)器學(xué)習(xí)是干什么的,以此來(lái)給讀者介紹一下背景知識(shí)



系統(tǒng)架構(gòu)

  • 大概兩頁(yè)多一點(diǎn)的篇幅



實(shí)現(xiàn)細(xì)節(jié)

  • 差不多兩頁(yè)



實(shí)驗(yàn)單元



總結(jié)



一共 14 頁(yè),相對(duì)于機(jī)器學(xué)習(xí) NeurIPS 或者 ICML 來(lái)說(shuō),篇幅相對(duì)來(lái)說(shuō)是比較長(zhǎng)的,這也是系統(tǒng)領(lǐng)域的論文比較難寫的一個(gè)原因

  • 之所以系統(tǒng)領(lǐng)域的論文比較長(zhǎng),是因?yàn)橐粋€(gè)系統(tǒng)的工作通常需要寫幾千行的代碼將系統(tǒng)搭建出來(lái),然后才能做實(shí)驗(yàn)。在系統(tǒng)中存在很多模塊的情況下,在論文中需要將這些模塊描述清楚,用文字進(jìn)行描述所以篇幅會(huì)比較長(zhǎng)
  • 機(jī)器學(xué)習(xí)的算法,如果還不是深度學(xué)習(xí)的算法,僅僅是傳統(tǒng)一點(diǎn)的機(jī)器學(xué)習(xí)的話,整個(gè)模型可能實(shí)現(xiàn)起來(lái)只有幾行代碼,所以寫出來(lái)相對(duì)來(lái)講比較容易。就算是深度學(xué)習(xí),就算是將代碼附到文章中,可能篇幅也不會(huì)太長(zhǎng)


這篇文章幾乎是沒有什么公式的,在但是深度學(xué)習(xí)還不是特別流行的年代,一篇機(jī)器學(xué)習(xí)的文章不講公式,描述起來(lái)會(huì)比較困難,所以這篇文章的機(jī)器學(xué)習(xí)部分的難點(diǎn)在于需要將機(jī)器學(xué)習(xí)領(lǐng)域相關(guān)的內(nèi)容用系統(tǒng)領(lǐng)域研究人員能夠理解的語(yǔ)言描述出來(lái),而且盡量不要涉及太多的專業(yè)知識(shí)





摘要


本文提出了一個(gè)參數(shù)服務(wù)器的框架,用來(lái)針對(duì)分布式的機(jī)器學(xué)習(xí)任務(wù)

  • 數(shù)據(jù)和任務(wù)都分布在一些任務(wù)節(jié)點(diǎn)上或者工作節(jié)點(diǎn)上
  • 用一些服務(wù)器節(jié)點(diǎn)來(lái)維護(hù)一個(gè)全局共享的參數(shù),這些參數(shù)通常會(huì)表示成一個(gè)稠密或者稀疏的向量或者矩陣



這個(gè)框架用來(lái)管理異步的數(shù)據(jù)通訊,并且支持一些靈活的一致性模型,具有彈性的可擴(kuò)展性和持續(xù)的容災(zāi)



為了展示系統(tǒng)的性能,使用了一些 pb 級(jí)別的真實(shí)數(shù)據(jù)做了一些實(shí)驗(yàn),這些任務(wù)中都含有 10 億級(jí)別的樣本和參數(shù)

  • 這些實(shí)驗(yàn)包括稀疏的 Logist 回歸、LDA 聚類算法和分布式的 Sketching
  • 就算這個(gè)工作是在八年前,在當(dāng)時(shí)來(lái)講,數(shù)據(jù)量和和可學(xué)習(xí)的參數(shù)量也已經(jīng)非常大了,都是在 10 億級(jí)別以上



所以在深度學(xué)習(xí)出來(lái)之后,它的分布式的問題是一個(gè)很簡(jiǎn)單的問題,直到最近的比較大的語(yǔ)言模型出來(lái)之前,深度學(xué)習(xí)的分布式都沒有特別好做的地方,但是現(xiàn)在因?yàn)槿蝿?wù)已經(jīng)足夠大了,所以對(duì)于深度學(xué)習(xí)的分布式來(lái)講,又有了新的挑戰(zhàn)



摘要中所用的句式都是很短的句式,系統(tǒng)方向的人的寫作喜歡用比較短的句式,這樣整體來(lái)講寫起來(lái)簡(jiǎn)單而且強(qiáng)有力





導(dǎo)言


所研究的問題以及這個(gè)問題的重要性


分布式的優(yōu)化和推理現(xiàn)在已經(jīng)成為了解決大規(guī)模機(jī)器學(xué)習(xí)問題的一個(gè)前置條件。當(dāng)規(guī)模很大的時(shí)候,沒有一臺(tái)機(jī)器能夠在足夠快的情況下解決這個(gè)問題(大規(guī)模機(jī)器學(xué)習(xí)問題)

  • 理論上講,一臺(tái)機(jī)器慢慢跑總是能夠跑完的,但是實(shí)際上在現(xiàn)實(shí)生活中還是需要在幾個(gè)小時(shí)或者是幾天的時(shí)間里面完成(因?yàn)閿?shù)據(jù)在不斷地增加,模型的復(fù)雜度也在不停地增長(zhǎng),而且復(fù)雜的模型通常會(huì)導(dǎo)致參數(shù)地變動(dòng))



但是實(shí)現(xiàn)一個(gè)非常有效的分布式算法是非常難的

  • 實(shí)現(xiàn)一個(gè)分布式算法是不難的,但是實(shí)現(xiàn)一個(gè)性能很高的分布式算法是非常難的
  • 摩爾(英特爾的創(chuàng)始人)曾經(jīng)說(shuō)過(guò)做一個(gè) CPU 并不難,但是做一個(gè)性能很好的 CPU 是相當(dāng)困難的
  • 主要是因?yàn)橛?jì)算的復(fù)雜度比較高,而且所帶來(lái)的數(shù)據(jù)通訊量也會(huì)比較大,所以如何有效地處理這兩點(diǎn)是一個(gè)高效的分布式系統(tǒng)所要考慮的事情





具體的痛點(diǎn)


在現(xiàn)實(shí)情況下,這些大規(guī)模機(jī)器學(xué)習(xí)的訓(xùn)練數(shù)據(jù)大小一般是在 1 TB ~ 1 PB

  • 雖然這個(gè)數(shù)據(jù)是在 8 年前論文所發(fā)表的時(shí)候,但是現(xiàn)在看來(lái),數(shù)據(jù)量也是在這個(gè)規(guī)模,但很多時(shí)候深度學(xué)習(xí)得數(shù)據(jù)壓縮完可能還不到 1 TB



大量的數(shù)據(jù)允許創(chuàng)造更加復(fù)雜的模型,這些模型可能有 10 億 ~ 1 千億個(gè)參數(shù)?,F(xiàn)在最大的語(yǔ)言模型的參數(shù)量大概也是在 10 億到 1 千億。這些模型需要被全局共享,所有的計(jì)算節(jié)點(diǎn)都要去訪問這些模型,這樣就會(huì)帶來(lái)很多的問題

  1. 所有的計(jì)算節(jié)點(diǎn)都會(huì)頻繁地訪問這些參數(shù),就會(huì)導(dǎo)致大量的網(wǎng)絡(luò)通訊
  2. 機(jī)器學(xué)習(xí)算法都是一個(gè)順序的模型,算完第一個(gè)小批量之后才能計(jì)算第二個(gè)小批量,這就會(huì)導(dǎo)致大量的全局同步,從而影響模型的性能
  3. 當(dāng)計(jì)算規(guī)模比較大,需要使用成百上千的計(jì)算機(jī)來(lái)做運(yùn)算的時(shí)候,容災(zāi)就顯得比較重要了
  • 容災(zāi):一臺(tái)機(jī)器宕機(jī)或者有其他任務(wù)將其從當(dāng)前任務(wù)中挪走的情況下,整個(gè)訓(xùn)練過(guò)程還是能夠繼續(xù)計(jì)算下去


表 1



為了展現(xiàn)最后一點(diǎn),作者在一個(gè)公司的數(shù)據(jù)中心收集了它過(guò)去三個(gè)月所有的訓(xùn)練日志,并將這些任務(wù)按照機(jī)器 × 時(shí)間(如果 100 個(gè)機(jī)器跑 1 個(gè)小時(shí)就是 100 個(gè)小時(shí))并分成了三檔:

  1. 100 小時(shí):小規(guī)模
  2. 1000 小時(shí):中規(guī)模
  3. 10000 小時(shí):大規(guī)模

從上表中可以看出:雖然絕大部分的任務(wù)都是 100 小時(shí)級(jí)別的,失敗的概率為 7.8% ,但是隨著規(guī)模的增大,到 10000 小時(shí)級(jí)別的時(shí)候( 3 個(gè)月中有 77 個(gè)任務(wù)有 10000 個(gè)小時(shí)),失敗的概率就從 7.8% 提高到了 24.7%,也就是說(shuō)四分之一的任務(wù)都會(huì)失敗

  • 任務(wù)的規(guī)模越大,任務(wù)失敗的概率就越高。因?yàn)殡S著做運(yùn)算的機(jī)器和訓(xùn)練時(shí)間的增加,這些機(jī)器出現(xiàn)問題的概率還是比較大的
  • 比機(jī)器出現(xiàn)問題的概率更高的是軟件層面上的一些問題,比如某一臺(tái)機(jī)器的磁盤突然滿了、機(jī)器被其他任務(wù)搶走了或者整個(gè)模型的架構(gòu)本身不穩(wěn)定等



雖然現(xiàn)在整個(gè)系統(tǒng)機(jī)器的穩(wěn)定性和模型基礎(chǔ)架構(gòu)的穩(wěn)定性已經(jīng)比之前有很大的進(jìn)步了,但是實(shí)際上如今在跑大規(guī)模的任務(wù)(用 1000 塊或者 10000 塊 GPU 去訓(xùn)練一個(gè)特別大的語(yǔ)言模型)時(shí),任務(wù)失敗的概率依然是非常高的,主要存在兩個(gè)問題:

  1. 機(jī)器容易過(guò)熱。顯卡在持續(xù)工作的過(guò)程中,在電量要求比較大的時(shí)候,由于風(fēng)扇的轉(zhuǎn)速?zèng)]有跟上導(dǎo)致過(guò)熱降頻
  2. Nvidia 的驅(qū)動(dòng)偶爾會(huì)出現(xiàn)一些問題。在分布式中,驅(qū)動(dòng)可能在通訊的時(shí)候會(huì)出現(xiàn)問題

這些問題都是可以被解決的,但是一旦系統(tǒng)變得更加復(fù)雜,就可能會(huì)有新的模塊出現(xiàn)問題,導(dǎo)致在大規(guī)模訓(xùn)練時(shí),任務(wù)的成功率依舊不高



這個(gè)表格主要講述的是為什么要在機(jī)器學(xué)習(xí)里面做容災(zāi)



不像許多實(shí)驗(yàn)室里的那樣,所有的任務(wù)都是獨(dú)占一個(gè)集群在運(yùn)行。在工業(yè)界真是的應(yīng)用場(chǎng)景中,容災(zāi)是非常重要的



引言的前半部分講的是所需要解決的三大痛點(diǎn)

  1. 網(wǎng)絡(luò)帶寬的利用
  2. 機(jī)器學(xué)習(xí)算法需要不斷地做全局通訊
  3. 容災(zāi)





1、貢獻(xiàn)


參數(shù)服務(wù)器框架在參考文獻(xiàn)【43】這篇文章出來(lái)之后,在工業(yè)界和學(xué)術(shù)界都沒有被使用

  • 當(dāng)時(shí)這個(gè)框架主要是給 LDA 一個(gè)聚類的算法所使用的,所以之前關(guān)注的不是很多
  • 直到一兩年之后 Jeff Dean 寫了一篇文章,提出了 TensorFlow 的前身,使用的是參數(shù)服務(wù)器實(shí)現(xiàn)的,后續(xù)才有了大量的研究者跟進(jìn)



如果將參考文獻(xiàn)【43】稱為第一代,Jeff Dean 所提出的工作稱為第二代的話,那么本文所提出的就是第三代的開源實(shí)現(xiàn),主要有兩個(gè)好處

1、將整個(gè)框架中共享的一些模塊抽象出來(lái)之后,易于實(shí)現(xiàn)任務(wù)相關(guān)的代碼,而不像幾天做深度學(xué)習(xí)的時(shí)候可能跑一個(gè) SGD 就可以了

  • 八年前當(dāng)時(shí)的機(jī)器學(xué)習(xí)比較多樣化,優(yōu)化算法的種類繁多,因此需要做到框架設(shè)定要比較簡(jiǎn)單,而且能夠適配到各種不同的算法上面,所以提供了高性能的實(shí)現(xiàn),同時(shí)能夠處理很多不一樣的算法,包括了稀疏的 Logistic 回歸、topic model(LDA,可以認(rèn)為是一個(gè)話題模型、聚類算法或者是分布式的 sketching)

本文所提出的框架是根據(jù)真實(shí)的系統(tǒng)所設(shè)計(jì)的

  • 當(dāng)時(shí)在學(xué)校中關(guān)于系統(tǒng)和機(jī)器學(xué)習(xí)結(jié)合的研究都存在一個(gè)問題:并不真正清楚機(jī)器學(xué)習(xí)在工業(yè)界的具體實(shí)現(xiàn),只是將一些論文中的機(jī)器學(xué)習(xí)算法盲目地?cái)U(kuò)大 10 倍或者 100 倍,然后再看如何去設(shè)計(jì),但是實(shí)際上在在現(xiàn)實(shí)生活中并不會(huì)盲目地進(jìn)行擴(kuò)大,所以導(dǎo)致在設(shè)計(jì)上會(huì)出現(xiàn)偏差
  • 這里所要強(qiáng)調(diào)地是根據(jù)真實(shí)的計(jì)算任務(wù)來(lái)進(jìn)行系統(tǒng)級(jí)別的抽象



本文所提出的參數(shù)服務(wù)器有五個(gè)關(guān)鍵性的特征:

1、有效通訊。使用異步通訊的方法,同時(shí)針對(duì)機(jī)器學(xué)習(xí)算法進(jìn)行了大量的壓縮,從而降低通訊量的規(guī)模

2、靈活的一致性的模型。一致性是說(shuō)每一個(gè)計(jì)算節(jié)點(diǎn)對(duì)同樣一個(gè)參數(shù)(比如說(shuō)參數(shù) W0)在任何時(shí)刻是不是存在一致性。

  • 比如說(shuō)兩臺(tái)機(jī)器訪問同一個(gè)值的時(shí)候,一臺(tái)機(jī)器可能拿到的值是上一個(gè)時(shí)間點(diǎn)的,另一臺(tái)機(jī)器拿到的值可能會(huì)更新一點(diǎn),他們之間所存在的差異就是一致性模型。
  • 強(qiáng)一致性表示在任何時(shí)刻都應(yīng)該拿到一樣的值,強(qiáng)一致性對(duì)優(yōu)化算法和機(jī)器學(xué)習(xí)來(lái)說(shuō)更好一些
  • 弱一致性表示允許一定的程度上的延后,弱一致性對(duì)系統(tǒng)的高效性來(lái)說(shuō)更好一點(diǎn)
  • 當(dāng)時(shí)由于通訊量實(shí)在是太大了,所以需要犧牲一點(diǎn)機(jī)器學(xué)習(xí)算法上的好處去換取系統(tǒng)的好處,去關(guān)注一些弱一致性的模型

3、彈性的可擴(kuò)展性:在訓(xùn)練的時(shí)候,新的節(jié)點(diǎn)是不是可以在不停掉整個(gè)任務(wù)的情況下加進(jìn)來(lái)。

  • 當(dāng)時(shí)這個(gè)特質(zhì)對(duì)數(shù)據(jù)庫(kù)、各種計(jì)算框架(如 MapReduce)來(lái)說(shuō)可能還行,但是對(duì)機(jī)器學(xué)習(xí)這種有非常強(qiáng)的一致性的模型算法來(lái)講還是比較先進(jìn)的,就算是 8 年后的今天似乎也沒有幾個(gè)框架真正能做到在訓(xùn)練的時(shí)候進(jìn)行機(jī)器的增減

4、容災(zāi):當(dāng)一臺(tái)機(jī)器或者幾臺(tái)機(jī)器出現(xiàn)問題的時(shí)候,花多少時(shí)間能夠恢復(fù)過(guò)來(lái)

  • 現(xiàn)在大型的互聯(lián)網(wǎng)服務(wù)容災(zāi)都做的比較好,比如說(shuō)微信或者說(shuō)某個(gè)網(wǎng)站如果下線幾個(gè)小時(shí)的話,將會(huì)造成非常大的災(zāi)難
  • 但是對(duì)于機(jī)器學(xué)習(xí)來(lái)講,對(duì)于容災(zāi)的關(guān)注度還不是很高,但是在本文中還是將容災(zāi)做到了比較高的程度:當(dāng)一臺(tái)機(jī)器或者幾臺(tái)機(jī)器停機(jī),只要不爭(zhēng)整個(gè)系統(tǒng)所有的機(jī)器都停機(jī)的情況下,可以在一秒鐘之內(nèi)恢復(fù)運(yùn)行,所使用的技術(shù)叫做 vector clock(向量鐘,一個(gè)年代比較久遠(yuǎn)的技術(shù))

5、操作簡(jiǎn)單:8 年前,python 的應(yīng)用還不是很廣泛,特別是在工業(yè)界大規(guī)模的機(jī)器學(xué)習(xí)平臺(tái)中,幾乎很少使用 python

  • 當(dāng)時(shí)主要是使用 C++ 來(lái)進(jìn)行開發(fā),C++ 不像 python 有 numpy ,沒有那么好的矩陣計(jì)算相關(guān)的東西
  • 當(dāng)時(shí)一個(gè)矩陣或者一個(gè) vector 就認(rèn)為是一個(gè)數(shù)組,所以這里強(qiáng)調(diào)全局參數(shù)可以抽象稱為一個(gè)稀疏的向量或者矩陣,所以可以調(diào)用一些向量和矩陣
  • 在當(dāng)時(shí) C++ 中的庫(kù)做的都不是很好(當(dāng)時(shí)做的比較好的有 ALGOL ,一種早期的計(jì)算機(jī)算法語(yǔ)言,但是使用起來(lái)比較困難)
  • 反過(guò)來(lái)講,如果所提供的抽象的數(shù)據(jù)結(jié)構(gòu)是向量或者是矩陣的情況下,開發(fā)機(jī)器學(xué)習(xí)會(huì)簡(jiǎn)單很多。在現(xiàn)在大家已經(jīng)習(xí)慣了使用各種深度學(xué)習(xí)框架的情況下不會(huì)覺得困難,但在當(dāng)時(shí)來(lái)說(shuō)這確實(shí)代表了易用性



novelty


本文所提出的系統(tǒng)找到了合適的系統(tǒng)技術(shù),然后將其適配到機(jī)器學(xué)習(xí)算法中,并且改變這些機(jī)器學(xué)習(xí)的算法使其對(duì)系統(tǒng)更加友好

  • 本文所做的工作就是系統(tǒng)和機(jī)器學(xué)習(xí)的交叉。對(duì)于像這種由兩部分構(gòu)成的內(nèi)容,如果只是單純地將這兩個(gè)東西放在一起,也就談不上 novelty 了;如果說(shuō)這兩個(gè)東西本身就耦合得比較好的話,也就談不上工作量了;如果說(shuō)強(qiáng)行將兩個(gè)東西很生硬地結(jié)合到一起,那所做的工作也就沒有任何意義了;所以,如果將兩個(gè)東西都進(jìn)行適當(dāng)?shù)恼{(diào)整之后能夠很好地融合在一起的話,其實(shí)可以說(shuō)是有 novelty 的



具體來(lái)說(shuō),本文所提出的系統(tǒng)放棄了一些分布式系統(tǒng)中要求特別高的如一致性等這些內(nèi)容,同時(shí)也對(duì)機(jī)器學(xué)習(xí)的算法進(jìn)行了一些修改,使其能夠容忍所丟棄掉的一致性。最終得到了第一個(gè)通用的機(jī)器學(xué)習(xí)的系統(tǒng),并且能夠做到工業(yè)界的大小

  • 雖然這里說(shuō)是”第一個(gè)“,但是有兩個(gè)前置的條件:1、general purpose,作為一般性的使用;2、industrial scale size,工業(yè)級(jí)別的大小,當(dāng)時(shí)工業(yè)界對(duì)自己的大系統(tǒng)都是做特殊開發(fā),也有一些通用的系統(tǒng)(比如 spark ),但是實(shí)際上這些通用的系統(tǒng)只能做相對(duì)來(lái)說(shuō)比較?。◣讉€(gè) GB 、幾十 GB 或者幾百個(gè) GB )的東西。所以如果想做一個(gè)比較通用而且能夠達(dá)到當(dāng)時(shí)工業(yè)界最大規(guī)模的系統(tǒng)的話,在當(dāng)時(shí)來(lái)講還是一個(gè)比較困難的事情



2、工程上的挑戰(zhàn)


如果說(shuō)想要處理一些分布式數(shù)據(jù)分析的問題的話,就需要不斷地讀寫全局的參數(shù)。



參數(shù)服務(wù)器提供了一個(gè)有效的匯聚和同步計(jì)算節(jié)點(diǎn)和統(tǒng)計(jì)信息的機(jī)制。

  • 對(duì)于每一個(gè)參數(shù)的服務(wù)節(jié)點(diǎn),參數(shù)服務(wù)器會(huì)維護(hù)一部分全局共享的參數(shù)(因?yàn)閰?shù)可能會(huì)非常大,,一臺(tái)機(jī)器可能放不下,所以會(huì)有很多臺(tái)機(jī)器一起來(lái)維護(hù),每臺(tái)機(jī)器維護(hù)一部分
  • 每一個(gè)計(jì)算節(jié)點(diǎn)(work node)每次會(huì)拿整個(gè)參數(shù)中的一部分(有可能是全部,也可能是其中的一塊),再讀取一些數(shù)據(jù)來(lái)進(jìn)行計(jì)算



這里有兩個(gè)關(guān)鍵性的挑戰(zhàn):


1、通訊


計(jì)算節(jié)點(diǎn)需要不斷地向服務(wù)器索要和回傳數(shù)據(jù),在分布式中,key/value 系統(tǒng)有很多這樣的工具,市面上這些 key/value 的 datastore(datastore 不是一個(gè)數(shù)據(jù)庫(kù),就是一個(gè)純數(shù)據(jù)的東西)并沒有提供足夠的抽象

  • key 可以認(rèn)為是某一個(gè)參數(shù)的下標(biāo)或者是深度神經(jīng)網(wǎng)絡(luò)中的某一個(gè)層對(duì)應(yīng)的 W 中的一個(gè)元素,但是如果說(shuō)對(duì)每一個(gè)元素都將下標(biāo)拿出來(lái)進(jìn)行浮點(diǎn)運(yùn)算的話,效率并不是很高(因?yàn)槊恳粋€(gè) key 發(fā)送出去之后只能帶上一個(gè)浮點(diǎn)運(yùn)算的話,開銷比較大)

對(duì)這些機(jī)器學(xué)習(xí)的算法來(lái)講,通常來(lái)說(shuō)數(shù)據(jù)結(jié)構(gòu)是一個(gè)結(jié)構(gòu)化的數(shù)學(xué)物體(比如向量矩陣或者張量),所以每次更新的話不是發(fā)送一個(gè)一個(gè)的浮點(diǎn)數(shù),而是發(fā)一段一段的內(nèi)容(segment)

  • 對(duì)于深度學(xué)習(xí)來(lái)講,每次發(fā)送一層的東西,這在現(xiàn)在看來(lái)可能就是一個(gè)比較正常的東西。但是如果考慮隨更廣闊的機(jī)器學(xué)習(xí)來(lái)講,話有很多的算法并不是這樣的(比如說(shuō)稀疏的 Logistic 回歸,它的整個(gè)權(quán)重可以認(rèn)為是一個(gè)很稀疏的東西,每次不需要將整個(gè) W 發(fā)送出去,而是將 W 中的一些非零元素發(fā)送出去),所以這里使用 segment 更好一點(diǎn),可能是一個(gè)向量中間的一段或者是一個(gè)矩陣的一整行,也可以是整個(gè)矩陣,所以在這種情況下可以批量地發(fā)送和更新,而不是對(duì)每一個(gè)向量逐一更新,而且這個(gè)抽象也可以覆蓋到大量的機(jī)器學(xué)習(xí)算法


2、容災(zāi)


如果一臺(tái)機(jī)器掛掉的話,不需要重啟整個(gè)任務(wù)(從上一個(gè)保存點(diǎn)重啟)

  • 這里所使用到的技術(shù)是對(duì)每一個(gè)服務(wù)器節(jié)點(diǎn)進(jìn)行實(shí)時(shí)復(fù)制,使得即使一臺(tái)機(jī)器掛掉了,在另外一個(gè)地方還有數(shù)據(jù)的備份,這是分布式系統(tǒng)中使用比較廣泛的技術(shù),雖然在機(jī)器學(xué)習(xí)中使用的得并不是很多
  • 對(duì)于計(jì)算節(jié)點(diǎn)來(lái)講的話,因?yàn)椴挥么鎯?chǔ)全局共享的參數(shù),所以相對(duì)來(lái)講實(shí)現(xiàn)起來(lái)更加容易一些。如果一臺(tái)機(jī)器掛掉了,可以直接拿掉它或者重新增加幾臺(tái)機(jī)器,從而進(jìn)行動(dòng)態(tài)的調(diào)整



圖 1



圖 1 中對(duì)比了當(dāng)時(shí)(2014 年 4 月)的一些系統(tǒng)中最大的任務(wù)用了多少個(gè)核

  • 這里指的是 CPU 的核,因?yàn)樵?2014 年的時(shí)候,使用 GPU 做大量的機(jī)器學(xué)習(xí)還沒有廣泛應(yīng)用
  • y 軸表示的是任務(wù)對(duì)應(yīng)的可學(xué)習(xí)的參數(shù)的個(gè)數(shù)
  • 藍(lán)色方框表示稀疏的 Logistic 回歸
  • 紅色方框表示 LDA(無(wú)監(jiān)督的聚類算法)
  • 紫色的表示 Distbelief ,它是 TensorFlow 的上一代,使用的是 DNN 的任務(wù)
  • 在當(dāng)時(shí)看來(lái),稀疏的 Logistic 回歸是最主流的,接下來(lái)是 LDA ,然后是 DNN 的興起



這篇文章所使用的兩個(gè)實(shí)驗(yàn)都是非常大的,LDA 使用了將近 10 萬(wàn)個(gè)核,稀疏的 Logistic 回歸也使用了將近 1000 億

  • 現(xiàn)在的文章一般都使用 1000 個(gè) GPU來(lái)跑很多天
  • 這篇文章雖然是 8 年前的,但是它的規(guī)模放到現(xiàn)在來(lái)講仍然是非常大的



表 2



表 2 對(duì)比的是當(dāng)時(shí)之前的幾個(gè)工作之間的區(qū)別(數(shù)據(jù)結(jié)構(gòu))

參數(shù)服務(wù)器:

  • 使用的是稀疏的向量或者矩陣
  • 一致性模型(允許計(jì)算節(jié)點(diǎn)之間有多少的不一致性,始終保持一致或者是僅需要在停止之前能夠達(dá)到一致):這里做的比較靈活,因?yàn)樾枰С执罅康牟灰粯拥乃惴?/li>
  • 容災(zāi)(最簡(jiǎn)單的就是進(jìn)行備份,每一次掃完數(shù)據(jù)或者每隔過(guò)少分鐘或者每過(guò)多少個(gè)小批量之后,就將整個(gè)模型的參數(shù)存下來(lái),這樣做的壞處是需要浪費(fèi)很多的磁盤空間):重新開始計(jì)算的話會(huì)浪費(fèi)掉一部分的計(jì)算資源,所以本文中使用的是持續(xù)的容災(zāi)



3、相關(guān)工作


這篇文章的名字叫做 Parameter Sever

  • 這個(gè)詞最早出現(xiàn)在文獻(xiàn)【43】中,但是真正讓這個(gè)名字出名的是 Jeff Dean 的 paper(Large Scale Distributed Deep Networks,NIPS 2012)
  • 作為區(qū)分,本文將最早的工作稱為第一代,Jeff 相關(guān)的工作稱為第二代(他的系統(tǒng)是針對(duì)某一個(gè)特定的任務(wù),Distbelief 是針對(duì)深度學(xué)習(xí)來(lái)做的),本文將自己的工作稱為第三代(因?yàn)楸疚膰L試了去做一個(gè)更加通用的機(jī)器學(xué)習(xí)的解決方案)



小結(jié)


整個(gè)導(dǎo)言的部分篇幅比較長(zhǎng),主要是因?yàn)閷?duì)各種上下文花了很多的筆墨進(jìn)行交代,因?yàn)楫?dāng)時(shí)的系統(tǒng)界對(duì)于整個(gè)機(jī)器學(xué)習(xí)沒有特別深刻的了解。之前的一些文章更多的是像描述研究的機(jī)器學(xué)習(xí)系統(tǒng),本文所嘗試的是從工業(yè)界實(shí)用的角度來(lái)講,機(jī)器學(xué)習(xí)系統(tǒng)應(yīng)該具備的特征與難點(diǎn),也是一個(gè)相對(duì)來(lái)說(shuō)比較新的角度,所以作者花了很多的時(shí)間去講清楚是什么和為什么,也是為了給后文講述為什么設(shè)計(jì)成這樣子鋪路





機(jī)器學(xué)習(xí)


  • 這部分可以認(rèn)為是背景知識(shí)介紹,講述了訓(xùn)練、特征提取、特征向量、目標(biāo)函數(shù)與學(xué)習(xí)等相關(guān)概念
  • 這部?jī)?nèi)容可以借鑒學(xué)習(xí)一下:如何針對(duì)某一個(gè)領(lǐng)域的讀者介紹什么是機(jī)器學(xué)習(xí)



算法 1


  • 算法一描述的是如何將機(jī)器學(xué)習(xí)中比較常見的梯度下降方法變成分布式的算法


算法 1 中將一個(gè)任務(wù)切分成了三塊:

1、任務(wù)調(diào)度器

  • 算法的調(diào)度器可以認(rèn)為是整個(gè)優(yōu)化算法中的 for 循環(huán):告訴所有的計(jì)算節(jié)點(diǎn)將數(shù)據(jù) load 回來(lái),然后開始迭代(迭代 T 次,在每個(gè) t 時(shí)刻告訴所有的工作節(jié)點(diǎn)進(jìn)行第 t 個(gè)小批量的更新)



2、計(jì)算節(jié)點(diǎn)

  • 可以認(rèn)為是一個(gè)機(jī)器,但本質(zhì)上是一個(gè)進(jìn)程,是一個(gè)抽象出來(lái)的概念
  • 這部分可以在同一臺(tái)機(jī)器上出現(xiàn),沒有必要真的使用很多臺(tái)機(jī)器,一臺(tái)機(jī)器可以跑多個(gè)工作的進(jìn)程
  • 這樣做的好處是:假設(shè)這部分中的多線程實(shí)現(xiàn)不是很好的話,則可以跑多個(gè)工作的進(jìn)程,使得更有效地使用所有的計(jì)算資源(或者如果一臺(tái)機(jī)器上有很多張 GPU 的時(shí)候,可以在每個(gè) GPU 上跑一個(gè)計(jì)算節(jié)點(diǎn);server 也是一樣的,server 其實(shí)不怎么耗費(fèi)計(jì)算資源,server 也可以放在同一臺(tái)機(jī)器的不同進(jìn)程上)
  • 這里主要是一個(gè)抽象,實(shí)際實(shí)現(xiàn)來(lái)說(shuō)可以不用做那么大,但是抽象是很重要的,對(duì)于一個(gè)系統(tǒng)來(lái)講,抽象決定了 API


工作節(jié)點(diǎn)的兩個(gè)函數(shù)

LoadData 函數(shù)

  • 這個(gè)函數(shù)的作用是找到所需要的訓(xùn)練數(shù)據(jù)
  • 這里所使用的是數(shù)據(jù)并行:假設(shè)有 m 個(gè)工作節(jié)點(diǎn),則會(huì)將數(shù)據(jù)分成 m 塊,每個(gè)工作節(jié)點(diǎn)讀取它所對(duì)應(yīng)的那一塊訓(xùn)練數(shù)據(jù),讀到數(shù)據(jù)之后,它會(huì)將自己要的那些權(quán)重從 server 上面下載下來(lái)
  • 最簡(jiǎn)單的就是將整個(gè) server 的權(quán)重下載下來(lái),但是有時(shí)候如果數(shù)據(jù)量特別大,一個(gè) server 根本放不下要很多 server 才能放得下的情況下,內(nèi)存可能不夠用,這時(shí)通常來(lái)說(shuō)不會(huì)將機(jī)器學(xué)習(xí)的模型設(shè)的無(wú)限大,如果確實(shí) W 特別大導(dǎo)致一個(gè)機(jī)器的內(nèi)存中放不下的情況下,一定是有內(nèi)在的一些結(jié)構(gòu)(比如說(shuō)稀疏的結(jié)構(gòu))使得每一個(gè)計(jì)算節(jié)點(diǎn)只需要其中的一小塊就行了,因?yàn)橹挥昧似渲械囊粔K數(shù)據(jù)
  • 程序中的 working set 并不一定指的是完整的 W


WorkingIterate 函數(shù)

  • 這是一個(gè)迭代函數(shù),描述的是第 t 次迭代
  • 函數(shù)所完成的功能是:拿到第 t 時(shí)刻對(duì)應(yīng)的 W ,然后和自己所有的樣本計(jì)算梯度(每一個(gè)樣本的梯度求和就得到了總梯度),計(jì)算完總梯度之后 push 給服務(wù)器節(jié)點(diǎn),然后再?gòu)姆?wù)器節(jié)點(diǎn)將更新后的權(quán)重 W(t+1)pull 下來(lái),這樣接下來(lái)就能做下一次的迭代了
  • 這里每一次沒有放縮一致性,所以每次拿到的都是全局的新的 Wt (表示每次使用的都是最新的正確的 W 進(jìn)行的計(jì)算,從而不會(huì)影響最終的計(jì)算結(jié)果)



3、服務(wù)節(jié)點(diǎn)

ServerIterate 函數(shù)

  • Ω :目標(biāo)函數(shù)中的正則項(xiàng)
  • 函數(shù)所完成的功能是:將 t 時(shí)刻所有工作節(jié)點(diǎn)的梯度匯總得到總梯度,然后通過(guò)計(jì)算更新權(quán)重(這里梯度的更新也是原始梯度的更新)
  • 這里是將一個(gè)正常的梯度下降的優(yōu)化算法切開,然后分到不同的地方去
  • 這里只是做了物理上的切割,并不會(huì)影響真實(shí)的計(jì)算結(jié)果,也就是說(shuō)不管使用多少個(gè)工作節(jié)點(diǎn)和服務(wù)節(jié)點(diǎn)都不會(huì)影響最終的計(jì)算結(jié)果,因?yàn)樘荻炔还苁欠值蕉嗌賯€(gè)計(jì)算節(jié)點(diǎn)上,最后的梯度是所有樣本的梯度求和,所以不管有多少個(gè) m ,最后都是求和





圖 2


  • 圖二直觀上描述了任務(wù)的劃分以及整個(gè)計(jì)算的流程


  • 圖中一個(gè)圓角矩形框就是一個(gè)節(jié)點(diǎn),節(jié)點(diǎn)是一個(gè)抽象的概念,并不是指的是物理上面的機(jī)器,本質(zhì)上就是一個(gè)進(jìn)程
  • 圖中畫出了很多的工作節(jié)點(diǎn)
  • 這里的數(shù)據(jù)是稀疏的,每一行表示樣本,列表示特征,“X” 表示非零;這里的數(shù)據(jù)可能是千億或者是萬(wàn)億級(jí)別的樣本數(shù),因?yàn)閿?shù)據(jù)是稀疏的,比如某一個(gè)計(jì)算節(jié)點(diǎn)所拿到的權(quán)重?cái)?shù)據(jù)中有的列為全零,沒有任何的非零元素,這些列的的非零元素可能是分到其他計(jì)算節(jié)點(diǎn)上,所以當(dāng)前計(jì)算節(jié)點(diǎn)其實(shí)不需要這些列對(duì)應(yīng)的 W
  • 計(jì)算流程:當(dāng)拿到一大塊數(shù)據(jù)之后,讓每個(gè)節(jié)點(diǎn)拿到其中的一部分,這里也叫數(shù)據(jù)并行,當(dāng)計(jì)算節(jié)點(diǎn)從 server 端拿到自己所需要的那部分 W 之后,它會(huì)根據(jù)數(shù)據(jù)和 W 計(jì)算出梯度(梯度也是稀疏的),然后傳回 server 端(server 進(jìn)程),當(dāng) server 端拿到所有來(lái)自計(jì)算節(jié)點(diǎn)傳回來(lái)的梯度之后,將它們相加然后更新 W(這里其實(shí)是一個(gè)循環(huán),多臺(tái)機(jī)器的情況下進(jìn)行多種循環(huán),所以當(dāng)任務(wù)特別復(fù)雜或者數(shù)據(jù)特別大的時(shí)候,可以增加機(jī)器的數(shù)量,使得每臺(tái)機(jī)器的計(jì)算量大大減小,這樣就能縮短整體的計(jì)算時(shí)間)
  • 因?yàn)楫?dāng)前計(jì)算節(jié)點(diǎn)所需要的 W 只是完整的 W 中的一部分,這樣就可以將 W 做的特別大,每臺(tái)機(jī)器只拿到 W 的一部分就可以了





圖 3



為什么服務(wù)器節(jié)點(diǎn)需要多個(gè)才能存儲(chǔ)全局共享的參數(shù),但是每個(gè)工作節(jié)點(diǎn)就能夠拿到想要的那部分 W ?

  • 假設(shè)有一個(gè)一千億個(gè)特征的數(shù)據(jù)(假設(shè)數(shù)據(jù)是稀疏的),如果只有一臺(tái)機(jī)器的話,那么這臺(tái)機(jī)器需要拿到數(shù)據(jù)的完整特征
  • 假設(shè)能夠?qū)⑦@些數(shù)據(jù)分到 100 臺(tái)機(jī)器的情況下,那么這時(shí)候每臺(tái)機(jī)器因?yàn)橄∈栊缘脑蛑恍枰?7.8% 的 W 就可以了(也就是只需要 78 億的特征就可以了),這是完全可以放進(jìn)內(nèi)存中的
  • 假設(shè)進(jìn)一步增加計(jì)算節(jié)點(diǎn)數(shù),增加到 10000 個(gè)計(jì)算節(jié)點(diǎn)的時(shí)候,每臺(tái)機(jī)器就只需要 0.15% 的 W 了,也就是說(shuō)每臺(tái)機(jī)器只需要保存 1.5 億個(gè)參數(shù)就行了
  • 通過(guò)以上數(shù)據(jù),也解釋了這種劃分方式能夠支持特別大的計(jì)算任務(wù)





參數(shù)服務(wù)器的架構(gòu)













































































































----to be continued----

參數(shù)服務(wù)器(Parameter Server)逐段精讀【論文精讀】的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
中山市| 嘉义市| 藁城市| 葫芦岛市| 阿荣旗| 正定县| 崇礼县| 峨边| 汉川市| 洛川县| 高州市| 启东市| 资中县| 津市市| 凉城县| 义乌市| 闻喜县| 随州市| 大安市| 贵定县| 乾安县| 阆中市| 买车| 汽车| 阿拉善右旗| 炎陵县| 广西| 绥滨县| 昌都县| 苏尼特左旗| 赤城县| 桐乡市| 北碚区| 漾濞| 略阳县| 巫溪县| 历史| 调兵山市| 沁水县| 浦县| 桂阳县|