Transformer の Self-Attention 層で計算される Key-Value ペアを保存・再利用する仕組みで、プロンプトキャッシングの中核技術。
KVキャッシュ(Key-Value Cache)は、Transformer アーキテクチャの Self-Attention メカニズムにおいて、各トークンに対して計算された Key ベクトルと Value ベクトルのペアを GPU メモリに保存し、自己回帰的なトークン生成時に再利用する仕組みである。LLM の推論効率を左右する最も重要な中間データ構造であり、プロンプトキャッシングの基盤技術として位置づけられる。
通常の自己回帰生成では、新しいトークンを1つ生成するたびに、それまでの全トークンに対する Attention 計算が必要になる。KVキャッシュがなければ、トークン列長 N に対して O(N^2) の計算量が毎ステップ発生するが、過去のトークンの KV ペアをキャッシュすることで、新規トークンの Query と既存の Key-Value の積和演算のみで済み、計算量は O(N) に削減される。
KVキャッシュの消費メモリは以下の要素で決まる。
| パラメータ | 記号 | 典型値(70Bモデル) |
|---|---|---|
| レイヤー数 | L | 80 |
| Attention ヘッド数 | H | 64 |
| ヘッドあたり次元数 | d | 128 |
| シーケンス長 | S | 4,096-128,000 |
| バッチサイズ | B | 1-64 |
| データ型 | - | FP16(2バイト) |
KVキャッシュの総メモリ量は 2 * L * H * d * S * B * sizeof(dtype) で計算される。70Bモデルでシーケンス長128Kの場合、1リクエストあたり約40GBものメモリが必要になり、これがLLMサービングのボトルネックとなる。
KVキャッシュのメモリ効率と推論速度を改善するため、複数の最適化手法が開発されている。
通常の Multi-Head Attention では各ヘッドが独立した KV ペアを持つが、GQA では複数の Query ヘッドが同一の KV ヘッドを共有する。Llama 2 70B で採用され、KVキャッシュのメモリ使用量を最大8分の1に削減しながら、品質の劣化を最小限に抑える。
GQA の極端なケースで、全 Query ヘッドが単一の KV ヘッドを共有する。メモリ効率は最高だが品質への影響が大きいため、実用上は GQA が主流となっている。
OS のページング機構に着想を得て、KVキャッシュを固定サイズの「ページ」に分割して管理する手法。vLLM で実装され、以下の利点がある。
KVキャッシュを FP16 から INT8 や INT4 に量子化することで、メモリ使用量を半減〜4分の1に削減する。最新の研究では、KV キャッシュの量子化は重みの量子化よりも品質への影響が小さいことが示されている。
| 手法 | メモリ削減率 | 品質影響 | 実装例 |
|---|---|---|---|
| GQA | 4-8x | 最小 | Llama 2/3, Mistral |
| MQA | H x | 小-中 | PaLM, StarCoder |
| PagedAttention | 断片化解消 | なし | vLLM, SGLang |
| KV量子化 (INT8) | 2x | 最小 | KIVI, QServe |
| KV量子化 (INT4) | 4x | 小 | KVQuant, Atom |
商用LLMプロバイダが提供するプロンプトキャッシングは、本質的にはKVキャッシュの永続化と共有である。通常のKVキャッシュはリクエスト完了時に破棄されるが、プロンプトキャッシングでは以下の拡張が行われる。
この仕組みにより、例えば10,000トークンのシステムプロンプトを含むリクエストが5分以内に再度送信された場合、10,000トークン分のKV計算をスキップし、変動する会話部分の計算のみで応答を生成できる。
KVキャッシュの効率化は、LLMの長コンテキスト対応において最重要課題の一つである。2025年以降の主要な研究方向として、Attention Sink(先頭トークンのKVを優先保持)、H2O(Heavy-Hitter Oracle による動的KV削除)、StreamingLLM(無限長コンテキストへの対応)、分散KVキャッシュ(複数GPU間でのKV共有)などが挙げられる。
A1: KVキャッシュは Transformer の全レイヤー・全 Attention ヘッドについて Key と Value の2つのベクトルを保存する必要があり、シーケンス長に比例してメモリが増大します。70Bクラスのモデルでは80レイヤー x 64ヘッド x 128次元 x 2(K+V)= 約130万パラメータ/トークンとなり、128Kコンテキストでは1リクエストあたり数十GBに達します。これがLLMサービングにおけるスループット制限の主因です。
A2: 従来の方式では各リクエストに最大シーケンス長分のメモリを事前確保していたため、実際の使用量に関わらずメモリが浪費されていました。PagedAttention はOSの仮想メモリ管理のように、KVキャッシュを小さなブロック(ページ)に分割し、必要に応じて動的に割り当てます。これによりメモリ利用率が60-70%から97%以上に向上し、同一GPUで処理できる同時リクエスト数が2-4倍に増加します。
A3: 現在の主流はGQAです。Llama 2以降のほとんどの大規模モデルがGQAを採用しています。GQAはKVヘッド数を8程度に設定することが多く、64ヘッドの場合でKVキャッシュを8分の1に削減しつつ、品質劣化をほぼゼロに抑えます。MQAはKVヘッドを1つに減らすためメモリ効率は最高ですが、特に長いコンテキストや複雑な推論で品質が低下する傾向があり、コード生成特化モデル(StarCoder等)など限定的な用途で使われています。