AI・機械学習
上級

LLM キャッシュエビクション(エルエルエム キャッシュエビクション)

LLM 推論時の KV キャッシュがメモリ上限に達した際に、不要なエントリを追い出して新しいデータのための空きを確保するメモリ管理戦略。LRU、スコアベース、ウィンドウ方式などがある。

0 回閲覧
0 いいね

LLM キャッシュエビクションとは

LLM キャッシュエビクション(Cache Eviction)は、LLM の推論時に KV キャッシュが GPU メモリの上限に達した際に、一部のキャッシュエントリを削除して新しいトークンのための空きメモリを確保するメモリ管理戦略です。LLM の長コンテキスト対応(128K〜1M トークン)が進む中、KV キャッシュのメモリ消費は推論コストの最大の課題となっており、効率的なエビクション戦略は推論システムの性能を左右する重要な技術です。

なぜエビクションが必要か

前述の通り、KV キャッシュのメモリ消費量はシーケンス長に比例して増大します。例えば Llama 3.1 70B で 128K コンテキストを処理すると、KV キャッシュだけで約 330 GB のメモリが必要です。現行最大の GPU(NVIDIA H100 80GB)でもモデル重み + KV キャッシュを収容できないため、何らかのメモリ管理戦略が不可欠です。

主要なエビクション戦略

LRU(Least Recently Used)

最も長い間参照されていないキャッシュエントリから順に追い出す古典的な戦略です。実装がシンプルで計算オーバーヘッドが小さい一方、Attention パターンの特性を考慮しないため、重要なトークン(文脈の冒頭、句読点、キーワード等)を不用意に追い出してしまう場合があります。

Sliding Window(スライディングウィンドウ)

直近の N トークンの KV キャッシュのみを保持し、それ以前のトークンを一括で破棄する方式です。Mistral 7B が Sliding Window Attention(4,096 トークンウィンドウ)を採用しています。

戦略メモリ効率品質維持実装複雑度代表実装
LRU中低〜中低vLLM
Sliding Window高中低Mistral
H2O高高中H2O 論文
StreamingLLM高中〜高中MIT/Meta
Scissorhands高高高研究段階

H2O(Heavy-Hitter Oracle)

Attention スコアの累積値に基づいてトークンの重要度を判定し、スコアの高いトークン(Heavy Hitter)の KV キャッシュを優先的に保持する戦略です。全体の 5〜20% のトークンが Attention の大部分を集めるという観察に基づいており、これらの Heavy Hitter を残すことで、キャッシュサイズを大幅に削減しても品質劣化を最小限に抑えられます。

StreamingLLM

MIT と Meta の共同研究で提案された手法で、「Attention Sink」と呼ばれる現象に着目しています。Transformer モデルでは、シーケンスの最初の数トークン(Sink Token)が位置に関係なく常に高い Attention スコアを受ける傾向があります。StreamingLLM は、Sink Token(先頭 4 トークン程度)+ 直近の N トークンの KV キャッシュのみを保持することで、理論上は無限長のストリーミング推論を実現します。

実用上の選択指針

短コンテキスト(〜8K トークン): エビクション不要。モデル重み + KV キャッシュが GPU メモリに収まる。

中コンテキスト(8K〜32K トークン): Sliding Window または GQA/MQA による KV キャッシュ圧縮で対応。エビクションなしでも実用的。

長コンテキスト(32K〜128K トークン): H2O や StreamingLLM のスコアベースエビクションが効果的。品質と メモリのトレードオフを細かく制御可能。

超長コンテキスト(128K 以上): KV キャッシュの CPU/NVMe オフロードとエビクションの併用が必要。研究段階の手法が多い。

FAQ

Q: エビクションすると出力品質は低下しますか?

戦略によります。LRU やランダムエビクションでは品質低下が顕著ですが、H2O のようにAttention スコアベースで重要トークンを選別する手法では、KV キャッシュを 80% 削減しても品質低下はベンチマーク上 1-3% 程度にとどまることが報告されています。

Q: エビクションと KV キャッシュ量子化はどちらが効果的ですか?

両者は補完的で、併用が最も効果的です。量子化は全エントリのメモリ使用量を均等に削減し(FP16→INT8 で 50% 削減)、エビクションは不要なエントリ自体を除去します。H2O + INT4 量子化の組み合わせで、KV キャッシュサイズを元の 10% 以下に圧縮できるケースもあります。

Q: エビクションはバッチ推論にも適用できますか?

はい、バッチ内の各シーケンスに対して独立にエビクションポリシーを適用できます。vLLM の PagedAttention では、ブロック単位でエビクションを管理し、シーケンスごとに異なるキャッシュサイズを許容するため、バッチ推論との相性が良好です。