大模型算力推演優化實戰

来源:https://www.cnblogs.com/88223100/archive/2023/09/03/Large-model-computing-power-deduction-and-optimization-in-practice.html
-Advertisement-
Play Games

第一部分為看清:大模型的訓練及推理過程是如何的,以及內部邏輯 第二部分為理解:大模型的訓練及推理和算力的關係 第三部分為推演:用簡單的公式量化大模型算力的需求 第四部分為優化:我們如何提高算力利用率 ...


閱讀幫助

第一部分為看清:大模型的訓練及推理過程是如何的,以及內部邏輯

第二部分為理解:大模型的訓練及推理和算力的關係

第三部分為推演:用簡單的公式量化大模型算力的需求

第四部分為優化:我們如何提高算力利用率

 

一、看清

1.1 大模型訓練

我們以投籃訓練為例,來嘗試理解大模型的訓練過程。

假設你正在練習投籃,目標是投進籃筐。已知的是投籃和你的出手點高度、投籃角度、手腕力度大小有關,作為一個小白你並不知道出手點高度、投籃角度、手腕力度大小該控制多少,那麼你的第一次出手就是一個隨機控制,至於籃球進不進籃筐就交給上帝吧。

有一種可能是你進了,那麼恭喜你,天才選手;但現實往往很骨感,你不但沒有中而且距離籃筐還很遠。聰明的你就開始分析你觀察箭偏離籃筐的方向和距離,然後找出如何調整你的出手點高度、投籃角度、手腕力度大小等因素,以便下次投籃更接近籃筐。

第二次投籃就根據第一次的分析結果,調整了出手點、高度等,你發現這次距離籃筐更近了,但是還有優化的空間,以此類推直到第 N 次,你發現幾乎可以百發百中了。

圖片

我們來看大模型訓練包含哪幾部分,以及和投籃訓練的過程類比:

1、前向傳播(forward pass):在前向傳播過程中,輸入數據(例如圖像、文本等)通過神經網路的各層進行傳遞,直到得到輸出結果。這個過程包括了將輸入數據與權重矩陣相乘、應用激活函數等操作。前向傳播的目的是計算網路的預測輸出,並將其與實際目標值進行比較,從而計算損失函數(loss function)的值。

以上述投籃類比:根據你目前的技能(神經網路的權重)來投籃,然後觀察籃球距離籃筐的位置(神經網路的輸出)。這個過程告訴你,根據你現有的技能,你的投籃表現如何。

2、反向傳播(backward pass):反向傳播是一種高效計算梯度的演算法。在這個過程中,損失函數關於每個權重的梯度(偏導數)被計算出來。從輸出層開始,沿著網路的層次結構向輸入層反向傳播,計算每個權重的梯度。這些梯度表示了權重對損失函數的貢獻大小,因此可以用於指導權重更新。

以上述投籃類比:這就像你分析籃球距離籃筐的位置,並找出如何改進你的投籃技巧。你觀察籃球偏離籃筐的方向和距離(損失函數),然後找出如何調整你的投籃姿勢、力量等因素(權重梯度),以便下次投籃更接近籃筐。這個過程涉及到計算梯度(找出如何調整技巧)。

3、權重更新(weight update):在計算出所有權重的梯度後,我們使用優化演算法(如隨機梯度下降(SGD)、Adam 等)來更新權重。這個過程中,權重會根據它們的梯度值進行調整,以減小損失函數的值。這樣,模型就能逐漸學習到從輸入數據中預測目標值的能力。

以上述投籃類比:你經過分析找出如何調整你的投籃姿勢、力量等因素(權重梯度),以便下次投籃更接近籃筐。這個過程涉及到更新權重(實際調整技巧)。

下麵舉例一個簡單三層神經網路模型的推導過程

神經網路介紹見下圖,包含三層:輸入層、隱含層、輸出層,以及每層的神經元及相互之間權重,目標是使得輸入數據 x1,x2(0.05 和 0.05),使輸出儘可能與原始輸出 y1,y2(0.25 和 0.15)接近。

圖片

第一步:前向傳播

1、輸入層-->>隱含層

計算神經元 h1 的加權和:

圖片

神經元 h1 的輸出 out_h1:

圖片

同理,可計算出:out_h2 = 0.63064853

2、隱含層-->>輸出層

圖片

一次前向傳播就完成了,我們得到輸出結果[0.78438045,0.82385737] 與目標值[0.25,0.15]相差還很遠,下麵進行反向傳播,更新權重值

第二步:反向傳播

1、計算損失函數(Loss)

圖片

分別計算 y1 和 y2 的誤差,總誤差為兩者之和。

圖片
圖片

2、隱含層 -->> 輸出層權值(w4-w7)更新

w4 對整體誤差產生的影響,可以由偏導求出:

