Ubuntu日和

【第92回】UbuntuでIntel NPUを動かす!えっ、俺のNPUがこんなに動くわけない?

このアプリケーションについての解説は後半に

 今回はNPUの話を取り上げたいと思う。このコラムで第87回でUbuntuでもAMDのNPUを活用する方法を紹介した。半年くらい前の記事なのだが、現状は少し異なっている。というか事態がかなりよくなっており、すぐに使えるようになったのだ。

 かいつまんで解説すると、Ubuntu 26.04 LTS(と24.04 LTSのHWEカーネル)ではカーネルのバージョンが7.0になっており、libxrt-npu2とamdxdna-dkmsパッケージのインストールは不要になっている。

 また、FastFlowLMの開発チームはAMDに入社し、FastFlowLMのプロプライエタリな部分はなくなった。あいかわらずリリースページからのダウンロードは必要ではあるが。

 ではIntelのNPUはどうなのか、という話である。

 IntelのNPUを使用するのであればOpenVINOのお世話になることとなる。ただし、UbuntuではAMDのLemonade Serverのように簡単にWebインターフェイスを使えるものはなさそうで(OpenVINO Model Serverが近そうではあるが)、llama.cppのOpenVINOバックエンドを使用してみることにした。「In Progress(開発中)」となっているが、現状でどのぐらい使えるものなのだろうか。

 というわけで、今回はIntelのNPUを活用する方法を紹介する。

NucBox K17でllama.cppのビルド済みバイナリを試してみたが失敗

 今回使用するPCは、「GMKtec「NucBox K17」を試す。Core Ultra 5 226VのiGPUが予想以上の出来」の記事で紹介されたNucBox K17だ。メモリが16GBしかないということを除けば、性能はかなりいい。

 上位モデルのNucBox K17 PLUSは価格差が小さいわりにメモリが倍なので、今から購入するのであればこちらを検討したほうがよさそうだ。

 Ubuntuのバージョンは26.04.1とする。

 llama.cppのリリースページを見ると、「Ubuntu x64 (OpenVINO)」なるものがある。ダウンロードしてみると100MB程度のアーカイブなので、OpenVINOでの動作に必要なバイナリがすべて含まれているのかと思い、動かしてみた。

$ ./llama-bench -m ~/Downloads/Qwen3-8B-Q4_K_M.gguf
OpenVINO: using device CPU
| model                          |       size |     params | backend    | ngl |            test |                  t/s |
| ------------------------------ | ---------: | ---------: | ---------- | --: | --------------: | -------------------: |
Illegal instruction        (コアダンプ) ./llama-bench -m ~/Downloads/Qwen3-8B-Q4_K_M.gguf

 使用するモデルについての解説は後回しにするとして、とにかく筆者の手元の環境ではビルド済みバイナリは使用できなかったので、自力でビルドする必要がある。

OpenVINOとNPUドライバーのインストール

 OpenVINOのインストール方法はInstall OpenVINO Runtime on Linux from an Archive Fileにある。パッケージでのインストールも可能だが、llama.cppでビルドしようとするとこの方法しかなかった。

 おおむねこのドキュメントの通りだが、次のコマンドを実行する。

$ sudo mkdir /opt/intel
$ cd $(xdg-user-dir DOWNLOAD)
$ wget https://storage.openvinotoolkit.org/repositories/openvino/packages/2026.4/linux/openvino_toolkit_ubuntu26_2026.4.0.22959.99c81491cc3_x86_64.tgz -O openvino_2026.4.0.tgz
$ tar -xf openvino_2026.4.0.tgz
$ sudo mv openvino_toolkit_ubuntu26_2026.4.0.22959.99c81491cc3_x86_64 /opt/intel/openvino_2026.4.0
$ cd /opt/intel/openvino_2026.4.0
$ sudo -E ./install_dependencies/install_openvino_dependencies.sh

 またOpenVINOを使用する前に、次のコマンドを実行する。

$ source /opt/intel/openvino_2026.4.0/setupvars.sh

 NPUドライバーのインストール方法もやや煩雑だ。snapパッケージもあるが、最新のバージョンに追いつくまでのタイムラグが大きく、今回はパッケージからのインストールを選択した。

 次のコマンドを実行してインストールする。

