EVO-X2などのAMD Ryzen AI NPUをLinuxでLLMに使う

Open WebUIで、モデルを設計したとたん、もっさもっさ動いていたのがキビキビ動くようになって特にメインモデルの Qwen 3.5 9B が安定して動くようになった。Open WebUIを本気で使うなら、モデル設定は絶対にやった方がよい。
 
ところで、EVO-X2などに搭載されているRyzen AI Max+ 395やRyzen AI 9 HX 370には、盲腸というか脾臓というか、あまり使い道のないNPUがついている。それを活用しようという話。Macでも、Apple Neural Engine向けにApfelのような実装がある。軽量のLLM用途だったら、Open WebUIやらOllama/llamaは要らない。OS、デバイス標準のLLMで十分。Open WebUIでは、通常のチャット以外にも、会話タイトル、タグ、フォローアップ質問、クエリ補助などを内部的にLLMで生成している。何も設定しないと、こうした軽作業までメインモデルが担当する。
 
GPUだけだと、いわば、F1のレースの帰りにF1カーでコンビニ行くような動きをする。
 
Open WebUIには Task Model という設定があり、こうした軽作業を小さいモデルへ割り振ることができる。ただし、Ollama側の小型モデルに任せると別の問題が出ることがある。たとえば OLLAMA_MAX_LOADED_MODELSなどの制約により、せっかくロードしていたメインモデル、つまりF1カー側がアンロードされてしまう場合がある。
 
そこで、NPUの軽量LLMの出番となる。NPU上の軽量LLMは、Ollamaで動いているわけでもなく、CPUでもGPUでもない。NPUという別枠で動くため、GPU上のメインLLMに干渉しにくい。もちろんNPUもメインメモリを使うが、軽量モデルに限定すれば消費量は小さい。EVO-X2やMacのようなUMA構成のマシンでは、NPUはこの手の軽作業に向いている。単純で短いLLM処理のために、わざわざGPU上の大きなモデルを呼び出す必要はない。応答も速く、待たされる感覚も少ない。
 
NPUを併用すると、F1カーでコンビニに行かなくてよくなる。
 
ちなみに、現時点のStrix Halo世代のNPU性能は、GPUと比較するとかなり控えめである。消費電力も低いが、推論速度もGPUの数分の一程度という報告が多い。そのため、大規模LLMではなく、Task Modelのような軽量用途に割り切って使うのがちょうど良い。
 
 
閑話休題
 

NPUの利用

NPUを使うと以下のような振り分けができる。
用途
実行先
Main Chat
Ollama + ROCm
Agent
Ollama
NPU
軽量Task Model
OCR
将来NPU
Whisper
将来NPU

AMD NPUドライバのインストール

Strix Haloには、NPUもついているのでNPUのドライバをいれて、NPUを軽量LLMとして動かしてみる。
 
確認環境:
– Ubuntu 26.04 ( Kernel 7.0.0-15-generic )
– EVO-X2 (Ryzen AI MAX+ 395 / Strix Halo )
 
注意点
  • AMD Ryzen AI Software 1.7.1 の Linux版debは Ubuntu 24.04向けである。現時点では正式サポート対象外の可能性があるため自己責任で実施すること。
  • Secure Boot有効時はDKMS module署名問題で読み込めない可能性がある。その場合はSecure Bootを無効化する。
 

0. AMD Ryzen AI XRT package の入手

AMD Ryzen AI Software 1.7.1 の Linux NPU XRT ZIP (RAI_1.7.1_Linux_NPU_XRT.zip ) を入手する。
ただし、アカウントが必要。さらに輸出許可書(住所を入れる)必要がある。

1. AMD Ryzen AI XRT package を配置

/root/RAI_1.7.1_Linux_NPU_XRT.zip

2. 展開

cd /root
 
unzip ./RAI_1.7.1_Linux_NPU_XRT.zip
展開後:
xrt_plugin.2.21.260102.53.release_24.04-amd64-amdxdna.deb
xrt_202610.2.21.75_24.04-amd64-base.deb
xrt_202610.2.21.75_24.04-amd64-base-dev.deb
xrt_202610.2.21.75_24.04-amd64-npu.deb

