KVキャッシュエビクション(ケーブイキャッシュエビクション)
KVキャッシュから重要度の低いトークンのKey-Valueペアを動的に破棄し、メモリ使用量を削減しながら生成品質を維持する技術。H2OやSnapKVが代表的手法。
KVキャッシュエビクションとは
KVキャッシュエビクション(KV Cache Eviction)は、LLM推論中にKVキャッシュに蓄積されたトークンのKey-Valueペアのうち、Attention計算への寄与が小さいものを動的に破棄することで、メモリ使用量を大幅に削減する技術である。128Kトークンの長コンテキスト処理において、全トークンのK/Vを保持するとGPUメモリが逼迫するため、エビクション手法はコスト効率の高いLLMサービングに不可欠な技術となっている。
エビクションの理論的根拠
Transformerの Self-Attention には「Attention Sparsity」(注意の疎性)という経験的特性がある:
- 多くのトークンのAttention重みは極めて小さく(0.001未満)、出力への寄与が無視できる
- 一部の「Heavy Hitter」トークンが全体のAttention分布の80〜90%を占める
- この疎性パターンはレイヤー間・ヘッド間で比較的安定している
この性質により、上位5〜20%のトークンのK/Vだけを保持しても、生成品質をほぼ維持できる。
主要なエビクション手法
H2O (Heavy-Hitter Oracle)
2023年にMeta AIが提案。Attention Scoreの累積値に基づいてトークンの重要度を評価し、上位トークンのみをKVキャッシュに保持する。
- 動作: 各デコードステップでAttention Score行列を集計し、累積スコアの低いトークンを退避
- 保持率: 全トークンの20%保持で、LongBenchスコア95%以上を維持
- メモリ削減: 最大80%のKVキャッシュメモリを削減
- 制約: Attention Score計算のオーバーヘッド(5〜10%のレイテンシ増加)
SnapKV
2024年に提案された手法で、各レイヤーのAttentionパターンを分析し、情報量の高い「観測ウィンドウ」からKVの重要度を推定する。
- 動作: プリフィル段階で各レイヤーの最終数百トークンをウィンドウとして使用し、K/Vの重要度を一括決定
- 特徴: デコード中のオンライン計算が不要(プリフィル時に一度だけ選択)
- 性能: 128K入力 → 4Kキャッシュ(96%圧縮)で精度98%維持
- 速度: プリフィル時のオーバーヘッドのみで、デコード速度は3〜4倍向上
StreamingLLM
MITが提案した「Attention Sink」理論に基づく手法。Transformerの最初の数トークンが特別なAttention集中先(Sink)として機能する現象を利用する。
- 動作: 先頭4トークン(Attention Sink)+直近ウィンドウ(例: 4,096トークン)のみ保持
- 特徴: 固定メモリで無限長のストリーミング推論が可能
- 制約: ウィンドウ外の過去情報は完全に失われるため、長距離依存タスクには不向き
Scissorhands
Attention重みの「永続性(Persistence)」に着目。一度も高いAttentionを受けなかったトークンは将来も重要でないという仮説に基づく。
- 動作: 各ステップで全ヘッドのAttention重みを監視し、一定ステップ以上「重要」判定を受けなかったトークンを破棄
- 利点: H2Oより安定した選択が可能(スパイク的な高スコアに惑わされない)
手法比較
| 手法 | 保持率 | 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% | 良好 |
実装上の注意点
レイヤー別戦略
全レイヤーで同じエビクション率を適用するのは最適ではない。一般的に:
- 下位レイヤー(0〜10): ローカルパターンを捉えるため、直近トークンの保持が重要
- 中間レイヤー(10〜20): セマンティック情報を保持する重要トークンが集中
- 上位レイヤー(20〜32): タスク特化のパターンで、積極的なエビクションが可能
SnapKVはレイヤー別の適応的な保持率を自動決定するため、手動チューニングが不要。
タスク依存性
- 要約タスク: 入力全体の情報が重要なため、エビクション率を控えめに(30〜50%保持推奨)
- 質問応答: 質問に関連する部分のみ重要で、積極的エビクション可能(5〜20%保持)
- コード生成: インデント・スコープ情報が重要で、構造トークンの保持が必要
よくある質問(FAQ)
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が、不揃いサイズを効率的に処理する。独自実装の場合はパディングかリスト管理が必要になる。
まとめ
- KVキャッシュエビクションはAttentionの疎性を利用してメモリを80〜97%削減
- SnapKVがプリフィル時一括選択で最も高い効率と品質を両立
- StreamingLLMは固定メモリの無限長推論に特化
- レイヤー別・タスク別の適応的な保持率設定が品質維持の鍵
- KV量子化との組み合わせで更なる圧縮が可能