プロンプトキャッシュ(KVキャッシュ)(プロンプトキャッシュ ケーブイキャッシュ)
LLM推論時にTransformerのAttention計算で生成されるKey-Valueペアをキャッシュし、同一プレフィックスを持つ後続リクエストで再計算を省略する最適化技術。
プロンプトキャッシュ(KVキャッシュ)とは
プロンプトキャッシュは、大規模言語モデル(LLM)の推論効率を劇的に向上させる中核技術である。Transformerアーキテクチャでは、各トークンの処理時にAttention機構がKey(K)とValue(V)のテンソルを計算する。通常、新しいリクエストが来るたびにプロンプト全体のKVペアを再計算するが、KVキャッシュを使えば既に計算済みの部分を保持・再利用できる。
この仕組みは特にオートレグレッシブ生成(トークンを1つずつ生成する方式)で威力を発揮する。例えば100トークンのプロンプトに対して50トークンの応答を生成する場合、KVキャッシュがなければ合計150回×100〜150回のAttention計算が必要になるが、キャッシュがあれば各ステップで新しいトークン1つ分のKV計算だけで済む。
KVキャッシュの仕組み
Attention計算の基本
Transformerの各レイヤーでは、入力トークン列からQuery(Q)、Key(K)、Value(V)の3つの行列を生成する。Attention出力は softmax(QK^T / √d_k) × V で計算される。KVキャッシュはこのKとVを保持し、新しいトークンのQだけを使って差分計算を行う。
メモリ使用量の計算
KVキャッシュのメモリ使用量は以下の式で概算できる:
| パラメータ | 計算式 | 例(Llama 3 70B) |
|---|---|---|
| レイヤー数 | L | 80 |
| ヘッド数 | H | 64(GQA: KVヘッド8) |
| ヘッド次元 | d | 128 |
| シーケンス長 | S | 8,192 |
| KVキャッシュサイズ | 2 × L × H_kv × d × S × dtype | 約2.6GB(FP16) |
GQA(Grouped-Query Attention)を採用するモデルではKVヘッド数がQヘッド数より少ないため、キャッシュサイズが大幅に削減される。Llama 3ではKVヘッド数が8でQヘッド数64の1/8となり、メモリ効率が8倍改善する。
実装パターンと最適化手法
PagedAttention(vLLM方式)
従来のKVキャッシュは連続メモリ領域を事前確保するため、最大シーケンス長分のメモリを占有してしまう。vLLMが導入したPagedAttentionは、OSの仮想メモリページングと同様に、KVキャッシュを固定サイズのブロック(ページ)に分割して非連続メモリに配置する。これにより:
- メモリ断片化を90%以上削減
- バッチ処理のスループットが2〜4倍向上
- 異なるリクエスト間でのKVキャッシュ共有(Copy-on-Write)が可能
RadixAttention(SGLang方式)
SGLangが採用するRadixAttentionは、複数リクエスト間で共通するプレフィックスのKVキャッシュをRadix Tree(基数木)で管理する。同一システムプロンプトを持つ複数リクエストが来た場合、システムプロンプト部分のKVキャッシュを1回だけ計算して全リクエストで共有する。
量子化KVキャッシュ
KVキャッシュのテンソルをFP16からINT8やINT4に量子化することで、メモリ使用量を半分〜1/4に削減できる。KIVI(KV Cache Quantization with Integer Values)やGear(GPU-Efficient Asymmetric Rounding)などの手法が提案されている。
主要フレームワークのサポート状況
| フレームワーク | KVキャッシュ方式 | 特徴 |
|---|---|---|
| vLLM | PagedAttention v2 | 業界標準、最も成熟 |
| SGLang | RadixAttention | プレフィックス共有に最適 |
| TensorRT-LLM | Paged KV Cache | NVIDIA GPU最適化 |
| llama.cpp | 連続キャッシュ | CPUでも動作、GGUFモデル向け |
| Hugging Face TGI | Flash Decoding | PagedAttentionベース |
FAQ
Q1: KVキャッシュとプロンプトキャッシュは同じものですか?
厳密には異なる概念である。KVキャッシュはTransformerの推論時にAttention計算結果を保持する機構で、1リクエスト内の逐次生成を高速化する。プロンプトキャッシュはリクエスト間で共通プレフィックスのKVキャッシュを再利用する上位概念で、API提供者(Anthropic、OpenAI等)が実装するサーバーサイド最適化を含む。
Q2: KVキャッシュのメモリが不足した場合どうなりますか?
多くのフレームワークではEviction(追い出し)戦略が実装されている。LRU(Least Recently Used)、スコアベース(Attention重みの低いトークンを優先的に破棄)、ウィンドウ方式(直近N トークンのみ保持)などがある。H2O(Heavy Hitter Oracle)は重要度の高いトークンのKVを優先的に保持する手法として知られる。
Q3: マルチターン会話でKVキャッシュはどう活用されますか?
会話の各ターンで過去の全メッセージを含むプロンプトを再送する際、前回ターンまでのKVキャッシュを保持しておけば差分(新しいユーザーメッセージ+前回応答)だけを計算すればよい。Anthropicのプロンプトキャッシュは最大5分間のTTLでこのKVキャッシュを保持し、90%のコスト削減を実現している。