3. DKMS導入

apt update
 
apt install -y \
dkms \
build-essential \
linux-headers-$(uname -r)

4. AMD XRT stack 導入

apt install -y \
./xrt_202610.2.21.75_24.04-amd64-base.deb \
./xrt_202610.2.21.75_24.04-amd64-base-dev.deb \
./xrt_202610.2.21.75_24.04-amd64-npu.deb \
./xrt_plugin.2.21.260102.53.release_24.04-amd64-amdxdna.deb

5. amdxdna driver 確認

dmesg | grep amdxdna
期待:
カーネル付属のドライバー (0.7.0)から新しいドライバーに更新されている。
[    4.543530] amdxdna 0000:c7:00.1: [drm] Load firmware amdnpu/17f0_11/npu_7.sbin
[    4.543559] amdxdna 0000:c7:00.1: enabling device (0000 -> 0002)
[    4.684047] [drm] Initialized amdxdna_accel_driver 0.7.0 for 0000:c7:00.1 on minor 0
[201354.181644] amdxdna 0000:c7:00.1: [drm] Load firmware amdnpu/17f0_11/npu_7.sbin
[201354.298775] [drm] Initialized amdxdna_accel_driver 0.7.0 for 0000:c7:00.1 on minor 0
[201744.114219] amdxdna: loading out-of-tree module taints kernel.
[201744.114228] amdxdna: module verification failed: signature and/or required key missing – tainting kernel
[201744.120366] amdxdna 0000:c7:00.1: PASID address mode enabled
[201744.218044] [drm] Initialized amdxdna_accel_driver 1.0.0 for 0000:c7:00.1 on minor 0

6. XRT環境変数

cat <<‘EOF’ >/etc/profile.d/xrt.sh
# XRT environment for AMD Ryzen AI NPU.

export PATH=/opt/xilinx/xrt/bin:$PATH
export LD_LIBRARY_PATH=/opt/xilinx/xrt/lib:$LD_LIBRARY_PATH

# Avoid locale warnings from Lemonade / FLM / snap environment.
export LANG=C.UTF-8
export LC_ALL=C.UTF-8
EOF

source /etc/profile.d/xrt.sh

7. NPU認識確認

Ubuntu repository版の XRT package (libxrt-utils/libxrt2) と AMD公式XRT package が混在する可能性がある。基本的には AMD公式XRT package を優先利用する。
/opt/xilinx/xrt/bin/xrt-smi にあるファイルが本物。
which xrt-smi
 
xrt-smi examine
期待:
System Configuration
  OS Name              : Linux
  Release              : 7.0.0-15-generic
  Machine              : x86_64
  CPU Cores            : 32
  Memory               : 62903 MB
  Distribution         : Ubuntu 26.04 LTS
  GLIBC                : 2.43
  Model                : NucBox_EVO-X2
  BIOS Vendor          : American Megatrends International, LLC.
  BIOS Version         : EVO-X2 1.12
  Processor            : AMD RYZEN AI MAX+ 395 w/ Radeon 8060S
XRT
  Version              : 2.21.75
  Branch               : HEAD
  Hash                 : 4eb1f4392a012b4e6eca759762389c612537f7c7
  Hash Date            : 2026-03-09 20:30:37
  amdxdna Version      : 2.21.260102.53.release_20260309, 6f881ad230142b707ca8ce5b33fca426a926c551
  virtio-pci Version   : 7.0.0-15-generic
  NPU Firmware Version : 1.1.2.65
Device(s) Present
|BDF             |Name            |
|—————-|—————-|
|[0000:c7:00.1]  |NPU Strix Halo  |

NPUで動作するLLMの構築

目的:
  • Lemonade Server + FLM backend を利用
  • OpenAI互換APIを公開させ、Open WebUI から軽量LLMとして利用
 
NPU backend (FLM) を利用して軽量LLMを実行する。
 
