PagedAttention(ページドアテンション)
LLM推論時のKVキャッシュをOSの仮想メモリ管理と同様のページング方式で管理するアルゴリズム。非連続な物理メモリブロックにKVキャッシュを分散配置することで、メモリ断片化を解消しVRAM利用効率を最大4倍改善する。
PagedAttentionとは
PagedAttentionは、UC BerkeleyのKwon氏らが2023年にvLLMとともに発表したKVキャッシュ管理アルゴリズムである。LLM推論時にリクエストごとに確保されるKVキャッシュ(Key-Valueキャッシュ)を、OSの仮想メモリにおけるページング機構と同様の方式で管理する。従来の連続メモリ確保方式では避けられなかった内部断片化・外部断片化を解消し、同一GPUメモリ上でのバッチサイズを2〜4倍に拡大可能にした。
KVキャッシュとメモリ問題
Transformerベースの自己回帰型LLMでは、過去のトークンのKey/Value行列を保持(KVキャッシュ)し、新トークン生成時に再計算を避ける。このKVキャッシュは推論中に動的に成長し、モデルサイズとシーケンス長に比例してメモリを消費する。
KVキャッシュサイズの計算式
KVキャッシュ = 2 × num_layers × num_kv_heads × head_dim × seq_len × dtype_size
| モデル | レイヤー数 | KVヘッド数 | ヘッド次元 | 1リクエスト(4K tokens)のKV | 1リクエスト(128K tokens)のKV |
|---|---|---|---|---|---|
| Llama 3.1 8B | 32 | 8(GQA) | 128 | 256MB | 8GB |
| Llama 3.1 70B | 80 | 8(GQA) | 128 | 640MB | 20GB |
| Llama 3.1 405B | 126 | 8(GQA) | 128 | 1,008MB | 31.5GB |
従来方式の問題
- 内部断片化: max_seq_len分のメモリを事前確保するが、実際の生成長は予測不可能。平均的に50%以上が無駄になる
- 外部断片化: 異なる長さのリクエストが完了・新規挿入を繰り返すと、連続した空きメモリが確保できなくなる
- メモリ予約の非効率: 最大長2,048トークンで予約しても実際には200トークンで完了するケースが多い
PagedAttentionのアーキテクチャ
ブロックテーブル方式
- GPU VRAMを固定サイズのブロック(通常16トークン分)に分割
- 各リクエストにブロックテーブル(論理ブロック→物理ブロックのマッピング)を割り当て
- トークン生成に伴いKVキャッシュが成長すると、新しい物理ブロックをオンデマンドで割り当て
- リクエスト完了時にブロックを即座に解放し、他のリクエストに再利用
メモリ効率の改善
- 内部断片化: 最終ブロックのみ(最大15トークン分)に限定。従来の数千トークン分→15トークン分に削減
- 外部断片化: 非連続ブロック割り当てにより完全に解消
- メモリ利用率: 従来方式の20〜40% → PagedAttentionで95%以上
| メトリクス | 従来方式 | PagedAttention | 改善 |
|---|---|---|---|
| メモリ利用率 | 20〜40% | 95%+ | 2〜4× |
| 最大バッチサイズ (H100 80GB, 70B INT4) | 8〜16 | 32〜64 | 2〜4× |
| メモリ断片化 | 内部+外部 | 最終ブロックのみ | ~0% |
| 動的メモリ管理 | 不可 | 可能 | - |
Copy-on-Write(CoW)と Prefix Caching
Copy-on-Write
Beam SearchやParallel Samplingで複数のシーケンスが同じプレフィックスを共有する場合、物理ブロックをコピーせず参照カウンタで管理する。分岐時に初めてブロックをコピーすることで、メモリ使用量を大幅に削減。
Prefix Caching
同一のシステムプロンプト(例: 「あなたは親切なアシスタントです...」)を持つ複数のリクエストが、プレフィックス部分のKVキャッシュブロックを物理的に共有する。vLLM 0.5以降で--enable-prefix-cachingとして実装。
効果: 2,000トークンのシステムプロンプトを100リクエストで共有する場合、KVキャッシュが100×2,000トークン分→1×2,000トークン分に削減(99%節約)。
vLLMでの実装と設定
基本設定
vLLMのデフォルトでPagedAttentionが有効。主要パラメータ:
--block-size: ブロックサイズ(デフォルト16トークン)。大きいと内部断片化増加、小さいとブロックテーブル管理オーバーヘッド増加--gpu-memory-utilization: VRAMのうちKVキャッシュに使う割合(デフォルト0.9 = 90%)--max-num-seqs: 同時バッチ数上限(デフォルト256)--enable-prefix-caching: Prefix Caching有効化
Swap機能
GPU VRAMが逼迫した際、低優先度リクエストのKVキャッシュをCPUメモリにスワップアウトし、高優先度リクエストにGPUメモリを譲る。リクエスト再開時にスワップインして処理を継続。--swap-spaceパラメータで制御(デフォルト4GB)。
他の実装・後続研究
- SGLang RadixAttention: PagedAttentionを拡張し、KVキャッシュをRadix Tree(基数木)で管理。プレフィックス共有の検索をO(1)に高速化
- FlashInfer: PagedAttentionカーネルの高速実装。vLLM 0.6以降で
--enable-flashinferで利用可能 - TokenAttention: InternLMのLMDeployが実装。トークン単位(ブロック単位ではなく)でKVキャッシュを管理
よくある質問(FAQ)
Q1: PagedAttentionはモデルの精度に影響しますか? A: 影響しない。PagedAttentionはKVキャッシュの「保存場所」を変えるだけで、計算内容は標準アテンションと完全に同一。非連続メモリから正しい順序でKVを読み出すカスタムCUDAカーネルが等価性を保証する。
Q2: llama.cppやOllamaでもPagedAttentionは使えますか? A: llama.cppは独自のKVキャッシュ管理を実装しており、PagedAttention相当の動的メモリ管理は部分的にサポート。Ollamaは内部でllama.cppを使用するため同様。ただしvLLMほど洗練されたブロック管理ではない。
Q3: PagedAttentionとFlashAttentionは併用できますか? A: 併用可能で、実際にvLLMではデフォルトで両方が有効。FlashAttentionがアテンション計算自体を高速化し、PagedAttentionがKVキャッシュのメモリ管理を効率化する。異なるレイヤーの最適化であり、相乗効果がある。
まとめ
- PagedAttentionはOSの仮想メモリ管理を模倣したKVキャッシュ管理アルゴリズム
- メモリ断片化を解消し、VRAM利用率を20〜40%→95%以上に改善
- 同一GPU上でのバッチサイズを2〜4倍に拡大可能
- vLLMの中核技術として2026年のLLM推論インフラの事実上の標準
- Copy-on-WriteとPrefix Cachingにより、共有プレフィックスのメモリコストを大幅削減