深度學習在GPU和KNL上的擴展(下)

今天我們繼續聊<深度學習在GPU和KNL上的擴展>,,,

EXPERIMENTAL SETUP

(1) 實驗數據集

我們的測試數據集是Mnist、Cifar、和ImageNet,這些都是標準的深度學習測試集,具體見表1。Mnist數據集的應用都是手寫數字的識別,Mnist的圖片被劃分為10類(0,1,2,……,9)。Cifar數據集的應用都是物體識別,Cifar數據集中的圖片也可以劃為10類:飛機、機動車、鳥、貓、鹿、狗、青蛙、馬、船、卡車。Mnist和Cifar的隨機猜測精確度預測是0.1.

ImageNet是一個超過一千五百萬張圖片的計算機視覺數據集,這些圖片可以被劃分到超過20000種類別中。這些圖片圖片都是從網站上搜集來的,然後由使用亞馬遜的Mechanical Turk crowd-sourcing 工具的人類貼標籤機進行標籤。一個起源於2010年的年度競賽ImageNet Large-Scale Visual Recognition

Challenge(ILSVRC)使用的測試集就是imageNet的子集,該子集從1000個類別的每個類別中分別選取1200張圖片。共計有大約一百二十萬張訓練圖片,五萬張驗證圖片和十五萬測試圖片。本文中的ImageNet數據集是2012年ILSVRC的數據集。預計ImageNet圖片的隨機猜測精確度為0.001.

(2) 神經網路模型

本文我們使用最先進的DNN模型來進行數據集的運行。我們使用LetNet來執行Mnist數據集,該模型如圖3所示。使用AlexNet模型來執行Cifar數據集的運行,該模型有五個卷積層和三個全連接層。ImageNet數據集則在22層的GoogleNet模型和19層的VGG模型上運行。

(3) 基線(the baseline)

下一章的原生EASGD即是我們的基線。原生EASGD(演算法1)方法使用輪詢方式來進行master和workers的通信調度,master在任何時候都只能與一個worker進行交互。,且不同的workers的交互是有序的(第i+1個worker不能在第i個worker之前與master交互,按機器等級ID排序)。

DISTRIBUTED ALGORITHM DESIGN

(1) 並行SGD方法的重新設計

本章節我們基於現有方法(即,原生EASGD、非同步SGD、非同步MSGD和Hogwild SGD)來設計一些有效的並行SGD方法。我們將我們的方法與現有方法進行對比(即,我們在相同的數據集和計算資源下進行時間和精確度的對比)。因為現有SGD方法最初是部署在GPUs上的,所以我們也將我們的新方案運行在GPUs上。這些方法我們也會在KNL晶元上運行,因為大家更關心這些方法在晶元間的運行而不是晶元內。(這個很好理解,畢竟這是分散式系統嘛)

非同步EASGD:原生EASGD方法(Algorithm 1)使用輪詢方式來進行調度,該方法對HPC來說是非常低效的,因為不同GPUs間的計算和更新必須是有序的,第i個worker更新之前不允許第i+1及之後的workers更新。不可否認該方法有很好容錯性和收斂性,但它的低效也是難以忽略的。因此,我們的第一個改進就是使用參數-伺服器更新方式來取代輪詢更新方式。我們的非同步EASGD與原生EASGD的不同之處在於,我們使用先到先服務(FCFS)的機制來處理多個workers而它們使用順序規則來處理多個workers。

我們將全局權重W放在master機器上,第i個worker有它自己的本地權重Wi,在第t次迭代過程中,有以下三個步驟:

l 第i個worker首先將它的本地權重Wit傳遞給master,然後master返回Wt給第i個worker(i∈{1,2,……,p})。

l 第i個worker計算梯度ΔWit並且接收Wt。

l Master使用公式(2)進行更新,worker使用公式(1)進行更新

從圖6.1我們可以看出,我們的非同步EASGD要快於非同步SGD。

非同步MEASGD:動量是一個提速SGD的重要方法。動量(Momentum)SGD的更新規則如公式(3)和(4)所示,V是動量參數,它與權重和梯度有相同的維度,μ是動量率,按經驗來說,μ=0.9或者是近似值。在我們的設計中,MEASGD的master的更新規則與前面公式(2)相似,而第i個worker的更新方式變為公式(5)和(6)。從圖6.2中我們可以看出,我們的非同步MEASGD要比非同步MSGD更快更穩定。