Lemonade を利用する。Linux環境では snap版の lemonade-server を利用する。もう一つ lemonade-sdk というPython 3.12環境でのPython CLI / 評価・検証用SDKがあるがLLMを動かすだけなら不要。
 
  • Linux版 Lemonade Server には FLM backend が内包されていない。
  • そのため FLM/NPU backend を利用する場合は、FastFlowLM の Linux向け deb パッケージを別途インストールする必要がある。
  • 今回の環境では Ubuntu 26.04 用 build の FastFlowLM 0.9.39 で動作確認した。
 
自分の環境で動作確認できた環境を列挙しておく。
Component
Version
lemonade-server
10.3.0
FastFlowLM
0.9.39
XRT
2.21.75
Kernel
7.0.0-15
Ubuntu
26.04

lemonade server のインストール

Snap経由でインストールをする。
apt update
apt install -y snapd
systemctl enable –now snapd.socket
snap install lemonade-server
 
cd /root
wget https://github.com/FastFlowLM/FastFlowLM/releases/download/v0.9.39/fastflowlm_0.9.39_ubuntu26.04_amd64.deb
 
apt install -y ./fastflowlm_0.9.39_ubuntu26.04_amd64.deb
 
flm –version
flm validate
 
snap restart lemonade-server
 
source /etc/profile.d/xrt.sh
 
which lemonade-server
lemonade-server –version
lemonade-server –help
lemonade-server status
lemonade-server backends
lemonade-server list
 
reboot
 
起動後の確認:
source /etc/profile.d/xrt.sh
xrt-smi examine
snap services lemonade-server
lemonade-server status
lemonade-server backends
 
※ reboot 後に `lemonade-server backends` で `flm npu installed` になっていることを確認する。
Recipe Backend Status Message/Version Action
—————————————————————————————————————————————————-
flm npu installed v0.9.39 –
kokoro cpu installed b16 –
llamacpp cpu installable Backend is supported but not installed. lemonade backends install llamacpp:cpu
metal unsupported Requires macOS –
rocm installable Backend is supported but not installed. lemonade backends install llamacpp:rocm
system unsupported llama-server not found in PATH –
vulkan installable Backend is supported but not installed. lemonade backends install llamacpp:vulkan
ryzenai-llm npu unsupported Requires Windows –
sd-cpp cpu installable Backend is supported but not installed. lemonade backends install sd-cpp:cpu
rocm installable Backend is supported but not installed. lemonade backends install sd-cpp:rocm
whispercpp cpu installable Backend is supported but not installed. lemonade backends install whispercpp:cpu
npu unsupported Requires Windows –
vulkan installable Backend is supported but not installed. lemonade backends install whispercpp:vulkan
—————————————————————————————————————————————————-
 
curl http://127.0.0.1:13305/v1/models
{“data”:[],”object”:”list”}
モデルがまだロードされていないので上記で正常
 
 
注意:
Lemonade Server の snap が更新されると、Linux版 FLM/NPU backend が `update_required` になり、FLMモデルが一覧から消える場合がある。
今回の環境では 10.4.0 で発生し、`snap revert lemonade-server` で 10.3.0 に戻すと復旧した。
安定運用する場合は snap の自動更新に注意する。
 
 
lemonade-server だけ holdする方法
snap refresh –hold=forever lemonade-server
 
snap refresh –time
snap list lemonade-server
Name Version Rev Tracking Publisher Notes
lemonade-server v10.3.0 165 latest/stable ken-vandine✪ held
 
解除:
snap refresh –unhold lemonade-server
 
 
バージョンとモデルの存在確認
snap list lemonade-server
 
lemonade-server –version
lemonade-server backends
 
lemonade-server list | grep flm
 
