Nvidiaから出ているJetPack(NVIDIA SDK Manager)を使ってOpenCvやCudaの簡単なインストールを目指す

###Nvidiaから出ているJetPack(NVIDIA SDK Manager)を使ってOpenCvやCudaの簡単なインストールを目指す
<img width="504" alt="スクリーンショット 2020-06-19 21.43.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671913/92c406ba-cde1-f976-c083-13c539231a66.png">

####NividiaのGPUの乗ったマシンを用意する
NividiaのGPUは搭載したPCを用意する必要があります

```
$ apt-cache search "^nvidia-[0-9]{3}$"
```

apt-cacheでそのPCにインストールできるNvidiaドライバがわかる。
<img width="600" alt="20191106123629.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671913/77a7b91d-9ec8-57a3-0e39-20df73cffa87.png">
<img width="600" alt="20191106125506.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671913/43f522fc-33d3-c797-34a5-df867d776f2d.png">

NVIDIA SDK ManagerはCuda10.0がインストールされる。NVIDIAドライバは410以上がインストールされる。
NVIDIAドライバ410以上に対応したWindows機を利用するかJatsonを利用する。
NVIDIAドライバが未対応なら*NVIDIA SDK Manager*をあきらめ、Cudaのバージョンを下げ手動インストールにする

https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html
古いPCのGpuのドライバは410以下のため、Cuda10.0は動作しない


