百度百舸平台的大模型訓練最佳實踐

2023-08-22     InfoQ

原標題:百度百舸平台的大模型訓練最佳實踐

在當今這個信息爆炸的時代,大數據和人工智慧正逐漸成為推動社會發展的重要力量。而大模型的訓練則是這股力量的核心所在。在百度智能雲《大模型時代的 AI 基礎設施——百度 AI 大底座》系列雲智公開課的前七講中,百度智能雲的技術專家們分別對大模型場景涉及到的各個模塊,從網絡、計算、存儲、向量資料庫、AI 框架、LMOps 等維度,為大家做了一個全景展示,分享了百度智能雲在這些領域的技術積累和項目實踐。

在本系列課程的第八講中,百度智能雲高級產品經理楊亮對前七講的內容進行了二次解讀的同時,並圍繞百舸在大模型訓練過程的穩定性設計和加速實踐展開深度解析。課程主要分為以下三個部分:

  • 大模型時代的百舸異構計算平台;
  • 大模型訓練穩定性實踐;
  • 大模型訓推加速實踐。

下文對課程內容以楊亮第一人稱進行了整理:

大模型時代的百舸異構計算平台

下圖列舉了眾多國產大模型,裡面有通用的大模型,也有面向行業的垂類大模型,「百模大戰」可見一斑。

為什麼會在短期內出現這麼多的大模型呢?這和大模型新的訓練範式以及開源模型生態快速發展有極大關係。我列舉了三種大模型的訓練方式,從上往下看,成本由低到高變化。

首先是高效參數調優,也就是基於一個已有的通用大模型,使用少量有標註的數據,調整部分模型參數,得到符合面向特定場景的模型,具體的細分方法包括 Prefix-tuning,Prompt-tuning,LoRA 等。在第 7 期的公開課中已經給大家做了較為詳細的介紹。

其次是 SFT 指令微調,也就是使用少量或者中量的有標註數據,對通用大模型做全量參數的調整。由於市面上有比較多的像 Llama、GLM 等優秀的開源大模型以及像百度文心系列商業大模型,所以很多客戶會選擇這種方案來構建自己的行業大模型。

另外一種就是從零到一的預訓練,基於大量無標註數據來訓練自己的通用大模型,像 GPT-4,Llama 等。當然對於一些公司來說,嚴格意義上也不算從零到一,一方面有比較多的論文可以參考模型結構,另一方面也可以基於已有的開源模型權重做 Post-pretrain。

無論是哪種訓練模式都需要健壯可靠的異構計算基礎設施。

大模型對異構計算基礎設施的新挑戰,主要在穩定,高效和敏捷等三個方面。

穩定性是大模型訓練自帶約束。基於一些公開數據,像 GPT-4 這類千億級別的大模型需要數萬張 GPU 並行訓練,當然還有配套的分布式存儲和高速網絡,這麼複雜的系統可以平穩運行本身就是一個挑戰,同時如何在故障發生時能快速精準定位,可以更快速的恢復,都是需要解決的核心問題。

同時,因為大模型訓練要消耗極大的算力資源,所以每一分效率的提升都會帶來真金白銀的回報,包括如何進行並行計算,如何更好利用顯存,如何提升節點間的通信能力,這也是大模型基礎設施需要考慮的問題。

大模型參數多計算量大,聽起來似乎和敏捷並沒有太大關聯,但是基於剛才介紹的大模型訓練新範式,一方面模型本身的設計成本更低,另外一方面整個行業都在高速疊代中,所以需要基礎設施具備快速構建能力,同時有比較低的學習成本,可以快速和開源生態對接,利用開源生態已有的能力。

針對大模型的這些挑戰,此次專門為大家來分享一下百度智能雲的 AI 基礎設施平台——百舸平台的最新進展和實踐。

百舸平台是百度智能雲面向 AI 計算提供的基礎設施產品,已經疊代了多個版本,最早是面向生命科學、自動駕駛和智算中心場景提供的 AI 基礎設施解決方案。

