前回の記事で、EVO-X2 (Ryzen AI Max+ 395) に Ubuntu 24.04+ROCm を導入しました。今回は、ROCm(HIP/rocBLAS)有効の llama.cpp をビルドしてGPU実行できる状態にして、ローカルLLMを動作させ、モニタを実施します。
1. ゴール
- Python 仮想環境を作って モデル取得系を隔離
- Hugging Face から Phi-3.5 Mini (GGUF) をダウンロード
- llama.cpp を GPUオフロード段階的に 実行(-ngl 1 → 8 → 16 → 32)
- rocm-smi で温度/電力/利用率/VRAM を 軽量モニタ
- 生成速度(tok/s)を比較し確認
2. Python 仮想環境のセットアップ
いろいろ始める前に、Python仮想環境(venv)を整備します。なぜかというと、
- huggingface_hub や hf_transfer を安全に更新できる
- 依存衝突の回避 → プロジェクトごとに分離
- 再現性の担保 → 壊れたら作り直しが速い
- sudo pip を避け、安全にユーザー権限で完結
という理由からです。
作成&有効化&ツール更新
# 作成
python3 -m venv ~/venvs/evox2-llm
# 有効化(プロンプト先頭に (evox2-llm) が付けばOK)
source ~/venvs/evox2-llm/bin/activate
# ツール更新
(evox2-llm) python -m pip install -U pip setuptools wheel
3. モデル取得
Hugging Face Hub, Python API 直呼び
CLI は PATH 依存で詰まりがちなので、Python API を推奨。大容量転送高速化を有効化。
# 転送高速化
(evox2-llm) export HF_HUB_ENABLE_HF_TRANSFER=1
# モデル保存先
(evox2-llm) mkdir -p ~/models/phi-3.5-mini-gguf
GGUFモデルを取得します。
(evox2-llm) python - <<'PY'
from huggingface_hub import hf_hub_download
dst = hf_hub_download(
repo_id="microsoft/Phi-3.5-mini-instruct-GGUF",
filename="Phi-3.5-mini-instruct-IQ4_XS.gguf",
local_dir="/home/nabe/models/phi-3.5-mini-gguf",
)
print("DOWNLOADED_TO:", dst)
PY
成功した場合のログ
DOWNLOADED_TO: /home/nabe/models/phi-3.5-mini-gguf/Phi-3.5-mini-instruct-IQ4_XS.gguf
$ ls -lh ~/models/phi-3.5-mini-gguf
-rw-rw-r-- 1 nabe nabe 2.0G ... Phi-3.5-mini-instruct-IQ4_XS.gguf
目的の GGUF が 2.0GB 前後で落ちていればOK
4. llama.cpp のビルド(ROCm/HIP 対応)
Githubから取得して、ビルド用ディレクトリを作成。
git clone https://github.com/ggerganov/llama.cpp.git
cd ~/llama.cpp
mkdir -p build && cd build
ROCm (HIPBLAS) を有効にして CMake を実行
GGML_HIP=ON と GGML_HIPBLAS=ON が鍵。ROCM_PATH は通常 /opt/rocm。
cmake \
-DGGML_HIP=ON \
-DGGML_HIPBLAS=ON \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_PREFIX_PATH=/opt/rocm \
..
make -j$(nproc)
- 補足:libggml-hipblas.so が必ずできるとは限らない(静的リンクや実行ファイル内に組み込まれる構成もある)。実行時ログで ROCm 利用が出ていればOK。
実行時に見るべきログ(判定の決め手)
ggml_cuda_init: found 1 ROCm devices:
Device 0: AMD Radeon Graphics, gfx1151 ...
...
llama_model_load_from_file_impl: using device ROCm0 (AMD Radeon Graphics) ...
...
load_tensors: offloading N/33 layers to GPU
これが出れば ROCm バックエンドで実行できています。
5. 段階的 GPU オフロード(-ngl 1→8→16→32)
-ngl(GPUに載せる層数)を増やし、tok/s が伸びるか、電力・温度・VRAMはどうなるかを確認していきます。
共通条件:
- モデル = Phi-3.5-mini-instruct-IQ4_XS.gguf(約1.92GiB)
- スレッド = -t 8、プロンプトは短文(日本語一文応答)
~/llama.cpp/build/bin/llama-cli \
-m ~/models/phi-3.5-mini-gguf/Phi-3.5-mini-instruct-IQ4_XS.gguf \
-p "1文で自己紹介。" \
-ngl <1|8|16|32> -t 8
実行ログ(抜粋)
# 起動時に ROCm を認識:
ggml_cuda_init: found 1 ROCm devices:
Device 0: AMD Radeon Graphics, gfx1151 ...
llama_model_load_from_file_impl: using device ROCm0 ... - 65370 MiB free
最終行に実際の出力
== Running in interactive mode. ==
<略>
1文で自己紹介。
私はAIとして、自己紹介する中で人間の形ではないが、情報を提供し、質問に答え、
タスクを支援するプログラムです。
動きました。(パチパチ)
次に、GPUにオフロードを増やすとスループットがどうなるか実測します。
# 1秒間隔で温度/電力/利用率/VRAM変化を見るシンプル版
while true; do
ts=$(date '+%H:%M:%S')
/opt/rocm/bin/rocm-smi --showtemp --showpower --showuse --showmeminfo vram -d 0 \
| awk -v ts="$ts" '
/Temperature \(Sensor edge\)/{temp=$NF}
/Current Socket Graphics Package Power/{pwr=$(NF)}
/GPU use/{use=$(NF)}
/Total VRAM Memory Used/{vram=$(NF)}
END{printf "%s Temp=%s Power=%sW Use=%s VRAM=%s\n", ts,temp,pwr,use,vram}'
sleep 1
done
実測スループット
-ngl 1
eval time ≈ 5615 ms / 255 runs → 約 45 tok/s
-ngl 8
eval time ≈ 5229 ms / 255 runs → 約 49 tok/s
-ngl 16
eval time ≈ 4596 ms / 255 runs → 約 55 tok/s
-ngl 32
eval time ≈ 3159 ms / 255 runs → 約 81 tok/s
結果を表にまとめました。
| -ngl | tok/s | VRAM使用目安 | GPU利用率目安 | 電力ピーク目安 |
|---|---|---|---|---|
| 1 | 45.4 | < 0.2 GB 相当 | 〜4% | 〜112 W |
| 8 | 48.8 | ~1.41 GB | 〜15% | 〜117 W |
| 16 | 55.5 | ~2.30 GB | 〜33% | 〜113 W |
| 32 | 80.7 | ~4.06 GB | 80–87% | 80〜90 W 帯 |
おー!なかなかいい値じゃないですか。
チャッピーの分析では
- -ngl を上げるほど tok/s は素直に向上
- VRAM使用量は段階的に増加。EVO-X2のiGPU(大容量UMA)のおかげで 4GB級まで余裕あり
- 電力は “必ずしも直線的に増えない”。-ngl 32 は効率が良く、高いtok/sに対し消費は抑えめという印象。
6. まとめ(今回の到達点)
- ROCm(HIP)有効の llama.cpp で EVO-X2 の iGPU を使って Phi-3.5-mini(IQ4_XS)を推論
- -ngl 1→32 に連れて 45.4 → 80.7 tok/sへ改善。VRAM/電力/温度の挙動も把握