KVキャッシュから重要度の低いトークンのKey-Valueペアを動的に破棄し、メモリ使用量を削減しながら生成品質を維持する技術。H2OやSnapKVが代表的手法。
KVキャッシュエビクション(KV Cache Eviction)は、LLM推論中にKVキャッシュに蓄積されたトークンのKey-Valueペアのうち、Attention計算への寄与が小さいものを動的に破棄することで、メモリ使用量を大幅に削減する技術である。128Kトークンの長コンテキスト処理において、全トークンのK/Vを保持するとGPUメモリが逼迫するため、エビクション手法はコスト効率の高いLLMサービングに不可欠な技術となっている。
Transformerの Self-Attention には「Attention Sparsity」(注意の疎性)という経験的特性がある:
この性質により、上位5〜20%のトークンのK/Vだけを保持しても、生成品質をほぼ維持できる。
2023年にMeta AIが提案。Attention Scoreの累積値に基づいてトークンの重要度を評価し、上位トークンのみをKVキャッシュに保持する。
2024年に提案された手法で、各レイヤーのAttentionパターンを分析し、情報量の高い「観測ウィンドウ」からKVの重要度を推定する。
MITが提案した「Attention Sink」理論に基づく手法。Transformerの最初の数トークンが特別なAttention集中先(Sink)として機能する現象を利用する。
Attention重みの「永続性(Persistence)」に着目。一度も高いAttentionを受けなかったトークンは将来も重要でないという仮説に基づく。
| 手法 | 保持率 | LongBenchスコア | メモリ削減 | 追加レイテンシ | 長距離依存 |
|---|---|---|---|---|---|
| Full Cache | 100% | 100% | 0% | なし | 完全 |
| H2O | 20% | 95% | 80% | 5〜10% | 良好 |
| SnapKV | 3〜5% | 98% | 95〜97% | プリフィルのみ | 良好 |
| StreamingLLM | 固定4K | 85〜90% | 97%+ | なし | 制限あり |
| Scissorhands | 20〜30% | 96% | 70〜80% | 3〜5% | 良好 |
全レイヤーで同じエビクション率を適用するのは最適ではない。一般的に:
SnapKVはレイヤー別の適応的な保持率を自動決定するため、手動チューニングが不要。
Q1: エビクションで破棄されたトークンの情報は完全に失われますか? A: 基本的にはKVキャッシュから破棄されたトークンの情報は復元できない。ただし、過去のAttention計算結果は残りのトークンの隠れ状態に間接的に反映されているため、完全な情報喪失ではない。SnapKVの高い精度維持率(98%)はこの間接的な情報保持のおかげである。
Q2: エビクションとKV量子化は同時に使えますか? A: 併用可能で、実際に推奨される組み合わせ。例えばSnapKVで96%圧縮 + KIVI INT4で残りの4%をさらに75%圧縮すると、元のKVキャッシュの1%程度のメモリで運用できる。vLLM 0.6以降ではこの組み合わせがサポートされている。
Q3: バッチ処理でエビクションを使う際の注意点は? A: 各リクエストのエビクションパターンは異なるため、バッチ内でK/Vテンソルのサイズが不揃いになる。Paged AttentionとエビクションをvLLMが、不揃いサイズを効率的に処理する。独自実装の場合はパディングかリスト管理が必要になる。