LoginSignup
0
1

【根性解決備忘録】CUDA12.2 OpenCV4.8.0にてcuDNNのビルドエラーを直したった

Last updated at Posted at 2024-05-31

環境

  • 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の最新安定版をインストールしました。
terminal
$ 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を行った。
これを参考にしました。

teriminal
$  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のアップデートマネージャーを見てみたら、推奨しているグラフィックドライバが思ったより古かった...
IMG_3070.jpg
てなわけでこれに見合うCUDAをインストールすることにしました。
このnvidiaドライバをインストールしたあと、コンソールでインストールできる最新版のCUDAを確認

teriminal
$ 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コンパイラの問題で、キャストが失敗しているのがエラーからわかります。この解決策のほとんどはコンパイラを変更することで解決するらしいのですが、どのバージョンも同じだったので...
勇気を出してちょっとだけヘッダーファイルの変更を試みました。時にはこういった直接的な解決も大切です。

opencv/modules/dnn/src/layers/../cuda4dnn/primitives/region.hpp
#124行目、ここを変える
#変更前
    ...
if (nms_iou_threshold > 0) {
    ...
#変更後
    ...
if (__hgt(nms_iou_threshold, __half(0))) {
    ...

この変更点の場合、nms_iou_thresholdという値が0と比較できないhalf型で投げられていたために0をhalf型で統一した、というものです。(本来のコンパイラの場合、これは自動的に型変換の比較をしてくれるのですが...そういうこともあります。ソースコードの書き方として互換性問題が生じないように随時適切な型変換を行うのが良心的ですが...このライブラリには多大なお世話になっているのでね!!!)

こんな浅はかな脳筋変更で通るんかなって思ったんですが、いやなんとこれでビルド通ったしインストールもできたんです。やってみるものですね。
以下に私のCMakeビルドオプションを提示しておきます(オプションは最初からずっと同じ)

terminal
$ 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で成功しました。
一応、こんな感じでインストールされているよとのあれでこちらを

python3
>>> 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
-----------------------------------------------------------------


>>> 


最後に

結論ファーストの記事ではなくて申し訳ないと思っていますが、なぜ動かなかったのか、どのような記事を参考にして進めていたかなど、時系列的に見ていただきたかったので、このような備忘録とさせていただきました。
最初にも述べましたが、この解決方法が本当に正しい解決策かといえばグレーなので、一つの参考として見ていただければ幸いです。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1