엔지니어스 - Engineeus

[Ubuntu] Graphic card 460 / CUDA 11.01 / CuDNN 8.1 / OpenCV 4 최신으로 설치 하기! (초간단) 본문

Autonomous Tech./Installation

[Ubuntu] Graphic card 460 / CUDA 11.01 / CuDNN 8.1 / OpenCV 4 최신으로 설치 하기! (초간단)

Engineeus 2021. 7. 28. 19:48
728x90

설치 환경


Ubuntu: 20.04

Graphic card : 460.91.03

CUDA: 11.01

cvDNN: 8.1.0

OpenCV: 4.4.0

python: 3.8.10

 

 

 

Graphic Driver


설치 가능 드라이버 확인

ubuntu@ubuntu-HP:~$ ubuntu-drivers devices

위 드라이버 중 460을 설치 하겠습니다. CUDA마다 그래픽카드 제한이 있을 수 있으니 확인 하셔야 합니다.

$ sudo apt install nvidia-driver-460

 

설치 확인

- 재부팅

$ nvidia-smi

Graphic driver는 460.91.03이 깔리면서 CUDA도 자연스럽게 깔렸네요.

 

 

 

CUDA


CUDA download

https://developer.nvidia.com/cuda-toolkit-archive

 

CUDA Toolkit Archive

Previous releases of the CUDA Toolkit, GPU Computing SDK, documentation and developer drivers can be found using the links below. Please select the release you want from the list below, and be sure to check www.nvidia.com/drivers for more recent production

developer.nvidia.com

 

전 11.02.2로 깔았습니다.

 

wget https://developer.download.nvidia.com/compute/cuda/11.2.1/local_installers/cuda_11.2.1_460.32.03_linux.run

sudo sh cuda_11.2.1_460.32.03_linux.run

기다린 후

continue

accept

Graphice driver는 이미 깔았으니 스페이스로 체크표시 빼줍니다. 그리고 Install!

 

잘 인스톨 되었네요. 드라이버는 일부러 안깔았으닌 걱정 마세요.

 

다음 명령을 사용하여 CUDA Toolkit 관련 설정을 환경 변수에 추가하고  바로 적용합니다. 

$ sudo sh -c "echo 'export PATH=$PATH:/usr/local/cuda-11.2/bin' >> /etc/profile"

$ sudo sh -c "echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-11.2/lib64' >> /etc/profile"

$ sudo sh -c "echo 'export CUDADIR=/usr/local/cuda-11.2' >> /etc/profile"

$ source /etc/profile



설치가 잘되었는지 확인합니다. 11.2가 보여야 합니다. 

$ nvcc -V 

 

 

 

CuDNN


아래 링크에 접속 합니다. 

https://developer.nvidia.com/cudnn 

 

Download cuDNN을 클릭합니다. 



계속 진행하려면 로그인을 해야 합니다.  



라이센스에 동의한다고 체크하고( I Agree to the Terms of… ) 

Archived cuDNN Releases를 클릭합니다. 



목록에서 다음 항목을 클릭합니다. 

Download cuDNN v8.1.0 (January 26th, 2021), for CUDA 11.0,11.1 and 11.2

 

다음 항목을 클릭합니다. 

cuDNN Library for Linux (x86_64)

다운로드 받은 파일을 압축풀어서 파일 복사합니다. 

$ cd 다운로드

$ tar xvzf cudnn-11.2-linux-x64-v8.1.0.77.tgz

$ sudo cp cuda/include/cudnn* /usr/local/cuda/include

$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64

$ sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*



링크를 다시 걸어줘야 합니다.  

$ sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_adv_train.so.8.1.0 /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_adv_train.so.8

$ sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_ops_infer.so.8.1.0  /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_ops_infer.so.8 

$ sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_cnn_train.so.8.1.0  /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_cnn_train.so.8

$ sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_adv_infer.so.8.1.0  /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_adv_infer.so.8

$ sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_ops_train.so.8.1.0  /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_ops_train.so.8 

$ sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_cnn_infer.so.8.1.0 /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_cnn_infer.so.8 

$ sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn.so.8.1.0  /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn.so.8




새로 추가된 라이브러리를 시스템에서 찾을 수 있도록 하고 루트 디렉토리로 이동합니다.  

