Paged Attention(ページドアテンション)
vLLMが提案したKVキャッシュのメモリ管理手法で、OSの仮想メモリページング方式を応用して固定サイズブロックでK/Vを管理し、メモリフラグメンテーションを解消する技術。
Paged Attentionとは
Paged Attention(ページドアテンション)は、UCバークレーのKwon et al.が2023年に発表したKVキャッシュのメモリ管理手法であり、LLM推論フレームワークvLLMの中核技術である。従来のLLM推論では各リクエストのKVキャッシュに最大シーケンス長分のメモリを連続領域として事前確保していたが、Paged AttentionはOSの仮想メモリ管理と同様に、固定サイズの「ブロック」単位でKVキャッシュを非連続的に割り当てる。
従来方式の問題点
メモリの無駄遣い
従来の推論フレームワーク(HuggingFace Transformers、FasterTransformer等)では:
- 事前確保: 各リクエストに最大シーケンス長(例: 4,096トークン)分のKVキャッシュメモリを一括確保
- 内部フラグメンテーション: 実際の生成が500トークンで終了しても、残り3,596トークン分のメモリは無駄に確保されたまま
- 外部フラグメンテーション: 異なるサイズのリクエストが終了・開始を繰り返すことで、使用可能だが小さすぎるメモリ断片が蓄積
- メモリ利用率: 実測で20〜40%程度。80%のメモリが無駄になるケースも
スループットの制約
メモリの非効率な使用は直接的にバッチサイズ(同時処理リクエスト数)を制限する:
| GPU | VRAMTotal | モデル | 従来方式バッチ | Paged Attention バッチ |
|---|---|---|---|---|
| A100 80GB | 80GB | Llama 2 13B | 8〜12 | 32〜48 |
| H100 80GB | 80GB | Llama 3 8B | 16〜24 | 64〜96 |
| A100 80GB | 80GB | Llama 2 70B | 1〜2 | 4〜8 |
| L40S 48GB | 48GB | Mistral 7B | 12〜16 | 48〜64 |
Paged Attentionの仕組み
ブロックベースのメモリ管理
Paged Attentionは以下の概念でKVキャッシュを管理する:
- Physical Block(物理ブロック): GPUメモリ上の固定サイズ領域(デフォルト16トークン分)。全ブロックが同一サイズ
- Logical Block(論理ブロック): 各リクエストが「見る」KVキャッシュの論理的な連続領域
- Block Table(ブロックテーブル): 論理ブロック→物理ブロックのマッピング。OSのページテーブルに相当
- Block Allocator(ブロックアロケータ): 空き物理ブロックの管理と割り当て。OSのメモリアロケータに相当
動作フロー
リクエスト到着
→ 論理ブロック0を物理ブロック#42にマッピング
→ プリフィル: ブロック#42にK/Vを格納
デコード開始(トークン生成)
→ ブロック#42が満杯(16トークン)
→ 新しい物理ブロック#107を割り当て
→ ブロックテーブル更新: 論理1 → 物理#107
リクエスト完了
→ 物理ブロック#42, #107を解放
→ 即座に他のリクエストで再利用可能
Copy-on-Write
Beam Searchやパラレルサンプリングでは、複数の生成候補が共通のプレフィックスを持つ。Paged Attentionは:
- 共通プレフィックスのブロックを参照カウントで共有
- 候補が分岐する時点で初めてブロックをコピー(Copy-on-Write)
- Beam Search width=4で最大75%のKVキャッシュメモリを削減
Paged Attention v2
vLLM 0.4で導入された改良版:
- 非同期ブロック割り当て: デコードと並行してブロック割り当てを実行
- マルチGPU対応: Tensor Parallelism時のブロックテーブル同期を最適化
- Prefetch: 次に必要になるブロックを先読みしてHBM→L2キャッシュに配置
- 性能: v1比で15〜20%のレイテンシ改善
Prefix Cachingとの統合
SGLangが導入したRadixAttentionの概念をvLLMも取り入れ、Paged AttentionとPrefix Cachingを統合:
- ハッシュベースの検索: プレフィックスのハッシュ値でキャッシュ済みブロックを特定
- LRUエビクション: 参照されなくなったプレフィックスブロックをLRUで管理
- 効果: システムプロンプトやFew-shotの共通部分を再利用し、プリフィル時間を最大90%削減
リクエスト1: [System Prompt] + [User Query 1]
→ System Prompt のKV: ブロック#1-5(新規計算)
→ User Query 1のKV: ブロック#20-22
リクエスト2: [System Prompt] + [User Query 2]
→ System Prompt のKV: ブロック#1-5(キャッシュヒット!再利用)
→ User Query 2のKV: ブロック#30-31
性能比較
HuggingFace TGI(従来方式)とvLLM(Paged Attention)の実測比較:
| 指標 | HF TGI | vLLM | 改善率 |
|---|---|---|---|
| メモリ利用率 | 20〜40% | 95%+ | 2.5〜5× |
| スループット(req/s) | 12 | 36 | 3× |
| P99レイテンシ | 850ms | 420ms | 2× |
| 同時バッチサイズ | 8 | 32 | 4× |
| TTFT(Llama 2 13B, 2K入力) | 180ms | 145ms | 1.2× |
測定条件: A100 80GB, Llama 2 13B, ShareGPT データセット, 出力平均256トークン
採用状況
2026年時点での主要推論フレームワークのPaged Attention対応:
- vLLM: オリジナル実装。デファクトスタンダード
- SGLang: RadixAttention(Paged Attention + Prefix Caching統合)
- TensorRT-LLM: NVIDIA独自実装のPaged KV Cache
- llama.cpp: KVキャッシュのスロットベース管理(概念的に類似)
- Ollama: llama.cpp経由で間接的にサポート
- HuggingFace TGI: vLLMバックエンド経由でサポート
よくある質問(FAQ)
Q1: Paged Attentionのブロックサイズはどう選べばよいですか? A: vLLMのデフォルトは16トークン/ブロックで、ほとんどのユースケースに最適。ブロックサイズを大きくすると管理オーバーヘッドは減るが内部フラグメンテーションが増え、小さくすると逆になる。128Kコンテキストの長文処理では32〜64トークン/ブロックが効率的な場合がある。
Q2: Paged Attentionは推論品質に影響しますか? A: 数学的にはフルKVキャッシュと完全に等価な結果を返すため、品質への影響はゼロ。メモリの物理配置が変わるだけで、計算結果は同一である。FlashAttentionとの組み合わせでも等価性は保たれる。
Q3: FlashAttentionとPaged Attentionの違いは何ですか? A: FlashAttentionはAttention計算自体をGPU SRAMタイリングで高速化する技術で、HBM→SRAM間のデータ転送を最小化する。Paged AttentionはKVキャッシュのメモリ割り当て・管理の効率化技術。両者は直交する最適化であり、vLLMでは両方を組み合わせて使用する。FlashAttention v2.5以降はPaged Attentionのブロック配列に対応したカーネルを提供している。
まとめ
- Paged AttentionはOS仮想メモリの概念をKVキャッシュ管理に応用
- メモリ利用率を20〜40%から95%以上に向上し、スループット2〜4倍改善
- Copy-on-WriteでBeam Search時のメモリ共有を効率化
- Prefix Cachingとの統合で共通プレフィックスの再利用が可能
- vLLM、SGLang、TensorRT-LLMなど主要フレームワークが採用するデファクトスタンダード