← Back to list

【硬核大師班】大模型推論顯存碎片化?深入拆解 PagedAttention 記憶體分頁映射與動態快取重用機制

前言:那個被 KV Cache 撐爆 VRAM 的平台架構師

Leohuang · 2026-06-07 06:13 · 0 claps · 6.7 min read
#databricks #pagedattention #llm-inference #model-serving #data-architecture
Open on Medium ↗
Wiki topics: LLM · Large Language Models OPS · LLMOps & Inference 🔧 · Data Engineering 🎮 · Gaming 🏛️ · Architecture

【硬核大師班】大模型推論顯存碎片化?深入拆解 PagedAttention 記憶體分頁映射與動態快取重用機制

前言:那個被 KV Cache 撐爆 VRAM 的平台架構師

在推論(Inference)階段部署一個 70B(七百億參數)的大語言模型時,許多工程師會陷入一個嚴重的技術誤區:「只要 GPU 顯存(VRAM)放得下模型權重,系統就能穩定運行。」

然而,當你開始在生產環境中提供高並發的 RAG 或長文本(Long Context)對話服務時,你會發現真正吞噬 GPU 顯存的無形殺手,是 KV Cache(Key-Value Cache,鍵值快取)。為了避免在自迴歸(Autoregressive)解碼過程中重複計算歷史 Token 的注意力矩陣,系統必須將過去所有 Token 的 Key 和 Value 向量永久保留在顯存中。

這帶來了兩個致命的系統障礙:

  1. 顯存碎片化(Memory Fragmentation):傳統架構為了加速記憶體存取,會為每個請求預先動態配置一塊「連續」的顯存空間。但由於 LLM 生成的文本長度(Max Tokens)在執行前完全無法預測,我們被迫根據最大邊界(例如 4,096 或 8,192 序列長度)去配置。這導致多達 60% 以上的顯存被虛無地空置(內部碎片),卻無法分給其他請求使用。
  2. 並發極限卡死:當顯存被碎片化塞滿後,GPU 的 Tensor Core 明明處於閒置狀態,系統卻因為拋出 CUDA Out of Memory 而無法接入新的請求。

在 2026 年的生成式 AI 架構學中,這種對顯存的粗放式管理已被全面淘汰。Databricks Mosaic AI 推論堆疊的核心競爭力,正是基於虛擬記憶體管理哲學演進而來的 PagedAttention 演算法

深層解析一:PagedAttention 的記憶體分頁與虛擬映射

PagedAttention 徹底解耦了「邏輯上的連續 Token 序列」與「實體上的連續 GPU 顯存空間」。其核心思想與現代作業系統(OS)的虛擬記憶體分頁(Virtual Memory Paging)如出一轍。

1. 物理顯存的分頁切割(Physical Blocks)

在初始化 Model Serving 節點時,Mosaic AI 引擎會將 GPU 剩餘的可用顯存,切分成一個個固定大小的實體區塊(Physical Blocks)。每個 Block 可以容納固定數量 Token 的 KV Cache(通常定義為 $B=16$ 或 $B=32$ 個 Token)。

2. Page Table(頁表)的動態路由

當一個請求進來時,隨著 Token 的逐個生成,邏輯上的 KV Cache 會被依序寫入。當前 16 個 Token 寫滿了 Logical Block 0 後,引擎會在實體顯存中任意挑選一個閒置的 Physical Block X(即使它在物理上與前一個區塊完全不連續),並在 Page Table(頁表) 中記錄這個映射關係。

我們可以透過以下這段高階 C++ 虛擬偽代碼,來透視 PagedAttention 在 GPU 內核(Kernel)觸發時的邏輯路由:

C++

// PagedAttention Kernel 核心邏輯虛擬偽代碼
template<typename T, int BLOCK_SIZE>
__global__ void paged_attention_kernel(
    T* __restrict__ out,               // 輸出注意力矩陣結果
    const T* __restrict__ q,           // 當前 Query 向量 [num_heads, head_dim]
    const T* __restrict__ k_cache,     // 全域實體 K 快取池
    const int32_t* __restrict__ page_table, // 頁表路由器
    const int32_t* __restrict__ context_lens, // 每個請求的目前真實長度
    const int max_num_blocks_per_seq) 
{
    int seq_id = blockIdx.y; // 當前正在處理的並發請求識別碼
    int head_id = blockIdx.x; // 當前注意力的 Head ID
    int current_len = context_lens[seq_id];

    // 計算該請求總共佔用了多少個實體分頁
    int num_blocks = (current_len + BLOCK_SIZE - 1) / BLOCK_SIZE;

    float max_score = -INFINITY;

    // 遍歷該請求分散在不同物理位置的 Blocks
    for (int b = 0; b < num_blocks; ++b) {
        // 透過頁表,在 $O(1)$ 時間內精確動態路由到實體顯存地址
        int physical_block_id = page_table[seq_id * max_num_blocks_per_seq + b];

        // 載入該實體區塊中的 K/V 向量到 GPU SRAM (L1 Cache)
        int token_offset = b * BLOCK_SIZE;
        // ... 在此執行與 Query 向量的內積與 Softmax 計算 (SIMD 加速) ...
    }
    // 輸出最終融合後的 Attention 向量值
}

