Jetson Nanoインストールメモ

2021年12月にJetson Nanoのインストール作業をしている時のメモです。

# OSインストール

1. [nVidiaの開発者サイト](https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#write)からOSイメージダウンロード  
    ここでは `jetson-nano-jp46-sd-card-image.zip` をダウンロードしたOSイメージとします。

2. ZIPファイルを展開する

    ```bash
    unzip jetson-nano-jp46-sd-card-image.zip
    ```

3. マイクロSDカードに書込む

    ```bash
    sudo dd if=./sd-blob-b01.img of=/dev/sdX
    ```  

    /dev/sdXはdmesg等のコマンドでSDカードに割り当てられたデバイス名を指定してください。


# SWAP領域の作成

SWAP領域がないとTensorflowのインストール中で止まるみたいなのでSWAT領域を追加します。
USBメモリをSWAPに割り当てた方が性能よさそうですが、その辺を丸っと無視してSDカード上にSWAP領域を作成します。
サイズとしては4GB～8GBが推奨されてるらしい。

```bash:swap領域作成
sudo dd if=/dev/zero of=/swap bs=1G count=8
sudo chmod 600 /swap
sudo mkswap /swap
sudo swapon /swap
```

- SWAP領域の有効確認
    ```cat /proc/swaps```

- fstabの編集
    ```sudo sh -c "echo '/swap none swap sw 0 0' >> /etc/fstab"```

    リダイレクトの不等号の数を間違えて悲しい思いをしたことがあります．．．

* swappinessの調整

    swappinessは、（たぶん）物理メモリの残りが何%になったらSWAPを使うか指定するパラメータです。  
    「0」を設定すると、物理メモリをすべて使用するまでSWAPを使わないようにできるため、（たぶん）無駄なSDカードアクセスを防止できます。

    ```bash
    sudo sh -c "echo 'vm.swappiness=0' >> /etc/sysctl.conf"
    sudo sysctl -p
    ```
  
    Swapファイルの設定については[installSwapfile](https://github.com/JetsonHacksNano/installSwapfile)というツールを使用する方法もあります。


# Jetpack のバージョンの確認

- バージョンだけを確認する場合

```bash:apt_showで確認
$ sudo apt show nvidia-jetpack
```

- CUDA や cuDNN 等のバージョンも確認する

```bash:jetsonInfo.py
$ git clone https://github.com/jetsonhacks/jetsonUtilities
$ cd jetsonUtilities
$ python jetsonInfo.py
NVIDIA Jetson Nano (Developer Kit Version)
 L4T 32.6.1 [ JetPack 4.6 ]
   Ubuntu 18.04.6 LTS
   Kernel Version: 4.9.253-tegra
 CUDA 10.2.300
   CUDA Architecture: 5.3
 OpenCV version: 4.1.1
   OpenCV Cuda: NO
 CUDNN: 8.2.1.32
 TensorRT: 8.0.1.6
 Vision Works: 1.6.0.501
 VPI: ii libnvvpi1 1.1.15 arm64 NVIDIA Vision Programming Interface library
 Vulcan: 1.2.70
```


# 機械学習フレームワークのインストール

## tensorlow

[Installing TensorFlow For Jetson Platform :: NVIDIA Deep Learning Frameworks Documentation](https://docs.nvidia.com/deeplearning/frameworks/install-tf-jetson-platform/index.html) に従ってインストールします。

```bash:tensorflow依存パッケージのインストール
# tensorflow 依存パッケージのインストール
$ 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 pip3 install -U pip testresources setuptools==49.6.0

# その他の依存パッケージのインストール
$ sudo pip3 install -U --no-deps \
            numpy==1.19.4 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
$ sudo env H5PY_SETUP_REQUIRES=0 pip3 install -U h5py==3.1.0
```

```bash:tensorflowのインストール
$ sudo pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v46 tensorflow
```

2021年12月現在、インストールされる tensorflow のバージョンは v2.6.2 のようです。
あと、h5py をインストールする時、結構時間がかかり、しばらくコマンドの応答がなくなります。


## PyTorch

[PyTorch for Jetson Nano - NVIDIA Developer Forums](https://devtalk.nvidia.com/default/topic/1049071/pytorch-for-jetson-nano/)

```bash:PyTorchのインストール
$ wget https://nvidia.box.com/shared/static/fjtbno0vpo676a25cgvuqc1wty0fkkg6.whl \
        -O torch-1.10.0-cp36-cp36m-linux_aarch64.whl
$ sudo apt-get install python3-pip libopenblas-base libopenmpi-dev
$ pip3 install Cython
$ pip3 install numpy torch-1.10.0-cp36-cp36m-linux_aarch64.whl torchvision
```


## sikitlean

```bash:sikitleanのインストール
$ sudo pip3 install scikit-learn
```

import 時に、`ModuleNotFoundError: No module named 'numpy.testing.nosetester'` のエラーが出る場合は `scipy` を更新すると直るはずです。



## Chainer

```bash:Chainerのインストール
pip3 install fastrlock cupy
pip3 install chainer
```

cupyのインストールに1時間くらいかかります。


# OpenCV

[Install OpenCV 4.5 on Jetson Nano - Q-engineering](https://qengineering.eu/install-opencv-4.5-on-jetson-nano.html) でインストールスクリプトとその中身の解説が公開されていました。
内容をざっくり要約すると、

1. SWAP メモリを 4GB 用意する。
1. 下記コマンド実行

    ```bash:OpenCV4.5.5インストール
    $ wget https://github.com/Qengineering/Install-OpenCV-Jetson-Nano/raw/main/OpenCV-4-5-5.sh
    $ chmod u+x ./OpenCV-4-5-5.sh
    $ ./OpenCV-4-5-5.sh
    Installing OpenCV 4.5.5 on your Jetson Nano
    It will take 3 hours !
    ・・・
    ```

    `OpenCV-4-5-5.sh` を実行すると「インストールに3時間かかるよ」と教えてくれます。
    実際、time コマンドで測ってみましたところ、約150分かかりました。
    OpenCV のビルドが長すぎて sudo がパスワードの再入力を求めてくるので、初めから root で `OpenCV-4-5-5.sh` を実行した方が良いかもしれません。

    インストール後、下記を実行してエラーが出なければ正しくインストールできています。

    ```python:OpenCVインストール確認
    $ python3
    Python 3.6.9 (default, Dec  8 2021, 21:08:43)
    [GCC 8.4.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import cv2
    >>> cv2.__version__
    '4.5.5'
    ```


# VS Code

昔はソースからインストールする必要がありましたが、最近では [Visual Studio Code – コード エディター | Microsoft Azure](https://azure.microsoft.com/ja-jp/products/visual-studio-code/) から `arm64` 版の deb パッケージをダウンロードするだけでインストールできるようになりました。


# GPU負荷のモニタリング方法

[gpuGraph](https://github.com/JetsonHacksNano/gpuGraph)

```bash
git clone https://github.com/JetsonHacksNano/gpuGraph
cd gpuGraph
python3 gpuGraph.py
```


# その他
## luaが有効なVimのインストール

T4L標準のVimはluaが無効っぽいので有効にします。neocompleteとかを使わない人には無縁の機能です。

```bash:luaのインストール
export ROOTFS="$HOME/rootfs"
mkdir -p $ROOTFS

curl -R -O http://www.lua.org/ftp/lua-5.3.5.tar.gz
tar zxf lua-5.3.5.tar.gz
pushd lua-5.3.5
make linux test
make install INSTALL_TOP=$ROOTFS
popd
```

```bash:vimのインストール
git clone https://github.com/vim/vim.git
pushd vim/src
make distclean
./configure \
    --prefix=$ROOTFS \
    --enable-fail-if-missing \
    --with-features=huge \
    --disable-selinux \
    --enable-luainterp \
    --enable-perlinterp \
    --enable-python3interp=yes \
    --with-python3-config-dir=/usr/lib/python3.6/config-3.6m-aarch64-linux-gnu/ \
    --enable-cscope \
    --enable-fontset \
    --enable-multibyte \
    --with-lua-prefix=$ROOTFS \
    vi_cv_path_python3=/usr/bin/python3.6
make && make install
popd
```

 ```bash:vimプラグインのインストール
mkdir -p $HOME/.vim/pack/mypackage/opt
mkdir -p $HOME/.vim/pack/mypackage/start

pushd $HOME/.vim/pack/mypackage/start
git clone https://github.com/Shougo/neocomplete.vim.git
popd
```

```bash:PATHの調整
echo "let g:neocomplete#enable_at_startup = 1" >> $HOME/.vimrc
echo "export PATH=$HOME/rootfs/bin:$PATH" >> $HOME/.bashrc
source $HOME/.bashrc
```

## pyenv-virtualenvのインストール

複数バージョンのpython環境が必要になった時、インストールしておくと便利です。


- pyenvのインストール

    ```bash
    git clone https://github.com/pyenv/pyenv.git $HOME/.pyenv
    ```

- $HOME/.bashrcへの追加 その1

    ```bash:$HOME/.bashrc
    export PYENV_ROOT=$HOME/.pyenv
    export PATH=$PYENV_ROOT/bin:$PATH
    if command -v pyenv 1>/dev/null 2>&1; then
        eval "$(pyenv init -)"
    fi
    ```

- $HOME/.bashrcの再読込み その1
     ```$ source $HOME/.bashrc```

- pyenv-virtualenvのインストール

    ```bash
    git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
    ```

- $HOME/.bashrcへの追加 その2

    ```bash:$HOME/.bashrc
    eval "$(pyenv virtualenv-init -)"
    ```

- $HOME/.bashrcの再読込み その2

    ```
    source $HOME/.bashrc
    ```


### python3.6環境の作成と有効化

T4Lのpython3はもともの3.6なので、あえて切り替える必用はありませんが。。。

１. pythonのコンパイルに必要なツールをインストール

```bash
sudo apt install -y gcc make \
    libssl-dev libbz2-dev  \
    libreadline-dev libsqlite3-dev zlib1g-dev
```

２. python3.6実行環境のインストール

```bash
pyenv install 3.6.8
pyenv virtualenv 3.6.8 py36
pyenv activate py36
pip install --upgrade pip
```

# 参考サイト

- Jetson全般
  - [Jetson Nano関係のTIPSまとめ](https://qiita.com/karaage0703/items/b14c249aa33112669ee4)

- Chainer
  - CuPy
    - [Jetson NanoでCuPy](https://qiita.com/yamamo-to/items/972bc588c350ff3bb0cf)
  - Chainer
    - [Jetson NanoでChainerを動かす](https://qiita.com/yamamo-to/items/5862b23265eb319bec25)

- VS Code
  - [Jetson nanoにVSCode+Pythonの開発環境を整える](https://qiita.com/koppe/items/64d155bc7814441920f9)