自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深度神經(jīng)網(wǎng)絡(luò)的分布式訓(xùn)練概述:常用方法和技巧全面總結(jié)

開(kāi)發(fā) 開(kāi)發(fā)工具 分布式
本文探索了分布式隨機(jī)梯度下降的同步和異步變體、各種 All Reduce 梯度聚合策略以及用于在集群上實(shí)現(xiàn)更高吞吐量和更低延遲的最佳實(shí)踐。

獨(dú)立研究者 Karanbir Chahal 和 Manraj Singh Grover 與 IBM 的研究者 Kuntal Dey 近日發(fā)布了一篇論文,對(duì)深度神經(jīng)網(wǎng)絡(luò)的分布式訓(xùn)練方法進(jìn)行了全面系統(tǒng)的總結(jié),其中涉及到訓(xùn)練算法、優(yōu)化技巧和節(jié)點(diǎn)之間的通信方法等。機(jī)器之心摘取了論文主干內(nèi)容進(jìn)行介紹,更多有關(guān)數(shù)學(xué)推理過(guò)程和算法步驟的解讀請(qǐng)參閱原論文。

[[248730]]

論文地址:https://arxiv.org/abs/1810.11787

深度學(xué)習(xí)已經(jīng)為人工智能領(lǐng)域帶來(lái)了巨大的發(fā)展進(jìn)步。但是,必須說(shuō)明訓(xùn)練深度學(xué)習(xí)模型需要顯著大量的計(jì)算。在一臺(tái)具有一個(gè)現(xiàn)代 GPU 的單臺(tái)機(jī)器上完成一次基于 ImageNet 等基準(zhǔn)數(shù)據(jù)集的訓(xùn)練可能要耗費(fèi)多達(dá)一周的時(shí)間,研究者已經(jīng)觀察到在多臺(tái)機(jī)器上的分布式訓(xùn)練能極大減少訓(xùn)練時(shí)間。近期的研究已經(jīng)通過(guò)使用 2048 個(gè) GPU 的集群將 ImageNet 訓(xùn)練時(shí)間降低至了 4 分鐘。這篇論文總結(jié)了各種用于分布式訓(xùn)練的算法和技術(shù),并給出了用于現(xiàn)代分布式訓(xùn)練框架的當(dāng)前最佳方法。更具體而言,我們探索了分布式隨機(jī)梯度下降的同步和異步變體、各種 All Reduce 梯度聚合策略以及用于在集群上實(shí)現(xiàn)更高吞吐量和更低延遲的最佳實(shí)踐,比如混合精度訓(xùn)練、大批量訓(xùn)練和梯度壓縮。

1. 引言

(1) 背景和動(dòng)機(jī)

數(shù)據(jù)正以前所未有的規(guī)模生成。大規(guī)模互聯(lián)網(wǎng)公司每天都會(huì)生成數(shù)以 TB 計(jì)的數(shù)據(jù),這些數(shù)據(jù)都需要得到有效的分析以提取出有意義的見(jiàn)解 [1]。新興的深度學(xué)習(xí)是一種用于執(zhí)行這種分析的強(qiáng)大工具,這些算法在視覺(jué) [2]、語(yǔ)言 [3] 和智能推理 [4] 領(lǐng)域的復(fù)雜任務(wù)上創(chuàng)造著當(dāng)前最佳。不幸的是,這些算法需要大量數(shù)據(jù)才能有效地完成訓(xùn)練,而這又會(huì)耗費(fèi)大量時(shí)間。第一個(gè)在 ImageNet 分類(lèi)任務(wù)上取得當(dāng)前最佳結(jié)果的深度學(xué)習(xí)算法在單個(gè) GPU 上訓(xùn)練足足耗費(fèi)了一周時(shí)間。在如今的時(shí)代,這樣的速度已經(jīng)完全不行了,因?yàn)楝F(xiàn)在的模型訓(xùn)練所使用的數(shù)據(jù)甚至?xí)? ImageNet 數(shù)據(jù)集的規(guī)模都相形見(jiàn)絀?,F(xiàn)在存在以橫向方式延展深度學(xué)習(xí)訓(xùn)練的內(nèi)在需求,同時(shí)還要保證能夠維持單 GPU 模型那樣的準(zhǔn)確度。理想情況下,這種訓(xùn)練的速度應(yīng)該隨機(jī)器數(shù)量的增加而線性增大,同時(shí)還要能容錯(cuò)以及能在高延遲網(wǎng)絡(luò)條件下收斂。

