環境
- Ubuntu 20.04
- OpenCV 4.8.0
- CUDA 12.2
- cuDNN 8.8
動機
- AIを後に触るため準備をしていたが躓いた
なぜこの環境?
Jetsonを使っているのですが、SDK managerを用意しているので...あと事前の検証も兼ねてます。
注意事項
インストールは確かに成功しましたが、根本解決 ではないのであくまでも 自己責任 でお願いします。
成功箇所だけ見ても多分わかるとは思うんですけど、「なぜ」を重きにおいている記事なので、私の失敗談も見ていただけますと幸いです。
[追記]別にそんなことなかったです...ただの脳筋備忘録でした...
インストール云々は序盤からいろいろな章で述べているのであしからず。
やってみたこと(失敗)
とりあえず最新版のCUDAをインストールしてみた。
ここから最新版をインストール。NVIDIAのアカウントを持っておくと便利なので作っておきましょう。私のときの最新版は12.5でした。
cuDNNもインストールします。これらはこの導入記事を参考にしました。
- CUDA 12.5
- cuDNN 9.1
これをインストールし、パスが通ったことを確認した後、OpenCVの最新安定版をインストールしました。
$ curl -L https://github.com/opencv/opencv/archive/4.8.0.zip -o opencv-4.8.0.zip
$ curl -L https://github.com/opencv_contrib/opencv/archive/4.8.0.zip -o opencv_contrib-4.8.0.zip
$ unzip opencv-4.8.0.zip
$ unzip opencv_contrib-4.8.0.zip
$ mv opencv-4.8.0/ opencv && opencv_contrib-4.8.0/ opencv/opencv_contrib
$ rm opencv-4.8.0.zip opencv_contrib-4.8.0.zip
$ cd opencv && mkdir build
$ cd build
ビルドする前に依存ライブラリをインストールして、cmakeを行った。
これを参考にしました。
$ sudo apt install build-essential cmake git pkg-config libgtk-3-dev \
libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \
libxvidcore-dev libx264-dev libjpeg-dev libpng-dev libtiff-dev \
gfortran openexr libatlas-base-dev python3-dev python3-numpy \
libtbb2 libtbb-dev libdc1394-22-dev libopenexr-dev \
libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev
が...!ここで失敗 、CMakeの検証は通るのですが、ビルドが失敗しました...
解決策をいろいろ調べていると、どうやらgccコンパイラとg++コンパイラによるエラーらしく...調整する必要があるそうな
しかしそう上手くはいかず、gccとg++は10,9,8ともに同じでした。
そこで互換性の問題と考え、とりあえずCUDAをインストールし直すことに
CUDAの再構築
Ubuntuのアップデートマネージャーを見てみたら、推奨しているグラフィックドライバが思ったより古かった...
てなわけでこれに見合うCUDAをインストールすることにしました。
このnvidiaドライバをインストールしたあと、コンソールでインストールできる最新版のCUDAを確認
$ nvidia-smi
Fri May 31 15:57:37 2024
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.171.04 Driver Version: 535.171.04 CUDA Version: 12.2 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA GeForce GTX 1660 Ti Off | 00000000:01:00.0 On | N/A |
| 34% 50C P8 14W / 120W | 606MiB / 6144MiB | 2% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| 0 N/A N/A 977 G /usr/lib/xorg/Xorg 59MiB |
| 0 N/A N/A 28255 G /usr/lib/xorg/Xorg 158MiB |
| 0 N/A N/A 28386 G /usr/bin/gnome-shell 58MiB |
| 0 N/A N/A 73462 G /usr/lib/firefox/firefox 276MiB |
| 0 N/A N/A 87421 G ...yOnDemand --variations-seed-version 40MiB |
+---------------------------------------------------------------------------------------+
いやん、恥ずかしい
どうやらインストールすべきCUDAは12.2らしいので、CUDA12.2をこのアーカイブからインストールしました。
で、ちゃんとnvccコマンドが通るようにパスを通して完成。
cuDNNのバージョンを下げる
なんとまあ、これも失敗したわけで、私はcuDNNも下げることにしました。
これも要領は同じ、アーカイブからv8.8.1をインストールしました。
これもなんとまあ同じエラーでして...これもしかしてOpenCVが死んでる...?まさかの安定版なのに?とはなったんですけど、いやもうええわ、気合いで解決するわとなりまして...
成功したCUDA12.2 cuDNN 8.8.1 OpenCV 4.8.0のバインドインストール(成功)
一応
- OpenCV単体のビルドは成功する
- CUDAのバインドビルドも成功する(12.5もできた)
- ただしcuDNN、てめぇはだめだ
ここまでは把握してました。
まあ、OpenCVのなんかヘッダファイルのコンパイルが上手くいってなかったっぽいので、これで通ったらええなの気分でやりました。
OpenCVのヘッダファイルの編集(1つだけ)
gccコンパイラの問題で、キャストが失敗しているのがエラーからわかります。この解決策のほとんどはコンパイラを変更することで解決するらしいのですが、どのバージョンも同じだったので...
勇気を出してちょっとだけヘッダーファイルの変更を試みました。時にはこういった直接的な解決も大切です。
#124行目、ここを変える
#変更前
...
if (nms_iou_threshold > 0) {
...
#変更後
...
if (__hgt(nms_iou_threshold, __half(0))) {
...
この変更点の場合、nms_iou_thresholdという値が0と比較できないhalf型で投げられていたために0をhalf型で統一した、というものです。(本来のコンパイラの場合、これは自動的に型変換の比較をしてくれるのですが...そういうこともあります。ソースコードの書き方として互換性問題が生じないように随時適切な型変換を行うのが良心的ですが...このライブラリには多大なお世話になっているのでね!!!)
こんな浅はかな脳筋変更で通るんかなって思ったんですが、いやなんとこれでビルド通ったしインストールもできたんです。やってみるものですね。
以下に私のCMakeビルドオプションを提示しておきます(オプションは最初からずっと同じ)
$ cmake -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules \
-D CMAKE_INSTALL_PREFIX=/usr/local - D OPENCV_GENERATE_PKGCONFIG=ON \
- D INSTALL_PYTHON_EXAMPLES=ON - D INSTALL_C_EXAMPLES=ON \
-D CMAKE_BUILD_TYPE=RELEASE \
- D BUILD_EXAMPLES=ON -D WITH_GSTREAMER=ON \
-D WITH_LIBV4L=ON -D BUILD_opencv_python2=ON \
-D BUILD_opencv_python3=ON -D WITH_CUDA=ON \
-D CUDA_ARCH_BIN="7.5"-D CUDA_ARCH_PTX="" -D CUDA_HOST_COMPILER=/usr/bin/gcc-10 \
-D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-12.2 ..
ちなみにですが、私の使っているGPUがGTX1660Tiだったので、CUDAアーキテクチャが75となり、-D CUDA_ARCH_BIN="7.5"としています。一覧はこの方の記事が見やすいです。Jetson関係ならjtopで見られるんですけどね、こういう互換性云々が本当にしんどいです。
-D CUDA_HOST_COMPILER=/usr/bin/gcc-10で、CUDAのコンパイラを明示的に指定することができます。私の環境ではgcc-10で成功しました。
一応、こんな感じでインストールされているよとのあれでこちらを
>>> import cv2
>>> print(cv2.getBuildInformation())
General configuration for OpenCV 4.8.0 =====================================
Version control: unknown
Extra modules:
Location (extra): /home/D51/opencv/opencv_contrib/modules
Version control (extra): unknown
Platform:
Timestamp: 2024-05-31T05:56:03Z
Host: Linux 5.15.0-107-generic x86_64
CMake: 3.16.3
CMake generator: Unix Makefiles
CMake build tool: /usr/bin/make
Configuration: RELEASE
CPU/HW features:
Baseline: SSE SSE2 SSE3
requested: SSE3
Dispatched code generation: SSE4_1 SSE4_2 FP16 AVX AVX2 AVX512_SKX
requested: SSE4_1 SSE4_2 AVX FP16 AVX2 AVX512_SKX
SSE4_1 (18 files): + SSSE3 SSE4_1
SSE4_2 (2 files): + SSSE3 SSE4_1 POPCNT SSE4_2
FP16 (1 files): + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 AVX
AVX (8 files): + SSSE3 SSE4_1 POPCNT SSE4_2 AVX
AVX2 (37 files): + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2
AVX512_SKX (8 files): + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2 AVX_512F AVX512_COMMON AVX512_SKX
C/C++:
Built as dynamic libs?: YES
C++ standard: 11
C++ Compiler: /usr/bin/c++ (ver 9.4.0)
C++ flags (Release): -fsigned-char -W -Wall -Wreturn-type -Wnon-virtual-dtor -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -msse -msse2 -msse3 -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG -DNDEBUG
C++ flags (Debug): -fsigned-char -W -Wall -Wreturn-type -Wnon-virtual-dtor -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -msse -msse2 -msse3 -fvisibility=hidden -fvisibility-inlines-hidden -g -O0 -DDEBUG -D_DEBUG
C Compiler: /usr/bin/cc
C flags (Release): -fsigned-char -W -Wall -Wreturn-type -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -msse -msse2 -msse3 -fvisibility=hidden -O3 -DNDEBUG -DNDEBUG
C flags (Debug): -fsigned-char -W -Wall -Wreturn-type -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -msse -msse2 -msse3 -fvisibility=hidden -g -O0 -DDEBUG -D_DEBUG
Linker flags (Release): -Wl,--exclude-libs,libippicv.a -Wl,--exclude-libs,libippiw.a -Wl,--gc-sections -Wl,--as-needed -Wl,--no-undefined
Linker flags (Debug): -Wl,--exclude-libs,libippicv.a -Wl,--exclude-libs,libippiw.a -Wl,--gc-sections -Wl,--as-needed -Wl,--no-undefined
ccache: NO
Precompiled headers: NO
Extra dependencies: m pthread cudart_static dl rt nppc nppial nppicc nppidei nppif nppig nppim nppist nppisu nppitc npps cublas cudnn cufft -L/usr/local/cuda-12.2/lib64 -L/usr/lib/x86_64-linux-gnu
3rdparty dependencies:
OpenCV modules:
To be built: aruco bgsegm bioinspired calib3d ccalib core cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev datasets dnn dnn_objdetect dnn_superres dpm face features2d flann freetype fuzzy gapi hfs highgui img_hash imgcodecs imgproc intensity_transform line_descriptor mcc ml objdetect optflow phase_unwrapping photo plot python3 quality rapid reg rgbd saliency shape stereo stitching structured_light superres surface_matching text tracking ts video videoio videostab wechat_qrcode xfeatures2d ximgproc xobjdetect xphoto
Disabled: world
Disabled by dependency: -
Unavailable: alphamat cvv hdf java julia matlab ovis python2 sfm viz
Applications: tests perf_tests apps
Documentation: NO
Non-free algorithms: NO
GUI: GTK3
GTK+: YES (ver 3.24.20)
GThread : YES (ver 2.64.6)
GtkGlExt: NO
VTK support: NO
Media I/O:
ZLib: /usr/lib/x86_64-linux-gnu/libz.so (ver 1.2.11)
JPEG: /usr/lib/x86_64-linux-gnu/libjpeg.so (ver 80)
WEBP: build (ver encoder: 0x020f)
PNG: /usr/lib/x86_64-linux-gnu/libpng.so (ver 1.6.37)
TIFF: /usr/lib/x86_64-linux-gnu/libtiff.so (ver 42 / 4.1.0)
JPEG 2000: build (ver 2.5.0)
OpenEXR: /usr/lib/x86_64-linux-gnu/libImath.so /usr/lib/x86_64-linux-gnu/libIlmImf.so /usr/lib/x86_64-linux-gnu/libIex.so /usr/lib/x86_64-linux-gnu/libHalf.so /usr/lib/x86_64-linux-gnu/libIlmThread.so (ver 2_3)
HDR: YES
SUNRASTER: YES
PXM: YES
PFM: YES
Video I/O:
DC1394: YES (2.2.5)
FFMPEG: YES
avcodec: YES (58.54.100)
avformat: YES (58.29.100)
avutil: YES (56.31.100)
swscale: YES (5.5.100)
avresample: YES (4.0.0)
GStreamer: YES (1.16.3)
v4l/v4l2: YES (linux/videodev2.h)
Parallel framework: pthreads
Trace: YES (with Intel ITT)
Other third-party libraries:
Intel IPP: 2021.8 [2021.8.0]
at: /home/D51/opencv/build/3rdparty/ippicv/ippicv_lnx/icv
Intel IPP IW: sources (2021.8.0)
at: /home/D51/opencv/build/3rdparty/ippicv/ippicv_lnx/iw
VA: NO
Lapack: NO
Eigen: NO
Custom HAL: NO
Protobuf: build (3.19.1)
Flatbuffers: builtin/3rdparty (23.5.9)
NVIDIA CUDA: YES (ver 12.2, CUFFT CUBLAS)
NVIDIA GPU arch: 75
NVIDIA PTX archs:
cuDNN: YES (ver 8.8.1)
OpenCL: YES (no extra features)
Include path: /home/D51/opencv/3rdparty/include/opencl/1.2
Link libraries: Dynamic load
Python 2:
Interpreter: NO
Libraries: NO
numpy: NO (Python wrappers can not be generated)
install path: -
Python 3:
Interpreter: /usr/bin/python3 (ver 3.8.10)
Libraries: /usr/lib/x86_64-linux-gnu/libpython3.8.so (ver 3.8.10)
numpy: /usr/lib/python3/dist-packages/numpy/core/include (ver 1.17.4)
install path: lib/python3.8/site-packages/cv2/python-3.8
Python (for build): /usr/bin/python3
Java:
ant: NO
Java: NO
JNI: NO
Java wrappers: NO
Java tests: NO
Install to: /usr/local
-----------------------------------------------------------------
>>>
最後に
結論ファーストの記事ではなくて申し訳ないと思っていますが、なぜ動かなかったのか、どのような記事を参考にして進めていたかなど、時系列的に見ていただきたかったので、このような備忘録とさせていただきました。
最初にも述べましたが、この解決方法が本当に正しい解決策かといえばグレーなので、一つの参考として見ていただければ幸いです。