OpenCV4.4.0でCUDAを利用する備忘録
膨大な数のエラーと格闘したので覚えている範囲でメモ
はじめに
-D WITH_CUDA=ON
OpenCV contributeをインストールして、CUDAいれる.
aptでnvidiaドライバをインストールした場合
この場合,一緒に
sudo apt install nvidia-cuda-toolkit
で,cudaをインストールしている場合がある.
nvcc -V
と叩いてこのバージョンとnvidia-smiのバージョンが一致しているかを確かめる必要がある.
不一致だから動かないというわけでは無いが,nvidiaドライバとcudaのバージョン(nvcc -V)に不整合がある場合,動作保証がされていない.
つまりnvidia-smiの右上に表示される"CUDA Version"と実際にインストールするべきcudaのバージョンを合わせればいい.
で,上記のaptでtoolkitからcudaをインストールした場合,恐らくcuda-9.0が入っている(20/10)(nvccにwhich使うと/usrに入っていたため気づくのが遅れた)
なので,公式からダウンロード.そして入っているcuda-9.0はuninstallしてもいいし,もしくは
export PATH="/usr/local/cuda-11.0/bin:$PATH" export LD_LIBLARY_PATH="/usr/local/cuda-11.0/lib64"
としておくのが賢い.場所は特に指定しなければ/usr/local以下にcudaが存在する.nvidia-smiでみえているからと言って、パスが通っていない場合がある。今回の環境構築でここにハマっていた。
cudaフラグをたててビルド
今回の環境は以下
$uname -a Linux kilin-ubu18 5.4.0-51-generic #56~18.04.1-Ubuntu SMP Tue Oct 6 09:47:18 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux $nvcc -V $ nvcc -V nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2020 NVIDIA Corporation Built on Thu_Jun_11_22:26:38_PDT_2020 Cuda compilation tools, release 11.0, V11.0.194 Build cuda_11.0_bu.TC445_37.28540450_0 $ nvidia-smi Wed Oct 21 03:37:47 2020 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 450.51.05 Driver Version: 450.51.05 CUDA Version: 11.0 | |-------------------------------+----------------------+----------------------+
今回のビルドスクリプトは以下,
https://github.com/kilinlili/dockerfile_for_cuda/blob/master/cmake.sh
フラグに関していくつかメモをしておく.
今回はcuDNNはOFFにしている.
ONにする場合は,
-D WITH_CUDNN=ON \ -D WITH_OPENCV_DNN_CUDA=ON \
を渡す.cudaとは別にインストールが必要なので注意.
aarch64等,armv8ならばSIMDのNEONが使えるため,
-D ENABLE_NEON=ON \
が使える.しかしながら,X86_64(AMD64)の場合は,CMakeの実行でエラーを吐くためこのパラメータは利用しない.
CUDA_ARCHの指定は,今回の環境であれば7.5だけでいい.指定が無い場合,ビルドに時間がかかるためフラグをたてることを勧める. この時CUDA_ARCH_PTXを指定した場合,ビルド時にnvcc fatalエラーとなった.なのでBINのみ指定をしている. これで無事にビルドができた.
エラー
pythonで実行検証 stackoverflow.com
C++で実行検証 (-218:No OpenGL support) Library was built without OpenGL support in function 'cvNamedWindow'
sudo apt install libgtkglext1 libgtkglext1-dev
して再度ビルド.
CMake時の結果と渡したフラグくらいキチンと確認するべきだなと思った.
avcodecやFFMPEGがonにならない場合,恐らく何かが不足している.
sudo apt install libavcodec-dev libavformat-dev libswscale-dev
をしてみた再度cmakeしてみるとできる可能性がある.