(2) 分布式訓(xùn)練概述

神經(jīng)網(wǎng)絡(luò)的分布式訓(xùn)練可以通過(guò)兩種方式實(shí)現(xiàn):數(shù)據(jù)并行化和模型并行化。數(shù)據(jù)并行化的目標(biāo)是將數(shù)據(jù)集均等地分配到系統(tǒng)的各個(gè)節(jié)點(diǎn)(node),其中每個(gè)節(jié)點(diǎn)都有該神經(jīng)網(wǎng)絡(luò)的一個(gè)副本及其本地的權(quán)重。每個(gè)節(jié)點(diǎn)都會(huì)處理該數(shù)據(jù)集的一個(gè)不同子集并更新其本地權(quán)重集。這些本地權(quán)重會(huì)在整個(gè)集群中共享,從而通過(guò)一個(gè)累積算法計(jì)算出一個(gè)新的全局權(quán)重集。這些全局權(quán)重又會(huì)被分配至所有節(jié)點(diǎn),然后節(jié)點(diǎn)會(huì)在此基礎(chǔ)上處理下一批數(shù)據(jù)。

模型并行化則是通過(guò)將該模型的架構(gòu)切分到不同的節(jié)點(diǎn)上來(lái)實(shí)現(xiàn)訓(xùn)練的分布化。AlexNet [2] 是使用模型并行化的最早期模型之一,其方法是將網(wǎng)絡(luò)分?jǐn)偟?2 個(gè) GPU 上以便模型能放入內(nèi)存中。當(dāng)模型架構(gòu)過(guò)大以至于無(wú)法放入單臺(tái)機(jī)器且該模型的某些部件可以并行化時(shí),才能應(yīng)用模型并行化。模型并行化可用在某些模型中,比如目標(biāo)檢測(cè)網(wǎng)絡(luò) [5],這種模型的繪制邊界框和類(lèi)別預(yù)測(cè)部分是相互獨(dú)立的。一般而言,大多數(shù)網(wǎng)絡(luò)只可以分配到 2 個(gè) GPU 上,這限制了可實(shí)現(xiàn)的可擴(kuò)展數(shù)量,因此本論文主要關(guān)注的是數(shù)據(jù)并行化。

本論文大致分為六個(gè)章節(jié),第一節(jié)將介紹已有的優(yōu)化訓(xùn)練算法。第二節(jié)將關(guān)注用于連接網(wǎng)絡(luò)各節(jié)點(diǎn)的通信策略。第三節(jié)會(huì)探索一些具體技術(shù),比如大批量訓(xùn)練、梯度壓縮以及用于在低功耗設(shè)備和低速網(wǎng)絡(luò)條件下實(shí)現(xiàn)有效訓(xùn)練的混合精度訓(xùn)練。第四節(jié)則會(huì)消化之前章節(jié)的信息,并選擇出用于不同設(shè)定的最優(yōu)的訓(xùn)練算法和通信原語(yǔ)。最后兩節(jié)分別是未來(lái)研究方向和總結(jié)。

2. 分布式訓(xùn)練框架的組件

(1) 分布式訓(xùn)練算法

一個(gè)常用于分布式設(shè)定中的訓(xùn)練的常用算法是隨機(jī)梯度下降(SGD),該算法將是我們進(jìn)一步討論中的核心點(diǎn)。需要指出一個(gè)重點(diǎn),針對(duì) SGD 提及的原則可以輕松地移植給其它常用的優(yōu)化算法,比如 Adam [6]、RMSProp [7] 等等 [8]。分布式 SGD 可以大致分成兩類(lèi)變體:異步 SGD 和同步 SGD。

同步 SGD [9] 的目標(biāo)是像分布式設(shè)置一樣對(duì)算法進(jìn)行復(fù)制,由此將網(wǎng)絡(luò)中的節(jié)點(diǎn)緊密地耦合到一起。而異步 SGD [10] 則會(huì)通過(guò)降低節(jié)點(diǎn)之間的依賴(lài)程度而去除不同節(jié)點(diǎn)之間的耦合。盡管這種解耦能實(shí)現(xiàn)更大的并行化,但卻不幸具有副作用,即穩(wěn)定性和準(zhǔn)確性要稍微差一些。人們已經(jīng)提出了一些對(duì)異步 SGD 的修改方式,以期能縮小其與同步 SGD 的準(zhǔn)確度差距。最近的研究趨勢(shì)是擴(kuò)展同步 SGD,更具體而言,即用大批量來(lái)訓(xùn)練網(wǎng)絡(luò)已經(jīng)得到了出色的結(jié)果。

