Adam:大規模分布式機器學習框架
引子
作者:@zyx_1991
本片博客是閱讀論文所得的筆記,論文中得配圖均來自與論文,論文名稱見參考文獻[1].
博客原文參見:http://blog.csdn.net/stdcoutzyx/article/details/46676515
Adam
關于Adam的報道,參見[3].
Adam是微軟研究院的深度學習項目,該項目仍然是應用卷積神經網絡進行圖像分類,效果提高了很多,但從我讀論文的角度看,adam更偏向于分布式 框架的實現,而非理論的創新,自Alex和Hinton在2012年發出[2]以后,其實卷積神經網絡的核心并沒有大改,然而將卷積神經網絡從學術界引領 到工業界,我覺得adam的貢獻匪淺。
那么,為什么需要adam這樣的框架呢?
- 機器學習方法一籮筐,但只有卷積神經網絡可以hold住圖像,因為圖像語音類的數據太難提取特征所致。
- 卷積神經網絡早就出現,為何現在才發揮威力,主要得益與計算能力的提升。
- 要想得到好效果,想在的計算能力還不夠,必須得大數據+大模型才好,所以為了解決大模型日益增長的計算能力需求和現在挫挫的計算機之間的矛盾,adam橫空出世,沒有條件創造條件也要上,把數十上百臺機器有效的連接起來,形成強大的計算能力。 </ol>
- 數據服務類。存儲數據,數據備份。向計算節點提供數據。
- 訓練模型類。訓練模型,然后更新參數。
- 參數服務器。維護一個共享的模型,計算節點計算完成后,可以向參數服務器發送請求更新參數。 </ol>
- 本地計算參數更新值,當處理k張圖像后,向parameter server發送更新請求,然后parameter server直接更新參數。這種方法對卷積層比較適合,因為卷積層的參數有很多都是共享的。對于全連接層,有太多的權重需要更新了,這種方式消耗太大。需 要采用下面的方法。
- 與其傳送參數更新,不如傳送激活值和錯誤梯度向量,然后激活值和錯誤梯度向量在parameter server上進行矩陣計算得到權重更新。這樣就將M×N的數據傳送量變為k×(M+N),這樣做的第二個好處就是將有些計算搬到parameter server上來,增強了系統的平衡性。 </ul>
- 通過設計系統,優化和平衡計算和通信。最小化分布式模型的內存帶寬使用和機器間的通信。
- 利用機器學習訓練過程對不一致性的容忍,提高效果和集群擴展性。使用多線程模型、無鎖更新、異步批量更新技術等提高可擴展性。另外,異步訓練也有助于提高算法效果。
- 證明了系統性能、可擴展性和異步訓練都有助于提高模型準確率。使用少于30臺機器訓練了一個20億連接的模型,在ImageNet的22000類數據上達到兩倍于之前的準確率,數據足夠的情況下,模型越大,效果越好。 </ol>
ok,話不多說,軟話說完,開始說技術吧,如有紕漏,還望指正。
Architecture
Adam框架仍然基于Multi-Spert架構,這個架構的大體含義就是將集群分為如下幾個部分:
Data Serving
有專門的服務器用作提供數據,這些服務器在提供數據的同時還會提前對圖像做一些變換(反轉、傾斜等)。
在提供數據的時候,使用預載入內存的方式進行加速,使用后臺進程進行異步I/O把將被訪問的圖像預先成批載入進內存,使得將被訪問的圖像一直處于內存中。
Model Training
adam訓練的仍然是Alex提出的那個模型,五個卷積層搭配三個全連接層。在adam中,將這些模型垂直切分。如下所示:

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
設計了兩種模型更新方法:
Global Parameter Server
Parameter Server的架構如下,這是一個標準的傳統分布式的k-v存儲結構,但是對于要訓練卷積神經網絡來說,參數的更新速度太快了,還需要優化。

Throughput Optimizations
模型的參數被切分成1M大小的shards,這些shards被哈希到不同的存儲桶中,然后平均的分到各個參數服務器中。這樣的方法增加了空間局部性,更新時也易于負載均衡。
批量更新參數。有益于局部性,緩解了L3的壓力。
參數服務器使用SSE/AVX指令。所有的處理都是NUMA aware。(這條我并不清楚說的是啥,和硬件相關)。
使用無鎖的隊列結構和哈希表結構來加速網絡傳輸、更新和硬盤IO處理。
通過內存池實現了無鎖內存分配。
Delayed Persistence
為了增大吞吐量,將持久化從更新過程中去耦合劃分出來。參數存儲被建模成為一個回寫緩存,臟數據塊被后臺異步的回寫回去。
部分的數據丟失也是可容忍的,因為DNN模型有彈性嘛。然而,對于丟失的數據,很容易可以重新訓練出來。
延遲持久化還可以允許壓縮回寫,由于參數更新的可加性,緩存更新很多輪后,才有一次回寫也是可以的。
Fault Tolerant Operation
每個參數都是三份緩存。這些參數服務器的分配信息保存在一個參數服務器控制器的機器上。控制器和參數服務器通過心跳同步。
在參數更新時,備份服務器和主服務器通過心跳同步。
當有一臺機器丟失心跳后,控制器重新選擇主服務器。
Evaluation
在ImageNet所有的22000個類上進行實驗,使用top-1準確率進行評估。
Model Training
在沒有參數服務器的情況下,訓練模型,看看每秒鐘可以訓練多少鏈接。可以看到,加速比是超線性的,因為機器越多,內存越大,數據在內存中,自然快。

Parameter Server
加上參數服務器后,再看看加速比情況。可以發現,加速比比純本地計算要少,但克服了8機器時的權重更新方法遇到的瓶頸。

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

Scaling with more Replicas
模型大小不變,但增大參數的副本數目,也就是說,數據的并行化變大了。看看加速情況。

performance
效果如下,提升大大滴。隨著模型變大,效果也變得越好。


總結
論文的主要貢獻:
參考資料
[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
來自: http://www.52cs.org/?p=590