Bonsai 2 (ternary) を Strix Halo の ROCm で速く動かす llama.cpp パッチ

English

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 など)はすべて通っています。

何を変えたか

  1. MTP の検証(2トークン同時の行列×ベクトル)を高速化
    • フォーク内の PTQ1_0 用の複数列カーネルを HIP でも有効にしました。
    • HIP の __byte_perm はソフトウェア実装で遅いので、ハードウェア命令の v_perm_b32 に置き換えました。
    • dp4a を RDNA3 の sudot4 命令にしました。
  2. プロンプト処理
    • 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 だけ)。
  3. おまけ: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 が必要です。

クレジット

パッチは元の llama.cpp と同じ MIT ライセンスです。

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support