較大的 mini-batch 大小具有一些優(yōu)勢(shì),主要的一個(gè)優(yōu)勢(shì)是:在大 mini-batch 上訓(xùn)練時(shí),模型能以更大的步幅到達(dá)局部最小值,由此能夠加快優(yōu)化過(guò)程的速度。但是在實(shí)踐中,使用大批量會(huì)導(dǎo)致發(fā)散問(wèn)題或「泛化差距」,即網(wǎng)絡(luò)的測(cè)試準(zhǔn)確度有時(shí)會(huì)低于在更小批量上訓(xùn)練的模型。最近的一些研究通過(guò)與批量大小成比例地調(diào)整學(xué)習(xí)率而實(shí)現(xiàn)了在大批量上的訓(xùn)練。實(shí)驗(yàn)發(fā)現(xiàn),增加批量大小就相當(dāng)于降低學(xué)習(xí)率 [11],而使用大批量進(jìn)行訓(xùn)練還有一個(gè)額外的好處,即在訓(xùn)練中所要更新的總參數(shù)更少。通過(guò)將批量大小增大為 8096,以及使用線性學(xué)習(xí)率調(diào)整,已經(jīng)能在一小時(shí)內(nèi)完成在 ImageNet [12] 上的訓(xùn)練了 [9]。一種名為 LARS [13] 的技術(shù)支持使用高達(dá) 32k 的批量大小,[14] 中最近還與混合精度訓(xùn)練結(jié)合到了一起,使用 64k 的批量大小,在 4 分鐘內(nèi)成功完成了在 ImageNet 數(shù)據(jù)庫(kù)上的訓(xùn)練。

(2) 節(jié)點(diǎn)之間的通信

分布式訓(xùn)練還有另一個(gè)重要組件,即節(jié)點(diǎn)之間的數(shù)據(jù)通信。多虧了 GFS [15] 和 Hadoop [16] 等一些分布式文件系統(tǒng),這已經(jīng)是一個(gè)成熟的研究主題了。以點(diǎn)對(duì)點(diǎn)的方式在節(jié)點(diǎn)之間實(shí)現(xiàn)高效且可感知帶寬的通信需要集合通信原語(yǔ)(collective communication primitives)[17],這首先是在高性能計(jì)算(HPC)系統(tǒng)中引入的,之后由 [18] 帶進(jìn)了深度學(xué)習(xí)領(lǐng)域。TensorFlow [19] 和 PyTorch 等現(xiàn)代深度學(xué)習(xí)框架使用了這些原語(yǔ)來(lái)進(jìn)行 All Reduce 過(guò)程,因?yàn)槠湓试S在最優(yōu)的時(shí)間內(nèi)完成互連節(jié)點(diǎn)之間的梯度傳輸。All Reduce [17] 在實(shí)際應(yīng)用中具有多種變體,比如 Ring All Reduce、遞歸減半或倍增(Recursive Halfing/Doubling)、Binary Blocks 算法。

在分布式訓(xùn)練中,為了實(shí)現(xiàn)有效的橫向擴(kuò)展,計(jì)算與通信的配置必須保證最優(yōu)。如果通信步驟是高效的且能與各個(gè)機(jī)器的計(jì)算保持同步,即整個(gè)集群中的計(jì)算應(yīng)該在大致同一時(shí)間結(jié)束,那么訓(xùn)練才是最優(yōu)的。如果網(wǎng)絡(luò)速度慢,那么節(jié)點(diǎn)之間的通信就會(huì)成為瓶頸。梯度壓縮和混合精度訓(xùn)練都是很有潛力的技術(shù),能夠增大網(wǎng)絡(luò)的整體吞吐量。近期的一項(xiàng)研究 [20] 已經(jīng)發(fā)現(xiàn)使用周期性的學(xué)習(xí)率能將實(shí)現(xiàn)網(wǎng)絡(luò)收斂所需的 epoch 數(shù)量降低 10 倍,使其成為了分布式訓(xùn)練方面一個(gè)很有潛力的研究方向。

(3) 隨機(jī)梯度下降(SGD)的變體

