AI・機械学習
上級

KVキャッシュ(ケーブイキャッシュ)

Transformerモデルの自己注意機構において、過去トークンのKey(K)とValue(V)の計算結果をGPUメモリ上に保持し、新トークン生成時の再計算を回避する技術。LLMの自己回帰推論で必須の最適化手法。

0 回閲覧
0 いいね

KVキャッシュ(Key-Valueキャッシュ)とは、Transformerベースの大規模言語モデル(LLM)が自己回帰的にトークンを生成する際、過去トークンのKey行列とValue行列をGPUメモリに保持して再利用する技術である。この仕組みがなければ、新しいトークンを1つ生成するたびに全トークンのK/Vを再計算する必要があり、計算量がO(n^2)に膨れ上がる。

概要

Transformerの自己注意機構(Self-Attention)は、Query(Q)、Key(K)、Value(V)の3つの行列を用いて各トークン間の関係性を計算する。推論時(デコード段階)では、新たに生成されたトークンのQに対して、過去の全トークンのK/Vとの注意スコアを計算する必要がある。KVキャッシュは過去トークンのK/V行列をメモリに保持することで、各ステップでの計算量をO(n)に削減する。

2025-2026年のLLM推論では、KVキャッシュはすべての主要推論エンジン(vLLM、TensorRT-LLM、llama.cpp、SGLang)に標準実装されている。課題はメモリ消費量の管理であり、長コンテキスト(128K-1Mトークン)ではKVキャッシュだけで数十GBのGPUメモリを消費する。

メモリ計算式と具体例

KVキャッシュのメモリ使用量は以下の式で計算される:

メモリ = 2 × レイヤー数 × ヘッド数 × ヘッド次元 × シーケンス長 × バッチサイズ × バイト数

モデルレイヤーヘッド次元4Kコンテキスト(FP16)128Kコンテキスト(FP16)
Llama 3.1 8B328(GQA)128256MB8GB
Llama 3.1 70B808(GQA)128640MB20GB
Llama 3.1 405B1268(GQA)1281GB32GB
GPT-4クラス~120~128(MHA)12815GB480GB

GQA(Grouped Query Attention)採用モデルはKVヘッド数が少ないため、MHA(Multi-Head Attention)比でKVキャッシュメモリを大幅に削減できる。Llama 3.1はGQA 8ヘッドを採用し、従来のMHAと比較して8-16倍のメモリ効率を実現。

主要な最適化技術

PagedAttention(vLLM)

vLLMが2023年に提案したPagedAttentionは、OSの仮想メモリ管理に着想を得たKVキャッシュ管理手法。固定サイズの「ページ」(通常16トークン分)単位でKVキャッシュを割り当て、物理メモリの断片化を解消する。

  • メモリ利用効率: 従来の連続メモリ割当比で最大4xの改善
  • スループット: バッチ処理で2-4xの改善(A100 80GB環境)
  • 実装: vLLM 0.2+で標準搭載、2026年時点でv2が安定版

KVキャッシュ量子化

KVキャッシュをFP16からFP8/INT8/INT4に量子化してメモリ使用量を削減する技術:

  • FP8量子化: メモリ50%削減、品質劣化はほぼゼロ。TensorRT-LLM 0.12+、vLLM 0.6+で対応
  • INT8量子化: メモリ50%削減、わずかな品質低下。llama.cpp Q8_0形式
  • INT4量子化: メモリ75%削減、長文で品質劣化が顕在化。研究段階
  • KIVI(2024): Key行列をINT2、Value行列をINT4で非対称量子化。Llama 2 70Bで128Kコンテキスト対応を実現

Multi-Query Attention / Grouped Query Attention

モデルアーキテクチャレベルでKVキャッシュを削減:

  • MQA: 全注意ヘッドで1つのK/Vを共有。Falcon、PaLM、StarCoderで採用
  • GQA: K/Vヘッドをグループ化(通常8グループ)。Llama 2/3、Mistral、Gemmaで採用
  • MLA(Multi-head Latent Attention): DeepSeek-V2/V3で採用。KVを低ランク圧縮し、GQA比でさらに5-10xのKVキャッシュ削減

実装例と対応状況

  • vLLM 0.6.4: PagedAttention v2 + FP8 KVキャッシュ + APC(Automatic Prefix Caching)
  • TensorRT-LLM 0.12: NVIDIA H100/B200向けFP8 KVキャッシュ最適化
  • llama.cpp b4200+: Q8_0/Q4_0 KVキャッシュ量子化、Apple Silicon Metal対応
  • SGLang 0.3: RadixAttention + KVキャッシュ再利用ツリー
  • FlashAttention-3: Hopper GPU(H100/H200)向け、FP8 KVキャッシュネイティブ対応

よくある質問(FAQ)

Q1: KVキャッシュのFP8量子化で品質は劣化しますか? A: 実用上は検出不能なレベル。Llama 3.1 70BのMMLU-Proベンチマークで、FP16比0.1-0.3ポイント以内の差。TensorRT-LLMの公式ベンチマークでもFP8 KVキャッシュは「品質同等」と報告されている。

Q2: KVキャッシュはGPUメモリのどのくらいを消費しますか? A: モデルサイズとコンテキスト長に依存するが、Llama 3.1 70B(FP16重み + FP16 KV)で128Kコンテキスト・バッチ1の場合、モデル重み約140GB + KVキャッシュ約20GB = 合計約160GB。A100 80GB×2台構成でぎりぎり収まる計算。バッチサイズ増加時はKVキャッシュがボトルネックになる。

Q3: PagedAttentionはどのGPUで使えますか? A: vLLM経由でNVIDIA GPU(Ampere以降: A100/A10G/L4/H100/H200/B200)、AMD GPU(MI250/MI300X)、Intel GPU(Gaudi2/3)に対応。Apple Silicon(M1-M4)ではllama.cppのMetal実装が利用可能だが、PagedAttention非対応のため連続メモリ割当。

まとめ

  • KVキャッシュはTransformer推論の必須最適化、全主要エンジンに標準搭載
  • メモリ使用量はモデル規模×コンテキスト長×バッチサイズで線形増大
  • PagedAttention(vLLM)でメモリ効率4x改善、FP8量子化でさらに50%削減
  • GQA/MLA等のアーキテクチャ改善でKVキャッシュサイズ自体を削減する方向も進化中
  • 128K以上の長コンテキスト推論ではKVキャッシュ最適化が実用上の必須要件