之前百舸平台的架構介紹,我們更多的是從解決方案的視角進行展示,包括 AI 計算、AI 存儲、AI 加速、AI 容器等 4 個核心組件。這次我們從產品視角來看下,從下向上百舸分為基礎設施、雲原生 AI 套件,配套服務和控制面 4 層

基礎設施包括了高性能計算節點,可以支持英偉達 A800、H800 這類高性能 GPU,同時也支持百度自有的崑崙晶片。存儲方面提供對象存儲 BOS、並行文件存儲 PFS,同時也提供了本地的 NVME SSD,支持模型調試、訓練、推理等全場景存儲需求。存儲在大模型場景的加速方案,我們在本次雲智公開課的第 3 期給大家做了比較全面的介紹。高性能網絡方面我們提供了高性能的 RDMA 網絡、支撐業務高速訪問和隔離的 VPC 網絡,這部分在我們的第 1 期也給大家做了詳細介紹。

雲原生 AI 套件,基於 K8s 內核提供了面向 AI 場景多方面的能力,其中 AI 基礎組件提供了高速網絡、存儲的插件支持,以及異構調度、拓撲感知能力等。AI 編排調度模塊支持 Pytorch、PaddlePaddle 等豐富的 AI 訓練框架,同時提供了 AI 任務編排和工作流管理。穩定性 & 容錯模塊提供了豐富的故障感知和容錯能力。訓練 & 推理加速模塊 AIAK 針對大模型場景提供了訓推加速能力,也就是 AI 加速套件,後面會展開介紹。

同時為了讓 AI 任務順利執行,百舸融合了 Prometheus 監控,鏡像、日誌、帳號等配套服務產品。

同時在控制面提供了控制台、OpenAPI、SDK 和命令行工具,便於用戶使用和與自有的 AI 平台集成。

面向萬卡級別的超大規模訓練,需要有比較多的前置工作來構建集群,裡面包括了規劃選型、計算、網絡、存儲的配置,運行庫、框架、雲原生組件的配置,還有監控告警和用戶權限配置,為了達到集群效率最優,每一步都需要有比較細節的配置和考量。

基於以往的經驗,一個真正生產級別的萬卡集群需要專業的基礎架構同學數天甚至數周來完成搭建和調試。

這個效率顯然無法滿足大模型的快速發展需求,很多算法工程師對於底層硬體、 K8s 等概念並不了解,而且也無需了解,所以我們把百舸平台進行了升級,屏蔽了無需用戶關注的底層概念,打通產品間的安裝配置流程,可以一站式小時級完成大模型的基礎平台構建,大幅地解放了生產力

開源大模型的發展,為大模型開發提供了更多的軟體基礎設施,例如 Hugging Face,提供了大量的開源數據集,預訓練模型等資源,在實際模型開發過程中,有比較多的工程性問題。

百舸平台為客戶提供了豐富的開源加速工具,例如 EleutherAI 是一個開源的語言模型數據集,大概有 800G+ 數據量,通常需要幾十小時的下載時間。我們提供的數據集下載加速功能,採用了專門的下載通道可以將這個過程縮短到分鐘級,同時提供數據的預處理和數據轉儲功能,幫助用戶投遞到並行文件存儲 PFS 等高速存儲來進一步加速計算。

我們知道一個模型包括模型結構代碼和模型權重參數兩部分,通常情況下開源模型的權重參數會開放出來,但是模型結構代碼沒有直接開放或者訓練效果不理想,給前面提到的 Post-pretrain 和 SFT 帶來了一定的不便。

基於這個需求,我們參考開源論文對這部分代碼進行了重寫和並行切分優化並保證精度對齊,同時也提供了最佳實踐文檔幫助大家更快地開始模型訓練

針對訓練出來的模型我們也提供了一鍵部署工具和 Playground 幫助大家更好的調試模型。

這裡展示了在用戶提交作業時,我們預置的一系列的開源大模型訓練模板,支持了像 Llama、GLM 等主流開源大模型,這個列表將會持續更新,目前已經支持了最新的 Llama 2 模型。

