什麼是GPU記憶體以及為什麼它對LLM推理至關重要
本文全面解析GPU記憶體(VRAM)在大型語言模型(LLM)推理中的作用,涵蓋模型權重、KV快取和框架開銷的記憶體消耗,提供記憶體計算公式,解釋為何模型“理論上”能執行卻遭遇OOM,並介紹量化、張量並行、KV快取最佳化等策略,以及BentoML推理平臺如何簡化這些最佳化。
GPU記憶體(VRAM)是大型語言模型(LLM)推理中不可或缺的資源。它不僅決定了模型能否載入,更影響著推理的吞吐量、延遲、最大上下文長度以及併發處理能力。很多團隊在部署LLM時常常遇到這樣的問題:明明模型權重看起來剛好能放進GPU視訊記憶體,但一旦開始推理,視訊記憶體立刻爆滿,出現OOM(記憶體耗盡)錯誤。本文基於BentoML的技術部落格,詳細解讀GPU記憶體的工作原理、LLM推理中的記憶體消耗模式以及最佳化策略。
GPU記憶體的基礎知識 GPU記憶體通常指專用VRAM,例如HBM3或GDDR6X,它們以極高的頻寬(如NVIDIA H200的4.8 TB/s)為GPU提供資料。VRAM是GPU獨有的,不與CPU共享,儲存模型權重、啟用值和KV快取。需要注意的是,整合GPU(如Intel Iris或Apple M系列)可能使用共享系統記憶體,而資料中心GPU(如A100或H200)完全依賴專用VRAM。所謂共享GPU記憶體,是指GPU在VRAM不足時從系統RAM中動態劃分的記憶體,但對於LLM推理,我們通常只關心專用VRAM。
LLM推理中的記憶體消耗 推理過程中,GPU記憶體主要消耗在三個方面:
- 模型權重:載入所有引數所需的記憶體。例如,一個70B引數的FP16模型需要140 GB。權重記憶體可透過引數量乘以每個引數位元組數估算。
- KV快取:在預填充和解碼階段,每處理一個token都會生成並儲存鍵值對。KV快取大小隨序列長度、批次大小和層數線性增長,計算公式為:2 × batch_size × seq_len × num_layers × hidden_dim × bytes_per_parameter / 1024³。
- 框架和CUDA開銷:包括CUDA核心、PyTorch分配器碎片化以及臨時啟用記憶體,具體大小取決於框架和GPU。
為什麼模型“看起來能裝下”卻仍然OOM? 許多團隊過去習慣於部署小型模型,單個GPU可以容納多個模型。但LLM的行為截然不同:它們不僅載入權重,還會在執行時動態增長記憶體。即使模型權重剛好能放進VRAM,KV快取也會隨著輸入長度和生成token數迅速膨脹。例如,一個需要60 GB權重的模型,在80 GB的GPU上處理長上下文(如32k token)時,KV快取會輕易吃掉剩餘空間,導致OOM。此外,高併發場景下多個請求的KV快取疊加,也會迅速耗盡記憶體。因此,真正的瓶頸並非權重,而是執行時記憶體的增長。
最佳化GPU記憶體使用的策略 針對上述問題,業界積累了多種最佳化策略:
- 量化:降低權重精度(如FP16→INT4),可減少4倍記憶體佔用。現代量化方法(GPTQ、AWQ)精度損失極小,適合聊天機器人、RAG等場景。
- 分散式推理:使用張量並行將模型切分到多個GPU,但需注意通訊開銷會增加延遲。
- KV快取最佳化:包括字首快取(重用系統提示等共享部分)、KV感知路由(將同一請求的token排程到同一GPU,提高快取命中率,測試中吞吐量提升12倍)和KV快取解除安裝(將不常用塊移至CPU記憶體或磁碟)。
BentoML推理平臺將這些最佳化內建在產品中,使用者無需手動配置複雜工程,即可直接享受高效推理。