Jetson Xavier NX を触ってみた

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 などのフレームワークも含めた形で提供されているらしいです。

インストールされている 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 のバージョンを上げられないかなぁと思って調べてみると、以下のページが見つかりました。

どうやら 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 でできました。

参考 URL

Hugo で構築されています。
テーマ StackJimmy によって設計されています。