隨機(jī)梯度下降 [21] 是一種用于訓(xùn)練神經(jīng)網(wǎng)絡(luò)的優(yōu)化算法。這是梯度下降的一種變體,是一種用于調(diào)整權(quán)重的算法,能在每次反向傳播步驟之后使結(jié)果更接近最小值。SGD 不同于單純的梯度下降,因?yàn)槠涮幚淼氖?mini-batch,而非單個(gè)訓(xùn)練樣本。其形式如下:

其中 w_(t+1) 是為當(dāng)前批計(jì)算出的權(quán)重,n 是 mini-batch 中的訓(xùn)練樣本的數(shù)量,∇l(x, w_t) 是為前一個(gè)訓(xùn)練樣本計(jì)算出的梯度。

對(duì)于分布式的情況,SGD 大致可分為兩類(lèi):異步 SGD 和同步 SGD。后續(xù)的章節(jié)會(huì)詳細(xì)介紹這兩種 SGD 和它們的變體。

3. 同步 SGD

同步 SGD 是一種分布式梯度下降算法,這是當(dāng)前用于分布式訓(xùn)練的最常用優(yōu)化方法之一。網(wǎng)絡(luò)中的節(jié)點(diǎn)首先在它們的本地?cái)?shù)據(jù)批上計(jì)算出梯度,然后每個(gè)節(jié)點(diǎn)都將它們的梯度發(fā)送給主服務(wù)器(master server)。主服務(wù)器通過(guò)求這些梯度的平均來(lái)累積這些梯度,從而為權(quán)重更新步驟構(gòu)建出新的全局梯度集。這些全局梯度會(huì)通過(guò)使用與單機(jī)器 SGD 同樣的配方來(lái)更新每個(gè)節(jié)點(diǎn)的本地權(quán)重。這整個(gè)過(guò)程都類(lèi)似于在單臺(tái)機(jī)器上通過(guò)單個(gè)數(shù)據(jù) mini-batch 計(jì)算前向通過(guò)和反向傳播步驟,因此同步 SGD 能保證收斂。但是同步 SGD 也存在一些局限性。

4. 異步 SGD

異步 SGD 是一種分布式梯度下降算法,允許在不同節(jié)點(diǎn)上使用不同的數(shù)據(jù)子集來(lái)并行地訓(xùn)練多個(gè)模型副本。每個(gè)模型副本都會(huì)向參數(shù)服務(wù)器請(qǐng)求全局權(quán)重,處理一個(gè) mini-batch 來(lái)計(jì)算梯度并將它們發(fā)回參數(shù)服務(wù)器,然后參數(shù)服務(wù)器會(huì)據(jù)此更新全局權(quán)重。因?yàn)槊總€(gè)節(jié)點(diǎn)都獨(dú)立計(jì)算梯度且無(wú)需彼此之間的交互,所以它們可以按自己的步調(diào)工作,也對(duì)機(jī)器故障更為穩(wěn)健,即如果一個(gè)節(jié)點(diǎn)故障,其它節(jié)點(diǎn)還能繼續(xù)處理,因此能消除由同步 SGD 引入的同步屏障(synchronization barrier)問(wèn)題。

5. Ring 算法

[17] 中的 Ring All Reduce 結(jié)合了兩種算法:scatter-reduce 和 all gather。

Ring 算法

圖 1:Ring 算法

scatter reduce 工作 p-1 個(gè)步驟,其中 p 是機(jī)器的數(shù)量。梯度向量被分為 p 塊。

Ring 算法的 scatter reduce

算法 1:Ring 算法的 scatter reduce

在 scatter reduce 過(guò)程結(jié)束后,每臺(tái)機(jī)器都會(huì)有一部分最終結(jié)果?,F(xiàn)在,每臺(tái)機(jī)器只需將自己那部分結(jié)果廣播給所有其它機(jī)器即可。這是使用 all gather 過(guò)程完成的,非常類(lèi)似于 scatter gather,只是在接收數(shù)據(jù)上有些約簡(jiǎn),這部分只是被看作是最終結(jié)果存儲(chǔ)起來(lái)。

Ring 算法的 all gather

算法 2:Ring 算法的 all gather

6. 遞歸減半和倍增算法

[17] 中的遞歸距離倍增和向量減半算法使用了 4 種不同的原語(yǔ),如下所示:

  • 遞歸向量減半:向量在每個(gè)時(shí)間步驟減半。
  • 遞歸向量倍增:分散在各個(gè)進(jìn)程的向量的各個(gè)小塊被遞歸式地收集起來(lái),構(gòu)建成一個(gè)大的向量。
  • 遞歸距離減半:機(jī)器之間的距離在每次通信迭代后減半。
  • 遞歸距離倍增:機(jī)器之間的距離在每次通信迭代后倍增。

