Jetson Xavier NX を搭載したボックスコンピューターを触る機会があったのでメモです。
ボックスコンピューターは以下です。
CUDA や Docker は最初からインストールされていました。
ゴールとしては Docker コンテナ上で GPU を使って推論を行うことです。
先に結論を書いておくと、
- CPU アーキテクチャが arm なので、arm に対応したベースイメージを使う必要がある
- Jetson は GPU ドライバーの都合上、現時点で CUDA 11 以降に対応していない
- インストールされているバージョンは 10.2
- つまり、arm で CUDA 10.2 のイメージを使う必要があるが、Docker Hub にはその組み合わせの公式イメージがない
- NVIDIA GPU CLOUD (NGC) にある
l4t-ml:r32.5.0-py3のイメージを使えばいいとのこと- これが Jetson Xavier NX にインストールされている JetPack と同等のイメージになる
Jetson, JetPack, L4T について調べてみた
ここらへんの関係がよくわからなかったので、少し調べてみました。
NVIDIA Jetson シリーズは JetPack という形で、OS、NVIDIA ドライバー、CUDA や cuDNN などのフレームワークも含めた形で提供されているらしいです。
- https://developer.nvidia.com/ja-jp/embedded/jetpack
- https://ja.wikipedia.org/wiki/NVIDIA_Jetson#Xavier
インストールされている JetPack と OS のバージョンは以下の方法で確認できます。
$ dpkg-query --show nvidia-l4t-core
nvidia-l4t-core 32.5.0-20210115151051
インストールされている OS は L4T 32.5 でしたが、これは JetPack 4.5 になるっぽいです。
尚、最新の JetPack 4.6 でも CUDA は 10.2 らしいですが、これは GPU ドライバーの都合上みたいです(後述)。
nvidia-smi がない?
GPU の状況を確認するためによく使う nvidia-smi が Jetson にはありませんでした。
代わりに tegrastats で確認できました。
ストレージ容量が少ない
ストレージ容量が 16GB しかなく、空き容量もほとんどないので、このままでは Docker イメージが入りません。
なので、外部ストレージとして 2.5 インチの SSD を用意して、そちらに Docker イメージを保存するように設定変更しました。
これについては以下を参照してください。
CUDA バージョン
nvidia-container-cli が使えたので、何もしなくても Docker から GPU を使うことはできそうでした。
インストールされている CUDA のバージョンなどは以下でした。
$ nvidia-container-cli info
NVRM version: (null)
CUDA version: 10.2
Device Index: 0
Device Minor: 0
Model: Xavier
Brand: (null)
GPU UUID: (null)
Bus Location: (null)
Architecture: 7.2
結構古かったです。
んで、CUDA のバージョンを上げられないかなぁと思って調べてみると、以下のページが見つかりました。
- https://forums.developer.nvidia.com/t/manually-installing-cuda-11-0-2-on-jetson-xavier-nx-help/191909
- https://forums.developer.nvidia.com/t/installing-cuda-11-x-on-jetson-nano/169109
どうやら Jetson は GPU ドライバーの都合上、現時点では CUDA 11 以降に対応していないとのこと。
なので、Dockerfile のイメージは CUDA 10.2 のものを使う必要がありそうです。
CPU が arm
CUDA 云々の前に、そもそも CPU アーキテクチャが arm なので、今まで他のマシンで使っていた Dockerfile のビルドを行うとすぐに失敗しました。
ベースとする Docker イメージを arm 系のものにする必要がありそうです。
Docker Hub に nvidia/cuda-arm64 というイメージがあるのでこれっぽいですが、現在ではもうサポートされておらず 11.1 でバージョンが止まっています。
ドキュメントを追ってみると、現在では nvidia/cuda のイメージで複数のアーキテクチャをサポートできるっぽいので、上記はもうサポートされないとのこと。
しかし、nvidia/cuda にある CUDA 10.2 のイメージの OS/ARCH には linux/arm64 が含まれていません。
仕方ないので nvidia/cuda-arm64 内で探してみますが、今度は CUDA 10.2 のイメージがなく、11 以降のイメージしかありません。
つまり、Docker Hub にある NVIDIA の公式イメージには、arm アーキテクチャで CUDA が 10.2 のイメージがないということがわかりました。
NVIDIA GPU CLOUD (NGC) のイメージを使えばいいらしい
さてどうしたもんかと悩んでいたら、同じようなことを質問している人がいました。
これに対する回答として、l4t-ml:r32.5.0-py3 を使ってみてとのこと。
このイメージは Docker Hub ではなく NVIDIA GPU CLOUD (NGC) からプルできるそうです。
見ての通り、これは JetPack 4.5 と同等の Docker イメージらしいです。
ちなみに、Docker Hub からのプルではないため、イメージ名は以下のように指定します。
$ docker pull nvcr.io/nvidia/l4t-ml:r32.5.0-py3
一応プルできるところまでは確認できました。
OpenCV のインストールに失敗する
nvcr.io/nvidia/l4t-ml:r32.5.0-py3 のイメージを使うことでようやく Dockerfile のビルドを開始できるところまで漕ぎ着けましたが、OpenCV のインストールに失敗しました。
調べてみると以下のページが見つかりました。
どうやら pip ではインストールできないようなので、ソースコードからビルドを行う必要がありそうですが、OpenCV に依存するライブラリも pip でインストールできなくなります。
尚、Ubuntu 20.04 のベースイメージだと OpenCV のインストールは pip でできました。