只用了 8 格,
為什麼卻占了 12 格?
先從 AI 聊天時的「短期筆記」說起。當使用者越來越多,記憶體不只是要夠大,更要避免把空間浪費在沒有資料的地方。
先掌握重點
Paged Attention 的核心想法是:把對話用的快取切成小頁,需要幾頁就分配幾頁,不必為每個請求先保留一整大段空間。[2]
這件事是怎麼發生的?
你繼續聊,AI 就得用到前面說過的內容
假設你請 AI 幫忙規劃旅行,條件不是一次說完,而是邊聊邊補充。接下來產生回答時,模型就需要用到這些前文。
你一直在對話
KV Cache:先把算過的結果留下來
為了不用在每一步都重新計算前文的 Key 和 Value,模型會先把它們存起來。這份快取,就是 KV Cache。你可以把它想成 AI 回答時會參考的「短期筆記」。[1]
一般全注意力模型中,保留的前文越長,KV Cache 通常就越大。
「短期筆記」是比喻,不是真的把句子抄進去
KV Cache 存的是各層注意力計算用到的 Key / Value 數值,不是聊天文字,也不是永久記憶。不使用快取仍可處理前文,只是需要重新計算。視窗式注意力等架構的快取成長方式可能不同。[1]
接下來的問題是:系統事先不知道,你會只問一句,還是繼續聊很久。
先把空間留好,方便了配置,卻可能造成浪費
想像有一排置物櫃。管理員怕你的東西越放越多,於是一開始就先保留 12 格。可是你今天只放了 8 格,另外 4 格雖然沒有東西,別人卻不能用。
替每位使用者留 12 格
這是一種按最大需求預先配置的做法。
目前只需要 8 格
剩下 4 格仍屬於這位使用者,不能分給別人。
沒有資料,卻占著空間
同時使用的人一多,這些預留空間就會累積。
這裡比較的是「整段預留」的示例,不代表所有未使用 Paged Attention 的系統都一定這樣配置。過度預留與記憶體碎片,是 Paged Attention 要改善的問題。[3]
同樣是 8 格資料,看看有沒有 Paged Attention 的差別
先注意橘色:它不是空閒,而是「沒資料、卻已被預留」。有了 Paged Attention,沒有分配出去的頁,才能留給其他請求。
只分配目前需要的頁
為了先看懂差別,圖中一格代表一頁,並假設資料剛好填滿整頁。實際上每頁可容納固定數量的 token,最後一頁仍可能沒填滿,並非完全零浪費。這裡的「占用」是請求拿到的快取頁,不是作業系統顯示的整個 GPU 程式用量。[2]
一個人少占 4 格,好像不多。那麼,很多人同時進來呢?
同樣 60 格快取空間,哪一邊能讓更多人進來?
下面兩邊收到完全相同的請求。左邊每人先拿 12 格;右邊按目前的資料量分配。放不下的人會在等待區,不會硬塞進已滿的記憶體。
每位使用者目前需要多少?
每人先拿 12 格
橘色標上「預」,表示空間已被保留。
依照目前需求分配
有顏色的格子都已存放資料;虛線格仍可用。
這是單一時間點的配置示例:依 A、B、C… 順序入場,整個請求放得下才分配,否則先等待。只畫出 KV Cache 空間,不含模型權重;未模擬換出、搶占或快取共享。圖中的數字不是效能測試。
頁面不必放在一起,靠一張對照表就能找到
就像置物櫃不必連號:第 1 頁放在 3 號櫃,第 2 頁放在 7 號櫃。對照表記住頁面的位置,注意力運算就能依序讀取需要的內容,不必先把所有頁搬到一起。[2]
概念上類似作業系統的分頁管理。Paged Attention 不只是分配空間,也包含能讀取這些非連續 KV 資料塊的注意力運算方式;它不會因此提高模型本身的理解能力。[3]
現在,空間比較不浪費了。還有另一個問題:請求長短不同,先完成的人離開後,空出的位置能不能立刻接下一個?
Continuous Batching:有人完成,下一輪就補上新人
想像有三個服務窗口。固定批次像是規定這一組三個人全部辦完,下一組才能進來;Continuous Batching(動態批次)則在每輪處理後重新安排,哪裡有空位,就能讓等候中的請求補上。[4]
用同一組工作,逐輪看差別
六個請求同時到達,一次最多處理三個。A 要做 6 輪,B 只要 2 輪;重點就是:B 完成後,D 要不要繼續等 A?
整批完成,才接下一批
有人先完成,空位也不能補進新人。
有位置,下一輪就補人
不必等最慢的那個請求做完。
每張卡片顯示這一輪的處理結果。剛完成的請求會在下一輪離開;「位置」只是批次名額的比喻,不是實體 GPU 核心。
把每一輪攤開來看:哪裡在工作,哪裡空著等?
橘色「等」表示空著等同批其他請求;「—」表示已無後續工作。兩張圖的時間刻度完全相同。
Paged Attention 改善快取空間的利用;Continuous Batching 改善請求排程。兩者互補,但不是同一項技術,也不是缺一就完全不能做另一項。[3]
這組教學條件下,固定批次需 8 輪,動態批次需 6 輪。假設每輪各請求完成一小步,省略前文運算(prefill)、不同輪次耗時及記憶體限制;這是排程示例,不是實際速度或效能保證。
vLLM,就是將這些能力整合起來的推論引擎
到這裡,再看 vLLM 就不會只剩一串名詞了:它是用來執行模型、提供推論服務的軟體,具備 KV Cache 管理與 Continuous Batching 等能力。vLLM 不是模型本身。[5]
多個請求進來,由 vLLM 管理後交給 GPU 執行
使用者請求
每個人的內容、長度都可能不同。
vLLM
Paged Attention
管理分頁快取與對應的注意力讀取。
Continuous Batching
安排每一輪有哪些請求一起處理。
GPU
執行模型運算,逐步產生回答。
這張圖只畫出本篇的重點,不是完整架構。實際使用的注意力核心、排程策略與效果,會依模型、硬體和設定而不同。[5]
不是讓模型變聰明,而是讓服務少浪費
留下算過的 Key / Value,後續回答不用每次重算前文。
每個請求先預留一大段,可能只用 8 格,卻讓 12 格都不能給別人用。
改成按頁分配,透過對照表找到分散的頁面,減少不必要的預留。
不等整批全部做完,已完成請求的位置可在下一輪補入新請求。
將快取管理、排程與模型執行等能力整合成推論服務。
參考資料與延伸閱讀
KV Cache 的用途、儲存內容與快取成長方式。
按需分配、非連續頁面與最後一頁的未用空間。
Paged Attention 原始論文,以及與逐輪排程互補的關係。
推論引擎、分頁快取管理與 Continuous Batching 等能力。