圖片

基於鏈式法則我們推出偏導可以拆分為三個子公式得到

第一部分

圖片

圖片

第二部分

圖片
圖片
enter image description here

第三部分

圖片
圖片

最後可以得出我們需要的偏導:

圖片

有了偏導數據,我們就可以更新 w4 的值:

圖片

同理可以計算 w5-w7 的更新值:

w5'=0.57150144

w6'=0.66939351

w7'=0.76916515

3、隱含層 -->> 隱含層權值(w0-w3)更新

方法和上面類似,我們先推算下 w0 的更新值:

圖片

第一部分

圖片
圖片

根據之前的計算結果:

圖片

同理可以計算出:

圖片

這樣就可以得出:

圖片

第二部分

圖片
圖片

第三部分

圖片
圖片

綜上三部分,我們可以計算出:

圖片

最後,通過偏導來更新 w0 的值:

圖片

同理可以計算 w1-w3 的更新值:

w1'=0.19933483

w2'=0.29922866

w3'=0.39922866

這樣一次反向傳播就完成了,我們再把更新的權重重新計算,不停的進行迭代,迭代一次 Loss 值由 0.36982311 -> 0.36277389,以此類推,當迭代次數足夠大,Loss 值不斷變小。

圖片
enter image description here

1000 次迭代後,Loss 值已經很小了:

圖片

1.2 大模型推理

有了一個訓練好的模型,我們就可以進行推理上線了,推理過程主要包括五個步驟:

圖片
官方手冊

第一步:分詞(Tokenize)將輸入的文本分解為更小的 token,這些部分可以是單個單詞,字元等,簡單理解為類似一種編碼演算法,把字元映射到 ID。比如下麵這句 [Write a story about number 1234567.]就可以映射到一串數字[16594, 257, 1621, 546, 1271, 17031, 2231, 3134, 13]

圖片

第二步:嵌入(Embedding)將高維度的數據(例如文字、圖片、音頻)映射到低維度空間的過程,最終以多維度向量表示每一個 object(大模型就是指的每一個 token)。

圖片

第三步:位置編碼(Positional Encoding)將 token 在句子中的位置信息進行編碼,使得輸入 Input = Input_Embedding + Positional_Enbedding 增加位置信息。

圖片

至於為何要增加位置編碼,互聯網上有很多大佬解釋,這裡不贅述,簡單歸因兩點:

1、神經網路 RNN 本身是按照序列順序處理句子的,Transformer 模型用 Attention 取代了 RNN ,它對數據的處理是同時並行處理,不包含時序信息

2、時序不同的句子含義會有很大不同

圖片

第四步:Transformer 層 將處理後的 Input 輸入神經網路 +attention 註意力模型進行處理:

圖片

第五步:Softmax 將多個神經元的輸出映射到(0,1)區間,進而轉換為一組概率分佈(加和為 1)(convert the decoder output to predicted next-token probabilities)

圖片
enter image description here

示例一次計算過程如下:

圖片

二、理解

2.1 訓練過程

第一章節第一小節講述了大模型的通用過程,包括前向傳播(forward pass)和反向傳播(backward pass),我們以單位計算 unit 來計數,一次前向傳播為 1 unit,一次反向傳播為 2 unit(因為這裡需要計算一份輸出的梯度+參數的梯度),那麼一次完整的訓練包含了 1+2 = 3 unit,也就是對於每個 token、每個模型參數,需要3 unit 的計算。

每一個 unit 的計算都是矩陣運算,我們知道對於一次矩陣運算需要進行一次乘法及加法,共計 2 次浮點運算。

圖片

綜上兩部分,我們可以得出對於每個 token、每個模型參數,需要進行 3 unit × 2 flops = 6 次浮點運算。

補充:訓練還有一個可選流程激活重計算技術(本質上是時間換空間),使用激活重計算技術來減少中間激活顯存需要進行 1 次額外的前向傳播,如果使用重計算技術,那麼對於每個 token、每個模型參數,需要進行 4 unit × 2 flops = 8 次浮點運算。

2.2 推理過程

第一章節第一小節講述了大模型的推理過程,主要計算量在 Transformer 解碼層,這一層對於每個 token、每個模型參數是一個單位 unit 的計算量,所以推理過程每個 token、每個模型參數,需要進行 1 unit × 2 flops = 2 次浮點運算。

 

三、推演

有瞭如上的兩個章節的分析,我們可以得出一個比較通用的算力評估,所需的 FLOPs 浮點運算量:

圖片

3.1 算力底座

得到通用的計算量評估,我們需要進一步細化到我們熟知的 GPU 卡算力上,為此我們需要一些算力底座的相關信息,一些常用 GPU 卡對比的信息如下:

圖片