deepseek-r1-0528-8b-FLM No flm
deepseek-r1-8b-FLM No flm
embed-gemma-300m-FLM Yes flm
gemma3-1b-FLM No flm
gemma3-4b-FLM No flm
gemma4-it-e2b-FLM No flm
gpt-oss-20b-FLM No flm
gpt-oss-sg-20b-FLM No flm
lfm2-1.2b-FLM No flm
lfm2-2.6b-FLM No flm
lfm2-trans-2.6b-FLM No flm
lfm2.5-it-1.2b-FLM No flm
lfm2.5-tk-1.2b-FLM No flm
llama3.1-8b-FLM No flm
llama3.2-1b-FLM No flm
llama3.2-3b-FLM No flm
medgemma-4b-FLM No flm
medgemma1.5-4b-FLM No flm
nanbeige4.1-3b-FLM No flm
phi4-mini-it-4b-FLM No flm
qwen2.5-it-3b-FLM No flm
qwen2.5vl-it-3b-FLM No flm
qwen3-0.6b-FLM No flm
qwen3-1.7b-FLM No flm
qwen3-4b-FLM No flm
qwen3-8b-FLM No flm
qwen3-it-4b-FLM No flm
qwen3-tk-4b-FLM No flm
qwen3.5-0.8b-FLM Yes flm
qwen3.5-2b-FLM No flm
qwen3.5-4b-FLM No flm
qwen3.5-9b-FLM No flm
qwen3vl-it-4b-FLM No flm
translategemma-4b-FLM No flm
whisper-v3-turbo-FLM No flm
 
外部からlemonade-serverに繋げたい場合
lemonade-server config set host=0.0.0.0
snap restart lemonade-server
確認
lemonade-server config | grep host
ss -lntp | grep 13305
curl http://192.168.1.20:13305/v1/models
期待
0.0.0.0:13305 で LISTEN していること
0.0.0.0:13305

 

LLM使い方

注意:
  • 現在の Linux版 FLM backend では NPUへ同時常駐できるモデル数は実質1つである。(Max Models/Type 1 ) よって、Embedding と Chat model など複数のモデルを同時ロードできない場合がある。
  • NPU実行時はメインメモリ(UMA)を消費する。
lemonade-server listでは大きいモデルも表示されるが、NPUはGPUの代替として大型LLMを高速に動かすためではなく、GPUをOllama/ComfyUIに空けたまま、Task Modelや軽量LLM、Embedding、Whisperのような補助AI処理を常駐させるために使うのが現実的である。よって、ちゃんとしたGPU/VRAMがついているので、わざわざNPUで大容量のモデルを動かす価値はほとんどない。
というわけで、qwen3.5-0.8b-FLMを動かしてみる。
# Model list
lemonade-server list
 
# Model pull
lemonade-server pull qwen3.5-0.8b-FLM
#model load
lemonade-server load qwen3.5-0.8b-FLM
#model
curl http://127.0.0.1:13305/v1/models

Open WebUI向けにTask Modelと軽量LLMデモとして、qwen3.5-0.8bを使う場合

Open WebUI → Settings → Connections → OpenAI API
OpenAI互換APIとして追加する。
source /etc/profile.d/xrt.sh
 
lemonade-server unload all
 
lemonade-server pull qwen3.5-0.8b-FLM
lemonade-server load qwen3.5-0.8b-FLM
API確認:
curl http://127.0.0.1:13305/v1/models
チャット確認:
curl http://127.0.0.1:13305/v1/chat/completions \
-H “Content-Type: application/json” \
-d ‘{
“model”: “qwen3.5-0.8b-FLM”,
“messages”: [
{“role”: “user”, “content”: “日本語で短く自己紹介してください。”}
],
“temperature”: 0.2
}’
起動スクリプト
cat <<‘EOF’ >/usr/local/bin/lemonade-startup-load.sh
#!/bin/bash
 
# Load default Lemonade NPU chat model after server startup.
 
export PATH=/opt/xilinx/xrt/bin:/snap/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
export LD_LIBRARY_PATH=/opt/xilinx/xrt/lib
 
sleep 10
 
lemonade-server load qwen3.5-0.8b-FLM
EOF
 
chmod +x /usr/local/bin/lemonade-startup-load.sh
 
