jetson nanoを深層学習-画像解析用途として使うまでの初期設定備忘録

#ハードウェア側

- 基本
    - jetson nano B01
    - 電源 5V 4A -> [例](https://www.amazon.co.jp/gp/product/B086DQGWSQ/ref=ppx_od_dt_b_asin_title_s02?ie=UTF8&psc=1)
    - NVIDIA Jetson Nanoケース ->  [例](https://www.amazon.co.jp/NVIDIA-Jetson-Nano%E3%82%B1%E3%83%BC%E3%82%B9%E3%80%81%E5%86%B7%E5%8D%B4%E3%83%95%E3%82%A1%E3%83%B3%E4%BB%98%E3%81%8DNVIDIA-Nano%E9%96%8B%E7%99%BA%E8%80%85%E3%82%AD%E3%83%83%E3%83%88%E7%94%A8%E3%82%A2%E3%82%AF%E3%83%AA%E3%83%AB%E3%82%B1%E3%83%BC%E3%82%B9%EF%BC%883-0-5-8V%EF%BC%89%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%A8%E3%83%B3%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BC%E3%82%AF%E3%83%BC%E3%83%A9%E3%83%BC/dp/B07VLXHZLF/ref=sxts_sxwds-bia-wc-p13n2_0?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&cv_ct_cx=jetson+nano&dchild=1&keywords=jetson+nano&pd_rd_i=B07VLXHZLF&pd_rd_r=f5fc99b5-746c-476e-b5df-3c0818d8f4bb&pd_rd_w=5a5DM&pd_rd_wg=1T0x7&pf_rd_p=63ab5460-8fe4-4f6b-b01c-b479c5b6ebb0&pf_rd_r=ZAJPW2B7YBRS0900FK5A&psc=1&qid=1597627663&sr=1-2-64a1580b-5c24-46ff-994a-3909d80346ca)
    - micro SDカード 256-512G
    - 無線usbドングル => [例](https://www.amazon.co.jp/gp/product/B07K31W8WC/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1)
        - 電波強度が不安ならこういうのも -> [例](https://www.amazon.co.jp/gp/product/B07P6WHLZ2/ref=ppx_yo_dt_b_asin_title_o02_s02?ie=UTF8&psc=1)
- スタンドアロンで使う場合
    - ディスプレイ(hdmi対応)
    - hdmiケーブル（ディスプレイについていることが多い）
    - マウス、キーボード
- ヘッドレスで使う場合
    - コントロール用別途pc
    - microusb - usb ケーブル (1m以上あるとjetson nanoの置き場所が制限されなくて良し)






#ソフトウェア側



##Jetson Nano Developer KitをSDカードにインストール
- https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#write



##ヘッドレスセットアップ

jetson nanoをホストとmicro-usbで接続。ホスト側で以下のコマンドを実行。設定画面に入る。

```bash
ls -ls /dev/cu.* #microusbが１台しかないことを確認
screen /dev/cu.usbmode* 115200 -L
```




##初期アップデート

```bash
sudo apt -y update
sudo apt -y install nvidia-jetpack
sudo apt -y install nano
```


##自動ログイン

```bash
sudo nano /etc/gdm3/custom.conf
```
以下の2行の#削除。user1をアカウント名に変更

```terminal:custom.conf
#  AutomaticLoginEnable = true
#  AutomaticLogin = user1
```

##起動時のgui,cui設定

```bash
sudo systemctl get-default #現在の設定表示
#sudo systemctl set-default multi-user.target #GUIなし
#sudo systemctl set-default graphical.target #GUIあり
```



# jetson_clocksとmemory swapの自動起動を有効にする
## jetson_clocks
参考url: https://evolt.club/threads/make-jetson-clocks-start-at-boot.92/

### ヘッドレスの場合
```bash
which jetson_clocks #should be /usr/bin/jetson_clocks
sudo nano /etc/rc.local
```
rc.localファイルを作成、以下の内容をコピペ

```sh:rc.local
#!/bin/sh -e
# rc.local
#Maximize performances
( sleep 60 && /usr/bin/jetson_clocks )&

exit 0
```

権限付与

```
sudo chmod +x /etc/rc.local
```

###ヘッドレスではない場合、以下でも可（？）
```bash
nano ~/.profile
```

```bash:.profile
/usr/bin/jetson_clocks
```

## Memory Swap

```
git clone https://github.com/JetsonHacksNano/installSwapfile
cd installSwapfile
./installSwapfile.sh
```

##必須な諸々
参考url
- https://www.pyimagesearch.com/2019/05/06/getting-started-with-the-nvidia-jetson-nano/
- https://blog.goo.ne.jp/pearlwing/e/c389e4b310288ac99d9e4c974a8c5451
- https://docs.nvidia.com/deeplearning/frameworks/install-tf-jetson-platform/index.html


```bash
sudo apt-get -y install git cmake
sudo apt-get -y install libatlas-base-dev libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev liblapack-dev libblas-dev gfortran libffi-dev
sudo apt-get -y install python3-dev
sudo apt -y install python3-testresources
wget https://bootstrap.pypa.io/get-pip.py
sudo python3 get-pip.py
rm get-pip.py

sudo apt-get -y install libfreetype6-dev python3-setuptools
sudo apt-get -y install protobuf-compiler libprotobuf-dev openssl
sudo apt-get -y install libssl-dev libcurl4-openssl-dev
sudo apt-get -y install cython3
sudo apt-get -y install libxml2-dev libxslt1-dev
```

## （任意）jetson nano版htop
```bash
sudo -H pip install jetson-stats
```
実行はjtop

### virtualenv

```bash
sudo pip install virtualenv virtualenvwrapper
nano ~/.bashrc
```

以下の内容をたす

```:bashrc
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh
```
activate 

```
source ~/.bashrc
```

環境名baseを作成

```
mkvirtualenv base -p python3 --system-site-packages
```

（追記）　--system-site-packagesをいれると、いくつかのパッケージを追加インストールしなくてよいものの、パッケージインストール時に依存するモジュールのバージョンミスマッチが起きたりするのでないほうがやはりよいかも（pip install jupyterのcffiとかcffiとか）

（任意）再度bashrcに以下の内容を追記することでterminal起動時に常にvirtualenv環境が立ち上がる

```:bashrc
workon base
```

## OpenCVインストール
便利なスクリプトが公開されている。virtualenv内で実行。最後にtempファイルを消さなければ他の環境でも利用可能？

```bash:takes_alot_of_time
git clone https://github.com/mdegans/nano_build_opencv.git
cd nano_build_opencv
./build_opencv.sh

```
virtualenv作成時、--system-site-packagesを有効にしていればopencvがvirtualenvで使えるはずなものの、認識されないときは手動でsymbolic linkを貼る

```bash:an_example
workon base
cdvirtualenv
pwd
cd lib/python3.6/site-packages
ln -s /usr/lib/python3.6/dist-packages/cv2/python-3.6/cv2.cpython-36m-aarch64-linux-gnu.so
```


## Tensorflow
```:scipy_takes_time
pip install numpy
pip install -U cython future mock h5py keras_preprocessing keras_applications gast futures pybind11 flask lxml

pip install --pre --extra-index-url  https://developer.download.nvidia.com/compute/redist/jp/v44/ tensorflow
```
###protobuf compilerを手動で入れなおす
pipで入るバージョンはとても遅いらしい。
参考url:https://www.pyimagesearch.com/2020/03/25/how-to-configure-your-nvidia-jetson-nano-for-computer-vision-and-deep-learning/

- （追記） pbtxtの読み込みスピードはさほどかわらなかった（？）。cf. ssd mobilenetv2 backbone 60sec. -> 50 sec.　この問題はtensorRT周りの解決策なのかもしれない

```:takes_time
wget https://raw.githubusercontent.com/jkjung-avt/jetson_nano/master/install_protobuf-3.8.0.sh
sudo chmod +x install_protobuf-3.8.0.sh
./install_protobuf-3.8.0.sh

#virtualenvの場合、該当環境でインストールしなおす
workon base
cd ~
cp -r ~/src/protobuf-3.8.0/python/ .
cd python
python setup.py install --cpp_implementation
```

###"google.protobuf" not foundが出てくる場合（要確認）
- site-packagesにgoogleのフォルダが作成されている（auth）との関係でインポートエラーが起きるのかもしれない。
- /home/phytometrics/.virtualenvs/base/lib/python3.6/site-packages/protobuf-3.8.0-py3.6-linux-aarch64.egg/google/
直下のprotobufを読み込むことができれば解決する。
- rm /home/phytometrics/.virtualenvs/base/lib/python3.6/site-packages/protobuf-3.8.0-py3.6-linux-aarch64.egg/google/\_\_init\_\_.py
- これで必ず解決するかは不明。ただ\_\_init\_\_.py関係のエラーであるとstackoverflow周りで議論されているのでそういうこと？


## Jupyter Notebook
###インストール

```bash
pip install jupyter
```

###設定

##configuration and password

```bash
pip install environment_kernels
jupyter notebook --generate-config
jupyter notebook password
```

config編集

```
nano /home/phytometrics/.jupyter/jupyter_notebook_config.py
```

以下を編集
現在のバージョンではvirtualenv（とconda）のディレクトリを自動サーチしてくれるので指定は必要ない。

```python:jupyter_notebook_config.py
#追記
c.NotebookApp.kernel_spec_manager_class = 'environment_kernels.EnvironmentKernelSpecManager'
#編集
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8080
```



###自動起動

```bash

nano /etc/systemd/system/jupyter.service
```

USERとGROUPは適宜変更
virtualenvのpythonでjupyterを実行するためexecstartのコマンドに追記

```jupyter.service
[Unit]
Description=Jupyter notebook

[Service]
Type=simple
PIDFile=/var/run/jupyter-notebook.pid
ExecStart=/home/phytometrics/.virtualenvs/base/bin/python /home/phytometrics/.virtualenvs/base/bin/jupyter notebook
User=phytometrics
Group=phytometrics
WorkingDirectory=/home/phytometrics/Desktop
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

```

有効化

```bash:
sudo systemctl enable jupyter.service
```
# 他

##　現在のOSを配布可能イメージとしてまとめる方法
[Jetson Nanoの配布可能イメージを作成する](https://qiita.com/liqsuq/items/f1cc798668c5e64379b3)