PyramidKV(ピラミッドケーブイ)
Transformerの各層のAttentionパターンの違いに応じてKVキャッシュ予算を層ごとに変動配分し、全体の圧縮効率を高めるKVキャッシュ最適化手法。
PyramidKV — 層別差分バジェット割当によるKVキャッシュ最適化
PyramidKVは、2024年にUNC Chapel Hill・Microsoft Researchのチームが発表した層別KVキャッシュ予算最適化手法だ。SnapKVやH2Oが全層一律の圧縮率を使うのに対し、PyramidKVは各Transformer層のAttentionパターンの性質の違いに応じてKV予算を変動させることで、同じ総メモリ使用量でより高い精度を達成する。
着目点:層によるAttentionパターンの違い
PyramidKVの動機となった観察:
浅い層(低レイヤー):
- AttentionパターンがFull Attention(全トークンに分散)に近い
- 多様なトークンに注目 → 重要KVペアを多く保持する必要がある
- KV予算を減らすと精度への影響が大きい
深い層(高レイヤー):
- Attentionパターンがスパース(少数のトークンに集中)
- 重要なKVペアが少数に絞られる
- KV予算を減らしても精度への影響が小さい
この非対称性を利用して、浅い層に多くのバジェットを、深い層には少ないバジェットを割り当てる「ピラミッド型」の分配戦略を採る。
バジェット割当の仕組み
総KVバジェット B_total を層数 L に分配する際、以下の線形減衰式を使用:
B_l = B_base - (l - 1) × α
B_l: 層 l のKVバジェット
B_base: 最初の層のバジェット(最大)
l: 層インデックス(1〜L)
α: 減衰率(総バジェット B_total から逆算)
例(32層モデル・総バジェット1024トークン):
- 層1: B=64
- 層8: B=50
- 層16: B=36
- 層24: B=22
- 層32: B=8
このピラミッド型分布により、浅い層が深い層の2〜8倍のKVペアを保持する。
SnapKVとの組み合わせ
PyramidKVはSnapKVのバジェット割当部分のみを差し替える設計になっており、SnapKVのObservation Window選択ロジックはそのまま使用できる。
- SnapKV: 全層で同じバジェット B を使用
- PyramidKV: 層ごとに異なるバジェット B_l を使用
- その他の選択ロジック(Attention Score集計・Pooling)はSnapKV互換
性能評価
LLaMA-3-8B-Instruct(128Kコンテキスト)での比較:
- Full Cache: 精度 100%
- SnapKV(均等・総B=1024): 精度 98.1%
- PyramidKV(総B=1024): 精度 99.2%
- SnapKV(均等・総B=2048): 精度 99.0%
同じ総バジェット1024トークンで、SnapKVより1.1%精度が向上。SnapKVと同等精度を得るためのバジェットを約50%削減できる。
実装
PyramidKVはSnapKV実装をベースにした軽微な変更で実現可能(バジェット計算ロジックのみ変更)。GitHub(FasterDecoding/PyramidKV)でオープンソース公開されている。
よくある質問(FAQ)
Q1: PyramidKVの減衰率αはどう決めますか? A: B_total と L(層数)から自動計算される(α = (B_base - B_min) / (L-1))。実用的にはB_min=8〜16に固定し、残りのバジェットをB_baseに集約する。ハイパーパラメータ探索なしで使える設計。
Q2: 全層に同じバジェットを使うSnapKVとどちらがいいですか? A: メモリ予算が同じなら精度でPyramidKVが優位。プロトタイプはSnapKVで始め、精度が重要なアプリケーションでPyramidKVへ移行するアプローチが現実的。
Q3: PyramidKVはMoEモデルにも適用できますか? A: 原理的には適用可能。ただしMoE(Mixture-of-Experts)は層の役割が動的に変わるため、固定のピラミッド分配が最適とは限らない。MoE特化のKVキャッシュ研究が2025年に複数発表されている。