本文轉載自DataFunTalk
編輯推薦
大模型已經是人工智能的基礎設施了,如何進一步普惠商用并盈利是當務之急。近日,NVIDIA 邀請百度、字節跳動火山翻譯、騰訊微信等 6 位專家,圍繞“AI 大模型技術路線和工業化落地實踐”展開分享,以下為分享內容精華匯總。
數據智能時代,計算是剛需,也是痛點,最主要的特點就是一個字——大。
將“大”拆分成三個特點,則包括:
-
數據大批量
-
計算串行依賴
-
計算復雜性高
這囊括了數據和算法的復雜性,而數據、算法、算力是智能時代三要素,前兩者的復雜性最后都要由算力來承載。
這使得業界對算力的需求在空間和時間上都極速膨脹,有如海嘯之勢。
GPU 卻有辦法將海嘯在空間上細分成萬千條涓涓細流,在時間上縮短流水的路徑,在結構上精簡路徑分支,將大規模任務層層拆解成小規模任務,舉重若輕般承載了海量算力需求,成為智能時代的算力基礎。
針對上述三個特點,GPU 基于吞吐量、顯存等指標,分別采用并行、融合、簡化三種方法,在算子層面進行加速。
GPU 加速的主要方法論,亦適用于大模型的工業化。
伴隨底層芯片、算力、數據等基礎設施的完善和進步,全球 AI 產業正逐步從運算智能走向感知智能、認知智能,并相應形成“芯片、算力設施、AI 框架&算法模型、應用場景”的產業分工、協作體系。2019 年以來,AI 大模型帶來問題泛化求解能力大幅提升,“大模型+小模型”逐步成為產業主流技術路線,驅動全球 AI 產業發展全面加速。
從 NVIDIA、百度、字節跳動火山翻譯、騰訊微信等幾位專家的分享,我們也不難發現,他們在業界落地大模型的時候,很大程度上都采用了并行、融合與簡化的方法,并且還從訓練、推理層面延伸到了算法建模層面。
01
并行
并行方法是一種空間換時間的方法,它將海嘯細分成涓涓細流。具體而言,對于數據大批量的計算,每個計算步驟的耗時都比較長。GPU 利用并行計算,也就是把沒有計算依賴的數據盡可能并行,把大批量拆分成小批量,以減少每個計算步驟的 GPU 空閑等待時間,提高計算吞吐量。
為了實際完成大模型的訓練,就需要高效率的軟件框架,使得訓練在單個 GPU、單個節點甚至在大規模集群上都有很好的計算效率。
因此,NVIDIA 開發出了 Megatron 訓練框架。
Megatron 采用了模型并行、Sequence 并行等優化手段以高效地訓練 Transformer 大模型,可訓練萬億級別參數量的模型。
在算法建模層面,火山翻譯和百度主要對 MoE 模型等建模方法進行了探索。
1. 模型并行
模型并行可分為 Pipeline 并行和 Tensor 并行。

Pipeline 并行也就是層間并行(圖中上半部分),將不同的層劃分到不同的 GPU 進行計算。這種模式的通信只發生在層的邊界,通信次數和通信數據量較少,但會引入額外的 GPU 空間等待時間。
Tensor 并行也就是層內并行(圖中下半部分),將一個層的計算劃分到不同的 GPU 上計算。這種模式的實現更加容易,對于大矩陣的效果更好,更好實現 GPU 之間的負載均衡,但通信次數和數據量都比較大。

為了充分利用 GPU 資源,Megatron 將每個訓練 batch 劃分成了更小的 micro batch。
由于不同的 micro batch 之間沒有數據依賴,因此可以互相覆蓋等待時間,從而能夠提高 GPU 的利用率,進而提高整體的訓練性能。

Tensor 并行把每個算子的計算劃分到不同的 GPU 上,對于一個矩陣層,存在橫切和縱切兩種方式。
如圖所示,Megatron 在 Transformer block 的 attention 和 MLP 部分都引入了這兩種切分方式。

