🔌

Jetson AGX Orinでグラボを動かした話

2024/03/19に公開

最近、ラズパイにグラボを接続したルーターにGPUを接続したなど、いろんなものにGPUを繋げるのが流行っているようですが、似たようなことをJetsonでやったという記事です。


設定方法だけ書くとわりと短いので、最初に経緯などを書いています。結論だけ欲しい方は、こちらに飛んでください。

はじめに

Jetson AGX Orinというのは、NVIDIAが開発しているエッジコンピューティング向けのモジュール製品で、エッジ環境としては非常に強力なAI能力(200~275TOPS)を持っています。

https://www.nvidia.com/ja-jp/autonomous-machines/embedded-systems/jetson-orin/

通常のユースケースだと十分だと思うのですが、PoCなど研究開発用途でデスクトップPC並の性能で推論を動かしたいというニーズもあったりします。机上で要件を満たせるならわざわざJetson Orinのようなものを使う必要はないのですが、エッジ向けの製品には通常のPCには備わっていないI/Oや特殊なカメラを利用できるメリットがあります。また、最終的に推論モデルをエッジ環境に最適化して動かすことを目的としている場合、GPU以外の条件揃えておくことで余計な移行コストを減らせるメリットもあります。

調査フェーズ

まずは公式回答をチェック

似たようなことを考える人はいるもので、NVIDIAのフォーラムで質問が見つかりました。

https://forums.developer.nvidia.com/t/can-orin-devkit-access-external-dgpu-like-clara-does/230917

やり取りを抜粋すると以下のことを言っています。

  • JetsonプラットフォームではdGPU(ディスクリートGPU)はサポートしていない
  • NVIDIA Clara AGXとでは使えるが、これはOrin SoMとは違う製品だからだ

ここで出てきたClara AGXという製品は、デフォルトでRTX 6000が入っています。

NVIDIA Clara AGX
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を使いたいという場合に試す価値はあるかと思います。ただ、公式では「できない」と明言されてしまっているため、実施する場合は自己責任ということで何卒。

Tech Blog - Turing

Discussion