$ sudo ldconfig

 $ cd

 

설정이 제대로 되었는지 확인합니다. 다음처럼 8.1.0이 보여야 합니다.  

$ ldconfig -N -v $(sed 's/:/ /' <<< $LD_LIBRARY_PATH) 2>/dev/null | grep libcudnn

libcudnn_adv_train.so.8 -> libcudnn_adv_train.so.8.1.0

libcudnn_adv_infer.so.8 -> libcudnn_adv_infer.so.8.1.0

libcudnn_ops_infer.so.8 -> libcudnn_ops_infer.so.8.1.0

libcudnn.so.8 -> libcudnn.so.8.1.0

libcudnn_ops_train.so.8 -> libcudnn_ops_train.so.8.1.0

libcudnn_cnn_train.so.8 -> libcudnn_cnn_train.so.8.1.0

libcudnn_cnn_infer.so.8 -> libcudnn_cnn_infer.so.8.1.0

 

 

 

OpenCV


전 이미 설치 했었어요 아래 링크로 설치!

https://mickael-k.tistory.com/208?category=798523 

 

[Ubuntu] OpenCV 설치하기 (초간단) in Ubuntu 20.02, Python3.8

<환경> Ubuntu 20.02 Python3.8 (Default) <기존 설치 패키지 업그레이드> sudo apt-get install build-essential cmake sudo apt-get install pkg-config sudo apt-get install libjpeg-dev libtiff5-dev libpng-..

mickael-k.tistory.com

설치 확인

 

하지만!!

이때  CUDA랑 연동을 안 해줘서 그냥 4.5 버전으 다시 깔겠습니다.

 

기존에 설치된 패키지를 업그레이드합니다. 

 

$ sudo apt-get update

$ sudo apt-get upgrade



추가로 필요한 패키지들을 설치합니다. 

 

$ sudo apt-get install build-essential cmake

$ sudo apt-get install pkg-config

$ sudo apt-get install libjpeg-dev libtiff5-dev libpng-dev

$ sudo apt-get install ffmpeg libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libx264-dev libxine2-dev

$ sudo apt-get install libv4l-dev v4l-utils

$ sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev 

$ sudo apt-get install libgtk-3-dev

$ sudo apt-get install mesa-utils libgl1-mesa-dri libgtkgl2.0-dev libgtkglext1-dev  

$ sudo apt-get install libatlas-base-dev gfortran libeigen3-dev

$ sudo apt-get install python3-dev python3-numpy





OpenCV를 다운로드 받아 빌드를 진행합니다. 



$ mkdir opencv-sources

$ cd opencv-sources



$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.1.zip

$ unzip opencv.zip

 

$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.1.zip

$ unzip opencv_contrib.zip

 

$ cd opencv-4.5.1

$ mkdir build

$ cd build




cmake를 실행합니다. 중간에 다운로드를 하므로 인터넷이 연결된 상태에서 진행해야 합니다.

 

주의할 점은 CUDA_ARCH_BIN, CUDA_ARCH_PTX는 https://developer.nvidia.com/cuda-gpus 의 Compute Capability를 참고하여 본인의 GPU에 따라 바꿔야 합니다.  

 

만약 본인의 그래픽카드를 모르겠다면 아래 명령어를 쳐서 위쪽에 나와 있는걸 확인 합니다.

$ nvidia-smi -a

그리고 그걸 아래 링크에서 Compute Capability를 확인 해 줍니다.

https://developer.nvidia.com/cuda-gpus#compute

 

CUDA GPUs

Your GPU Compute Capability Are you looking for the compute capability for your GPU, then check the tables below. NVIDIA GPUs power millions of desktops, notebooks, workstations and supercomputers around the world, accelerating computationally-intensive ta

developer.nvidia.com

목록에 없다면 구글에서 “gtx 1660 ti Compute Capability” 식으로 검색하여 찾으세요. 이 값을 잘못 입력하면 CUDA가 정상 동작하지 않습니다. 

gtx 960m 의 경우에는 5.0입니다. 

 

configure 해줍니다.

