Jetson Xavier NX インストールメモ (※随時更新)

# はじめに
2020 年 5 月 14 日 Jetson Xavier NX が発表され、翌日 (5 月 15 日) に発売となりました。
菱洋エレクトロとマクニカ (スイッチサイエンス) で取り扱いが開始され、5 月 15 日 に注文し、翌日 (5 月 16 日) にスイッチサイエンスから入手できました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/b77e51d7-7c56-b1c2-c974-76eb05bc1043.png" width="75%">

# 開封の儀
開封しようとしたら、案の定、既に開封されている状態でした。
マクニカからのお知らせが同梱され、AC アダプタにシールが貼られていました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/0037ea15-c4a1-30cf-4419-9114c0146327.jpeg" width=45%> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/74ac8b7a-37ef-e2a7-e917-d02f8a43dc58.jpeg" width=45%">

一つだけ注意点は、付属している AC アダプタとケーブルは 3P 仕様のため、一般家庭のコンセントに挿す場合は別途、3P → 2P の変換ケーブル、または、変換アダプタが必要になります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/7e62b29e-5968-57f2-7672-9d4254aec532.png" width="30%"> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/d045c8c4-6748-33ce-14c3-863ae792f4e1.png" width="33%"> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/ae0efec9-c3e4-689e-45d4-c9143d1898b8.png" width="33%">

本体の大きさは Jetson Nano とほぼ同じですが、Jetson Nano との大きな違いは、AC アダプタ、冷却ファン、無線 LAN / Bluetooth カードが標準で付属されていることです。
ディスプレイ、USB キーボード、マウスを接続するだけです。(有線 LAN は必要に応じて使用)  
(上が Jetson Nano、下が Jetson Xavier NX)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/bbefe038-615b-7a36-a937-f3b0eb407192.png" width="50%">

裏面に無線 LAN / Bluetooth カードが実装されています。いわゆる技適マークも基板に印刷されています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/42dd3281-1052-65df-518d-3abc376d4b4b.jpeg" width="75%">

SD カードイメージをダウンロードして使用する場合 (後述) は、お知らせに記載されている日本語マニュアルのダウンロードは不要でした。

# SD カード作成
<a href="https://developer.nvidia.com/embedded/downloads
">Jetson Download Center</a> から SD カードイメージをダウンロードします。
5 月 16 日時点では JetPack 4.4 Developer Preview でした。
nv-jetson-nx-sd-card-image-r32.4.2.zip (約 6 GB)
Jetson Nano 用と分かれているので注意が必要です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/7e581ef9-c638-cc1b-6b22-75a936a47ae3.png" width="75%">


Etcher を使用して SD カード (32GB を使用) に書き込みを行いました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/6972e0a4-e638-1581-8438-75d6f0aedf53.png" width="75%">

# 初期セットアップ
SD カードを挿して Jetson Xavier NX を起動します。
キーボード、言語、タイムゾーン、無線 LAN 接続などを設定して再起動します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/065ab86f-2122-4681-5449-90a45313b9b4.png" width="75%">

デフォルトの動作モードは 10W 2CORE で、5 種類の中から選択できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/47ac3dc1-1bfe-d67d-584a-ac86d7995e99.png" width="50%">


## ソフトウェアアップデート
デスクトップ上でマウスの右クリックを押し、Open Terminal を選択します。

```bash
$ sudo apt update
$ sudo apt upgrade
```

## Jetson stats のインストール
CPU / GPU の使用率やメモリの使用量などをグラフィカルに確認できる jtop コマンドをインストールします。

