深入 LLM 運算:矩陣、GPU 與 VRAM
追蹤 Token 如何從 Embedding 進入記憶體階層、Tensor Core、Attention、KV Cache,最後產生輸出。包含互動式矩陣運算與記憶體計算器。 · 互動原版 ↗
01 · 基礎:什麼是矩陣?
Scalar(純量)是一個數字;Vector(向量)是一維陣列;Matrix(矩陣)是二維陣列;Tensor(張量)則是任意維度的泛稱。LLM 以 Tensor 表示 Token Embedding 和中間特徵。
Scalar → Vector → Matrix → Tensor
[3, 7, 2]
[[1, 2, 3], [4, 5, 6]]
Tensor shape: [batch, tokens, hidden]
單一 Token 的 Embedding 是一個向量。多個 Token 向量組成矩陣;多筆 Sequence 的 Batch 則形成更高維的 Tensor。
矩陣乘法的維度規則
B: (n × p)
C = A × B: (m × p)
兩個矩陣的內側維度必須相同。每個輸出元素都來自 A 的一列與 B 的一行進行內積。
核心觀念:文字轉成 Token ID,Token ID 映射成數值向量,再透過學到的 Weight Matrix 反覆轉換。
02 · 互動式矩陣乘法
點選 C 的一個結果格。A 中反白的 Row 與 B 中反白的 Column,會逐項相乘再加總。接著觀察 GPU 如何搬運和計算這些資料。
點 A 的列(r1、r2)和 B 的欄(c1–c3),或直接點 C 的格子,看那一格的內積;在 A、B 的數字上改值,C 會重新計算。
乘法加累加(Multiply-Accumulate)產生結果。Tensor Cores 可以平行執行大量矩陣乘加運算。
為什麼 Tiling 與資料重用很重要?
單純的實作可能反覆從 VRAM 讀取相同元素。Tiled GEMM 會把 A、B 的區塊搬到高速 On-chip Storage,供大量乘加運算重複使用;同時還能重疊載入、運算與寫回。
重要修正:GPU Compute 和 VRAM 存取不是嚴格輪流的兩個步驟。現代 GPU Kernel 會盡可能重疊資料搬運與計算。
03 · GPU 硬體與記憶體階層
VRAM 儲存大量資料,GPU 運算單元執行算術。中間有 Cache、Shared Memory 和 Registers。NVIDIA GPU 會把運算單元組織成 Streaming Multiprocessors(SM)。
| 元件 | 主要工作 | LLM 用途 |
|---|---|---|
| VRAM / HBM | 大量資料儲存 | 權重、KV Cache、Activations |
| L2 Cache | 晶片共用快取 | 重用熱門資料、減少 HBM 流量 |
| Shared Memory / L1 | 高速 On-chip 暫存 | Tiled GEMM 運算元重用 |
| Registers | 每個 Thread 的高速儲存 | 累加器與中間值 |
| Tensor Cores | 高吞吐矩陣運算 | GEMM、Attention Projection、FFN |
| CUDA Cores | 一般算術與控制 | Elementwise、部分 Reduction |
04 · Transformer 不只有矩陣乘法
Decoder-only Transformer 會反覆執行 Normalization、Q/K/V Projection、位置運算、Causal Attention、Residual Add 與 FFN。最後把 Logits 轉成下一個 Token。
Attention:Q、K、V
Attention(Q,K,V) = softmax(QKᵀ / √dₖ + mask) V
Q 代表查詢特徵;K 提供匹配線索;V 提供要聚合的內容。QKᵀ 計算分數,Causal Mask 阻止看見未來位置,Softmax 正規化分數,再乘上 V 聚合資訊。FlashAttention 等高效 Kernel 可避免在 HBM 中完整存放大型 Attention Matrix。
Feed-Forward Network(前饋網路)
FFN 使用學到的矩陣投影與非線性 Activation。許多現代 LLM 採用 SwiGLU 等 Gated 變體。以下是採用 Column Vector 慣例的簡化公式。
Example: 4096 → 11008 → 4096
LLM 內的其他 GPU 運算
| Operation | 主要工作 | 常見壓力 |
|---|---|---|
| GEMM / MatMul | 矩陣乘法 | Compute 或 Memory |
| RMSNorm / LayerNorm | 正規化特徵 | Memory / Reduction |
| RoPE | 加入位置資訊 | Elementwise / Memory |
| Softmax | 正規化注意力分數 | Reduction / Memory |
| SiLU / GELU | 非線性轉換 | Compute / Memory |
| Attention | 聚合上下文資訊 | Compute / KV I/O |
| Residual Add | 合併訊息路徑 | Memory Bandwidth |
| Sampling | 選擇下一個 Token | Reduction / Sampling |
| Quantize / Dequantize | 壓縮與還原數值格式 | Memory / Compute |
05 · VRAM 裡面到底存放什麼?
Inference 不只需要 Model Weights,還包含 KV Cache、Activations、Runtime Buffers 和記憶體配置額外開銷。
VRAM 組成示意
模型權重與數值精度
假設模型有 70 億參數(7B),原始權重容量約等於參數數量乘以每個參數的 Bytes。
| 精度 | 每參數 Bytes | 7B 模型權重 |
|---|---|---|
| FP32 | 4 | 28 GB |
| FP16 / BF16 | 2 | 14 GB |
| INT8 | 1 | 7 GB |
| INT4 | 0.5 | 3.5 GB |
KV Cache:為什麼 Context 與並發會消耗 VRAM?
每個 Decoder Layer 都會快取已計算的 Key、Value。Decode 時讀取歷史 K/V,並追加新的 K/V。以下公式假設所有 Sequence 都採密集且等長的 Cache。
06 · Prefill 與 Decode 的差別
LLM 生成通常有兩種效能模式。Prefill 一次處理多個 Prompt Tokens;Decode 則每個 Sequence 每次產生一個 Token,並持續使用增長中的 KV Cache。
① Prefill
一次平行處理多個 Prompt Tokens,通常形成較大的矩陣乘法,能有效利用運算資源,同時建立 KV Cache。TTFT(首 Token 延遲)包含 Prefill 和其他 Serving 開銷。
② Decode
每個活躍 Sequence 處理最新 Token,讀取過去的 KV 並追加新 KV。Batch 小時常接近 Matrix-Vector 運算,可能受到 Memory Bandwidth 限制。
| 比較項目 | Prefill | Decode |
|---|---|---|
| 輸入形狀 | 多個 Prompt Tokens | 每 Sequence 一個新 Token |
| 常見 GEMM | 較大矩陣 | 小 Batch 下較像 Matrix-Vector |
| KV Cache | 建立 | 讀取與追加 |
| 常見瓶頸 | Compute + Attention | 小 Batch 下頻寬 / KV I/O |
| 效能指標 | TTFT | TPOT / Tokens per second |
Decode 不一定永遠 Memory Bound。Batch 變大、長上下文 Attention 或模型架構改變,都可能讓瓶頸轉為 Compute。
07 · Compute Bound 與 Memory Bound
效能同時受算術吞吐量(FLOP/s)與資料搬運速度(Bytes/s)限制。Arithmetic Intensity 表示每搬運一個 Byte 可執行多少 FLOPs。下方可調整簡化 Roofline Model。
僅考慮頻寬的理論下限
如果每次必須從 HBM 讀取 14 GB 權重,且理想頻寬是 1 TB/s,光搬運至少需要 14 ms。這不是實際 Token Latency:Cache 重用、KV 流量、計算與排程也會影響。
08 · Training 與 Inference 的差別
Inference 主要使用固定 Weights 執行 Forward Pass;Training 還需要 Backward Pass 計算 Gradients,並由 Optimizer 更新 Weights。
| 比較項目 | Inference | Training |
|---|---|---|
| Forward Pass | 需要 | 需要 |
| Backward / Gradients | 不需要 | 需要 |
| 更新 Weights | 不需要 | 需要 |
| Optimizer States | 通常不需要 | 通常需要 |
| Activation 儲存 | Forward 工作資料 | 為 Backward 儲存或重算 |
Training 額外需要儲存 Gradients、Optimizer States(例如 Adam Moments),以及 Backward 所需的 Activations。精度、Sharding、Checkpointing 與 Optimizer 都會顯著影響 VRAM 用量。
09 · 核心重點整理
| 問題 | 正確理解 |
|---|---|
| 大型 Weight Matrix 在哪? | 主要放在 VRAM/HBM。 |
| 誰負責矩陣乘法? | 大量 GEMM 通常由 GPU Tensor Cores 加速。 |
| 每個中間結果都要寫回 VRAM? | 不一定;Registers、Cache 與 Kernel Fusion 可減少寫回。 |
| 為何長 Context 更耗 VRAM? | KV Cache 通常隨快取 Token 與活躍 Sequence 增長。 |
| 為何高 FLOPS GPU 仍可能慢? | Memory Bandwidth、利用率、Kernel Overhead 與 KV 流量。 |
| 為何 Training 更耗記憶體? | Gradients、Optimizer States 與 Backward Activations。 |
請同時用兩種視角理解 LLM:(1)Transformer 的數學運算圖;(2)Tensor 在 GPU 記憶體階層與運算單元之間的實際資料流。兩者共同決定 Latency 與 Throughput。
建議的下一步
依序理解 VRAM/HBM → L2 → Shared Memory → Registers → Tensor Core MMA → Accumulator → Output;再深入 FlashAttention、PagedAttention、Continuous Batching、Quantization 和 GPU Profiling。