$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_PYTHON_EXAMPLES=ON -D INSTALL_C_EXAMPLES=ON -D BUILD_DOCS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_TESTS=OFF -D BUILD_PACKAGE=OFF -D BUILD_EXAMPLES=OFF -D WITH_TBB=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda -D WITH_CUDA=ON -D WITH_CUBLAS=ON -D WITH_CUFFT=ON -D WITH_NVCUVID=ON -D WITH_IPP=OFF -D WITH_V4L=ON -D WITH_1394=OFF -D WITH_GTK=ON -D WITH_QT=OFF -D WITH_OPENGL=ON -D WITH_EIGEN=ON -D WITH_FFMPEG=ON -D WITH_GSTREAMER=ON -D BUILD_JAVA=OFF -D BUILD_opencv_python3=ON -D BUILD_opencv_python2=OFF -D BUILD_NEW_PYTHON_SUPPORT=ON -D OPENCV_SKIP_PYTHON_LOADER=ON -D OPENCV_GENERATE_PKGCONFIG=ON -D OPENCV_ENABLE_NONFREE=ON -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.5.1/modules -D WITH_CUDNN=ON -D OPENCV_DNN_CUDA=ON -D CUDA_ARCH_BIN=5.0  -D CUDA_ARCH_PTX=5.0 -D CUDNN_LIBRARY=/usr/local/cuda/lib64/libcudnn.so.8.1.0 -D CUDNN_INCLUDE_DIR=/usr/local/cuda/include  .. 

 

cmake 실행 결과 입니다. 빨간색 부분을 확인하세요. 

-- General configuration for OpenCV 4.5.1 =====================================
--   Version control:               unknown
-- 
--   Extra modules:
--     Location (extra):            /home/webnautes/opencv-sources/opencv_contrib-4.5.1/modules
--     Version control (extra):     unknown
-- 
--   Platform:
--     Timestamp:                   2021-05-29T12:45:55Z
--     Host:                        Linux 5.8.0-53-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 (15 files):         + SSSE3 SSE4_1
--       SSE4_2 (1 files):          + SSSE3 SSE4_1 POPCNT SSE4_2
--       FP16 (0 files):            + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 AVX
--       AVX (4 files):             + SSSE3 SSE4_1 POPCNT SSE4_2 AVX
--       AVX2 (29 files):           + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2
--       AVX512_SKX (4 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.3.0)
--     C++ flags (Release):         -fsigned-char -ffast-math -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-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 -ffast-math -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-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 -ffast-math -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-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 -ffast-math -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-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,--gc-sections -Wl,--as-needed  
--     Linker flags (Debug):        -Wl,--gc-sections -Wl,--as-needed  
--     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/lib64 -L/usr/lib/x86_64-linux-gnu
--     3rdparty dependencies:
-- 
--   OpenCV modules:
--     To be built:                 alphamat 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 video videoio videostab xfeatures2d ximgproc xobjdetect xphoto
--     Disabled:                    world
--     Disabled by dependency:      -
--     Unavailable:                 cnn_3dobj cvv hdf java julia matlab ovis python2 sfm ts viz
--     Applications:                apps
--     Documentation:               NO
--     Non-free algorithms:         YES
-- 
--   GUI: 
--     GTK+:                        YES (ver 3.24.20)
--       GThread :                  YES (ver 2.64.6)
--       GtkGlExt:                  NO
--     OpenGL support:              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.3.1)
--     OpenEXR:                     build (ver 2.3.0)
--     HDR:                         YES
--     SUNRASTER:                   YES
--     PXM:                         YES
--     PFM:                         YES
-- 
--   Video I/O:
--     FFMPEG:                      YES
--       avcodec:                   YES (58.54.100)
--       avformat:                  YES (58.29.100)
--       avutil:                    YES (56.31.100)
--       swscale:                   YES (5.5.100)
--       avresample:                NO
--     GStreamer:                   YES (1.16.2)
--     v4l/v4l2:                    YES (linux/videodev2.h)
-- 
--   Parallel framework:            pthreads
-- 
--   Trace:                         YES (with Intel ITT)
-- 
--   Other third-party libraries:
--     Lapack:                      NO
--     Eigen:                       YES (ver 3.3.7)
--     Custom HAL:                  NO
--     Protobuf:                    build (3.5.1)
-- 
--   NVIDIA CUDA:                   YES (ver 11.2, CUFFT CUBLAS FAST_MATH)
--     NVIDIA GPU arch:             75
--     NVIDIA PTX archs:            75
-- 
--   cuDNN:                         YES (ver 8.1.0)
-- 
--   OpenCL:                        YES (no extra features)
--     Include path:                /home/webnautes/opencv-sources/opencv-4.5.1/3rdparty/include/opencl/1.2
--     Link libraries:              Dynamic load
-- 
--   Python 3:
--     Interpreter:                 /usr/bin/python3 (ver 3.8.5)
--     Libraries:                   /usr/lib/x86_64-linux-gnu/libpython3.8.so (ver 3.8.5)
--     numpy:                       /home/webnautes/.local/lib/python3.8/site-packages/numpy/core/include (ver 1.17.3)
--     install path:                lib/python3.8/dist-packages
-- 
--   Python (for build):            /usr/bin/python3
-- 
--   Install to:                    /usr/local
-- -----------------------------------------------------------------
-- 
-- Configuring done
-- Generating done
-- Build files have been written to: /home/webnautes/opencv-sources/opencv-4.5.1/build

 

