AI・機械学習
上級

投機的デコーディング(トウキテキデコーディング)

大規模言語モデル(LLM)の推論を高速化する手法。小型の「ドラフトモデル」で複数トークンを先行生成し、大型の「ターゲットモデル」で一括検証することで、出力品質を維持したまま推論速度を2〜3倍に向上させる。2023年にGoogleとDeepMindが独立に提案し、2025年以降の主要推論フレームワークに標準搭載されている。

0 回閲覧
0 いいね

投機的デコーディングとは

投機的デコーディング(Speculative Decoding)は、大規模言語モデル(LLM)の推論速度を劇的に改善する並列化手法である。従来のLLM推論は自己回帰(autoregressive)方式で、1トークンずつ逐次的に生成するためGPUの演算能力を十分に活用できなかった。投機的デコーディングは、小型の高速モデル(ドラフトモデル)に複数トークンを先行生成させ、大型のモデル(ターゲットモデル)で一括検証する「推測→検証」パイプラインにより、出力の確率分布を変えることなく2〜3倍の高速化を実現する。

2023年にGoogle Research(Leviathan et al., "Fast Inference from Transformers via Speculative Decoding")とDeepMind(Chen et al., "Accelerating Large Language Model Decoding with Speculative Sampling")が独立に同等の手法を発表し、2024年以降はvLLM、TensorRT-LLM、llama.cpp、Hugging Face TGIなどの主要推論フレームワークに実装が進んでいる。

従来の自己回帰デコーディングの課題

項目自己回帰デコーディング投機的デコーディング
1ステップの処理1トークン生成K個のドラフト生成 + 一括検証
GPU利用効率低い(メモリバウンド)高い(バッチ検証で演算バウンド化)
レイテンシトークン数に比例トークン数 / 受理率に比例
出力品質ベースライン完全一致(確率分布を保存)
実装複雑度低い中〜高
メモリ使用量モデル1つ分モデル2つ分(ドラフト+ターゲット)

自己回帰デコーディングの根本的な問題は、LLMの推論がメモリバウンド(memory-bound)であることにある。70Bパラメータのモデルでは1トークン生成に約140GBのパラメータをGPUメモリから読み出す必要があるが、実際の演算量は少ない。GPU(例: NVIDIA H100)のメモリ帯域幅は3.35TB/sだが、FP16演算性能は989TFLOPSであり、1トークン生成では演算ユニットの1%未満しか使用されない。投機的デコーディングは、1回のフォワードパスで複数トークンを検証することで、この演算余力を活用する。

動作原理

基本アルゴリズム

  1. ドラフト生成フェーズ: 小型モデル(例: 1B〜7Bパラメータ)がK個のトークン(通常K=4〜8)を自己回帰的に生成。各トークンの確率分布 q(x) を記録
  2. 検証フェーズ: ターゲットモデル(例: 70B〜405Bパラメータ)がドラフトトークン列を入力として1回のフォワードパスを実行。各位置での確率分布 p(x) を計算
  3. 受理/却下判定: 各ドラフトトークンについて、受理確率 min(1, p(x)/q(x)) で確率的に受理。却下された位置以降はターゲットモデルの分布から再サンプリング
  4. 出力確定: 受理されたトークン列 + 再サンプリングされた1トークンを最終出力として確定

受理率(Acceptance Rate)

受理率はドラフトモデルとターゲットモデルの確率分布の類似度に依存する。典型的な受理率は以下の通り。

  • 同一アーキテクチャの蒸留モデル: 70〜90%(例: Llama 3.1 8B → Llama 3.1 70B)
  • 異なるアーキテクチャ: 50〜70%(例: GPT-2 → GPT-4)
  • ドメイン特化のファインチューン済みモデル: 80〜95%(コード生成など予測しやすいタスク)
  • 創造的な文章生成: 40〜60%(次トークンの不確実性が高い)

受理率が高いほど高速化率も高くなる。K=5でα=0.8(受理率80%)の場合、期待される1ステップあたりの生成トークン数は約4.0で、従来比4倍の速度に相当する。

主要な実装と性能比較

