Ubuntu日和

【第58回】ビッグウェーブに乗るために、Ryzen AIのドライバをビルドしてみた

今回の目的

 今は猫も杓子もAIAIと、まさに世はAI時代といったところだが、我らがAMDもご多分に漏れずRyzen AIなるブランドを用意している。

 もちろんただのマーケティング用語で、汎用的にはNPU(Neural Processing Unit)、AMDとしてはXDNAと呼んでいる。よって本稿でもXDNAと称する。元はXilinxの技術だ。

 実はこれ、UbuntuというかLinuxでも動作する。ソースコードが公開されているのだ。しかしパッケージなどは用意されておらず、自前でビルドする必要がある。

 というわけで、今回はビッグウェーブに乗るためにXDNAドライバをビルドしていく。

使用するハードウェア

 今回使用するハードウェアは、第57回で使用した「Minisforum UM780XTX」だ。CPUはRyzen 7 7840HSで、AMDとしてはモバイルワークステーション向けとのことだ。第46回で紹介したRyzen 7 8700Gでも対応している。同じコアを使用しているので当然ではあるが。

 XDNA(Ryzen AI)に対応しているCPUかどうかは、前出のRyzen AI紹介ページを見るのが分かりやすい。

使用するUbuntuのバージョン

 使用するUbuntuのバージョンは24.04 LTSとする。XDNAドライバを動作させるにはカーネルのバージョンが6.10以降である必要がある。よって事前にカーネルのバージョンを上げておく。

 Ubuntuはメインラインカーネルのパッケージを用意しているのでこれを利用する。メインラインカーネルというのは、Ubuntu向けにカスタマイズされたカーネルではなく、リリースされたままのカーネルくらいの意味だ。最新のバージョンが使用できるというメリットがある一方、普段利用しているカーネルではできるのに、メインラインカーネルではできないことがいくつかある。例としてはセキュアブートに非対応であることや、別途カーネルモジュールをビルドする必要があるドライバは使用できなくなるものもある。

 よって普段使用しているPCではなく、実験用のPCがあることが望ましい。この時点で本稿を読むのをやめようかと考えてしまうかもしれないが、そこはちょっと待ってほしい。

 執筆段階では6.10.6がリリースされているので、これを利用する。

 インストール方法は簡単で、ここにamd64なにがしと書かれている4つのパッケージをダウンロードし、インストールするだけだ。再起動すれば最新のカーネルになる。コマンドから行なうのであれば次のようになる。

