本發(fā)明涉及計算機體系結(jié)構(gòu)技術(shù)領(lǐng)域,特別涉及一種可擴展的分布式GPU加速方法及裝置,針對深度神經(jīng)網(wǎng)絡(luò)BP算法。
背景技術(shù):
近年來深度學(xué)習(xí)取得了巨大的進步,其應(yīng)用范圍也越來越廣,涉及語音識別、圖像識別以及虛擬現(xiàn)實、增強現(xiàn)實等市場需求快速增長的領(lǐng)域,傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)是由輸入層、隱藏層和輸出層構(gòu)成的復(fù)雜網(wǎng)絡(luò),具有高度的非線性,能夠進行各種邏輯操作以及擬合各種非線性函數(shù),深度神經(jīng)網(wǎng)絡(luò)的構(gòu)成會更復(fù)雜一些,包括了更多的隱藏層,各層神經(jīng)元之間的連接分為部分連接和全連接,部分連接就是前層的每個神經(jīng)元只和下一層的部分神經(jīng)元有數(shù)據(jù)連接,比如卷積神經(jīng)網(wǎng)絡(luò);全連接則是前層的每個神經(jīng)元和下一層的每個神經(jīng)元都有數(shù)據(jù)連接,比如傳統(tǒng)的人工神經(jīng)網(wǎng)絡(luò)。
對于全連接的深度神經(jīng)網(wǎng)絡(luò),由于自身結(jié)構(gòu)的原因,其計算量巨大,目前的加速方式主要分為兩種,硬件(GPU)加速和并行(多CPU)加速,GPU加速屬于異構(gòu)加速,利用GPU強大的浮點計算能力,在單個節(jié)點上提高深度神經(jīng)網(wǎng)絡(luò)的訓(xùn)練速度,由于單個節(jié)點的限制,使得這種方式利用的GPU硬件數(shù)量有限,一般為1~4個,從而限制了這種加速方式的可擴展性;多CPU并行加速分為兩種,一種是節(jié)點并行加速,即每個節(jié)點只保存神經(jīng)網(wǎng)絡(luò)的一部分,在訓(xùn)練的過程中,參與計算的節(jié)點進行通信來更新數(shù)據(jù),經(jīng)過多次迭代從而完成神經(jīng)網(wǎng)絡(luò)的訓(xùn)練;另一種加速策略是訓(xùn)練數(shù)據(jù)并行,每個節(jié)點保存著完整的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),將訓(xùn)練數(shù)據(jù)集進行劃分,每個節(jié)點處理自己的部分,在每次通信的過程中,每個節(jié)點把自己的更新信息發(fā)送給其他節(jié)點,從而得到全局的更新。這種方式具有一定的可擴展性。
技術(shù)實現(xiàn)要素:
針對現(xiàn)有技術(shù)的不足,本發(fā)明提出一種可擴展的分布式GPU加速方法及裝置,針對深度神經(jīng)網(wǎng)絡(luò)BP算法。
本發(fā)明提出一種可擴展的分布式GPU加速裝置,包括:
多個節(jié)點,所述節(jié)點包括CPU、多個GPU,所述CPU與所述GPU進行數(shù)據(jù)交互,多個所述節(jié)點之間通過InfiniBand進行連接,所述CPU控制所述GPU。
所述節(jié)點上GPU與CPU通過主板進行連接。
每個所述節(jié)點獲取自己對應(yīng)的訓(xùn)練數(shù)據(jù),將所述訓(xùn)練數(shù)據(jù)分為多個批次數(shù)據(jù),每個所述批次數(shù)據(jù)中包含多個數(shù)據(jù),作為一次訓(xùn)練的輸入,每個GPU作為一個單獨的計算單元,分別處理相應(yīng)的所述批次數(shù)據(jù)。
每個所述節(jié)點中的CPU負(fù)責(zé)把每個GPU計算的誤差矩陣更新到全局的權(quán)值矩陣。
當(dāng)某一節(jié)點的所有GPU處理完一輪批次數(shù)據(jù)后,所述某一節(jié)點與其他節(jié)點進行通信,將處理完成的批次數(shù)據(jù)發(fā)送到對應(yīng)的節(jié)點,進行全局更新。
所述可擴展的分布式GPU加速裝置的架構(gòu)采用對等模式。
本發(fā)明還提出一種利用所述可擴展的分布式GPU加速裝置的加速方法,主進程啟動后,進行初始化并讀取所述節(jié)點分到的批次數(shù)據(jù),設(shè)置兩個線程負(fù)責(zé)CPU與GPU的通信,所述兩個線程包括Download線程與Upload線程,第一次迭代時,CPU準(zhǔn)備好初始的參數(shù)W權(quán)值矩陣,Download線程讀取參數(shù)W矩陣并將其下載到GPU的內(nèi)存中,并通知GPU計算線程數(shù)據(jù)已經(jīng)準(zhǔn)備好,然后進入阻塞狀態(tài),等待下一輪計算開始,GPU計算完成參數(shù)W矩陣后,通知Upload線程,Upload線程將誤差矩陣dW從GPU內(nèi)存?zhèn)鬏數(shù)紺PU內(nèi)存,并通知CPU進行參數(shù)W矩陣的更新,然后進入阻塞狀態(tài),等待下一輪計算結(jié)束,CPU更新參數(shù)W矩陣后,通知Download線程,進行第二輪計算,直到所有數(shù)據(jù)計算結(jié)束。
由以上方案可知,本發(fā)明的優(yōu)點在于:
本發(fā)明解決了傳統(tǒng)方法并行度差、可擴展性差以及計算效率低等問題。
本發(fā)明用InfiniBand交換機將各個計算節(jié)點互聯(lián),降低通信延遲,這樣可以及時的將每個節(jié)點計算出的誤差矩陣更新到其他節(jié)點,由于GPU強大的計算能力,進行一次迭代的時間非常短,如果用普通的網(wǎng)絡(luò)連接各個計算節(jié)點,那么誤差矩陣不能及時的更新,更新數(shù)據(jù)的操作會延遲幾輪,這樣會降低計算效率,而且會影響最終模型的準(zhǔn)確性,通過提高節(jié)點的通信能力,能大大提高計算效率,同時保持模型結(jié)果的準(zhǔn)確性。
本發(fā)明首先將樣本分成若干batch(批量),按照GPU的數(shù)量進行劃分,每個GPU均等的獲得同樣數(shù)量的batch,這樣的數(shù)據(jù)劃分方式,避免了模型劃分在分布式結(jié)構(gòu)中的通信壓力,能更好的提高計算效率。
本發(fā)明采用異步的方式進行數(shù)據(jù)更新,在單個節(jié)點內(nèi),GPU每進行完一次迭代計算,在向CPU傳輸誤差矩陣的時,并沒有阻塞計算,而是直接利用當(dāng)前最新的模型,進行下一輪的計算,我們將這種更新模式稱為異步更新,這樣的方式大幅減小了阻塞時間,增加了計算效率。
本發(fā)明在單個節(jié)點內(nèi),GPU和CPU進行數(shù)據(jù)交互時,采用雙緩沖的策略,讀數(shù)據(jù)和寫數(shù)據(jù)都是采用兩個緩沖區(qū),用獨立的線程進行讀數(shù)據(jù)寫,在讀寫完成時立即通知相應(yīng)的線程,從而省去了讀寫時計算線程的等待,減小了整體的計算時間。
本發(fā)明在多個計算節(jié)點間,采用peer(對等)的通信模式,根據(jù)節(jié)點個數(shù)的不同,通過不同的通信次數(shù)來進行全局同步,避免了主從模式對計算資源的浪費。
本發(fā)明按照GPU的個數(shù)進行數(shù)據(jù)劃分,使得負(fù)載更均衡,避免了模型劃分的高通信量。
本發(fā)明采用異步方式進行數(shù)據(jù)更新,避免了同步方式的阻塞延遲,減小了整體的計算時間,提高了計算效率。
附圖說明
圖1是計算節(jié)點間的互聯(lián)模式和單個節(jié)點的GPU和CPU互聯(lián)模式圖;
圖2是單個節(jié)點的軟件結(jié)構(gòu)和計算流程圖;
圖3是兩個計算節(jié)點的通信模式圖;
圖4是四個計算節(jié)點的通信模式圖;
圖5是節(jié)點間的通信過程圖。
具體實施方式
(1)、一種針對深度神經(jīng)網(wǎng)絡(luò)BP算法的可擴展的分布式GPU加速方法,包括多節(jié)點之間CPU的數(shù)據(jù)交互方式,單個節(jié)點上CPU與多個GPU之間的數(shù)據(jù)交互方式。多個節(jié)點用InfiniBand(無限寬帶)相連,在軟件層面通過MPI進行通信,單節(jié)點上GPU與CPU通過主板連接。
(2)、在(1)的基礎(chǔ)上,每個節(jié)點獲取自己對應(yīng)的訓(xùn)練數(shù)據(jù),將數(shù)據(jù)分為多個batch(批次),每個batch中包含多個數(shù)據(jù),作為一次訓(xùn)練的輸入,每個GPU作為一個單獨的計算單元,分別處理不同的batch數(shù)據(jù)。在同一個節(jié)點上,作為slave(從屬)的GPU每處理完一個batch數(shù)據(jù),都要和CPU進行通信,CPU作為Master,負(fù)責(zé)把每個GPU計算的誤差矩陣更新到全局的權(quán)值矩陣。
(3)、在(1)、(2)的基礎(chǔ)上,當(dāng)每個節(jié)點的所有GPU處理完一輪batch數(shù)據(jù)后,該節(jié)點與其他節(jié)點進行通信,將該輪計算的數(shù)據(jù)發(fā)送到對應(yīng)的節(jié)點,進行全局更新,對于不同的節(jié)點數(shù)量,每一輪通信的節(jié)點會有所改變,節(jié)點之間是peer模式。
本發(fā)明的具體硬件架構(gòu),如圖1所示:
1.考慮到GPU超強的浮點計算能力,節(jié)點間必須用InfiniBand這種高速的連接方式,才能避免通信帶來的延遲影響,從理論上講,該加速方法不限制節(jié)點的個數(shù),具有很強的可擴展性,但是對節(jié)點間的數(shù)據(jù)傳輸速度有一定的要求。
2.對于單個節(jié)點,目前可以支持1~4個GPU,這是由于主板的限制,理論上該方法支持的GPU數(shù)量沒有上限。
對于每個節(jié)點,GPU主要負(fù)責(zé)計算,CPU主要負(fù)責(zé)將各個GPU的計算結(jié)果進行合并更新,然后再將更新的結(jié)果傳輸給GPU,進行下一輪計算,其軟件架構(gòu)及計算流程如圖2所示:
主進程啟動后,進行初始化并讀取本節(jié)點分到的訓(xùn)練數(shù)據(jù),除了GPU計算線程外,還要開辟兩個線程負(fù)責(zé)CPU和GPU的通信,為了盡量減小通信帶來的計算影響,在具體實現(xiàn)的過程中,采用了雙緩沖技術(shù),由Download線程和Upload線程負(fù)責(zé)切換,第一次迭代時,CPU端準(zhǔn)備好了初始的參數(shù)W權(quán)值矩陣,Download線程讀取W矩陣并將其下載到GPU的內(nèi)存中,并通知GPU計算線程數(shù)據(jù)已經(jīng)準(zhǔn)備好,然后進入阻塞狀態(tài),等待下一輪計算開始,GPU計算完這一輪的數(shù)據(jù)后,通知Upload線程,Upload線程將誤差矩陣dW從GPU內(nèi)存?zhèn)鬏數(shù)紺PU內(nèi)存,并通知CPU進行W矩陣的更新,然后進入阻塞狀態(tài),等待下一輪計算結(jié)束,CPU更新W矩陣后,通知Download線程,進行第二輪計算,這樣的過程直到所有數(shù)據(jù)計算結(jié)束。
結(jié)合圖1,每個GPU都對應(yīng)著三個線程,一個負(fù)責(zé)從CPU端取數(shù)據(jù),一個負(fù)責(zé)計算,一個負(fù)責(zé)將新的數(shù)據(jù)發(fā)送給CPU端,GPU之間不需要進行同步,只需要和CPU端進行數(shù)據(jù)交互即可,這樣在單個節(jié)點內(nèi),最大限度的減小了數(shù)據(jù)通信帶來的開銷,提高了計算效率。理論上,在單節(jié)點上這種模式可以擴展到多個GPU,但是受限于主板,目前僅支持1~4個GPU。
多個節(jié)點間的通信根據(jù)計算節(jié)點的個數(shù)而定,兩個節(jié)點的計算和通信模式如圖3,本發(fā)明把單個節(jié)點內(nèi)所有GPU都進行完一次計算的過程稱為一輪計算,當(dāng)節(jié)點1和節(jié)點2進行完第一輪計算后,開始進行通信,互相發(fā)送接收對方最新計算的數(shù)據(jù),更新到神經(jīng)網(wǎng)絡(luò)的權(quán)值矩陣,然后開始下一輪計算,這樣,只有兩個節(jié)點的情況下,只需要一次通信就可以保證每個節(jié)點都包含了全局的信息。
總的計算節(jié)點有四個時,本發(fā)明設(shè)計的架構(gòu)為對等(peer)模式,每個節(jié)點都負(fù)責(zé)計算,將計算所得的最新數(shù)據(jù)通過網(wǎng)絡(luò)發(fā)送到對應(yīng)的節(jié)點,四個節(jié)點需要兩次通信獲得全局節(jié)點的計算信息,如圖4所示,第一次通信時,節(jié)點1和節(jié)點2相互發(fā)送更新的數(shù)據(jù),節(jié)點3和節(jié)點4相互發(fā)送更新數(shù)據(jù),每個節(jié)點將收到的數(shù)據(jù)利用到下一輪計算中,當(dāng)下一輪計算完成后,進行第二次通信,此時,節(jié)點1和節(jié)點3進行通信,節(jié)點1向節(jié)點3發(fā)送上一輪收到的節(jié)點2的數(shù)據(jù)和此時節(jié)點1的計算數(shù)據(jù),節(jié)點3向節(jié)點1發(fā)送上一輪收到的節(jié)點4的數(shù)據(jù)和此時節(jié)點3的計算數(shù)據(jù),節(jié)點2和節(jié)點4也進行類似的通信,這樣,通過兩輪數(shù)據(jù)通信,節(jié)點1、2、3、4都包含了全局的更新數(shù)據(jù),保證了訓(xùn)練結(jié)果的正確性和一致性。同時,這種通信方式也減少了節(jié)點間的數(shù)據(jù)交互,提高了計算效率。
一般的,當(dāng)計算節(jié)點的總數(shù)為N時,節(jié)點間每輪總共需要C次通信才能保證每個節(jié)點都有全局的訓(xùn)練數(shù)據(jù),C和N之間具有下列關(guān)系:
C=log2N (公式1)
在具體的數(shù)據(jù)通信過程中,本發(fā)明使用MPI進行節(jié)點的數(shù)據(jù)發(fā)送和接收,流程如圖5所示:
如圖5所示,由于本發(fā)明采用的對等通信模式,每輪的通信次數(shù)和系統(tǒng)內(nèi)節(jié)點的個數(shù)相關(guān),因此,在每次發(fā)送和接收過程中,本發(fā)明需要計算當(dāng)時對應(yīng)的通信節(jié)點。