はじめに
2020 年 5 月 14 日 Jetson Xavier NX が発表され、翌日 (5 月 15 日) に発売となりました。
菱洋エレクトロとマクニカ (スイッチサイエンス) で取り扱いが開始され、5 月 15 日 に注文し、翌日 (5 月 16 日) にスイッチサイエンスから入手できました。
開封の儀
開封しようとしたら、案の定、既に開封されている状態でした。
マクニカからのお知らせが同梱され、AC アダプタにシールが貼られていました。
一つだけ注意点は、付属している AC アダプタとケーブルは 3P 仕様のため、一般家庭のコンセントに挿す場合は別途、3P → 2P の変換ケーブル、または、変換アダプタが必要になります。
本体の大きさは Jetson Nano とほぼ同じですが、Jetson Nano との大きな違いは、AC アダプタ、冷却ファン、無線 LAN / Bluetooth カードが標準で付属されていることです。
ディスプレイ、USB キーボード、マウスを接続するだけです。(有線 LAN は必要に応じて使用)
(上が Jetson Nano、下が Jetson Xavier NX)
裏面に無線 LAN / Bluetooth カードが実装されています。いわゆる技適マークも基板に印刷されています。
SD カードイメージをダウンロードして使用する場合 (後述) は、お知らせに記載されている日本語マニュアルのダウンロードは不要でした。
SD カード作成
Jetson Download Center から SD カードイメージをダウンロードします。
5 月 16 日時点では JetPack 4.4 Developer Preview でした。
nv-jetson-nx-sd-card-image-r32.4.2.zip (約 6 GB)
Jetson Nano 用と分かれているので注意が必要です。
Etcher を使用して SD カード (32GB を使用) に書き込みを行いました。
初期セットアップ
SD カードを挿して Jetson Xavier NX を起動します。
キーボード、言語、タイムゾーン、無線 LAN 接続などを設定して再起動します。
デフォルトの動作モードは 10W 2CORE で、5 種類の中から選択できます。
ソフトウェアアップデート
デスクトップ上でマウスの右クリックを押し、Open Terminal を選択します。
$ sudo apt update
$ sudo apt upgrade
Jetson stats のインストール
CPU / GPU の使用率やメモリの使用量などをグラフィカルに確認できる jtop コマンドをインストールします。
$ sudo apt install python3-pip
$ sudo -H pip3 install -U jetson-stats
$ sudo jtop
CUDA サンプルデモの実行
Jetson Nano との比較のため、書籍「Jetson Nano 超入門」の Part 4-2 に沿って GPU を使用する CUDA プラットフォームのデモを動かしてみます。
$ cd /usr/local/cuda-10.2/samples
fluidsGL
$ cd 5_Simulations/fluidsGL
$ sudo make
$ sudo ./fluidsGL

nbody
$ cd 5_Simulations/nbody
$ sudo make
$ sudo ./nbody

oceanFFT
$ cd 5_Simulations/oceanFFT
$ sudo make
$ sudo ./oceanFFT

smokePartiicles
$ cd 5_Simulations/smokeParticles
$ sudo make
$ sudo ./smokeParticles

VisionWorks サンプルデモの実行
Jetson Nano との比較のため、書籍「Jetson Nano 超入門」の Part 4-3 に沿って カメラ等で撮影した映像をリアルタイム解析して情報を付加するデモを動かしてみます。
$ cd /usr/share/visionworks/sources
$ sudo make
$ cd bin/aarch64/linux/release
Feature Tracker
$ sudo ./nvx_demo_feature_tracker

Object Tracker
$ sudo ./nvx_sample_object_tracker_nvxcu

motion estimation
$ sudo ./nvx_demo_motion_estimation

マルチコンテナデモの実行
Cloud-Nativeのデモです。別途、M.2 スロットに接続する NVMe SSD (128GB を用意) とマイク付きヘッドセット (自然言語処理 BERT のデモ用) が必要です。
https://github.com/NVIDIA-AI-IOT/jetson-cloudnative-demo