빌드 및 설치를 합니다. 

$ time make -j$(nproc)

 

$ sudo make install

 

라이브러리를 인식할 수 있도록 해줍니다. 

$ sudo ldconfig




다음 코드를 컴파일하여 CUDA를 OpenCV에서 사용할 수 있는지 테스트합니다.  

일반 폴더에서 cpp 파일을 만들고 빌드를 해볼겁니다.

$ gedit test.cpp

코드는 아래와 같습니다.

#include <iostream>
using namespace std;

#include <opencv2/core.hpp>
using namespace cv;

#include <opencv2/cudaarithm.hpp>
using namespace cv::cuda;

int main()
{
    printShortCudaDeviceInfo(getDevice());


    int cuda_devices_number = getCudaEnabledDeviceCount();
    cout << "CUDA Device(s) Number: "<< cuda_devices_number << endl;
    DeviceInfo _deviceInfo;


    bool _isd_evice_compatible = _deviceInfo.isCompatible();
    cout << "CUDA Device(s) Compatible: " << _isd_evice_compatible << endl;


    return 0;
}

 

빌드

$ g++ -o test test.cpp $(pkg-config opencv4 --libs --cflags)


실행 결과 두 항목 모두 1이 나와야 합니다. 

$ ./test

Device 0:  "GeForce GTX 1660 Ti"  5936Mb, sm_75, Driver/Runtime ver.11.20/11.20

CUDA Device(s) Number: 1

CUDA Device(s) Compatible: 1




둘다 1이 보이지 않으면 cmake의 다음 두 옵션에 숫자를 잘못 적은겁니다. 

그래픽 카드에 해당되는 숫자를 적어야 합니다. 

-D CUDA_ARCH_BIN=5.0 -D CUDA_ARCH_PTX=5.0

 

 

간단히 웹캠 예제를 테스트해봅니다.  

일정 폴더를 만들고 cpp파일을 만들겁니다.

$ gedit webcam_test.cpp

코드는 아래와 같습니다.

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

const int fps = 20; // frames por second

int main()
{

    Mat frame; 
    
    VideoCapture videocapture(0); 


    if (!videocapture.isOpened()) 
        return -1;


    while (1) {

        bool ret = videocapture.read(frame);
        if (ret == false) break;


        imshow("Webcam", frame);


        int key = waitKey(1000 / fps);
        if (key == 27 ) 
            break;
    }

    return 0; 
}


빌드

$ g++ -o webcam_test webcam_test.cpp $(pkg-config opencv4 --libs --cflags)

 

실행

$ ./webcam_test 

창이 하나 뜨면서 웹캠 영상이 보이게 됩니다. 아래 경고메시지를 무시해도 됩니다. 

[ WARN:0] global /home/webnautes/opencv-sources/opencv-4.5.1/modules/videoio/src/cap_gstreamer.cpp (961) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1

웹캠 영상이 보이지 않으면 치즈 같은 프로그램을 사용하여 우분투에서 웹캠을 정상 인식했는지 확인할 필요가 있습니다. 

Comments