根據用戶的選擇,可以自動適配對應模型的結構代碼、調優後的訓練超參、並行策略、環境變量和推薦資源配置。用戶可以自行下載或者通過平台提供的工具來加速下載模型權重文件,並且進行模型權重轉換和切分。

大模型訓練穩定性實踐

穩定性是一個系統工程,我們衡量一個系統穩定性能力通常用四個指標:

  • 平均故障時間 MTBF 要求我們有較為豐富的檢測工具和巡檢機制,同時在系統交付的同時就可以保障基礎設施的健壯性;
  • MTTD 和 MTTI 指的是我們的故障感知能力,一個是發現故障的時間,一個是確定故障定位的時間,要求我們在第一時間能感知到問題,並且能確定問題根因並找到解法;
  • MTTR 指的是修復時間,我們一般來說預防、檢查勝於治療,其實前面兩個能力建設好以後故障的修復基本是水到渠成,當然也要處理好故障隔離修復和重調度等一系列問題。

由於大模型訓練是一種大規模離線型計算,所以實際上這些穩定性指標最終支撐的還是訓練成本,所以穩定性建設的一個隱含約束就是訓練的性能和成本不能顯著衰退,不然就會捨本逐末。

基於上述的考慮,百舸平台在環境檢測,故障感知和容錯等三個層面做了很多優化

在環境檢查方面,百舸支持了單機硬體、軟體和加速庫、網絡性能、系統組件等多個維度的檢查,很多的訓練任務都可以通過這些檢查來提前預防。在進行環境交付時,任務啟動前都提供了相應的檢測能力,同時也提供了自動巡檢和自助診斷工具。

故障感知層,我們針對任務退出,任務假死和運行慢幾種常見故障場景建設感知能力。尤其是後兩種故障,有比較大的隱蔽性。百舸平台基於百度內部大量的最佳實踐制定了指標體系,可以及時的發現問題,同時我們也提供了多個維度的資源狀態大盤和日誌管理和優化機制。故障智能分析可以基於故障報錯信息給予初步的分析和排障建議。

容錯是做好穩定性建設的最後一道關。百舸平台提供了自動容錯能力,可以自動實現故障隔離,重調度和任務拉起,同時提供故障節點熱修復或者換機修復等方式。CKPT 是模型訓練最基礎的容錯機制,我們提供了 CKPT 的管理以及 CKPT 的寫入加速,這部分稍後會展開介紹。

下面我們一起來看一下百舸平台上的幾個穩定性核心能力。

首先是 NCCL 測試工具,NCCL tests 是一個檢測節點間通信性能的測試工具,用戶可以選擇需要測試的通信類型、GPU 數量和目標資源池展開測試。我們可以通過和基準性能指標做比對,發現大多數的硬體故障帶來的通信問題,並通過二分查找法定位故障點。

智能故障分析是我們結合大模型能力做的一次嘗試。很多時候系統的報錯信息易讀性比較差,一般需要專業的同學來參考多方面的信息定位排查。百舸平台引入了大模型能力、LongChain 機制和向量資料庫,可以基於集群的配置信息、監控信息,報錯日誌以及長時間積累的排查經驗來幫助用戶對典型的故障進行分析。這個功能目前還在內測階段,已具備基於常見的日誌和報錯信息來判斷故障的可能原因,給出進一步排查思路。如果已有匹配的 FAQ 也可以直接給出修復建議,更多的能力還在持續建設中。

在任務容錯場景,我們提供了較為方便的使用方式。在提交訓練任務時,我們可以選擇開啟容錯訓練,並配置自動重啟次數。當訓練任務故障時,我們會根據配置首先嘗試本地重啟,並在多次嘗試失敗後隔離故障節點,將任務調度到健康的節點上重新啟動,同時拉取最近的 CKPT 繼續未完成的訓練。

除了自動的容錯,我們也支持讓用戶手動來決策故障處理方案。在任務提交時,用戶可以配置任務狀態告警,偵測任務的狀態變化,發送給對應的告警人。除了任務狀態,我們也提供了針對任務的 loss 值的監控和告警,避免因模型結構、數據、超參數等配置錯誤導致的訓練空跑。

