跳到內容

KV Cache

回答逐步生成時,模型要反覆參考前文

Section titled “回答逐步生成時,模型要反覆參考前文”

LLM 不會一次完成整段回答。Prefill 處理完輸入後,Decode 會接著逐步產生新 Token;要產生下一個 Token 時,模型又要參考原本的 Prompt 與剛才的輸出。

如果每一步都重新計算前面所有 Token,回答越長,重複工作就越多。KV Cache 會留下稍後還用得到的運算結果,讓下一步沿用這些結果,再補上最新 Token 的資料。

可以把它想成這次回答的「運算筆記」。模型仍會參考前文,但不需要每寫一小段,就把整份題目和已寫內容從頭整理一次。

Prefill 處理 Prompt 時,會替輸入 Token 建立 KV Cache。Decode 每產生一個 Token,通常也會把新結果加進 Cache。因此,KV Cache 會隨這次推論使用的 Context 增長。

這項暫存帶來兩個直接結果:

  • 減少重算: Decode 可以沿用前文的結果,逐步產生後續 Token。
  • 占用記憶體: Prompt 越長、回答越長或同時處理的請求越多,通常需要越多 KV Cache 空間。

模型權重能放進記憶體,只代表跨過第一道容量門檻。執行時還要容納 KV Cache、Runtime 與其他運算資料;這也是短 Prompt 可以執行,換成長 Context 後卻可能記憶體不足的原因。

因素 對 KV Cache 的影響
Context 長度 輸入與已生成的 Token 越多,需要保留的結果通常越多。
模型本身 不同模型會為每個 Token 保存不同份量的資料;Context 一樣長,占用也可能不同。
Cache 精度設定 每個數值使用的位元越多,通常占用越大;這項設定可能和模型權重精度分開。
同時請求或批次數 每個進行中的序列都需要自己的 Cache;同時處理越多請求,總占用通常越高。
Runtime 的管理方式 Runtime 如何配置、重用或移動 Cache,會影響實際占用與速度。

因此,不能只用模型檔案大小推算完整記憶體需求。比較本地模型時,要固定模型、量化版本、Runtime、Context 長度與同時請求數,再觀察實際占用。Mac 的容量判斷可接著閱讀〈看懂統一記憶體與記憶體頻寬〉

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
保存內容 使用者與模型可讀的文字。 模型運算使用的數值。
通常由誰管理 聊天 App、資料庫或文件。 模型 Runtime。
能否直接閱讀或編輯 可以。 不能當成一般文字閱讀或修改。
何時還能使用 App 可以保存後再次送給模型。 通常綁定特定模型、設定與這次推論,能否重用取決於 Runtime。

畫面仍顯示舊對話,不代表對應的 KV Cache 一直保留。App 也可以保存文字,在下一次請求時重新送出,再由模型重建 Cache。

同一模型能處理短 Prompt,換成長文件或多個同時請求後才失敗,KV Cache 就是需要檢查的項目之一。可以依序測試:

  1. 縮短 Context 或限制回答長度,觀察是否恢復正常。
  2. 減少同時請求或批次數,確認總占用是否下降。
  3. 檢查 Runtime 是否支援較低精度的 KV Cache 或其他節省 Cache 空間的設定。
  4. 重新測量生成速度與輸出品質;節省容量的設定仍可能改變速度或帶來精度取捨。

這些測試能分辨問題是否來自執行期間的 Cache,而不是把所有記憶體不足都歸因於模型權重。

「KV Cache 就是聊天紀錄。」 不是。聊天紀錄是文字;KV Cache 是 Runtime 在推論期間使用的數值暫存。

「模型權重量化成 4-bit,KV Cache 也一定會變成 4-bit。」 不一定。權重與 KV Cache 可以使用不同精度,仍要查看 Runtime 與執行設定。

「分配越多 KV Cache,模型就會回答得更好。」 不會自動發生。較多空間可能容納更長 Context 或更多同時請求,回答品質仍取決於模型能力、輸入內容與設定。

Context Window · Prefill · Decode · 量化 · 統一記憶體

試著回答以下問題,來確認是否已學會。不確定答案的話,再回到對應段落複習。打勾狀態是方便你在這個頁面一一確認用,不會被儲存。

閱讀後自我確認