MTPLX | Apple Silicon向けネイティブMTP推論エンジン(TPS最大2.24倍高速)

Reddit r/LocalLLaMA / 2026/5/5

💬 オピニオンDeveloper Stack & InfrastructureSignals & Early TrendsTools & Practical Usage

要点

  • MTPLXはApple Silicon向けのネイティブMTP(スペキュラティブデコーディング)推論エンジンで、モデルのデフォルト推論挙動を維持したままデコードを最大約2.25倍高速化できるとされています。
  • 外部のドラフターを追加せず、余計なメモリ負荷も増やさない方針で、各モデルに内蔵されたMTPヘッドを使うため幅広い互換性をうたっています。
  • Apple Silicon上の他のスペキュラティブデコーディング手法と異なり、「greedy-only」ではなく、拒否サンプリング付きの数学的に正確な温度サンプリングを用いることで、タスクに応じた温度設定を可能にします。
  • ベンチマークでは、MacBook Pro M5 Max上でQwen3.6-27Bが、温度0.6・コーディング向けの推奨サンプリング設定で、28 tok/sから63 tok/sへ改善したと報告されています(MTP深さの最適化も実施)。
  • MTPLXにはCLI一式と、OpenAI/Anthropic互換のAPIに対応した提供(サービング)スタックに加え、ベンチマークや診断など実運用向けの機能も含まれます。
MTPLX | 2.24x faster TPS | Apple Silicon向けのネイティブMTP推論エンジン

TLDR: MacBook Pro M5 Maxで、Qwen3.6-27Bの28 tok/s → 63 tok/s。実温度0.6で2.24×高速。

コーディング、創作の文章作成、チャットに対応

https://i.redd.it/i9x794c0q7zg1.gif

  • あらゆるMTPモデルで動作: 外部ドラフタ不要。追加のメモリ使用なし。モデルに内蔵されたMTPヘッド自身を使います。それらを同梱している任意のモデルで動きます。
  • 貪欲ではない: 同種の推測デコード系プロジェクトと異なり、棄却サンプリングを用いた数学的に厳密な温度サンプリングを採用しています。任意のタスクに合わせて温度を調整可能。Apple Silicon上の他の推測デコードプロジェクトは、どれも貪欲(greedy)だけです。
  • カスタムカーネル: パッチ済みMLXフォークに基づき、カスタムMetalカーネル、コンパイル済みの検証グラフ、イノベーションテープGDNのロールバック、ドラフト専用の再量子化LMヘッドを実装。
  • フルCLI: mtplxスタートウィザード、モデルのダウンロード、4段階のMTP互換性検出によるモデル検査、深さ2-7+の設定、OpenAI/Anthropic APIサーバー、ブラウザチャット、ターミナルチャット、ベンチマークスイート、ヘルス診断、アイドルを考慮した自動復元付きクラッシュセーフなファン制御、562テストスイート。
  • フル提供スタック: OpenAI + Anthropic互換API、ブラウザチャットUI、ターミナルチャット。エディタをlocalhostに向けて、そのまま使えます。

MTPLXとは?

MTPLXは、モデルに内蔵されたMTPヘッドを推測用のドラフタ(drafters)として使い、LLMのデコード速度を最大2.25倍に高めます。しかも、モデルのデフォルトの推論設定は維持されるため、コーディングや創作の文章作成といった作業が可能です。

QWEN 3.6 27B(MacBook Pro M5 Maxで63 TPS)

MTPLXを使って、Qwen 3.6 27B 4-bit MLXのデコード速度を、MacBook Pro M5 Max上で温度0.6、top_p 0.95、top_k 20の条件にて28 tok/s → 63 tok/sに引き上げました。コーディング向けにQwenが推奨する、正確なサンプリング設定です。

Qwen 3.6 27Bには、最大深さ5まで対応する内蔵MTPヘッドが付属しています。私はこのモデルがこのハードウェア上で最適になる深さを見つけるため、D2、D3、D4、D5をスイープして確認しました:

https://preview.redd.it/erim8d4rq7zg1.png?width=1200&format=png&auto=webp&s=0fd76cbffd9bbfcb67acac16ef4c302e1310d8e9

D3が最適なポイントでした。受容(acceptance)が十分高く、検証時間の比率に対して、TPSが最も伸びたためです。D4とD5は序盤の位置で受容が良いものの、より深い位置では、保存できた受容トークン数以上に検証時間のコストが増え始めます。

これらの結果は、実温度0.6において、確率比の厳密な棄却サンプリングと残差補正を行ったものです。

つまり、出力品質を犠牲にせず、2.25倍の速度向上を得ながら、Qwen 3.6 27Bを実際のコーディング作業に本当に使えるということです。

これはDFlash / DDTreeと何が違うの?

https://preview.redd.it/ycxf4qptq7zg1.png?width=1200&format=png&auto=webp&s=8591cd1acfb3ff7d20801cd5bbca5339ff977e6d