減半和倍增算法

圖 2:減半和倍增算法

類(lèi)似于 Ring 算法,這種 All Reduce 算法也由兩個(gè)過(guò)程構(gòu)成:scatter-reduce 和 all gather。該算法與 Ring 算法的不同之處是這些過(guò)程執(zhí)行運(yùn)算的方式。

Scatter Reduce 向量減半算法

算法 3:Scatter Reduce 向量減半算法

All Gather 向量倍增算法

算法 4:All Gather 向量倍增算法

7. Binary Blocks 算法

Binary Blocks 算法是對(duì)遞歸距離倍增和向量減半算法的延展,它的目標(biāo)是當(dāng)機(jī)器數(shù)量不是 2 的乘方數(shù)時(shí)降低負(fù)載的不平衡程度。在用于非 2 的乘方數(shù)情況的原始算法中,有一些機(jī)器會(huì)被閑置在一旁,直到算法執(zhí)行完成,之后它們會(huì)接收結(jié)果得到的向量。這種方法會(huì)導(dǎo)致某些情況下大量機(jī)器空閑,比如,對(duì)于 600 臺(tái)機(jī)器構(gòu)成的集群,會(huì)有 86 臺(tái)機(jī)器空閑,進(jìn)程只會(huì)在另外 512 臺(tái)機(jī)器上執(zhí)行。使用這種方法會(huì)出現(xiàn)很顯著的負(fù)載不平衡。

Binary Blocks 算法是通過(guò)將機(jī)器的數(shù)量分成 2 的乘方數(shù)的多個(gè)模塊來(lái)緩解這個(gè)問(wèn)題。舉個(gè)例子,對(duì)于 600 臺(tái)機(jī)器構(gòu)成的集群,可以分成 4 組,其中每組各有 2^9、2^6、2^4、2^3 臺(tái)機(jī)器。

Binary Blocks 主服務(wù)器算法

算法 5:Binary Blocks 主服務(wù)器算法

Scatter Reduce 主客戶(hù)端算法

算法 6:Scatter Reduce 主客戶(hù)端算法

8. 容錯(cuò)式 All Reduce

如果一個(gè)分布式集群是由低可靠度的設(shè)備構(gòu)成的,那么一旦遇到機(jī)器故障就需要重啟 All Reduce 算法。我們提出了一種容錯(cuò)式 Binary Blocks 算法,將 Raft 共識(shí)算法 [31] 的元素整合進(jìn)了 All Reduce 中。該算法能應(yīng)對(duì)機(jī)器故障,只要備份的副本仍可運(yùn)行,就能繼續(xù)執(zhí)行。

Raft 算法

圖 3:Raft 算法

9. 調(diào)整批量大小

在實(shí)際訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)時(shí),學(xué)習(xí)率會(huì)隨著訓(xùn)練經(jīng)過(guò)多個(gè) epoch 后而緩慢逐漸減小。這背后的直觀思想是讓權(quán)重在訓(xùn)練初期邁開(kāi)更大的步子,隨著模型接近收斂,步子也越來(lái)越小。這在實(shí)踐中的效果相當(dāng)好,并且能比使用固定學(xué)習(xí)率訓(xùn)練的模型達(dá)到更好的收斂程度。這也是一種很高效的方法,因?yàn)槌跗诓捎幂^大的學(xué)習(xí)率能夠在使用更小的學(xué)習(xí)率微調(diào)之前取得很好的進(jìn)展。但是,使用較大的批量大小進(jìn)行訓(xùn)練是一個(gè)很有前景的研究方向,因?yàn)檫@能顯著加速訓(xùn)練過(guò)程,能將訓(xùn)練時(shí)間從數(shù)天降至幾分鐘,正如 [9,14,13] 中證明的那樣;[11] 的研究更是增強(qiáng)了這一趨勢(shì),通過(guò)實(shí)驗(yàn)證明增大批量大小就相當(dāng)于降低學(xué)習(xí)率。

使用更大的批量大小進(jìn)行訓(xùn)練的優(yōu)勢(shì)是模型執(zhí)行的整體權(quán)重更新的數(shù)量更少,這能讓訓(xùn)練速度更快,如圖 4 所示。但是,相比于使用更小批量大小訓(xùn)練的模型,直接使用大批量進(jìn)行訓(xùn)練也會(huì)出現(xiàn)問(wèn)題,比如過(guò)早發(fā)散以及最終驗(yàn)證準(zhǔn)確度更低。

