??個(gè)人主頁: https://zhangxiaoshu.blog.csdn.net
??歡迎大家:關(guān)注??+點(diǎn)贊??+評論??+收藏??,如有錯誤敬請指正!
??未來很長,值得我們?nèi)Ρ几案篮玫纳睿?/strong>
前言
對于深度學(xué)習(xí)模型的預(yù)訓(xùn)練階段,海量的訓(xùn)練數(shù)據(jù)、超大規(guī)模的模型給深度學(xué)習(xí)帶來了日益嚴(yán)峻的挑戰(zhàn),因此,經(jīng)常需要使用多加速卡和多節(jié)點(diǎn)來并行化訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)。目前,數(shù)據(jù)并行和模型并行作為兩種在深度神經(jīng)網(wǎng)絡(luò)中常用的并行方式,分別針對不同的適用場景,有時(shí)也可將兩種并行混合使用。本文對數(shù)據(jù)并行和模型并行兩種在深度神經(jīng)網(wǎng)絡(luò)中常用的并行方式原理及其通信容量的計(jì)算方法進(jìn)行介紹。
一、深度神經(jīng)網(wǎng)絡(luò)求解原理回顧
深度神經(jīng)網(wǎng)絡(luò)是通過模仿生物大腦的神經(jīng)元結(jié)構(gòu)而設(shè)計(jì)的一種多層互連結(jié)構(gòu).在其訓(xùn)練過程中,數(shù)據(jù)輸入神經(jīng)網(wǎng)絡(luò)經(jīng)過網(wǎng)絡(luò)的前向傳播過程得到一個(gè)輸出,然后對輸出得預(yù)測值和真實(shí)值求相對誤差將其作為損失函數(shù),接著,對網(wǎng)絡(luò)進(jìn)行反向傳播求得損失對權(quán)重參數(shù)得梯度信息,最后,使用得到的梯度信息對權(quán)重參數(shù)做梯度下降使得損失函數(shù)越來越小,如此反復(fù)這個(gè)過程,使得神經(jīng)網(wǎng)絡(luò)的預(yù)測結(jié)果變得越來越準(zhǔn)確。
假設(shè)訓(xùn)練數(shù)據(jù)集為
X
=
[
x
1
,
x
2
.
.
.
x
N
,
]
X=[x_1,x_2...x_N,]
X=[x1?,x2?...xN?,],數(shù)據(jù)集經(jīng)過前向傳播后輸出預(yù)測值
f
(
x
i
)
f(x_i)
f(xi?),真實(shí)值為
y
i
y_i
yi?,則損失函數(shù)可以表示為如下式所示。
R e m p ( f ) = 1 N ∑ i = 1 N L ( y i , f ( x i ) ) R_{emp}\left(f\right)=\frac{1}{N}\sum_{i=1}^{N}L\left(y_i,f\left(x_i\right)\right) Remp?(f)=N1?i=1∑N?L(yi?,f(xi?))
其中, L ( ? ) L(\bullet) L(?)為損失函數(shù),它主要用于衡量預(yù)測值和真實(shí)值之間差異的大小,差異越小,說明模型的預(yù)測越準(zhǔn)確。對于不同問題的求解,往往具有不同的形式。根據(jù)上式可以得到求解深度神經(jīng)網(wǎng)絡(luò)的最優(yōu)化表達(dá)式如下式所示。
f ? = arg ? min ? f ∈ F R e m p ( f ) f^{*}=\underset{f \in \boldsymbol{F}}{\arg \min } R_{\mathrm{emp}}(f) f?=f∈Fargmin?Remp?(f)
即在假設(shè)空間 F F F中找到一個(gè)最優(yōu)的模型 f ? f^\ast f?使得 R e m p ( f ) R_{emp}(f) Remp?(f)最小。
基于梯度的優(yōu)化算法是DL中解決上述優(yōu)化問題應(yīng)用最廣泛的算法。由于二階梯度下降法的計(jì)算復(fù)雜度較高,一階梯度下降法,尤其是帶有mini-batch及其變體的隨機(jī)梯度下降法(SGD)在DL中被廣泛使用。SGD的更新規(guī)則如下式所示。
G t ( x t ) = ? F t ( x t ; ξ t ) G_t\left(x_t\right)=\nabla F_t\left(x_t;\xi_t\right) Gt?(xt?)=?Ft?(xt?;ξt?)
x t + 1 = x t ? γ G t ( x t ) x_{t+1}=x_t-\gamma G_t\left(x_t\right) xt+1?=xt??γGt?(xt?)
這里的 x t ∈ R N x_t\in R^N xt?∈RN是第 t t t次迭代時(shí)的N維模型參數(shù), ξ t \xi_t ξt?是隨機(jī)抽樣的小批量數(shù)據(jù), γ \gamma γ是學(xué)習(xí)率(或步長)。SGD是一種迭代算法,迭代過程通常包含幾個(gè)步驟:
- 它對一小批數(shù)據(jù)(即 ξ t \xi_t ξt?)進(jìn)行采樣。
- 它執(zhí)行前饋計(jì)算,以計(jì)算目標(biāo)函數(shù)的損失值(即 F t ( x t ; ξ t ) F_t\left(x_t;\xi_t\right) Ft?(xt?;ξt?))。
- 它執(zhí)行反向傳播以計(jì)算關(guān)于模型參數(shù)的梯度(即 ? F t ( x t ; ξ t ) ?F_t\left(x_t;\xi_t\right) ?Ft?(xt?;ξt?))。
- 最后,通過公式 x t + 1 = x t ? γ G t ( x t ) x_{t+1}=x_t-\gamma G_t\left(x_t\right) xt+1?=xt??γGt?(xt?)更新模型參數(shù)。訓(xùn)練深層模型非常耗時(shí),尤其是對于大型模型或數(shù)據(jù)集。使用分布式訓(xùn)練技術(shù),利用多個(gè)處理器來加速訓(xùn)練過程變得很常見。
二、數(shù)據(jù)并行
數(shù)據(jù)并行是在不同設(shè)備上放置完整的模型,然后將數(shù)據(jù)劃分在每個(gè)設(shè)備并行計(jì)算,如下圖所示。
數(shù)據(jù)并行性是深度學(xué)習(xí)中普遍存在的一種技術(shù),對每個(gè)輸入批訓(xùn)練數(shù)據(jù)在所有設(shè)備之間分配,每個(gè)設(shè)備中存儲著網(wǎng)絡(luò)模型完整的權(quán)重。在更新模型權(quán)重之前,梯度在所有設(shè)備之間進(jìn)行通信和聚合。數(shù)據(jù)并行性擁有計(jì)算效率高和易于實(shí)現(xiàn)等優(yōu)點(diǎn)。然而,數(shù)據(jù)并行性依賴于數(shù)據(jù)并行工作塊的數(shù)量來縮放批處理大小,并且不能在不影響模型質(zhì)量的情況下任意增大。對于參數(shù)不能存儲在單個(gè)設(shè)備的大型模型,數(shù)據(jù)并行性便不在適應(yīng)。
在小型分布式規(guī)模下,數(shù)據(jù)并行可以具有非常不錯的擴(kuò)展性。然而,梯度聚合的通信成本隨著深度學(xué)習(xí)模型大小的增大而增加,并極大的限制了大模型和較低通信帶寬系統(tǒng)的訓(xùn)練效率。針對分布式深度學(xué)習(xí)的數(shù)據(jù)并行訓(xùn)練,其訓(xùn)練過程如下:
- 計(jì)算節(jié)點(diǎn)會從將硬盤或者網(wǎng)絡(luò)中讀出mini-batch大小的數(shù)據(jù)復(fù)制到內(nèi)存中;
- 將數(shù)據(jù)從 CPU內(nèi)存復(fù)制到 GPU內(nèi)存;
- 加載GPU kernel并從前到后分層進(jìn)行計(jì)算輸入數(shù)據(jù)的預(yù)測值(正向傳播);
- 計(jì)算預(yù)測值和真實(shí)值的損失函數(shù)(loss)并進(jìn)行反向傳播,逐層求出損失對權(quán)重參數(shù)的梯度值;
- 將各個(gè)結(jié)點(diǎn)的梯度值進(jìn)行同步 (發(fā)送和接收梯度,即,梯度通信);
- 利用同步后的梯度值結(jié)合優(yōu)化算法對神經(jīng)網(wǎng)絡(luò)的權(quán)重參數(shù)進(jìn)行更新;
以上6步構(gòu)成了一個(gè)神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)過程,也就是一個(gè)Itera。在實(shí)際訓(xùn)練中,為了實(shí)現(xiàn)對神經(jīng)網(wǎng)絡(luò)的參數(shù)進(jìn)行訓(xùn)練,必須進(jìn)行多次的訓(xùn)練。在以上的訓(xùn)練過程中,網(wǎng)絡(luò)通信發(fā)生的環(huán)節(jié)為一、二、五步
。在第一步中,如果使用本機(jī)磁盤來提供資料,那么就不會有通信處理。第二步包括服務(wù)器之間的通信,這是用PCI-e把數(shù)據(jù)傳送到 GPU。在第五步中,網(wǎng)絡(luò)的參數(shù)量大小和規(guī)模主要由神經(jīng)網(wǎng)絡(luò)的參數(shù)和網(wǎng)絡(luò)層的數(shù)目決定。在一般情況下,一個(gè) Iter中的各個(gè)結(jié)點(diǎn)所需傳送和接收的通信數(shù)據(jù)量均與神經(jīng)網(wǎng)絡(luò)的總參數(shù)值大小相等,而所需傳送的數(shù)目則與神經(jīng)網(wǎng)路的層數(shù)有關(guān)。所以,在每個(gè)層次上傳送的通信數(shù)據(jù)量是不一樣的,而頻率區(qū)間也是由運(yùn)算速度決定的。對于常見的CNN網(wǎng)絡(luò),其卷積層參數(shù)量要小于全連接層,所以在反向傳輸時(shí),各個(gè)網(wǎng)絡(luò)層的通信量會出現(xiàn)先大后小的不平衡問題。
因?yàn)閿?shù)據(jù)并行需要每個(gè)設(shè)備將自己模型參數(shù)的梯度信息向其他設(shè)備傳輸。所以其通信容量往往與每一個(gè)批次的數(shù)據(jù)量多少無關(guān),而與模型的大小和并行的設(shè)備數(shù)量有關(guān)。則對于深度神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)并行訓(xùn)練,其總的通信容量如下式所示。
V c o m m u n i c a t i o n = P a r × B y t e × N × ( N ? 1 ) V_{communication}=Par×Byte×N×(N-1) Vcommunication?=Par×Byte×N×(N?1)
其中 P a r Par Par表示模型的參數(shù)量, B y t e Byte Byte是參數(shù)的表示形式,單位為字節(jié),深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練時(shí)通常取4字節(jié)即32位來表示參數(shù)。 N N N為并行計(jì)算的設(shè)備數(shù)量。
三、模型并行
模型并行是將模型分割成不同的塊放到不同的設(shè)備上,按照劃分方式的不同主要有以下圖所示兩種形式。
在數(shù)據(jù)并行的情況下,整個(gè)模型都存儲在內(nèi)存中,不過有時(shí)會數(shù)據(jù)量很大。如果是一般的計(jì)算機(jī),那么內(nèi)存就會不夠,面對這種情況,這個(gè)巨大的模型可以分解成不同的部分用不同的機(jī)器進(jìn)行計(jì)算,從計(jì)算角度上講,就是將張量分成幾個(gè)部分,從模型上講,就是將網(wǎng)絡(luò)的結(jié)構(gòu)分割開來。切分方法有兩種,一種是垂直切分(左圖),另一種是水平切分(右圖)。
垂直切分時(shí)形成多個(gè)分區(qū),相同的分區(qū)放在同一設(shè)備上,每一個(gè)分區(qū)在不同的設(shè)備上并行執(zhí)行。在這種形式下,某一層某個(gè)神經(jīng)元的輸入只有此設(shè)備上來自上一層的特征,而位于其他設(shè)備上的輸入?yún)s不能得到。因此,為了避免這種情況,需要在關(guān)鍵的一些層處進(jìn)行設(shè)備之間的通信,以融合不同設(shè)備上的特征。對于第i層其總的通信容量如下式所示。
V i = o u t × B y t e × N × ( N ? 1 ) V_i=out\times Byte\times N\times(N-1) Vi?=out×Byte×N×(N?1)
其中 o u t out out表示每一個(gè)設(shè)備上輸出的特征數(shù)量, B y t e Byte Byte是參數(shù)的表示形式,單位為字節(jié), N N N為并行計(jì)算的設(shè)備數(shù)量。故,對于垂直切分時(shí)的模型并行來說其總的通信容量如下式所示。
V c o m m u n i c a t i o n = ∑ V i ????? i ∈ ( 1 , 2... L ) V_{communication}=\sum V_i\ \ \ \ \ i\in(1,2...L) Vcommunication?=∑Vi??????i∈(1,2...L)
其中 L L L表示模型總的層數(shù),這里的 i i i根據(jù)具體情況選取 1 1 1到 L L L中的幾個(gè)。
從以上兩式中可以看到,對于垂直切分的模型并行來說,其通信容量主要受到輸出特征值數(shù)量、選取的通信層數(shù)量、設(shè)備數(shù)量有關(guān)。
而對于水平切分,在這種模型并行形式下,可以將幾個(gè)層劃分給一個(gè)設(shè)備,不同設(shè)備劃分得到的層不一致,因?yàn)樵谶@種形式下后后面的層需要前面層的輸出結(jié)果,每個(gè)設(shè)備要將自己計(jì)算的特征傳輸給下一層。所以前后階段流水分批工作,然而,在這種情況下,第一個(gè)設(shè)備計(jì)算時(shí),后面的設(shè)備都處于不工作狀態(tài),這很大程度上降低了并行性。 為了提高并行度,將每一個(gè)層再進(jìn)行按區(qū)劃分,第一個(gè)設(shè)備先執(zhí)行第一個(gè)層的分區(qū)1,執(zhí)行完之后開始執(zhí)行分區(qū)2,這時(shí)設(shè)備2執(zhí)行第二個(gè)層的分區(qū)1,如此反復(fù)計(jì)算傳播以得到最終結(jié)果。對于水平切分時(shí)的模型并行來說其總的通信容量如下式所示。
V c o m m u n i c a t i o n = ∑ i = 1 N o u t i × B y t e V_{communication}=\sum_{i=1}^{N}{{out}_i\times B y t e} Vcommunication?=i=1∑N?outi?×Byte
其中 o u t i {out}_i outi?表示第 i i i個(gè)設(shè)備的輸出特征量, B y t e Byte Byte是參數(shù)的表示形式,單位為字節(jié), N N N為并行計(jì)算的設(shè)備數(shù)量。
從上式中可以看到,對于水平切分的模型并行來說,其通信容量主要受輸出特征值數(shù)量、設(shè)備數(shù)量等影響。
總結(jié)
數(shù)據(jù)并行和模型并行是在分布式計(jì)算中常用的兩種并行計(jì)算策略,用于加速機(jī)器學(xué)習(xí)模型的訓(xùn)練過程。以下是它們的主要特點(diǎn)和區(qū)別總結(jié):
數(shù)據(jù)并行(Data Parallelism):
- 特點(diǎn): 在數(shù)據(jù)并行中,不同的處理單元(通常是不同的計(jì)算節(jié)點(diǎn)或設(shè)備)負(fù)責(zé)處理不同的數(shù)據(jù)子集。每個(gè)處理單元獨(dú)立地計(jì)算模型的梯度,并在一定周期后進(jìn)行參數(shù)更新。
- 優(yōu)點(diǎn): 數(shù)據(jù)并行易于實(shí)現(xiàn),尤其是在擁有大量相似數(shù)據(jù)的情況下。它能夠有效地利用大規(guī)模并行計(jì)算資源。
- 缺點(diǎn): 數(shù)據(jù)傳輸和同步操作可能成為性能瓶頸,尤其是當(dāng)模型參數(shù)量較大時(shí)。此外,對于某些較大的模型結(jié)構(gòu),數(shù)據(jù)并行可能會受到單卡GPU顯存的限制。
模型并行(Model Parallelism):
- 特點(diǎn): 在模型并行中,模型被劃分成多個(gè)部分,不同的處理單元負(fù)責(zé)計(jì)算不同部分的輸出。這通常用于處理較大且無法完全放入內(nèi)存的模型。
- 優(yōu)點(diǎn): 模型并行可以處理超大規(guī)模的模型,因?yàn)椴恍枰淮涡约虞d整個(gè)模型。這對于深度、復(fù)雜的模型是一個(gè)重要的優(yōu)勢。
- 缺點(diǎn): 實(shí)現(xiàn)模型并行通常較為復(fù)雜,因?yàn)樾枰_保各個(gè)部分的輸出正確傳遞并在聯(lián)合訓(xùn)練中協(xié)同工作。此外,同步問題也可能影響性能。
總體而言,數(shù)據(jù)并行和模型并行通常可以結(jié)合使用,以充分發(fā)揮分布式計(jì)算資源的優(yōu)勢。同時(shí),具體選擇使用哪種并行策略取決于問題的性質(zhì)、模型的結(jié)構(gòu)以及可用的硬件資源。
另外,在部分其他文獻(xiàn)或是介紹中,模型并行的垂直切分往往被稱之為Tensor并行
,而模型并行的水平切分往往被稱之為流水并行
,文章來源:http://www.zghlxwxcb.cn/news/detail-821540.html
文中有不對的地方歡迎指正。文章來源地址http://www.zghlxwxcb.cn/news/detail-821540.html
到了這里,關(guān)于分布式深度學(xué)習(xí)中的數(shù)據(jù)并行和模型并行的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!