6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめてのアドベントカレンダーAdvent Calendar 2023

Day 19

Jetson Orin NX + reComputer J401 セットアップ & DockerでGPUを使う

Last updated at Posted at 2023-12-24

はじめに

先日、Jetson Orin NX(16G)モジュールを勢いで買いました。
しかし、キャリアボードを買うことを忘れていました。

手元にモノが届いたときに、「モジュールだけじゃないか!忘れてた!」となり、慌てて色々買いました。

以下のものを追加購入しました。

初めは、調子乗ってWi-Fi 6Eが使える Intel AX210NGW を使おうとしてダメでした。
そこで、Jetson Nanoで使っていた Intel 8265NGW を付けたらすんなり動きました。
実績あるデバイスを使うのは大切ですね。

トリガーケーブルですが、キャリアボードの定格電圧が9~19Vなので15Vにしました。
20Vでも大丈夫な気はしますが・・・回路図をしっかりチェックするのも面倒だったり、動作報告も見つからなかったのでやめました。

とりあえず、モバイルバッテリで動いたので、これでよしとします。

モバイルバッテリを使うのは、趣味で作っている自走する玩具に搭載するためです


今回、こちらの記事をかなり参考にしました。
reComputer J4012セットアップ(Jetson Linuxインストール編)

上記の記事ではJetPack 5.1.1ですが、私の時はJetPack 5.1.2がリリースされていたので、そちらの手順でセットアップを行いました。少し手順が異なります。

セットアップ作業

今回は母艦としてLinux機が必要です。Windowsでやろうとして失敗したということもありますが、Linuxで設定する方がネット上の情報も多く、おそらく問題が起こりにくいです。

0. 組み立て

自作PCと難易度は変わらないので省略です。
静電気にだけは注意しましょう。

1. キャリアボードを Force Recovery Mode で起動する

キャリアボードのメーカーのドキュメントによると、FC REC端子をGNDに落として電源を投入するとForce Recovery Modeで起動し、USB経由でストレージの書き換えができるようになります。
適当なジャンパ線でつなぎましょう
https://wiki.seeedstudio.com/reComputer_J4012_Flash_Jetpack/#enter-force-recovery-mode

USB-Cのコネクタにケーブルを差して、母艦Linux機と接続します。
その状態で以下のコマンドを打つと、デバイスIDが取得できます

# このコマンドで確認する
lsusb

# 以下のIDで応答がある
# Orin NX 16GB の場合: 0955:7323 NVidia Corp
# Orin NX 8GB の場合: 0955:7423 NVidia Corp

ここまで確認したらジャンパ線は外しましょう。
外さないとセットアップに失敗します

2. Jetson Linux をダウンロードして構成する

Jetson Linux 35.4.1をダウンロードしてきます。
image.png
上記の画像のDRIVERSと書かれているところの2つ(Driver Package(BSP), Sample Root Filesystem)をダウンロードします。

そして以下のコマンドを順番に実行していきます

# ダウンロード先のフォルダに移動して以下のコマンドを実行
tar xf Jetson_Linux_R35.4.1_aarch64
sudo tar xpf Tegra_Linux_Sample-Root-Filesystem_R35.4.1_aarch64 -C Linux_for_Tegra/rootfs/
cd Linux_for_Tegra/
sudo ./apply_binaries.sh
sudo ./tools/l4t_flash_prerequisites.sh

3. HDMI搭載サードパーティ製キャリアボード対応

次にディレクトリを移動します

cd Linux_for_Tegra/bootloader/t186ref/BCT

そしてtegra234-mb2-bct-scr-p3767-0000.dtsというファイルを探して、以下を追記します。
tfcというセクションの中に追記です。

