Bonsai 2 (ternary) を Strix Halo の ROCm で速く動かす llama.cpp パッチ
Ryzen AI Max+ 395 / Radeon 8060S(gfx1151、Strix Halo) で、PrismML の三値量子化モデル
Ternary-Bonsai-2-27B(PTQ1_0) を ROCm/HIP で動かすためのパッチです。
Bonsai が対応している PrismML の llama.cpp フォーク(prism ブランチ)に当てて使います。
本家フォークの HIP ビルドでも動きますが、RDNA3.5 では遅い経路や使われていない経路が多かったので、それを直しました。
効果(同じマシンで計測)
| 項目 | 変更前 (HIP) | このパッチ |
|---|---|---|
| プロンプト処理 pp512 | 268 t/s(本家フォークそのまま) | ~340 t/s |
| プロンプト処理 pp2048 (ubatch 2048) | 294 t/s ※ | ~395 t/s |
| 〃 8k トークン文脈の後 | 256 t/s ※ | 365 t/s |
| 〃 24k トークン文脈の後 | 206 t/s ※ | 294 t/s |
| 生成(MTP 投機デコード、温度管理込み) | 34.5 t/s(本家フォークそのまま。MTPなしは 28.6) | 42.6 t/s |
※ fp16 展開カーネルだけ改良した途中段階の値です。本家フォークそのままだとさらに遅くなります。
- 生成の数値は sudoingx/Ternary-Bonsai-2-27B-PTQ1_0-MTP-GGUF の
mtp-leanと--spec-type draft-mtp --spec-draft-n-max 1を使ったものです。 - パープレキシティは変わりません(4.94 → 4.93、誤差の範囲)。
test-backend-opsの関連テスト(MUL_MAT / FLASH_ATTN_EXT / GATED_DELTA_NET / CONCAT など)はすべて通っています。
何を変えたか
- MTP の検証(2トークン同時の行列×ベクトル)を高速化
- フォーク内の PTQ1_0 用の複数列カーネルを HIP でも有効にしました。
- HIP の
__byte_permはソフトウェア実装で遅いので、ハードウェア命令のv_perm_b32に置き換えました。 dp4aを RDNA3 のsudot4命令にしました。
- プロンプト処理
- PTQ1_0 → fp16 の専用展開カーネルを HIP でも使うようにしました。gfx1151 では int8 の MMQ より fp16 展開+rocBLAS の方が速いためです。
- Gated DeltaNet(線形アテンション層)の prefill 専用カーネルを書きました。5.4倍速く、大きな ubatch でも遅くならなくなりました。
- head size 256 の FlashAttention を RDNA3 の WMMA で新しく実装しました(
fattn-wmma-d256.cuh)。本家の mma 版は D=256 だとレジスタが溢れて3倍遅く、GQA=6 では NaN も出ていました。新カーネルは 19 TFLOPS 出て、タイル版の 7 TFLOPS から大きく上がります。 - 転置付き concat の高速カーネルを AMD でも有効にしました(以前は DGX Spark だけ)。
- おまけ:Vulkan 用の PTQ1_0 行列積ロードの改善(
vulkan-ptq1-mul_mm.patch、pp512 が 162 → 243 t/s)。
使い方
1. ソースを用意してパッチを当てる
git clone https://github.com/PrismML-Eng/llama.cpp
cd llama.cpp
git checkout 88c4bc60b9c9578f134385be9535e853f2db9b9f
git apply /path/to/hip-ptq1-mtp-prefill.patch
このコミットで動作を確認しています。新しいコミットでも当たるかもしれませんが、保証はできません。
2. ビルド(ROCm 7.2)
cmake -B build-hip -DGGML_HIP=ON -DGPU_TARGETS=gfx1151 -DCMAKE_BUILD_TYPE=Release
cmake --build build-hip -j 16 --target llama-server llama-bench
ROCm 7.2 が入った環境なら、どこでもビルドできるはずです。作者は ignatberesnev/comfyui-gfx1151:v0.2 コンテナの中でビルドしました。
3. 起動例
./build-hip/bin/llama-server -m Ternary-Bonsai-2-27B-PTQ1_0-mtp-lean.gguf \
-ngl 999 -fa on -c 262144 -np 1 -b 2048 -ub 2048 --jinja \
--spec-type draft-mtp --spec-draft-n-max 1 \
--temp 1.0 --top-p 0.95 --top-k 20 --min-p 0 --host 0.0.0.0 --port 11434
-b 2048 -ub 2048がいちばん速くなりました。- 262144 トークン文脈でも KV キャッシュは約 16GB です(アテンション層が 16 層しかないため)。
切り替え用の環境変数
比較や不具合の切り分けに使えます。
| 変数 | 効果 |
|---|---|
GGML_HIP_FA_D256=0 |
新しい WMMA FlashAttention を使わない |
GGML_HIP_GDN_PREFILL=0 |
新しい Gated DeltaNet prefill カーネルを使わない |
GGML_HIP_PTQ1_0_MMQ=1 |
PTQ1_0 の int8 MMQ 経路を使う(gfx1151 では遅い) |
注意
- 確認したのは gfx1151(Strix Halo、64GB)だけです。RDNA3(gfx1100 など)でも動くはずですが、試していません。
- Strix Halo の GPU は重い計算中に約 90W の電力上限に当たり、クロックが 2.2GHz 前後まで下がります。また、長く回すと熱でさらに遅くなります。冷却次第で数値は変わります。
- rocprofv3 で計測するときは
GGML_CUDA_DISABLE_GRAPHS=1が必要です。
クレジット
- ggml / llama.cpp(MIT)
- PrismML(Bonsai モデルとフォーク)
- sudoingx(MTP lean GGUF)
パッチは元の llama.cpp と同じ MIT ライセンスです。
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support