$ mkdir temp
$ cd temp/
$ wget https://kernel.ubuntu.com/mainline/v6.10.6/amd64/linux-headers-6.10.6-061006-generic_6.10.6-061006.202408190440_amd64.deb https://kernel.ubuntu.com/mainline/v6.10.6/amd64/linux-headers-6.10.6-061006_6.10.6-061006.202408190440_all.deb https://kernel.ubuntu.com/mainline/v6.10.6/amd64/linux-image-unsigned-6.10.6-061006-generic_6.10.6-061006.202408190440_amd64.deb https://kernel.ubuntu.com/mainline/v6.10.6/amd64/linux-modules-6.10.6-061006-generic_6.10.6-061006.202408190440_amd64.deb
$ sudo apt install ./*.deb
$ reboot

 再ログイン後、端末からカーネルのバージョンが新しくなっているか確認することをおすすめする。

昔ながらのカーネルのバージョン確認方法で、最新カーネルのバージョンを知る

ビルド環境の準備

 続けてライブラリのビルドを開始するが、その前に考えておきたいことがある。何らかのビルドを行なう場合、通常“たくさんのパッケージをインストールする”ことになる。現在使用しているUbuntuに、たくさんのパッケージをインストールすることは避けたほうがいい。

 理由としてはいろいろあるが、まずはセキュリティ的な理由で、使用していようがいなかろうがインストールされているすべてのパッケージは潜在的に脆弱性を含み得る。現実的には使用していないパッケージにもセキュリティアップデートが入ることになり、あまり気分がよくない。かといって削除するのもなかなか難しいし、非常に手間がかかる。パッケージが多ければ多いほどUbuntu間のアップグレード(例えば22.04 LTSから24.04 LTSとか)に失敗する可能性も増える。

 であれば、ビルド専用の環境を用意してそちらを使用し、不要になったら削除したほうがいい。そういった理由から、ここではビルド環境を別途用意することをおすすめする。

 具体的な方法としては、もちろんVirtualBoxなどの仮想マシンを用意する方法もある。しかしこれだけコンテナコンテナいわれる現在となっては、コンテナを作成する方法が楽だ。

 コンテナはカーネルの機能なので、実装はいろいろあるが、今回はsystemd-nspawnを使用する。理由としては、とにかく手軽だからだ。

 ではビルド用コンテナを作成していく。端末から次のコマンドを実行する。

$ sudo apt install systemd-container debootstrap
$ sudo mkdir -p /var/nspawn/xdna-driver
$ sudo debootstrap noble /var/nspawn/xdna-driver

 これで実行可能なコンテナはできたものの、ユーザーが存在せずrootもパスワードがないため、ログインできない。よってrootにパスワードを付与する。

$ sudo systemd-nspawn -D /var/nspawn/xdna-driver
# passwd
(パスワードを2回入力する)
# exit

 次のコマンドを実行し、rootユーザーでログインする。

$ sudo systemd-nspawn -b -D /var/nspawn/xdna-driver

 普通にログインプロンプトが表示されるので、ユーザー名(root)とパスワード(先ほど決めたもの)を入力してコンテナにログインしよう。

 先ほどダウンロードした新しいカーネルのうち、ヘッダー(linux-headersから始まる2つのパッケージ)はコンテナ内でも使用するので、事前にコピーしておこう。次のコマンドを実行するのが簡単だ。

$ sudo cp ~/temp/linux-headers-* /var/nspawn/xdna-driver/root

ドライバのビルド

 続けてコンテナ内でドライバのビルドを行なう。

 まずは/root/にあるカーネルヘッダーをインストールする。

# apt install ./linux-*.deb

 最低限必要な設定としては、/etc/apt/sources.listの変更がある。Ubuntu 24.04 LTSでは/etc/apt/sources.list.d/ubuntu.sourcesじゃないのかという話はあるものの、一旦それはさておく。

 デフォルトでは

deb http://archive.ubuntu.com/ubuntu noble main

 になっているので、これを

deb http://jp.archive.ubuntu.com/ubuntu noble main universe

 に変更し、

# apt update

 を実行する。

 コマンドの補完が効かなくてしんどい場合は、bash-completionパッケージをインストールし、一旦ログインして再ログインするといい。

 準備は整ったので、一気にビルドまでしてしまおう。

# mkdir npu
# cd npu/
# apt install git gcc-14 wget file
# git clone https://github.com/amd/xdna-driver.git
# cd xdna-driver
# git submodule update --init --recursive
# cd tools/
# ./amdxdna_deps.sh
# cd ../xrt/build/
# ./build.sh -noert -noalveo
# apt install ./Release/xrt_*-amd64-xrt.deb ./Release/xrt_*-amd64-xbflash.deb
# cd ../../build/
# ./build.sh -release
# ./build.sh -package
# source /opt/xilinx/xrt/setup.sh
# ./build.sh -example
ビルドはRyzen 7 7840HSを以てもそれなりの時間がかかる

 aptコマンドを実行しているところから分かるが、ビルド中にDebianパッケージが作成されるので、それらのパッケージを実環境のUbuntuにインストールすればXDNAが使用できるようになるという塩梅だ。

 gcc-14パッケージのインストールが謎なところだが、このカーネルがGCC 14でビルドされているので必要ということのようだ。

どれだけのパッケージがインストールされたのか

 コンテナ内にどれだけのパッケージがインストールされたのかを確認してみよう。

# dpkg -l |grep ^ii |wc -l

 何もしていない状態(debootstrapコマンド実行直後)で220個、ビルド完了後で719個だった。筆者の趣味というか手癖で本来必要なパッケージよりも多少多めにインストールされているが、それをさておいても約500個のパッケージが追加でインストールされていることが分かった。

 不要になったからといってこれらを1つ1つ調べて消していくのは(実は比較的楽に行なう方法はあるもののそれはさておいて)面倒なことこの上ないので、これこそがまさにビルド環境が必要な理由だ。不要になったら/var/nspawn/xdna-driver/以下を丸ごと削除すればいい。

コンテナから抜ける方法

 systemd-nspawnのコンテナから抜ける方法は少し分かりにくく、poweroffコマンドを実行する。間違って実機の方で実行しないように注意しよう。実は筆者もやらかした。

ドライバをインストールし、動作を確認する

 先ほどビルドしたドライバをインストールしてみよう。実機でroot権限になる必要があるのに注意だ。

$ sudo -i
# cd /var/nspawn/xdna-driver/root/npu/xdna-driver/
# apt install ./xrt/build/Release/xrt_*-amd64-xrt.deb ./xrt/build/Release/xrt_*-amd64-xbflash.deb ./build/Release/xrt_plugin.*_ubuntu24.04-x86_64-amdxdna.deb

 テストを実行する。

# source /opt/xilinx/xrt/setup.sh
# ./build/example_build/example_noop_test tools/bins/1502_00/validate.xclbin
Host test code start...
Host test code is creating device object...
Host test code is loading xclbin object...
Host test code is creating kernel object...
Host test code kernel name: DPU_PDI_0
Host code is registering xclbin to the device...
Host code is creating hw_context...
Host test code is creating kernel object...
Host test code allocate buffer objects...
Host test code sync buffer objects to device...
Host test code iterations (~10 seconds): 70000
Host test microseconds: 8843152
Host test average latency: 126 us/iter
TEST PASSED!

 無事テストをパスした。これでxdna-driverが動作するようになった。

実践的な使い道は……ない!

 苦労してビルドしたのだから何かに使いたいのが人情というものである。しかし、筆者の知る限りでは実用的に使用できるアプリケーションは今のところ存在しない。WindowsではAMUSEなるものが存在しているが、Windows用のみだ。このあたり実はIntelのほうが先行しているが、筆者がNPU搭載ハードウェアを所有していない。

 というわけでAMDにより一層の奮励努力を期待したい。