Speculative Decoding は、E2B ドラフトを使う Gemma 4 31B で非常にうまく機能(平均 +29%、コードで +50%)

Reddit r/LocalLLaMA / 2026/4/12

💬 オピニオンDeveloper Stack & InfrastructureTools & Practical UsageModels & Research

要点

  • この投稿では、Gemma 4 E2B をドラフトモデルとして speculative decoding を行うことで、Gemma 4 31B のメインモデルにおける推論速度を大幅に向上できることを示す、制御されたベンチマーク結果を報告している。
  • 同じサーバ設定(RTX 5090 32GB、TurboQuant KV キャッシュ付きの llama.cpp fork、128K コンテキスト、parallel=1)で、著者はスループットを 57.17 t/s から 73.73 t/s へ平均増加させ、+29% と報告している。
  • 加速率はタスクによって異なり、コード生成では約 +50%(+50.5%)まで到達している。観測された accept rate はおよそ ~60.7%。
  • ベンチマーク設定には、speculative decoding の具体的なパラメータ(--draft-max 8 --draft-min 1)が含まれており、計測の前にウォームアップ実行を破棄している。
  • 結果は、小型の E2B ドラフトモデルをより大きい 31B モデルと組み合わせることが、ローカル LLM 導入におけるレイテンシ/スループット改善の有効な実践戦略であることを示唆している。
Speculative Decoding は E2B ドラフト(+29% 平均、+50% on code)で Gemma 4 31B に最適

前回の Gemma 4 31B ベンチマーク投稿の続きとして、ドラフトモデルに Gemma 4 E2B(4.65B)を用いて speculative decoding を試しました。

結果は予想以上に良かったので、いくつかの管理されたベンチマーク数値を共有したいと思います。

セットアップ

  • GPU: RTX 5090(32GB VRAM)
  • OS: Windows 11
  • メインモデル: Gemma 4 31B UD-Q4_K_XL(18.3GB)
  • ドラフトモデル: Gemma 4 E2B UD-Q4_K_XL(3.0GB)
  • バックエンド: TurboQuant KV キャッシュ(turbo3)付きの llama.cpp fork
  • 設定: 128K コンテキスト、parallel=1、Flash Attention、--draft-max 8 --draft-min 1

ベンチマーク結果

両方でサーバー設定は同一、max_tokens=500、temp=0.7、計測前のウォームアップクエリは破棄しました。

https://preview.redd.it/gjyo1gl1crug1.png?width=1007&format=png&auto=webp&s=6574ab5093a44846d688de2a951f661cbce2013b

クエリタイプ ベースライン(t/s) SpecDec(t/s) 受理率 スピードアップ
数学の説明 57.45 85.86 62.9% +49.5%
韓国語の詩 56.93 62.34 44.1% +9.5%
コード生成 57.15 86.05 60.7% +50.5%
科学の説明 57.19 71.14 50.9% +24.4%
翻訳 + 分析 57.14 63.26 42.2% +10.7%
平均 57.17 73.73 52.2% +29.0%

受理率が 42% でも、speculative decoding は依然として +10% 速いです。ボキャブラリが互換であれば、トークン翻訳のオーバーヘッドがゼロだからです。

GGUF バージョンの落とし穴

最初はひどい結果になりました。ドラフトモデルは、そもそもドラフトなしの場合よりも 遅い という状態でした(7.31 t/s vs ベースライン 57 t/s)。ドラフトモデルの組み合わせを変えるたびに、この警告が出ました:

the target and draft vocabs are not compatible - tokens will be translated between the two 

speculative.cpp を掘り下げたところ、互換性チェックは target と draft の add_bos_token を比較していました。私の 31B GGUF は、Gemma 4 が最初にリリースされた 4 月上旬のもので、add_bos_token = false でした。E2B モデル(後でダウンロード)は add_bos_token = true でした。この 1 つのメタデータ不一致により、llama.cpp がトークン翻訳モードに入り、すべての性能向上が無効化されました。

31B GGUF を再ダウンロード(Unsloth が最近、修正を入れてすべての Gemma 4 GGUF を再量子化)したら、警告が消え、完全な +29% のスピードアップが解放されました。

TL;DR:2026 年 4 月上旬に Gemma 4 の GGUF をダウンロードしたなら、再ダウンロードしてください。トークナイザーのメタデータが修正されています。

実用的なヒント

既存の llama-server コマンドに以下のフラグを追加してください:

-md gemma-4-E2B-it-UD-Q4_K_XL.gguf -ngld 99 --draft-max 8 --draft-min 1 --parallel 1 

注意点:

  • --parallel 1 は必須 — auto(=4)だと、ドラフトモデルの KV キャッシュが 4 倍割り当てられ、VRAM を消費して速度が 7 t/s まで落ちます
  • 視覚(vision)なし — speculative decoding とマルチモーダルは同時に使えません
  • Q4 ドラフトで十分 — Q8(4.8GB)は Q4(3.0GB)に比べて速度が向上せず、Q4 の方がより多くの VRAM の余裕があります
  • 追加 VRAM 約 2.3GB — 32GB カードで 128K コンテキストなら合計約 23.4GB(256K でも収まります:約 25.5GB)。

コンテンツ依存のスピードアップ

得られる効果は、出力がどれだけ予測可能かに比例します:

  • コード / 数学(構造化され、反復パターンが多い):受理率 約 60% → +50% スピード
  • 説明文(セミ構造化):受理率 約 50% → +24%
  • 創作 / 翻訳(予測しにくい):受理率 約 42% → +10%

最悪の場合でも純増(プラス)であることが重要なポイントです。互換でないボキャブラリの場合は、受理率 65% でもゼロの向上に終わるため、ここが大きな違いです。

draft-max のスイープ

提案してくれたu/Odd-Ordinary-5922 に感謝します。同じベンチマークセットアップで、--draft-max だけを変えています:

draft-max 数学 コード 科学 翻訳 平均(t/s) ベースラインとの差
ベースライン 57.45 56.93 57.15 57.19 57.14 57.17
2 73.43 60.49 68.69 62.46 62.42 65.50 +14.6%
4 83.31 60.88 73.12 65.29 67.98 70.12 +22.6%
8 85.86 62.34 86.05 71.14 63.26 73.73 +29.0%
16 99.35 62.58 78.74 68.39 58.31 73.47 +28.5%

draft-max 8 は最適なポイントで、混在ワークロードに適しています。16 だと数学は 99 t/s まで伸びる一方、創作/翻訳では悪化して、結局平均はほぼ同じになります。創作のテキストは draft-max に関係なくほぼ横ばい(約 62 t/s)で、そこではボトルネックがドラフトの長さではなく受理率だからです。

submitted by /u/PerceptionGrouchy187
[リンク] [コメント]