llama.cppでNextN MTP(Multi-Token Prediction)による推測デコードを使ってQwen3.5 / Qwen3.6を動かす:RTX 3090 Ti単GPUガイド

Reddit r/LocalLLaMA / 2026/5/7

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

要点

  • 本記事では、単一のRTX 3090 Ti環境でllama.cpp上でQwen3.5/Qwen3.6をNextNのMulti-Token Prediction(MTP)による推測デコードで動かす手順を解説しています。
  • 記事では、Qwen3.5/3.6に対して通常(バニラ)より約2.9倍のデコード高速化が得られ、モデルに同梱されているMTP用ヘッドにより「品質劣化はゼロ」と主張しています。また、35B-A3BのようなMoE(重い構成)で約150トークン/秒を示しています。
  • 重要な注意点として、記事執筆時点ではMTP対応がアップストリームにまだマージされていないため、指定されたオープンPRを取得してビルドするか、著者が用意したフォークブランチを使う必要があります。
  • 著者は必要なllama.cppのPR(#22400と#22673)を列挙し、CUDAでのビルドコマンドを提示するとともに、NextNブロックのオーバーライドが効くためGGUFの「Q8nextn」バリアントを使うよう推奨しています。
  • 実運用の観点では、動作するGGUFモデルファイルを用意し、必要な推測デコード/実験的機能を有効にしてllama-serverをコンパイルすることに焦点を当てています。
  • 手順として、推測デコードのパイプラインが破綻しないよう、PRを現在のupstream masterにリベース/チェリーピックする必要があることを強調しています。

このガイドを求められたので、ここに載せます。昨日の誰かの投稿と一部内容が重なります。YMMV!仕事が忙しくて自分で書く時間がなかったので、Opusに代わりに書いてもらいました(内容は検証済みです!)。

q4 なんちゃらの使用については議論になるのは確実だと思います。私は自分のモデルでの動作に満足しています。お願いされれば、ハードウェアの許す範囲で、より高い q モデルを作ることもできます!

NextN MTPは、Qwen3.5/3.6ファミリーに対して、バニラ比で 品質ロスなし(ヘッドがモデル同梱) で約2.9×のデコードを実現します。35B-A3Bのような重いMoEアーキテクチャでも、3090 Tiで約150 tok/sです。注意点:この執筆時点では、上流にマージされていません—オープン中のPRを取り込む必要があります。

必須PR(チェリーピックするか、そこにあるブランチを元にビルド)

いずれも2026年5月時点でオープン—リリース時に追跡して再ビルドしてください:

  1. #22400 — llama: allow partial seq_rm for GDN models for speculative decoding https://github.com/ggml-org/llama.cpp/pull/22400 前提条件です。GDN/SSMモデル向けに keep_intermediates のパスを追加し、spec-decode が部分的なドラフトをロールバックできるようにします。これがないと、ハイブリッド-attnモデル(27B)では MTP が機能しません。

  2. #22673 — llama + spec: MTP Support https://github.com/ggml-org/llama.cpp/pull/22673 本命です。qwen35_mtp + qwen35moe_mtp アーキテクチャローダー、NextNグラフフォワード、--spec-type mtp フラグ、そして spec state machine を追加します。

どちらかの方法として、両方を現在の upstream master にリベースするか、am17an のブランチを直接取得してください。

私のフォーク(FYI—両方のPRがマージ済み + 追加あり)

https://github.com/nickstx/llama.cpp ブランチ crucible

#22400 + #22673 に加えて qwen3moe_mtp アーキを含みます(Qwen3-Coder ベース— coder-30B MTPヘッドの学習向けの作業中、Qwen3.5/3.6のリリースモデルには不要です)。すぐにビルドしたい場合、これが最も簡単な取り込み方法です。さらに、クロスPIDのスロット・レジュームに対応する未マージのスロットPRがいくつか入っています。

ビルド(CUDA)

bash git clone https://github.com/nickstx/llama.cpp.git cd llama.cpp git checkout crucible cmake -B build -DGGML_CUDA=on -DCMAKE_BUILD_TYPE=Release cmake --build build -j$(nproc) --target llama-server

動作するGGUFを入手

Q8nextn バリアントが必要です。これらには NextN ブロックの上書きが適用されています(公開されているほとんどの量子化では、nextn を削除するか、Q4→s less ancceptanceに量子化してしまっています)。

モデル ティア リポジトリ
Qwen3.5-4B-MTP Q5_K_M / IMAT-IQ4_XS / IMAT-Q4_K_M localweights/Qwen3.5-4B-MTP-*
Qwen3.6-27B-MTP IQ4_XS-Q8nextn / IMAT-IQ4_XS-Q8nextn localweights/Qwen3.6-27B-MTP-*
Qwen3.6-35B-A3B-MTP IMAT-IQ4_XS-Q8nextn / IMAT-Q4_K_M-Q8nextn localweights/Qwen3.6-35B-A3B-MTP-*

コレクション: https://hf.co/collections/localweights/qwen36-mtp-crucible-release-69fbdeadca3472e779dff9d2

または bf16 ソースから自分で作成します:

```bash

任意:imatrix キャリブレーション(PPLが5〜8%向上)

./build/bin/llama-imatrix -m model-bf16.gguf -f calibration.txt -ngl 999 --chunks 200 -o imatrix.dat

nextn オーバーライドで量子化(ここが多くの人が見落とす部分)

./build/bin/llama-quantize --imatrix imatrix.dat --tensor-type nextn=q8_0 model-bf16.gguf model-IMAT-IQ4_XS-Q8nextn.gguf IQ4_XS

--tensor-type nextn=q8_0 は、nextn に一致する任意のテンソルの量子化を上書きします。これがないと://////// 出力になります。

実行

bash ./build/bin/llama-server -m Qwen3.6-35B-A3B-MTP-IMAT-Q4_K_M-Q8nextn.gguf --port 8080 -ngl 999 -fa on --parallel 1 --ctx-size 131072 -ctk q8_0 -ctv q8_0 --kv-unified --spec-type mtp --spec-draft-n-max 4 --metrics --jinja

重要なフラグ:- --spec-type mtp — NextN のドラフトパスを有効化(これは#22673からの新しいフラグ)- --spec-draft-n-max 4 — 1ステップあたり4トークンを提案します。チャットでは 6 に上げる(長いctx、予測しやすい)。コードでは 2 に下げます。デフォルトは 4 で問題ありません。- -ctk q8_0 -ctv q8_0 — KVをq8にすると、VRAMを約半分節約でき、このファミリーでは品質コストなし。- --kv-unified — spec-decode に必須です。

速度(3090 Ti, 350W/1700MHz, q8 KV, 約50-tok prompt → 1600-tok decode)

モデル tps
4B-MTP IMAT-IQ4_XS 181
4B-MTP IMAT-Q4_K_M 168
35B-A3B-MTP IMAT-Q4_K_M-Q8nextn 157
35B-A3B-MTP IMAT-IQ4_XS-Q8nextn 149
27B-MTP IMAT-IQ4_XS-Q8nextn 47

35B-A3Bは27Bを3×上回ります(A3B = 3Bのアクティブパラメータ、MoEが勝つ)。27Bは密なモデル+SSMハイブリッドなので、リンクが遅いです。

電力チューニング(3090 Ti)

継続的なMTPワークロードでは、350W + 1700MHzの固定が tok/W の最適点です:bash sudo nvidia-smi -pl 350 sudo nvidia-smi -lgc 0,1700

デフォルトの300Wだと、MTPのドラフトパスの間にクロックが約1080MHzまで崩れます—tpsが約17%低下します。280W未満に落とさないでください。再起動をまたいで適用したい場合は systemd で永続化します。

つまずきどころ

  1. **//// 出力** = nextn ブロックがQ4で量子化されている状態です。--tensor-type nextn=q8_0 で再量子化してください。
  2. 速度向上なし = --spec-type mtp が有効になっていない、またはモデルに nextn テンソルがありません。確認:llama-gguf model.gguf r | grep nextn.
  3. 長いctxでOOM = KVをf16→q8に落とす、ctxを縮小する、部分オフロード。
  4. 27B bf16 のダンプに inf がある = blk.18.ffn_up に発生しています。IQ4カーネルなら処理できます;Q4_K_M のバリデーションは中断します。Q4が失敗する場合は、27Bでは IQ4_XS を使ってください。
  5. specドラフトの受理率/metrics エンドポイントを確認— spec_decode_*_total 。コード:~50〜65%。チャット:70%+。

クレジット

  • am17an / Aman Gupta:両方の上流PR
  • NextN学習済みヘッドを出荷したQwenチーム
  • 実行ランタイムの ggml-org
submitted by /u/yes_i_tried_google
[link] [comments]