DFlash MLXは絶対的な速度はより高いのですが、サンプリングが貪欲(temp 0)のみに制限されており、実世界での利用ケースを大幅に狭めています。また外部ドラフタモデルが必要で、追加のメモリが要り、リリースされる各モデルごとに作成する必要があります。

DDTreeはDFlashの上にツリー構造で検証を追加するため、同じ制限を引き継ぎます。つまり、貪欲のみで、外部ドラフタが必要です。

これが起きる理由は、それぞれのシステムがどのようにドラフトするかにあります。MTPヘッドは逐次的にドラフトします。つまり、各トークンは前にドラフトされたトークンを見ます。そのため、すべての位置で実際の確率分布が生成されます。DFlashは拡散(diffusion)パスで16個のトークンを同時にドラフトします。トークン8はトークン7が何だったかを知りません。この逐次依存がなければ、温度が機能するための、トークンごとの棄却サンプリングの数学はできません。

MTPLXは、MTPヘッドを保持する任意のモデルで動作し、ユーザーがMTPヘッドの数を選び、ローカル保存済みまたはHuggingFaceのMTPヘッド付きモデルを何でも実行できるよう、完全なカスタマイズ性を提供します。

アーキテクチャ

https://preview.redd.it/q0m2sjwyq7zg1.png?width=1200&format=png&auto=webp&s=696b2e35abe190815b42ef350dfb4288ce794439

Layer 0: MLXランタイム

MTPLXはパッチ済みMLXフォーク上で動作します。標準MLXの量子化済み行列-ベクトルカーネルは、大きなM(prefill)向けにチューニングされています。MTPの検証(verify)では、Mは3〜6で、1つのドラフトトークンにつき1位置です。標準の実装では、この形状でスタック(待ち)が発生します。パッチ内容: より広いsimdgroups、ループアンローリング、Metalの10行分。標準実装との差分は0.0(完全一致)です。

フォークの上に、MLXプリミティブとして登録された4つのカスタムMetalカーネルがあります:

  • Innovation-tape GDNキャプチャ: ドラフト中にKB規模(token、gate、state-delta)タプルを記録します。棄却(rejection)時には、完全な再帰状態を復元する代わりにテープから再生します。状態スナップショットの数百MBを、極小のデルタに置き換えます。参照実装に対してビット単位で一致。
  • GraphBank: (suffix_length, depth, profile)をキーにした、mx.compileでコンパイル済みの検証グラフのキャッシュです。各検証形状に対して、コンパイル済みグラフを1つ用意し、すべてのサイクルで再利用します。キャプチャ・コミットのオーバーヘッド: サイクルあたり0.073 msで、サイクルあたり47 msの検証に比べてはるかに小さい。管理している作業に対して、桁違いに小さいです。
  • ドラフト専用の再量子化LMヘッド: 対象モデルのlm_headはモデル精度のまま維持されます。ドラフト専用のために、別の4-bit LMヘッドをメモリ上に構築します。ターゲットの精度に触れることなく、ドラフト時間を29%削減します。
  • 小さなMの検証qmv: dflash-mlxのM=16アプローチの直接の後継で、MTPLXのM=3〜6の検証形状向けに再調整されています。

Layer 1: 単一モデルのランタイム

チェックポイントは1つです。ターゲットモデルとドラフタは同じモデルです。Qwen3.6-27BにはネイティブMTPヘッドが同梱されており、MTPLXはそれを使用します。2つ目のモデルのためのRAMはゼロです。トランクのKVキャッシュは、コミット履歴(committed-history)契約を使います。これは、vLLMのCUDAリファレンスに対して、コサインが> 0.9998で深さ5まで検証されています。

Layer 2: 推測サイクル(ホットループ)

サイクルごとに: MTPヘッドがKトークンをドラフトします。各ドラフトは直前のドラフトを参照します。ターゲット側は、コンパイル済みGraphBankパスを通じて、1回のバッチ順伝播でKすべてを検証します。確率比の受容(Leviathan-Chen)が、fp32の各位置で可否を決定します。残差補正(p - q)+ は、棄却時にクリーンな置換を出力します。すべてのKが受容された場合は、ボーナストークンが無料で得られます。イノベーションテープは、受容されたGDN状態デルタをコミットし、棄却されたものをロールバックします。

Layer 3: 提供スタック

実際のAPIサーバー。ストリーミングSSE付きの、OpenAI互換の /v1/chat/completions および /v1/completions。Anthropic互換の /v1/messages。/v1/models、/health、/metrics。チャットごとのKV状態を持つエンジンセッション。Session Bank は、ターン間でウォーム・プレフィックスの“完全な状態”を保持し、fresh forwards に対して logits max_abs_diff = 0.0 で検証済み。localhost上のブラウザチャットUIで、ライブ tok/s、Markdownレンダリング、コードブロックのコピー、停止ボタン。mtplx chat によるターミナルチャット。

私が解決しなければならなかったこと

