KV Cache
回答逐步生成時,模型要反覆參考前文
Section titled “回答逐步生成時,模型要反覆參考前文”LLM 不會一次完成整段回答。Prefill 處理完輸入後,Decode 會接著逐步產生新 Token;要產生下一個 Token 時,模型又要參考原本的 Prompt 與剛才的輸出。
如果每一步都重新計算前面所有 Token,回答越長,重複工作就越多。KV Cache 會留下稍後還用得到的運算結果,讓下一步沿用這些結果,再補上最新 Token 的資料。
可以把它想成這次回答的「運算筆記」。模型仍會參考前文,但不需要每寫一小段,就把整份題目和已寫內容從頭整理一次。
KV Cache 用記憶體換取較少重算
Section titled “KV Cache 用記憶體換取較少重算”Prefill 處理 Prompt 時,會替輸入 Token 建立 KV Cache。Decode 每產生一個 Token,通常也會把新結果加進 Cache。因此,KV Cache 會隨這次推論使用的 Context 增長。
這項暫存帶來兩個直接結果:
- 減少重算: Decode 可以沿用前文的結果,逐步產生後續 Token。
- 占用記憶體: Prompt 越長、回答越長或同時處理的請求越多,通常需要越多 KV Cache 空間。
模型權重能放進記憶體,只代表跨過第一道容量門檻。執行時還要容納 KV Cache、Runtime 與其他運算資料;這也是短 Prompt 可以執行,換成長 Context 後卻可能記憶體不足的原因。
哪些因素會改變占用量?
Section titled “哪些因素會改變占用量?”| 因素 | 對 KV Cache 的影響 |
|---|---|
| Context 長度 | 輸入與已生成的 Token 越多,需要保留的結果通常越多。 |
| 模型本身 | 不同模型會為每個 Token 保存不同份量的資料;Context 一樣長,占用也可能不同。 |
| Cache 精度設定 | 每個數值使用的位元越多,通常占用越大;這項設定可能和模型權重精度分開。 |
| 同時請求或批次數 | 每個進行中的序列都需要自己的 Cache;同時處理越多請求,總占用通常越高。 |
| Runtime 的管理方式 | Runtime 如何配置、重用或移動 Cache,會影響實際占用與速度。 |
因此,不能只用模型檔案大小推算完整記憶體需求。比較本地模型時,要固定模型、量化版本、Runtime、Context 長度與同時請求數,再觀察實際占用。Mac 的容量判斷可接著閱讀〈看懂統一記憶體與記憶體頻寬〉。
在 Mac 上的實作例子:oMLX
Section titled “在 Mac 上的實作例子:oMLX”oMLX 是在 Apple silicon Mac 上提供模型服務的 Runtime。作者在官方 README 中,把分層保存 KV Cache 直接列為建立 oMLX 的理由:常用區塊留在記憶體的 Hot tier,較冷的區塊則可保存到 SSD;之後遇到相同前綴時,可以從 SSD 恢復結果,避免為已命中的前綴重新執行 Prefill,伺服器重新啟動後也能重用。
這不代表 oMLX 以 SSD 取代即時運算需要的記憶體。Decode 經常使用的 Cache 仍放在記憶體;SSD 是保存較冷區塊的 Cold tier。實際能省下多少時間,取決於請求是否重複相同前綴、Cache 是否命中,以及 SSD 與硬體速度。
KV Cache 不是聊天紀錄
Section titled “KV Cache 不是聊天紀錄”| 聊天紀錄 | KV Cache | |
|---|---|---|
| 保存內容 | 使用者與模型可讀的文字。 | 模型運算使用的數值。 |
| 通常由誰管理 | 聊天 App、資料庫或文件。 | 模型 Runtime。 |
| 能否直接閱讀或編輯 | 可以。 | 不能當成一般文字閱讀或修改。 |
| 何時還能使用 | App 可以保存後再次送給模型。 | 通常綁定特定模型、設定與這次推論,能否重用取決於 Runtime。 |
畫面仍顯示舊對話,不代表對應的 KV Cache 一直保留。App 也可以保存文字,在下一次請求時重新送出,再由模型重建 Cache。
遇到記憶體不足時怎麼判斷?
Section titled “遇到記憶體不足時怎麼判斷?”同一模型能處理短 Prompt,換成長文件或多個同時請求後才失敗,KV Cache 就是需要檢查的項目之一。可以依序測試:
- 縮短 Context 或限制回答長度,觀察是否恢復正常。
- 減少同時請求或批次數,確認總占用是否下降。
- 檢查 Runtime 是否支援較低精度的 KV Cache 或其他節省 Cache 空間的設定。
- 重新測量生成速度與輸出品質;節省容量的設定仍可能改變速度或帶來精度取捨。
這些測試能分辨問題是否來自執行期間的 Cache,而不是把所有記憶體不足都歸因於模型權重。
「KV Cache 就是聊天紀錄。」 不是。聊天紀錄是文字;KV Cache 是 Runtime 在推論期間使用的數值暫存。
「模型權重量化成 4-bit,KV Cache 也一定會變成 4-bit。」 不一定。權重與 KV Cache 可以使用不同精度,仍要查看 Runtime 與執行設定。
「分配越多 KV Cache,模型就會回答得更好。」 不會自動發生。較多空間可能容納更長 Context 或更多同時請求,回答品質仍取決於模型能力、輸入內容與設定。
Context Window · Prefill · Decode · 量化 · 統一記憶體
閱讀後自我確認
Section titled “閱讀後自我確認”試著回答以下問題,來確認是否已學會。不確定答案的話,再回到對應段落複習。打勾狀態是方便你在這個頁面一一確認用,不會被儲存。