衰減學(xué)習(xí)率與增大批量大小 [11]

圖 4:衰減學(xué)習(xí)率與增大批量大小 [11]

10. 張量融合

對(duì)于 ResNet 等某些常見(jiàn)的模型,研究者已經(jīng)觀察到為梯度計(jì)算的張量的大小是相當(dāng)小的。更具體而言,用于卷積層的梯度張量大小比全卷積層的要小得多。這個(gè)現(xiàn)象是很突出的,因?yàn)橥ㄟ^(guò)線路發(fā)送少量數(shù)據(jù)可能會(huì)導(dǎo)致出現(xiàn)大量延遲,同時(shí)也沒(méi)有充分利用網(wǎng)絡(luò)帶寬。一種解決這一問(wèn)題的簡(jiǎn)單方法是張量融合 [14],簡(jiǎn)單來(lái)說(shuō)就是將多個(gè)小張量融合到一起,形成一個(gè)至少超過(guò)某個(gè)最小大小的張量,之后再在網(wǎng)絡(luò)中發(fā)送這個(gè)融合得到的張量。執(zhí)行這種融合的好處是降低每臺(tái)機(jī)器起始時(shí)間的負(fù)載以及降低網(wǎng)絡(luò)流量的整體頻率。這能讓網(wǎng)絡(luò)變得不再亂七八糟以及在最優(yōu)時(shí)間內(nèi)完成任務(wù)。但是,為小張量使用張量融合可能會(huì)導(dǎo)致 Ring All Reduce 變得低效而緩慢,[14] 提出了一種分層式 All Reduce,使用了多層主從設(shè)置,觀察表明這種方法能帶來(lái)更低的延遲。這種分層式 All Reduce 的工作方式是將所有機(jī)器分成不同的批,之后每一批都選擇一個(gè)主節(jié)點(diǎn)來(lái)聚合梯度。這些主節(jié)點(diǎn)在它們自身上執(zhí)行 Ring All Reduce,之后該主節(jié)點(diǎn)將更新后的梯度分配給它們各自的從節(jié)點(diǎn)。這種策略是通過(guò)降低批的數(shù)量來(lái)降低延遲開(kāi)銷(xiāo),進(jìn)而逐步降低 Ring All Reduce 的開(kāi)銷(xiāo)。使用張量融合能減少小網(wǎng)絡(luò)的處理,并提升網(wǎng)絡(luò)的整體速度,這是很值得推薦的。這種方法在 Horovord [38] 和騰訊的框架 [14] 等產(chǎn)業(yè)系統(tǒng)中得到了廣泛的使用,使其成為了現(xiàn)代分布式訓(xùn)練框架中的重要一員。

11. 低精度訓(xùn)練

在 ImageNet 數(shù)據(jù)庫(kù) [12] 上訓(xùn)練一個(gè) ResNet 模型 [29] 的最快時(shí)間目前是 4 分鐘 [14]。在那項(xiàng)研究中,研究者使用低延遲的零副本 RDMA 網(wǎng)絡(luò)連接了 2048 個(gè) GPU,并且組合性地使用了 LARS 算法、混合 All Reduce 算法、張量融合和混合精度訓(xùn)練。混合 All Reduce 算法結(jié)合了 Ring All Reduce 和分層式的版本,并根據(jù)當(dāng)前步驟的張量大小來(lái)進(jìn)行切換。他們還使用了一種全新的方法才實(shí)現(xiàn)了這樣的整體訓(xùn)練速度增益:混合精度訓(xùn)練 [39]。由此所帶來(lái)的吞吐量和帶寬效率增長(zhǎng)將訓(xùn)練速度提升了 8 倍。顧名思義,混合精度訓(xùn)練是使用兩種不同的數(shù)據(jù)類(lèi)型來(lái)訓(xùn)練神經(jīng)網(wǎng)絡(luò)——更小的數(shù)據(jù)類(lèi)型用于大多數(shù)運(yùn)算,更大的數(shù)據(jù)類(lèi)型用于對(duì)精度要求嚴(yán)格的運(yùn)算。

