Adam:大規模分布式機器學習框架


引子

轉載請注明:http://blog.csdn.net/stdcoutzyx/article/details/46676515

又是好久沒寫博客,記得有一次看Ng大神的訪談錄,假設每周讀三篇論文,那么經年以后,必定成為對某個領域非常熟悉的人。

可惜,在忙忙碌碌中,我居然做不到這一點。

可是,我眼下的打算是盡心盡力的去做,哪怕一周僅僅讀一篇呢。

胡適先生曾說過:“怕什么真理無窮,進一步有進一步的歡喜”。然而。這當中的差別在於,我還沒有達到追求真理的高度,我就是想看看這個技術是咋子回事塞。

我想。對於非常多像我這樣非科班出身自己學ML的人來說,肯定有非常多時候感覺自己對ML的理論推導之類的事情捉襟見肘,盡管非常多時候想下狠心自己去惡補一下數學啥的,然而卻並沒有什么卵用。不得不承認,有些東西還是得有人指點才干一步一步扎實的往下學。自己無頭蒼蠅般瞎學非常快便會耗盡精力與熱情,我想這恐怕就是讀博的必要性了吧。

然而對於僅僅想安靜的做一個程序猿的我來說。換一個角度思考一下,假設要做一個出色的程序猿的話,事實上過多的理論恐怕也是不須要的。多了解一些算法的實現也許更有優點。

所以。我認為本片博客更偏向於有用。由於它並不是在理論上做了大的改進而提高的效果,而是一個分布式機器學習算法的實現。

Adam

關於Adam的報道,參見[3].

本片博客是閱讀論文所得的筆記,論文中得配圖均來自與論文,論文名稱見參考文獻[1].

Adam是微軟研究院的深度學習項目,該項目仍然是應用卷積神經網絡進行圖像分類,效果提高了非常多,但從我讀論文的角度看,adam更偏向於分布式框架的實現,而非理論的創新。自Alex和Hinton在2012年發出[2]以后,事實上卷積神經網絡的核心並沒有大改,然而將卷積神經網絡從學術界引領到工業界。我認為adam的貢獻匪淺。

那么,為什么須要adam這種框架呢?

  1. 機器學習方法一籮筐,但僅僅有卷積神經網絡能夠hold住圖像,由於圖像語音類的數據太難提取特征所致。
  2. 卷積神經網絡早就出現,為何如今才發揮威力,主要得益與計算能力的提升。
  3. 要想得到好效果,想在的計算能力還不夠,必須得大數據+大模型才好。所以為了解決大模型日益增長的計算能力需求和如今挫挫的計算機之間的矛盾,adam橫空出世,沒有條件創造條件也要上。把數十上百台機器有效的連接起來,形成強大的計算能力。

ok,話不多說,軟話說完,開始說技術吧,如有紕漏,還望指正。

Architecture

Adam框架仍然基於Multi-Spert架構,這個架構的大體含義就是將集群分為例如以下幾個部分:

  1. 數據服務類。存儲數據,數據備份。

    向計算節點提供數據。

  2. 訓練模型類。訓練模型,然后更新參數。
  3. 參數server。維護一個共享的模型,計算節點計算完畢后,能夠向參數server發送請求更新參數。

Data Serving

有專門的server用作提供數據,這些server在提供數據的同一時候還會提前對圖像做一些變換(反轉、傾斜等)。

在提供數據的時候,使用預加載內存的方式進行加速。使用后台進程進行異步I/O把將被訪問的圖像預先成批加載進內存。使得將被訪問的圖像一直處於內存中。

Model Training

adam訓練的仍然是Alex提出的那個模型,五個卷積層搭配三個全連接層。在adam中,將這些模型垂直切分。

例如以下所看到的:

img

Multi-threaded Training

單台機器上的模型都是多線程訓練的,這些線程共享一個模型參數。

在執行過程中,每一個線程被分配不同的圖片進行訓練。

然而每一個線程的上下文的運算環境(包含正向計算和反向傳播)都是單獨的,上下文運算環境被預先分配好來防止堆鎖。

上下文環境和每一個線程的中間結果的緩存都使用NUMA-aware分配空間來降低cross-memory bus traffic。

Fast Weight Updates

為了加速訓練,對共享的模型參數的局部更新是不加鎖的。每一個線程都計算權重更新值然后直接更新模型。

當然,這會導致不一致性,但實驗證明。這種更新方式仍然能夠收斂。

收斂的原因可能是由於神經網絡的彈性能夠hold住這種不一致所帶來的噪聲。

后面還會提到,可能正是由於這種噪聲,使得模型的泛化能力更加強大。

Reducing Memory Copies

由於模型的數據須要在層與層之間傳遞,而模型又是被切分的。故而非常多數據的傳送是非本地的。

對於本地傳送,傳遞指針而非值。

對於非本地傳送,構建了基於windows socket API的網絡庫,加速數據傳送,詳細信息不詳。

使用了靜態模型切分來優化模型間須要傳遞的信息量。

(靜態模型切分是啥?)

使用引用計數來保證異步網絡IO的安全性。

Memory System Optimization

對模型進行切分,直到單次訓練的內存能夠Fit到L3緩存中。

L3緩存比主存在浮點數單元上的使用上更不受內存帶寬的影響。