在 Tensor 并行模式下,每個 Transformer 層的前向反向加起來總共需要四次 All-reduce 通信,由于 All-reduce 的通信量較大,因此 Tensor 并行更適合單卡內部使用。
結合 Pipeline 并行和 Tensor 并行,Megatron 可以將在 32 個 GPU 上訓練 1700 億參數模型,擴展到在 3072 個 GPU 上訓練 1 萬億參數規模的模型。
2. Sequence 并行
Tensor 并行其實并沒有對 Layer-norm 以及 Dropout 做拆分,因此這兩個算子在每個 GPU 之間是復制的。
然而,這些操作本身不需要大量計算,卻非常占用激活顯存。

為此,Megatron 又提出了 Sequence 并行的優化方法。Sequence 并行的好處在于不會增加通信量,并且可以大大減少顯存占用
由于 Layer-norm 和 Dropout 沿著序列的維度是獨立的,因此可以按照 Sequence 維度進行拆分。
使用了 Sequence 并行之后,對于超大規模的模型而言,其實顯存占用量還是很大的。因此,Megatron 又引入了激活重計算技術。
Megatron 的做法是,找到一些計算量很少但顯存占用很大的算子,比如 Attention 里的 Softmax、Dropout 等算子,對這些算子進行激活重計算就可以顯著減少顯存,并且計算開銷增加不大。
Sequence 并行和選擇性激活重計算的結合可以將顯存占用降低為原來的 1/5 左右。相對于原本直接將所有激活進行重計算的方案,其顯存也只有其兩倍,同時計算開銷顯著降低,并且隨著模型規模增大,計算開銷的占比也會逐漸降低。到萬億規模模型的時候,重計算的開銷只占整體的 2% 左右。
3. 算法并行
MoE 模型因其設計思想簡潔、可擴展性強等特點,使其在業界得到了越來越多的關注。
MoE 模型提出了這樣的設計思想,也就是將大模型拆分成多個小模型。每個樣本只需要激活部分專家模型進行計算,從而大大節省計算資源。

目前最常用的稠密大模型是 BERT、T5、GPT-3,最常用的稀疏 MoE 模型是 T5+MoE,MoE 正成為大模型構建的趨勢。
可以說,MoE 在算法建模層面,結合了并行計算的思想。
大模型的通用性,體現在多個方面,除了我們已經熟知的幾點,比如注意力機制歸納偏置更弱,模型容量大,模型數據大等等,還可以在任務建模方式上做優化,MoE 就是典型的代表。
對于火山翻譯而言,MoE 的基本思路是通過寬度換取深度,因為模型深度越深,計算層數越多,進而推理時間越長。

比如,對于擁有 4 層 Encoder、4 層 Decoder 的 Transformer 模型,每次計算必須經過所有 8 個 FFN 的計算。如果是混合專家模型,則可以把 FFN 平行放置,最終把計算路徑減半,因而推理時間也減半。

而在相同推理時間下,也就是模型深度相近的時候,由于 MoE 可以增加模型寬度,在機器翻譯的最終效果上也有所提升。

針對 24 種非洲語言和英、法語言的多語言翻譯任務,火山翻譯開發出了擁有 128 層 Transformer、24 個專家層的 MoE 模型,相比傳統架構實現了更好的翻譯效果。

但 Sparse MoE 中的“專家模型”可能有些名不副實,因為對于一句話,比如其每個 Token 經過的專家都有可能是不同的。
火山翻譯因此開發了 Hard Gate MoE,使得句子經過的專家由語種確定,這使得模型結構更加簡單,實驗結果也表明其翻譯效果更好。
在算法建模的并行化探索中,百度也在知識增強跨模態生成大模型 ERNIE-ViLG 2.0 中采用了混合專家擴散模型框架。

為何要對擴散模型采用專家模型?
其實是因為在不同的生成階段,模型建模要求的不同。比如在初始階段,模型著重學習從高斯噪聲中生成有語義的圖像,在最后階段,模型著重從含噪圖像中恢復圖像細節。
實際上,在 ERNIE 3.0 的早期版本中就融合了自編碼和自回歸,其可在通用的語義表示上,針對具體的生成任務和理解任務,結合兩種建模方式。

融合自編碼和自回歸的基本思想其實與專家模型的建模方法論類似。
具體來說,是在通用表示的基礎上,根據理解任務適合自編碼網絡結構,生成任務適合自回歸網絡結構,來進行建模。此外,這種建模方式通常還能學習到更好的通用表示。

