Speculative Decoding 調査

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

目次

  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 ドラフトで 3925 MiB(4096 MiB 中)。KV を q8_0 にすると 3515 MiB
速くなるか遅くなる単体の 57 tok/s に対し、どの構成も 29〜47 tok/s
判断見送る第5章の判断基準の「56 tok/s 未満」に当たる

記事の 2.45 倍・3.43 倍という数字は、大きなモデルを潤沢なメモリで動かす環境のものである。 本PCの本命は 2.32 GiB と軽く、ドラフトの実行時間を取り返せなかった(第5章の結果)。

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

通常の生成が遅い理由

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 を指定する
--spec-type draft-simpleドラフトモデルで先読みする。b10612 では既定が none で、-md だけではドラフトを読み込んでも使わない
-ngld / --n-gpu-layers-draftドラフトモデルをGPUに載せる層数。ここを削ると本命に回せる
--spec-draft-n-max一度に先読みするトークン数の上限(既定 3)。大きいほど当たった時の利得が大きく、外れた時の無駄も大きい。b10612 では --draft-max は廃止された
--spec-draft-n-min先読みの下限。--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 ^
  --spec-type draft-simple ^
  --spec-draft-n-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章の見立てが裏付けられたことを記録して終える

結果 見送る

RAM 32GB・画面表示は内蔵GPU の構成で測った(2026-09-30)。ドラフトは unsloth/Qwen3-0.6B-GGUF の Q4_K_M(396,705,472 B)。 -c 4096 -np 1 -ngl 99 -ngld 99 --spec-type draft-simple で立て、2 つの問を温度 0・seed 1 で 256 トークンずつ出させた。 1 回目で温め、2 回目を記録した。測ったのは tools\50_run\bench-spec.cmd。

No構成文章 tok/s受理率コード tok/s受理率VRAM
1Qwen3-4B 単体(対照)57.15—57.00—3129 MiB
2+ドラフト n-max 242.3452%47.2967%3925 MiB
3+ドラフト n-max 436.3139%43.5552%3925 MiB
4+ドラフト n-max 829.3220%44.9938%3925 MiB
54 +KV q8_033.7523%47.2738%3515 MiB

受理率は、ドラフトが出したトークンのうち本命が採った割合(timings.draft_n_accepted ÷ draft_n)。

出力が単体と一致しない理由

出力を保存して比べ、単体でも一度にまとめて計算する形を変えて同じことが起きるかを見た(bench-spec.cmd -Only の No6〜9)。

構成文章コード
単体を立て直して 2 回目一致一致
単体 2 本同時(np 2)一致一致
単体 3 本同時(np 3)一致一致
単体 5 本同時(np 5)不一致先頭から不一致439 文字目から
ドラフト n-max 2・4不一致224 文字目から不一致439 文字目から

3 本・5 本同時は 1 スロット 4096 トークンを保つため -c を本数倍にしており、VRAM があふれて速度は 10〜21 tok/s に落ちた。出力の比較には影響しない。

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

参考資料

調査のきっかけ

実装の確認先

第4章の見積りは実測前の推定値である。 ドラフトモデルのファイルは 378 MiB(396,705,472 B)で、見積りの約 410 MiB に近かった。 一方、同居させたときの VRAM は 3925 MiB で、見積りの合計(約 3086 MiB)を大きく超えた(第5章の結果)。