nvcaffeをJetpack4.3 on Jetson Nanoにインストールする


# はじめに
この記事では、nvcaffeをJetpack4.3にインストールする手順を紹介します。


# 手順
1. OpenCV3のインストール
2. 前提パッケージのインストール
3. nvcaffeビルド
4. pycaffeビルド
5. 動作確認

# 1. OpenCV3をインストール
Jetpack4.3にはOpenCV 4.1.1がインストールされていますが、このままだとnvcaffeのビルドで失敗してしまうため、OpenCV 3.4.6をインストールします。

Jetson NanoへのOpenCV 3.4.6のインストールについては、以下の記事が大変素晴らしいので、その手順に従ってインストールします。

JetPack-4.3 for Jetson Nano
https://jkjung-avt.github.io/jetpack-4.3/

最初に以下のリポジトリのスクリプトをJetson上に取得します。
https://github.com/jkjung-avt/jetson_nano

次にに以下の記事の「 1. Basic set-up」まで実行します。
https://jkjung-avt.github.io/jetpack-4.3/

次に以下の手順に従って「OpenCV 3.4.6」をインストールします。基本的にはスクリプトを実行するだけです。ビルドには2時間ぐらいかかります。
https://jkjung-avt.github.io/opencv-on-nano/

# 2. 前提パッケージのインストール

前提のパッケージをインストールします。

```bash
$ sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libhdf5-serial-dev  libhdf5-dev protobuf-compiler
$ sudo apt-get install --no-install-recommends libboost-all-dev
$ sudo apt-get install libopenblas-dev 
$ sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev 
$ sudo apt-get install libturbojpeg libturbojpeg-dev
$ sudo ln -s /usr/lib/aarch64-linux-gnu/libturbojpeg.so.0.1.0 /usr/lib/aarch64-linux-gnu/libturbojpeg.so
```

# 3. nvcaffeをビルド
nvcaffeのソースを取得し、Makefile.configを書き換えてビルドします。

```bash
$ cd ~
$ git clone https://github.com/NVIDIA/caffe.git
$ cd ~/caffe/
$ git checkout v0.17.2 
$ cp Makefile.config.example Makefile.config
$ vi Makefile.config
$ make -j 4 all
```

Makefile.configの変更箇所は以下です。

以下のコメントを外す。

```config:Makefile.config
USE_CUDNN := 1
PENCV_VERSION := 3
WITH_PYTHON_LAYER := 1
```

CUDA_ARCHは以下のように修正します。もともとあったものはコメントアウトしておきます。

```config:Makefile.config
CUDA_ARCH := -gencode arch=compute_53,code=sm_53 \
             -gencode arch=compute_53,code=compute_53
```

python2.7をコメントアウトして、python3のコメントを外します。その際、バージョンを3.5から3.6に変更します。

```config:Makefile.config
# PYTHON_INCLUDE := /usr/include/python2.7 \
#		/usr/lib/python2.7/dist-packages/numpy/core/include

# Uncomment to use Python 3 (default is Python 2)
PYTHON_LIBRARIES := boost_python3 python3.6m
PYTHON_INCLUDE := /usr/include/python3.6m \
                /usr/lib/python3.6/dist-packages/numpy/core/include
```

LIBRARY_DIRSに/usr/lib/x86_64-linux-gnuを追加します。

```config:Makefile.config
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/aarch64-linux-gnu/hdf5/serial
```

# 4. pycaffeをビルド
pycaffeも使いたいので、ビルドします。
scipyのインストールでハマりました。

```
$ sudo apt-get install gcc gfortran python-dev libopenblas-dev liblapack-dev libfreetype6-dev cython
$ sudo pip3 install pybind11
$ sudo pip3 install scipy
$ mkdir -p ~/src
$ cd ~/src
$ wget https://pypi.python.org/packages/03/98/1521e7274cfbcc678e9640e242a62cbcd18743f9c5761179da165c940eac/leveldb-0.20.tar.gz
$ tar xzvf leveldb-0.20.tar.gz
$ cd leveldb-0.20
$ python3 setup.py build
$ sudo python3 setup.py install
$ pkgs=`sed 's/[>=<].*$//' ~/caffe/python/requirements.txt`
$ for pkg in $pkgs; do sudo pip3 install $pkg; done
$ cd ~/caffe
$ make pycaffe
```

.bashrcに以下を追加します。

```
export PYTHONPATH=/home/nvidia/caffe/python
```

# 5. 動作確認
以下のコマンドで動作確認します。

```
nvidia@nvidia-desktop:~/caffe$ source ~/.bashrc
nvidia@nvidia-desktop:~/caffe$ python3
Python 3.6.9 (default, Nov  7 2019, 10:44:02) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> import caffe
>>> quit()
nvidia@nvidia-desktop:~/caffe$ ./build/tools/caffe time --gpu 0 --model ./models/bvlc_alexnet/deploy.prototxt
WARNING: Logging before InitGoogleLogging() is written to STDERR
I0310 23:21:23.578208 28238 parallel.cpp:44] P2PManager::Init @ nvidia-desktop
I0310 23:21:23.578884 28238 caffe.cpp:709] This is NVCaffe 0.17.2 started at Tue 
・・・
省略
・・・
I0310 23:21:51.296883 28238 caffe.cpp:665] Average Backward pass: 110.804 ms.
I0310 23:21:51.296905 28238 caffe.cpp:667] Average Forward-Backward: 212.82 ms.
I0310 23:21:51.296928 28238 caffe.cpp:669] Total Time: 10641 ms.
I0310 23:21:51.296952 28238 caffe.cpp:670] *** Benchmark ends ***
nvidia@nvidia-desktop:~/caffe$ 
```

# 参考にさせて頂いた情報
以下のサイトの情報を参考にさせて頂きました。
特に最初の記事に書いてある必要なもの↓に大変共感しました。（Scipyのインストールでかなりハマったので）

>SciPy(依存パッケージ)のインストール失敗やエラーが出てもあきらめない強い気持ち

[やってみた] Jetson Nano でDeepComposerのWorkshop Lab2（GANカスタムモデルの学習＆推論）をやってみた。#AIM223 #reinvent 2019
https://dev.classmethod.jp/cloud/aws/jetson-nano-deepcomposer-workshop-lab2/

nvcaffe install jetsontx2
https://github.com/atinfinity/lab/wiki/nvcaffe-install-jetsontx2

How to Install Caffe and PyCaffe on Jetson TX2
https://jkjung-avt.github.io/caffe-on-tx2/