神經(jīng)網(wǎng)絡(luò)最初是使用單精度或雙精度數(shù)作為默認(rèn)數(shù)據(jù)類(lèi)型,因?yàn)檫@些數(shù)據(jù)類(lèi)型在獲取網(wǎng)絡(luò)想要建模的任務(wù)的表征上表現(xiàn)很好。單精度數(shù)是 32 位浮點(diǎn)數(shù),雙精度數(shù)是 64 位浮點(diǎn)數(shù)。近期有研究表明通過(guò)在更低精度數(shù)據(jù)類(lèi)型進(jìn)行訓(xùn)練,可將神經(jīng)網(wǎng)絡(luò)的速度和大小降低 50%-80% [40, 41]。一種常用方法是使用 16 位浮點(diǎn)數(shù)來(lái)訓(xùn)練網(wǎng)絡(luò)(FP16 訓(xùn)練),但與使用單精度訓(xùn)練的同樣網(wǎng)絡(luò)相比,這些網(wǎng)絡(luò)的測(cè)試準(zhǔn)確度會(huì)更差一些 [39]。這種情況的原因主要是權(quán)重更新步驟的精度更低。更具體而言,將低精度梯度與學(xué)習(xí)率相乘有時(shí)會(huì)導(dǎo)致數(shù)值溢出 16 位的范圍,從而導(dǎo)致計(jì)算不正確,進(jìn)而導(dǎo)致最終驗(yàn)證準(zhǔn)確度損失。

混合精度訓(xùn)練 [39] 的目標(biāo)是通過(guò)使用單精度(32 位)的權(quán)重主副本并以半精度(16 位)運(yùn)行其它一切來(lái)解決這個(gè)問(wèn)題。

混合精度訓(xùn)練能實(shí)現(xiàn)更高的吞吐量,從而能降低計(jì)算與通信瓶頸。但是,混合精度訓(xùn)練也存在一些需要注意的是像,即損失丟失和算術(shù)精度更低。

12. 梯度和參數(shù)壓縮

擴(kuò)展分布式訓(xùn)練過(guò)程的一個(gè)主要瓶頸是節(jié)點(diǎn)之間的模型權(quán)重和梯度通信具有很高的帶寬成本。當(dāng)在使用了聯(lián)盟學(xué)習(xí)(federated learning)[42] 的設(shè)備(尤其是移動(dòng)設(shè)備)上訓(xùn)練時(shí),這個(gè)瓶頸會(huì)尤其顯著,因?yàn)槠浯嬖诰W(wǎng)絡(luò)帶寬低和連接速度慢的問(wèn)題。針對(duì)這一問(wèn)題,研究者已經(jīng)提出了多種用于高效利用網(wǎng)絡(luò)帶寬的方法。使用 SGD 的異步和同步變體允許節(jié)點(diǎn)各自獨(dú)立地通信,同時(shí)還能實(shí)現(xiàn)并行化并將網(wǎng)絡(luò)帶寬利用提升到一定程度 [10,43,44];另外在梯度壓縮上已經(jīng)取得一些顯著進(jìn)展也很有希望 [45]。這些方法主要基于兩大思想:量化和稀疏化。

算法 7:用于節(jié)點(diǎn) k 上單純的動(dòng)量 SGD 的深度梯度壓縮

13. 未來(lái)研究

