KVキャッシュ量子化(ケーブイキャッシュリョウシカ)
KVキャッシュに格納されるKey-Valueテンソルのデータ精度をFP16からINT8/INT4に低減し、メモリ使用量を50〜75%削減する技術。KIVIやAtomが代表的手法。
KVキャッシュ量子化とは
KVキャッシュ量子化(KV Cache Quantization)は、LLM推論時にKVキャッシュに格納されるKeyベクトルとValueベクトルのデータ型をFP16(16ビット浮動小数点)からINT8(8ビット整数)やINT4(4ビット整数)に変換し、メモリ使用量を大幅に削減する技術である。モデルの重み量子化とは異なり、KVキャッシュは推論中に動的に生成されるため、活性化値量子化に近いアプローチが必要になる。
重み量子化との違い
| 項目 | 重み量子化 (GPTQ/AWQ) | KVキャッシュ量子化 (KIVI/Atom) |
|---|---|---|
| 対象 | モデルパラメータ | 推論時のK/Vテンソル |
| タイミング | オフライン(事前処理) | オンライン(推論中リアルタイム) |
| データ特性 | 静的、分布が安定 | 動的、入力依存で分布が変化 |
| 外れ値 | チャネル単位で対処可能 | トークン/チャネル混在で複雑 |
| 効果対象 | モデルメモリ削減 | KVキャッシュメモリ削減 |
| 併用 | 可能 | 可能(相互補完) |
主要な量子化手法
KIVI (Key-Value Integer Quantization for Inference)
2024年に提案された手法で、KeyとValueに異なる量子化戦略を適用する:
- Key量子化: チャネル方向(トークン間)に量子化。KeyはAttention計算で内積の一方となるため、チャネル方向の外れ値が品質に影響しやすい。INT2まで圧縮可能
- Value量子化: トークン方向(チャネル間)に量子化。Valueは加重和で混合されるため、トークン方向が安定。INT4で十分な品質
- 非対称量子化: KeyをINT2、ValueをINT4とする非対称構成で、FP16比75%のメモリ削減
- 品質: Llama 2 70Bでパープレキシティ劣化0.05未満(WikiText-2)
Atom
2024年にUCバークレーが提案。チャネル単位の外れ値に注目し、混合精度量子化を採用:
- 外れ値検出: 統計的に外れ値が集中するチャネル(通常1〜3%)を特定
- 混合精度: 外れ値チャネルはFP16、残りはINT4で量子化
- 融合カーネル: 量子化とAttention計算を1つのCUDAカーネルに融合し、メモリアクセスを最小化
- 性能: Llama 2 70BでFP16比4.7倍のスループット向上、品質劣化0.1%未満
QServe
MITが提案したGPUサービング特化の量子化フレームワーク:
- W4A8KV4: 重みINT4 + 活性化INT8 + KVキャッシュINT4の統合量子化
- SmoothAttention: Attention計算前にKey/Valueを正規化して量子化誤差を低減
- TensorRT統合: NVIDIA TensorRT-LLMとの深い統合で、量子化オーバーヘッドを最小化
- 性能: Llama 3 8BをA100で30%以上高速化
量子化精度と品質の関係
| 構成 | KVメモリ | パープレキシティ劣化 | スループット | 推奨用途 |
|---|---|---|---|---|
| FP16 (ベースライン) | 100% | 0 | 1× | 品質最優先 |
| INT8 対称 | 50% | <0.02 | 1.3× | 安全な選択 |
| INT4 対称 | 25% | <0.1 | 1.8× | バランス型 |
| KIVI (K2V4) | 25% | <0.05 | 2.0× | メモリ制約環境 |
| Atom INT4 混合 | 27% | <0.05 | 4.7× | 高スループット |
実装上の課題
動的範囲の問題
KVキャッシュの値は入力に依存して動的に変化するため、静的な量子化パラメータ(スケール、ゼロポイント)が使えない。主な対処法:
- Per-Token量子化: トークンごとにスケールを計算。精度は高いが計算オーバーヘッドが大きい
- Per-Channel量子化: チャネルごとにスケールを固定。KIVIが採用するアプローチで効率的
- Group量子化: 128要素ごとにグループ化してスケールを共有。GPTQ系と同様の考え方
カスタムカーネルの必要性
標準のPyTorchやCUDAライブラリはINT4のAttention計算をサポートしていない。KVキャッシュ量子化には:
- INT4デコード + FP16 Attention: 量子化されたK/VをFP16に復元してからAttention計算(簡易だが遅い)
- INT4ネイティブAttention: 量子化された状態でAttention計算を実行(高速だがカスタムカーネル必要)
- Atom、QServeは後者のアプローチで、Triton/CUDAカーネルを提供
よくある質問(FAQ)
Q1: KVキャッシュ量子化と重み量子化は併用できますか? A: 併用可能で推奨される。例えばAWQ INT4(重み)+ KIVI INT4(KVキャッシュ)の組み合わせにより、モデルメモリとKVキャッシュメモリの両方を75%削減できる。vLLM 0.6以降でこの組み合わせがサポートされている。Llama 3.1 8Bの場合、FP16で約20GB(パラメータ16GB + KV 4GB)が約5GB(パラメータ4GB + KV 1GB)まで圧縮される。
Q2: INT4未満の量子化(INT2やINT1)は実用的ですか? A: KIVIのKey側はINT2で実用的な品質を維持するが、KeyとValueの両方をINT2にすると顕著な品質劣化が発生する。2026年時点では、KVキャッシュ全体としてINT4が実用的な下限で、INT2はKey側のみの限定適用に留まる。1ビット量子化(バイナリ)は研究段階で実用には至っていない。
Q3: 量子化のオーバーヘッドはどの程度ですか? A: 量子化・逆量子化の計算自体は軽量で、Atomの融合カーネルでは1%未満のオーバーヘッド。ただし、融合カーネルなしの素朴な実装(FP16復元→Attention計算)では10〜15%のオーバーヘッドが発生する。カスタムカーネルの有無がKVキャッシュ量子化の実用性を左右する。
まとめ
- KVキャッシュ量子化はFP16→INT4で75%のメモリ削減を実現
- KIVIのKey INT2/Value INT4非対称構成が最も効率的
- Atomの融合カーネルでスループット4.7倍向上
- 重み量子化との併用でモデル全体のメモリを大幅圧縮
- カスタムCUDAカーネルの有無が実用性の鍵