EVO-X2 (Ubuntu) で amd-strix-halo-toolboxes を使って高速推論
AMD Strix Halo Llama.cpp Toolboxes は、EVO-X2 などの AMD Ryzen AI Max “Strix Halo” アーキテクチャのPC向けに、最新のバックエンドとビルド済み Llama.cppをセットでコンテナにしたツールキット。
ベンチマークを見ると、かなりのスピードで推論できることがわかる。
【以下抜粋】
Prompt Processing (pp512) — tokens/second
Model | rocm6_4_3-rocwmma | vulkan_amdvlk | vulkan_radv |
---|---|---|---|
gpt-oss-120b | 732.72 | 540.81 | 255.50 |
gpt-oss-20b | 1480.28 | 1467.61 | 732.35 |
Text Generation (tg128) — tokens/second
Model | rocm6_4_3-rocwmma | vulkan_amdvlk | vulkan_radv |
---|---|---|---|
gpt-oss-120b | 45.14 | 48.25 | 50.41 |
gpt-oss-20b | 64.45 | 69.47 | 72.05 |
LM Studio のデフォルトが Vulkan llama.cpp なので、Text Generation の値はほぼ同じだと思われる(実際、大差ない)のだが、Prompt Processing の速度の差が大きい。
コーディングエージェントなどで使う場合はこの差は大きいはず。
前提
- GMKtec EVO-X2 128GB / Ubuntu 24.04.03 LTS / kernel: 6.11.0-29-generic
- AMDGPU driver と ROCm をインストール済み
使い方
# 依存をインストール
sudo apt update
sudo apt install podman podman-toolbox
# amdvlk(おすすめ)の toolbox を作成
toolbox create llama-vulkan-amdvlk \
--image docker.io/kyuz0/amd-strix-halo-toolboxes:vulkan-amdvlk \
-- --device /dev/dri --group-add video --security-opt seccomp=unconfined
# コンテナに入る
toolbox enter llama-vulkan-amdvlk
# llama-server を起動
llama-server \
-hf ggml-org/gpt-oss-120b-GGUF \
--alias gpt-oss-120b \
--n-gpu-layers 999 \
--flash-attn on \
--ctx-size 0 \
--threads 32 \
--jinja \
--no-mmap \
--temp 1.0 \
--min-p 0.0 \
--top-p 1.0 \
--top-k 0.0 \
--host 0.0.0.0 --port 8080
注意
- mxfp4のモデルを使う
- 推奨パラメーターはunslothのページを参照
- 私の記憶ではこれで動作したのですが、この場合も後述の
/dev/dri
の権限付与が必要かも知れません
ROCm系はさらに工夫がいる。
# ROCm 6.4.3 の toolbox を作成
toolbox create llama-rocm-6.4.3-rocwmma \
--image docker.io/kyuz0/amd-strix-halo-toolboxes:rocm-6.4.3-rocwmma \
-- --device /dev/dri --device /dev/kfd \
--group-add video --group-add render --group-add sudo --security-opt seccomp=unconfined
Ubuntu だと、これだけではGPUを掴めない。
toolbox enter llama-rocm-6.4.3-rocwmma
llama-server <options>
# ...
# ==> warning: no usable GPU found, --gpu-layers option will be ignored
# ... ^C
id
# uid=1000(me) gid=1000(me) groups=1000(me),10(wheel)
ls -l /dev/dri/renderD*
# crw-rw----+ 1 nobody nobody 226, 128 Sep 2 01:19 /dev/dri/renderD128
ls -l /dev/kfd
# crw-rw---- 1 nobody nobody 236, 0 Sep 2 01:19 /dev/kfd
どうやらFedora向けのツールなのでuser idが噛み合わず、下記のような状態になっている。
- 自分が
render
video
グループに入っていない -
/dev/dri
/dev/kfd
自体は見えているが、所有者がnobody
になっているのでアクセスできない(render
,video
グループに自分を追加しても効果がない)
これを修正する。
# 一度コンテナを出る
exit
下記のページに、「システム上のすべてのユーザーにGPUのアクセス権を付与する」設定があるので、これを適用する。
/etc/udev/rules.d/70-amdgpu.rules
を作成して以下を保存。
KERNEL=="kfd", MODE="0666"
SUBSYSTEM=="drm", KERNEL=="renderD*", MODE="0666"
ルールをリロード(再起動もいるかも)
sudo udevadm control --reload-rules && sudo udevadm trigger
これでtoolboxコンテナ内のユーザーからもGPUが見えるようになる。
# もう一度コンテナに入る
toolbox enter llama-rocm-6.4.3-rocwmma
ls -l /dev/dri/renderD128
# crw-rw-rw-+ 1 nobody nobody 226, 128 Sep 8 19:52 /dev/dri/renderD128
ls -l /dev/kfd
# crw-rw-rw-+ 1 nobody nobody 236, 0 Sep 7 20:37 /dev/kfd
/opt/rocm/bin/rocminfo
# ==>GPU情報が表示されるはず
llama-server # オプションは先ほどと同じでOK
これでいけるはず。
参考ベンチマーク gpt-oss-120b llama-bench (token/second)
backend => | rocm6_4_3-rocwmma | rocm-7rc-rocwmma | vulkan-amdvlk | vulkan-radv |
---|---|---|---|---|
pp512 | 772.60 ± 4.71 | 767.49 ± 4.75 | 756.31 ± 5.30 | 418.15 ± 3.50 |
tg128 | 45.72 ± 0.12 | 45.56 ± 0.69 | 48.34 ± 0.04 | 50.58 ± 0.07 |
vulkan-amdvlk が総合的に優秀なので私はこれを使っています。
なぜか私の環境では kyuz0 氏の環境よりPPが大幅に速いです。
2025/9/13 更新 コンテナなしのベンチ
正直、VulkanでのLlama.cppビルドは難しくないのでコンテナを使う意味があまりないことに気づいた。素でビルドして動かした方が速いです。
backend => | AMDVLK FA on |
AMDVLK FA off |
RADV FA on |
RADV FA off |
---|---|---|---|---|
pp512 | 753.51 ± 3.51 | 658.53 ± 3.72 | 471.20 ± 2.80 | 420.53 ± 1.91 |
tg128 | 50.77 ± 0.07 | 52.20 ± 0.05 | 51.99 ± 0.02 | 52.44 ± 0.14 |
LLama.cpp Vulkan のビルド
# 依存のインストール
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential cmake ninja-build clang mold ccache libcurl4-openssl-dev \
libomp-dev libvulkan-dev vulkan-tools mesa-vulkan-drivers \
git radeontop glslc glslang-tools
git clone --recursive https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
# 2回目以降
git clean -xdf
git pull
git submodule update --recursive
# ビルドフラグ設定 (moldは安定重視ならlldでもOK)
export CC=clang
export CXX=clang++
export LDFLAGS="-fuse-ld=mold"
# CMake 構成(Vulkan有効、/usr/local にインストール)
cmake -S . -B build -G Ninja \
-DGGML_VULKAN=ON \
-DCMAKE_BUILD_TYPE=Release
# コンパイル
cmake --build build -j"$(nproc)"
# インストール
sudo cmake --install build
# 念の為共有ライブラリのキャッシュ更新
sudo ldconfig
# 確認
which llama-server
# テスト
llama-bench \
--progress \
--model ~/.cache/llama.cpp/ggml-org_gpt-oss-120b-GGUF_gpt-oss-120b-mxfp4-00001-of-00003.gguf \
--threads 32 \
--n-gpu-layers 999 \
--flash-attn 1 \
--mmap 0
AMDVLKのインストール
上記手順で amdgpu-install
をすでに入れていれば amdvlk
パッケージで入る(のだが、十分にドキュメント化されていないようで公式ドキュメントが見当たらない)。
sudo apt update
sudo apt install amdvlk
amdgpu-install
を使っていなければ下記。
wget -O /tmp/amdvlk_amd64.deb \
https://github.com/GPUOpen-Drivers/AMDVLK/releases/download/v-2025.Q2.1/amdvlk_2025.Q2.1_amd64.deb
sudo apt install -y /tmp/amdvlk_amd64.deb
システムワイドには RADV のほうが安定しているので、そちらを優先する環境変数を入れておく。
export AMD_VULKAN_ICD=RADV
必要なときだけ下記のように AMDVLK
を明示指定する。
Llama.cppのビルドは同じものでOK。
AMD_VULKAN_ICD=AMDVLK llama-bench \
--progress \
--model ~/.cache/llama.cpp/ggml-org_gpt-oss-120b-GGUF_gpt-oss-120b-mxfp4-00001-of-00003.gguf \
--threads 32 \
--n-gpu-layers 999 \
--flash-attn 1 \
--mmap 0
繰り返しビルドする用
#!/usr/bin/env bash
set -euo pipefail
export CC=clang
export CXX=clang++
export LDFLAGS="-fuse-ld=mold"
cd ./llama.cpp
git clean -xdf
git pull
git submodule update --recursive
cmake -S . -B build -G Ninja \
-DGGML_VULKAN=ON \
-DCMAKE_BUILD_TYPE=Release
cmake --build build -- -j"$(nproc)"
sudo cmake --install build
sudo ldconfig