深入淺出 LLM 的 KV Caching 機制 (KV Caching in LLMs, Clearly Explained)
原始來源與檔名:20260512_2026-05-12T092957+0800-KV Caching in LLMs, Clearly Explained.md
來源:[[@_avichawla]] / X (Twitter) — 2026-03-11
原始檔名:2026-05-12T092957+0800-KV Caching in LLMs, Clearly Explained.md
NAPKIN | 餐巾紙
餐巾紙公式
LLM Inference Cost = O(n²) without cache KV Caching = Store Key (K) & Value (V) of past tokens -> Compute only Q, K, V for the newest token KV Cache Trade-off = 5x Speedup in Computation vs. Massive GPU Memory Consumption
為什麼 ChatGPT 吐出第一個字要等很久,後面的字卻像倒水一樣快?答案是 KV Caching。在自迴歸生成中,之前算過的字其特徵(Key 和 Value 向量)是不會變的。系統會把這些特徵快取在記憶體中。生成新字時,只需拿新字的 Query 去跟快取庫對比即可。這是一種典型的「以空間換取時間」的極致工程妥協。
一句話
這篇技術解析以第一性原理清晰地解釋了大型語言模型(LLM)推理加速的核心技術——KV Caching。作者指出,在自迴歸生成中,重新計算歷史 Token 的 K 與 V 向量會產生嚴重的 O(n²) 運算浪費。透過快取機制,模型每步只需計算最新 Token,大幅提升速度,但也揭露了此技術的代價:KV Cache 會吞噬龐大的 GPU 記憶體,這正是為何擴展上下文視窗(Context Window)會如此昂貴的底層原因。
餐巾紙草圖
[Without KV Cache: Recompute Everything]
Step 50: Compute K,V for T1 to T50
Step 51: Compute K,V for T1 to T51 (T1-T50 redundantly recomputed)
[With KV Cache: Incremental Update]
Memory Cache: [K1, V1], [K2, V2] ... [K50, V50]
Step 51:
1. Compute Q51, K51, V51
2. Append [K51, V51] to Memory Cache
3. Attention = Q51 × (Cache K1-K51) -> Weight applied to (Cache V1-V51)
ROUND 1: SKELETON | 骨架掃描
“這篇文章在說什麼”
- 現象: 使用 LLM 時,首字延遲(TTFT, Time-to-First-Token)很高,但後續生成極快。
- Part 1 (Token 生成): LLM 是自迴歸的,每次生成只依賴最後一個 Token 的隱藏狀態(Hidden state)來預測下一個字,歷史狀態只是副產品。
- Part 2 (Attention 運算): 要算出最後一個 Token 的狀態,Attention 機制需要用最後一個 Token 的 Query (Q),去跟序列中所有 Token 的 Key (K) 內積,再加權所有 Token 的 Value (V)。
- Part 3 (冗餘計算): 歷史 Token 的 K 和 V 向量一旦算出就不會改變。如果每生成一個新字就把全文明文重新算一遍 K 和 V,會造成 O(n²) 的算力浪費。
- Part 4 (解法: KV Caching): 將歷史 Token 的 K 和 V 存起來。每次只需計算新 Token 的 Q, K, V,並將新的 K, V 塞入快取中,大幅減少矩陣乘法運算。
- Part 5 (TTFT 的真相): 首字為何慢?因為一開始沒有快取,模型必須在一次前向傳播(Forward pass, 即 Prefill 階段)中把整段 Prompt 的所有 K 和 V 算出來並存好。這極耗算力。
- Part 6 (代價與權衡): 快取是用 GPU 記憶體換來的。長文本或高併發時,KV Cache 佔用的記憶體甚至會超過模型權重本身。這催生了 GQA (Grouped-query attention) 與 Paged Attention 等優化技術。
ROUND 2: DISSECTION | 血肉解剖
“憑什麼這麼說”
核心論證鏈
- 矩陣乘法的數學結構: 作者切入 Transformer 的底層公式
Attention(Q, K, V) = softmax(QK^T)V。指出當我們只關心最後一個輸出字時,矩陣Q其實退化成了一個向量(只包含最後一個字的 Q),但K和V依然是整個歷史序列的矩陣。這明確點出了哪裡存在重複運算。 - 計算力與記憶體的物理限制: 提到了 Qwen 2.5 72B 模型的具體參數(80層, 32K上下文, 維度8192),說明即使是單一使用者的 KV Cache,也會消耗數 GB 的顯存。這打破了外界認為「硬體只限制模型參數大小」的迷思,證實了「併發能力與上下文長度」才是記憶體真正的吞噬者。
- 優化演進的必然性: 因為 KV Caching 的記憶體瓶頸,才合理化了業界為何要發明 GQA (共享 K/V 頭) 以及 vLLM 的 Paged Attention (解決快取記憶體碎片化)。知識點在此形成了閉環。
關鍵證據
- 直接點出 TTFT (首字延遲) 與 Prefill (預填充) 階段的關係。這完全符合所有 LLM 推理框架(如 vLLM, TGI)的實際監控指標表現。
邊界條件
- KV Caching 僅對因果語言模型 (Causal LMs) 的自迴歸生成(如 GPT 系列)有效。對於雙向編碼器(如 BERT)進行的一次性文本理解任務,KV Caching 概念並不適用。
ROUND 3: SOUL | 靈魂提取
“還能怎么用”
- 知識連結: 呼應了我們先前在探討「Agent 架構與 Context Window」時的瓶頸。為何 Greg Isenberg 和 Garry Tan 都強調要讓 Agent 的上下文(Memory/Soul.md)保持精簡?因為從底層物理來看,每多塞一行冗餘的 Prompt,就在加重 Prefill 階段的 TTFT 延遲,並成倍增加 GPU 記憶體負擔(即 Inference 成本)。
- 深層洞見: 「Every layer stores K and V vectors for every token… At hundreds of concurrent requests, it often exceeds the model weights themselves. (在數百個併發請求下,快取大小通常會超過模型權重本身。)」 這揭示了 AI 基礎設施的核心商業機密:推理公司(如 Groq 或 OpenAI)比拼的早就不是算力(FLOPS),而是記憶體頻寬與記憶體管理效率。
- 行動呼籲:
- 對於開發者:在設計 Prompt 時,將固定不變的指令(System Prompt)放在最前面,這能有效利用許多推論引擎的「Prompt Caching」技術。
- 意識到「超長上下文(如 200K)」在運作時極端消耗資源。不要盲目把大文件塞入對話框,這不僅導致幻覺,也在無端浪費算力與金錢成本。能用小 Context 解決的問題,絕不用大 Context。