此外,在 ERNIE-UniX2 模型中,百度通過將對比學習、語言模型等預訓練范式進行融合,將多語言、多模態的理解和生成任務進行了統一。
訓練完 MoE 模型后,推理部署也是非常重視效率的環節。
在進行超大規模模型推理部署方案選擇的時候,首先會根據模型的參數規模、模型結構、GPU 顯存和推理框架,以及對模型精度和推理性能的權衡來決定是使用單卡推理還是多卡推理。如果顯存不足,則會考慮模型壓縮或多卡推理的方案。
多卡推理包括 Tensor 并行、Pipeline 并行、Expert 并行等模式。

對 MoE 超大模型采用不同模式會遇到不同的挑戰。其中,MoE 模型的 Tensor 并行和稠密模型類似。
如果選擇 Expert 并行模式,每個 MoE Layer 的 Expert 就會被劃分到不同的 GPU 上,這可能帶來負載均衡問題,從而導致大量的 GPU 是空閑的,最終使得整體吞吐量不高。這是 MoE 多卡推理中需要關注的重點。
對于 Tensor 并行和 Pipeline 并行,除了通過微調減少卡間通訊以外,更直接的方法是提升卡間帶寬。而當對 MoE 模型使用 Expert 并行導致負載均衡問題的時候,可以通過 Profiling 分析優化。
多卡推理方案增加了通信開銷,對模型推理延時有一定影響。
02
融合
融合是解決并行計算中遇到的天然矛盾的方法,并行計算和串行計算是兩種基本的計算模式。而在應用并行計算的時候,最典型的困難就是大量的串行依賴,以及因此產生的中間值顯存占用問題,而 GPU 顯存通常會成為大模型訓練和推理的硬件性能瓶頸之一。
對于海量計算串行依賴問題,最主要的方法是將細流的路徑縮短,也就是減少中間停留過程。具體來說,就是利用算子融合,把次序存在先后依賴關系的算子進行合并,以減少顯存占用。
算子融合不僅在計算層面,也可以在算子設計層面實現。
1. 1F1B
Pipeline 并行中如果將前向和反向過程分開,就會出現顯存占用過多問題。

因此,Megatron 又提出了 Pipeline 并行的新模式 1F1B,每個 GPU 以交替的方式執行每個 micro batch 的正向和反向過程,以盡早釋放其占用的顯存,進而減少顯存占用。

1F1B 并不能減少 bubble time,為了進一步減少 bubble time,Megatron 又提出了 interleaved 1F1B 模式。也就是原本每個 GPU 負責連續 4 個層的計算,現在變成負責連續兩個層的計算,只有原來的一半,從而 bubble time 也變成了原來的一半。
2. Kernel 融合
當在做 GPU 計算的時候,每個計算流程都可以封裝成一個 GPU 的 Kernel,放到 GPU 上執行,并且是順序性的。傳統的算子庫為了通用性,會把算子設計的非常基本,因此數量也非常多,帶來的弊端是顯存占用多,因為需要存儲大量的中間隱藏表示,另外這對帶寬的要求也比較高,最終可能造成延遲或者性能損失。

火山翻譯基于 CuBLAS 乘法接口將其他非矩陣乘法算子進行了融合,包括了 Softmax、LayerNorm 等。

除了比較通用算子的融合,火山翻譯還針對一些特定算子比如 Beam Search 無法很好利用 GPU 并行性的特點,優化其計算依賴問題,從而實現加速。
在四種主流 Transformer 模型上,LightSeq 算子融合在 PyTorch 的基礎上取得了最高 8 倍的加速。
03
簡化
簡化是一種比較簡單直觀的加速方式,在細微處將流水分支精簡。具體而言,就是對于計算高復雜性,在保證性能的前提下將算子復雜度簡化,最終減少計算量。
超大規模模型的單卡推理一般會涉及模型壓縮。

常見的模型壓縮方案是量化、蒸餾和剪枝。量化是業內最常用的模型壓縮方案之一。雖然量化的計算采用了更低的精度,但可以保持模型的參數量級,在某些情況下或許能更好地保證模型整體的精度。
1. 量化

目前有兩種量化方法,一種是訓練后量化,一種是量化感知訓練。后者通常比前者對模型的精度保持更好。
完成量化后,可以通過 TensorRT 或 FasterTransformer 等推理加速框架,進一步加速超大模型的推理。

