AI・機械学習
上級

Speculative Decoding(投機的デコーディング)(スペキュラティブデコーディング)

小型のドラフトモデルが候補トークン列を先行生成し、大型の検証モデルが一括で承認・却下することでLLM推論を高速化する手法。数学的に元のモデルと同一の出力分布を保証しながら、2〜3倍の速度向上を実現する。2024〜2026年に主要フレームワークで標準サポートされた。

0 回閲覧
0 いいね

Speculative Decoding(投機的デコーディング)とは

Speculative Decoding は、2022年に Google Research の Leviathan らと DeepMind の Chen らが独立に提案したLLM推論高速化技術です。CPU の投機的実行(speculative execution)にヒントを得ており、小型で高速なドラフトモデルが γ トークン(通常 γ=4〜8)を先行生成し、大型の検証モデルが1回のフォワードパスでまとめて検証します。却下されたトークン以降は検証モデルの分布から再サンプリングするため、最終出力は検証モデル単体と数学的に同一の分布になります。

動作原理

アルゴリズムの流れ

  1. ドラフト段階: 小型モデル M_q が γ 個の候補トークン x_1, x_2, ..., x_γ を自己回帰的に生成
  2. 検証段階: 大型モデル M_p が γ+1 個のトークン位置に対する確率分布を1回のフォワードパスで並列計算
  3. 承認判定: 各位置 i について、M_q(x_i) と M_p(x_i) を比較:
    • M_p(x_i) ≥ M_q(x_i) の場合: 確率1で承認
    • M_p(x_i) < M_q(x_i) の場合: 確率 M_p(x_i)/M_q(x_i) で承認
  4. 修正サンプリング: 最初に却下された位置で M_p の分布から再サンプリング
  5. 承認されたトークン + 修正トークンを出力に追加し、次のイテレーションへ

速度向上の理論

平均承認率を α とすると、1イテレーションあたりの平均生成トークン数は (1-α^(γ+1))/(1-α) です。ドラフトモデルのコストが検証モデルの 1/10 以下であれば、全体のスループットが 2〜3 倍向上します。

主要な実装と製品

フレームワーク/製品バージョン方式速度向上
vLLM0.6+Draft Model 方式1.8〜2.5x
TensorRT-LLM0.9+Draft + Medusa 両対応2.0〜3.0x
Hugging FaceTransformers 4.40+assistant_model パラメータ1.5〜2.5x
llama.cppb3000+--draft オプション1.5〜2.0x
Apple MLX0.12+draft_model パラメータ1.8〜2.2x
Google Gemini内部非公開推定 2〜3x

バリエーション

Medusa(2024年〜)

本体モデルに複数の追加ヘッド(Medusa heads)を取り付け、各ヘッドが異なる将来位置のトークンを予測します。追加パラメータ数は本体の 2〜5% で、別途ドラフトモデルを用意する必要がありません。

  • Medusa-1: 本体の重みを凍結し、追加ヘッドのみをファインチューニング
  • Medusa-2: 本体と追加ヘッドを同時にファインチューニングし、承認率を向上

Self-Speculative Decoding

モデル自身の浅い層(例: 32層中の最初の8層)をドラフトモデルとして使用します。追加のモデルやヘッドが不要で、メモリ効率に優れています。LayerSkip(Meta、2024年)がこの手法の代表です。

EAGLE(2024年〜)

Auto-regression ヘッドの代わりに、前のトークンの hidden state を特徴量として次トークンを予測するフレームワークです。Medusa より高い承認率(10〜20%向上)を報告しています。

Lookahead Decoding

ヤコビ反復法を応用し、複数の将来位置を並列に予測します。ドラフトモデル不要で、n-gram プールを活用して承認率を向上させます。

実装例

vLLM での Speculative Decoding

from vllm import LLM, SamplingParams

llm = LLM(
    model="meta-llama/Llama-3.1-70B-Instruct",
    speculative_model="meta-llama/Llama-3.1-8B-Instruct",
    num_speculative_tokens=5,
    use_v2_block_manager=True,
)
params = SamplingParams(temperature=0.7, top_p=0.9, max_tokens=512)
outputs = llm.generate(["Explain quantum computing"], params)

Hugging Face Transformers

from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.1-70B-Instruct")
assistant = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.1-8B-Instruct")

outputs = model.generate(
    **inputs,
    assistant_model=assistant,
    max_new_tokens=512,
    do_sample=True,
    temperature=0.7,
)

よくある質問(FAQ)

Q1: Speculative Decoding で生成品質は変わりますか? A: 変わりません。承認・却下の確率計算により、最終出力の分布は検証モデル単体と数学的に同一です。これは Speculative Decoding の理論的保証であり、速度だけが向上します。

Q2: ドラフトモデルはどう選べばよいですか? A: 検証モデルと同じファミリーの小型バージョンが最適です(例: Llama 3.1 70B に対して Llama 3.1 8B)。異なるアーキテクチャの組み合わせ(例: GPT系 + Llama)は承認率が低下するため推奨しません。語彙サイズの一致も重要です。

Q3: Speculative Decoding と Continuous Batching は併用できますか? A: vLLM 0.8+ では併用可能です。ただし、バッチ内のリクエストごとにドラフトトークン数が異なるため、パディング処理が必要になり、バッチ効率がやや低下する場合があります。TensorRT-LLM も同様にサポートしています。

Q4: GPU メモリはどれくらい追加で必要ですか? A: ドラフトモデルのパラメータ分が追加で必要です。例えば 70B 検証モデル(FP16 で約 140GB)に 8B ドラフトモデル(約 16GB)を追加すると、合計約 156GB になります。Medusa 方式なら追加は 2〜5%(約 3〜7GB)で済みます。

まとめ

  • Speculative Decoding は品質を維持しながら2〜3倍の速度向上を実現する推論高速化技術
  • 2024〜2026年に vLLM、TensorRT-LLM、Hugging Face など主要フレームワークで標準サポート
  • Medusa、EAGLE、Self-Speculative など追加モデル不要のバリエーションも急速に発展
  • 検証モデルと同ファミリーの小型モデルをドラフトに使うのが最も効果的