在第 3 期的分享中為大家介紹了 CKPT 的存儲加速相關原理,這裡我們先快速回顧一下:

Checkpoint 是訓練容錯恢復的基礎,多數訓練框架均提供了原生的 CKPT 機制。原理也比較簡單,在模型訓練過程中為正在訓練的模型打一個 checkpoint,也就是將顯存裡面的模型權重數據寫到遠端存儲,這樣在故障發生時可以回退到當時的訓練狀態,避免重訓。

由於寫 CKPT 和訓練計算不能並行開展,且經過了顯存到內存、內存到本地磁碟再到對象存儲 BOS 多個寫入路徑,每次寫 CKPT 的開銷都比較大,導致大家會謹慎控制 CKPT 的頻率,這就導致故障重啟時往往會回退比較多的時間。這是我們最左邊第一張圖想表達的內容。

數據湖存儲加速 RapidFS 可以利用本地內存和磁碟作為對象存儲 BOS 的緩存層,這樣 CKPT 的寫入和對象存儲 BOS 的上傳可以異步操作。這樣針對大模型訓練可以實現分鐘級 CKPT,有效地縮短訓練任務的等待時間,讓用戶敢於使用 CKPT 機制。在一些大模型訓練中,通常每小時會打一個 CKPT,這樣算下來,仍然有 10% 左右的訓練時間浪費。這就是我們中間第二張圖表達的內容。

那麼還有沒有更好的辦法呢?

大模型訓練是一種離線計算,對故障和訓練結果的丟失有一定容忍度,所以我們有了一個更為激進的策略,一方面訓練框架直接把內存當成持久化存儲,CKPT 寫入內存成功後馬上繼續訓練。另一方面,我們改進了之前 CKPT 單點寫入的機制,讓每個節點都可以分布式寫入遠端存儲。最後,為了優化遠端存儲的效率,採用並行文件存儲 PFS 可以進一步加速內存數據的落盤。通過這種機制,我們可以做到秒級 CKPT,最大程度上降低了容錯帶來的計算時間浪費

大模型訓推加速實踐

首先介紹一下 AIAK。AIAK 是百度智能雲面向 AI 計算推出的 AI 加速套件,和百舸平台深度融合,可以有效的提升模型訓練效率和推理效率。AIAK 在之前的版本中就提供了梯度通信 Hook、分布式通信策略優化、高性能通信庫等訓練優化工具以及多框架多引擎加速,高性能運算元庫等推理加速能力。當然,這些能力在大模型場景下會不同程度上的復用。

面向大模型場景,我們提供了更多新的工具,主要是面向典型開源大模型的訓練和推理的加速鏡像以及配套的工具。接下來我展開介紹一下。

首先是模型訓練加速,我們衡量一個模型訓練的性能指標主要是訓練吞吐,也就是每秒可以處理的 token 數量。這個指標受三個因素影響,分別為單卡訓練吞吐、 GPU 卡數和多卡訓練加速比。由於目前主流訓練框架對多卡訓練支持都比較好,同時 GPU 卡數是一個自變量,所以我們重點討論單卡訓練吞吐和多卡加速比。

理想情況下 GPU 單卡的所有計算單元 100% 的時間片都要計算,同時在擴展 GPU 數量時可以獲得 100% 線性加速效果。但在大模型的實際訓練過程中,多種模型並行策略會帶來較多的時間「氣泡」,也就是並行訓練中部分計算單元的空等,同時節點的通信機制和物理鏈路的限制也會影響線性加速能力。

我們可以從硬體和軟體兩個層面來做優化,硬體優化包括了高性能異構晶片、高性能存儲系統,以及和機內機間的高速網絡。在軟體層面我們通過運算元融合、模型並行策略的調整和合理的調整重計算機制,優化單卡計算效率。這裡其實有一個隱含約束,所有的優化都要考慮計算精度不退化同時超大的模型參數不會撐爆寶貴的顯存資源,另外我們也通過優化並行通信和鏈路開銷進一步提升多卡線性加速能力。