以下、jetson ユーザーでコマンドを実行する前提です。
(ユーザー名が異なる場合、ホームディレクトリ名が異なります。)
NVMe SSD をフォーマット、マウントします。
$ sudo mkfs.ext4 /dev/nvme0n1
$ sudo mkdir nvme
$ sudo mount /dev/nvme0n1 /home/jetson/nvme
起動時に NVMe SSD をマウントする設定を追加します。
$ sudo vi /etc/fstab
/dev/nvme0n1 /home/jetson/nvme ext4 defaults 0 1
docker レジストリを NVMe SSD へ移動します。
$ sudo mv /var/lib/docker /home/jetson/nvme/
$ sudo ln -s /home/jetson/nvme/docker /var/lib/
ZRAM (メモリ圧縮) 機能を無効化します。
$ cd /etc/systemd
$ sudo mv nvzramconfig.sh nvzramconfig.sh.orig
NVMe SSD 上にスワップファイルを作成します。
$ sudo fallocate -l 32G /home/jetson/nvme/swapfile
$ sudo chmod 600 /home/jetson/nvme/swapfile
$ sudo mkswap /home/jetson/nvme/swapfile
$ sudo swapon /home/jetson/nvme/swapfile
スワップの状態を確認します。(追加したスワップファイル swapfile が表示されることを確認します。)
$ swapon -s
起動時にスワップファイルをマウントする設定を追加します。
$ sudo vi /etc/fstab
/home/jetson/nvme/swapfile swap swap defaults 0 0
一度、再起動します。
$ sudo reboot
4 つのコンテナイメージをダウンロードします。(サイズが大きいのでダウンロードに時間がかかります。)
- DeepStream Container with people detection
- Pose container with pose detection
- Gaze container with gaze detection
- Voice container with speech recognition and Natural Language Processing
$ sudo docker pull nvcr.io/nvidia/deepstream-peopledetection:r32.4.2
$ sudo docker pull nvcr.io/nvidia/jetson-pose:r32.4.2
$ sudo docker pull nvcr.io/nvidia/jetson-gaze:r32.4.2
$ sudo docker pull nvcr.io/nvidia/jetson-voice:r32.4.2
コンテナイメージを確認します。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nvcr.io/nvidia/deepstream-peopledetection r32.4.2 5eb53ed0c347 4 weeks ago 2.96GB
nvcr.io/nvidia/jetson-voice r32.4.2 115264c7375d 4 weeks ago 12.2GB
nvcr.io/nvidia/jetson-pose r32.4.2 e30178601a5f 4 weeks ago 3.47GB
nvcr.io/nvidia/jetson-gaze r32.4.2 c078fdeb5872 4 weeks ago 4.62GB
以上で準備が整いましたので、最後にデモを動かします。
$ git clone https://github.com/NVIDIA-AI-IOT/jetson-cloudnative-demo
$ sudo apt-get install xdotool
$ cd jetson-cloudnative-demo
$ sudo ./run_demo.sh
個別にデモを動かすこともできます。
$ sudo ./run_peopleDetect.sh
$ sudo ./run_pose.sh
$ sudo ./run_gaze.sh
$ sudo ./run_trtis.sh
$ sudo ./run_voice.sh
people detection

pose detection

gaze detection


speech recognition and Natural Language Processing