Hogwild EASGD:Hogwild SGD為了獲得更快的收斂而去除了更新W時的鎖機制。對常規EASGD來說,在進行Wt+1 = Wt +ηρ(Wit ? Wt )和Wt+1 = Wt +ηρ(Wjt ? Wt )(i,j∈{1,2[中華1] ,…,P})時要加鎖,以防止兩個同時到達時的並發問題。在Hogwild EASGD中我們同樣地去除鎖機制來加快收斂(我們像Hogwild SGD一樣,將常規EASGD中的鎖機制去除得到Hogwild EASGD)。從圖6.3中我們清楚看到,Hogwild EASGD比Hogwild SGD運行更快,同時Hogwild EASGD的收斂性證明在cs.berkeley.edu/~youyang/HogwildEasgdProof.pdf中。

同步EASGD:同步EASGD的更新規則是公式(1)和(2),同步EASGD在第t次迭代是包含以下五步:

l 第i個worker基於它的數據和權重Wit(i∈{1,2,…,P})計算它的子梯度ΔWit

l Master將Wt廣播給所有workers

l 系統通過一個歸約操作(reduce operation)來得到∑Pi=1Wti並將它發送給master

l 第i個worker基於公式(1)更新它的本地權重Wit

l Master基於公式(2)更新Wt

在上述步驟中,步驟(1)和(2)可以重疊,步驟(4)和(5)可以重疊。從圖6.4我們看出,同步EASGD比原生EASGD要快。

我們製作了一個全體對比圖,圖8。在圖8中,原生SGD、Hogwild SGD、非同步SGD和非同步MSGD是已存在的方法。我們已經從圖6中看到,我們的方法總是比現有演算法的相應版本要快。我們也可以看出,同步EASGD和Hogwild EASGD比起的方法比起來是最快的,兩個基本上是並列最快。同步EASGD。我們的演算法設計框架如圖9所示,展示了這些演算法間的區別。

(2) 單層通信

當前深度學習系統為不同的神經網路層分配不相鄰的內存,也會為不同層進行多輪通信。我們以連續的方式分配神經網路,並將所有的層包在一起,每次進行一次通信,這種方式明顯減小了延遲。從圖10我們可以看出這種技術的優勢。改善的原因有兩個:1)發送一個n-word的信息的消耗可以被公式化為α-β模式:(α + β × n)秒,α是網路延遲,β是網路帶寬的倒數,β通常遠小於α(表2)。因此,傳輸相同數據量時,發送一個大信息(big message)就比許多個小信息(small messages)要好得多;2)連續內存訪問要比非連續內存訪問緩存命中率更高。

ALGORITHM-ARCHITECTURE CODESIGN

(1) 多GPU優化

本小結我們展示如何在一個多GPU系統中一步一步優化EASGD。我們使用同步EASGD1,同步EASGD2和同步EASGD3來示意我們的優化三部曲。

同步EASGD1:演算法1是原生的EASGD演算法,多GPU系統的實施包含8個潛在耗時部分。對演算法1來說,它們是:1)數據I/O;2)數據和權重初始化(第1-2行);3)GPU-GPU的參數通信(none);4)CPU-GPU數據通信(第9行);5)CPU-GPU參數通信(第10行和第12行);6)向前向後傳播(第11行);7)GPU權重更新(第13行);8)CPU權重更新(第14行)。我們忽視1)和2),因為他們的時間消耗量百分比很小。GPU-GPU參數通信即不同GPUs的權重交換,CPU-GPU數據通信即GPU每次迭代時複製的一批圖片,CPU-GPU的參數通信即CPU發送全局權重給GPU並接收GPU的本地權重。3)4)和5)是通信,6)7)和8)則是計算。在基準測試後,我們發現EASGD的主要消耗都集中在通信上(圖11),佔到了8GPU系統的訓練總時長的87%。如果我們再繼續深入看通信,我們會發現CPU-GPU參數通信要比CPU-GPU數據通信耗時的多(86% vs 1%),這主要是因為權重大小(W的元素個數)要遠大於一批訓練數據的大小。例如,AlexNet的權重是249MB而一批64張Cifar圖片只有64 × 32 × 32 × 3 × 4B = 768 KB。為了解決這個問題,我們設計了同步EASGD1(algorithm 2)。在同步EASGD1中,P個塊傳送/接收操作可以通過tree-reduction操作(例如,標準MPI操作)來有效執行,tree-reduction操作可以將通信負擔從P(α + |W|β) 降至 logP(α + |W|β)。我們實驗表明,同步EASGD1相比原生EASGD提速3.7倍(表3和圖11)。