```bash
$ sudo apt install python3-pip
$ sudo -H pip3 install -U jetson-stats
$ sudo jtop
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/43e78b5e-9059-2417-7883-1026c8a7e4ea.png" width="45%"> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/f163495b-0728-e776-1ee9-84b0c882cc95.png" width="45%">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/37cc8c68-8d79-b84a-27c3-b9b90123c46d.png" width="45%"> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/bb2db70e-0af1-59e2-db59-2d01dace3af1.png" width="45%">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/a0c1ca15-c924-8eb0-2cec-5e75a612d3ef.png" width="45%"> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/4102baa7-7c6a-7209-fe8b-dcd6c0ffca29.png" width="45%">


## CUDA サンプルデモの実行
Jetson Nano との比較のため、書籍「<a href="https://www.amazon.co.jp/Jetson-Nano%E8%B6%85%E5%85%A5%E9%96%80-Japan-User-Group/dp/4800712513">Jetson Nano 超入門</a>」の Part 4-2 に沿って GPU を使用する CUDA プラットフォームのデモを動かしてみます。

```bash
$ cd /usr/local/cuda-10.2/samples
```

### fluidsGL

```bash
$ cd 5_Simulations/fluidsGL
$ sudo make
$ sudo ./fluidsGL
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/4454bd62-35ad-0c26-94a8-bf4f14f15494.png" width="75%">

### nbody

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

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/c039a95c-a1f6-4fcc-66bc-964b6f575d51.png" width="75%">

### oceanFFT

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

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/6f698fe0-fa33-5734-6cd7-1a517741f10c.png" width="75%">

### smokePartiicles

```bash
$ cd 5_Simulations/smokeParticles
$ sudo make
$ sudo ./smokeParticles
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/24a6f93e-de78-9ab9-4994-ada8dae761dc.png" width="75%">


## VisionWorks サンプルデモの実行
Jetson Nano との比較のため、書籍「<a href="https://www.amazon.co.jp/Jetson-Nano%E8%B6%85%E5%85%A5%E9%96%80-Japan-User-Group/dp/4800712513">Jetson Nano 超入門</a>」の Part 4-3 に沿って カメラ等で撮影した映像をリアルタイム解析して情報を付加するデモを動かしてみます。

```bash
$ cd /usr/share/visionworks/sources
$ sudo make
$ cd bin/aarch64/linux/release
```

### Feature Tracker

```bash
$ sudo ./nvx_demo_feature_tracker
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/049f5d26-c1e2-2d77-0fc3-12519134de01.png" width="75%">

### Object Tracker

```bash
$ sudo ./nvx_sample_object_tracker_nvxcu
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/5badadca-f6c4-7923-37ee-023ec906b802.png" width="75%">

### motion estimation

```bash
$ sudo ./nvx_demo_motion_estimation
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/8b089bac-b725-affd-3412-ef03706aa92f.png" width="75%">

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

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/82e879cb-8546-859c-ad5f-5d9e4a8f6a94.png" width="50%">

以下、jetson ユーザーでコマンドを実行する前提です。
(ユーザー名が異なる場合、ホームディレクトリ名が異なります。)

NVMe SSD をフォーマット、マウントします。

```bash
$ sudo mkfs.ext4 /dev/nvme0n1
$ sudo mkdir nvme
$ sudo mount /dev/nvme0n1 /home/jetson/nvme
```

起動時に NVMe SSD をマウントする設定を追加します。

```bash
$ sudo vi /etc/fstab
```

```text:/etc/fstab
/dev/nvme0n1 /home/jetson/nvme ext4 defaults 0 1
```

docker レジストリを NVMe SSD へ移動します。

```bash
$ sudo mv /var/lib/docker /home/jetson/nvme/
$ sudo ln -s /home/jetson/nvme/docker /var/lib/
```

ZRAM (メモリ圧縮) 機能を無効化します。

```bash
$ cd /etc/systemd
$ sudo mv nvzramconfig.sh nvzramconfig.sh.orig
```

NVMe SSD 上にスワップファイルを作成します。

