(山東大學(xué)工程訓(xùn)練中心 山東 濟(jì)南 250061)
神經(jīng)網(wǎng)絡(luò)是由許多神經(jīng)元構(gòu)成的,單個神經(jīng)元與其他神經(jīng)元互聯(lián),形成網(wǎng)狀結(jié)構(gòu),各網(wǎng)狀結(jié)構(gòu)相互盤錯形成規(guī)模巨大的多層次人工模型,長久以來,相關(guān)人士一直聚焦于提高神經(jīng)網(wǎng)絡(luò)的訓(xùn)練性能。在深度神經(jīng)網(wǎng)絡(luò)上,算法的改進(jìn)和硬件的性能的提高都可以對訓(xùn)練性能起到很好的加速作用。設(shè)計更出色的模型進(jìn)行學(xué)習(xí),來降低訓(xùn)練過程中的難度,這是算法優(yōu)化的主要目的和方法。硬件的優(yōu)化是利用GPU或其他硬件硬件來進(jìn)行訓(xùn)練模型的計算。借助硬件的良好性能,以期達(dá)到越來越好的加速效果。
深度神經(jīng)網(wǎng)絡(luò)模型在網(wǎng)絡(luò)結(jié)構(gòu)中有非常多隱含單元,這些隱含單元又可以稱作隱含層,涉及范圍之廣層次之深,因此被稱為深度神經(jīng)網(wǎng)絡(luò)。
神經(jīng)系統(tǒng)接收某個向量作為輸入信號,并且經(jīng)過一系列的中間加工過程。類似于人類的神經(jīng)系統(tǒng),隱含層就像神經(jīng)纖維束,無數(shù)神經(jīng)纖維纏繞盤旋糾結(jié)在一起形成纖維束,但是每個神經(jīng)元又是獨立存在,不與其它神經(jīng)元共享連接,每個神經(jīng)元與前面層的隱含層的每個神經(jīng)元相連接。最終輸出層輸出所識別對象的類別結(jié)果,神經(jīng)網(wǎng)絡(luò)模型中的卷積加工過程分兩步走,一個是子采樣,另一個就是子卷積。在卷積層進(jìn)行特征提取時,卷積層中的神經(jīng)元相同層的部分神經(jīng)元間的鏈接共享權(quán)值,神經(jīng)元間是非全連接的。得益于有監(jiān)督的學(xué)習(xí),卷積具有兩種特性,這種良好的性能不僅使學(xué)習(xí)過程中神經(jīng)元間共享權(quán)值的數(shù)量大幅減少,而且也簡化了網(wǎng)絡(luò)模型訓(xùn)練的復(fù)雜過程,降低了數(shù)據(jù)工作的壓力。
卷積神經(jīng)網(wǎng)絡(luò)主要由輸入層、卷積層、池化層和全連接層構(gòu)成。卷積神經(jīng)網(wǎng)絡(luò)模型的工作過程一般是這樣的:首先提取特征,每一次數(shù)據(jù)訓(xùn)練結(jié)束后,每層隱含層會向后層神經(jīng)元傳播,后層神經(jīng)元接收傳播的信息后,提取出局部特征以及每個特征與相鄰特征之間的相鄰位置關(guān)系。其次特征映射,而獨立的神經(jīng)元具有相同的權(quán)值,從而在整個過程中,不對物體在圖像中的位置產(chǎn)生影響,多個映射結(jié)構(gòu)組成一個模型中的計算層。第二步,進(jìn)行子采樣。任何一個卷積層都包含特征提取、特征映射和子采樣三個操作,在網(wǎng)絡(luò)結(jié)構(gòu)完成卷積計算之后會進(jìn)行二次采樣的處理,這樣做是為了減少訓(xùn)練參數(shù)的規(guī)模。在經(jīng)過多層卷積之后,最終構(gòu)成一個完整的網(wǎng)絡(luò)模型結(jié)構(gòu)。
如果單個GPU的存儲內(nèi)存可以大到存儲下所有數(shù)據(jù)時,就可以在深度神經(jīng)網(wǎng)絡(luò)的所有層次中對所有數(shù)據(jù)進(jìn)行并行化處理。此時,每個GPU只需要對一個批次的輸入數(shù)據(jù)進(jìn)行處理,所有GPU同時處理所有數(shù)據(jù),數(shù)據(jù)處理的效率也就得到大幅提升。在神經(jīng)網(wǎng)絡(luò)的正向反向傳播的過程中,每個層的梯度和參數(shù)都會被復(fù)制并傳遞到每個GPU。所有的GPU在本地訓(xùn)練權(quán)重及數(shù)據(jù)指導(dǎo)下重新計算梯度,完成后,新的訓(xùn)練權(quán)重會替代之前的,通過交換學(xué)習(xí),GPU的本地存儲訓(xùn)練權(quán)重也就被更新過一次了。
將全部梯度劃分K部分,每個GPU負(fù)責(zé)一個部分,計算完成時,第K個GPU對其他所有GPU上的提督計算進(jìn)行累計整合,然后發(fā)送累計梯度記錄給所有GPU。這是第一種實現(xiàn)數(shù)據(jù)并行的方法。第二種方法是在數(shù)據(jù)進(jìn)行反向的傳播過程中生成梯度,每一個GPU就進(jìn)行異步處理,將梯度值傳遞給對應(yīng)GPU,在需要對應(yīng)權(quán)重時進(jìn)行同步處理,這樣最大程度的加大計算與通信間的重疊。訓(xùn)練模型的大小直接決定著GPU間通信的開銷,而這與GPU的數(shù)目一般是沒有直接關(guān)系的。如果模型存儲在GPU上后,如果仍然存在空閑內(nèi)存,此時空閑內(nèi)存可用來緩存訓(xùn)練數(shù)據(jù),縮短訓(xùn)練時間。
當(dāng)前深度神經(jīng)網(wǎng)絡(luò)模型逐漸增大,單個GPU存儲不下,因此數(shù)據(jù)并行也僅僅適合小模型。此時,模型并行訓(xùn)練機(jī)制就派上用場了。在卷積層中使用仍然使用數(shù)據(jù)并行,在全連接層中,將大模型劃分成多個部分分別指派到多個GPU中去,這樣就可以實現(xiàn)同時計算。卷積層和全連接層具有不同特性,僅有小部分?jǐn)?shù)據(jù)時,所有參數(shù)可以同時存儲在一個GPU上,每一批需要處理的圖像分配給全部GPU,這種方法很有效果。但是,當(dāng)全連接層的參數(shù)較多時,則需要所有的GPU均等的劃分這些參數(shù)。最后所有的GPU協(xié)助彼此工作,以在必要時同步全鏈路層計算中的參數(shù)。
在當(dāng)前使用的框架中,研發(fā)了許多深度學(xué)習(xí)專用的計算機(jī)型號。英偉達(dá)公司近年來目光放在深度學(xué)習(xí)計算機(jī)的研發(fā)上,軟硬件是深度學(xué)習(xí)的基礎(chǔ),一是硬件開發(fā),更高性能的GPU及其他計算機(jī)硬件可以推動深度學(xué)習(xí)訓(xùn)練的加速。二是設(shè)計更加高效的并行處理框架。顯然,不同的深度學(xué)習(xí)算法在不同架構(gòu)上會體現(xiàn)出不同的性能。GPU在處理龐大而繁重的計算時,單個GPU計算性能是八核CPU的十倍,性能遠(yuǎn)優(yōu)于CPU。前面提到還有一種辦法是采用多個GPU進(jìn)行并行協(xié)同計算,例如在雙GPU上模擬模型并行訓(xùn)練架構(gòu),GPU相互交流學(xué)習(xí)是通過連接線進(jìn)行的。SGD算法是目前常用的訓(xùn)練算法,該算法有很大的計算密度,在GPU上運行SGD算法可以很好的結(jié)合兩者計算性能優(yōu)勢。通常當(dāng)GPU的內(nèi)存不能存儲一個大型模型的數(shù)據(jù)時,將大型模型擴(kuò)展到多個GPU上進(jìn)行訓(xùn)練是完全可行的。結(jié)合SGD算法的特點,在模型訓(xùn)練過程中,盡可能多的連接高帶寬和低延遲,從而最大限度的減少顯卡相互間通信的開銷。使用多GPU與使用單GPU的差異在于,當(dāng)GPU數(shù)目為一時,數(shù)據(jù)必須全部存儲在一個GPU上,將數(shù)據(jù)分批次處理,如今模型愈來愈大,大多數(shù)情況下不能存在一個GPU上,這時候就體現(xiàn)出了多GPU的優(yōu)勢,眾多GPU協(xié)同工作,將大模型擇分成小模型,每個GPU的計算壓力減小,且同時工作,最后,GPU線程調(diào)度程序整合出一個完整模型,這樣不僅效率高,而且硬件損耗小。
GPU上的深度神經(jīng)網(wǎng)絡(luò)模型并行系統(tǒng)中最主要的問題就是計算和訓(xùn)練的模型越來越大無法將全部數(shù)據(jù)存儲在同一塊GPU上,這是深度神經(jīng)網(wǎng)絡(luò)模型并行過程中的主要問題,極大的降低了訓(xùn)練效率,它在現(xiàn)實生活中的具體應(yīng)用就會受到限制,所以此后的研究人員應(yīng)將部分目光匯聚于此。