同步EASGD2:從表3我們可以看出,CPU-GPU通信仍然是通信的主要負擔,因此我們想要將數據或者權重之一從CPU移動到GPU來減小通信消耗。我們不能將所有數據都放到GPU,因為相比CPU而言,GPU的片上內存有限。例如ImageNet的訓練數據是240GB,而K80的片上內存只有12GB,所以此演算法需要隨機從數據集中挑選出樣品,但是我們卻不能預測哪部分數據被那個GPU使用。因此我們將所有訓練和測試數據都放在CPU上,僅在每次迭代的運行時間將需要的數據複製到GPU。另一方面,權重通常是小於1GB的,我們可以將其存在GPU上。這樣也可以方便每次迭代時的權重重利用(algorithm 3)。我們將所有權重放在GPU上來減少通信消耗,我們稱該方法為同步EASGD2,該方案比同步EASGD1相比要提速1.3倍。同步EASGD2的框架如Algorithm 3描述。

同步EASGD3:我們通過將計算和通信重疊來進一步提升演算法。我們在演算法3的步驟7-14中最大化了重疊優勢。因為向前/向後傳播使用來自CPU的數據,7-10步是關鍵路徑。GPU-GPU通信(步驟11-12)不依賴於步驟7-10,因此我們將演算法3中步驟7-10和步驟11-12重疊,得到同步EASGD3。同步EASGD3相比同步EASGD2而言提速了1.1倍。總的來說,同步EASGD3相比原生EASGD,在不損失精度的前提下,通信率從87%降至14%並獲得了5.3倍的提速(表3和圖11)。因此我們認為同步EASGD3是通行高效的EASGD。我們也為KNL設計了相似的演算法,如演算法4示。

(2) Knights Landing 優化

我們的KNL晶元有68或72個核,遠遠多於常規CPU晶元,為了充分利用計算功率,數據位置非常重要。而且我們也要在演算法級別好好利用KNL的集群模式(BACKGROUND)。我們將KNL晶元分成類似Quad或SNC-4的四部分模式,KNL就會像四個NUMA節點一樣工作。用這種方法,我們也將數據複製成4份然後每個NUMA擁有一份。我們也將權重複制四份,每個NUMA一份。所有NUMA節點計算梯度後,我們利用tree-reduction操作來總和這些梯度。每個NUMA節點可以得到一份梯度和的副本並利用這些副本去更新他們自己的權重。這樣不同的NUMA節點間不需要通信,除非它們共享梯度。這就是分而治之的方法,「分」的步驟包括複製數據和複製權重,「治」的步驟則是所有部分的梯度求和。通過快速梯度傳播,演算法速度也能加快。

用同樣的方法,我們還能將晶元分為8份、16份等等。現在我們將晶元分為P份,這個方法的限制就是快速內存(cache和MCDRAM)應該能夠處理P個權重備份和P個數據副本。圖12展示了當P<=16情況下,我們用AlexNet上運行Cifar數據集時該方案的表現。因為AlexNet是249MB的權重和687MB的數據,所以MCDRAM可以容納16份權重和數據副本。具體地,為了實現相似的精確度(.625),1份時,耗時1605秒;4份時,耗時1025秒;8份時,耗時823秒;16份時,耗時490秒。我們通過複製權重和數據來充分利用快速內存、減少通信,最終實現了3.3倍的提速。

文章後面還有些額外的結果和討論以及附件,主要討論了和intel caffe的對比還有batch size的影響之類,附件則是源碼、數據集和依賴庫等有興趣可以看原文。

原文:Scaling Deep Learning on GPU and Knights Landing clusters --- Yang You,Ayd?n Buluc? James Demmel(UC Berkeley)

註:文中翻譯感覺不是特別準的粘貼英文原文


推薦閱讀:

TAG:深度学习DeepLearning | 数据集成 | 神经网络 |