投機的デコーディング(Speculative Decoding)は、大規模モデルの文章生成を高速化する手法です。まず、はるかに小さいドラフトモデルが次の数トークンを先回りして推測し、次に大規模モデルがその推測を1回の並列処理でまとめて検証します。正しいものは採用し、最初に間違えた位置で修正します。変えるのは生成の順序と計算の割り当て方であり、大規模モデルそのものではありません。そのため標準的な実装では、最終的な出力の分布は大規模モデルが1トークンずつ生成した場合と一致し、品質を落とさずに速くなります。
1トークンずつの生成が遅い理由
大規模モデルは1トークンごとにモデル全体を1回実行します。問題は、1トークンの生成で時間を食うのが計算そのものではなく、膨大なパラメータをメモリから読み出す作業だという点です。つまりハードウェアは多くの時間、データ待ちで遊んでいます。パラメータを1回読み出すたびに1トークンしか得られないことが、無駄の正体です。
推測する側と検証する側の役割
流れは2段階です。まずドラフトモデル(対象モデルの数十分の一程度の大きさが多い)が一気に4〜8個程度の候補トークンを書き出します。次に大規模モデルが文脈と候補をまとめて並列計算し、各位置で自身の確率分布と照合します。推測が当たればすべて採用し、最初に外れた位置では大規模モデル自身の分布から引き直して、それ以降の候補は破棄し、そこから次のラウンドを始めます。検証が1回の並列処理で終わるため、パラメータの読み出し1回で複数トークンを確認できます。
実際の高速化はドラフトモデルの的中率次第です。コード補完や定型的な返信、文脈に沿った続きなど予測しやすい文章では採択率が高く、2〜3倍程度の高速化も珍しくありません。逆に予測不能な文章では外れが増え、効果は小さくなります。
量子化や蒸留とは別物
混同されがちな2つの手法と区別しておきます。量子化はパラメータを低い精度で保存する方法で、モデルは小さくなりますが出力品質はわずかに変わります。蒸留は小さいモデルに大きいモデルの出力を学ばせる方法で、デプロイされるのは生徒モデル自体であり、能力の上限も下がります。投機的デコーディングでは小さいモデルは下書き専用で、最終決定は常に大規模モデルが行うため、無損失の高速化になります。代償として、2つのモデルを同時に抱える分のメモリと、両者を整合させる運用コストがかかります。
効果が出ない場面
ドラフトモデルと対象モデルの「作風」が違いすぎると採択率がほぼゼロになり、高速化は望めません。そのため実務では同じシリーズの小型版や、専用に訓練したドラフトヘッドが使われます。また、多数のユーザーが同時にアクセスしてGPUの計算能力自体が飽和している状況では、ボトルネックはメモリ読み出しではなくなるため効果は薄れます。恩恵が大きいのは単独利用や低同時接続の対話シーンです。さらに、最初の1トークンが出るまでの待ち時間は短縮されません。速くなるのはその後です。
ローカルデプロイツールで見かけるドラフトモデルや投機的サンプリングのオプション、vLLMなどの推論フレームワークが備える同種のスイッチは、いずれもこの「推測して検証する」仕組みです。調整時に覚えておくべきは1つだけです。ドラフトモデルは本モデルと同系統の小型版を選び、推測の長さを欲張らず、歩幅より採択率を優先してください。