Jetson AGX Orinでグラボを動かした話
最近、ラズパイにグラボを接続した、ルーターにGPUを接続したなど、いろんなものにGPUを繋げるのが流行っているようですが、似たようなことをJetsonでやったという記事です。
設定方法だけ書くとわりと短いので、最初に経緯などを書いています。結論だけ欲しい方は、こちらに飛んでください。
はじめに
Jetson AGX Orinというのは、NVIDIAが開発しているエッジコンピューティング向けのモジュール製品で、エッジ環境としては非常に強力なAI能力(200~275TOPS)を持っています。
通常のユースケースだと十分だと思うのですが、PoCなど研究開発用途でデスクトップPC並の性能で推論を動かしたいというニーズもあったりします。机上で要件を満たせるならわざわざJetson Orinのようなものを使う必要はないのですが、エッジ向けの製品には通常のPCには備わっていないI/Oや特殊なカメラを利用できるメリットがあります。また、最終的に推論モデルをエッジ環境に最適化して動かすことを目的としている場合、GPU以外の条件揃えておくことで余計な移行コストを減らせるメリットもあります。
調査フェーズ
まずは公式回答をチェック
似たようなことを考える人はいるもので、NVIDIAのフォーラムで質問が見つかりました。
やり取りを抜粋すると以下のことを言っています。
- JetsonプラットフォームではdGPU(ディスクリートGPU)はサポートしていない
- NVIDIA Clara AGXとでは使えるが、これはOrin SoMとは違う製品だからだ
ここで出てきたClara AGXという製品は、デフォルトでRTX 6000が入っています。
NVIDIA Clara公式サイトより転載
そして仕様を見る限り、使っているSoMはJetson AGX Xavierです。写真も思いっきりモジュールだし。この構成が実現できている以上、できないというのは正確な表現ではなさそう、と感じました。
Clara AGXを調べる
Claraのドキュメントによると、nvgpuswitch.pyというスクリプトで設定の変更をしているようです。
このスクリプトはnvidia-l4t-gputoolsというパッケージに入っています。このスクリプトの中身を見る限り、なにかハードウェア的に特殊なことをやっているわけではなく、必要なパッケージのインストールとアンインスール、設定の切替えを行うことでGPUの使い分けを達成しているようです。なんだかできそうな気がしてきた。
ここまで調べた内容をもとに、実際に動くかどうかを試します。
GPU接続方法
前提条件
今回は以下の条件で実施しています。
- Device: Jetson AGX Orin Devkit
- GPU: NVIDIA RTX A6000
- Jetson Linux version: 35.3.1
- NVIDIA Driver version: 525.147.05
GPUやドライバーの組み合わせによって動く動かないということがあると思うので、実施する場合は自身の環境に応じて適宜対応してください。
物理接続の図
AGX Orin開発者キットには、素晴らしいことにPCIe x16のスロット(PCIe Gen4 x8)がデフォルトで付いています。物理的には、こちらにグラボを挿すだけです。
PCIeスロット
Orin側からの給電だけではさすがに間に合わないため、グラボには外部電源も接続します。通常マザーボードに接続していないとPCIe給電されないのですが、こういう便利なものが売っているので単独でも利用可能です。要は電源が入っていると認識させればいいだけなので、方法は何でもいいです。
総額100万オーバー構成
最終的にこんな感じになりました。かなりいかついですね。
パッケージ類のインストール
結論だけ書くと非常にシンプルで、Jetson向けのものではなく、PC向けのNVIDIA Driverをインストールすれば動く、という話でした。
まず、Jetson Linux(L4T)のパッケージはコンフリクト発生させるため、一通りアンインストールします。
$ sudo apt remove \
nvidia-l4t-cuda \
nvidia-l4t-camera \
nvidia-l4t-gstreamer \
nvidia-l4t-multimedia \
nvidia-l4t-pva \
nvidia-l4t-jetson-multimedia-api \
nvidia-jetpack-dev \
nvidia-jetpack-runtime \
nvidia-jetpack \
nvidia-l4t-3d-core \
nvidia-l4t-gbm \
nvidia-l4t-x11 \
nvidia-l4t-weston
その後、必要なパッケージをインストールします。
$ sudo apt-get install -y --no-install-recommends \
nvidia-l4t-dgpu-config \
nvidia-driver-525
nvidia-l4t-dgpu-config
という見慣れないパッケージがありますが、こちらをインストールするといくつかコンフィグが追加されます。その中で重要なのはblacklist-nvgpu.conf
で、これは内蔵GPUのモジュールがロードされないようにするものです。
$ cat /etc/modprobe.d/blacklist-nvgpu.conf
# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
#
# NVIDIA CORPORATION and its licensors retain all intellectual property
# and proprietary rights in and to this software, related documentation
# and any modifications thereto. Any use, reproduction, disclosure or
# distribution of this software and related documentation without an express
# license agreement from NVIDIA CORPORATION is strictly prohibited.
blacklist nvgpu
併用したときの影響は読めないので、基本的にどちらかのみを有効にする運用にしたほうが良さそうです。
起動設定
PCIのエラーメッセージが大量にログ出力されて動作に影響が出ることがあるため、ブート設定(pci=noaer)で抑制します。
$ sudo sed -i.org -r "s/^(\s+APPEND .*)/\1pci=noaer /" /boot/extlinux/exlinux.conf
$ cat /boot/extlinux/exlinux.conf
TIMEOUT 30
DEFAULT primary
MENU TITLE L4T boot options
LABEL primary
MENU LABEL primary kernel
LINUX /boot/Image
FDT /boot/dtb/kernel_tegra234-p3701-0000-p3737-0000.dtb
INITRD /boot/initrd
APPEND ${cbootargs} root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 mminit_loglevel=4 console=ttyTCU0,115200 console=ttyAMA0,115200 console=tty0 firmware_class.path=/etc/firmware fbcon=map:0 net.ifnames=0 pci=noaer
動作確認
問題なく設定できていれば、nvidia-smiでRTX A6000が認識できていることがわかります。ちなみに通常Jetsonにnvidia-smiはインストールされていません。
$ nvidia-smi
Wed Mar 13 03:21:31 2024
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.147.05 Driver Version: 525.147.05 CUDA Version: 12.0 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA RTX A6000 Off | 00000005:01:00.0 On | Off |
| 30% 36C P8 17W / 300W | 49MiB / 49140MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 1663 G /usr/lib/xorg/Xorg 40MiB |
| 0 N/A N/A 2273 G /usr/bin/gnome-shell 7MiB |
+-----------------------------------------------------------------------------+
試しにGLmark2を動かしてみたところ、こんなスコアでした(1920x1080での実行)。ここの結果を見た感じ、RTX 3070の7割くらいですかね。
=======================================================
glmark2 Score: 5253
=======================================================
nvtopでもりもりGPU使っているのがわかる
L4Tパッケージの(やや強引な)インストール方法
NVIDIA Driverをインストールしていると、大半のL4Tパッケージは依存関係で問題が発生します。最初のパッケージはなんとかインストールできるものの、それ以降はaptのエラーでパッケージのインストールなどが実行できなくなります。
例えばnvidia-l4t-multimediaをインストールした後はこうなります。
You might want to run 'apt --fix-broken install' to correct these.
The following packages have unmet dependencies:
nvidia-l4t-multimedia : Depends: nvidia-l4t-cuda (= 35.3.1-20230319081403) but it is not going to be installed or
cuda-drivers but it is not installable
nvidia-l4t-cudaが入っていないというメッセージですが、このパッケージは競合が発生するのでインストールできません。
Preparing to unpack .../nvidia-l4t-cuda_35.3.1-20230319081403_arm64.deb ...
Unpacking nvidia-l4t-cuda (35.3.1-20230319081403) ...
dpkg: error processing archive /var/cache/apt/archives/nvidia-l4t-cuda_35.3.1-20230319081403_arm64.deb (--unpack):
trying to overwrite '/usr/lib/aarch64-linux-gnu/libcuda.so', which is also in package libnvidia-compute-525:arm64 525.147.05-0ubuntu0.20.04.1
Errors were encountered while processing:
/var/cache/apt/archives/nvidia-l4t-cuda_35.3.1-20230319081403_arm64.deb
しかし、CUDAパッケージがあればいいだけならnvidia-l4t-cudaを入れる必要性はないはず。そもそもL4T向けのCUDAは、dGPU環境で正常に動作しない可能性のほうが高いです。そのため、こちらをdpkgの依存関係記述から一時的に除外して、競合しないようにする方法を取ります。
具体的には/var/lib/dpkg/status
を編集します。nvidia-l4t-multimediaの例だと、Dependsの項目にnvidia-l4t-cuda (= 35.3.1-20230319081403) | cuda-drivers
があるため、ここを削除します。
$ grep -A 10 "Package: nvidia-l4t-multimedia$" /var/lib/dpkg/status
Package: nvidia-l4t-multimedia
Status: install ok unpacked
Priority: standard
Section: graphics
Installed-Size: 33055
Maintainer: NVIDIA Corporation
Architecture: arm64
Version: 35.3.1-20230319081403
Depends: libasound2, libc6, libcairo2, libdatrie1, libegl1, libexpat1, libfontconfig1, libgcc1, libgles2, libglib2.0-0, libglvnd0, libgstreamer1.0-0, libgstreamer-plugins-bad1.0-0, libgstreamer-plugins-base1.0-0, libharfbuzz0b, libpango-1.0-0, libpangocairo-1.0-0, libpangoft2-1.0-0, libpcre3, libpixman-1-0, libstdc++6, libx11-6, libxau6, libxcb1, libxdmcp6, libxext6, libxrender1, zlib1g, nvidia-l4t-cuda (= 35.3.1-20230319081403) | cuda-drivers, nvidia-l4t-multimedia-utils (= 35.3.1-20230319081403), nvidia-l4t-nvsci (= 35.3.1-20230319081403)
Pre-Depends: nvidia-l4t-core (>> 35.3-0), nvidia-l4t-core (<< 35.4-0)
Description: NVIDIA Multimedia Package
こうしておくことで、エラーが発生せずパッケージのインストールができるようになります。とはいえ正規の手段ではないので、何らかの副作用が発生する可能性はあります。
もとに戻したい場合
NVIDIA Driverをアンインストールして、もとのL4Tパッケージを入れ直せば戻ります。
ただ色々やっていると不要なパッケージが残ってうまく映像出力できなくなったりすることもあったため、そういう場合はapt autoremove
などを試してみてください。根気強くやれば復旧はできますし、最悪でも再インストールすれば綺麗サッパリ元に戻せます。
まとめ
かなりユースケースは限られる気もしますが、エッジ環境で強力なGPUを使いたいという場合に試す価値はあるかと思います。ただ、公式では「できない」と明言されてしまっているため、実施する場合は自己責任ということで何卒。
Discussion