ベンチマークデモの実行
ベンチマーク
$ cd nvme
$ git clone https://github.com/NVIDIA-AI-IOT/jetson_benchmarks.git
$ cd jetson_benchmarks
$ mkdir models
必要な Python モジュールをインストールします。
$ sudo sh install_requirements.sh
モデルをダウンロードします。
$ python3 utils/download_models.py --all --csv_file_path /home/jetson/nvme/jetson_benchmarks/benchmark_csv/nx-benchmarks.csv --save_dir /home/jetson/nvme/jetson_benchmarks/models/
最後にベンチマークを実行します。
$ sudo python3 benchmark.py --all --csv_file_path /home/jetson/nvme/jetson_benchmarks/benchmark_csv/nx-benchmarks.csv --model_dir /home/jetson/nvme/jetson_benchmarks/models/
実行結果は以下のとおりです。(全部動かすと 2 時間かかると脅されます。笑)
Please close all other applications and Press Enter to continue...
Setting Jetson xavier-nx in max performance mode
gpu frequency is set from 114750000 Hz --> to 1109250000 Hz
dla frequency is set from 1100800000 Hz --> to 1100800000 Hz
Running all benchmarks.. This will take at least 2 hours...
------------Executing inception_v4------------
--------------------------
Model Name: inception_v4
FPS:300.15
--------------------------
Wall Time for running model (secs): 714.0217275619507
------------Executing vgg19_N2------------
--------------------------
Model Name: vgg19_N2
FPS:61.19
--------------------------
Wall Time for running model (secs): 409.49467253685
------------Executing super_resolution_bsd500------------
--------------------------
Model Name: super_resolution_bsd500
FPS:141.83
--------------------------
Wall Time for running model (secs): 260.71988797187805
------------Executing unet-segmentation------------
--------------------------
Model Name: unet-segmentation
FPS:140.45
--------------------------
Wall Time for running model (secs): 434.53681230545044
------------Executing pose_estimation------------
--------------------------
Model Name: pose_estimation
FPS:237.03
--------------------------
Wall Time for running model (secs): 337.3893702030182
------------Executing yolov3-tiny-416------------
--------------------------
Model Name: yolov3-tiny-416
FPS:511.38
--------------------------
Wall Time for running model (secs): 392.12764382362366
------------Executing ResNet50_224x224------------
--------------------------
Model Name: ResNet50_224x224
FPS:793.35
--------------------------
Wall Time for running model (secs): 388.17510437965393
------------Executing ssd-mobilenet-v1------------
--------------------------
Model Name: ssd-mobilenet-v1
FPS:854.21
--------------------------
Wall Time for running model (secs): 423.615553855896
Model Name FPS
0 inception_v4 300.154714
1 vgg19_N2 61.191951
2 super_resolution_bsd500 141.831304
3 unet-segmentation 140.447409
4 pose_estimation 237.027765
5 yolov3-tiny-416 511.377979
6 ResNet50_224x224 793.352630
7 ssd-mobilenet-v1 854.207239
個別にデモを動かすこともできます。
Inception V4
$ sudo python3 benchmark.py --model_name inception_v4 --csv_file_path /home/jetson/nvme/jetson_benchmarks/benchmark_csv/nx-benchmarks.csv --model_dir /home/jetson/nvme/jetson_benchmarks/models/
VGG19
$ sudo python3 benchmark.py --model_name vgg19 --csv_file_path /home/jetson/nvme/jetson_benchmarks/benchmark_csv/nx-benchmarks.csv --model_dir /home/jetson/nvme/jetson_benchmarks/models/
Super Resolution
$ sudo python3 benchmark.py --model_name super_resolution --csv_file_path /home/jetson/nvme/jetson_benchmarks/benchmark_csv/nx-benchmarks.csv --model_dir /home/jetson/nvme/jetson_benchmarks/models/
UNET Segmentation
$ sudo python3 benchmark.py --model_name unet --csv_file_path /home/jetson/nvme/jetson_benchmarks/benchmark_csv/nx-benchmarks.csv --model_dir /home/jetson/nvme/jetson_benchmarks/models/
Pose Estimation
$ sudo python3 benchmark.py --model_name pose_estimation --csv_file_path /home/jetson/nvme/jetson_benchmarks/benchmark_csv/nx-benchmarks.csv --model_dir /home/jetson/nvme/jetson_benchmarks/models/
Tiny-YOLO-V3
$ sudo python3 benchmark.py --model_name tiny-yolov3 --csv_file_path /home/jetson/nvme/jetson_benchmarks/benchmark_csv/nx-benchmarks.csv --model_dir /home/jetson/nvme/jetson_benchmarks/models/
ResNet-50
$ sudo python3 benchmark.py --model_name resnet --csv_file_path /home/jetson/nvme/jetson_benchmarks/benchmark_csv/nx-benchmarks.csv --model_dir /home/jetson/nvme/jetson_benchmarks/models/
SSD-MobileNet-V1 Segmentation
$ sudo python3 benchmark.py --model_name ssd-mobilenet-v1 --csv_file_path /home/jetson/nvme/jetson_benchmarks/benchmark_csv/nx-benchmarks.csv --model_dir /home/jetson/nvme/jetson_benchmarks/models/
ルートファイルシステムを NVMe SSD ドライブへ変更する
最初、SD カードからの起動は変わりませんが、systemd によるシステム起動シーケンスで initrd からルートファイルシステムへの chroot 先を SD カードから NVMe SSD ドライブへ切り替えることにより起動時間が早くなります。
systemd-analyze の結果で、33.2 秒 → 17.3 秒へ短縮されました。
$ systemd-analyze plot > result.svg
左: SD カード、右: NVMe SSD ドライブ (result.svg の表示例)
手順
パーティションを作成します。
$ sudo fdisk /dev/nvme0n1
Command (m for help): n ← n を入力
Select (default p): p ← p を入力
Partition number (1-4, default 1): (改行) ← Enter を入力
First sector (2048-250069679, default 2048): (改行) ← Enter を入力
Last sector, +sectors or +size{K,M,G,T,P} (2048-250069679, default 250069679): (改行) ← Enter を入力
Command (m for help): w ← w を入力
ファイルシステムを ext4 でフォーマットします。
$ sudo mkfs -t ext4 /dev/nvme0n1p1
JetsonHacks のスクリプトをダウンロードして実行します。
$ git clone https://github.com/jetsonhacks/rootOnNVMe.git
$ cd rootOnNVMe/
$ ./copy-rootfs-ssd.sh
$ ./setup-service.sh
最後に再起動します。
$ sudo reboot
カーネルのビルド時間が劇的に短くなりました!
$ ./makeKernel.sh
real 111m40.689s
user 44m39.048s
sys 3m40.908s
↓
real 22m50.904s
user 92m5.668s
sys 8m16.444s
$ ./makeModules.sh
real 207m34.403s
user 108m12.652s
sys 9m6.864s
↓
real 27m43.071s
user 123m45.088s
sys 10m5.556s
注意点
JetsonHacks にも記載されていますが、カーネルやカーネルモジュールを更新した場合は SD カードへの反映も必要になります。
カーネルビルド後に SD カードへ反映するコマンドです。
( < UUID> の部分は デバイス毎に変わるため mount や df コマンド等で確認)
$ sudo rsync -av /boot/ /media/jetson/<UUID>/boot/
$ sudo rsync -av /lib/modules/4.9.140-tegra/ /media/jetson/<UUID>/lib/modules/4.9.140-tegra/
(続く)