序列模型與Transformer

KV 快取(KV cache)

/ kay-vee kash /

KV 快取,是一條省記憶體的捷徑,它讓文字生成變快。當模型一次寫一個詞元時,每個新詞元都要回頭注意已生成的每一個詞元——而這需要那些較早詞元的鍵向量與值向量。天真的做法是為每一個新詞都從頭重算它們,這極其浪費。KV 快取索性把它們記下來:每個詞元的鍵與值只算一次,存起來,在餘下的生成裡反覆取用。

回報是驚人的。沒有快取,生成第一百個詞元意味著把前九十九個的活兒重做一遍;有了它,你只做新詞元那份活兒,其餘的查表即可。這把生成從「平方級的功夫」變成「每詞元近乎線性」,正因如此,互動式聊天機器人才能以可讀的節奏串流吐字,而不是磨磨蹭蹭。快取是即時生成之所以根本可行的最大單一原因。

但快取不是免費的——它以計算換記憶體,而這筆記憶體帳很陡。它的大小隨層數、注意力頭數與對話長度增長,所以一段長聊天可能僅為容納快取就吃掉數 GB 的快速記憶體,往往成了「一台伺服器能扛多少使用者」或「能撐多長上下文」的真正上限。近來許多工程——分組查詢注意力、快取壓縮、分頁記憶體——存在的意義,恰恰就是為了縮小這塊佔用。KV 快取優美地說明了:在這門領域裡,常常是記憶體、而非純粹的算術,才是那條綁手綁腳的約束。

生成一段 500 詞元的回覆:到第 500 個詞元時,注意力需要第 1 到第 499 個詞元的鍵與值。沒有快取,模型每一步都把它們全部重算;有了快取,它們各算過一次,如今只需讀回,只為第 500 個詞元做新的活兒。

鍵與值只算一次,往後每個詞元都重複取用。

KV 快取以計算換記憶體,而記憶體通常是更難的那道限。它的大小隨層數、頭數與對話長度增長,所以一段長聊天的快取可能霸佔一塊 GPU 的記憶體,並卡住一台伺服器能服務多少使用者——這正是為何那麼多服務端最佳化都直奔「縮小它」而去。

又稱
key-value cacheKV 缓存KV 快取键值缓存