現代 AI 系統的「記憶碎片」:從 KV Cache 到 PagedAttention 的演進

在 LLM(大型語言模型)的推論過程中,最昂貴的成本之一並非計算量,而是記憶體頻寬。當你與 AI 對話時,模型需要回顧之前的所有上下文。如果每次生成新 Token 都要重新計算一遍之前的所有 Key 和 Value,推論速度將呈平方級下降。為了解決這個問題,工業界引入了 KV Cache(鍵值快取)。

專屬插圖
現代 AI 系統的「記憶碎片」:從 KV Cache 到 PagedAttention 的演進

現代 AI 系統的「記憶碎片」:從 KV Cache 到 PagedAttention 的演進

在 LLM(大型語言模型)的推論過程中,最昂貴的成本之一並非計算量,而是記憶體頻寬。當你與 AI 對話時,模型需要回顧之前的所有上下文。如果每次生成新 Token 都要重新計算一遍之前的所有 Key 和 Value,推論速度將呈平方級下降。為了解決這個問題,工業界引入了 KV Cache(鍵值快取)。

然而,KV Cache 帶來了一個新的噩夢:記憶體碎片化。

KV Cache 的本質與痛點

簡單來說,KV Cache 是將 Transformer 解碼過程中已經計算過的 Token 的 Key 和 Value 向量儲存在顯示記憶體中。這樣在生成下一個 Token 時,模型只需計算當前 Token 的 K-V,然後與快取中的歷史 K-V 拼接即可。

但在實際生產環境中,KV Cache 面臨三個核心挑戰:
1. 長度不可預測:每個請求生成的 Token 長度不同,系統無法預先知道需要分配多少記憶體。
2. 靜態分配浪費:為了防止溢出,傳統的推論框架(如早期的 HuggingFace Transformers)通常會根據模型支持的最大上下文長度(如 32k)預先分配一塊連續記憶體。這意味著即使一個請求只生成了 10 個 Token,也會佔用 32k 的空間。
3. 外部碎片化:由於請求的生命週期不同(有的快結束,有的剛開始),顯示記憶體中會出現大量無法利用的空隙。

這種現象導致了極低的顯示記憶體利用率,直接限制了併發數(Batch Size),從而拉低了整體吞吐量。

PagedAttention:借鑑作業系統的虛擬記憶體

為了徹底解決這個問題,vLLM 團隊提出了 PagedAttention。其核心思想極其純粹:像作業系統管理實體記憶體一樣管理 KV Cache

在傳統的連續儲存中,KV Cache 必須儲存在一段連續的實體位址空間裡。而 PagedAttention 將 KV Cache 分割成固定大小的「頁」(Pages),每頁儲存固定數量的 Token(例如 16 個)。

工作機制

  • 邏輯塊 $\rightarrow$ 實體塊:模型看到的仍然是一個連續的序列(邏輯塊),但底層透過一個「塊表」(Block Table)將其映射到不連續的實體顯示記憶體塊中。
  • 動態按需分配:當一個請求需要更多空間時,系統才為其分配一個新的實體塊。不再需要預先保留最大長度的空間。
  • 高效共享:這是 PagedAttention 最強大的地方。在處理「平行採樣」(Parallel Sampling)或「多輪對話」時,多個請求可以共享同一個實體塊(例如共享 System Prompt 的 KV Cache),只需增加該塊的引用計數即可。

從理論到實戰:對推論效能的影響

PagedAttention 的引入將 LLM 推論從「記憶體受限」推向了更高的效率維度:
- 顯示記憶體利用率提升:由於消除了內部碎片(Internal Fragmentation),顯示記憶體利用率可提升至 96% 以上。
- 吞吐量飛躍:在相同硬體條件下,由於可以容納更大的 Batch Size,每秒處理的 Token 數通常能提升 2-4 倍。
- 長文本支援:透過靈活的頁管理,系統能夠更穩定地處理超長上下文而不會輕易觸發 OOM(Out of Memory)。

總結

如果說 Continuous Batching 解決了推論的時間排程問題,那麼 PagedAttention 則解決了空間的管理問題。它將 AI 推論從簡單的「矩陣運算」升級為了複雜的「資源調度」。對於開發者而言,理解這一層演進意味著能夠更好地優化部署參數(如 gpu_memory_utilizationmax_num_seqs),從而在成本與效能之間找到最佳平衡點。

留言區

歡迎分享你的想法!

發表留言

0/500

載入留言中…