大模型分布式并行技術(shù)--分布式系統(tǒng)
近年來(lái), 大多數(shù)出現(xiàn)在頂級(jí)人工智能會(huì)議上的模型都是在多個(gè) GPU 上訓(xùn)練的, 特別是隨著基于 Transformer 的語(yǔ)言模型的提出。當(dāng)研究人員和工程師開(kāi)發(fā)人工智能模型時(shí), 分布式訓(xùn)練無(wú)疑是一種常見(jiàn)的做法。傳統(tǒng)的單 機(jī)單卡模式已經(jīng)無(wú)法滿足超大模型進(jìn)行訓(xùn)練的要求,這一趨勢(shì)背后有幾個(gè)原因。
- 模型規(guī)模迅速增加。2018 年的 BERT-Large 有 3.45 億的參數(shù), 2018 年的 GPT-2 有 15 億的參數(shù), 而 2020 年 的 GPT-3 有 1750 億個(gè)參數(shù)。很明顯, 模型規(guī)模隨著時(shí)間的推移呈指數(shù)級(jí)增長(zhǎng)。目前最大的模型已經(jīng)超過(guò) 了萬(wàn)億個(gè)參數(shù)。而與較小的模型相比,超大型模型通常能提供更優(yōu)越的性能。
- 數(shù)據(jù)集規(guī)模迅速增加。從 GPT- 1 ,GPT-2 再到 GPT-3,訓(xùn)練數(shù)據(jù)分別為 5GB ,40GB ,45TB (清洗后約為 570GB),數(shù)量量爆炸性增長(zhǎng)。
- 計(jì)算能力越來(lái)越強(qiáng)。隨著半導(dǎo)體行業(yè)的進(jìn)步, 顯卡變得越來(lái)越強(qiáng)大。由于核的數(shù)量增多, GPU 是深度學(xué)習(xí) 最常見(jiàn)的算力資源。從 2012 年的 K10 GPU 到 2020 年的 A100 GPU,計(jì)算能力已經(jīng)增加了幾百倍。這使我 們能夠更快地執(zhí)行計(jì)算密集型任務(wù),而深度學(xué)習(xí)正是這樣一項(xiàng)任務(wù)。
如今, 我們接觸到的模型可能太大, 以致于無(wú)法裝入一個(gè) GPU,而數(shù)據(jù)集也可能大到足以在一個(gè) GPU 上訓(xùn) 練上百天。這時(shí), 只有用不同的并行化技術(shù)在多個(gè) GPU 上訓(xùn)練我們的模型, 我們才能完成并加快模型訓(xùn)練, 以 追求在合理的時(shí)間內(nèi)獲得想要的結(jié)果。因此,我們需要進(jìn)行單機(jī)多卡、甚至是多機(jī)多卡進(jìn)行大模型的訓(xùn)練。
而利用 AI 集群, 使深度學(xué)習(xí)算法更好地從大量數(shù)據(jù)中訓(xùn)練出性能優(yōu)良的大模型是分布式機(jī)器學(xué)習(xí)的首要目 標(biāo)。為了實(shí)現(xiàn)該目標(biāo), 一般需要根據(jù)硬件資源與數(shù)據(jù)/模型規(guī)模的匹配情況, 考慮對(duì)計(jì)算任務(wù)、訓(xùn)練數(shù)據(jù)和模型 進(jìn)行劃分,進(jìn)行分布式存儲(chǔ)和分布式訓(xùn)練。
分布式系統(tǒng)
分布式系統(tǒng)由多個(gè)軟件組件組成, 在多臺(tái)機(jī)器上運(yùn)行。例如, 傳統(tǒng)的數(shù)據(jù)庫(kù)運(yùn)行在一臺(tái)機(jī)器上。隨著數(shù)據(jù)量 的爆發(fā)式增長(zhǎng), 單臺(tái)機(jī)器已經(jīng)不能為企業(yè)提供理想的性能。特別是在雙十一這樣的網(wǎng)絡(luò)狂歡節(jié), 網(wǎng)絡(luò)流量會(huì)出 乎意料的大。為了應(yīng)對(duì)這種壓力, 現(xiàn)代高性能數(shù)據(jù)庫(kù)被設(shè)計(jì)成在多臺(tái)機(jī)器上運(yùn)行, 它們共同為用戶提供高吞吐 量和低延遲。
分布式系統(tǒng)示例
分布式系統(tǒng)的一個(gè)重要評(píng)價(jià)指標(biāo)是可擴(kuò)展性。例如, 當(dāng)我們?cè)?4 臺(tái)機(jī)器上運(yùn)行一個(gè)應(yīng)用程序時(shí), 我們自然希望該應(yīng)用程序的運(yùn)行速度能提高 4 倍。然而, 由于通信開(kāi)銷(xiāo)和硬件性能的差異, 很難實(shí)現(xiàn)線性提速。因此, 當(dāng)我 們實(shí)現(xiàn)應(yīng)用程序時(shí), 必須考慮如何使其更快。良好的設(shè)計(jì)和系統(tǒng)優(yōu)化的算法可以幫助我們提供良好的性能。有 時(shí),甚至有可能實(shí)現(xiàn)線性和超線性提速??傆?xùn)練速度可以用如下公式簡(jiǎn)略估計(jì):
總訓(xùn)練速度 ∝ 單設(shè)備計(jì)算速度 × 計(jì)算設(shè)備總量 × 多設(shè)備加速比
其中, 單設(shè)備計(jì)算速度主要由單塊計(jì)算加速芯片的運(yùn)算速度和數(shù)據(jù) I/O 能力來(lái)決定, 對(duì)單設(shè)備訓(xùn)練效率進(jìn)行優(yōu) 化, 主要的技術(shù)手段有混合精度訓(xùn)練、算子融合、梯度累加等; 分布式訓(xùn)練系統(tǒng)中計(jì)算設(shè)備數(shù)量越多, 其理論峰 值計(jì)算速度就會(huì)越高, 但是受到通訊效率的影響, 計(jì)算設(shè)備數(shù)量增大則會(huì)造成加速比急速降低; 多設(shè)備加速比 則是由計(jì)算和通訊效率決定, 需要結(jié)合算法和網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)進(jìn)行優(yōu)化, 分布式訓(xùn)練并行策略主要目標(biāo)就是提升 分布式訓(xùn)練系統(tǒng)中的多設(shè)備加速比。
分布式訓(xùn)練需要多臺(tái)機(jī)器/GPU。在訓(xùn)練期間, 這些設(shè)備之間會(huì)有通信。為了更好地理解分布式訓(xùn)練, 有幾個(gè)重要的術(shù)語(yǔ)需要我們了解清楚。
- host: 主機(jī) (host) 是通信網(wǎng)絡(luò)中的主要設(shè)備。在初始化分布式環(huán)境時(shí),經(jīng)常需要它作為一個(gè)參數(shù)。 port: 這里的端口 (port) 主要是指主機(jī)上用于通信的主端口。
- rank: 在網(wǎng)絡(luò)中賦予設(shè)備的唯一 ID。
- world size: 網(wǎng)絡(luò)中設(shè)備的數(shù)量。
- process group: 進(jìn)程組 (process group) 是一個(gè)通信網(wǎng)絡(luò), 包括設(shè)備的一個(gè)子集??偸怯幸粋€(gè)默認(rèn)的進(jìn)程組, 它包含所有的設(shè)備。一個(gè)子集的設(shè)備可以形成一個(gè)進(jìn)程組,以便它們只在組內(nèi)的設(shè)備之間進(jìn)行通信。
讓我們假設(shè)我們有 2 臺(tái)機(jī)器(也稱(chēng)為節(jié)點(diǎn)),每臺(tái)機(jī)器有 4 個(gè) GPU,參考上圖。當(dāng)我們?cè)谶@兩臺(tái)機(jī)器上初始 化分布式環(huán)境時(shí),我們基本上啟動(dòng)了 8 個(gè)進(jìn)程(每臺(tái)機(jī)器上有 4 個(gè)進(jìn)程),每個(gè)進(jìn)程被綁定到一個(gè) GPU 上。在初始化分布式環(huán)境之前, 我們需要指定主機(jī)(主地址) 和端口(主端口)。在這個(gè)例子中, 我們可以讓主 機(jī)為節(jié)點(diǎn) 0,端口為一個(gè)數(shù)字, 如 29500。所有的 8 個(gè)進(jìn)程將尋找地址和端口并相互連接, 默認(rèn)的進(jìn)程組將被創(chuàng) 建。默認(rèn)進(jìn)程組的 world size 為 8,細(xì)節(jié)如下表。
進(jìn)程組示例
我們還可以創(chuàng)建一個(gè)新的進(jìn)程組。這個(gè)新的進(jìn)程組可以包含任何進(jìn)程的子集。例如, 我們可以創(chuàng)建一個(gè)只 包含偶數(shù)進(jìn)程的組,如下表所示:
在進(jìn)程組中,各進(jìn)程可以通過(guò)兩種方式進(jìn)行通信,下圖中展示了部分進(jìn)程組中進(jìn)程通信示例。
- collective: 一組進(jìn)程一起執(zhí)行分散、聚集、 all-reduce 、廣播等操作。
進(jìn)程組中進(jìn)程通信示例
目前的大語(yǔ)言模型都采用了分布式訓(xùn)練架構(gòu)完成訓(xùn)練。GPT-3 的訓(xùn)練全部使用 NVIDIA V100 GPU 。OPT 使 用了 992 塊 NVIDIA A100 80G GPU,采用全分片數(shù)據(jù)并行 (Fully Shared Data Parallel) 以及 Megatron-LM 張量并 行 (Tensor Parallelism),整體訓(xùn)練時(shí)間將近 2 個(gè)月。BLOOM 模型的研究人員則公開(kāi)了更多在硬件和所采用的系 統(tǒng)架構(gòu)方面的細(xì)節(jié)。該模型的訓(xùn)練一共花費(fèi) 3.5 個(gè)月, 使用 48 個(gè)計(jì)算節(jié)點(diǎn), 每個(gè)節(jié)點(diǎn)包含 8 塊 NVIDIA A100 80G GPU (總計(jì) 384 個(gè) GPU),并且使用 4*NVLink 用于節(jié)點(diǎn)內(nèi)部 GPU 之間通信, 節(jié)點(diǎn)之間采用四個(gè) Omni-Path 100 Gbps 網(wǎng)卡構(gòu)建的增強(qiáng) 8 維超立方體全局拓?fù)渚W(wǎng)絡(luò)進(jìn)行通信。LLaMA 模型訓(xùn)練給出了不同參數(shù)規(guī)模的總 GPU 小 時(shí)數(shù)。LLaMA 模型訓(xùn)練采用 A100-80GB GPU,LLaMA-7B 模型訓(xùn)練需要 82432 GPU 小時(shí), LLaMA- 13B 模型訓(xùn) 練需要 135168 GPU 小時(shí), LLaMA-33B 模型訓(xùn)練花費(fèi)了 530432 GPU 小時(shí), 而 LLaMA-65B 模型訓(xùn)練花費(fèi)則高達(dá) 1022362 GPU 小時(shí)。由于 LLaMA 所使用的訓(xùn)練數(shù)據(jù)量遠(yuǎn)超 OPT 和 BLOOM 模型, 因此, 雖然模型參數(shù)量遠(yuǎn)小 于上述兩個(gè)模型,但是其所需計(jì)算量仍然非常驚人。
通過(guò)使用分布式訓(xùn)練系統(tǒng), 大語(yǔ)言模型訓(xùn)練周期可以從單計(jì)算設(shè)備花費(fèi)幾十年, 縮短到使用數(shù)千個(gè)計(jì)算設(shè) 備花費(fèi)幾十天就可以完成。然而, 分布式訓(xùn)練系統(tǒng)仍然需要克服計(jì)算墻、顯存墻、通信墻等多種挑戰(zhàn), 以確保集 群內(nèi)的所有資源得到充分利用,從而加速訓(xùn)練過(guò)程并縮短訓(xùn)練周期。
- 計(jì)算墻:?jiǎn)蝹€(gè)計(jì)算設(shè)備所能提供的計(jì)算能力與大語(yǔ)言模型所需的總計(jì)算量之間存在巨大差異。2022 年 3 年 發(fā)布的 NVIDIA H100 SXM 的單卡 FP16 算力也只有 2000 TFLOPs,而 GPT-3 則需要 314 ZFLOPs 的總算 力,兩者相差了 8 個(gè)數(shù)量級(jí)。
- 顯存墻:?jiǎn)蝹€(gè)計(jì)算設(shè)備無(wú)法完整存儲(chǔ)一個(gè)大語(yǔ)言模型的參數(shù)。GPT-3 包含 1750 億參數(shù), 如果采用FP16 格 式進(jìn)行存儲(chǔ),需要 700GB 的計(jì)算設(shè)備內(nèi)存空間,而 NVIDIA H100 GPU 只有 80 GB 顯存。
- 通信墻:分布式訓(xùn)練系統(tǒng)中各計(jì)算設(shè)備之間需要頻繁地進(jìn)行參數(shù)傳輸和同步。由于通信的延遲和帶寬限制, 這可能成為訓(xùn)練過(guò)程的瓶頸。GPT-3 訓(xùn)練過(guò)程中, 如果分布式系統(tǒng)中存在 128 個(gè)模型副本, 那么在每次迭 代過(guò)程中至少需要傳輸 89.6TB 的梯度數(shù)據(jù)。而截止 2023 年 8 月, 單個(gè) InfiniBand 鏈路僅能夠提供不超過(guò)800Gb/s 帶寬。
計(jì)算墻和顯存墻源于單計(jì)算設(shè)備的計(jì)算和存儲(chǔ)能力有限, 與模型對(duì)龐大計(jì)算和存儲(chǔ)需求之間存在矛盾。這個(gè)問(wèn) 題可以通過(guò)采用分布式訓(xùn)練方法來(lái)解決, 但分布式訓(xùn)練又會(huì)面臨通信墻的挑戰(zhàn)。在多機(jī)多卡的訓(xùn)練中, 這些問(wèn) 題逐漸顯現(xiàn)。隨著大模型參數(shù)的增大, 對(duì)應(yīng)的集群規(guī)模也隨之增加, 這些問(wèn)題變得更加突出。同時(shí), 在大型集群 進(jìn)行長(zhǎng)時(shí)間訓(xùn)練時(shí),設(shè)備故障可能會(huì)影響或中斷訓(xùn)練過(guò)程,對(duì)分布式系統(tǒng)的問(wèn)題性也提出了很高要求。