深度學習的分佈和並行處理系統

深度學習出來以後,大家發現它和以前機器學習的算法運行系統不一樣,這就有了GPU的“輝煌歲月”:)。大神Jeff Dean也曾爲此抓狂過的,這纔有了Tensorflow。

自動駕駛的深度學習任務也很大,建立強大的深度學習平臺是非常必要的。

1 “Demystifying Parallel and Distributed Deep Learning: An In-Depth Concurrency Analysis”, 9, 2018

深度學習的訓練很費時間,這個在一開始熱的時候就瞭解。當時一般個體研發人員會尋找硬件加速卡,這也是當時Nvidia GPU大受歡迎的原因。但作爲雲計算和大數據領航者的谷歌,自然會考慮如何在雲平臺上完成深度學習的訓練。

當時谷歌開發的系統是DistBelief,但性能還是不理想,主要原因在於以往在雲平臺上運行的多是數據密集型(data intensive)應用程序,而不是計算密集型(compute intensive);但深度學習不管是推理還是訓練,都同時具有這兩種特性,而後者顯然造成了分配到各個計算節點的任務之間耦合相關度高,通訊開銷過大。即使如此,DistBelief仍然有可圈可點的貢獻,比如參數服務器(parameter server)的採用,異步的隨機梯度下降(A-SGD)算法,還有數據並行加模型並行的策略等。

事實上,一個機器學習,特別是深度學習的分佈式實現,是統計準確性(泛化)和硬件效率(利用率)的折衷。互聯網最重要的指標是延遲、帶寬和消息速率。不同網絡技術性能不同,專用HPC互連網絡可以在所有三個指標中實現更高的性能。

計算機每個計算作業可以建模爲有向無環圖(DAG)。DAG的頂點是計算,邊是數據依賴(或數據流)。這種計算並行性可以通過兩個主要參數來表徵:圖的工作W,其對應於頂點的總數,以及圖的深度D,任何最長路徑上的頂點的數量。這兩個參數表徵並行系統的計算複雜性。


神經網絡中的高平均並行度不僅可以用於有效地計算操作單元,而且可以在不同維度同時評估整個網絡。由於使用微型批處理(minibatch)、層寬度和網絡深度等,可以在並行處理器同時劃分前向評估和後向傳播成不同模式,即按輸入樣本劃分的數據並行(data parallelism)模式,按網絡結構劃分的模型並行(model parallelism)模式,以及按層劃分的流水線(layer pipelining)模式,如圖所示。

· 數據並行

在minibatch SGD中,數據以N個樣本爲增量進行處理。並行化的直接方法是將小批量樣本的工作劃分爲多個計算資源(核心或設備),最初稱爲模式並行,因爲輸入樣本稱爲模式,其實就是數據並行。

數據並行性的擴展性自然由小批量(minibatch)尺寸定義。除了批量歸一化(BN)之外,一般運算符對單個樣本進行一次操作,所以前向評估和反向傳播幾乎完全獨立。然而,在權重更新階段,必須對分區的結果求平均以獲得相對整個最小批處理(minibatch)的梯度,可能導致AllReduce操作。 此外,這種方法讓所有參與設備必須能訪問所有網絡參數,就是說,們應該複製。

· 模型並行

模型並行,也稱爲網絡並行,該策略根據每層中的神經元劃分工作。在這種情況下,樣本小批量被複制到所有處理器,並且神經網絡的不同部分在不同的處理器上計算,這樣可以節省存儲器,但是在每個層之後引起額外的通信開銷。

爲了降低完全連接層(FCL)中的通信成本,可以將冗餘計算引入神經網絡。特別是劃分NN時,使每個處理器負責兩倍的神經元(具有重疊),這樣計算更多但通信更少。

卷積層(CL)的模型並行性可能不太有效地縮放,這取決於輸入維度。如果樣本按功能(通道)在處理器之間進行劃分,則每個卷積都需要對所有處理器輸出求和(根據分解產生AllReduce或AllGather操作)。利用空間維度的並行性可以爲某些輸入尺寸加速,因爲周邊交換(halo exchange)操作可以在前向和後向傳遞中和其他計算重疊。爲了減輕周邊交換問題,卷積濾波器可以通過TCN(Tiled Connected Networks)和LCN(Locally-Connected Networks)進行分解,其中前者可以部分地權重共享,而LCN則不然。不幸的是,權重共享是CNN的重要組成部分,有助於減少內存佔用並改善泛化,因此標準卷積運算符的使用頻率高於LCN。

