How LLM Inference Works, Clearly Explained.
原始來源與檔名:2026-06-30T094045+0800-How LLM Inference Works, Clearly Explained..md
SOURCE | 資訊源評估
- 準確性: 高 - 文章精確拆解了 LLM 推理的兩個核心階段 (Prefill 與 Decode),並清晰解釋了 KV Cache、TTFT、ITL 等底層硬體與運算瓶頸,符合當前大模型工程界的實務認知。
- 易理解性: 高 - 作者使用淺顯的 Python 虛擬碼與圖解,將複雜的 Transformer 矩陣運算轉化為容易理解的工程步驟,極大地降低了學習門檻。
- 閱讀策略建議: 適合所有需要部署或優化 LLM 的工程師閱讀。建議重點關注
Prefill vs Decode的資源瓶頸差異,並結合自身專案的監控指標 (TTFT/ITL) 進行對照驗證。
NAPKIN | 餐巾纸
餐巾纸公式
LLM Inference Bottleneck = Prefill (Compute-bound, 影響 TTFT) + Decode (Memory-bound, 影響 ITL)
LLM 推理效能調優並非單一問題,處理 Prompt 依賴 GPU 算力,而生成 Token 則依賴記憶體頻寬。
一句话
LLM 推理不是黑盒子,而是一場資源爭奪戰:先用算力平行處理完 Prompt (Prefill),再受限於記憶體頻寬,逐個擠出字詞 (Decode)。
餐巾纸草图
[ Input: "How does inference work?" ]
|
v
+-----------------------------------+
| PREFILL PHASE (Compute-Bound) | -> All tokens processed in parallel.
| High GPU Utilization | -> Target: Optimize TTFT
+-----------------------------------+
| (Outputs first token & KV Cache)
v
+-----------------------------------+
| DECODE PHASE (Memory-Bound) | -> Token by token. Reads KV Cache.
| Low GPU Compute, High Mem B/W | -> Target: Optimize ITL
+-----------------------------------+
|
v
[ Output: "Inference is..." ]
ROUND 1: SKELETON | 骨架掃描
“這篇文章在說什麼”
- 核心問題: 大型語言模型 (LLM) 在進行文字生成 (Inference) 時,底層到底發生了什麼?效能瓶頸在哪裡?
- 核心答案: LLM 推理分為算力密集的 Prefill 階段(處理輸入)與記憶體頻寬密集的 Decode 階段(生成輸出),必須針對這兩個階段分別進行架構與硬體優化。
- 論證結構: 演繹與解剖型。從 Tokenization 開始,循序漸進剖析 Transformer 層、Prefill 階段、Decode 階段、KV Cache 機制,最後帶到量化與基礎設施優化。
章节骨架
- Tokenization & Embedding: 將文字轉化為向量與位置編碼。
- Transformer Layers: 自注意力機制 (Attention) 與前饋網路 (FFN) 的運作。
- Prefill: 平行處理 Prompt,受限於 GPU 算力 (TTFT)。
- Decode: 逐字生成,受限於記憶體頻寬 (ITL)。
- KV Cache & Optimizations: KV Cache 的重要性、記憶體消耗,以及量化、Continuous Batching 等伺服器端優化技術。
ROUND 2: DISSECTION | 血肉解剖
“憑什麼這麼說”
論證鏈
長 Prompt 需要龐大的矩陣相乘 --> 這是 Compute-bound (算力密集) --> 影響 TTFT (首字延遲)
生成新 Token 需要讀取龐大的歷史 KV 權重 --> 算力閒置,但記憶體頻寬滿載 --> 這是 Memory-bound (記憶體頻寬密集) --> 影響 ITL (字間延遲)
因此,優化長文本輸入需要提升算力,優化長文本輸出需要更快的記憶體或更小的 Cache (如 DeepSeek V4)。
关键证据
- Prefill 階段的虛擬碼顯示
Q, K, V = project(hidden)是一次性處理所有 Token 的大矩陣乘法,GPU 使用率高。 - Decode 階段的虛擬碼顯示
token = sample(...)是在迴圈中逐次執行,且需要載入過往所有的K_all, V_all,導致運算量小但記憶體搬運量大。 - 一個 13B 參數模型,每個 Token 的 KV Cache 約佔 1MB;4K 上下文就會消耗 4GB VRAM,這證明了長上下文為何如此昂貴且會排擠 Batch Size。
隐形假设与边界
- 隐形假设: 讀者具備基本的機器學習與硬體架構常識(知道算力/FLOPs 與記憶體頻寬的區別)。
- 边界条件: 當 Batch Size 極大時,Decode 階段的算力佔比會上升,記憶體頻寬瓶頸可能會稍微轉移,但 PagedAttention 仍是必需的。
ROUND 3: SOUL | 靈魂提取
“還能怎麼用”
- 作者盲点: 文章未深入探討 CPU/RAM Offloading (如 Llama.cpp) 在邊緣裝置上的推理機制,主要聚焦於 Data Center 等級的 GPU 推理。
- 知识连接: 這與傳統資料庫查詢優化極為相似——Prefill 就像是 Full Table Scan(吃 CPU),而 Decode 就像是頻繁的 Random Access(吃 Disk I/O 或 RAM 頻寬)。
- 行动触发: 下次在設計 RAG (Retrieval-Augmented Generation) 系統時,必須意識到塞入超長 Context 會大幅增加 Prefill 的成本 (TTFT),應評估是否值得。
留白提問 (Guided Reflection)
- 既然 Decode 階段 GPU 的算力大多處於閒置狀態,除了 Continuous Batching,未來還可能出現什麼革命性的架構來榨乾這些閒置算力?
- DeepSeek V4 透過犧牲部分精確度來大幅壓縮 KV Cache,這暗示了 AI 模型的未來是走向「記憶體優化」而非純粹的「參數規模競賽」嗎?
跨域映射
- 在 資料庫工程,這叫 Buffer Pool Management (類似 KV Cache 及其分頁管理 PagedAttention)
- 在 作業系統,這叫 Virtual Memory & Paging (PagedAttention 的靈感來源)
DEEP READ | 精讀指引 (Must-Read Segments)
[!IMPORTANT] 學習的本質需要「認知阻力」。請親自回到原文閱讀以下核心段落,感受原始論述的阻力,不要只依賴 AI 的總結。
- Prefill: the compute-bound phase & Decode: the memory-bound phase: 這是全篇最核心的洞見。理解 TTFT 與 ITL 到底被硬體的哪個部分卡住,是從「呼叫 API 的使用者」進化為「AI 架構師」的必經之路。
- Redesigning attention around the cache: 介紹 DeepSeek V4 如何從演算法層面直接壓縮 KV Cache(CSA 與 HCA)。這段展示了業界正在如何對抗記憶體牆 (Memory Wall)。
How LLM Inference Works, Clearly Explained. (Architectural Deep Dive)
前言/背景
本文深入剖析了大型語言模型 (LLM) 在執行 generate() 時的底層運作機制。多數開發者將 LLM 視為黑盒子,但實際上,LLM 的推理 (Inference) 過程在同一張 GPU 上分為兩個截然不同、受限於不同硬體資源的運算階段:處理輸入的 Prefill 階段與生成輸出的 Decode 階段。理解這些機制,是進行模型部署與效能優化 (如降低延遲、提升吞吐量) 的先決條件。
章節詳細總結
Tokenization and embedding (分詞與嵌入)
LLM 無法直接處理文字,必須先透過 Tokenizer (如 BPE) 將原始文字轉換為整數 ID。每個 ID 會映射到一個 Embedding Table (形狀為 [vocab_size, hidden_dim]),轉換成高維度向量 (如 4,096 維)。
prompt = "How does inference work?"
ids = tokenizer.encode(prompt) # ids -> [2437, 1374, 32278, 670, 30]
vectors = embedding_table[ids] # shape: [num_tokens, 4096]
現代架構通常採用旋轉位置編碼 (RoPE, Rotary Position Embeddings),透過旋轉向量來注入位置資訊,而非直接加上一個位置向量。
Transformer layers (Transformer 網路層)
嵌入後的序列會通過多層 Transformer Layer (通常 32 至 80+ 層)。每層包含兩個核心操作:
- Self-attention (自注意力機制):計算每個 Token 的 Q (Query)、K (Key)、V (Value)。Token 的 Q 與其他所有 Token 的 K 進行內積運算,得出注意力分數 (Attention Scores),決定該 Token 需要混入多少其他 Token 的 V。
Q, K, V = x @ Wq, x @ Wk, x @ Wv scores = (Q @ K.T) / sqrt (d_k) weights = softmax(scaled) # one row per token, sums to 1 attn_output = weights @ V - Feed-forward network (FFN):使用 MLP 獨立處理每個 Token 的向量。Attention 負責在不同位置間傳遞資訊,FFN 負責轉換資訊。
Prefill: the compute-bound phase (Prefill:算力密集的輸入階段)
當處理 Prompt 時,LLM 會在一次 Pass 中「平行」處理所有的 Input Tokens。因為是巨大的矩陣對矩陣乘法,這個階段受到 GPU 算力 (Arithmetic throughput) 的限制,GPU 使用率極高。 這階段決定了 TTFT (Time to First Token,首字延遲)。同時,這階段會將每一層計算出的 K 與 V 存入 GPU 記憶體中,形成 KV Cache。
# Prefill: process the whole prompt in one shot
hidden = embed(prompt_tokens) + positions
for layer in model.layers:
Q, K, V = project(hidden) # for ALL tokens at once
hidden = attention(Q, K, V) + hidden
hidden = feedforward(hidden) + hidden
cache_kv(layer, K, V) # save for later
first_token = sample(project_to_vocab(hidden[-1]))
Decode: the memory-bound phase (Decode:記憶體頻寬密集的輸出階段)
產生第一個 Token 後,模型切換為「逐字生成」。此時,只需要計算「新 Token」的 Q,並與已經存在 KV Cache 中的歷史 K/V 進行注意力運算。 雖然每次運算的數學量極小,但 GPU 為了這小小的運算,必須從記憶體中搬運所有的模型權重矩陣以及龐大的歷史 KV Cache。因此,瓶頸瞬間從算力轉移到了 GPU 記憶體頻寬 (Memory bandwidth),GPU 算力利用率通常會暴跌至 30% 以下。這階段決定了 ITL (Inter-Token Latency,字間延遲)。
# Decode: one token per iteration
token = first_token
steps = 0
while token != STOP and steps < MAX_STEPS:
x = embed(token) + position(steps)
for layer in model.layers:
q, k, v = project(x)
K_all, V_all = caches[layer].append(k, v) # 載入歷史 Cache 並加上新的
x = layer.forward(q, K_all, V_all, x)
token = sample(project_to_vocab(x))
steps += 1
yield token
The KV cache & Redesigning attention (KV Cache 與演算法層面的重構)
KV Cache 避免了 O(N²) 的重複運算,但代價是巨大的記憶體消耗。一個 13B 模型,每個 Token 約需 1MB Cache。4K Context 就要 4GB VRAM,這會排擠可用於 Batching 的記憶體。 DeepSeek V4 等新架構試圖從根本解決此問題,採用:
- CSA (Compressed Sparse Attention):將 KV 壓縮 4 倍。
- HCA (Heavily Compressed Attention):將 128 個 Token 的 KV 壓縮成單一表示。 這使得 V4-Pro 在百萬 Token 上下文時,KV Cache 大小僅為傳統架構的 10%,徹底顛覆了記憶體牆的限制。
Quantization & Serving infrastructure (量化與伺服器基礎設施)
- 量化 (Quantization):將 FP16 降至 INT8 甚至 INT4,能讓記憶體佔用呈線性下降 (7B 模型從 14GB 降至 3.5GB),不僅省 VRAM,更因為記憶體搬運量減少,通常能讓 Inference 延遲砍半。
- Continuous batching (持續批次處理):在 GPU 處於 Memory-bound (算力閒置) 的 Decode 階段,同時交錯處理其他 Request 的 Token,以榨乾算力。
- Speculative decoding (推測解碼):用小模型快速生成多個「草稿 Token」,再由大模型一次性驗證 (平行驗證),將序列解碼轉化為平行運算。
- PagedAttention:vLLM 的核心技術,像作業系統分頁一樣管理 KV Cache,消除記憶體碎片化,大幅提升併發能力。
總結與結論
- 效能診斷先行:遇到 LLM 速度慢,必須先釐清是 TTFT 慢 (受限於算力/Prefill,通常因為 Prompt 太長) 還是 ITL 慢 (受限於記憶體頻寬/Decode,通常因為硬體頻寬不足或 Cache 過大)。
- Context Length 是昂貴的資源:超長上下文不僅增加 Prefill 的計算成本,龐大的 KV Cache 更會直接佔用 VRAM,導致 GPU 無法承載更多併發請求 (Batch Size 下降)。
- 突破 Memory Wall 才是未來:Decode 階段的 GPU 算力多半處於閒置狀態,未來的架構演進 (如 DeepSeek V4 的壓縮注意力機制、推測解碼、INT4 量化) 皆是為了降低記憶體頻寬需求,而非一味追求 FLOPs 的提升。