前向計算和反向傳播的計算都有非常好的計算上的局部性需求,因而。將數據打包然后使用矩陣運算更easy利用局部性和浮點計算單元。

Mitigating the Impact of Slow Machines

即便機器的配置是一樣的,在模型運算過程中仍然會有快慢之分。

為了避免快機器上的線程被慢機器上的線程拖累。同意線程並行的處理多張圖像,使用一個數據流框架,當數據到來時,觸發一張圖像上的處理流程。

每次迭代結束的時候,往往須要等待全部圖像都處理完然后再在驗證集上計算錯誤率再決定下次迭代是否須要。

然而這就麻煩了。須要等待最慢的機器也跑完。故而。設計了一種策略,在75%的圖像處理完之后,就開始評測模型。並覺決定是否有下次迭代。

在75%設定之后,使用隨機化方法保證相同的集合下次不能被跳過。這種策略能夠加速20%以上。

Parameter Server Communication

設計了兩種模型更新方法:

  • 本地計算參數更新值,當處理k張圖像后。向parameter server發送更新請求,然后parameter server直接更新參數。這個方案對卷積層比較適合。由於卷積層的參數有非常多都是共享的。

    對於全連接層,有太多的權重須要更新了,這種方式消耗太大。

    須要採用以下的方法。

  • 與其傳送參數更新。不如傳送激活值和錯誤梯度向量。然后激活值和錯誤梯度向量在parameter server上進行矩陣計算得到權重更新。

    這樣就將M×N的數據傳送量變為k×(M+N)。這樣做的第二個優點就是將有些計算搬到parameter server上來,增強了系統的平衡性。

Global Parameter Server

Parameter Server的架構例如以下,這是一個標准的傳統分布式的k-v存儲結構。可是對於要訓練卷積神經網絡來說,參數的更新速度太快了,還須要優化。

img

Throughput Optimizations

模型的參數被切分成1M大小的shards。這些shards被哈希到不同的存儲桶中。然后平均的分到各個參數server中。

這個方案添加了空間局部性,更新時也易於負載均衡。

批量更新參數。故意於局部性。緩解了L3的壓力。

參數server使用SSE/AVX指令。全部的處理都是NUMA aware。(這條我並不清楚說的是啥,和硬件相關)。

使用無鎖的隊列結構和哈希表結構來加速網絡傳輸、更新和硬盤IO處理。

通過內存池實現了無鎖內存分配。

Delayed Persistence

為了增大吞吐量。將持久化從更新過程中去耦合划分出來。參數存儲被建模成為一個回寫緩存,臟數據塊被后台異步的回寫回去。

部分的數據丟失也是可容忍的,由於DNN模型有彈性嘛。然而。對於丟失的數據。非常easy能夠又一次訓練出來。

延遲持久化還能夠同意壓縮回寫,由於參數更新的可加性。緩存更新非常多輪后。才有一次回寫也是能夠的。

Fault Tolerant Operation

每一個參數都是三份緩存。這些參數server的分配信息保存在一個參數server控制器的機器上。

控制器和參數server通過心跳同步。

在參數更新時,備份server和主server通過心跳同步。

當有一台機器丟失心跳后。控制器又一次選擇主server。

Evaluation

在ImageNet全部的22000個類上進行實驗,使用top-1准確率進行評估。

Model Training

在沒有參數server的情況下。訓練模型,看看每秒鍾能夠訓練多少鏈接。能夠看到。加速比是超線性的,由於機器越多。內存越大。數據在內存中,自然快。

img

Parameter Server

加上參數server后,再看看加速比情況。

能夠發現。加速比比純本地計算要少。但克服了8機器時的權重更新方法遇到的瓶頸。

img

Scaling with more workers

將用於訓練的機器增多,查看加速比。用於訓練的機器增多。保證每台機器上的參數數目不變。增大模型大小。從而機器數目增多,但由圖可見,網絡上的通信並未影響加速。

img

Scaling with more Replicas

模型大小不變,但增大參數的副本數目,也就是說,數據的並行化變大了。

看看加速情況。

img

performance

效果例如以下,提升大大滴。隨着模型變大,效果也變得越好。

img

img

總結

論文的主要貢獻:

  1. 通過設計系統,優化和平衡計算和通信。最小化分布式模型的內存帶寬使用和機器間的通信。
  2. 利用機器學習訓練過程對不一致性的容忍,提高效果和集群擴展性。使用多線程模型、無鎖更新、異步批量更新技術等提高可擴展性。另外,異步訓練也有助於提高算法效果。
  3. 證明了系統性能、可擴展性和異步訓練都有助於提高模型准確率。使用少於30台機器訓練了一個20億連接的模型。在ImageNet的22000類數據上達到兩倍於之前的准確率,數據足夠的情況下。模型越大,效果越好。

參考資料

[1]. Chilimbi T, Suzue Y, Apacible J, et al. Project adam: Building an efficient and scalable deep learning training system[C]//11th USENIX Symposium on Operating Systems Design and Implementation (OSDI 14). 2014: 571-582.

[2]. Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification with deep convolutional neural networks[C]//Advances in neural information processing systems. 2012: 1097-1105.

[3]. http://www.tuicool.com/articles/IbAZFb


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM