KVキャッシュ(KV Cache)は、LLMが1トークンずつ文章を生成するとき、過去トークンのKey・Value(KV)をメモリに残して再計算を避ける推論最適化です。キャッシュなしだと毎ステップで全履歴の注意をゼロから計算する——KVキャッシュは「すでに見た部分の記憶を温存する」——本記事はテンソル形状の暗記より、自己回帰生成のボトルネックに焦点を当てます。
自己回帰生成の足かせ
GPT系のLLMは、次の1トークンを予測→出力に追加→また次を予測、を繰り返します(自己回帰)。TransformerのAttentionは、新トークンのQueryが、これまでの全トークン(過去の文脈)を見にいきます(TF-0108)。
素朴な実装では、トークンが増えるたびに全履歴のKey・Valueを毎回再計算します。文が長くなるほど1トークンあたりのコストが膨らむ——KVキャッシュはこの無駄を削ります。
Query・Key・Valueの役割
Scaled Dot-Product Attentionでは、各トークンから3つのベクトルが作られます。
| 記号 | 役割 | KVキャッシュとの関係 |
|---|---|---|
| Q(Query) | 「何を探すか」 | 新トークン分だけ毎ステップ計算 |
| K(Key) | 「何として索引されるか」 | 過去分をキャッシュに保存 |
| V(Value) | 「取り出す中身」 | 過去分をキャッシュに保存 |
過去トークンのK・Vは生成が進んでも変わらない——だから保存して再利用できる。これがKVキャッシュの前提です(G-304の注意の枠組み)。
キャッシュが効く仕組み
- ステップ1 — 最初のトークンでK・Vを計算し、キャッシュへ格納
- ステップ2以降 — 新トークンのQ・K・Vだけ計算。K・Vはキャッシュの過去分と連結
- Attention — 新Qが「キャッシュ済みK全体」を参照して重み付き和
- 効果 — 履歴長に比例した再計算の削減→生成が速くなる
FlashAttentionが注意計算の中身を速くするのに対し、KVキャッシュは何を計算しないかを決める——両方とも推論高速化(G-406)に効きますが、層が違います。
メモリとのトレードオフ
キャッシュはGPUメモリを消費します。文脈が長いほど、層数×ヘッド数×トークン数ぶんのK・Vを保持する——コンテキストウィンドウが大きいモデルほど、KVキャッシュのメモリ圧力も上がります(TF-0170)。
| 手法 | 何を減らすか |
|---|---|
| KVキャッシュ | 再計算(時間) |
| MQA | KVを1組に集約→キャッシュ最小 |
| GQA | KVヘッド数→キャッシュ容量そのもの |
| FlashAttention | 注意計算のメモリIO |
GQAは「KVを束ねてキャッシュを軽くする」設計、KVキャッシュは「軽くしたKVを捨てずに使い回す」設計——推論効率の別レイヤーとして整理すると、試験のすり替えに強くなります。
試験で押さえるポイント
- 定義 — 推論時に過去トークンのK・Vを保持・再利用する技法
- 前提 — 自己回帰的に1トークンずつ生成するLLM
- 効果 — 履歴の再計算を避け、生成速度を改善
- 対比 — FlashAttention=計算実装、GQA=KVヘッド削減、学習時バッチ処理とは別
すり替えに注意
| 誤った説明 | 正しい理解 |
|---|---|
| KVキャッシュ=FlashAttention | 履歴の再利用 vs 注意計算のIO効率化 |
| KVキャッシュ=コンテキストウィンドウ | 推論最適化 vs 扱える文脈長の上限 |
| KVキャッシュ=RAG | モデル内部の記憶 vs 外部検索で文脈を足す |
| KVキャッシュ=学習手法 | 推論時の高速化が中心 |
| KVキャッシュ=トークンそのもの | K・Vテンソルの保存 vs テキストの分割単位 |
よくある質問
KVキャッシュは何をする技法ですか?
TransformerベースのLLMがテキストを1トークンずつ生成するとき、すでに処理した過去トークンのKey・Valueをメモリに保存し、次のトークンでは新しい部分だけを計算する推論最適化です。毎ステップで全履歴をゼロから再計算する無駄を省き、生成速度を上げます。
KVキャッシュとFlashAttentionは同じですか?
同じではありません。KVキャッシュは推論時に過去のKey・Valueを保持して再計算を避ける手法です。FlashAttentionは注意計算そのものをGPUメモリIO効率よく実行する実装です。両方とも推論を速くしますが、解くボトルネック(履歴の再計算 vs 注意の計算効率)が異なります。
KVキャッシュは学習時にも使いますか?
主に推論(テキスト生成)時の最適化として説明されます。学習時は通常、系列全体を並列に処理するため、自己回帰的に1トークンずつ生成する状況とは異なります。試験では推論高速化の文脈で押さえるのが中心です。