はじめに
前回は MTP の仕組みと FP16 ベースラインを見ました。MTP-FP16-n1 で +15%、ただし n=3/5 はベースライン割れという結果でした。
ただ実用シーンを考えると、ローカル LLM を FP16 のまま動かす場面はあんまりなくて、たいてい FP8 か AWQ4 まで落として VRAM を稼ぎます。「じゃあ量子化を強くしたとき、MTP は同じように効いてくれるのか?」というのが今回の主題です。
比較するのはこの3つ。
-
FP16:
Qwen/Qwen3.5-2B -
FP8:
lovedheart/Qwen3.5-2B-FP8 -
AWQ4:
QuantTrio/Qwen3.5-2B-AWQ
ついでに Ollama (qwen3.5:2b Q8_0) でも同じプロンプトを流して、実用感覚としての参考値も取りました。
先に結論を書くと、全3量子化で「n=1 だけが有効」 という結果になりました。n=3 以上はどの量子化でも受理率が下がりすぎてベースラインを下回ります。「先読みを増やすほど速い」という直感は、少なくとも Qwen3.5-2B では成り立ちません。
量子化のおさらい
vLLM で扱える量子化フォーマットは複数ありますが、今回触ったのはこの3つです。
- FP16 / BF16: 半精度。実質「量子化なし」
- FP8 (compressed-tensors): 重みと活性を 8bit 浮動小数に。Ada Lovelace 以降の native FP8 演算で速い
- AWQ 4bit: weight-only の 4bit 量子化。VRAM は大幅削減、計算は dequant 後の半精度で行う
ざっくり言うと、ビット幅が小さいほどモデルは軽くスループットは伸びる方向です。引き換えに精度が劣化します。
FP8 モデル選定でハマった話
最初は surogate/Qwen3.5-2B-FP8 を使っていました。
普通に MTP も動いているように見えるのに、/metrics を見ると 受理率が 0% になっていました。draft は出ているのに target が全部拒否している、という奇妙な状態です。
原因は FP8 量子化の 除外モジュール設定 でした。surogate 版は除外モジュールが 227 個、対して lovedheart/Qwen3.5-2B-FP8 は 900+ 個指定されています。lovedheart 版は MTP ヘッド周辺を FP8 量子化対象から外しているらしく、こちらに切り替えたら正常な受理率になりました。
教訓: MTP ヘッドが量子化で壊れると静かに 0% になる。FP8 + MTP を使うときは、最初に必ず /metrics で受理率を確認するのが安全です。
結果: Medium (256 tokens)
3量子化 × baseline/n=1/n=3/n=5 の全12構成。命名は前回と同じく Base-{量子化} / MTP-{量子化}-n{先読み数} です。
| 構成 | tok/s | 同量子化内 speedup | acceptance |
|---|---|---|---|
| Base-FP16 | 115.4 | 1.00 | - |
| MTP-FP16-n1 | 126.4 | 1.10 | 0.52 |
| MTP-FP16-n3 | 119.7 | 1.04 | 0.36 |
| MTP-FP16-n5 | 94.3 | 0.82 | 0.22 |
| Base-FP8 | 122.3 | 1.00 | - |
| MTP-FP8-n1 | 143.1 | 1.17 | 0.57 |
| MTP-FP8-n3 | 112.6 | 0.92 | 0.26 |
| MTP-FP8-n5 | 88.5 | 0.72 | 0.17 |
| Base-AWQ4 | 161.9 | 1.00 | - |
| MTP-AWQ4-n1 | 180.3 | 1.11 | 0.68 |
| MTP-AWQ4-n3 | 151.0 | 0.93 | 0.39 |
| MTP-AWQ4-n5 | 116.7 | 0.72 | 0.26 |
ベースラインを横並びで見ると、量子化が軽いほど baseline が速い という素直な並びです。
- FP16: 115.4 tok/s
- FP8: 122.3 tok/s (FP16 比 1.06x)
- AWQ4: 161.9 tok/s (FP16 比 1.40x)
ここに MTP を足すと、全量子化で n=1 のみ有効。n=3 は FP8/AWQ4 でベースライン割れ、n=5 はどの量子化でも大きく落ちます。
結果: Long (512 tokens)
| 構成 | tok/s | 同量子化内 speedup | acceptance |
|---|---|---|---|
| Base-FP16 | 116.0 | 1.00 | - |
| MTP-FP16-n1 | 133.5 | 1.15 | 0.60 |
| MTP-FP16-n3 | 120.6 | 1.04 | 0.36 |
| MTP-FP16-n5 | 91.1 | 0.79 | 0.21 |
| Base-FP8 | 123.9 | 1.00 | - |
| MTP-FP8-n1 | 147.3 | 1.19 | 0.60 |
| MTP-FP8-n3 | 131.1 | 1.06 | 0.36 |
| MTP-FP8-n5 | 100.2 | 0.81 | 0.22 |
| Base-AWQ4 | 164.1 | 1.00 | - |
| MTP-AWQ4-n1 | 172.9 | 1.05 | 0.60 |
| MTP-AWQ4-n3 | 140.5 | 0.86 | 0.34 |
| MTP-AWQ4-n5 | 108.4 | 0.66 | 0.22 |
Long でも構造は同じです。全量子化で n=1 がピーク。FP8 + MTP-n1 は +19% (147.3 tok/s) が今回の最大効果。
AWQ4 は Long でも n=1 は +5% 程度の上乗せにとどまっています。baseline が速い分、MTP による絶対値の伸びが小さい。
なぜ n=3 以上が逆効果か
受理率の数字を見るとシンプルで、n=1 が 0.60 のところ n=3 は 0.36、n=5 は 0.21 まで落ちます。
投機的デコーディングのオーバーヘッドは「先読み n token 分の draft forward コスト + verify forward コスト増加」です。n=3 で3 token を連続して当てる確率は 0.36³ではなく「3 token すべての受理率の積に近い値」ですが、実態として verify 1 回あたりに回収できる token 数が n=1 と大差なくなる。
n=1: 1 step で 0.60 token 回収 → draft コスト小
n=3: 1 step で 0.36 × 3 ≈ 1.1 token 回収 → draft コスト大
n=5: 1 step で 0.21 × 5 ≈ 1.0 token 回収 → draft コスト 最大
おおよそ n=1 で 0.6、n=3 でも 1.1 程度。draft コストが増えた割に回収が増えていないので、n=3/5 は損益分岐を超えています。Qwen3.5-2B の MTP ヘッドは先読み精度がそこまで高くなく、n=1 で受理率 60% あたりが実用の天井に近いと思われます。
出力サンプル
数値だけだと品質感が伝わらないので、実際の出力も覗いておきます。プロンプトは「地方自治体の生成 AI 導入ガイド (Long 512 tokens)」です。
Qwen3.5 は thinking モードがデフォルト有効ですが、今回は enable_thinking: false で計測しているため、出力は最初から日本語の回答本文です。
[MTP-FP8-n1 Long の出力冒頭]
# 地方自治体が生成 AI を導入する際の進め方:実務者向け長文解説
地方自治体は、行政の効率化、透明性向上、そして市民サービスの質の向上を目的として、
生成 AI(LLM や多模态 AI など)の導入を検討するケースが増えています。
## 1. 導入目的の整理:なぜ AI を導入するのか?
* 業務効率化とコスト削減:
行政書士や事務職員が、重複する書類作成や標準的な回答生成タスクを AI に委ね、
人間の作業時間を大幅に短縮する。
* 情報提供の質の向上:
市民が「〇〇の保険料は?」と検索する際、AI が最新の法律や条例に基づき、
正確で即座に回答できることで、窓口での待ち時間を短縮する。
MTP-AWQ4-n1 でも Base-FP16 でも構造は同様で、明らかな崩れはありませんでした。
Ollama の参考値
参考までに、Ollama でも同じプロンプトを流しました。qwen3.5:2b は Q8_0 量子化で、temperature 0 / num_ctx 2048 / think: false で計測しています。
| Engine | Workload | Eval tok/s |
|---|---|---|
| Ollama (Q8_0) | Medium | 155.9 |
| Ollama (Q8_0) | Long | 155.9 |
Ollama は API も tokenization も vLLM と違うので横並び厳密比較ではありませんが、雑な体感では次の位置づけです。
AWQ4 baseline (164 tok/s) > Ollama Q8_0 (156 tok/s) > FP8+MTP-n1 (147 tok/s) > FP8 baseline (124 tok/s)
「Ollama で十分」という人も多いと思いますが、vLLM FP8 + MTP-n1 (147 tok/s) は Ollama Q8_0 (156 tok/s) とほぼ同等の速度域です。量子化の選択肢や、後述する 4B モデルへの移行を考えると vLLM を立てる価値はあります。
実用候補としての結論
今回の3量子化をまとめると次のようになります。
| 構成 | Long tok/s (best) | Long 品質 | 評価 |
|---|---|---|---|
| MTP-FP16-n1 | 133.5 | OK | 安定。速度控えめ |
| MTP-FP8-n1 | 147.3 | OK | 実用候補 |
| MTP-AWQ4-n1 | 172.9 | OK | 速いが MTP 効果が薄い |
速度だけなら AWQ4-n1 が最速 ですが、MTP による上乗せが +5% 程度なので baseline をそのまま使っても大差ありません。
実用候補は FP8 + MTP-n1 です。
- FP16 baseline 比 +27%
- FP8 baseline 比 +19%
- 出力品質に明らかな崩れなし
- VRAM も RTX 4070 12GB に収まる
FP8 + MTP は「量子化で baseline を上げた上に MTP をかける」という二段構えが一番効いています。AWQ4 はベースラインが速い分 MTP の伸びしろが少なく、FP16 は逆にベースラインが遅いため上限が低い。
まとめ
- 全3量子化で n=1 のみ有効 (n=3 以上はベースライン割れ)
- 受理率が n=1 で 0.60、n=3 で 0.36、n=5 で 0.21 と急落するため、draft コストが利益を超える
- MTP-FP8-n1 が実用候補: FP16 baseline 比 +27%、FP8 baseline 比 +19%
- AWQ4 は baseline が速いが MTP 効果が薄い (Long で +5%)
- Ollama Q8_0 (156 tok/s) と FP8+MTP-n1 (147 tok/s) はほぼ同速度域
- FP8 で MTP を使うときは量子化除外設定で MTP ヘッドが守られているか確認するのが安全
次回 ③ は Qwen3.5-4B で D-Flash を試します。MTP とはまったく別方式の block diffusion drafter で、12GB GPU での限界も見えてきます。