AMD GPU上でGGUFモデルの層の形状をプロファイルし、実行時にllama.cppが読み込む最適なカーネル設定を生成するツールを作りました。再コンパイルは不要です。
問題: llama.cppのMMVQカーネルは、形状に関係なくすべての層で同じスレッド/ブロック構成を使います。1024行のGQAプロジェクションは、17408行のFFN層とまったく同じ設定になります。これは特にRDNA3で大きなパフォーマンス損失につながります。
解決策: kernel-anvilはあなたのGGUFを読み取り、一意なGEMV形状を特定し、実際のGPU上でそれぞれをプロファイルして、JSONコンフィグファイルを書き込みます。llama.cppのmmvq.cuに小さなパッチを入れることで、起動時にこの設定を読み込み、形状ごとに最適なnwarpsとrows_per_blockを適用します。
7900 XTXでの結果:
- Qwen3.5-27B Q4_K_M: 12 tok/s -> 27 tok/s(2.25倍)
- Qwen3-8B Q4_K_M 個別カーネル: 形状ごとに1.2x〜2.1x
使い方:
pip install -e . kernel-anvil gguf-optimize ~/Models/my-model.gguf # <1 second SMITHY_CONFIG=~/.cache/smithy/my-model.json llama-server -m my-model.gguf -ngl 999 プロファイル+スイープ全体は1秒未満です。193テスト。RDNA3(7900 XTX/XT、7800 XT)のどのGGUFモデルでも動作します。CUDA/Metal対応は予定されています。
GitHub: https://github.com/apollosenvy/kernel-anvil
llama.cppのパッチ(mmvq.cuに約50行)はブランチsmithy-shape-configsにあります。より多くのテストが進んだらPRとして本流に取り込むことも検討しています。
背景: これは最近のカーネル最適化の論文群の流れから始まりました―― KernelSkill、CUDA Agent、KernelFoundry、TritonForge――いずれもNVIDIA専用を対象にしています。さらに、The Residual Stream Is All You Need(Qasimら、2026年3月)からも着想を得て、AMD上で推論をボトルネックにしているのは実際には何なのかを考えるようになりました。分かったのは、思ったよりずっと単純なことでした。つまり、llama.cppの汎用的なカーネル設定が、各モデルが実際に使っている特定の形状に最適化されていないのです。
既存のカーネル最適化ツールはすべてNVIDIAを対象にしています。これはAMD向けとして初めてのものです。
[link] [comments]



