知之者 不如好之者, 好之者 不如樂之者

기계처럼 살지 말고, 즐기는 인간이 되자

Project/ROS2 + CV + Robot (2023.12~2024.02)

Linux(Ubuntu 22.04) conda 가상 환경에서 CUDA 를 위한 OpenCV, PyTorch, Torchvision 빌드

코방코 2024. 1. 10. 00:35
728x90

 

 

NVIDIA GPU를 이용하는 경우 병렬 처리와 GPU 가속을 위해 CUDA 를 사용합니다.

이 경우 openCV와 torch, torchvision이 CUDA 와 함께 작동할 수 있도록 별도의 빌드 과정이 필요한데,

이를 위해 주로 가상 환경을 구성하여 이를 빌드합니다.

로컬 환경을 보존시킨 상태로 가상 환경에서 별도의 라이브러리 버전을 사용할 수 있다는 장점이 있습니다.

 

이 글은 Anaconda 를 이용하여 특정 python 가상 환경을 생성하고,

해당 가상환경에서 openCV, PyTorch, torchvision을 빌드하는 방법입니다.

 

저는 이 과정을 여러 번 했는데도 할 때마다 항상 너무 어려운 것 같습니다.

이번에도 이틀을 날렸네요.

그래서 이번에 성공한 빌드를 바로 정리를 해두려 합니다.

우선 아래 글은 CUDA 11.8 - python3.6 - openCV 4.5.5 빌드를 기반으로 하고 있고,

최대한 다른 버전과 호환이 가능하도록 범용적으로 작성해보겠습니다.

 

우선 Anaconda가 없다면 다른 글을 참조하여 anaconda부터 설치하시기 바랍니다.

아래는 좋은 레퍼런스 입니다.

Anaconda 가 설치되면 터미널을 한 번 껐다 켜야 정상적으로 과정들이 진행됩니다.

아래 글에서 5단계 까지만 진행한 이후라고 가정을 하고 새로 가상 환경을 만들겠습니다.

 

Ubuntu 22.04에 Anaconda 설치 및 가상환경 세팅

1. 글을 작성하게 된 계기 새로운 프로젝트를 할 때마다 Anaconda를 설치해서 환경 세팅을 하는 경우가 많다. 매번 구글링해서 설치하곤 하는데 정리해서 새로운 환경에서 시작할 때 참고하고자 한

jongsky.tistory.com

 

 

python 3.6 의 가상환경을 만들고 가상환경을 활성화 해줍니다.

python 버전을 적절하게 수정하시고,

YourEnv 자리에 원하는 가상 환경 이름을 넣으시기 바랍니다.

conda create -n YourEnv python=3.6

conda activate YourEnv

 

 

이번에는 가상환경에서 CUDA 에 맞는 torch 와 torchvision을 빌드해주겠습니다.

자신의 CUDA 버전에 맞게 입력하면 됩니다.

저는 CUDA 11.8 에서 빌드하였습니다.

conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia

 

꽤 오랜 시간이 걸려 설치가 완료되었고 다음 명령을 통해 테스트해보았습니다.

python3

import torch
torch.cuda.is_available()

True 가 나타나면 정상적으로 설치가 된 것입니다.

이 때 Python 버전도 가상 환경 설정 시와 동일하게 나타나는지 잘 확인하시기 바랍니다.

 

이번엔 opencv 를 가상환경에 cmake build 해주겠습니다.

아래 과정대로 따라가도 안되는 경우가 거의 70%라고 생각합니다.

적절하게 조금씩 디버깅(?)을 하셔야 합니다.

 

먼저 필요한 라이브러리를 설치합니다.

설치할 것이 많은데, 

어떤 것들을 cmake 할지 모르기 때문에 일단 웬만한 것은 다 넣어보았습니다.

중간중간에 에러가 나면 해당 라이브러리는 제거하고 빌드해보시기 바랍니다.

conda install numpy

conda install -c conda-forge cmake

sudo sh -c "echo '/usr/local/cuda/lib64' >> /etc/ld.so.conf.d/nvidia-tegra.conf"

sudo ldconfig

sudo apt-get install build-essential cmake git unzip pkg-config

sudo apt-get install libjpeg-dev libpng-dev libtiff-dev

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev

sudo apt-get install libgtk2.0-dev libcanberra-gtk*

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

sudo apt-get install libxvidcore-dev libx264-dev libgtk-3-dev

sudo apt-get install libtbb2 libtbb-dev libdc1394-22-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 libvorbis-dev libxine2-dev

sudo apt-get install libfaac-dev libmp3lame-dev libtheora-dev

sudo apt-get install libopencore-amrnb-dev libopencore-amrwb-dev

sudo apt-get install libopenblas-dev libatlas-base-dev libblas-dev

sudo apt-get install liblapack-dev libeigen3-dev gfortran

sudo apt-get install libhdf5-dev protobuf-compiler

sudo apt-get install libprotobuf-dev libgoogle-glog-dev libgflags-dev

 

나중에 cmake를 하다가 lib 어쩌고 저쩌고가 없다고 하면 다시 여기로 돌아오셔서

해당 라이브러리를 추가로 설치하시거나,

 

그래도 안된다면 LD_LIBRARY_PATH의 문제이거나,

이해가 전혀 안되는 버그일 수도 있습니다.

저의 경우에는 libtiff 라이브러리가 계속 없다는 이상한 문제가 발생해서, 

