大語言模型 05 運行、微調的顯存計算詳解與優化 全量微調、LoRA 優化策略

寫在前面

隨著Transformer架構的大語言模型(LLM)不斷發展,其參數規模也在迅速增加。無論是進行模型推理還是微調訓練,GPU顯存消耗都是開發和應用LLM時的重要考量。本文將詳細探討大模型運行(推理)與微調時的顯存計算方式。

隨著Transformer架構的大語言模型(LLM)不斷發展,模型參數規模急劇膨脹,顯存消耗成為推理和微調過程中的核心瓶頸。本文系統梳理了大模型在推理與微調階段的顯存計算方法,詳細分析了模型參數、優化器狀態、中間激活值、批處理大小等因素對顯存需求的影響。通過具體案例(如1.5B、7B模型)量化分析顯存占用,并總結了常用的顯存優化策略,包括混合精度訓練、梯度檢查點、模型并行、量化剪枝等。此外,還特別介紹了LoRA微調技術在降低顯存壓力方面的優勢。通過本文,讀者將能清晰掌握大模型顯存消耗的計算邏輯,從而更科學地進行資源規劃與優化實踐。

在這里插入圖片描述

顯存計算的重要性

GPU顯存限制直接決定了你能運行的模型規模、批處理大小(batch size)和序列長度(sequence length)。因此,掌握顯存的計算方法對于優化和合理使用GPU資源尤為重要。

全量微調

我們在微調的過程中,顯存主要分布狀況梯度計算:
● 反向傳播需要存儲梯度,相比推理階段顯存占用會大幅增加。
● 優化器狀態:例如 Adam 之類的優化器會存儲額外的參數狀態(如一階、二階動量),通常會使顯存占用增加 2-3 倍。
● 計算圖:PyTorch 計算圖在反向傳播時需要保留中間激活值,會比前向推理額外消耗顯存。
● Batch Size:數據集的 batch size 會影響顯存消耗,較大的 batch 會顯著增加顯存占用。
● 混合精度訓練(FP16 vs FP32):如果是 FP32 訓練,會比 FP16 訓練占用更大顯存。
● 梯度累積:如果使用梯度累積(gradient accumulation),每一步的顯存占用會相對降低,但不會減少總需求。

請添加圖片描述

模型占用

首先根據模型參數大小計算出模型的大小:
比如7B模型:
● 如果是FP32則:7B4 = 28GB
● 如果是FP16則:7B
2 = 14GB

優化器占用

Adam 優化器一般會占用 2~3倍參數大小的顯存:
● FP32 大約 28GB*3,大概是 56GB~84GB
● FP16 大約 28GB ~ 42GB

如果是 SGD 之類的優化器,占用會小很多(1 倍參數量)。

中間激活值

這個很難精確計算,但一般會比參數量多 1.5~3 倍。
例如,7B 模型 FP16 訓練時,激活值大概 21GB - 42GB。

批處理

每個 batch 會加載部分數據到顯存,每個 token 可能會占用 2-4B(FP16 vs FP32)。
如果 batch_size=8,每個序列 2048 個 token,假設 FP16,則是 8 * 2048 * 2B = 32MB
但是 Transformer 計算中間層需要額外的顯存,可能會放大到 3~4 倍,則 96MB~128MB

計算實例1.5B

模型本身

假設是一個未量化的 1.5B 模型,假設是 FP16(每個參數2B):
1.5B * 2B = 3GB,模型本身大約是3GB。

優化器

用 AdamW 的話,存儲:
● 權重參數(1x)
● 一階動量(1x)
● 二階動量(1x)

合計 3 倍參數量,AdamW 需要 9GB。

提取存儲

梯度和模型參數大小相同,FP16的話:1.5B * 2B = 3GB

激活中間值

Transformer 涉及到多個層的值,通常是模型參數的 1.5~3倍
3GB * 2 = 6GB

梯度存儲

gradient_accumulation_steps,梯度積累的話,我設置8,需要消耗 3GB * 8 = 24GB