####~~仮想環境ソフトを利用する~~
~~Parallels DesktopやVMWareなど
ここではparallels-desktopを使います~~
追記　仮想環境だとGeforceドライバが認識しない
MacならディアルブートでLinuxを起動させるか、Windowsを利用するか
外部のJetsonNanoに転送してインストールするか
(#1)
####ubuntuをインストールする
日本語版[Ubuntu](http://ubuntulinux.jp/download/ja-remix)配布サイト
<img width="358" alt="スクリーンショット 2020-06-19 19.53.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671913/4e7f7741-9556-11c4-54c5-41e20fe28733.png">

カーソルはCtrk+altで開放します
~~Parallels Tool CDがマウントされるので一緒にインストールするとよいです。~~

```
#更新する
sudo apt-get update
sudo apt-get upgrade
```

#####NVIDIAグラフィックドライバーとCudaのバージョンの関係
NVIDIA SDK ManagerのCudaのバージョンは10.0である。古いPCのGpuと古いNividaドライバーだと動作しない。NVIDIA SDK Managerの自動インストールをあきらめて、Cudaのバージョンを下げて手動インストールに切り替えるか、新しいPCを新調するかになる

#####GPUがNvidiaかどうか確認する

```
sudo lshw -C display 

仮想環境上だとVirtual Video Adapterとでる
仮想環境ではNivideドライバーはインストールできないので、ホストPC(Linux or Windows)上でNivideドライバをインストールする必要がある
```

UbuntuがGPUを認識しているか調べる

```
$ sudo ubuntu-drivers devices
```

####Nvidiaドライバインストール　方法１

[参考](https://qiita.com/protocol1964/items/19de3d1e27306f80d06d)

UbuntuがGPUを認識しているか調べる

```
$ sudo ubuntu-drivers devices
```

GPUの型番が正しく表示されたら，以下のコマンドを実行してドライバのインストールする

```
$ sudo ubuntu-drivers autoinstall
```

```
# マシンにインストール済みのNVIDIAドライバを一覧表示
$ dpkg -l | grep nvidia

# apt-getでインストールできるNVIDIAドライバの一覧表示
$ apt-cache search "^nvidia-[0-9]{3}$"

```

nvidia-smiコマンドでドライバのバージョンやGPUの詳細が表示されるか確認する

```
$ nvidia-smi
```

正しく表示されたたらCudaのインストールへ進む

#####nvidia-smiを実行したらエラーが出た

```
$ nvidia-smi　
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
nvidia-smiはnvidiaのドライバを確認することができなかった．最新のドライバが入ってるかどうか確認してね．
```

この場合，Nouveauを無効化することで解決する．まず，/etc/modprobe.d/blacklist-nouveau.confを作成し，以下のように編集する．

```
$ sudo vim /etc/modprobe.d/blacklist-nouveau.conf
```
以下の内容を記入

```
blacklist nouveau
options nouveau modeset=0
```

次に以下のコマンドを実行し，カーネルモジュールを再読込する．

```
$ sudo update-initramfs -u

$ sudo reboot

$ nvidia-smi
```

[参考](https://qastack.jp/ubuntu/841876/how-to-disable-nouveau-kernel-driver)

PCを再起動し，nvidia-smiが実行できればCUDAのインストールに進む

####Nvidiaドライバインストール　方法２
[Nvidia Driver](https://www.nvidia.co.jp/Download/index.aspx?lang=jp)をダウンロードする
<img width="407" alt="スクリーンショット 2020-06-30 14.18.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671913/a77e2243-c093-27a5-90c8-8825a5b3c081.png">

搭載されているGPUのドライバを選択しRun形式のファイルをダウンロードしインストールする

```
$ chmod +x GPUドライバ名.run
$ sudo sh GPUドライバ名.run
```

nvidia-smiコマンドでドライバのバージョンやGPUの詳細が表示されるか確認する

```
$ nvidia-smi
```

######再インスール時の注意
NVIDIA SDK Managerを先にインストールすると最新のNVIDIAグラフィックドライバーをインストールされてしまい、その後マシンにあった古いグラフィックドライバーを入れようとすると、エラーが起きインストールできないことがありました。依存解決のコマンドaptitudeを使って再インストールを試しましたが、デスクトップ画面で硬直して動かなくなった。

マシンがハングアップしたので注意
sudo aptitude install libnvidia-encode-418
[参考](https://qiita.com/t__nabe/items/3aa82513aabb9a8ce370)

素直にアンインストールして再インストールしたほうがいいかもしれない

```
sudo apt-get --purge remove nvidia-*
sudo apt-get --purge remove cuda-*
```

####CudaとOpenCvのインストール

[NVIDIA SDK Manager](https://developer.nvidia.com/embedded/jetpack)をインストールする
ネットに繋がっていないとインストールできません
<img width="700" alt="スクリーンショット 2020-06-19 19.51.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671913/7188a95d-15a5-0e94-a181-88b958ad050d.png">

ダウンロードしJetPackアーカイブを解凍しインストールします。
**Nvidiaアカウントを作成する必要があります**
<img width="700" alt="スクリーンショット 2020-06-19 20.01.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671913/74517efd-d181-38db-3c68-a34d3eb28635.png">

HostMachienを選択します。
JetPack4.3を選択します。

[参考記事](https://qiita.com/nabion/items/8ae33dcaa336e67990b1)
<img width="700" alt="スクリーンショット 2020-06-19 20.05.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671913/94be73a1-3911-bddd-4276-bffcbe9017bd.png">

**下の方にあるダウンロードの後にインスールするを必ずチェックします**
**ダウンロード中にインストールするとエラーになることがあるので必ずチェックを入れます**
30Gぐらい容量が必要です
###インストール完了
<img width="453" alt="スクリーンショット 2020-06-20 19.09.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671913/5cf7c2a1-1d41-d68f-a5f6-13141b9f78f6.png">

自動でOpenCvとCudaがインストールできました。

####JetPack 4.3 in jetson components:

    L4T R32.3.1 (K4.9)
    Ubuntu 18.04 LTS aarch64
    CUDA 10.0
    cuDNN 7.6.3
    TensorRT 6.0.1
    VisionWorks 1.6
    OpenCV 4.1 (4.1.1)
    Nsight Systems 2019.6
    Nsight Graphics 2019.5
    Nsight Compute 2019.3
    SDK Manager 1.0.0

####cudaの場所
```
/usr/local/cuda
/usr/local/cuda-10.0
```

####opencvの確認方法

```
$ sudo apt-get install python3-pip

$ sudo pip3 install numpy
```
```
$ python3
>>> import cv2
>>> print(cv2)
>>> cv2.__version__
4.1.1
```
####公式cudaのインストール方法
[公式cuda](https://translate.google.co.jp/translate?hl=ja&tab=TT&sl=auto&tl=ja&u=https%3A%2F%2Fdocs.nvidia.com%2Fcuda%2F)の説明

####パスの設定を追加する
```
$ sudo apt install vim
```

```
#　vimをアップデートする
sudo apt install vim

# xとyにバージョン数字を入れる
$ sudo vim ~/.bashrc

## CUDA and cuDNN paths
export PATH=/usr/local/cuda-x.y/bin:${PATH}
export LD_LIBRARY_PATH=/usr/local/cuda-x.y/lib64:${LD_LIBRARY_PATH}
# 環境変数$LD_LIBRARY_PATHにNVIDIAドライバのパスを追加
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/nvidia-番号

#保存する
$ source ~/.bashrc

# 確認する
$ nvcc -V

# CUDA Toolkitの場所の確認
$ which nvcc

#/usr/local/cuda-10.0/bin/nvcc 
```
[参考](https://www.kdel.org/wp/?p=1902)
[参考](https://translate.google.co.jp/translate?hl=ja&sl=auto&tl=ja&u=https%3A%2F%2Fblog.csdn.net%2Fqq_19707521%2Farticle%2Fdetails%2F103669306)

####cuDNN のRunTimeのインストールと動作確認

[cudnn-archive](https://developer.nvidia.com/rdp/cudnn-archive)
<img width="452" alt="スクリーンショット 2020-06-30 13.27.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671913/b7ac14a3-8c6d-4421-0504-f1201bbcc960.png">

cuDNN Runtime Library for Ubuntuh 　
cuDNN Developer Library for Ubuntuh 
cuDNN Code Samples and User Guide for Ubuntu
をダウンロードしダブルクリックでインストール

[参考](https://yul.hatenablog.com/entry/2019/07/04/103441)
#### cuDNNの動作確認
cuda-10.0/binにパスが通っているかどうかの確認します
通っていれば、cuda-install-samples-10.0.shを実行できます
ホームディレクトリで実行します。引数にフォルダ名を記入します。cuda-install-samples-10.0.shを実行するとホームディレクトリにサンプルフォルダが生成されます。Makeファイルがあるのでmakeします
binフォルダにサンプルファイルが生成されるので実行し試します。
deviceQueryを実行しcuda deviceが有効か確認します

```
$ cd /usr/local/cuda-10.0/bin

# /usr/local/cuda-10.0/bin/cuda-install-samples-10.0.sh

# ホームディレクトリにサンプルコードのあるディレクトリをコピー
$ cuda-install-samples-10.0.sh フォルダ名

$ cd フォルダ名/NVIDIA_CUDA-10.0_Samples
$ make
$ cd NVIDIA_CUDA-10.0_Samples/bin/x86_64/linux/release

$ ./deviceQuery
 
$ ./bandwidthTest

$ ./volumeRender 
```
[参考](https://medium.com/@vitali.usau/install-cuda-10-0-cudnn-7-3-and-build-tensorflow-gpu-from-source-on-ubuntu-18-04-3daf720b83fe)
#### cuDNNのインストール確認

dpkg -lコマンドでインストール済みのパッケージを一覧表示する．

```
# マシンにインストール済みのcuDNNパッケージを一覧表示
$ dpkg -l | grep cudnn
```

####cuDNNの保存場所

```
# debパッケージが保存されているディレクトリを確認(-Lオプション)
$ dpkg -L libcudnn7
```

####Yoloをインストールする

```
$ sudo apt install git
$ git clone https://github.com/AlexeyAB/darknet.git
$ cd darknet
darknet$ vim Makefile
GPU=1
CUDNN=1
OPENCV=1

darknet$ make
```
####-lcudaが見つからない　エラーが出る

libcuda.soがどこにあるか検索する

```
# libcuda.soがどこにあるか検索する
$ locate libcuda.so

# libcuda.soの場所がヒットする
/usr/local/cuda-10.0/targets/x86_64-linux/lib/stubs/libcuda.so
/usr/loca/cuda-10.0/targets/aarch64-linux/lib/stubs/libcuda.so
```

libcuda.soファイルを見つけたら、x86_64-linux-gnuフォルダに作る。x86_64-linuxフォルダにlibcuda.so.1のシンボリックリンクを作るとよい記事を見つける

```
sudo ln -s /usr/local/cuda-10.0/targets/x86_64-linux/lib/stubs/libcuda.so /usr/lib/x86_64-linux-gnu/libcuda.so.1

# libcuda.so.1とlibcuda.so　両方のシンボリックリンクが必要
sudo ln -s /usr/local/cuda-10.0/targets/x86_64-linux/lib/stubs/libcuda.so /usr/lib/x86_64-linux-gnu/libcuda.so
```

[参考](https://translate.google.co.jp/translate?hl=ja&sl=en&tl=ja&u=https%3A%2F%2Fgithub.com%2Fapache%2Fincubator-mxnet%2Fissues%2F8436)

```
#再びmake
$ make clean
$ make
```
####cudnn.hファイルがないとでる。cudnn.hファイルをコピーする

[cudnn インストール公式](https://translate.google.co.jp/translate?hl=ja&sl=auto&tl=ja&u=https%3A%2F%2Fdocs.nvidia.com%2Fdeeplearning%2Fsdk%2Fcudnn-install%2Findex.html%23installlinux-tar)

[cudnn-archive](https://developer.nvidia.com/rdp/cudnn-archive)
<img width="293" alt="スクリーンショット 2020-06-26 17.41.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671913/82d22e4f-797c-0b83-6626-832ecf485f2f.png">

cuDNN Library for Linuxをダウンロードします

```
#cuDNNパッケージを解凍する。Finderからでも解凍可能

$ tar -xzvf cudnn-x.x-linux-x64-v8.x.x.x.tgz

$ sudo cp cuda/include/cudnn*.h /usr/local/cuda/include
$ sudo cp cuda/lib/libcudnn* /usr/local/cuda/lib64
$ sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
```
make時のcudnn.h not foundがエラーが出なくなる

#### cudnn関連

```
libcudnn.so.7.0.1以外のlibcudnn.soファイルを削除する
/usr/local/cuda/lib64 $ sudo rm -rf libcudnn.so libcudnn.so.7
再生する
sudo ln -s libcudnn.so.7.0.1 libcudnn.so.7
sudo ln -s libcudnn.so.7 libcudnn.so
```

```
make clean 
make
```
####darknet/objが書き込めない

darknet/obj　権限を変更する

```
$ sudo chmod 777 ホームパス/darknet/obj ホームパス/darknet/backup
```

再びmake

```
$ make clean
$ make
```
#### weightsをダウンロード
AlexeyAB版には含まれていないのでpjreddieからダウンロード

```
$ wget https://pjreddie.com/media/files/yolov3.weights
```

Yoloを実行してみる

```
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
```

Yolo実行時のエラー
####Not compiled with OpenCV, saving to predictions.png instead

DarkNetのMakefileのopenCvが1になっていない

```
$ vim Makefile
  OPENCV=1
```

####CUDA driver version is insufficient for CUDA runtime version
####CUDA driver version is insufficient for CUDA runtime version : No Such File or Directory

保留
[参考](https://support.dl.sony.com/faq-ja/faq%EF%BC%9A%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97/)
NVIDIAグラフィックドライバがインストールされていないと出る？調査中

```
cudaを更新もする
sudo apt-get install cuda
```
####No CUDA-capable device is detected

CUDA対応デバイスが検出されない
仮想環境上ではNvidiaのGPUを認識しないため。仮想環境を止めてホストPCにOSを入れ直してやる

#### CUDAとNVIDIAドライバ（/usr/lib/nvidia-***）のPATHチェック

出力に"/usr/local/cuda-10.0/lib64"と"/usr/lib/nvidia-番号"が含まれているか？

```
$ echo $LD_LIBRARY_PATH  
```

####CUDAとnvccコマンドのPATHチェック

出力が"/usr/local/cuda-10.0/bin/nvcc"になっているか？

```
$ which nvcc             
/usr/local/cuda-10.0/bin/nvcc
```

####nvidia-smiコマンドのPATHチェック

出力が"/usr/bin/nvidia-smi"になっているか？

```
 $ which nvidia-smi
/usr/bin/nvidia-smi
```

####アンインストール方法

```
# xにバージョンを入れる
sudo apt remove cuda-x-y
sudo apt autoremove
sudo apt remove libcudnnx libcudnnx-dev libcudnnx-doc
rm -rfv ~/NVIDIA_CUDA-x.y_Samples/ # サンプルコードを消す。
# ~/.bashrcに追加されたPATHの設定をテキストエディタなどで消す。
# ログアウトしてPATHの設定の変更を反映
```

####ポイント
Nvidia GPUを搭載したマシンを用意する
仮想環境にNvidiaのグラフィックドライバーはインストールはできない
Nividia Sdk ManegerのCudaは10.0なので古いNividiaドライバでは動かない。Cuda10.0を動作できるNvidiaDriverを利用する
cuDNNパッケージを解凍し、指定したファイル(cudnn*.h)などを指定したところへコピーする
locate libcuda.soでlibcuda.soの場所を把握する。シンボリックリンクを/usr/lib/x86_64-linux-gnuに貼る
vimで.bashrcを編集した後、source ~/.bashrcで保存しないと適用されない

####結論
Jetson nanoを使う時はNividia Sdk Manegerを使ったほうがよい。cuda10とNividiaドライバが対応している
PCにインストールする場合はGPUを調べ、NvidiaDriverが410以上に対応しているならNividia　SDKを試しに使ってみる 410未満未対応ならSDKを諦め手動インストールでやる

####参考サイト

**[閃き- blog](https://yul.hatenablog.com/entry/2019/07/04/103441)**
かなり詳しく書いてあります

[Coda linux 公式インストール情報](https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html)

[NVIDIA SDK Manager on Dockerで快適なJetsonライフ](https://proc-cpuinfo.fixstars.com/2019/06/nvidia-sdk-manager-on-docker/)

[Jetson TX2 への JetPack のセットアップ手順](https://dev.classmethod.jp/articles/jetson-setup-jetpack-with-sdkmanager/)


https://pysource.com/2019/08/29/yolo-v3-install-and-run-yolo-on-nvidia-jetson-nano-with-gpu/

(#1)
[CUDA on WSL2](https://qiita.com/ksasaki/items/ee864abd74f95fea1efa)
WSL2を使えばWindows上にLinuxを構築しWindowsのGPUドライバを利用できるようです。