1. 自回歸生成的特點
大模型(如 GPT 等)在推理時通常采用自回歸生成的方式:
- 模型逐個生成 token,每次生成一個新 token 時,需要重新計算注意力。
- 在生成第?
t
?個 token 時,模型需要基于前?t-1
?個已生成的 token 來計算注意力權重。
由于自回歸生成是逐步進行的,k
?和?v
?的性質決定了它們可以被重復利用,而?q
?則需要每次都重新計算。
2.?k
?和?v
?可以緩存的原因
(1)?k
?和?v
?是基于歷史 token 計算的
k
?和?v
?是從輸入序列的 token 中生成的,且它們只依賴于每個 token 的嵌入表示。- 在自回歸生成中,前?
t-1
?個 token 的?k
?和?v
?已經計算過,并且不會因為后續生成新 token 而改變。 - 因此,這些?
k
?和?v
?可以直接緩存下來,在生成新的 token 時重復使用。
(2)?k
?和?v
?是全局共享的
- 在注意力機制中,所有 token 的?
k
?和?v
?都會被集中起來形成全局的?K
?和?V
?矩陣,供當前 token 的?q
?查詢。 - 這意味著?
k
?和?v
?的計算結果是可以復用的,無需每次重新生成。
(3)?減少重復計算
- 如果不緩存?
k
?和?v
,每次生成新 token 時都需要重新計算前?t-1
?個 token 的?k
?和?v
,這會導致大量的冗余計算。 - 緩存?
k
?和?v
?后,只需在生成新 token 時計算該 token 對應的?k
?和?v
,并將其追加到緩存中即可。
3.?q
?不需要緩存的原因
(1)?q
?是針對當前 token 的
q
?是由當前正在生成的 token 的嵌入表示計算得到的,因此它只與當前 token 相關。- 每次生成新 token 時,
q
?都會發生變化,無法復用之前的?q
。 - 因此,沒有必要緩存?
q
。
(2)?q
?的計算成本較低
q
?的計算只需要對當前 token 的嵌入表示進行一次線性變換即可完成,計算量相對較小。- 即使每次都重新計算?
q
,也不會顯著增加推理時間。
4.?緩存?k
?和?v
?的實際操作
在實際實現中,緩存?k
?和?v
?的流程如下:
- 初始化緩存:在生成第一個 token 時,計算該 token 的?
k
?和?v
,并將它們存儲到緩存中。 - 追加緩存:在生成后續 token 時,計算新 token 的?
k
?和?v
,并將其追加到現有的緩存中。 - 復用緩存:在計算注意力時,直接從緩存中讀取?
k
?和?v
,而不需要重新計算。
這種方式可以顯著減少計算和內存訪問的開銷,尤其是在生成長序列時。
5.?為什么?k
?和?v
?的緩存對性能至關重要?
(1)?加速推理
- 緩存?
k
?和?v
?后,每次生成新 token 時只需要計算該 token 的?q
、k
?和?v
,而不需要重新計算整個序列的?k
?和?v
。 - 這使得推理速度大幅提高,尤其是在生成長序列時。
(2)?降低內存帶寬壓力
- 如果不緩存?
k
?和?v
,每次生成新 token 時都需要重新計算并加載前?t-1
?個 token 的?k
?和?v
,這會對內存帶寬造成巨大壓力。 - 緩存?
k
?和?v
?后,可以直接從高速緩存中讀取,減少了內存訪問次數。
(3)?支持高效的硬件優化
- 現代硬件(如 GPU 或 TPU)對矩陣運算有專門的優化,緩存?
k
?和?v
?可以讓注意力計算更加高效。 - 例如,通過批處理技術,可以一次性處理多個 token 的?
k
?和?v
,從而充分利用硬件資源。