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

NividiaのGPUの乗ったマシンを用意する
NividiaのGPUは搭載したPCを用意する必要があります
$ apt-cache search "^nvidia-[0-9]{3}$"
apt-cacheでそのPCにインストールできるNvidiaドライバがわかる。
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配布サイト
カーソルは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ドライバインストール 方法1
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
PCを再起動し,nvidia-smiが実行できればCUDAのインストールに進む
Nvidiaドライバインストール 方法2
Nvidia Driverをダウンロードする
搭載されている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
参考
素直にアンインストールして再インストールしたほうがいいかもしれない
sudo apt-get --purge remove nvidia-*
sudo apt-get --purge remove cuda-*
CudaとOpenCvのインストール
NVIDIA SDK Managerをインストールする
ネットに繋がっていないとインストールできません
ダウンロードしJetPackアーカイブを解凍しインストールします。
Nvidiaアカウントを作成する必要があります
HostMachienを選択します。
JetPack4.3を選択します。
下の方にあるダウンロードの後にインスールするを必ずチェックします
ダウンロード中にインストールするとエラーになることがあるので必ずチェックを入れます
30Gぐらい容量が必要です
インストール完了

自動で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の説明
パスの設定を追加する
$ 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
cuDNN のRunTimeのインストールと動作確認
cuDNN Runtime Library for Ubuntuh
cuDNN Developer Library for Ubuntuh
cuDNN Code Samples and User Guide for Ubuntu
をダウンロードしダブルクリックでインストール
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
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
# 再びmake
$ make clean
$ make
cudnn.hファイルがないとでる。cudnn.hファイルをコピーする
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
保留
参考
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
かなり詳しく書いてあります
NVIDIA SDK Manager on Dockerで快適なJetsonライフ
Jetson TX2 への JetPack のセットアップ手順
(#1)
CUDA on WSL2
WSL2を使えばWindows上にLinuxを構築しWindowsのGPUドライバを利用できるようです。