$ cd $(xdg-user-dir DOWNLOAD)
$ wget https://github.com/intel/linux-npu-driver/releases/download/v1.38.0/linux-npu-driver-v1.38.0.20260910-34487311128-ubuntu2604.tar.gz
$ tar -xf linux-npu-driver-v1.38.0.20260910-34487311128-ubuntu2604.tar.gz
$ sudo apt install libtbb12
$ sudo apt install ./*.deb
$ wget https://snapshot.ppa.launchpadcontent.net/kobuk-team/intel-graphics/ubuntu/20260830T100000Z/pool/main/l/level-zero-loader/libze1_1.32.0-1~26.04~ppa1_amd64.deb
$ sudo apt install ./libze1_*.deb
$ sudo gpasswd -a ${USER} render
$ reboot

 ここまでで分かる通り、OpenVINOのバージョンは2026.4.0、Intel NPUドライバーのバージョンは1.38だ。これよりも古ければダメだが、新しい分にはそのまま動くはずだ。

llama.cppをビルドし、使用するモデルを選ぶ

 端末から次のコマンドを実行してllama.cppをビルドする。

$ sudo apt install -y build-essential libcurl4-openssl-dev libtbb12 cmake ninja-build python3-pip curl wget tar
$ mkdir ~/git
$ cd ~/git
$ git clone https://github.com/ggml-org/llama.cpp.git
$ cd llama.cpp
$ source /opt/intel/openvino_2026.4.0/setupvars.sh
$ cmake -B build/ReleaseOV -G Ninja -DCMAKE_BUILD_TYPE=Release -DGGML_OPENVINO=ON
$ cmake --build build/ReleaseOV --parallel

 現状OpenVINOバックエンドで使用できるモデルはValidated Modelsで確認できる。

 筆者は説明を読まず✗が対応、✓が非対応だと思っていたのだが、逆であった。ということは、NPUの実力を引き出すのによさそうな「Qwen3.5-9B-GGUF」は非対応ということで、脱力してしまった。日本では✓が対応、✗が非対応となるが、逆になる文化圏もあると聞いており、この表もそうかと思ってしまった。

 というわけで、ここでは「Qwen3-8B-Q4_K_M」を使用することとする。ダウンロードフォルダーにダウンロードしておいてほしい。

llama.cppを動作させる

 ではOpenVINOバックエンドのllama.cppで動作させてみよう。次のコマンドを実行する。

$ source /opt/intel/openvino_2026.4.0/setupvars.sh
$ cd ~/git/llama.cpp/build/ReleaseOV/bin
$ export GGML_OPENVINO_DEVICE=NPU
$ ./llama-bench -m ~/Downloads/Qwen3-8B-Q4_K_M.gguf
余計なコマンドも実行されているが、それはさておき動くには動く。

 動くには動いたが、地味すぎて全然面白くない。

俺のNPUがこんなに動くわけない

 本誌の担当編集である劉デスクに「全くバエる記事にならない」のだが、と相談したら、なんとClaude CodeでOpenVINOを直接叩くアプリを作り上げてしまった。

 その名も「onw - 俺のNPUがこんなに動くわけない」だ。どこかで聞いたことがあるような気もする名前だが、偶然の一致なのだろう。きっとそうだ。

 これが現時点ではなかなかに唯一無二のものなので、紹介したい。名前は長いので、以後「onw」とする。

onwの特徴。Claude Code Fable 5.1調べ

 まずはインストールだが、コマンドを1行叩くだけで簡単だ。

$ curl -fsSL https://huggingface.co/ryugyosoft/onw/resolve/main/install.sh | bash

 インストールが完了したら自動的に起動するので、通知アイコンをクリックして「onwを開く (モデル・サーバー設定)」をクリックする。

自動的に起動するonw
開く「サーバー」タブ

 モデルをインストールしないことには始まらないので、「モデル」タブをクリックする。

 性能と大きさのバランスが取れている(と筆者が考えている)「Qwen3.5-9B」をインストールする。「ダウンロード」をクリックするとダウンロードが開始される。

Qwen3.5-9Bをダウンロード中

 「サーバー」タブに戻り、「使うモデル」が「Qwen3.5-9B」になっていることを確認して「ロード」をクリックする。これがメモリに読み込む操作となる。少し待ち時間がある。

「サーバー」タブでモデルをロードする

 ロードが終わったら「チャット」をクリックし、Webブラウザを開く。これでチャット(問い合わせ)が可能となる。

「チャット」をクリックする

 せっかくのビジョンモデル(画像の読み込みが可能なモデル)なので、筆者が撮影した食事の写真に何が写っているかを判定してもらった。

写真に写っているものを判定

 注意点としては、読み込める画像は512ピクセル(しかもアスペクト比1:1に強制圧縮)までであるということで、ここまで小さいと正確な判断は難しいが、今回はおおむね正解している。おそらく「焼きそば」という名詞を知らないものと思われるが、特徴としては合っている。なお、Gemma 4 E4Bでは特にこのアスペクト比の制限がない。

NPUでやれることがいろいろある

 Intel NPUをフル活用するonwはとても高機能で、特筆すべきは(実用的かどうかはさておき)現在の性能のNPUではサイズ的に動作が難しいモデルも動いてしまうところだ。

 ましてや本機はメモリが16GBしかない。そんな制限がある中であっても、エキスパートの一部をSSDに置く仕組みを取り入れたことで、「Qwen3.6-35B-A3B」が動いてしまうし、プリフィルが高速な16トークン版とデコードが高速な1トークン版の重みを差し替えることで容量を節約するモードもある。これはllama.cppのOpenVINOバックエンドが進歩しても、かなり高い確率でこうはならない。Qwen3.5-9Bのような小さなモデルであれば軽快に動作する。

 NPUでやれることがいろいろあることが分かるonwだが、かといって継続して維持するのもそれはそれで難しいので、いずれはllama.cppのOpenVINOバックエンドを使用せざるを得ないとしても、しばらくの間はonwを使用するのがおすすめだ。

 今となってはNucBox K17 PLUSは割安なので、なにかPCを買う必要があるのであればこれにして、遊んでいるのもいいかもしれない。なお、onwはWindowsでも動作する。