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. 參數服務器。維護一個共享的模型,計算節點計算完成後,可以向參數服務器發送請求更新參數。

Data Serving

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

在提供數據的時候,使用預載入內存的方式進行加速,使用後臺進程進行異步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緩存比主存在浮點數單元上的使用上更不受內存帶寬的影響。

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

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被哈希到不同的存儲桶中,然後平均的分到各個參數服務器中。這樣的方法增加了空間局部性,更新時也易於負載均衡。

批量更新參數。有益於局部性,緩解了L3的壓力。

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

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

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

Delayed Persistence

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

部分的數據丟失也是可容忍的,因爲DNN模型有彈性嘛。然而,對於丟失的數據,很容易可以重新訓練出來。

延遲持久化還可以允許壓縮回寫,由於參數更新的可加性,緩存更新很多輪後,纔有一次回寫也是可以的。

Fault Tolerant Operation

每個參數都是三份緩存。這些參數服務器的分配信息保存在一個參數服務器控制器的機器上。控制器和參數服務器通過心跳同步。

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

當有一臺機器丟失心跳後,控制器重新選擇主服務器。

Evaluation

在ImageNet所有的22000個類上進行實驗,使用top-1準確率進行評估。

Model Training

在沒有參數服務器的情況下,訓練模型,看看每秒鐘可以訓練多少鏈接。可以看到,加速比是超線性的,因爲機器越多,內存越大,數據在內存中,自然快。

img

Parameter 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章