[Pascal算法擺渡人]公眾號、知乎、小紅書等感謝關注。Hi,大家好!我是Pascal_M。
- 不知道如何入門算法 。對於初學者這裡有完整的學習路徑圖《歷史中經典模型文獻和論文復現》,完成後將成為合格初級算法工程師。
- 不了解行業解決方案。對於算法工程師這裡有具體的行業中落地方案和呈現出商業價值,閱讀後提供新的解決方法想法和成為算法專家。
驀然回首,自己從算法《數學》專業學習以及工作已十年有餘。同時希望大家成為算法經歷者、分享者和創造者。
我們一起讀起來!!!了解過往歷史文獻的方法和不足之處,展望最新的文獻和技術。
題目:ChatGPT調研報告
時間:2023
1 大模型並行計算技術
面向 GPU 運算卡的並行計算是大模型訓練部署過程中不可逾越 的鴻溝。
NVIDIA 論文中提到訓練自己的 GPT,使用了 3072 張 80GB A100 訓練 GPT,最大規模的模型參數量達到了 1T (GPT-3 原版的 5 倍)[35]。如此龐大的參數規模,單獨一塊 GPU 運算卡甚至完成不了最基本的裝載。
由此可見,GPU 並行是大模型訓練的必備技術。不同於傳統並行以加快計算 速度為目的,大模型的並行計算往往還要考慮怎樣將龐大的參數有機地分佈 到多張 GPU 卡中,並保持不同 GPU 卡之間有效的通信,整體配合完成大 模型的訓練部署。
通常 GPU 並行計算有兩種策略:
模型並行
這種並行模式將計算任務拆分成若幹個更小但不同的任務。尤其 是大模型參數量過大的原因,一般不能將一個模型完整地裝載至一張 GPU 卡,甚至是一個節點(含有多張卡)。此時往往要根據模型的不同功能組件 或者對長 Tensor 進行切分,將經過切分的子任務分配到不同的 GPU 卡中。 如果不同部分存在數據和功能上的邏輯相關性,也可以組成一道流水線。
數據並行
這種並行模式將數據分解為多個部分,讓每個運算單元分別去計 算一個或多個小塊數據,最後進行匯總。由於不需要對訓練過程部分的代 碼大幅改動,是使用率較高的並行方式。從標準的數據並行(Data Parallel, DP),發展到分佈式數據並行(Distributed Data Parallel,DDP),再到目前 的完全分片數據並行(Fully Sharded Data Parallel,FSDP),在並行通信效 率上得到了大幅提升。機器學習中的隨機梯度下降法(Stochastic Gradient Descent,SGD),極大促進了這類並行策略在深度學習訓練過程中的應用。
一般來說,CPU 的多線程編程偏向於第一種並行模式,
- 優點是可以帶來更高的並行效率,可以處理超過單個計算節點位寬的數據。
- 缺點是不同計 算單元之間的同步和通信機制的設計要求較高,隨著並行節點的增加,通信 的計算資源消耗快速增加。
GPU 並行編程模式則偏向於第二種,
- 優點是並 行算法設計相對簡單,容易增加新的計算節點。
- 缺點是要求每個計算節點必 須有足夠的容量,可以裝載整個模型。這對大模型而言往往是不可實現的。
因此現實中,大模型的訓練部署往往采用混合方式。
例如將整個 GPU 集群以數據並行的方式分成若幹塊,每塊裝入一個大模型。塊內按照任務並行的 方式,將大模型分解成如幹與每塊 GPU 容量匹配的子任務,每塊 GPU 對 應一個子任務,可以是大模型不同的網路組件,甚至可以是長 Tensor 分成 多個短 Tensor 進行並行計算。如果設計合理,還可以做到不同網路組件的 流水線並行,通過一種『接力』的方式並行提高計算效率。
即使目前業界已有的 GPU 分佈式訓練方案,也嚴重依賴於服務器之間 的通信、拓撲、模型並行、流水並行等底層問題的解決情況。如果隻有分佈 式訓練框架,甚至都無法正常啟動訓練過程。這也是為什麼 GPT-3 已經發佈了一年,卻隻有少數企業可以復現 GPT-3。目前,已經公佈明確已經完成千億參數規模大模型訓練的框架主要是 NVIDIA 開發的 Megatron-LM 、經 過微軟深度定制開發的 DeepSpeed、國產百度飛漿 PaddlePaddle 和華為昇 思 MindSpore。大多數並行框架都支持 PyTorch 分佈式訓練,可以完成百 億參數規模的模型訓練。
2 並行計算框架
PyTorch 1
PyTorch 自身提供了幾種加速分佈數據並行的技術,包括分桶梯度(bucketing gradients)、通信和計算的重疊(overlapping computation with communication)以及在梯度累積(gradient accumulation)階段跳過梯度同 步(skipping gradient synchronization)。PyTorch 分佈式數據並行可以用 256 個 GPU 達到接近線性的可擴展性程度[36]。在 DP 的基礎上,原生支 持 DDP,每個節點都有自己的本地模型副本和本地優化器,支持多機多卡 的分佈式訓練。一般來說,DDP 都顯著快於 DP,能達到略低於卡數的加速 比,但要求每塊 GPU 卡都能裝載完整輸入維度的參數集合。在 1.11 版本 後,PyTorch 開始支持 FSDP 技術,可以更加高效的將部分使用完畢的參數 移至內存中,顯著減小了顯存的峰值占用,更加吻合大模型的特性。
TensorFlow 2
TensorFlow 是一個為大規模數值計算設計的流行開源庫。TensorFlow 支持異構設備的並行計算,可以在不同類型和尺寸的機器上運行,無論是超 級計算機,還是嵌入式系統。它希望用戶隻需關注模型的構建和優化,透明 化復雜的並行計算細節。此外,TensorFlow 可以實現多機並行線性加速,提 高分佈式訓練的效率。原始的 TensorFlow 是基於靜態圖設計的,有著更高 的底層運行效率。但缺點是不易調試。最新版本的 TensorFlow 已經開始同 時支持靜態圖和動態圖了,是開源時間較長的並行框架。
飛槳 PaddlePaddle 3
飛槳(PaddlePaddle,Parallel Distributed Deep Learning)是中國較早 開源開放、自主研發、功能完備的產業級深度學習框架。飛槳不僅在業內最 早支持了萬億級稀疏參數模型的訓練能力,而且近期又創新性的提出了 4D 混合並行策略,以訓練千億級稠密參數模型,可以說分佈式訓練是飛槳最具 特色的技術之一。
飛槳的分佈式訓練技術在對外提供之前就已經在百度內部廣泛應用,如 搜索引擎、信息流推薦、百度翻譯、百度地圖、好看視頻、文心 ERNIE 等等, 既包含網路復雜、稠密參數特點的計算機視覺(CV)自然語言處理(NLP) 模型訓練場景,又覆蓋了有著龐大的 Embedding 層模型和超大數據量的推 薦搜索訓練場景,可謂是分佈式訓練技術得天獨厚的『練功房』。
昇思 MindSpore4
昇思 (MindSpore) 是一個全場景深度學習框架,旨在實現易開發、高效 執行、全場景覆蓋三大目標。其中易開發表現為 API 友好、調試難度低,高效執行包括計算效率、數據預處理效率和分佈式訓練效率,全場景則指框架 同時支持雲、邊緣以及端側場景。昇思 MindSpore 的特性之一就是融合了 數據並行、模型並行和混合並行,構建一種易用高效的分佈式並行訓練模式, 讓算法人員不再需要關注算法模型到底需要用哪種模式訓練。可以簡化分佈 式並行編程,串行代碼實現分佈式訓練,對用戶屏蔽並行細節,並且保持高 性能;計算邏輯上保持和單卡串行流程一致;實現上統一數據並行和模型並 行,一套框架支持多種並行模式;結合集群拓撲優化性能。
OneFlow5
OneFlow 一直主打分佈式和高性能。對於多機多卡訓練場景,是國內較 早發佈的並行計算框架。OneFlow 會把整個分佈式集群邏輯抽象成為一個 超級設備,用戶可以從邏輯視角的角度使用超級設備。最新版本的 OneFlow 和 TensorFlow 一樣,實現了同時 dui 動態圖和靜態圖的支持,而且動靜圖之 間轉換十分方便。此外,OneFlow 完全兼容 PyTorch,將 PyTorch 程序轉移 至 OneFlow 框架的代價較低。OneFlow 支持數據 + 模型的混合並行方式, 便於提升並行計算性能。OneFlow 在框架層面也做了大量優化,nn.Graph 提供了簡潔、豐富的性能優化選項,如算子融合(Kernel Fusion)、自動混 合精度訓練 (Auto Mixed Precision Training) 等。
誇父 Colossal-AI 6 『誇父』(Colossal-AI),提供了一系列並行組件,通過多維並行、大規模優化器、自適應任務調度、消除冗餘內存等優化方式,提升並行訓練效率, 並解耦了系統優化與上層應用框架、下層硬件和編譯器,易於擴展和使用。 提升人工智能訓練效率的同時最小化訓練成本。在三方面進行了優化:優化 任務調度、消除冗餘內存、降低能量損耗[37] 。誇父從大模型實際訓練部署過 程中的性價比角度出發,力求易用性,無需用戶學習繁雜的分佈式系統知識, 也避免了復雜的代碼修改。僅需要極少量的改動,便可以使用誇父將已有的 單機 PyTorch 代碼快速擴展到並行計算機集群上,無需關心並行編程細節。
Megatron-LM7
Megratron 是 NVIDIA 提出的一種基於 PyTorch 分佈式訓練大規模 語言模型的架構,用於訓練基於 Transformer 架構的巨型語言模型。針對 Transformer 進行了專門的優化,主要采用的是模型並行的方案。Megatron 設計就是為了支持超大的 Transformer 模型的訓練的,因此它不僅支持傳統分佈式訓練的數據並行,也支持模型並行,包括 Tensor 並行和 Pipeline 並 行兩種模型並行方式。NVIDIA 發表了多篇論文,較有代表性的有發表於 2019 年 9 月的論文,主要提出了通過將矩陣分塊提高並行度的方法[38]。發 表於 2021 年 4 月的第二篇論文,對於分佈式中的一些重要的設計,如 tensor parallel、pipeline parallel、micro batch size 等進行了一些分析與討論。同 時提出了更加精細的 pipeline 結構與 communication 模式[35]。通過多種並 行方式的結合,可以讓大模型的訓練更快。發表於 2022 年 7 月的第三篇文 章將核心操作 LayerNorm 和 Dropout 安裝輸入維度進一步切分,使得這兩 個需要頻繁運行的操作在不大幅增加通信開銷的情況下實現了並行[39] 。
DeepSpeed8
在 2021 年 2 月份,微軟發佈了一款名為 DeepSpeed 的超大規模模 型訓練工具,其中包含了一種新的顯存優化技術——零冗餘優化器 ((Zero Redundancy Optimizer,ZeRO)[40]。該技術去除了在分佈式數據並行訓練過 程中存儲的大量冗餘信息,從而極大地推進了大模型訓練的能力。從這個角 度出發,微軟陸續發佈了 ZeRO-1,ZeRO-2,ZeRO-3 和 ZeRO-3 Offload,基 本實現了 GPU 規模和模型性能的線性增長[41]。基於 DeepSpeed,微軟開 發了具有 170 億參數的自然語言生成模型,名為 Turing-NLG。2021 年 5 月,推出了能夠支持訓練 2000 億級別參數規模的 ZeRO-2。目前最新版本 ZeRO-3 Offload 可以實現在 512 顆 V100 上訓練萬億參數規模的大模型。
Horovod9
Horovod 是一個基於 TensorFlow,Keras,PyTorch 以及 Apache MXNet 的並行計算框架。Horovod 力求將單機程序快速簡單地轉化並行計算。由 LF AI & Data Foundation 基金會(LF AI and Data)維護。鼓勵所有致力於 人工智能、機器和深度學習的公司,參與到開源項目社區。Horovod 使用的 MPI 模型比 TensorFlow 的參數服務器模型更簡單。使用 Horovod 編寫的 深度學習模型訓練腳本可以在幾乎不進行任何改動的情況下順利地在單個 GPU、多個 GPU 甚至多個主機上運行。實驗表明在擁有 128 個節點(每個 節點 4 塊 Pascal GPU)的集群上,在 Inception V3 和 ResNet-101 兩個任 務上,Horovod 幾乎表現出了線性加速比。
ChatGPT
Pascal算法擺渡人:[NLP – ChatGPT – 2023] ChatGPT 相關數據集《一》
Pascal算法擺渡人:[NLP – ChatGPT – 2023] ChatGPT 相關數據集《二》
Pascal算法擺渡人:[NLP – ChatGPT – 2023] ChatGPT 相關核心算法《一》
Pascal算法擺渡人:[NLP – ChatGPT – 2023] ChatGPT 相關核心算法《二》
Pascal算法擺渡人:[NLP – ChatGPT – 2023] ChatGPT 相關核心算法《三》
Pascal算法擺渡人:[NLP – ChatGPT – 2023] ChatGPT 的應用前景
Pascal算法擺渡人:[NLP – ChatGPT – 2023] 自然語言處理的發展歷史
Pascal算法擺渡人:[NLP – ChatGPT – 2023] 大模型評價方法《一》