AI・機械学習
上級

KVキャッシュエビクション(ケーブイキャッシュエビクション)

KVキャッシュから重要度の低いトークンのKey-Valueペアを動的に破棄し、メモリ使用量を削減しながら生成品質を維持する技術。H2OやSnapKVが代表的手法。

0 回閲覧
0 いいね

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 Cache100%100%0%なし完全
H2O20%95%80%5〜10%良好
SnapKV3〜5%98%95〜97%プリフィルのみ良好
StreamingLLM固定4K85〜90%97%+なし制限あり
Scissorhands20〜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量子化との組み合わせで更なる圧縮が可能