tegra234-mb2-bct-scr-p3767-0000.dts
tfc {
    reg@322 { /* GPIO_M_SCR_00_0 */
    exclusion-info = <2>;
    value = <0x38008080>;
    };

tfcというセクションにreg@322のブロックを追加します。
上記の記述を丸々コピペしてtfcというセクションが2個あるということにならないように注意です

ここで失敗すると起動しなくなります
その時は設定を再チェックしましょう

Jetson Linux r35.4.1のリリースノートに上記の変更が必要な旨が記載されています。
HDMIホットプラグ対応のためにGPIO_M_0という端子を割り当てているようですが、純正キャリアボードと純正ファームの組み合わせ以外の場合はこのピンにアクセスさせないように変更が必要とのこと。

4. ログインを簡略化する設定(オプション)

必要に応じて実施。やらなくてもセットアップはできると思います。
一つ上のディレクトリに移動して、ユーザーを設定して自動ログインするように構成します。
ユーザー名、パスワード、ホスト名の部分を自分用に書き換えてから実行してください

cd Linux_for_Tegra
sudo tools/l4t_create_default_user.sh -u {USERNAME} -p {PASSWORD} -a -n {HOSTNAME} --accept-license

# 例えば以下のように入力
udo tools/l4t_create_default_user.sh -u nvidia -p nvidia -a -n nvidia-desktop --accept-license

5.書き込み

以下のコマンドを実行すると書き込みが始まります

sudo ./tools/kernel_flash/l4t_initrd_flash.sh --external-device nvme0n1p1 \
  -c tools/kernel_flash/flash_l4t_external.xml -p "-c bootloader/t186ref/cfg/flash_t234_qspi.xml" \
  --showlogs --network usb0 p3509-a02+p3767-0000 internal

最後、自動的に再起動します。
ここで、Force Recovery Modeで起動するためのジャンパ線がつながったままだとエラーが出ます

もしJetsonのセットアップに失敗したときは、

  1. Force Recovery Mode で起動してジャンパを外す
  2. USB接続して書き込みのコマンドを実行

これで最初からやり直すことができます。セットアップがひと段落するまでは、ダウンロードしたセットアップ用のデータは消さないほうが良いと思います。

Jetson Statsのインストール

モニタリングツールがあると何かと便利なので入れます。

sudo apt install python3-pip
sudo -H pip3 install jetson-stats

下記のコマンドで情報を取得する

# 以下のコマンドを実行
jetson_release

# 下記の応答が返ってくる
Software part of jetson-stats 4.2.3 - (c) 2023, Raffaello Bonghi
Model: NVIDIA Orin NX Developer Kit - Jetpack 5.1.2 [L4T 35.4.1]
NV Power Mode[3]: 25W
Serial Number: [XXX Show with: jetson_release -s XXX]
Hardware:
 - Module: Check with sudo
Platform:
 - Distribution: Ubuntu 20.04 focal
 - Release: 5.10.120-tegra
jtop:
 - Version: 4.2.3
 - Service: Active
Libraries:
 - CUDA: Not installed
 - cuDNN: Not installed
 - TensorRT: Not installed
 - VPI: Not installed
 - Vulkan: 1.3.204
 - OpenCV: 4.2.0 - with CUDA: NO

上記の応答ではCUDAが機能していませんね。Jetpackのインストールが必要です。

ちなみに、jetson-statsは本来モニタリングツールです。
以下のコマンドで色々なステータスが見れます。

jtop

Jetpackのインストール

以下のコマンドでインストールできます。

sudo apt update
sudo apt install nvidia-jetpack

シェル起動時にパスを通すため、ホームディレクトリの.bashrcに以下を追記します

.bashrc
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"

その後、以下のコマンドが実行できれば成功です

nvcc --version

nvidia_releaseコマンドを打つと以下の応答が来ます

Software part of jetson-stats 4.2.3 - (c) 2023, Raffaello Bonghi
Model: NVIDIA Orin NX Developer Kit - Jetpack 5.1.2 [L4T 35.4.1]
NV Power Mode[3]: 25W
Serial Number: [XXX Show with: jetson_release -s XXX]
Hardware:
 - Module: Check with sudo
Platform:
 - Distribution: Ubuntu 20.04 focal
 - Release: 5.10.120-tegra
jtop:
 - Version: 4.2.3
 - Service: Active
Libraries:
 - CUDA: 11.4.315
 - cuDNN: 8.6.0.166
 - TensorRT: 5.1.2
 - VPI: 2.3.9
 - Vulkan: 1.3.204
 - OpenCV: 4.5.4 - with CUDA: NO

CUDA 11.4が入っています。

Dockerを準備

準備

ユーザーグループに追加します
これによりsudoを毎回つける必要はなくなります

sudo gpasswd -a $USER docker

コンテナランタイムの確認

docker info | grep Runtimes

# 下記が出力
 Runtimes: io.containerd.runc.v2 nvidia runc

動作確認

下記で適当なL4T向けのコンテナを探します
https://catalog.ngc.nvidia.com/containers?filters=&orderBy=scoreDESC&query=L4T

今回は下記で確認します

# TensorFlow向けコンテナの場合(Google製)
# イメージをプル
docker pull nvcr.io/nvidia/l4t-tensorflow:r35.3.1-tf2.11-py3

# インタラクティブモードでコンテナを起動
docker run -it --rm --runtime nvidia --network host nvcr.io/nvidia/l4t-tensorflow:r35.3.1-tf2.11-py3

一応動いたのでよしとします。

私は動作確認していませんが、ほかにも使えそうなコンテナあります。

# PyTorchの場合(Meta製)
docker pull nvcr.io/nvidia/l4t-pytorch:r35.2.1-pth2.0-py3
docker run -it --rm --runtime nvidia --network host nvcr.io/nvidia/l4t-pytorch:r35.2.1-pth2.0-py3

コンテナ内からGPUを使えるか確認

まずは認識状態を確認

手段は色々ありますが、上記コンテナはデフォルトでnvidia-smiが動かない様子
代わりにTensorFlowが認識しているかを確認します。

コンテナ内でpythonを起動します

$ python3

以下を入力

対話モード
from tensorflow.python.client import device_lib
device_lib.list_local_devices()

こんな出力があれば良さそう

[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 13133368536749627121
xla_global_id: -1
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 10984450560
locality {
  bus_id: 1
  links {
  }
}
incarnation: 9057423686936424877
physical_device_desc: "device: 0, name: Orin, pci bus id: 0000:00:00.0, compute capability: 8.7"
xla_global_id: 416903419
]

動作確認

やはり使える状態になっているか気になります。
超絶適当なCNNを学習させて、GPU使用率が上がることを確認しておきます。

サンプルコード
cifar10-cnn.py
import tensorflow as tf
from tensorflow.keras import datasets, layers, models

# Load and prepare the CIFAR10 dataset
(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()

# Normalize pixel values to be between 0 and 1
train_images, test_images = train_images / 255.0, test_images / 255.0

# Define the CNN architecture
model = models.Sequential([
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.Flatten(),
    layers.Dense(64, activation='relu'),
    layers.Dense(10)
])

# Compile the model
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

# Train the model
history = model.fit(train_images, train_labels, epochs=5, 
                    validation_data=(test_images, test_labels))

# Evaluate the model
test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)

print(test_acc)
print("finish")

コンテナを起動するときに、ホストのhomeディレクトリをコンテナ内のhomeにマウントするコマンドを追加して実行します。

docker run -it --rm --runtime nvidia --network host -v /home:/home nvcr.io/nvidia/l4t-tensorflow:r35.3.1-tf2.11-py3

サンプルコードを分かりやすい場所に置いてコンテナの中から実行します。

次に学習中に別ターミナルを立ち上げてjtopで状態を確認します。

$ jtop

以下の表示が確認できました。
image.png
見た感じ動いていそうです。

GUIの無効化

以下の記事を参考にGUIを無効化してメモリを節約します。
https://www.youtalk.jp/2023/03/28/jetson-orin-nano.html

まずはSSHサーバーを入れておきます

sudo apt install openssh-server

openssh-serverを入れるとホスト機のVSCodeでリモート開発ができるので、GUIを無効にしない場合でも入れておくと便利です。

GUI無効化はこのコマンド打って再起動です

sudo systemctl set-default multi-user.target

GUIを再度有効化するときは以下のコマンド

sudo systemctl set-default graphical.target

以上でセットアップ完了です。

おまけ

Tensorflow を直接セットアップする

dockerコンテナを使う場合は不要ですが、一応記載しておきます

以下を参考に進めていきます
https://docs.nvidia.com/deeplearning/frameworks/install-tf-jetson-platform/index.html

Jetpackのインストールが完了している必要があります。

依存関係をインストールしていきます

sudo apt-get update
sudo apt-get install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev liblapack-dev libblas-dev gfortran

pip3をアップデートします

sudo apt-get install python3-pip
sudo python3 -m pip install --upgrade pip
sudo pip3 install -U testresources setuptools==65.5.0

関連ライブラリを入れていきます

sudo pip3 install -U numpy==1.22 future==0.18.2 mock==3.0.5 keras_preprocessing==1.1.2 keras_applications==1.0.8 gast==0.4.0 protobuf pybind11 cython pkgconfig packaging h5py==3.6.0

以下のコマンドでインストールします

sudo pip3 install --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v512 tensorflow==2.12.0+nv23.06

インストールするバージョンは、CUDAバージョンと対応する必要があります。
別バージョンが使いたいときは、以下のリストを参考にバージョン指定を行ってください。
https://docs.nvidia.com/deeplearning/frameworks/install-tf-jetson-platform-release-notes/tf-jetson-rel.html#tf-jetson-rel

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?