Speculative Decoding 調査

小さなドラフトモデルで先読みして生成を速める手法が、VRAM 4GB の本PCで成立するかを検討する
📅 作成: 2026-08-25 / 更新: 2026-08-25

目次

  1. 調査のきっかけと結論
  2. 仕組み — なぜ速くなるのか
  3. llama.cpp での使い方
  4. このPCで成立するか — VRAM の見積り
  5. 検証計画

この文書の位置づけ

ローカルLLM 実行計画の実測(第10章)で、Qwen3-4B は 56.5 tok/s に到達した。 これはGPUのメモリ帯域が決める上限に近い。帯域を増やさずに、さらに速くする手段はあるか—— その問いに対する候補が Speculative Decoding である。本書はその成立可能性を検討する。実行はまだしていない。

調査のきっかけと結論

きっかけ

npaka 氏の記事「Qwen3.8-27Bにおすすめの推論エンジン」(2026-08-23)で、 Speculative Decoding による高速化が目玉として紹介されていた。

手法環境効果
mlx-dsparkM4 Pro / 8bit8.3 → 20.3 tok/s(2.45倍
DFlash 2H200 / SGLangGSM8K 3.43倍、MATH-500 3.34倍

ただし記事が扱っていた実装はいずれも本PCでは使えない。 mlx-dspark は Apple Silicon 専用、DFlash 2 は SGLang(NVIDIA の大容量GPU向け)専用である。 記事の想定環境も最小で VRAM 24GB と、本PCの6倍以上を前提にしている。

一方で、Speculative Decoding という手法自体は llama.cpp にも実装がある。 そこだけを取り出して本PCに適用できないかを調べたのが本書である。

結論(現時点の見立て)

論点見立て
VRAMに収まるかぎりぎりQwen3-4B + 0.6B ドラフトで約 2.8 GB。空き 3.21 GB に対して余裕は 0.4 GB 程度
速くなるか疑わしい本PCは既に帯域を使い切っており、この手法が最も効く条件から外れている
やる価値あるドラフトモデルの取得は数百MBで済み、失敗しても損失が小さい
期待値は高くない。 記事の 2.45 倍・3.43 倍という数字は、大きなモデルを潤沢なメモリで動かす環境のものである。 本PCの条件はほぼ正反対で、同じ倍率は望めない。効果ゼロか、むしろ遅くなる可能性も相応にある。 それでも試す理由は、コストが小さく、外れた場合も「なぜ効かないか」が第10章の帯域律速の裏付けになるため。

仕組み — なぜ速くなるのか

通常の生成が遅い理由

LLM は1トークンを作るたびにモデル全体の重みをメモリから読み出す。 Qwen3-4B なら 2.32 GiB を毎回読む。計算そのものは軽く、待ち時間の大半はメモリ転送である。 これが「生成速度はメモリ帯域で決まる」と言われる理由で、実測の 56 tok/s もこの上限に近い。

先読みと検証に分ける

通常の生成 — 1トークンごとに本命モデル(4B)を1回読む 4B 読込 4B 読込 4B 読込 4B 読込 → 4トークン分の時間 Speculative Decoding — 小さなモデル(0.6B)が先読みし、本命が1回でまとめて検証する 0.6B ×4 先読み(軽い) 4B 読込 ×1 4トークンまとめて検証 合った分だけ 採用 → 当たれば4トークンが1回分の時間で出る 要点: 重みの読み出し回数を減らすのであって、計算を速くするのではない → 帯域に余裕がある環境ほど効く。使い切っている環境では効きにくい

3つのステップ

  1. 先読み — 小さなドラフトモデルが次の数トークンを一気に推測する。軽いので速い
  2. 検証 — 本命モデルが、その推測列を1回の読み出しでまとめて検証する
  3. 採用 — 先頭から合っている分だけ採用し、外れた時点で本命の答えに差し替える

出力は通常の生成と完全に一致する。品質を落として速くする手法ではなく、 「本命モデルが出すはずの答え」を先回りして当てにいく仕組みである。外れても正しさは損なわれず、単に速くならないだけ。

効くかどうかは「帯域が余っているか」で決まる。 本命モデルを1回読む間に複数トークンを確定できるのが利点なので、 1回の読み出しが遅い環境(=大きなモデル・広い帯域)ほど得をする。 逆に本PCのように小さなモデルで帯域を使い切っていると、削れる余地自体が小さい。

llama.cpp での使い方

主なオプション

オプション意味
-md / --model-draftドラフトモデルの GGUF を指定する
-ngld / --n-gpu-layers-draftドラフトモデルをGPUに載せる層数。ここを削ると本命に回せる
--draft-max一度に先読みするトークン数の上限。大きいほど当たった時の利得が大きく、外れた時の無駄も大きい
--draft-min先読みの下限
--draft-p-minドラフトの確信度がこの値を下回ったら先読みを打ち切る

起動例

llama-server.exe ^
  -m  "C:\AI_Models\qwen\Qwen3-4B-Instruct-2507-GGUF\Qwen3-4B-Instruct-2507-Q4_K_M.gguf" ^
  -md "C:\AI_Models\qwen\Qwen3-0.6B-GGUF\Qwen3-0.6B-Q4_K_M.gguf" ^
  -ngl 99 ^
  -ngld 99 ^
  --draft-max 4 ^
  -c 4096 ^
  --host 127.0.0.1 --port 8080

成立の前提条件

条件内容本PCでの充足
語彙の一致ドラフトと本命のトークナイザが互換である必要がある。異なる系列のモデルは組み合わせられない満たせるQwen3 系で揃える
両方をメモリに載せるドラフトと本命の両方が同時に必要。KVキャッシュも2つ分要るぎりぎり第4章で見積る
ドラフトが十分速い先読みが遅いと、検証を減らした利得を食い潰す満たせる0.6B は 4B の4倍近く軽い
受理率が高いドラフトの推測が当たらないと、単に無駄な計算が増える未知実測でしか分からない
語彙の一致は妥協できない。 Qwen3-4B に gemma の小型モデルを組み合わせる、といったことはできない。 ドラフトは同じ系列の小さい版から選ぶ。手持ちに 0.6B 級が無いため、取得が前提になる。

このPCで成立するか — VRAM の見積り

使える VRAM

計画書 第10章の実測どおり、本PCの VRAM は 4095 MiB のうち 808 MiB が画面表示等で先に使われており、空きは 3287 MiB(3.21 GiB)。 ここに2つのモデルを同居させることになる。

配分の試算

← 横幅全体が空き VRAM 3287 MiB → 本命 Qwen3-4B 2376 MiB 実測で確認済みの値 ドラフト 約 410 MiB KV×2 約 300 合計 約 3086 MiB / 空き 3287 MiB に対して 残り約 200 MiB この余裕では、コンテキストを伸ばすと超過する。-c 4096 程度に抑える前提になる ※ ドラフトのサイズと KV は推定値。実測で置き換える
項目見積り根拠
本命 Qwen3-4B Q4_K_M2376 MiB計画書 第10章の実測値(2.32 GiB)
ドラフト 0.6B Q4_K_M約 410 MiB推定。パラメータ数からの概算
KVキャッシュ ×2約 300 MiB推定。-c 4096 相当を2モデル分
合計約 3086 MiB空き 3287 MiB に対して余裕 約 200 MiB

収まるが、余裕はない

計算上は収まる。ただし残り 200 MiB は誤差で消える水準である。 計画書 第10章で確認したとおり、VRAM を超えてもエラーにはならず 共有メモリに逃げて数十倍遅くなるため、超過に気づきにくい点にも注意が要る。

逃げ道

効果副作用
-ngld を下げるドラフトの一部をCPUに置き、VRAMを空ける先読みが遅くなり、利得が減る
KV量子化--cache-type-k q8_0 でKVを半分にほぼ無し。計画書でも採用済み
より小さいドラフト0.6B より小さい版があれば受理率が下がる恐れ
画面表示を内蔵GPUへ808 MiB のうち数百MBを取り戻せる設定変更が要る
本PCの条件は、この手法が最も効く条件と逆を向いている。 Speculative Decoding は「本命モデルの読み出しが重い」ほど得をする。 本PCの本命は 2.32 GiB と軽く、既に 56 tok/s まで出ている。 削れる余地が小さいうえ、ドラフトの実行時間が新たに乗る。差し引きでマイナスになる可能性がある

検証計画

事前に必要なもの

項目内容取得量
ドラフトモデルQwen3-0.6B の GGUF(Q4_K_M)。本命と同系列で語彙を揃える約 0.4 GB
対照データ計画書 第10章の Qwen3-4B 単体 56.49 tok/s取得済み

測る組み合わせ

No構成draft-max狙い
1Qwen3-4B 単体(対照)基準。56.49 tok/s と一致するか確認する
24B + 0.6B ドラフト2控えめな先読み。外れた時の損失が小さい
34B + 0.6B ドラフト4標準的な設定
44B + 0.6B ドラフト8強気の先読み。受理率が高ければ最も伸びる
54 に KV量子化を追加8VRAM を空けて余裕を作る

測定時に併せて確認すること

判断基準

結果次の一手
70 tok/s 以上採用する。計画書の常用構成を差し替え、起動スクリプトを更新する
56〜70 tok/s効果はあるが VRAM の余裕を失う。コンテキスト長とのトレードオフで判断する
56 tok/s 未満見送る。帯域律速という第10章の見立てが裏付けられたことを記録して終える

この調査で分かっていないこと

実行前に、まずオプションの存在確認から始める。 llama-server.exe --help--model-draft 系が実際に何という名前で用意されているかを確かめる。 ここが空振りなら、ドラフトモデルの取得は不要になる。

参考資料

調査のきっかけ

実装の確認先

第4章の見積りは推定値を含む。 ドラフトモデルのサイズ(約 410 MiB)と KV キャッシュ(約 300 MiB)は パラメータ数からの概算で、実測していない。本命モデルの 2376 MiB のみ計画書 第10章の実測値。