AI・機械学習
上級

PagedAttention(ページドアテンション)

LLM推論時のKVキャッシュをOSの仮想メモリ管理と同様のページング方式で管理するアルゴリズム。非連続な物理メモリブロックにKVキャッシュを分散配置することで、メモリ断片化を解消しVRAM利用効率を最大4倍改善する。

0 回閲覧
0 いいね

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)のKV1リクエスト(128K tokens)のKV
Llama 3.1 8B328(GQA)128256MB8GB
Llama 3.1 70B808(GQA)128640MB20GB
Llama 3.1 405B1268(GQA)1281,008MB31.5GB

従来方式の問題

  • 内部断片化: max_seq_len分のメモリを事前確保するが、実際の生成長は予測不可能。平均的に50%以上が無駄になる
  • 外部断片化: 異なる長さのリクエストが完了・新規挿入を繰り返すと、連続した空きメモリが確保できなくなる
  • メモリ予約の非効率: 最大長2,048トークンで予約しても実際には200トークンで完了するケースが多い

PagedAttentionのアーキテクチャ

ブロックテーブル方式

  1. GPU VRAMを固定サイズのブロック(通常16トークン分)に分割
  2. 各リクエストにブロックテーブル(論理ブロック→物理ブロックのマッピング)を割り当て
  3. トークン生成に伴いKVキャッシュが成長すると、新しい物理ブロックをオンデマンドで割り当て
  4. リクエスト完了時にブロックを即座に解放し、他のリクエストに再利用

メモリ効率の改善

  • 内部断片化: 最終ブロックのみ(最大15トークン分)に限定。従来の数千トークン分→15トークン分に削減
  • 外部断片化: 非連続ブロック割り当てにより完全に解消
  • メモリ利用率: 従来方式の20〜40% → PagedAttentionで95%以上
メトリクス従来方式PagedAttention改善
メモリ利用率20〜40%95%+2〜4×
最大バッチサイズ (H100 80GB, 70B INT4)8〜1632〜642〜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により、共有プレフィックスのメモリコストを大幅削減