過(guò)去幾年來(lái),分布式訓(xùn)練領(lǐng)域已經(jīng)取得了很大的進(jìn)展,并已為進(jìn)一步創(chuàng)新做好了準(zhǔn)備。相關(guān)領(lǐng)域目前正在增大 mini-batch 大小的限制,直到網(wǎng)絡(luò)不會(huì)發(fā)散或降低同步 SGD 的最終驗(yàn)證準(zhǔn)確度的程度,還在研究解決異步 SGD 的 stale 梯度和最終驗(yàn)證準(zhǔn)確度降低的問(wèn)題。在更低功耗的設(shè)備上進(jìn)行訓(xùn)練已經(jīng)以聯(lián)盟學(xué)習(xí)(federated learning)[42] 的形式獲得一些發(fā)展勢(shì)頭,也出現(xiàn)了一些用于安全和去中心化訓(xùn)練的現(xiàn)代深度學(xué)習(xí)框架構(gòu)建模塊。在消費(fèi)級(jí)設(shè)備上訓(xùn)練有一些好處,其中之一是能夠打造能基于消費(fèi)者交互學(xué)習(xí)特定習(xí)慣的智能應(yīng)用,而且通過(guò)在設(shè)備上存儲(chǔ)數(shù)據(jù)和執(zhí)行訓(xùn)練,還能保證用戶(hù)的數(shù)據(jù)隱私。這類(lèi)應(yīng)用的一個(gè)案例是 Android Predictive Keyboard(安卓預(yù)測(cè)鍵盤(pán)),它能在設(shè)備上學(xué)習(xí)用于預(yù)測(cè)下一個(gè)詞的小型個(gè)性化模型。在低功耗設(shè)備上訓(xùn)練的一個(gè)關(guān)鍵難題是可用的網(wǎng)絡(luò)帶寬和計(jì)算資源很少。高效的框架也許可以實(shí)現(xiàn)在手機(jī)和物聯(lián)網(wǎng)設(shè)備上的大規(guī)模訓(xùn)練,從而實(shí)現(xiàn)便攜式的深度學(xué)習(xí)應(yīng)用。[54] 已經(jīng)在低功耗設(shè)備上的分布式訓(xùn)練方面做出了一些出色的工作,其使用了強(qiáng)化學(xué)習(xí)算法來(lái)調(diào)度在異構(gòu)式設(shè)備集群上的訓(xùn)練任務(wù)。在商品級(jí)設(shè)備上進(jìn)行分布式訓(xùn)練需要在訓(xùn)練和通信方面進(jìn)行多種優(yōu)化。梯度壓縮和混合精度訓(xùn)練是少數(shù)幾種結(jié)果優(yōu)良且很有希望的方向。整體而言,這個(gè)領(lǐng)域的研究方向很活躍且存在很多創(chuàng)新,并已經(jīng)做好準(zhǔn)備,即將成為更廣泛智能應(yīng)用的核心組件。

總結(jié)

我們介紹和總結(jié)了分布式訓(xùn)練框架的各個(gè)組件。為了打造一個(gè)高效且可擴(kuò)展的分布式訓(xùn)練框架,我們推薦使用以下技術(shù):

推薦使用同步 SGD 算法來(lái)進(jìn)行訓(xùn)練,因?yàn)樗袊?yán)格的收斂保證。

應(yīng)該使用 Binary Blocks 算法來(lái)執(zhí)行梯度累積的 All Reduce 流程,因?yàn)槠溥\(yùn)行時(shí)間更優(yōu)。

為了有效地使用硬件和網(wǎng)絡(luò)帶寬,應(yīng)該在框架中使用梯度壓縮、量化和混合精度訓(xùn)練等多種技術(shù)。我們推薦組合式地使用深度梯度壓縮和混合精度訓(xùn)練。

應(yīng)該使用非常大的批量大小來(lái)進(jìn)行訓(xùn)練,以最大化并行能力和最小化運(yùn)行時(shí)間。我們推薦使用 LARS 算法,因?yàn)橐延醒芯孔C明它能夠以高達(dá) 64000 的批量大小足夠穩(wěn)健地訓(xùn)練網(wǎng)絡(luò)。

【本文是51CTO專(zhuān)欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專(zhuān)欄
相關(guān)推薦

2022-10-17 15:43:14

深度學(xué)習(xí)回歸模型函數(shù)

2017-12-22 08:47:41

神經(jīng)網(wǎng)絡(luò)AND運(yùn)算

2017-03-30 17:54:28

深度神經(jīng)網(wǎng)絡(luò)人工智能 DNN

2025-01-15 08:34:00

分布式事務(wù)服務(wù)

2024-11-06 12:29:02

2011-07-26 09:57:02

分布式網(wǎng)絡(luò)管理帶外網(wǎng)絡(luò)

2017-09-01 05:35:58

分布式計(jì)算存儲(chǔ)

2025-01-26 11:54:39

分布式存儲(chǔ)系統(tǒng)

2018-08-28 15:47:03

人工智能深度學(xué)習(xí)機(jī)器學(xué)習(xí)

2021-12-28 08:48:54

PyTorch神經(jīng)網(wǎng)絡(luò)人工智能

2023-11-08 10:25:00

模型技術(shù)

2019-08-19 00:31:16

Pytorch神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)

2017-05-04 18:30:34

大數(shù)據(jù)卷積神經(jīng)網(wǎng)絡(luò)

2020-10-30 07:47:42

分布式

2022-06-14 13:55:30

模型訓(xùn)練網(wǎng)絡(luò)

2018-05-19 00:26:13

UAI Train分布式訓(xùn)練

2022-05-20 11:01:06

模型性能框架

2019-07-22 09:35:23

RedisSentinel

2019-05-05 08:37:39

分布式PyTorchGPU

2018-02-05 08:58:36

Python神經(jīng)網(wǎng)絡(luò)識(shí)別圖像
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)