3.2 算力評估

有了通用的 GPU 卡的算力信息,我們就有了可以評估所需 GPU 卡數量的依據,在上述通用算力評估的基礎上,我們就有了基於 GPU 卡的算力評估:

圖片

其中 FLOPS utilization 以目前業界能達到的最大值來進行推測:

圖片

感興趣可查閱 PaLM: Scaling Language Modeling with Pathways

3.3 算力驗證

以業界開源大模型為例,我們通過公式計算算力基本和公開數據一致,以下兩個維度來推算:

3.3.1、需要的算力

例如 GPT3 參數規模 175B,訓練 token300B,採用的是稠密(Dense)模型,按照公式計算 6 × 175B × 300B = 3.15e23 FLOPs 公開的 GPT3 運算量 3.1e23 FLOPs,二者基本一致。

除此之外,該算力模型對於公司內部的一些大模型評估也是適用的,業務敏感信息這裡不展示具體數據了。

圖片

標記紅色的為 7 月 11 號最新公開的 GPT-4 的核心數據,大家可能會註意到,GPT-4 好像並不符合算力公式,這是不是說我們的公式存在一些邏輯錯誤呢?那麼我們就深入探討下 GPT-4 的訓練過程:

GPT-4 採用了混合專家(MoE)模型

專家混合模型(Mixture-of-Experts,MoE):MoE 模型是一種深度學習架構,該架構,通常由多個專家(Experts)組成,每個專家負責處理輸入數據的不同方面,並擁有自己的參數集(也有一些參數,例如 embedding,可以被所有專家共用,即共用參數)。在模型的推理過程中,根據輸入數據的不同特征,模型會將輸入路由到不同的專家,每個專家根據其參數集處理對應分配到的輸入後完成輸出,最終輸出則是各個專家輸出的集成。

圖片

如上圖,簡單理解 MoE 類比:我把百度拆分為了,醫學知識百度+歷史知識百度+地理知識百度等等,實際我請求百度的時候,百度路由到對應的 XX 知識百度上,然後回答我的問題。

實際上 GPT-4 採用了 16 個專家,每個專家的 MLP 參數約為 1110 億,每次前向傳遞有 2 個專家進行路由,還有 550 億共用參數用於註意力機制,如上圖每次調用實際走到了其中 16 個專家中的 2 個,大大減少了所需的訓練以及推理計算量。

最後我們再回過頭看下之前根據公式計算不匹配的問題,這裡就會有一個問題就是實際執行的參數規模變化了:1.8T -> 1110 億 * 2 + 550 億重新計算得到計算量為 6×2770 億 ×13T=2.16e25 與公開 2.15e25 基本一致。

圖片

^^註:1T = 1000B = 10000 億^^

3.3.2、需要的 GPU 卡/時

例如 GPT3 參數規模 175B,訓練 token300B,採用的是稠密(Dense)模型,按照下圖公式計算:

分子為訓練所需要的浮點運算量:1750 億(參數規模) × 6 × 3000 億(token 量);

分母為 312TFLOPS(一張 A100 FP16 精度下的算力) × 46.2%(利用率)× 3600 (1 小時對應的秒)

得到的結果就是60.67 萬 A100/小時 = 2.53 萬 A100/天,如果是 1000 張 A100,需要的訓練時間約為一個月,和公開的數據也基本一致

圖片

再說到 GPT4 參數規模 1.8T,訓練 token 13T,採用的是稀疏(MoE)模型,按照下圖公式計算:

53433642 A100/小時 = 2226402 A100/天,如果用 25000 張 A100 訓練,需要 89 天;與公開數據使用了約 25000 個 A100 進行了 90-100 天的訓練基本一致

圖片
3.3.3、業界模型推演

有瞭如上的驗證,我們推演下業界一些公開模型的算力數據:

圖片

四、優化

至此,所有的算力推演部分結束,下麵我們來簡單看一組數據

圖片

由上圖可以看到,不論是訓練還是推理,利用率都不是特別高,這其實對於大規模的模型推廣是一大阻礙:

1、成本阻礙

我們第三章公式,採用 AWS 最具成本效益的 GPU 選擇,擁有 8 個 A100 實例的有效時薪 19.22 美元;估計其成本約為 0.0035 美元/1000 token,OpenAI 的 API 定價為 0.02 美元/1000 token, 其毛利率約為 80%;假如利用率提升 10%,單位成本就可以降低 30%以上

2、算力阻礙

目前已知的各大互聯網公司都在囤卡,尋求抓住大模型的機遇,所以能得到多少張 GPU 卡也存在一定的不確定性;如何能夠高效利用 GPU 也可以反向推動項目的進展,從另一個角度破除算力瓶頸'卡脖子'

優化分析的一些現狀:

1、基礎工具