總占用

總共顯存占用:54GB,PyTorch、CUDA等緩存還需要10%~20%,最終大約在 55GB ~ 65GB。

計算實例7B

模型本身

7B參數 FP16 訓練(每個參數2B)
7B * 2 = 14GB

優化器

● 權重參數(1x)
● 一階動量(1x)
● 二階動量(1x)

合計是3倍的參數量:14GB * 3 = 42GB

梯度占用

7B * 2 = 14GB

激活值

Transformer 涉及到多個層,激活值通常是模型參數的 1.5 ~ 3 倍
假設是2倍的話,14GB * 2 = 28GB

梯度累積

gradient_accumulation_steps 假設是8,則需要存儲8個梯度,14*8 = 112 GB

額外占用

PyTorch、CUDA等可能增加 10% ~ 20% 的顯存

總計占用

大概在 220GB ~ 230GB 之間,峰值可能更高(240GB 以內)。

優化顯存使用的策略

為降低顯存占用,常用以下策略:

  • 使用混合精度訓練(如FP16)Mixed Precision:通過使用FP16或BF16等低精度數據類型,顯著減少模型參數和梯度存儲的顯存需求,同時提高訓練速度。
  • 梯度檢查點(Gradient Checkpointing)以減少激活占用:梯度檢查點技術通過重新計算部分前向傳播結果,顯著減少訓練過程中需要存儲的激活內存,從而降低整體顯存消耗。
  • 模型并行、流水線并行、張量并行:通過將模型的不同部分分配到多個GPU設備上,分擔單個GPU的顯存壓力。
  • 量化和剪枝模型:通過減少參數精度或去除冗余參數,減少模型參數總量,有效降低模型的顯存需求和計算成本。
  • 流水線并行(Pipeline Parallelism):模型各層或子模塊在不同GPU上流水線執行,有效提高顯存和計算資源的利用率。

LoRA微調

LoRA 極大減少顯存需求,適合在消費級 GPU(如 24GB 4090)上微調大模型,而全參數微調需要多個高端 GPU(如 4×A100 80GB)。

參數計算

LoRA 只修改部分的 Transformer 層(通常是 Wq 和 Wv),所以顯存占比會比較低。
每層參數量通常縮小到 0.1% ~ 1%,設 rank = 16,則大概是 70M ~ 700M 參數,使用 FP16 存儲的話,大約140MB ~ 1.4GB 的顯存。
在這里插入圖片描述

推理要求

● FP32(單精度浮點數):4字節(32位)
● FP16(半精度浮點數):2字節(16位)
● BF16(bfloat16):2字節(16位)
● INT8(8-bit整數):1字節(8位)
● INT4(4-bit整數):0.5字節(4位)

假設是 7B模型,7B * 0.5 / 10的9次 = 3.5GB
緩存、PyTorch、CUDA等緩存大約需要 1~2GB
顯存大約6GB左右

假設是 14B模型,14B * 0.5 / 10的9次 = 7GB
緩存、PyTorch、CUDA等緩存大約需要 1~2GB
顯存大約10GB左右

假設是32B模型,32B * 0.5 / 10的9次 = 16GB
緩存、PyTorch、CUDA等緩存大約需要 1~2GB
顯存大約18GB左右

假設是70B模型,70B * 0.5 / 10的9次 = 35GB
緩存、PyTorch、CUDA等緩存大約需要 1~2GB (雙卡可能要 2~4GB)
每張卡大約 35 GB / 2 + 2 = 20GB

暫時小節

正確評估顯存需求對合理分配計算資源和優化模型運行性能至關重要。理解以上顯存計算的基本公式,有助于高效地利用現有硬件資源,推動大模型的應用和開發。

希望本文能幫助讀者更深入地理解大模型在運行與微調階段顯存消耗的具體計算方法,進而優化自己的訓練與推理任務。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903798.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903798.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903798.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

對Electron打包的exe文件進行反解析

