###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ドライバを利用できるようです。