深度學習的概念源於人工神經網絡的研究。含多隱層的多層感知器就是一種深度學習結構。深度學習通過組合低層特徵形成更加抽象的高層表示屬性類別或特徵,以發現數據的分布式特徵表示。
深度學習採用的模型為深層神經網絡(Deep Neural Networks,DNN)模型,即包含多個隱藏層(Hidden Layer,也稱隱含層)的神經網絡(Neural Networks,NN)。深度學習利用模型中的隱藏層,通過特徵組合的方式,逐層將原始輸入轉化為淺層特徵,中層特徵,高層特徵直至最終的任務目標。
如下圖所示:
相對於傳統的神經網絡,深度學習含有更多的隱層(hidden layer),構造包含多隱藏層的深層網絡結背後的理論依據包括仿生學依據與訓練任務的層次結構依據。
對於很多訓練任務來說,特徵具有天然的層次結構。以語音、圖像、文本為例,層次結構大概如下表所示。
以圖像識別為例,圖像的原始輸入是像素,相鄰像素組成線條,多個線條組成紋理,進一步形成圖案,圖案構成了物體的局部,直至整個物體的樣子。不難發現,可以找到原始輸入和淺層特徵之間的聯繫,再通過中層特徵,一步一步獲得和高層特徵的聯繫。想要從原始輸入直接跨越到高層特徵,無疑是困難的。
1. GPU計算的優勢
複雜的人工智慧算法訓練與計算經常涉及上億的參數,這些參數的計算需要大量的計算能力,目前在深度學習領域,GPU計算已經成為主流,使用GPU運算的優勢如下:
目前,主流的GPU具有強大的計算能力和內存帶寬,如下圖所示,無論性能還是內存帶寬,均遠大於同代的CPU。 同時,GPU的thousands of cores的並行計算能力也是一大優勢。
理解 GPU 和 CPU 之間區別的一種簡單方式是比較它們如何處理任務。CPU 由專為順序串行處理而優化的幾個核心組成,而 GPU 則擁有一個由數以千計的更小、更高效的核心(專為同時處理多重任務而設計)組成的大規模並行計算架構。同時CPU相當的一部分時間在執行外設的中斷、進程的切換等任務,而GPU有更多的時間並行計算。
2. GPU計算的原理
那麼,CPU與GPU如何協同工作?下圖展示了CPU與GPU的並存體系模式。
在需要GPU進行運算時,以NVIDIA推出的CUDA(Compute Unified Device Architecture)為例,整體的原理如下:
整體分為4步:
從主機內存將需要處理的數據copy到GPU的內存
CPU發送數據處理執行給GPU
GPU執行並行數據處理
將結果從GPU內存copy到主機內存
CUDA提供了對於一般性通用需求的大規模並發編程模型,使用戶可以對NVIDIA GPU方便的對於 GPU進行並發性編程。如果進行編譯優化會在特定作業系統裡面把計算並行化分配到GPU的多個core裡面,由於GPU有多個core(上千個),所以並發度大大提高,運算效率會比CPU高。下面用代碼表明了如何通過GPU進行計算:
有三個數組int a[10], b[10], c[10];我們要計算a和b的向量之和存放到c中。
一般C語言:
for(int i=0; i<10; i++)
c[i] = a[i] + b[i];
CUDA編程做法:
GPU中的每個線程(核)有一個獨立序號叫index,那麼只要序號從0到9的線程執行c[index] = a[index] + b[index];就可以實現以上的for循環。
3. GPU並行計算的原理
由於每臺伺服器有多個CPU,多個GPU,同時為了進一步提高並行機器學習效率,我們的目標是為了多臺伺服器(每臺伺服器包含多塊GPU卡)採取分布式計算的形式進行,那麼要完成目標,在硬體層面需要進行伺服器集群的構建,同時需要在深度學習框架層面也支持分布式,下面介紹GPU計算的分布式原理,深度學習分布式原理在下一個章節介紹。
首先簡單介紹下單主機內GPU並行計算的基本原理:
單GPU並行計算:
針對每次訓練數據,模型內計算通過多次GPU 內核的調用完成計算。權重W值一直存在GPU內存中,直到所有訓練數據計算完畢之後回傳到系統內存中。
多GPU並行計算之數據並行:
數據並行是指不同的GPU計算不同的訓練數據,即把訓練數據劃分給不同的GPU進行分別計算,由於訓練是逐步訓練的,後一個訓練數據的計算需要前一個訓練數據更新的W(W通常是指模型訓練變化了的數據),數據並行改變了這個計算順序,多GPU計算需要進行W的互相通信,滿足訓練的特點,使訓練可以收斂。數據並行如上圖所示,多GPU訓練不同的數據,每訓練一次需要同步W,使得後面的訓練始終為最新的W。該模型的缺點是當模型較大時,GPU內存無法滿足存儲要求,無法完成計算。
多GPU並行計算之模型並行:
模型並行是指多個GPU同時計算同一個訓練數據,多個GPU對模型內的數據進行劃分,在一次訓練數據多層計算過程中,每個GPU內核計算之後需要互相交換數據才能進行下一次的計算。
可以看出,模型並行需要更頻繁的通信,增加通信壓力,且實現難度較大
多GPU並行計算之集群計算:
GPU集群並行模式即為多GPU並行中各種並行模式的擴展,如上圖所示。節點間採用InfiniBand通信,節點間的GPU通過RMDA通信,節點內多GPU之間採用基於infiniband的通信。
分布式深度學習框架的基本原理,每個深度學習框架在分布式實現上各有不同,在此,我們用tensorflow作為例子:
分布式TensorFlow集群由多個服務端進程和客戶端進程組成. 服務端和客戶端的代碼可以在不同的機器上也可以在同一個機器上。在具體實現上,分為ps伺服器與worker伺服器,ps伺服器即是參數伺服器,當模型越來越大,模型的參數越來越多,多到模型參數的更新,一臺機器的性能都不夠的時候,就需要把參數分開放到不同的機器去存儲和更新。
於是就有了參數伺服器的概念。
參數伺服器可以是多臺機器組成的集群,類似分布式的存儲架構,涉及到數據的同步,一致性等等, 一般是key-value的形式,可以理解為一個分布式的key-value內存資料庫,然後再加上一些參數更新的操作,採取這種方式可以幾百億的參數分散到不同的機器上去保存和更新,解決參數存儲和更新的性能問題。
在tensorflow中,計算節點稱做worker節點。
在運行在具體的物理集群時,PS伺服器可以挑選如下圖中的node0、node1…,worker節點可以挑選如下圖中的node2,node3…
tensorflow的分布式有in-graph和between-gragh兩種架構模式。
in-graph模式,把計算已經從單機多GPU擴展到了多機多GPU, 不過數據分發還是在一個節點。 這樣的好處是配置簡單,但是這樣的壞處是訓練數據的分發依然在一個節點上,要把訓練數據分發到不同的機器上,嚴重影響並發訓練速度。在大數據訓練的情況下,不推薦使用這種模式。
between-graph模式下,訓練的參數保存在參數伺服器,數據不用分發,數據分片的保存在各個計算節點,各個計算節點自己算自己的,算完了之後,把要更新的參數告訴參數伺服器,參數伺服器更新參數。 這種模式的優點是不用訓練數據的分發, 尤其是在數據量在TB級的時候,所以大數據深度學習推薦使用between-graph模式。
in-graph模式和between-graph模式都支持同步和異步更新
在同步更新的時候,每次梯度更新,要等所有分發出去的數據計算完成後,返回回來結果之後,把梯度累加算了均值之後,再更新參數。這樣的好處是loss的下降比較穩定, 但是這個的壞處也很明顯, 處理的速度取決於最慢的那個分片計算的時間。
在異步更新的時候,所有的計算節點,各自算自己的,更新參數也是自己更新自己計算的結果,這樣的優點就是計算速度快,計算資源能得到充分利用,但是缺點是loss的下降不穩定,抖動大。
本文介紹了深度學習的概念,GPU的計算原理,包括GPU並行計算的實現,以及分布式深度學習框架(以tensorflow為例)實現的方式。分布式的深度學習框架如果需要進行動態的調度,以及多個學習框架以資源共享的方式運行與同一個集群時,我們又需要在集群上實現集群管理與調度軟體,來實現分布式深度學習框架的資源調度,我們將在我們的下一篇:分布式深度學習的兩種集群管理與調度的實現方式簡介中進行介紹。
註:部分內容與圖片來源於網絡,如有侵犯,請聯繫我們。