一、了解 Electron 打包的 exe,本質上就是打包了網頁 (HTMLCSSJS),核心文件是 app.asar。超級容易還原,還原率接近 100% 為什么 Electron 特別容易? 因為 Electron 根本沒有真正編譯成機器碼,它只是把網頁資源&…

【Vue2】1-創建一個Vue實例

Vue2官方文檔 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head&g…

【C語言練習】015. 聲明和初始化指針

015. 聲明和初始化指針 015. 聲明和初始化指針1. 聲明指針示例1:聲明一個指向整數的指針2. 初始化指針示例2:將指針初始化為`NULL`示例3:將指針初始化為某個變量的地址示例4:將指針初始化為動態分配的內存地址3. 使用指針訪問和修改變量的值示例5:使用指針訪問和修改變量的…

好未來golang后端開發

OSI網絡模型 TCP和UDP對比 HTTP和HTTPS對比 B樹 HTTP常見狀態碼 線程和進程的區別 goroutine的調度模型GMP 常見的排序了解哪些 快速排序 func quickSort(data []int) {if len(data) < 1 {return}base : data[0]l, r : 0, len(data)-1for i : 1; i < r; {if data[i] &g…

(持續更新)Ubuntu搭建LNMP(Linux + Nginx + MySQL + PHP)環境

LNMP&#xff08;Linux Nginx MySQL PHP&#xff09;環境是在Linux操作系統上構建的一個高性能Web服務器環境。M也可以指代其他數據庫&#xff0c;P也可以指代Python 1. 準備Linux系統 確保你已經在一臺服務器或虛擬機上安裝了Linux操作系統。推薦使用Ubuntu、CentOS或Debi…

服務器頻繁重啟日志分析與診斷

從你提供的日志來看&#xff0c;系統確實經歷了多次重啟。這個日志行顯示的是&#xff1a; reboot system boot 6.8.0-58-generic Tue Apr 29 17:54 - 14:26 (20:31)這表示系統在4月29日17:54啟動&#xff0c;運行了約20小時31分鐘后&#xff0c;于次日14:26結束&#xff08;可…

如何提升個人的穩定性?

提升自我的穩定性是一個系統性工程&#xff0c;需要從內在認知、情緒管理、行為習慣到外在環境等多個維度進行優化。 以下是一些具體建議&#xff0c;幫助你逐步增強內心的穩定感&#xff1a; 一、內在認知調整 1. 建立清晰的自我認知 通過反思&#xff08;如寫日記、冥想…

數值求解Eikonal方程的方法及開源實現

Eikonal方程是一類非線性偏微分方程&#xff0c;形式為 ( |\nabla u(x)| f(x) )&#xff0c;常見于波傳播、幾何光學、最短路徑等問題。以下是數值求解Eikonal方程的方法及開源實現參考&#xff1a; 一、數值求解方法 有限差分法&#xff08;FDM&#xff09; 快速行進法&#…

基于Redis實現-用戶簽到

基于Redis實現-用戶簽到 這個功能將使用到Redis中的BitMap來實現。 我們按照月來統計用戶簽到信息&#xff0c;簽到記錄為1&#xff0c;未簽到則記錄為0 把每一個bit位對應當月的每一天&#xff0c;形成了映射關系。用0和1標示業務狀態&#xff0c;這種思路稱為位圖(BitMap)。…

如何用GPU Instancing來優化樹木草石重復模型

1&#xff09;如何用GPU Instancing來優化樹木草石重復模型 2&#xff09;Unity ASTC壓縮后的紋理在部分安卓機型上不顯示 3&#xff09;現在大部分項目的豎版UI設計分辨率是多少 4&#xff09;Android上拖拽物體不實時跟隨手指的問題 這是第430篇UWA技術知識分享的推送&#x…

Java面試高頻問題(31-33)

三十一、服務網格&#xff1a;東西向流量治理與故障注入 服務網格架構分層 mermaid graph BT subgraph Control Plane APilot --> BEnvoy Sidecar CMixer --> B DCitadel --> B end subgraph Data Plane B --> E服務A B --> F服務B B --> G服務C end 核心能…

初學python的我開始Leetcode題8-3

提示&#xff1a;100道LeetCode熱題-8-3主要是二叉樹相關&#xff0c;包括三題&#xff1a;將有序數組轉換為二叉搜索樹、驗證二叉搜索樹、二叉搜索樹中第K小的元素。由于初學&#xff0c;所以我的代碼部分僅供參考。 目錄 前言 題目1&#xff1a;將有序數組轉換為二叉搜索樹…

1996-2022年全國31省ZF干預度數據/財政干預度數據(含原始數據+計算過程+結果)

1996-2022年全國31省ZF干預度數據/財政干預度數據&#xff08;含原始數據計算過程結果&#xff09; 1、時間&#xff1a;1996-2022年 2、來源&#xff1a;國家統計局和各省年鑒 3、指標&#xff1a;地方財政一般預算支出、地區生產總值&#xff08;GDP&#xff09;、ZF干預度…

g4f升級到0.5.2.0版本了,但是有些機器無法運行,只能降級到0.5.1.2版本

g4f升級到0.5.2.0版本了&#xff0c;跟0.5.1.2更以前的版本相比&#xff0c;主要更新為增加了可以設置Huggingface等供應商的key Providers API key HuggingFace:Get API key HuggingSpace: 因為很多模型都會調用Huggingface&#xff0c;所以最好設置Huggingface的API key。…

C語言教程(二十五):C 語言函數可變參數詳解

引言: 在 C 語言編程中,有時我們需要處理參數數量不固定的情況,比如常見的 printf 函數,它可以根據格式化字符串的要求接受任意數量的參數。這種能接受不確定數量參數的函數,就是可變參數函數。下面將深入探討其定義、實現原理、使用方式、示例以及注意事項。 一、可變參…

OpenStack Yoga版安裝筆記(25)Nova Cell理解

1、Nova Cell概述 &#xff08;官方文檔&#xff1a;Cells (v2) — nova 25.2.2.dev5 documentation&#xff09; Nova中的cells功能的目的是允許較大的部署將其多個計算節點分割成多個cell。所有的nova部署都默認是cell部署&#xff0c;即使大多數情況下只有單一cell。這意味…

Java Set<String>:如何高效判斷是否包含指定字符串?

在 Java 開發中&#xff0c;我們經常使用 Set 集合來存儲一組唯一性的元素。特別是 HashSet&#xff0c;由于其基于哈希表的實現&#xff0c;在進行元素查找&#xff08;判斷是否包含&#xff09;時通常具有非常高的效率&#xff08;平均時間復雜度 O(1)&#xff09;。 那么&a…

MySQL 查找指定表名的表的主鍵

原理 SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME 表名 AND CONSTRAINT_NAME PRIMARY方法 public static String getPk(String tableName) {String sql "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TA…

Java大廠面試突擊:從Spring Boot自動配置到Kafka分區策略實戰解析

第一輪核心知識 面試官:請解釋Spring Boot中自動配置的工作原理并演示如何自定義一個@ConfigurationProperties組件? xbhog:自動配置通過EnableAutoConfiguration注解觸發,結合當前環境判斷(如是否檢測到MyBatis依賴)和條件注解(@ConditionalOnClass)來決定是否啟用配…

開發板型號 ESP32-DevKitC-32模塊型號 ESP32-WROOM-32 和主控芯片 ESP32-D0WDQ6-V3

以下是關于開發板型號 ESP32-DevKitC-32、模塊型號 ESP32-WROOM-32 和主控芯片 ESP32-D0WDQ6-V3 的詳細介紹&#xff1a; 開發板型號&#xff1a;ESP32-DevKitC-32 概述&#xff1a;ESP32-DevKitC 是樂鑫推出的一款基于 ESP32 模組的小型開發板&#xff0c;板上模組的絕大部…