(國防科技大學(xué),中國 長沙 410073)
(National University of Defense Technology, Changsha 410073, China)
伴隨人工智能研究的第3次浪潮,深度學(xué)習(xí)技術(shù)席卷了圖像分類、語音識別、自動駕駛、內(nèi)容推薦等眾多應(yīng)用領(lǐng)域。深度學(xué)習(xí)的普及促進(jìn)了深度神經(jīng)網(wǎng)絡(luò)的發(fā)展,這些網(wǎng)絡(luò)模型在各種各樣的任務(wù)上都取得了良好的效果。以計(jì)算機(jī)視覺為例,一些經(jīng)過精心設(shè)計(jì)的深度神經(jīng)網(wǎng)絡(luò),例如在ImageNet數(shù)據(jù)集上訓(xùn)練的GoogLeNet和ResNet-50,已經(jīng)在圖像分類任務(wù)上擊敗了人類。然而,訓(xùn)練高性能的網(wǎng)絡(luò)模型常常需要花費(fèi)大量時(shí)間,短則數(shù)小時(shí),長則數(shù)天甚至數(shù)周。
為了減少訓(xùn)練時(shí)間,研究人員通常使用高性能硬件如圖形處理器(GPU)和張量處理器(TPU)等加速深度神經(jīng)網(wǎng)絡(luò)模型的訓(xùn)練。同時(shí),在多個(gè)節(jié)點(diǎn)上并行訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)也是行之有效的加速方法。每個(gè)節(jié)點(diǎn)僅僅執(zhí)行整體計(jì)算任務(wù)的一部分,所以這種分布式訓(xùn)練可以大幅縮短深度神經(jīng)網(wǎng)絡(luò)的訓(xùn)練時(shí)間,如圖1所示。但是,由于網(wǎng)絡(luò)模型訓(xùn)練過程的迭代性,不同的計(jì)算節(jié)點(diǎn)之間往往需要頻繁地進(jìn)行通信以交換大量的數(shù)據(jù),這就導(dǎo)致節(jié)點(diǎn)間的通信成為分布式訓(xùn)練中的關(guān)鍵瓶頸,圖2描述了這種情況。隨著集群規(guī)模的擴(kuò)大,節(jié)點(diǎn)間的通信開銷會急劇地增加。這種現(xiàn)象極大地削弱了分布式訓(xùn)練所帶來的優(yōu)勢,因?yàn)楹艽笠徊糠謺r(shí)間都花在了網(wǎng)絡(luò)數(shù)據(jù)傳輸上。當(dāng)我們使用高性能硬件訓(xùn)練網(wǎng)絡(luò)模型時(shí),通信時(shí)間占整體訓(xùn)練時(shí)間的比例會進(jìn)一步增加,因?yàn)檫@些高性能硬件只減少計(jì)算開銷而沒有降低通信開銷。高昂的通信開銷限制了分布式訓(xùn)練的可擴(kuò)展性。為此,研究者們針對分布式訓(xùn)練過程中的通信行為,展了一系列的優(yōu)化工作。
當(dāng)網(wǎng)絡(luò)模型的訓(xùn)練任務(wù)被部署到多個(gè)節(jié)點(diǎn)上時(shí),我們需要考慮以下幾個(gè)問題:并行化訓(xùn)練任務(wù)的哪一部分?如何組織計(jì)算資源?如何協(xié)調(diào)各個(gè)計(jì)算節(jié)點(diǎn)?
分布式深度學(xué)習(xí)系統(tǒng)面臨的第一個(gè)問題是并行化訓(xùn)練任務(wù)的哪一部分。常見的兩種并行模式為數(shù)據(jù)并行和模型并行,如圖3所示。
在數(shù)據(jù)并行中,首先整個(gè)數(shù)據(jù)集被隨機(jī)且均勻地分配到各個(gè)節(jié)點(diǎn)中,每個(gè)節(jié)點(diǎn)都在本地維護(hù)一個(gè)完整的模型副本。每個(gè)節(jié)點(diǎn)僅讀取和處理唯一的數(shù)據(jù)子集,并在訓(xùn)練期間更新本地模型。然后,將這些本地模型參數(shù)與其他節(jié)點(diǎn)同步以計(jì)算全局參數(shù)。因此,這些全局參數(shù)利用網(wǎng)絡(luò)分配到每個(gè)節(jié)點(diǎn)上,以便開始下一次迭代。
除了數(shù)據(jù)并行,模型并行是另一種方法。該方法將神經(jīng)網(wǎng)絡(luò)模型分割到不同的計(jì)算節(jié)點(diǎn)上,每個(gè)計(jì)算節(jié)點(diǎn)僅負(fù)責(zé)計(jì)算模型的某一部分,只有輸入層所在的節(jié)點(diǎn)才負(fù)責(zé)讀取數(shù)據(jù)。當(dāng)模型太大而無法放到一臺機(jī)器中時(shí),則需要使用模型并行。本文主要關(guān)注常見的數(shù)據(jù)并行技術(shù)。
▲圖1 計(jì)算與通信相對均衡的分布式訓(xùn)練
▲圖2 通信開銷占比過大的分布式訓(xùn)練
▲圖3 數(shù)據(jù)并行與模型并行
分布式深度學(xué)習(xí)系統(tǒng)所面臨的第二個(gè)問題是以何種結(jié)構(gòu)組織計(jì)算節(jié)點(diǎn)。系統(tǒng)的架構(gòu)會影響訓(xùn)練過程中數(shù)據(jù)的傳輸方式和模型更新方式,進(jìn)而影響訓(xùn)練時(shí)間。常見的架構(gòu)包括中心化以及去中心化架構(gòu)。
參數(shù)服務(wù)器架構(gòu)是分布式深度學(xué)習(xí)中最常見的中心化架構(gòu)。參數(shù)服務(wù)器架構(gòu)通常包括若干服務(wù)器和若干工作節(jié)點(diǎn)。其中服務(wù)器上存放著全局共享的模型參數(shù)。如果有多個(gè)服務(wù)器節(jié)點(diǎn),那么模型的權(quán)重參數(shù)會被拆分到每臺機(jī)器上。每個(gè)工作節(jié)點(diǎn)都存儲一個(gè)模型副本(使用數(shù)據(jù)并行)或存儲模型的某一部分(使用模型并行)。工作節(jié)點(diǎn)通過推送/拉取操作與服務(wù)器進(jìn)行通信,而任何工作節(jié)點(diǎn)之間都不會產(chǎn)生通信行為。每次迭代中,每個(gè)工作節(jié)點(diǎn)首先讀取數(shù)據(jù),然后基于這些數(shù)據(jù)計(jì)算本地模型的梯度。隨后,節(jié)點(diǎn)將其本地梯度推送到參數(shù)服務(wù)器。服務(wù)器接收所有工作節(jié)點(diǎn)發(fā)送的梯度后,首先聚合這些梯度,然后更新全局模型,最后工作節(jié)點(diǎn)再從服務(wù)器拉取最新的模型權(quán)重,并使用它進(jìn)行下一次的迭代。
點(diǎn)對點(diǎn)架構(gòu)是一種去中心化的架構(gòu),其中每個(gè)節(jié)點(diǎn)在模型訓(xùn)練中都扮演相同的角色。與參數(shù)服務(wù)器類似,點(diǎn)對點(diǎn)中的每個(gè)節(jié)點(diǎn)都擁有完整的模型副本,并首先基于小批量數(shù)據(jù)計(jì)算本地梯度。對等體系結(jié)構(gòu)使用歸約和廣播等集合通信操作,而不是參數(shù)服務(wù)器體系結(jié)構(gòu)中的推送/拉取操作。經(jīng)過梯度計(jì)算后,每個(gè)對等方首先從其他對等方接收梯度,然后對這些梯度求平均,這就是歸約步。然后,對等方將其本地梯度廣播給所有其他對等方。節(jié)點(diǎn)從其他對等節(jié)點(diǎn)收到所有梯度后,立即更新其本地模型,然后執(zhí)行下一個(gè)迭代。
將訓(xùn)練任務(wù)并行化到多個(gè)節(jié)點(diǎn)上時(shí),如何協(xié)調(diào)這些節(jié)點(diǎn)是一個(gè)大問題。同步更新和異步更新是當(dāng)前的兩種主流方法。
使用同步更新時(shí),兩次迭代之間存在全局屏障。網(wǎng)絡(luò)中的節(jié)點(diǎn)首先計(jì)算局部梯度,然后將梯度與其他節(jié)點(diǎn)同步。由于各種因素,每個(gè)節(jié)點(diǎn)都有不同的完成時(shí)間。在一次迭代中,由于存在全局屏障,計(jì)算較快的節(jié)點(diǎn)不得不等待計(jì)算較慢的節(jié)點(diǎn)。全局屏障的存在導(dǎo)致了“掉隊(duì)者”的問題,較快的節(jié)點(diǎn)需要大量的等待時(shí)間。
為了克服此限制,研究人員提出了異步更新方案。此方案中,兩次迭代之間沒有全局屏障,每個(gè)節(jié)點(diǎn)在從其他節(jié)點(diǎn)接收到參數(shù)之后(無論這些參數(shù)是舊參數(shù)還是新參數(shù)),都立即開始下一次迭代。每個(gè)節(jié)點(diǎn)之間沒有同步屏障,因此某些節(jié)點(diǎn)在更新全局模型參數(shù)時(shí)可能會使用過時(shí)的模型參數(shù)來計(jì)算梯度。數(shù)據(jù)的陳舊性將偏差和方差導(dǎo)入局部梯度和全局模型參數(shù)中,這會導(dǎo)致模型收斂緩慢且沒有收斂性保證。為了應(yīng)對掉隊(duì)者和數(shù)據(jù)陳舊性的問題,延遲異步更新被提出。該方案是同步更新和異步更新的結(jié)合,并對數(shù)據(jù)的陳舊性做了限制。
為了有效地在多節(jié)點(diǎn)上訓(xùn)練深度神經(jīng)網(wǎng)絡(luò),降低訓(xùn)練過程中的通信開銷,業(yè)界已經(jīng)提出了多種通信優(yōu)化策略。由于分布式深度學(xué)習(xí)通信優(yōu)化涉及深度神經(jīng)網(wǎng)絡(luò)、異構(gòu)并行計(jì)算、分布式系統(tǒng)、計(jì)算機(jī)網(wǎng)絡(luò)等眾多技術(shù),從芯片級到系統(tǒng)級有許多涉及網(wǎng)絡(luò)通信優(yōu)化相關(guān)的技術(shù)。
本文嘗試從網(wǎng)絡(luò)協(xié)議棧層次的角度,從通信流量調(diào)度層和網(wǎng)絡(luò)通信執(zhí)行層的角度,對分布式深度學(xué)習(xí)系統(tǒng)的網(wǎng)絡(luò)通信優(yōu)化技術(shù)進(jìn)行初步分類討論,如圖4所示。從通信流量調(diào)度層的角度來看,可以通過降低通信發(fā)生的頻次,來降低通信數(shù)據(jù)量(梯度壓縮)以及計(jì)算通信重疊等技術(shù)優(yōu)化分布式訓(xùn)練的通信過程。在網(wǎng)絡(luò)通信執(zhí)行層面,不同的參數(shù)通信架構(gòu)、不同的消息傳遞庫以及不同的網(wǎng)絡(luò)協(xié)議都會對通信產(chǎn)生影響。網(wǎng)絡(luò)與通信領(lǐng)域的研究人員,對網(wǎng)絡(luò)通信執(zhí)行層面的優(yōu)化技術(shù)往往更為熟悉,實(shí)際上網(wǎng)絡(luò)底層主要采用的還是通用的網(wǎng)絡(luò)技術(shù)。為了追求高性能,分布式深度學(xué)習(xí)系統(tǒng)的網(wǎng)絡(luò)通信優(yōu)化必然是對通信全協(xié)議棧的定制優(yōu)化和協(xié)同設(shè)計(jì)。從這個(gè)角度來看,定制優(yōu)化和協(xié)同設(shè)計(jì)需要深入分析分布式深度學(xué)習(xí)訓(xùn)練系統(tǒng)的通信需求,充分利用底層網(wǎng)絡(luò)技術(shù)的特點(diǎn),從而對分布式深度學(xué)習(xí)訓(xùn)練系統(tǒng)的通信流量進(jìn)行高效調(diào)度與優(yōu)化。
訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)時(shí),整個(gè)訓(xùn)練過程通常需要進(jìn)行多次epoch和迭代。降低通信開銷的一種直接方法是減少通信輪次,而通信輪次與批量大小和通信周期有關(guān)。較大的批量和較長的通信周期都可以減少數(shù)據(jù)交換次數(shù)。
2.1.1 使用大批量進(jìn)行訓(xùn)練
▲圖4 通信優(yōu)化層次
批量大小控制每次迭代時(shí)讀取的數(shù)據(jù)量。在基于數(shù)據(jù)并行的分布式訓(xùn)練中,批量通常指的是全局批量,即所有節(jié)點(diǎn)的本地批量的總和。對于并行化訓(xùn)練,節(jié)點(diǎn)通常在每次迭代結(jié)束時(shí)交換數(shù)據(jù),因此,當(dāng)訓(xùn)練數(shù)據(jù)集的大小固定時(shí),增加批量會減少迭代次數(shù),從而減少通信輪次。梯度和參數(shù)的形狀及大小僅取決于神經(jīng)網(wǎng)絡(luò)模型本身,因此單次迭代傳遞的消息大小總是保持不變,更改批量不會改變每次傳輸?shù)南⒖偭縖1]。大批量帶來的好處是更少的通信輪次。由于具有大批量訓(xùn)練的優(yōu)勢,分布式深度學(xué)習(xí)系統(tǒng)網(wǎng)絡(luò)通信優(yōu)化技術(shù)最近的工作將批量增加到8 k、32 k甚至增加到64 k樣本(1 k表示1 024個(gè)樣本)。然而,當(dāng)固定epoch時(shí),與小批量相比,實(shí)際上直接使用具有大批量的隨機(jī)梯度下降(SGD)通常會帶來泛化能力的下降。由于梯度估計(jì)存在方差,小批量SGD始終收斂到平坦的最小值,而大批量SGD趨向于收斂到尖銳的最小值——尖銳的最小值導(dǎo)致較差的泛化能力。通常,神經(jīng)網(wǎng)絡(luò)模型的泛化能力相較于訓(xùn)練速度來說更為重要。因此,我們需要保證在運(yùn)行相同的epoch下,使用大批量訓(xùn)練的模型具有與小批量訓(xùn)練的模型相近的泛化能力。
2.1.2 周期性通信
通信輪次不僅與批量的大小有關(guān),還與通信周期相關(guān)。前面提到,通信操作常常發(fā)生在每次迭代的末尾。因此,我們可以控制訓(xùn)練進(jìn)程,每隔幾次迭代進(jìn)行通信,進(jìn)而降低通信操作發(fā)生的次數(shù)。實(shí)際上,最常用的方法是本地SGD[2]。為了降低多次通信帶來的巨大開銷,本地SGD讓每個(gè)工作節(jié)點(diǎn)先在本地進(jìn)行若干次迭代,然后再與參數(shù)服務(wù)器同步梯度和全局參數(shù),如圖5所示。實(shí)驗(yàn)證明,只要周期設(shè)置合適,本地SGD可以減少訓(xùn)練時(shí)間的通信開銷并且保證收斂性。
在傳統(tǒng)的深度神經(jīng)網(wǎng)絡(luò)分布式訓(xùn)練過程中,計(jì)算節(jié)點(diǎn)之間交換梯度和模型參數(shù),以進(jìn)行模型聚合和本地計(jì)算。當(dāng)梯度和參數(shù)量很大時(shí),由于交換大量32位浮點(diǎn)變量而導(dǎo)致的通信瓶頸,削弱了并行化帶來的優(yōu)勢。
解決此問題的一個(gè)直接想法是壓縮傳輸?shù)奶荻?,最常用的兩種方法是梯度量化和梯度稀疏化。前一種方法使用低精度數(shù)字(即8位、4位甚至1位)替換32位浮點(diǎn)數(shù),以此來減少傳輸?shù)奶荻攘浚欢笠环N方法則選擇了梯度向量中的一些重要元素來更新模型參數(shù),以避免不必要的傳輸開銷。
2.2.1 梯度量化
梯度和模型參數(shù)中的每個(gè)元素都存儲在電氣和電子工程師協(xié)會標(biāo)準(zhǔn)(IEEE 754)的單精度浮點(diǎn)變量中。交換大量的32位全精度變量經(jīng)常占用大量網(wǎng)絡(luò)帶寬。為了緩解這種通信瓶頸,研究人員嘗試使用低精度浮點(diǎn)數(shù)來表示訓(xùn)練過程中傳輸?shù)奶荻取?/p>
▲圖5 傳統(tǒng)并行SGD與本地SGD的對比
梯度量化的一般性描述為:首先梯度在發(fā)送之前通過量化函數(shù)量化為低精度值,然后在模型訓(xùn)練期間,每個(gè)節(jié)點(diǎn)之間傳輸這些低精度值;接收節(jié)點(diǎn)通過反量化函數(shù)從量化值重構(gòu)原始梯度,再聚合這些重構(gòu)后的梯度向量并更新模型參數(shù)。根據(jù)所使用的量化函數(shù)的性質(zhì),量化操作可以分為確定性量化和隨機(jī)性量化。
確定性量化將梯度元素值映射到某些固定的值。1 bit SGD[3]是確定型量化的典型例子,它根據(jù)梯度元素的取值范圍,將所有的梯度值量化到0和1這兩個(gè)數(shù)字。接收端在收到量化的01序列后,會把其中的0解碼成-1,把1解碼成+1,再進(jìn)行下一步的訓(xùn)練。通常來說,因?yàn)榇_定性量化的固定量化形式會有較多的信息丟失,隨機(jī)性量化應(yīng)運(yùn)而生,這種方法使得量化后的梯度元素值仍然服從某一概率分布。該方法引入了額外的隨機(jī)性,因此量化后的梯度一定是原始梯度的無偏估計(jì),并且必須具有方差約束以確保具有像傳統(tǒng)SGD一樣的收斂性。典型的隨機(jī)性量化方法如量化SGD(QSGD)[4]和TernGrad[5]等。
2.2.2 梯度稀疏化
由于我們需要至少1位來表示梯度向量中的每個(gè)元素,因此梯度量化方法最多只能將數(shù)據(jù)量壓縮32倍。梯度稀疏化則沒有上述壓縮率的限制,它只關(guān)注更新過程中梯度向量和模型參數(shù)中的一些重要值,即那些值遠(yuǎn)大于零的數(shù)字。根據(jù)選擇的元素?cái)?shù)量,稀疏化方法可以達(dá)到非常高的數(shù)據(jù)壓縮率。稀疏化方法的核心是如何從梯度向量中選擇有效值,即如何將稠密更新轉(zhuǎn)換為稀疏更新。常見的稀疏化方法是Top-K,它保留了梯度向量中前K個(gè)較大的絕對值,而將其他值設(shè)置為零。比如,基于Top-K的Gradient Dropping算法[6]在手寫字符識別和機(jī)器翻譯等任務(wù)中取得了良好的加速效果。關(guān)于梯度壓縮,如何平衡模型精度與數(shù)據(jù)壓縮比率是一個(gè)嚴(yán)峻的挑戰(zhàn)。誤差補(bǔ)償已被證明是一種行之有效且兼容大部分壓縮算法的技術(shù)[7]。此外,還有研究者使用了動量屏蔽和梯度裁剪等技術(shù)保證模型的精度[8]。另外,研究者還應(yīng)該關(guān)注如何降低梯度壓縮技術(shù)的計(jì)算開銷,以進(jìn)一步加速模型訓(xùn)練。
現(xiàn)有的深度學(xué)習(xí)框架后端引擎以先進(jìn)先出(FIFO)的順序執(zhí)行操作。因此,按其生成順序發(fā)送梯度,最后一層(輸出層)的梯度先被發(fā)送,然后處理中間層,最后處理輸入層。要完成當(dāng)前迭代并盡早地開始下一次迭代,我們需要減少計(jì)算與第一層通信之間的延遲。
Poseidon系統(tǒng)提供了一種基于分布式訓(xùn)練的固有特性的無等待反向傳播調(diào)度算法[9]:一旦反向傳播計(jì)算出某一層的梯度,后端引擎就開始傳輸該層的梯度數(shù)據(jù)。但是,不同層的參數(shù)量可能并不相同,因此具有不同的計(jì)算和通信時(shí)間。這就意味著Poseidon不一定會比某些特定網(wǎng)絡(luò)模型上的FIFO調(diào)度表現(xiàn)更好。
P3[10](Priority-base Parameter Propagation)通過基于優(yōu)先級的調(diào)度擴(kuò)展了無等待反向傳播。在P3中,靠近輸入層的梯度向量具有較高的優(yōu)先級,而靠近輸出層的梯度具有較低的優(yōu)先級。在訓(xùn)練階段,無論高優(yōu)先級的梯度向量在何時(shí)生成,都將優(yōu)先對其進(jìn)行處理。這樣就保證了其他節(jié)點(diǎn)能夠盡早地接收到靠近輸入層的梯度,從而能夠盡早開始下一次迭代。此外,P3使用張量分割技術(shù)將各層的參數(shù)向量分解為適當(dāng)?shù)男K,并根據(jù)其所在的層為每個(gè)切片分配優(yōu)先級,以實(shí)現(xiàn)更細(xì)粒度的流水線化。高效的計(jì)算通信重疊率可以顯著地加速模型訓(xùn)練過程。但是,當(dāng)前大部分調(diào)度算法都是啟發(fā)式的,這就意味著調(diào)度算法并不是最優(yōu)解。因此,尋找高效的計(jì)算、通信調(diào)度算法至關(guān)重要。目前,已經(jīng)有研究者將貝葉斯優(yōu)化算法[11]和強(qiáng)化學(xué)習(xí)[12]應(yīng)用在算子調(diào)度上。
單步延遲SGD(OD-SGD)[13]算法打破了下一次迭代計(jì)算對上一次迭代中通信過程的依賴,通過實(shí)現(xiàn)計(jì)算過程與通信過程的高度重疊來提升分布式訓(xùn)練性能。該算法結(jié)合了同步SGD和異步SGD兩種更新算法的優(yōu)勢,在保證訓(xùn)練精度的情況下提高分布式訓(xùn)練的速度。圖6展示了在同步SGD算法訓(xùn)練模式和在OD-SGD算法訓(xùn)練模式下的性能對比。假設(shè)單次迭代的計(jì)算開銷和通信開銷均為3個(gè)時(shí)間單位,則在同步SGD算法訓(xùn)練模式下,單次迭代訓(xùn)練的時(shí)間開銷為5個(gè)時(shí)間單位;而在OD-SGD算法訓(xùn)練模式下,單次迭代的時(shí)間開銷為3個(gè)時(shí)間單位,原來額外的2個(gè)時(shí)間單位的通信開銷被隱藏。
在去中心化架構(gòu)下,分布式深度學(xué)習(xí)的訓(xùn)練過程符合全局規(guī)約操作的語義:每個(gè)節(jié)點(diǎn)獨(dú)立計(jì)算局部梯度,然后通過全局規(guī)約運(yùn)算來計(jì)算梯度總和并將其發(fā)送給所有對等節(jié)點(diǎn)。顯然,上述操作可以看作一個(gè)Allreduce運(yùn)算。因此,整個(gè)網(wǎng)絡(luò)通信過程的性能也就取決于Allreduce的性能。
在高性能計(jì)算領(lǐng)域,關(guān)于Allreduce算法的研究已經(jīng)非常充分了。Allreduce是近兩年才在深度學(xué)習(xí)訓(xùn)練系統(tǒng)中得到廣泛應(yīng)用的,其中很有代表性的是Ring-Allreduce,由百度于2017年引入應(yīng)用到主流的深度學(xué)習(xí)框架中。Ring-Allreduce由兩個(gè)階段組成:Reduce-Scatter和Allgather。當(dāng)使用p個(gè)計(jì)算節(jié)點(diǎn)時(shí),每個(gè)階段都包括p-1個(gè)通信步驟。每個(gè)節(jié)點(diǎn)都維護(hù)其本地梯度,本地梯度被平均分為p塊。在Reduce-Scatter階段,每個(gè)節(jié)點(diǎn)發(fā)送和接收張量的不同塊。在p-1個(gè)步驟之后,每個(gè)節(jié)點(diǎn)都具有了一部分塊的全局結(jié)果。在Allgather階段,每個(gè)節(jié)點(diǎn)發(fā)送自己維護(hù)的部分全局結(jié)果,并從其他節(jié)點(diǎn)接收其他部分全局結(jié)果。同樣是p-1個(gè)步驟之后,每個(gè)節(jié)點(diǎn)都擁有完整的全局結(jié)果,如圖7所示。因此,Ring-Allreduce總共需要2×(p-1)個(gè)通信步。
此外,關(guān)于參數(shù)服務(wù)器架構(gòu)及通信特征的詳細(xì)分析,請參考文獻(xiàn)[14]。
在去中心化架構(gòu)下,目前關(guān)于Allreduce的實(shí)現(xiàn)非常多,包括NVIDIA的集合通信庫、Facabook的Gloo以及百度的Allreduce等。以NCCL為例,它針對NVIDIA的GPU,實(shí)現(xiàn)了單機(jī)多卡以及多機(jī)多卡之間的高效GPU通信。在當(dāng)前主流的跨平臺統(tǒng)一分布式訓(xùn)練框架Horovod[15]中,NCCL、Gloo以及MPI都已經(jīng)得到了支持。
對于參數(shù)服務(wù)器架構(gòu)來說,由于其固有的“少對多”的通信模式,因此在常見的實(shí)現(xiàn)中,底層通信模塊總是依賴于點(diǎn)對點(diǎn)的消息庫,例如TensorFlow中的gRPC,以及MXNet中默認(rèn)使用的ZMQ消息庫。盡管MPI中也實(shí)現(xiàn)了低延遲的點(diǎn)對點(diǎn)通信,但是在參數(shù)服務(wù)器架構(gòu)下并不能發(fā)揮出MPI在集合通信方面的優(yōu)勢。
▲圖6 傳統(tǒng)同步隨機(jī)梯度下降與單步延遲隨機(jī)梯度下降的對比
▲圖7 Ring-Allreduce過程
早期的分布式訓(xùn)練框架的通信模塊實(shí)現(xiàn)通?;趥鬏斂刂茀f(xié)議(TCP)/互聯(lián)網(wǎng)協(xié)議(IP),需要先將參數(shù)數(shù)據(jù)復(fù)制到內(nèi)核態(tài)的網(wǎng)絡(luò)協(xié)議棧中,再通過網(wǎng)絡(luò)接口發(fā)出去,這些復(fù)制操作增加了分布式訓(xùn)練的通信延遲。遠(yuǎn)程直接內(nèi)存訪問(RDMA)允許用戶態(tài)進(jìn)程直接讀取和寫入遠(yuǎn)端進(jìn)程的地址空間,是傳統(tǒng)高性能計(jì)算系統(tǒng)中常用的高帶寬低延遲的通信技術(shù)。在當(dāng)前主流的分布式訓(xùn)練框架中,RDMA原語替換了原始的基于套接字和TCP的接口。實(shí)驗(yàn)表明,使用RDMA替換傳統(tǒng)的TCP/IP協(xié)議可以大幅降低分布式訓(xùn)練的同步開銷,提升訓(xùn)練速度,擴(kuò)大訓(xùn)練規(guī)模。
通信開銷是擴(kuò)展大規(guī)模深度學(xué)習(xí)的障礙,訓(xùn)練過程中高昂的通信代價(jià)令人難以接受。本文主要從算法和網(wǎng)絡(luò)兩個(gè)層面介紹了分布式深度學(xué)習(xí)中的通信優(yōu)化策略,其中大部分優(yōu)化策略都是正交的,它們可以進(jìn)行組合,以進(jìn)一步降低分布式深度學(xué)習(xí)訓(xùn)練過程中的通信開銷,加速網(wǎng)絡(luò)模型訓(xùn)練。關(guān)于神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練,還有一個(gè)重要的研究方向是關(guān)于性能模型以及測量工具的探索與實(shí)現(xiàn)。性能模型能夠幫助我們在理論上分析各類開銷,而測量工具則允許我們找到分布式訓(xùn)練中的各類瓶頸。盡管TensorFlow[16]與MXNet都提供了相關(guān)工具,但是我們?nèi)匀恍枰呒壍木W(wǎng)絡(luò)分析工具如Horovod Timeline[15]以及 SketchDLC[14]等。
致謝
本文的部分研究成果和內(nèi)容撰寫得到國防科技大學(xué)徐葉茂博士生的幫助,謹(jǐn)致謝意!