https://preview.redd.it/qc80pu52r7zg1.png?width=1200&format=png&auto=webp&s=f28b17e1c061cb4c623b02995970591132b05485

Apple Silicon上でのネイティブMTPは、デフォルトでは動きませんでした。問題は4つ、積み重なっていました

1) 再帰的な深さの崩壊

MTPを再帰的に実行すると、深さ1の後に精度が崩壊します:91% → 63% → 44% → 27% → 17%。

ネイティブMTPを試した誰もがこれを見て諦めました。私は、MTP-5でvLLMを動かしている自分の2x3090 PCにSSHし、MTPの実行を正確に追跡して、MLXとトークンごとに比較しました。結論:MLXは、推論(speculative)サイクルのたびにMTPのattention KVキャッシュをリセットしていました。vLLMはしません。MTPの履歴をサイクルをまたいで保持します。契約(コントラクト)上の修正として、深さ2の受け入れが49%から74%にジャンプしました。

2) 精度の不一致

どのプロジェクトも、量子化された4-bitトランク(幹)に対してBF16のMTPヘッドを使っていました。MTPヘッドは、受け取る隠れ状態よりも精度が高く、再帰的な予測を通じて量子化ノイズを増幅してしまいます。私は、校正済みのINT4 MTP重みをトランクに移植し、MTP精度がトランク精度と一致するようにしました。深さ3は30%から88%にジャンプしました。

3) MLXのverifyボトルネック

受け入れ(acceptance)が高くても、標準のMLXのverifyパスがあまりに高コストで、MTPはプレーンな自己回帰デコードより遅くなっていました。MLP演算がverify時間の51%を占めていました。

私は、MTPが生成する小さなverify形状向けに、MLXのMetal qmvシェーダをパッチしました(10行、より大きいsimdgroup+ループアンローリング)。さらに、効率的な状態ロールバックのためのイノベーション・テープのGDNキャプチャシステムを作り、目標(target)の確率分布を1つのMLX eval境界にバッチ化し、MTP履歴の具現化(materialisation)を後回しにしました。

verifyサイクル時間を、1回あたり約90msから約47msまで削減する4つの積み重なる最適化により、MTPはプレーンな自己回帰より遅い状態から、2.24×高速へ持っていけました。

4) TPSの減衰

長い応答(8k+トークン)ではスループットが崩壊しました。TPSが50から25へ(50%減)減衰する理由を突き止めるのに16時間を費やし、24種類のプロファイルを調べました:lazy-evalのグラフ蓄積、キャッシュ増加、状態の由来(provenance)、paged attention、所有するリカレントキャッシュ、2パスのMetal SDPA。

どれも解決しませんでした。

問題はあまりに単純でした。推論(speculative)デコードのループは、通常の自己回帰よりも大幅に重いGPU負荷を維持することが判明しました。毎サイクルで、フルのバッチ化されたverify forwardに加えて、ドラフト計算、そしてMTP履歴のメンテナンスが走ります。

追加で維持される負荷によってM5 MaxのSoCが103°Cまで上がり、macOSのデフォルトのファンカーブは反応が遅すぎました。ファンが応答する頃には、GPUはすでにダウンクロックされています。

私はCLIにMAXモードを導入しました。ThermalForgeを使い、生成開始前にファンを最大回転で固定します。さらに、プロセスが何らかの理由で死んだ場合にファンを自動へ戻す、分離型のウォッチドッグを付けます。TPSの減衰は50%から6.7%に低下し、GPUクロック保持は85.6%から97.1%に向上しました。

ファンコントローラで解決した16時間のカーネルデバッグ。

注意点

  1. 63 TPSという数値は、高いacceptanceの160トークンのプロンプトで達成しました。M5 Max上の実運用では、おそらく50〜55 TPSになるでしょう。
  2. 現在、カーネルを最適化して温度(サーマル)の問題に取り組んでいます。MAXモード(ファン100%モード)を使わない場合、熱スロットリングのために長いプロンプトでTPSが大きく低下するのが見えるはずです。
  3. もちろん、多くのMLXクオントはMTPヘッドを外しています。以前はMLX上でそれが無意味だったからです。現時点では、ほとんどのMLXモデルはMTPLXと互換性がありません。私は、MTPLXに関する自分の取り組みが、MTPヘッドを備え、推論向けに最適化されたMLXクオントを作る人をもっと増やすことを期待しています。

その間は、私の公式の Qwen 3.6 27B MTPLX Optimised を実行できます。

HuggingFace

。CLIがセットアップとダウンロードを簡単にします。

MLXクオントを公開する場合は、MTPヘッドを残してください。27Bモデルだと約200MBで、メモリコストはほとんどゼロで、いまや2.25×の高速化価値があります。

このプロジェクトに対する皆さんの考えや貢献をとても楽しみにしています。MLX上でローカルLLMを、より速く、より誰にとっても現実的にするために。

GitHub: https://github.com/youssofal/MTPLX

submitted by /u/YoussofAl
[link] [comments]