Megatron 是很多開發人員都在用的大模型並行訓練框架,具有良好的性能優化基礎。我們針對 Megatron 做了很多大多數模型優化工作。在產品上,AIAK Training 提供了大模型加速鏡像,在 Megatron 框架上重構了開源模型的訓練代碼,加入了前面提到過的加速策略。我們做了全面的測試,保障可以和開源模型精度對齊,快速展開訓練。

為了兼容其他的訓練框架,我們也提供了模型轉換和切分工具,一方面可以使用我們的加速鏡像來對其他框架的基礎模型做再訓練或 SFT,同時也可以通過這些工具來實現多機訓練的權重拆分。

從實測效果來看,使用 AIAK-Training 可以提升開源大模型 20% 左右的訓練效果,尤其是針對大參數量的模型,性能優化效果更好

大模型推理一般情況下是在線服務,除了要優化性能外也要考慮用戶體驗,所以我們優化推理性能的目標可以概括為在保障首 token 延遲可控的基礎上做到吞吐最大化。

我們知道,GPU 是可以並行處理推理請求的。通過批量地執行推理任務,可以有效提升 GPU 吞吐。在大模型場景下有個特殊的挑戰就是輸出不定長的問題,也就是我們問模型一句話,得到的答案長度是不確定的,同時請求處理時間從小模型的幾十毫秒變為秒級別,這使得我們之前很多的優化策略失效或者低效。

從單卡的視角來看,並行執行的一組推理請求需要處理完成後才會返回。由於輸出是不定長的,導致一些短輸出的請求出現空等狀態,據統計至少浪費 30% 的算力。另外,由於推理請求是順序到達的,後續的請求也要等到前一組請求完成後才能進入隊列,也增加了單位請求的排隊時間和響應時間。

從整個集群的視角,通常推理的 API 網關會輪詢地向每個節點分發請求,同樣因為每個請求的處理時長不一致,容易導致出現節點間的負載不均。

針對這些問題,我們引入了動態 batch 的機制。

首先,把上下文處理過程和內容生成環節拆分開,不再統一調度。其次,通過動態槽位控制機制重新組合這些計算請求,儘量填滿計算單元的時間片。同時也將多個流之間的調度方式拆散,每個流都可以獨立的動態組裝計算任務。

由於這種動態機制和模型結構有比較大的關聯,我們對一些主流的大模型都進行了適配,經過實測,模型吞吐和平均請求延遲都有 40% 以上的提升

針對節點間負載不均的問題,我們引入了分布式隊列和 pull 模型。所有業務側的請求先入隊列,每個推理實例基於自己的真實負載拉取請求,處理失敗的請求可以重入隊列重新處理,保障輸出結果。

通過這種方式,可以有效地避免產生熱點實例並降低請求的排隊時間,這個方案在百度內部已經規模化落地,可以提升一倍以上的推理吞吐。

在產品上,百舸平台提供了大模型推理加速鏡像,集成了一系列的推理加速機制,支持主流的開源模型,同時內置了 Triton 高效推理引擎,支持 KerverV2 版本的協議兼容,可以更好的和生態打通。

百舸平台提供了大模型的部署工具,包括了完整的異步推理服務和模型權重轉換工具,讓推理更加高效。還提供了一些模型調試工具,幫助用戶快速體驗加速效果。右面是我們的一些實測數據,在保障首 token 延遲可控的前提下,使用 AIAK-Inference 的推理加速方案,主流大模型的吞吐均可提升 1-2 倍,大幅降低了推理成本

以上為第八講的所有內容,希望大家能夠對百度百舸平台的了解更進一步。至此,《大模型時代的 AI 基礎設施——百度 AI 大底座》系列雲智公開課的「夏季內容」便完結了。

同時做一個活動預告,在 9 月 5 日,百度智能雲將舉辦「2023 百度雲智大會」。大家可以點擊「閱讀原文」報名參加大會,了解百度智能雲在大模型方向的最新進展。

文章來源: https://twgreatdaily.com/zh-hk/2541804b00d872c21ce9c19caaddccaf.html