MTPとは?Qwen3.6とllama.cppで推論を高速化する仕組み・設定・注意点
- 公開日
- 2026-07-15
- 更新日
- 2026-07-15
- 情報確認日
- 2026-07-15
- 編集・運営
- Local AI Compass
MTPは複数tokenの予測を使い、target modelの検証で生成を進める仕組みです。draft tokenがよく受理されれば速くなることがありますが、n-max、sampling、quant、VRAM、llama.cppの対応で結果は変わります。
導入前に確認すること
- Windowsのバージョン、メモリ容量、GPU/VRAM、空き容量を確認する
- 最初は軽量モデル、短い質問、少ない同時作業から始める
- 公式サイトの対応OS、利用規約、モデルのライセンスを確認する
ひとことで言うと
MTP(Multi-Token Prediction)は、次のtokenを1つずつ出すだけでなく、複数step先のtoken予測を学習・推論へ利用する考え方です。llama.cppでは、draft tokenを作ってtarget側で検証するspeculative decodingの一方式としてdraft-mtpを指定します。
target modelが順番にdecodeする。比較のbaselineにする。
複数候補を作り、targetが受理できるtokenをまとめて進める。
draftの計算コストを超える受理とbatch効率があるかを測る。
通常の自己回帰生成
通常の自己回帰生成では、直前までのtoken列を使って次のtokenを決め、出力へ追加してからまた次を計算します。生成中のdecodeは、入力全体をまとめて処理するprompt processingより、逐次処理の影響を受けやすい段階です。
- prompt processing / prefill
- 入力promptをまとめて処理する段階。入力長、batch、context、TTFTへ影響します。
- generation / decode
- 回答tokenを生成する段階。tokens/sとMTPの主な比較対象です。
- TTFT
- 入力を送って最初のtokenが出るまで。MTPで常に改善するとは限りません。
speculative decodingの基本
llama.cpp公式ドキュメントは、draftを先に作り、target modelがまとめて検証することで、draft予測が頻繁に正しい場合に生成を加速できると説明しています。速さは候補を出すコストと、受理してまとめて進む効果の差で決まります。
通常: target → token 1 → target → token 2
MTP: draft → token 1, 2, ... → targetで検証 → acceptedをまとめて採用したがってMTPのフラグを付けたら必ず2倍ではありません。prompt、sampling、モデル、quant、GPU、受理率が異なる測定値を、そのまま別環境へ移しません。
Multi-Token PredictionとQwen3.6
Qwen公式モデルカードはQwen3.6-27BのMTPをmulti-stepsで訓練したと示しています。UnslothはQwen3.6-27B-MTP-GGUFとしてGGUFを配布し、llama.cppでdraft-mtpとspec-draft-n-max 2を使う例を掲載しています。
ここでの「公式」はQwenのモデル仕様、「配布者の案内」はUnslothのGGUFと実行例、「独自実測」は読者のColabで取得したlogです。3つの根拠を1つに混ぜず、モデルrevisionとllama.cpp commitを一緒に記録します。
- Qwen公式モデルカード - 27BとMTP訓練を確認する
- MTP GGUF配布ページ - quantとllama.cpp commandを確認する
llama.cppのdraft-mtp設定
現行のllama.cpp CLIではspec-typeにdraft-mtpがあり、spec-draft-n-maxでdraft token数を指定できます。Qwen3.6 MTP GGUFでは、配布者の例に合わせてn-max=2から始め、n-max=1やbaselineと比較します。
llama.cpp/build/bin/llama-cli --hf-repo "unsloth/Qwen3.6-27B-MTP-GGUF:Q3_K_S" --no-mmproj --ngl 99 --ctx-size 4096 --n-predict 128 --spec-type draft-mtp --spec-draft-n-max 2 --single-turn --seed 42 --temp 0.7 --top-p 0.8 --top-k 20 --min-p 0.0 --prompt "$PROMPT"CLIのhelpやREADMEでoption名を再確認し、実行時に出たcommitとversionを記録します。最新mainの挙動を将来も同じだと断定しません。
別draft model方式との違い
| 方式 | draftを作るもの | 注意 |
|---|---|---|
| draft model | 小さい別モデル | targetとtokenizer/用途の相性、追加モデルのVRAMが必要 |
| draft-eagle3 | target hidden stateを使う専用speculator | targetと対応するdraft checkpointが必要 |
| draft-mtp | MTP対応target/GGUF側の仕組み | 対応モデル、GGUF、runtime、optionをそろえる |
| ngram系 | 履歴のn-gram | 繰り返しが多い用途など、MTPとは別方式 |
draftがあるからMTPとは限りません。llama.cppのdraft、draft-eagle3、draft-mtp、ngram系は同じ目的に見えても構成と制限が違います。
なぜ速くなることがあり、遅くなることもあるのか
draftがtargetの次のtokenを当て、targetが複数tokenをまとめて検証できるとdecodeの逐次回数を減らしやすい。
draftの生成や検証、memory movementが大きく、accepted tokenが少ないと利得が消える。
文章の繰り返し、コード、日本語、temperature、top-pなどで受理率が変わる。
論文や配布者ページの速度向上率は、その環境の観測または主張です。Qwen3.6-27BをColab T4で測っていない数字を、自分の結果として書かないでください。
受理率・n-max・p-minの読み方
- accepted tokens
- draftで提案したtokenのうち、targetの検証を通って採用された数。MTPの効き方を見るログ上の手がかりです。
- n-max
- 1回にdraftするtoken数の上限。大きくすると候補数と負荷も増えるため、1→2の順で比較します。
- p-min
- speculative decodingを使う最低確率の設定。先にsamplingとn-maxを固定し、理由なく同時に変えません。
- baselineを同じpromptで実行する。
- MTP n-max=1を実行し、速度・VRAM・acceptedを記録する。
- MTP n-max=2を実行し、baselineと同じ表へ追加する。
- 受理率が低い場合はp-minをいじる前に、prompt、sampling、model revision、commitを確認する。
VRAM・context・MTPの追加負荷
MTPをonにすると、baselineと同じmodel weightsでも、draft関連のbufferやKV cacheの余白が足りなくなる場合があります。contextを長くするとKV cacheが増えるため、T4 16GBではQ3系・短いcontext・MTP offから段階的に上げます。
| 変更 | 増える可能性のある負荷 | 測定時の扱い |
|---|---|---|
| contextを増やす | KV cache、prompt処理、VRAM | MTPの比較とは別の測定行にする |
| n-maxを増やす | draft/verification buffer、計算 | n-max=1/2/4を個別に記録する |
| quantを重くする | model weights、VRAM、disk | baselineとMTPで同じquantにする |
| mmprojを使う | vision部品、VRAM | MTP実践では使わずtext-onlyで分ける |
- VRAMの内訳 - weightsだけでなくbufferとKV cacheを見る
- context長の考え方 - 公式最大値とT4の実用値を分ける
出力品質・sampling・再現性
同じseedを使っても、runtime、chat template、llama.cpp commit、samplingの実装が違えば出力が同じとは限りません。速度の比較ではpromptと出力上限を固定し、内容の比較では出力を保存して人間が確認します。
- モデルrevisionとGGUFのquantを記録する
- temperature、top-p、top-k、min-p、seedを記録する
- thinking/reasoningの設定を記録する
- prompt processingとgenerationを分ける
- 精度損失ゼロや完全一致を未検証のまま書かない
MTP比較テンプレート
| 条件 | baseline | MTP |
|---|---|---|
| llama.cpp commit | 同じ | 同じ |
| GGUF repo / quant | 同じ | 同じ |
| context / batch / GPU layers | 同じ | 同じ |
| prompt / output / sampling / seed | 同じ | 同じ |
| MTP option | none | draft-mtp、n-max=1/2 |
| TTFT / prompt processing | 記録 | 記録 |
| generation tokens/s | 記録 | 記録 |
| peak VRAM / accepted tokens | 記録 | 記録 |
1回しか測れない場合は単回と明記し、GPU実測未完なら空欄を想像で埋めません。3回以上なら中央値、cold/warm、失敗条件も残します。
向いている用途・向いていない用途
同じpromptでbaselineとMTPを測り、受理率とVRAMを学ぶ用途。
contextと出力上限を抑え、Colabの一時VMで終わる短い実験。
無料枠のVM、利用上限、クラウドデータ境界を考えると主経路にしない。
llama-serverを使う場合も、外部公開トンネルや常設サービス化の手順へ広げません。まずllama-cliでモデル単体の推論を確認します。
FAQとColab実践への導線
- Google ColabでQwen3.6-27Bを動かす - Q3_K_S、CUDA build、baseline、MTP、OOMを順番に試す
- T4 16GBのOOM対策 - MTPだけOOMになる場合の切り分け
- 速度測定の一般ガイド - TTFT、RAM/VRAM、tokens/sを分けて記録する
よくある質問
MTPとspeculative decodingは同じですか?
同じ言葉ではありません。speculative decodingはdraftを先に作りtargetで検証する推論手法の総称で、MTPは複数tokenを予測する学習・モデル側の仕組みの一つです。llama.cppではdraft-mtpという実装名として指定します。
draft modelは必要ですか?
方式によります。一般的なdraft方式は小さい別モデルを使いますが、Qwen3.6 MTP GGUFとllama.cppのdraft-mtpはモデル内のMTPを使う構成として配布者の実行例が示されています。方式を混ぜないでください。
Qwen3.6-27BではMTPがモデル内にありますか?
Qwen公式モデルカードはMTPをmulti-stepsで訓練したと説明しています。実際にGGUFで使えるか、どのoptionが必要かは、配布ファイルとllama.cppの対応commitを合わせて確認します。
spec-draft-n-maxは大きいほど速いですか?
大きいほど速いとは限りません。draftの計算やVRAM使用量が増え、受理率が低いと検証コストが勝たない場合があります。まず1または2から始め、同じ条件で比較します。
MTPでVRAM使用量は増えますか?
増える可能性があります。MTP関連のbufferやKV cache、runtimeの余白が必要になるため、baselineが動いてもMTPだけOOMになることがあります。nvidia-smiとログで確認してください。
prompt processingも速くなりますか?
MTPは主に生成側のdecodeを比較する話です。prompt processingやTTFTまで速くなるとは限らないため、prefill、TTFT、generation tokens/sを分けて記録します。
出力内容が必ず完全一致しますか?
必ず完全一致するとは書きません。seed、sampling、実装、chat template、MTPの受理と検証条件を固定して、実際の出力を比較してください。
LM StudioやOllamaから同じMTP設定を使えますか?
llama.cppのCLI optionをそのまま各UIへ貼れるとは限りません。まず公式に対応するruntimeと設定画面を確認し、今回の再現手順はllama-cliで分けて測ります。
速度向上率はどう測ればよいですか?
同じGGUF、quant、context、prompt、output上限、sampling、GPU layers、seedでbaselineとMTPを複数回測ります。generation tokens/sだけでなくTTFT、peak VRAM、accepted draft tokens、失敗条件も残します。
受理率が低い場合はどうしますか?
まずsamplingとprompt、モデル・量子化、llama.cpp commit、n-maxを確認します。n-maxを下げる、MTPをoffに戻す、短い固定promptで再測定する順が安全です。
次に読むおすすめルート
GPUなし・低スペックPCの人
軽量モデル、メモリ別の目安、重いときの確認ポイントを先に見ます。
- ローカルAI用PCスペックの見方
- GPUなしPCで使える範囲を整理
- GPUなしで音声を文字起こしする
- 古いWindows PCでLM Studioを使うなら
- 中古PCでローカルAIは使える?
- ミニPCでローカルAIは使える?
- メモリ別に始める前に知ること
- GPUオフロードとは
- 速度・RAM・VRAMを測る方法
- Google ColabでQwen3.6-27Bを動かす
- Colab T4のGGUF OOM対策
- Gemma 4 12Bの更新メモ
- 重い・動かないときの確認ポイント
- 診断ページ
あなたはどのタイプ?
- 初めてローカルAIを触る人 - まず全体像をつかみ、LM StudioとOllamaの違い、モデルサイズの考え方を順番に確認します。
- LM Studio・Ollamaの症状別トラブルを解決したい人 - 起動、モデルロード、Prompt Processing、generation、API接続、GPU確認をツール別に分けて読みます。
- GPUなし・低スペックPCの人 - 軽量モデル、メモリ別の目安、重いときの確認ポイントを先に見ます。
- PDFや資料を読ませたい人 - 先に基本を押さえ、モデル単体の確認後にAnythingLLMへ進みます。
- ローカルAIエージェントを試したい人 - Bionic、Ollama、AnythingLLM、Hermesを役割別に分け、local/cloud、tool、保存、PC負荷を順番に確認します。
- 開発・API連携したい人 - LM StudioとOllamaの違いを確認し、API、長文処理、RAGまで段階的に進みます。
関連チェック先
- Qwen3.6-27B model card - 27B、MTPの学習、native context、モデル構成を確認するQwen公式のモデルカードです。
- Qwen3.6-27B official blog - Qwen3.6-27Bの公式発表です。モデルカードと内容が異なる場合は、両方の確認日を残します。
- Unsloth Qwen3.6-27B-MTP-GGUF - GGUFの配布ファイル、量子化候補、llama.cppのMTP実行例を確認する配布者ページです。
- Hugging Face GGUF documentation - GGUFの形式、metadata、Hub上の検索とファイル確認を読む公式ドキュメントです。
- llama.cpp speculative decoding - speculative decodingの方式、accepted token、現行のspeculative optionsを確認する公式ドキュメントです。
- llama.cpp CLI README - llama-cliのHugging Face repo指定、context、sampling、MTP関連のoptionを確認する公式READMEです。
- Google Colab FAQ - 無料枠のGPU、利用制限、idle timeout、VMの最大寿命、notebook共有を確認する公式FAQです。
- NVIDIA T4 specifications - T4の16GB GDDR6、メモリ帯域、用途を確認するNVIDIA公式ページです。
- Better & Faster Large Language Models via Multi-token Prediction - Multi-Token Predictionの研究上の考え方を確認する補助資料です。Colabの速度保証には使いません。