物理價值:透過這套映射機制,顯存的浪費被限制在最後一個未寫滿的 Block 內(小於 $B$ 個 Token),將顯存利用率從原來的 40% 暴力拉升至 96% 以上。這讓單一節點能承載的並發請求吞吐量(Throughput)直接暴增了 3 到 5 倍

深層解析二:塊級別快取重用(Chunked KV Caching)與系統級 RAG 優化

在企業級的 RAG 或 AI Agent 場景中,不同的使用者往往會輸入相同的前綴提示詞(System Prompts)或是引用相同的超長上下文(Context Documents)。

1. 邏輯指標的「零拷貝」共享

如果用戶 A 和用戶 B 都在對同一個 10K 檔發問,傳統架構會把這 10K 檔的 KV Cache 在顯存裡複製兩份。

而在 PagedAttention 的架構下,由於有了 Page Table 的抽象層,Mosaic AI 可以讓用戶 A 和用戶 B 的頁表前幾項,同時指向同一個「實體顯存區塊」

2. Copy-on-Write (寫入時複製) 機制

當用戶 A 演進到自迴歸解碼階段,需要生成自己專屬的回答時,系統只會針對他最後一個獨佔的 Block 觸發 Copy-on-Write,配置新的實體分頁。前綴那些沉重的歷史 KV 快取在硬體層面實現了真正的零拷貝共享,這讓大型企業在運行全域知識庫檢索時,節省了高達數十 GB 的 VRAM。

結語:架構師的硬體感知

在《數據架構的深水區:硬核大師班》的漫長下潛中,我們一再驗證了一個硬核公理:「頂級的軟體優化,本質上都是對硬體物理特性的精確算計。」

從儲存層用位元打碎 Parquet 檔案(Deletion Vectors),到運算層繞過 JVM 鎖死 CPU 暫存器(Photon 引擎),再到今天在 GPU 顯存內核中實現虛擬分頁映射(PagedAttention)。

大模型推論的落地,不再是一場拼湊 API 的堆疊遊戲,而是一場對 GPU 記憶體頻寬、SRAM 快取局部性與核心調度演算法的底層戰爭。唯有將資安治理、分散式運算與硬體感知的推論架構完美熔接,架構師才能帶領企業在 PB 級的數據海嘯中,以最低的算力成本,點亮最高的數位智慧。

關於作者:Leo Huang (黃鈺軒)

Databricks Champion | Data & AI Solution Architect

擁抱開源,敬畏數據。讓我們一起在深水區中穩健前行。

推薦主題標籤:

Databricks #PagedAttention #KVCache #LLMInference #MLOps #ModelServing #DataArchitecture #DataEngineering #DatabricksChampion #LeoHuang #硬核大師班


메타데이터
post_id
e732a1bb7202
slug
硬核大師班-大模型推論顯存碎片化-深入拆解-pagedattention-記憶體分頁映射與動態快取重用機制-e732a1bb7202
url
https://medium.com/@leohuang2416/%E7%A1%AC%E6%A0%B8%E5%A4%A7%E5%B8%AB%E7%8F%AD-%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%8E%A8%E8%AB%96%E9%A1%AF%E5%AD%98%E7%A2%8E%E7%89%87%E5%8C%96-%E6%B7%B1%E5%85%A5%E6%8B%86%E8%A7%A3-pagedattention-%E8%A8%98%E6%86%B6%E9%AB%94%E5%88%86%E9%A0%81%E6%98%A0%E5%B0%84%E8%88%87%E5%8B%95%E6%85%8B%E5%BF%AB%E5%8F%96%E9%87%8D%E7%94%A8%E6%A9%9F%E5%88%B6-e732a1bb7202
canonical_url
https://medium.com/@leohuang2416/%E7%A1%AC%E6%A0%B8%E5%A4%A7%E5%B8%AB%E7%8F%AD-%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%8E%A8%E8%AB%96%E9%A1%AF%E5%AD%98%E7%A2%8E%E7%89%87%E5%8C%96-%E6%B7%B1%E5%85%A5%E6%8B%86%E8%A7%A3-pagedattention-%E8%A8%98%E6%86%B6%E9%AB%94%E5%88%86%E9%A0%81%E6%98%A0%E5%B0%84%E8%88%87%E5%8B%95%E6%85%8B%E5%BF%AB%E5%8F%96%E9%87%8D%E7%94%A8%E6%A9%9F%E5%88%B6-e732a1bb7202
author_url
https://medium.com/@leohuang2416
status
ok
fetched_at
2026-06-09 15:37:30