· 分層流水線

在深度學習中,流水線操作可以指重疊計算,即在某層和其下一層之間(當數據準備好),或者根據深度劃分神經網絡,將層分配給特定的處理器。流水線可以被視爲數據並行的一種形式,因爲元素(樣本)通過網絡並行處理;但也作爲模型並行性,因爲流水線長度由神經網絡結構決定。

第一種流水線形式可用於重疊前向評估、反向傳播和權重更新,通過減少處理器空閒時間來提高利用率。在更精細的粒度中,網絡架構可以圍繞重疊層計算的原則設計,如深度堆疊網絡(Deep Stacking Networks,DSN)。在DSN中,每個步驟計算不同的完全連接層(FCL),但先前的結果都連接到層輸入。由於寬鬆的數據依賴性,每個層能部分地並行計算。

· 混合並行

谷歌的DistBelief 分佈式系統結合了三種並行策略。在實現中,同時訓練多個模型副本,其中每個副本用不同樣本訓練(數據並行)。在每個副本根據同一層的神經元(模型並行性)和不同層(流水線)劃分任務。 微軟的Adams project延伸了DistBelief的思想並展示了相同類型的並行性,但是流水線僅限於同一節點上的CPU核。


在分佈式環境中,可能存在多個獨立運行的訓練代理實例,必須修改整個算法。對深度學習的分佈式實現方案可以定義在三個軸上:模型一致性(model consistency),參數分佈(parameter distribution)和訓練分佈(training distribution)。

爲了支持分佈式數據並行的訓練,需要在參數存儲區讀寫參數,其方式可以是中心化(centralized)或去中心化(decentralized)的。這是一個系統性開銷,會阻礙運行訓練的擴展性。

如果訓練中每個分佈計算單元都能得到最新參數,這種訓練算法叫模型一致性方法(consistent model methods)。當放鬆同步的限制條件,則訓練得到的是一個不一致的模型,比如Yahoo提出的分佈式SGD 算法Hogwild,允許訓練代理隨意讀取參數和更新梯度,覆蓋現有進展。

Hogwild已被證明可以收斂稀疏學習(sparse learning)問題,其中更新僅修改參數的子集,可用於一般的凸優化和非凸優化問題。

深度學習訓練選擇中心化還是去中心化網絡架構,取決於多種因素,包括網絡拓撲、帶寬、通信延遲、參數更新頻率和所需的容錯。中心化網絡架構通常包括參數服務器(parameter server,PS)基礎設施,可包括一個或多個專用節點;而分散式架構將依賴AllReduce在節點之間傳遞參數更新。通信之後PS執行中心化參數更新,而去中心化架構的參數更新由每個節點分別計算,並且每個節點會創建自己的優化器。



訓練分佈方案的權衡通過全局更新的通信成本建模。雖然AllReduce操作對不同大小的消息和節點都可以有效地實現,可是PS方案要求每個訓練代理和PS節點之間有發/收信息的來往。因此,並非使用所有路由,而且就通信而言,這種操作等同於AllReduce運行Reduce-then-Broadcasting。另一方面,PS有一個訓練的“全局圖”,可以對一個位置的梯度做平均,並啓用訓練代理的異步運行方式。這樣,在PS上執行一些計算可允許節點傳遞更少的信息,並且在訓練期間動態啓動(spin-up)和移除節點以增加容錯性。

PS的基礎結構是一個抽象概念,不一定由一個物理服務器表示。谷歌DistBelief系統提出了一種分片參數服務器(Sharded PS),將參數所有權分到多個節點,每個節點包含其中一部分。結合模型並行性和分層流水線兩種模式,減輕了PS的一些擁塞,其中“模型複製品”(訓練代理)的每個部分傳輸其梯度並從不同的接收其權重。Rudra的分層參數服務器(Hierarchical PS)爲訓練代理分配PS“葉子”,從特定的訓練代理組傳播權重和梯度到全局參數存儲區,這樣進一步減輕了資源競爭問題。