フレームワーク対応バージョンドラフトモデル方式最大高速化率備考
vLLMv0.4.0+外部ドラフトモデル / ngram2.5〜3.2xPagedAttention統合
TensorRT-LLMv0.9.0+外部ドラフトモデル / Medusa2.0〜3.5xNVIDIA GPU最適化
llama.cppb2500+外部ドラフトモデル1.8〜2.5xCPU/Metal/CUDA対応
Hugging Face TGIv2.0+外部ドラフトモデル2.0〜2.8xAPI互換
SGLangv0.2.0+Eagle / Medusa2.5〜3.8xRadixAttention統合
DeepSpeed-FastGenv0.13+外部ドラフトモデル2.0〜2.5xDeepSpeed統合

vLLMでの設定例

vLLMで投機的デコーディングを有効化するには、起動時にドラフトモデルを指定する。

python -m vllm.entrypoints.openai.api_server \
  --model meta-llama/Llama-3.1-70B-Instruct \
  --speculative-model meta-llama/Llama-3.1-8B-Instruct \
  --num-speculative-tokens 5 \
  --gpu-memory-utilization 0.9

ドラフトモデルなしのngram方式も利用可能で、追加メモリ不要だが高速化率は1.5〜2.0xに留まる。

ドラフトモデルの選び方

ドラフトモデルの要件

  1. 高速性: ターゲットモデルの1/10以下の推論時間
  2. 分布の近さ: ターゲットモデルと類似した確率分布を出力
  3. 語彙の一致: ターゲットモデルと同一のtokenizer/vocabを使用
  4. メモリ効率: ターゲットモデルのGPUメモリを圧迫しない

推奨ペアリング

ターゲットモデルドラフトモデル受理率目安高速化率
Llama 3.1 405BLlama 3.1 8B75〜85%2.5〜3.0x
Llama 3.1 70BLlama 3.1 8B80〜90%2.0〜2.8x
Qwen2.5 72BQwen2.5 0.5B70〜80%2.5〜3.5x
Gemma 2 27BGemma 2 2B75〜85%2.0〜2.5x
Mixtral 8x22BMixtral 8x7B65〜75%1.8〜2.3x

よくある質問(FAQ)

Q1: 投機的デコーディングで出力品質は低下しますか? A: いいえ。数学的にターゲットモデル単体と完全に同一の確率分布からサンプリングすることが証明されている。受理/却下の確率的判定により、ドラフトモデルの分布の偏りはキャンセルされる。temperature=0(greedy decoding)でも温度付きサンプリングでも、出力はビット単位で一致する。

Q2: どのようなタスクで効果が高いですか? A: コード生成、定型文書生成、翻訳など、次トークンの予測精度が高いタスクで最も効果的(受理率80%以上、3倍高速化)。創造的な小説執筆や自由連想的な応答では効果が限定的(受理率50%前後、1.5倍程度)。

Q3: GPUメモリが足りない場合はどうしますか? A: 3つの選択肢がある。(1) ngram方式を使用(ドラフトモデル不要、コンテキスト内のn-gramパターンを再利用)、(2) ドラフトモデルをCPUに配置(速度は落ちるが動作する)、(3) Medusa/Eagleなどのself-draft方式を使用(ターゲットモデルに追加ヘッドを装着するため追加メモリは数百MB)。

Q4: バッチ推論でも効果はありますか? A: バッチサイズが大きい場合(>32)は効果が薄れる。バッチ推論では既にGPU演算ユニットが活用されているため、投機的デコーディングの追加演算がボトルネックになりうる。バッチサイズ1〜8の対話型推論で最も効果的。

まとめ

  • 投機的デコーディングは小型ドラフトモデルで先行生成→大型ターゲットモデルで一括検証する推論高速化手法
  • 出力品質を完全に維持したまま2〜3倍の速度向上を実現
  • 2023年にGoogle/DeepMindが発表、2025年以降は主要フレームワーク(vLLM, TensorRT-LLM, llama.cpp等)に標準搭載
  • 受理率はドラフト/ターゲットモデルの分布類似度に依存し、同一ファミリーの蒸留ペアで最高性能
  • コード生成や定型文書など予測しやすいタスクで効果が最大化される