大模型算力推演優化實戰

来源: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
  • 一個自定義WPF窗體的解決方案,借鑒了呂毅老師的WPF製作高性能的透明背景的異形視窗一文,併在此基礎上增加了滑鼠穿透的功能。可以使得透明窗體的滑鼠事件穿透到下層,在下層窗體中響應。 ...
  • 在C#中使用RabbitMQ做個簡單的發送郵件小項目 前言 好久沒有做項目了,這次做一個發送郵件的小項目。發郵件是一個比較耗時的操作,之前在我的個人博客裡面回覆評論和友鏈申請是會通過發送郵件來通知對方的,不過當時只是簡單的進行了非同步操作。 那麼這次來使用RabbitMQ去統一發送郵件,我的想法是通過 ...
  • 當你使用Edge等瀏覽器或系統軟體播放媒體時,Windows控制中心就會出現相應的媒體信息以及控制播放的功能,如圖。 SMTC (SystemMediaTransportControls) 是一個Windows App SDK (舊為UWP) 中提供的一個API,用於與系統媒體交互。接入SMTC的好 ...
  • 最近在微軟商店,官方上架了新款Win11風格的WPF版UI框架【WPF Gallery Preview 1.0.0.0】,這款應用引入了前沿的Fluent Design UI設計,為用戶帶來全新的視覺體驗。 ...
  • 1.簡單使用實例 1.1 添加log4net.dll的引用。 在NuGet程式包中搜索log4net並添加,此次我所用版本為2.0.17。如下圖: 1.2 添加配置文件 右鍵項目,添加新建項,搜索選擇應用程式配置文件,命名為log4net.config,步驟如下圖: 1.2.1 log4net.co ...
  • 之前也分享過 Swashbuckle.AspNetCore 的使用,不過版本比較老了,本次演示用的示例版本為 .net core 8.0,從安裝使用開始,到根據命名空間分組顯示,十分的有用 ...
  • 在 Visual Studio 中,至少可以創建三種不同類型的類庫: 類庫(.NET Framework) 類庫(.NET 標準) 類庫 (.NET Core) 雖然第一種是我們多年來一直在使用的,但一直感到困惑的一個主要問題是何時使用 .NET Standard 和 .NET Core 類庫類型。 ...
  • WPF的按鈕提供了Template模板,可以通過修改Template模板中的內容對按鈕的樣式進行自定義。結合資源字典,可以將自定義資源在xaml視窗、自定義控制項或者整個App當中調用 ...
  • 實現了一個支持長短按得按鈕組件,單擊可以觸發Click事件,長按可以觸發LongPressed事件,長按鬆開時觸發LongClick事件。還可以和自定義外觀相結合,實現自定義的按鈕外形。 ...
  • 一、WTM是什麼 WalkingTec.Mvvm框架(簡稱WTM)最早開發與2013年,基於Asp.net MVC3 和 最早的Entity Framework, 當初主要是為瞭解決公司內部開發效率低,代碼風格不統一的問題。2017年9月,將代碼移植到了.Net Core上,併進行了深度優化和重構, ...