```bash
$ 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 が表示されることを確認します。)

```bash
$ swapon -s
```

起動時にスワップファイルをマウントする設定を追加します。

```bash
$ sudo vi /etc/fstab
```

```text:/etc/fstab
/home/jetson/nvme/swapfile swap swap defaults 0 0
```

一度、再起動します。

```bash
$ sudo reboot
```

4 つのコンテナイメージをダウンロードします。(サイズが大きいのでダウンロードに時間がかかります。)

- <a href="https://ngc.nvidia.com/catalog/containers/nvidia:deepstream-peopledetection">DeepStream Container with people detection</a>  
- <a href="https://ngc.nvidia.com/catalog/containers/nvidia:jetson-pose">Pose container with pose detection</a>  
- <a href="https://ngc.nvidia.com/catalog/containers/nvidia:jetson-gaze">Gaze container with gaze detection</a>  
- <a href="https://ngc.nvidia.com/catalog/containers/nvidia:jetson-voice">Voice container with speech recognition and Natural Language Processing</a>
  
```bash
$ 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
```

コンテナイメージを確認します。

```bash
$ 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
```

以上で準備が整いましたので、最後にデモを動かします。

```bash
$ git clone https://github.com/NVIDIA-AI-IOT/jetson-cloudnative-demo
$ sudo apt-get install xdotool
$ cd jetson-cloudnative-demo
$ sudo ./run_demo.sh
```

個別にデモを動かすこともできます。

```bash
$ sudo ./run_peopleDetect.sh
$ sudo ./run_pose.sh
$ sudo ./run_gaze.sh
$ sudo ./run_trtis.sh
$ sudo ./run_voice.sh
```

### people detection
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/2bda7c26-b25f-db8f-649f-5e4753ad4135.png" width="75%">

### pose detection
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/7bae456c-63b7-fe8a-5fb4-988b5edbaa37.png" width="75%">

### gaze detection
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/9e2f5023-1e38-005c-b415-d2f3f1c2e5a0.png" width="75%">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/2791f052-7837-6819-51f9-85642a2be190.png" width="75%">

### speech recognition and Natural Language Processing
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/0b7a5ec4-00e9-92cb-4cb3-1ec5f4ac7a86.png" width="75%">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/99b85b96-5e1b-3987-ce70-ed5ee9c81d84.png" width="75%">

## ベンチマークデモの実行
https://github.com/NVIDIA-AI-IOT/jetson_benchmarks

ベンチマーク

```bash
$ cd nvme
$ git clone https://github.com/NVIDIA-AI-IOT/jetson_benchmarks.git
$ cd jetson_benchmarks
$ mkdir models
```

必要な Python モジュールをインストールします。

```bash
$ sudo sh install_requirements.sh
```

モデルをダウンロードします。

```bash
$ 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/
```

最後にベンチマークを実行します。

```bash
$ 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 時間かかると脅されます。笑)

```bash
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

```bash
$ 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

```bash
$ 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

```bash
$ 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

```bash
$ 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

```bash
$ 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

```bash
$ 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

```bash
$ 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

```bash
$ 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 秒へ短縮されました。

```bash
$ systemd-analyze plot > result.svg
```

左: <a href="https://drive.google.com/file/d/19zfnHntS359Mc6OQJzrbA_Diq0iYVa4f/view?usp=sharing">SD カード</a>、右: <a href="https://drive.google.com/file/d/1N-au7cWVSZ-CQ73E3hIQSWo9fm9SkHGy/view?usp=sharing">NVMe SSD ドライブ</a> (result.svg の表示例)
![systemd_analyze.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/7d8a49be-18fc-2a92-f200-8c751b42cf6d.png)

### 手順
パーティションを作成します。

```bash
$ 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 でフォーマットします。

```bash
$ sudo mkfs -t ext4 /dev/nvme0n1p1
```

<a href="https://www.jetsonhacks.com/2020/05/29/jetson-xavier-nx-run-from-ssd/">JetsonHacks</a> のスクリプトをダウンロードして実行します。

```bash
$ git clone https://github.com/jetsonhacks/rootOnNVMe.git
$ cd rootOnNVMe/
$ ./copy-rootfs-ssd.sh
$ ./setup-service.sh
```

最後に再起動します。

```bash
$ sudo reboot
```

カーネルのビルド時間が劇的に短くなりました！

```bash
$ ./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
```

### 注意点
<a href="https://www.jetsonhacks.com/2020/05/29/jetson-xavier-nx-run-from-ssd/">JetsonHacks</a> にも記載されていますが、カーネルやカーネルモジュールを更新した場合は SD カードへの反映も必要になります。
<img width="707" alt="スクリーンショット 2020-06-06 21.44.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/3f0ad3a3-1871-95b7-bcc3-7c2d723de637.png">

カーネルビルド後に SD カードへ反映するコマンドです。
( &lt; UUID&gt; の部分は デバイス毎に変わるため mount や df コマンド等で確認)

```bash
$ 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/
```

(続く)