Qwen3 Coder Next llama.cppグラフ最適化 — 最大38%の推論高速化
ggerganovがllama.cppのコンピュートグラフを再構成し、Qwen3 Coder Next 80Bモデルの推論速度を最大38%向上させた最適化手法とベンチマーク結果を解析します。
概要
llama.cppのコア開発者ggerganovが、Qwen3 Coder Nextモデルのコンピュートグラフを最適化するPR #19375を公開しました。不要なテンソルコピー演算を排除し、グラフレベルで推論パスを再構成することで、M2 Ultraで最大38%、DGX Sparkで最大38%の速度向上を実現しています。Reddit r/LocalLLaMAで177ポイント以上の大きな注目を集めたこの最適化の核心を見ていきましょう。
核心アイデア:グラフレベル最適化
今回の最適化の核心はシンプルです。ggmlコンピュートグラフから不要なテンソルコピー演算を除去することです。
MoE(Mixture of Experts)アーキテクチャであるQwen3 Coder Nextは、ルーターがアクティベートするエキスパートを選択し、各エキスパートの出力を結合する過程で多くの中間テンソルコピーが発生します。従来の実装ではこれらのコピーが安全性のために過度に挿入されていましたが、ggerganovは実際に必要なコピーだけを残し、残りを排除しました。
graph LR
A[入力テンソル] --> B[ルーター]
B --> C[Expert 1]
B --> D[Expert 2]
B --> E[Expert 3]
C --> F[出力結合]
D --> F
E --> F
F --> G[次のレイヤー]
style A fill:#00B4D8,color:#fff
style F fill:#FFB703,color:#000
style G fill:#00B4D8,color:#fff
ベンチマーク結果
M2 Ultra性能比較
Qwen3 Coder Next 80B.A3Bモデルを様々な量子化レベルでテストした結果です。
Q4_0量子化
| テスト | 従来 (t/s) | 最適化 (t/s) | 速度向上 |
|---|---|---|---|
| pp1(単一トークン) | 37.92 | 51.99 | 1.37x |
| pp8(8トークンバッチ) | 137.75 | 176.36 | 1.28x |
| pp512(プロンプト) | 930.70 | 1125.73 | 1.21x |
| pp2048(長文プロンプト) | 1049.91 | 1352.31 | 1.29x |
| tg32(生成) | 38.02 | 50.39 | 1.33x |
Q4_K_M量子化
| テスト | 従来 (t/s) | 最適化 (t/s) | 速度向上 |
|---|---|---|---|
| pp1 | 34.00 | 46.47 | 1.37x |
| pp2048 | 977.30 | 1232.47 | 1.26x |
| tg32 | 34.63 | 46.43 | 1.34x |
Q8_0量子化
| テスト | 従来 (t/s) | 最適化 (t/s) | 速度向上 |
|---|---|---|---|
| pp1 | 34.38 | 43.98 | 1.28x |
| pp2048 | 1047.39 | 1338.82 | 1.28x |
| tg32 | 33.75 | 43.78 | 1.30x |
DGX Spark性能比較
NVIDIA DGX Sparkでも有意な性能向上が確認されています。
| 量子化 | テスト | 従来 (t/s) | 最適化 (t/s) | 速度向上 |
|---|---|---|---|---|
| Q4_0 | pp512 | 1055.58 | 1161.67 | 1.10x |
| Q4_0 | pp2048 | 1059.00 | 1324.66 | 1.25x |
| Q4_0 | tg32 | 43.11 | 59.58 | 1.38x |
| Q8_0 | pp2048 | 1009.43 | 1246.61 | 1.23x |
| Q8_0 | tg32 | 31.13 | 39.68 | 1.27x |
DGX Sparkのtg32(トークン生成)でQ4_0基準38%の速度向上を達成した点が注目に値します。
技術的背景:関連バックエンド最適化
このPRは単独で存在するものではありません。グラフ最適化が効果を発揮するには、各バックエンド(Metal、CUDA、Vulkan)で非連続(non-contiguous)テンソルを直接処理できる必要があります。
Metal(Apple Silicon)
- 適応型CPU/GPUインターリーブ(#19369):ノード数に応じたCPU/GPU作業の動的分配
- バイナリカーネル統合(#19390):重複カーネルコードの除去
- ユニタリ演算統合(#19490):単項演算処理の改善
- 非連続テンソルL2正規化サポート(#19502)
- 並行性改善(#19555)
CUDA(NVIDIA GPU)
Vulkan
注意点:BF16テンソル問題
一部のGGUFファイルで1次元BF16テンソルが誤って含まれている場合があります。これはMetalなどのバックエンドでパフォーマンス低下を引き起こします。#19606でffn_gate_inp_shexpテンソルをF32として保存するよう修正し、この問題を解決しています。
今後の予定
ggerganovは以降の追加最適化も予告しています。
- Qwen3ファミリーのコード重複除去(#19597):delta-netグラフの共有
ggml_build_forward_select()の活用:グラフを定数化してさらなる最適化余地を確保- 専用delta net ggml演算の導入(#19504):より効率的なカーネル実行
ローカルLLMユーザーへの影響
今回の最適化が意味するところをまとめます。
- Apple Siliconユーザー:M2 Ultra基準で80B MoEモデルをtg32で約50 t/sで実行可能。リアルタイム対話に十分な速度です。
- NVIDIA GPUユーザー:DGX Sparkでも20〜38%の速度向上。CUDAグラフサポートでさらなる最適化が期待されます。
- 量子化の選択:Q4_0が最大の速度向上を示しますが、Q4_K_MとQ8_0でも一貫した20〜37%の改善が確認されています。
- コード変更不要:llama.cppを最新バージョンに更新するだけで自動的に適用されます。
結論
ggerganovによる今回のグラフレベル最適化は、llama.cppのMoEモデル推論性能を大幅に向上させました。単にカーネルを最適化するのではなく、コンピュートグラフ自体を再構成するアプローチが印象的です。特に複数のバックエンド(Metal、CUDA、Vulkan)で非連続テンソルサポートを拡大する並行作業と組み合わせることで、ローカルLLM推論の性能限界を一段階引き上げています。
Qwen3 Coder Nextのような MoEモデルをローカルで実行しているユーザーは、llama.cppを最新バージョンに更新してこの性能向上をすぐに体感してみてください。
参考資料
他の言語で読む
- 🇰🇷 한국어
- 🇯🇵 日本語(現在のページ)
- 🇺🇸 English
- 🇨🇳 中文
この記事は役に立ちましたか?
より良いコンテンツを作成するための力になります。コーヒー一杯で応援してください!☕