해당 라이브러리를 제외시키고 빌드하니 성공했습니다.

 

이제 설치한 라이브러리 경로를 bashrc에 추가해줍니다.

터미널에서 다음 명령어로 .bashrc 파일을 엽니다:

sudo nano ~/.bashrc

 

파일의 끝에 다음 줄을 추가합니다

export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH

sudo apt-get 명령어를 통해서 로컬 환경에 라이브러리가 설치되었으므로 추가해주는 것입니다. 

 

파일을 저장하고 닫은 후, 변경 사항을 적용하기 위해 다음 명령을 실행합니다:

source ~/.bashrc

 

OpenCV GitHub 저장소에서 OpenCV 코드를 클론합니다.

적절한 OpenCV 버전을 입력하시기 바랍니다.

cd

OPENCV_VERSION=4.5.5

git clone https://github.com/opencv/opencv.git -b ${OPENCV_VERSION}

git clone https://github.com/opencv/opencv_contrib.git -b ${OPENCV_VERSION}

cd opencv

 

 

CMake를 사용하여 OpenCV를 build 합니다.

굉장히 속이 터질 수 있습니다.

 

CUDA_ARCH_BIN 값은 자신의 GPU에 맞는 값을 아래 링크에서 찾으셔야합니다.

 

CUDA GPUs - Compute Capability

Explore your GPU compute capability and CUDA-enabled products.

developer.nvidia.com

저는 Geforce RTX 2080 Ti 라서 7.5였습니다.

 

아래 Cmake에서 반드시 수정해야하는 부분이 여러 개 있습니다.

우선 적절한 CUDA_ARCH_BIN 값을 찾고, 위 2개 명령어를 입력하시고

cmake 명령어부터 메모장에 복사하시고 아래 글을 참조하여 수정하시기 바랍니다.

 

반드시 수정해야하는 부분은 다음과 같습니다.

CMAKE_INSTALL_PREFIX=~/anaconda3/envs/YourEnv

PYTHON_EXECUTABLE=~/anaconda3/envs/YourEnv/bin/python3.6

PYTHON_INCLUDE_DIR=~/anaconda3/envs/YourEnv/include/python3.6m

PYTHON_LIBRARY=~/anaconda3/envs/YourEnv/lib/libpython3.6m.so

OPENCV_PYTHON_INSTALL_PATH=~/anaconda3/envs/YourEnv/lib/python3.6/site-packages

여기서 YourEnv와 python 버전들을 자신에게 맞게 적절하게 수정하셔야 합니다.

직접 libpython3.6m.so 이런게 있는지 확인하시기 바랍니다.예를 들어 python 3.9의 경우 m 없이 그냥 python3.9, libpython3.9.so 입니다.

 

그리고 그 이외 자신에게 필요한 옵션들을 ON 하시기 바랍니다.

대표적으로 CSI camera를 쓰는 경우 Gstreamer 옵션을 ON 하셔야 됩니다.

 

이 때 cmake를 하시면, 굉장히 중요한 정보들이 모여있는 출력문이 나타납니다.

CUDA 가 ON 이고, 여러 python 경로와 lib 경로가 cmake에서 원하던대로 설정이 되었는지

이 출력문에서 확인하셔야 합니다.

이 출력문에서 경로가 잘못되어있다면 make는 99% 실패합니다.

make가 성공하더라도 import cv2 에서 막히게 됩니다.

 

cmake가 잘 이루어진 것 같다면 이제 OpenCV를 make 해줍니다.

cd build

make -j$(nproc)

sudo make install

 

make 가 100%가 되기 전에 정확한 에러 메시지가 출력되지 않고 중단되면,

make -j$(nproc) 을 make 로 수정해서 빌드해보시면 에러 메시지가 정확하게 나타납니다.

nproc을 하면 코어 수만큼 병렬로 make를 진행하기 때문에 속도가 빠른 대신

잡에러가 조금 나타나지만, 빌드에 치명적이진 않은 듯 합니다.

 

하나 조언 드리고 싶은 점은 만약 빌드가 실패했을 때 cmake를 수정해야한다면,

빌드 디렉토리를 삭제하고 다시 cmake 하시고

그게 아니라 어떤 명령 때문에 중단되었는지 확인하거나, 

라이브러리 설치만 새로 한 뒤 다시 빌드하는 것이라면

그대로 make를 하시면 이전에 중단된 지점까지 빠르게 진행이 됩니다.

 

 

Python을 실행하고 OpenCV가 올바르게 설치되었는지 확인합니다.

python3

# 이 때 가상환경 python 버전이 일치하는지 확인

import cv2
print(cv2.__version__)

 

or 

 

python3 -c 'import cv2; print(cv2.getBuildInformation())'

 

여기까지 오셨다면 100%를 보셨다는 말이지만, 

저는 여기서도 많이 막혔습니다.

다음과 같이 빌드한 버전이 나타나면 성공입니다.

 

cv2 module이 존재하지 않는다는 에러가 나타나면 

여러 방법이 있지만,

저는 대부분 cmake 부터 문제였습니다.  

cv2.so 파일을 동적 링킹 하거나 cp 하는 등의 해결 방법이 있는 것 같지만,

결국에 이건 가상환경을 구성한 의미가 없어지는 행위인 것 같습니다. 

웬만하면 시간이 아깝더라도 다시 cmake 명령부터 검토하시기 바랍니다.

 

 

 

728x90
반응형