1. 大模型的挑戰(zhàn)
GPT-3 175B模型的參數(shù)如下: 網(wǎng)絡(luò)層(Number of layers): 96 句子長度(Sequence length): 2048 隱藏層大小(Hidden layer size): 12288 詞匯表(Vocabulary size):51200 總參數(shù)量:約175B
1.1 對顯存的挑戰(zhàn)
175B的模型,一個原生沒有經(jīng)過優(yōu)化的框架執(zhí)行,各部分大概需要的顯存空間: 模型參數(shù):700 GB (175B * 4bytes) 參數(shù)對應(yīng)的梯度:700 GB 優(yōu)化器狀態(tài):1400 GB 所以,一個175B模型共需要大概2.8 TB的顯存空間,這對 GPU 顯存是巨大的挑戰(zhàn): 1)模型在單卡、單機上存放不下。以NVIDIA A10080GB為例,存放此模型需要超過35塊。 2) 必須使用模型并行,并且需要跨機器。主流的A100 服務(wù)器是單機八卡,需要在多臺機器之間做模型切分。
1.2 對計算的挑戰(zhàn)
基于Transformer 架構(gòu)的模型計算量主要來自于Transformer層和 logit 層里的矩陣乘,可以得出每個迭代步大致需要的計算量: B: 批大小,S:句子長度,l:Transformer 層數(shù),h:隱藏層大小,V:詞匯表大小 這是真實計算量的一個下限,但已是非常接近真實的計算量。關(guān)于此公式的詳細(xì)說明,請參考 NVIDIA Paper(https:///abs/2104.04473)里的附錄章節(jié)。 其中S=2048, l=96, h=12288, V=51200,在我們的實踐中,B = 1536,一共需要迭代大約95000次。代入這次參數(shù)到上述公式,可以得到: 一次迭代的計算量:4.5 ExaFLOPS. 完整訓(xùn)練的計算量:430 ZettaFLOPS (~95K 次迭代) 這是一個巨大的計算量,以最新的NVIDIA A100的FP16計算能力 312 TFLOPS來計算,即使不考慮計算效率和擴展性的情況,需要大概16K A100*days的計算量。直觀可以理解為16000塊A100一天的計算量,或者一塊A100 跑43.8年的計算量。
1.3 對通信的挑戰(zhàn)
訓(xùn)練過程中GPU之間需要頻繁的通信,這些通信源于模型并行和數(shù)據(jù)并行的應(yīng)用,而不同的并行劃分策略產(chǎn)生的通信模式和通信量不盡相同。 對于數(shù)據(jù)并行來說,通信發(fā)生在后向傳播,用于梯度通信,通信類型為AllReduce,每次后向傳播中的通信量為每個GPU上的模型大小。 對于模型并行來說,稍微復(fù)雜些。模型并行通常有橫切和豎切兩種,比如把一個模型按網(wǎng)絡(luò)層從左到右橫著擺放,橫切即把每個網(wǎng)絡(luò)層切成多份(Intra-layer),每個GPU上計算網(wǎng)絡(luò)層的不同切塊,也稱為Tensor(張量)模型并行。豎切即把不同的網(wǎng)絡(luò)層切開(Inter-layer),每個GPU上計算不同的網(wǎng)絡(luò)層,也稱為Pipeline (流水線)模型并行。 模型并行切分:上圖為Pipeline模型并行切分,下圖為Tensor模型并行切分 對于Tensor模型并行,通信發(fā)生在每層的前向和后向傳播,通信類型為AllReduce,通信頻繁且通信量比較大。 對于Pipeline 模型并行,通信發(fā)生在相鄰的切分點,通信類型主要為P2P,每次通信數(shù)據(jù)量比較少但比較頻繁,而且會引入額外的GPU 空閑等待時間。
2 目前的一些解決方式
參考資料:全網(wǎng)最全-超大模型+分布式訓(xùn)練架構(gòu)和經(jīng)典論文 訓(xùn)練千億參數(shù)大模型,離不開四種GPU并行策略
- 分布式并行加速:
并行訓(xùn)練主要分為數(shù)據(jù)并行、模型并行、流水線并行、張量并行四種并行方式,通過上述四種主要的分布式并行策略來作為大模型訓(xùn)練并行的主要策略。 - 算法模型架構(gòu):
大模型訓(xùn)練離不開Transformer網(wǎng)絡(luò)模型結(jié)構(gòu)的提出,后來到了萬億級稀疏場景中經(jīng)常遇到專家混合模型MoE都是大模型離不開的新算法模型結(jié)構(gòu)。 - 內(nèi)存和計算優(yōu)化:
關(guān)于內(nèi)存優(yōu)化技術(shù)主要由激活A(yù)ctivation重計算、內(nèi)存高效的優(yōu)化器、模型壓縮,而計算優(yōu)化則集中體現(xiàn)在混合精度訓(xùn)練、算子融合、梯度累加等技術(shù)上。
Horovod、Tensorflow Estimator、PyTorch DDP等支持?jǐn)?shù)據(jù)并行, Gpipe、PipeDream、PipeMare等支持流水并行, Mesh Tensorflow、FlexFlow、OneFlow、MindSpore等支持算子拆分
總訓(xùn)練速度 ∝ 單卡速度 * 加速芯片數(shù)量 * 多卡加速比
- 單卡速度
單卡速度既然是運算速度和數(shù)據(jù)IO的快慢來決定,那么就需要對單卡訓(xùn)練進行優(yōu)化,于是主要的技術(shù)手段有精度訓(xùn)練、算子融合、梯度累加來加快單卡的訓(xùn)練性能。 - 加速芯片數(shù)量
理論上,AI芯片數(shù)量越多,模型訓(xùn)練越快。但是,隨著訓(xùn)練數(shù)據(jù)集規(guī)模的進一步增長,加速比的增長并不明顯。如數(shù)據(jù)并行就會出現(xiàn)局限性,當(dāng)訓(xùn)練資源擴大到一定規(guī)模時,由于通信瓶頸的存在,增加計算資源的邊際效應(yīng)并明顯,甚至增加資源也沒辦法進行加速。這時候需要通訊拓?fù)溥M行優(yōu)化,例如通過ring-all-reduce的通訊方式來優(yōu)化訓(xùn)練模式。 - 多卡加速比
多卡加速比既然由計算、通訊效率決定,那么就需要結(jié)合算法和集群中的網(wǎng)絡(luò)拓?fù)湟黄饍?yōu)化,于是有了數(shù)據(jù)并行DP、模型并行MP、流水線并行PP相互結(jié)合的多維度混合并行策略,來增加多卡訓(xùn)練的效率。
目前最流行的模式有兩種:
- 參數(shù)服務(wù)器模式(Parameter Server,PS)
- 集合通訊模式(Collective Communication,CC)
其中參數(shù)服務(wù)器主要是有一個或者多個中心節(jié)點,這些節(jié)點稱為PS節(jié)點,用于聚合參數(shù)和管理模型參數(shù)。而集合通信則沒有管理模型參數(shù)的中心節(jié)點,每個節(jié)點都是 Worker,每個Worker負(fù)責(zé)模型訓(xùn)練的同時,還需要掌握當(dāng)前最新的全局梯度信息。
參數(shù)服務(wù)器架構(gòu)Parameter Server, PS架構(gòu)包括兩個部分,首先是把計算資源分為兩個部分,參數(shù)服務(wù)器節(jié)點和工作節(jié)點: 1)參數(shù)服務(wù)器節(jié)點用來存儲參數(shù); 2)工作節(jié)點部分用來做算法的訓(xùn)練。 第二個部分就是把機器學(xué)習(xí)算法也分成兩個方面,即1)參數(shù)和2)訓(xùn)練。 如圖所示,PS架構(gòu)將計算節(jié)點分為server與worker,其中,worker用于執(zhí)行網(wǎng)絡(luò)模型的前向與反向計算。而server則對各個worker發(fā)回的梯度進行合并并更新模型參數(shù),對深度學(xué)習(xí)模型參數(shù)中心化管理的方式,非常易于存儲超大規(guī)模模型參數(shù)。 但是隨著模型網(wǎng)絡(luò)越來越復(fù)雜,對算力要求越來越高,在數(shù)據(jù)量不變的情況下,單個GPU的計算時間是有差異的,并且網(wǎng)絡(luò)帶寬之間并不平衡,會存在部分GPU計算得比較快,部分GPU計算得比較慢。這個時候如果使用異步更新網(wǎng)絡(luò)模型的參數(shù),會導(dǎo)致優(yōu)化器相關(guān)的參數(shù)更新出現(xiàn)錯亂。而使用同步更新則會出現(xiàn)阻塞等待網(wǎng)絡(luò)參數(shù)同步的問題。 GPU 強大的算力毋庸置疑可以提升集群的計算性能,但隨之而來的是,不僅模型規(guī)模會受到機器顯存和內(nèi)存的制約,而且通信帶寬也會由于集群網(wǎng)卡數(shù)量降低而成為瓶頸。 這個時候百度基于PS架構(gòu)之上提出了Ring-All-Reduce新的通訊架構(gòu)方式。 如圖所示,通過異步流水線執(zhí)行機制,隱蔽了 IO 帶來的額外性能開銷,在保證訓(xùn)練速度的同時,使訓(xùn)練的模型大小不再受制于顯存和內(nèi)存,極大提升模型的規(guī)模。而 RPC&NCCL 混合通信策略可以將部分稀疏參數(shù)采用 RPC 協(xié)議跨節(jié)點通信,其余參數(shù)采用卡間 NCCL 方式完成通信,充分利用帶寬資源。
集合通訊模式(Collective Communication,CC),
2.1 NVIDIA Megatron
優(yōu)化的分布式框架NVIDIA Megatron和優(yōu)化的分布式集群架構(gòu)NVIDIA DGX SuperPOD NVIDIA Megatron 是一個基于 PyTorch 的框架,用于訓(xùn)練基于 Transformer 架構(gòu)的巨型語言模型 資料鏈接: NVIDIA Megatron:超大Transformer語言模型的分布式訓(xùn)練框架 (一) NVIDIA Megatron:超大Transformer語言模型的分布式訓(xùn)練框架 (二) Megatron repro: https://github.com/nvidia/megatron-lm GPT3-175B training scripts: https://link.zhihu.com/?target=https%3A//github.com/NVIDIA/Megatron-LM/blob/main/examples/pretrain_gpt3_175B.sh
2.2 DeepSpeed
Pytorch的分布式并行計算框架(Distributed Data Parallel,簡稱DDP),它也僅僅是能將數(shù)據(jù)并行,放到各個GPU的模型上進行訓(xùn)練。
DeepSpeed,它就能實現(xiàn)這個拆散功能,它通過將模型參數(shù)拆散分布到各個GPU上,以實現(xiàn)大型模型的計算,彌補了DDP的缺點,非常方便,這也就意味著我們能用更少的GPU訓(xùn)練更大的模型,而且不受限于顯存。 介紹:大規(guī)模深度學(xué)習(xí)框架 DeepSpeed 使用指南
DeepSpeed 是一個深度學(xué)習(xí)優(yōu)化庫,它使分布式訓(xùn)練變得容易、高效和有效。 DeepSpeed為所有人提供了極端規(guī)模的模型訓(xùn)練,從在大型超級計算機上進行訓(xùn)練到在低端群集甚至在單個GPU上進行訓(xùn)練的人員:
極端規(guī)模:將當(dāng)前的GPU群集與數(shù)百種設(shè)備結(jié)合使用,實現(xiàn)3D并行 DeepSpeed 可以有效地訓(xùn)練具有數(shù)萬億參數(shù)的深度學(xué)習(xí)模型。 極高的內(nèi)存效率:DeepSpeed 的ZeRO-Offload 僅需一個 GPU,即可訓(xùn)練超過10B參數(shù)的模型,比現(xiàn)有技術(shù)大10倍,使數(shù)十億參數(shù)的模型訓(xùn)練民主化,從而使許多深度學(xué)習(xí)科學(xué)家可以探索更大更好的模型。
pip install deepspeed Github 鏈接 https://github.com/microsoft/DeepSpeed
2.3 Elephas
Elephas 是 Keras 的擴展,它可以使用 Spark 大規(guī)模運行分布式深度學(xué)習(xí)模型。 Elephas 保持了 Keras 的簡單性和高可用性,從而允許對分布式模型進行快速原型制作,該模型可以在海量數(shù)據(jù)集上運行。 Elephas 當(dāng)前支持許多應(yīng)用程序,包括:深度學(xué)習(xí)模型的數(shù)據(jù)并行訓(xùn)練分布式超參數(shù)優(yōu)化集成模型的分布式訓(xùn)練。
安裝 pip install elephas Github 鏈接https://github.com/maxpumperla/elephas
2.4 FairScale
FairScale 是 PyTorch 擴展庫,用于在一臺或多臺機器/節(jié)點上進行高性能和大規(guī)模培訓(xùn)。該庫擴展了基本的PyTorch功能,同時添加了新的實驗功能。 FairScale支持:
并行、分片訓(xùn)練、大規(guī)模優(yōu)化、GPU內(nèi)存優(yōu)化、GPU速度優(yōu)化
安裝pip install fairscale Github 鏈接https://github.com/facebookresearch/fairscale
2.5 TensorFlowOnSpark
通過將TensorFlow深度學(xué)習(xí)框架中的突出功能與Apache Spark和Apache Hadoop相結(jié)合,TensorFlowOnSpark可以在GPU和CPU服務(wù)器集群上實現(xiàn)分布式深度學(xué)習(xí)。
它支持在Spark集群上進行分布式TensorFlow訓(xùn)練和推理,其目標(biāo)是最大程度地減少在共享網(wǎng)格上運行現(xiàn)有TensorFlow程序所需的代碼更改量。
TensorFlowOnSpark由Yahoo開發(fā),用于在Yahoo私有云中的Hadoop集群上進行大規(guī)模分布式深度學(xué)習(xí)。
安裝【 for tensorflow>=2.0.0】 pip install tensorflowonspark 【 for tensorflow<2.0.0】 pip install tensorflowonspark==1.4.4 Github 鏈接 https://github.com/yahoo/TensorFlowOnSpark
2.6 Horovod
Horovod 是一個針對TensorFlow,Keras,PyTorch和Apache MXNet的分布式深度學(xué)習(xí)訓(xùn)練框架。 參考資料:分布式訓(xùn)練框架Horovod(一):基本概念和核心賣點 深度學(xué)習(xí)分布式訓(xùn)練框架 horovod – 彈性訓(xùn)練總體架構(gòu)
2.7 veGiantModel
火山引擎:基于 Megatron和DeepSpeed github:https://github.com/volcengine/veGiantModel
|