LightSeq 在訓練過程的量化中采用了真 int8 量化,也就是在矩陣乘法之前,會執行量化操作,并且在矩陣乘法之后才執行反量化操作。而不像過去的偽量化那樣,在矩陣乘法之前就執行了量化和反量化操作,以讓模型適應量化所帶來的損失和波動。后者在實際計算中并不能帶來加速,反而可能增大延時,或者使得顯存占用上升。而真 int8 量化在實際應用中也帶來了很好的加速效果。
2. 蒸餾

第二種模型壓縮方式是蒸餾。蒸餾可以針對不同應用場景采用不同的策略對超大模型進行壓縮,在某些情況下,蒸餾可以讓超大模型擁有更好的泛化能力。
3. 剪枝

最后一種模型壓縮方案是剪枝。剪枝可分為全模型剪枝和部分層剪枝,對于超大模型,了解模型關鍵層非常重要,需要避開這些對精度影響最大的部分的剪枝,這對于稀疏 MoE 模型也是適用的。
4. 大模型工業化
大模型的研究和落地已成趨勢,預計在 2022 年,關于大規模語言模型和 Transformers 的論文超過 1 萬篇,比五年前 Transformers 剛提出的時候增長了 7 倍。另外,大模型也有非常廣泛的應用,比如圖片生成、推薦系統、機器翻譯,甚至是生命科學、代碼生成等。

OpenAI 也曾經在 2020 年發表過兩篇論文,就展示過一個模型的表現基本上和三個主要的因素掛鉤,即算力、數據集大小、模型參數量,以這三個指標就能很好地預測模型的效果。

Richard Sutton 曾經說過,在過去 70 年的 AI 發展中,一個反復出現的趨勢是一個通用的能夠高效利用計算資源的方法,總會是最后的贏家。
根據 Richard Sutton 的“贏家定律”,深度學習在過去近十年是贏在了通用性。
但如今,大模型訓練的挑戰已不言而喻。以 GPT-3 為例,其在訓練的時候如果使用原始的混合精度,需要保存訓練時的參數和梯度以及 FP 32 的主參數,如果使用 Adam 優化器,還要保存兩個優化器的動量信息,則最終總共需要 2.8 個 TB 的顯存,這遠遠超出了單卡的顯存容量,需要超過 35 張 A100 才能承載。
NVIDIA 2021 年的論文“Efficient Large-Scale Language Model Training on GPU Clusters Using Megatron-LM”中得出一個經驗公式,表明單次迭代參數量為 1750 億的 GPT-3 模型就需要 4.5 億 FLOPs 的算力。如果整個訓練周期包含 95000 次迭代的話,就需要 430 ZettaFLOPs。換句話說,需要一塊 A100 訓練 16000 天,這還是不考慮計算效率的結論。
也就是說,光靠堆積這三個指標在大模型工業化時代將極大浪費資源。
DeepMind 在 2022 年發表的 ChinChilla 的論文中曾表示,實際上 GPT-3、OPT、PaLM 等大模型,基本都屬于欠擬合模型。如果基于同樣的計算資源,調小模型參數量,并訓練更多步驟,最終的模型效果才能更好一些。這也是微信在 WeLM 大規模語言模型中遵循的設計思想。
業界各企業基本都在開始將注意力從規模上放松,轉而關注大模型落地時的效率問題。
比如,從整體執行效率來看,經過 Megatron 優化的幾乎所有模型都有 30% 的吞吐量提升,并且隨著模型大小的增加,可以實現更高的 GPU 利用率。在 1750 億參數的 GPT-3 模型上,GPU 利用率可以達到 52.8%。而在 5300 億參數規模以上的模型上,利用率可以達到 57%。
也就是說,根據 Richard Sutton 的“贏家定律”,效率,將成為大模型工業化的主基調。
原文標題:大模型工業化的方法論,都藏在 GPU 里
文章出處:【微信公眾號:NVIDIA英偉達】歡迎添加關注!文章轉載請注明出處。
-
英偉達
+關注
關注
22文章
3900瀏覽量
92865 -
大模型
+關注
關注
2文章
2926瀏覽量
3676
原文標題:大模型工業化的方法論,都藏在 GPU 里
文章出處:【微信號:NVIDIA_China,微信公眾號:NVIDIA英偉達】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論