snap版のsystemd unit名は環境により異なる可能性があるため、必要に応じて以下で確認する。
systemctl list-units ‘snap.lemonade-server*’ –no-pager
 
起動スクリプト本体
cat <<‘EOF’ >/etc/systemd/system/lemonade-model-load.service
[Unit]
Description=Load default Lemonade NPU model
After=snap.lemonade-server.daemon.service network-online.target
Wants=network-online.target
 
[Service]
Type=oneshot
ExecStart=/usr/local/bin/lemonade-startup-load.sh
RemainAfterExit=yes
 
[Install]
WantedBy=multi-user.target
EOF
 
systemctl daemon-reload
systemctl enable lemonade-model-load.service
確認:
systemctl start lemonade-model-load.service
systemctl status lemonade-model-load.service –no-pager
curl http://127.0.0.1:13305/v1/models
Open WebUIを使う場合の設定
Base URL: http://EVO-X2-IP:13305/v1
API Key: dummy
System Prompt
Always respond in Japanese.
Be concise and direct.
Do not explain unnecessarily.
 
Advanced Paramの設定
Open WebUI項目
推奨
用途
Task Model / Title / Tag / Query補助 / 軽量Chat
Stream Chat Response
On
Function Calling
Off または Default Nativeは不要
Reasoning Tags
Disabled
Temperature
0.2〜0.4
Top P
0.8〜0.9 (Default)
 
うまくいけば、モデル選択にModel: qwen3.5-0.8b-FLMが表示されるはず。
TASK MODELにModel: qwen3.5-0.8b-FLMを設定しておく。
 

<参考>Embeddingを使う場合

qwen3.5-0.8b-FLMの代わりにembed-gemma-300m-FLMといったようなEmbeddingを使うこともできるが、RAGの頻度が少ない、逆にRAGの頻度が多ければ、nomic-embed-text-v2-moeといったモデルをGPUで使った方がいいので、あまりおすすめしない。
 
モデルのロード
lemonade-server unload all
 
lemonade-server pull embed-gemma-300m-FLM
lemonade-server load embed-gemma-300m-FLM
APIの確認
curl http://127.0.0.1:13305/v1/embeddings \
-H “Content-Type: application/json” \
-d ‘{
“model”: “embed-gemma-300m-FLM”,
“input”: “EVO-X2のNPUでembeddingを実行するテスト”
}’
起動スクリプト
cat <<‘EOF’ >/usr/local/bin/lemonade-startup-load.sh
#!/bin/bash
 
# Load default Lemonade models after server startup.
 
export PATH=/opt/xilinx/xrt/bin:/snap/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
export LD_LIBRARY_PATH=/opt/xilinx/xrt/lib
 
sleep 10
 
lemonade-server load embed-gemma-300m-FLM
 
# Optional: load chat model instead of embedding.
# Lemonade Server currently supports Max Models/Type = 1.
# lemonade-server load qwen3.5-0.8b-FLM
EOF
 
chmod +x /usr/local/bin/lemonade-startup-load.sh
Open WebUI
Base URL: http://EVO-X2-IP:13305/v1
API Key: dummy
 
モデル選択でembed-gemma-300m-FLMが表示されてしまうので、非表示にして、Document設定のモデル選択で指定をする。

<参考>Whisperを使う場合

※ Linux版では whispercpp:npu backend は未対応。
現時点では FLM版 whisper-v3-turbo-FLM を使用するしかない。
今のところCPUでやった方が全然速くて効率的なのでおすすめはしない。
 
lemonade-server unload all
 
lemonade-server pull whisper-v3-turbo-FLM
lemonade-server load whisper-v3-turbo-FLM
 
 
これで余計なモデルがOllamaにロードされなくなってOpen WebUIがさらに快適になった。
 
 
ちなみに、脾臓が不要といわれているが、アーティスティックスイミングの選手は脾臓が大きいらしい。水面下で息を止めていると血液内の酸素が少なくなるので、脾臓で血液を貯めて潜水時間を長くしているらしい。つまり、必要な人には必要な脾臓。NPUも同じようなものかもしれない。

コメントする