在去中心化方案設置中,可以使用異步訓練實現負載平衡。但是,參數交換不能使用AllReduce操作,會導致全局同步。不一致去中心化的參數更新方法是使用固定通信圖,採用基於鄰居的梯度/參數交換方式。另一種方法是Gossip算法,每個節點與固定數量的隨機節點通信(大約爲3)。由於分佈式深度學習不需要強一致性,因此該方法在SGD取得一定的成功,收斂和速度更快。


  1. “Using Distributed TensorFlow with Cloud ML Engine and Cloud Datalab”


3 “Distributed training of deep learning models on Azure”

4 Peer-to-Peer Framework

5 DistBelief: Distributed Deep Nets at Google




6 Project Adam @MSR


7 Petuum: Iterative-Convergent Distributed ML


8 SINGA: A Distributed Deep Learning Platform

9 Minerva: A Scalable and Highly Efficient Training Platform

10 Mariana: Deep Learning Platform at Tencent

11 MXNET: Distributed Deep Learning

12 TensorFlow: Large-Scale Heterogeneous Distributed ML
張量流(TensorFlow)是谷歌在DistBelief基礎上研發的第二代深度學習系統。張量(Tensor)意思是N維數組,流(Flow)指基於數據流圖(data flow graph)的計算。TensorFlow使複雜的數據結構在深度學習網絡中分析和處理,可被用於語音識別或圖像識別等多項領域。

TensorFlow提供豐富的深度學習相關的API,支持Python和C/C++接口;支持Linux平臺,Windows平臺,Mac平臺,甚至手機移動設備等各種平臺;提供了可視化分析工具Tensorboard,方便分析和調整模型。

TensorFlow的系統架構有設備層(Device layer)和通信層(Networking layer)、數據操作層、圖計算層、API接口層和應用層,前三個是核心層。

第一層是設備和通信層,負責網絡通信和設備管理。設備管理可以實現TensorFlow設備異構的特性,支持CPU、GPU、Mobile等不同設備。網絡通信依賴gRPC通信協議實現不同設備間的數據傳輸和更新。第二層是張量的OpKernels實現。依賴網絡通信和設備內存分配,它們以張量爲對象實現各種TensorFlow操作或計算。第三層是圖計算層(Graph),包括本地和分佈式兩種計算流圖的實現。圖計算模塊有圖的創建、編譯、優化和執行等部分,圖中每個節點都是OpKernels類型表示。第四層是API接口層。Tensor C API是TensorFlow功能模塊接口封裝,便於調用。第五層則是應用層。不同編程語言通過API接口調用TensorFlow核心功能,在應用層實現各種相關應用。

計算機編程模式可分爲命令式(imperative style)和符號式(symbolic style)。命令式編程容易理解和調試,只是命令語句基本沒有優化。符號式編程有較多的嵌入和優化,不容易理解和調試,但運行速度有提升。Torch是典型的命令式風格,caffe、theano、mxnet和Tensorflow都使用了符號式編程。

符號式編程將計算過程抽象爲計算流圖,所有輸入、運算和輸出的節點均符號化處理。計算流圖建立輸入節點到輸出節點的傳遞閉包,完成數值計算和數據流動。這個過程可以進行優化,以數據流(data flow)方式完成,節省內存空間,計算速度快,但不適合程序調試。


Tensorflow的計算流圖如同數據流一樣,數據流向表示計算過程。數據流圖可以很好的表達計算過程,Tensorflow中引入控制流擴展其表達能力。

13 Caffe on Spark at Yahoo

14 DMTK: Distributed Machine Learning Toolkit @ MSR

15 Computational Network Toolkit (CNTK) at MSR

16 BigDL: A Distributed Deep Learning Framework for Big Data



作者介紹

黃浴,奇點汽車美研中心總裁和自動駕駛首席科學家,上海大學兼職教授。曾在百度美研自動駕駛組、英特爾公司總部、三星美研數字媒體研究中心、華爲美研媒體網絡實驗室,和法國湯姆遜多媒體公司普林斯頓研究所等工作。發表國際期刊和會議論文30餘篇,申請30餘個專利,其中13個獲批准。

原文鏈接

注:本文源自黃浴的知乎:https://zhuanlan.zhihu.com/p/58806183

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