英偉達提供了 Nsight System(nsys)工具查看模型運行時的 CPU/GPU 執行情況,可以幫助發現 GPU 運行時的一些問題

圖片

2、訓練過程

大模型訓練中存在幾種經典的分散式並行範式,分別為數據並行(Data Parallelism),流水線並行(Pipeline Parallelism)和張量並行(Tensor Parallesim)。

2.1 數據並行:ZeRO 優化器

ZeRO(Zero Redundancy Optimizer)思想就是拆分 參數、梯度及優化器狀態,使得節點保存部分參數、梯度及優化器狀態

圖片

2.2 模型並行:張量並行和流水線並行

  • 張量並行 :將模型中的線性層切分到多個顯卡上,並插入適當的 All-reduce 運算元實現數據同步(通信量大)
圖片
  • 流水線並行 :將模型分為多個 stage,放置在不同的顯卡上計算
圖片

3、推理過程

像一些公司進行了模型的 CPU 和 GPU 運算部分拆分,單獨部署成 CPU/GPU 微服務,減少 CPU 和 GPU 之間的相互干擾,以此提升性能。

圖片

目前對於這部分還是知之甚少,後續會對於這部分再單獨展開,歡迎有興趣的小伙伴一起探討。

結束語

隨著混元的落地,LLama2 的開源,會有更多的預訓練模型和推理模型的資源利用優化、評估的事情,這也是我們下階段工作(算力評估、性能優化)的一個開端,歡迎對大模型算力及優化感興趣的同學一起交流溝通!

 

作者:zhenfei

本文來自博客園,作者:古道輕風,轉載請註明原文鏈接:https://www.cnblogs.com/88223100/p/Large-model-computing-power-deduction-and-optimization-in-practice.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • > 本文深入探討了Go語言的多個關鍵方面,從其簡潔的語法、強大的併發支持到出色的性能優勢,進一步解析了Go在雲原生領域的顯著應用和廣泛的跨平臺支持。文章結構嚴謹,逐一分析了Go語言在現代軟體開發中所占據的重要地位和其背後的技術原理。 > 關註TechLeadCloud,分享互聯網架構、雲服務技術的全 ...
  • java中要實現excel新老格式的轉換比較麻煩,開源庫也沒幾個好用的。用ChatGpt查詢也是推薦直接用POI,下麵是藉助ChatGPT寫出來的代碼,經過小小修改,格式轉換良好,基本能用,就是效率比較低下。將就著用吧,哎! /** * Excel格式從xls轉換成xlsx格式 * * @param ...
  • Hi,大家好,我是一路狂奔的烏龜 很高興遇見你~ 我們可能會在睡前下載文件,而不想自己的電腦一整晚都在運行,浪費電也損耗電腦硬體 基於這個日常需求(你怎麼知道我喜歡在半夜下載文件?) 所以我就開發了這款軟體 至今已經修改了三四個版本了,基本滿足要求了就不再更新了 好了, 接下來,,就容我介紹一下這款 ...
  • # iptables、共用上網SNAT、埠轉發DNAT ## 1.防火牆概述 封端⼝,封ip 實現NAT功能 共用上⽹ 端⼝映射(端⼝轉發),ip映射 ## 2.防火牆 ### 2.1防火牆種類以及使用說明 硬體:整個企業入口 軟體:開源軟體 網站內部 封ip iptables 雲防火牆 安全組 ...
  • 提要:本系列文章主要參考`MIT 6.828課程`以及兩本書籍`《深入理解Linux內核》` `《深入Linux內核架構》`對Linux內核內容進行總結。 記憶體管理的實現覆蓋了多個領域: 1. 記憶體中的物理記憶體頁的管理 2. 分配大塊記憶體的伙伴系統 3. 分配較小記憶體的slab、slub、slob分 ...
  • # Keepalived高可用集群 ## 高可用集群簡介 **什麼是高可用集群?** 高可用集群 (High Availability;Cluster,簡稱HA Cluster) ,是指以減少服務中斷時間為目的的伺服器集群技術。它通過保護用戶的業務程式對外不間斷提供的服務,把因軟體、硬體、人為造成的 ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202309/3076680-20230902230646018-938272092.png) # 1. 元數據 ## 1.1. metadata ## 1.2. 關於數據的數據 ## 1.3. 數據字典 ## ...
  • 一、簡介 鎖是電腦協調多個進程或線程併發訪問某一資源的機制。在資料庫中,除了傳統的計算資源(CPU、RAM、i/O)的掙用以外,數據也是一種供許多用戶共用的資源。如何保證數據併發訪問的一致性,有效性是所有資料庫必須解決的一個問題,鎖衝突也是影響資料庫併發訪問性能的一個重要因素,從這個角度來說,鎖對 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...