내가 사용하는 노트북에는 GTX 1660Ti가 달려있다. compute 성능은 7.5인 Turing architecture이지만 CUDA 사용에는 제약이 있다. 직접 테스트해 본 바로는 CUDA 11.4.x가 한계인 것 같다. 여기를 보면 Tensor Core, RT Core가 없다.
이 글을 참고하여 CUDA 11.8을 설치하고 CUDA 11.8에 맞게 cuDNN, TensorRT가 설치된 docker image(22-12)를 설치해 봤지만,
cudaSetDevice()에서 오류 메시지를 출력하고 동작이 되지 않았다.
이 글에서 테스트 한 대로 CUDA 11.4.x에 맞는 docker image(21-10)를 설치한다.
테스트 환경
i7-10750H
GTX 1660Ti
Ubuntu 22.04 LTS
Docker 23.0.4 Community
1. Ubuntu 22.04 설치
GTX 1660Ti에서 CUDA, cuDNN, TensorRT까지 모두 정상적으로 동작하는 최신의 CUDA 버전이 11.4.x이다.
11.4.x는 ubuntu 20.04까지만 드라이버가 공개되어 있다. 하지만 22.04도 설치가 된다.
이 글을 참고하여 Windows 10과 듀얼부팅으로 설치한다.
2. nvidia driver 설치
ubuntu 설치과정에서 3rd party driver를 설치 후, open kernel 드라이버가 설치가 되거나 위의 이미지처럼 오픈 소스 드라이버가 설치가 되는 경우가 있다.
이대로 "nvidia-smi"를 실행하면 "No devices were found"라는 메시지가 나타나고 nvidia docker container가 정상적으로 동작하지 않는다. 이 글을 참고하여 "소프트웨어& 업데이트" -> "추가 드라이버"에 나타나는 목록 중에 "NVIDIA driver metapackge 출처 nvidia-driver-xxx" 형태의 최신버전을 선택하여 설치 후 재부팅한다.
2023년 9월 5일 수정
host linux에는 CUDA를 설치하지 않아도 됩니다. nvidia driver만 설치되어 있으면 나머지 부분들을 진행할 수 있습니다.
3. CUDA 설치
이 글을 참고하여 미리 설치한 그래픽카드 드라이버가 있는 유형으로 CUDA 11.4.2까지만 설치한다.
CUDA까지만 설치하면 nvidia에서 제공하는 docker image를 사용하여 CUDA, cuDNN, TensorRT가 설치된 docker image를 사용할 수 있다.설치과정에서 gcc가 필요할 경우는 "sudo apt-get install build-essential"로 개발툴을 설치한다.
# gcc 개발툴 설치
$ sudo apt-get update
$ sudo apt-get install build-essential
# 드라이버 다운로드
$ wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda_11.4.2_470.57.02_linux.run
# 드라이버 실행
$ sudo sh cuda_11.4.2_470.57.02_linux.run
4. docker 설치
참고 서적: 도커, 컨테이너 빌드업!, 이현룡 저, 제이펍
Windows에 CUDA 설치하느라 씨름할때, Linux에서는 nvidia-docker를 사용하면 드라이버 설치 삽질을 하지 않아도 된다는 글을 많이 봐서 nvidia-docker가 따로 있는 프로그램인 줄 알았었다.
실상은 docker를 설치하고 nvidia에서 제공하는 docker image를 컨테이너로 돌리는 것이었다. 그래도 CUDA, cuDNN, TensorRT 3가지 버전을 가지고 삽질을 하지 않아도 된다는 점은 좋다.
도커 홈페이지를 참고하여 설치한다.
4.1. Uninstall old versions
$ sudo apt-get remove docker docker-engine docker.io containerd runc
4.2. Install using the apt repository
4.2.1. Set up the repository
# Update the apt package index and install packages to allow apt to use a repository over HTTPS:
$ sudo apt-get update
$ sudo apt-get install ca-certificates curl gnupg
# Add Docker’s official GPG key:
$ sudo install -m 0755 -d /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Use the following command to set up the repository:
$ echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
4.2.2. Install Docker Engine
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 설치 완료 확인
$ sudo docker run hello-world
4.3. docker 권한
# 로그오프하면 다음 로그인 부터는 sudo가 없어도 docker 명령 사용 가능.
$ sudo usermod -aG docker $(whoami)
5. nvidia-docker 또는 nvidia-container 설치
nvidia 홈페이지를 참고하여 설치한다.
5.1. Setting up Docker
$ curl https://get.docker.com | sh && sudo systemctl --now enable docker
5.2. Setting up NVIDIA Container Toolkit
# Setup the package repository and the GPG key:
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
# Install the nvidia-container-toolkit package (and dependencies) after updating the package listing:
$ sudo apt-get update
$ sudo apt-get install -y nvidia-container-toolkit
# Configure the Docker daemon to recognize the NVIDIA Container Runtime:
$ sudo nvidia-ctk runtime configure --runtime=docker
# Restart the Docker daemon to complete the installation after setting the default runtime:
$ sudo systemctl restart docker
# At this point, a working setup can be tested by running a base CUDA container:
$ sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
6. tensorrt docker image 다운로드 및 실행
이 항목에서 docker image를 다운로드 받고 다음 항목에서 opencv를 설치하거나 아래의 파일로 설치할 수 있다.
도커 이미지 정보: https://docs.nvidia.com/deeplearning/tensorrt/container-release-notes/#rel_21-10
참고 자료1: https://driz2le.tistory.com/257
참고 자료2: https://somatorio.org/en/post/running-gui-apps-with-docker/
참고 자료3: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=hgh73&logNo=220500681114
참고 자료4: https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tensorrt
참고 서적: 도커, 컨테이너 빌드업!, 이현룡 저, 제이펍
6.1. opencv 결과를 화면에 띄워 주기 위해 X windows와 통신을 허용한다.
# 권한 추가
$ xhost +local:docker
# 권한 삭제
$ xhost -local:docker
6.2. docker container 실행
opencv 프로젝트를 docker container에서 진행할 것이라 결과를 보여줄 X windows와 사용할 webcam 옵션을 넣어서 실행한다.
$ docker run -it \
--gpus all \
-v `pwd`:/mnt \
--device /dev/video0 \
-e DISPLAY=$DISPLAY \
-v $XSOCK:$XSOCK \
-e NO_AT_BRIDGE=1 \
-e QT_X11_NO_MITSHM=1 \
nvcr.io/nvidia/tensorrt:21.10-py3
6.3 docker run 외에 몇 가지 docker 명령어
# 컨테이너 목록
$ docker container ls -as
$ docker ps -as
# 컨테이너 삭제
$ docker rm [컨테이너 이름]
# 도커 이미지 목록
$ docker image ls
$ docker images
# 도커 이미지 삭제
$ docker image rm [이미지 이름]
# exit 상태인 컨테이너 시작
$ docker start [컨테이너 이름]
# start 상태인 컨테이너 attach
$ docker attach [컨테이너 이름]
# start 상태인 컨테이너를 bash로 실행
$ docker exec -it [컨테이너 이름] /bin/bash
# attach와 exec의 차이
# attach는 실행 중인 터미널이 있으면 그 터미널과 같은 화면을 보여주는 터미널이 실행된다.
# exec는 쉘을 단독으로 실행한다.
# 컨테이너로 이미지 만들기
$ docker commit -a [만든이] -m [만들 이미지 이름] [참조 컨테이너 이름] [만들 이미지 이름]:[태그]
# 명령어의 예
$ docker commit -a "j2b2" -m "trt21.10_cv4.7.0" blabla trt21.10_cv4.7.0:1.0
# 도커 실행 종료후 삭제
$ docker run --rm image_name
# 중지된 컨테이너 사용하지 않는 이미지 전부 삭제
$ docker system prune -a
# 캐시 없이 빌드
$ docker build --no-cache -t u12_core -f u12_core .
# docker 오브젝트 전부 삭제
$ docker system prune --volumes
7. opencv build & install
위에서 설치한 nvidia tensorrt 이미지는 TensorRT 8.0.3.4 뿐만 아니라 CUDA 11.4.2, cuDNN 8.2.4.15도 함께 설치가 되어 있어서, 실행한 컨테이너에 opencv를 build, install을 진행한다.
참고 자료1: https://docs.opencv.org/4.x/d7/d9f/tutorial_linux_install.html
참고 자료2: https://webnautes.tistory.com/1767
참고 자료3: https://darkpgmr.tistory.com/184
7.1. 사전에 설치된 버전 확인 및 삭제
docker image를 받은 직후에는 nvidia 드라이버들만 설치되어 있어서 실행 필요가 없지만, 일반적인 opencv build 과정이라 적어둔다.
# 사전에 설치된 버전 확인
$ pkg-config --modversion opencv
$ pkg-config --modversion opencv4
# 과거 버전 삭제
$ sudo apt purge libopencv* python-opencv
$ sudo apt autoremove # 위험할 수 있으니 내용을 잘 확인하고 실행 (opencv 관련만 삭제하는지..)
7.2. opencv build에 필요한 사전 패키지 설치
# update ubuntu system to latest
$ sudo apt update
$ sudo apt upgrade # 시스템 전체를 업그레이드하는 것임 (필요한 경우만 실행)
# dev & build
$ sudo apt-get install build-essential gdb unzip git wget pkg-config
# python3
$ sudo apt-get install python3-dev python3-numpy
# opencv module
$ sudo apt-get install libatlas-base-dev gfortran libeigen3-dev
# image codec
$ sudo apt-get install libjpeg-dev libtiff5-dev libpng-dev openexr
# video codec
$ sudo apt-get install ffmpeg \
libavcodec-dev \
libavformat-dev \
libswscale-dev \
libxvidcore-dev \
libx264-dev \
libxine2-dev \
libv4l-dev \
v4l-utils
# gstreamer
$ sudo apt-get install libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev \
gstreamer1.0-libav \
gstreamer1.0-tools \
gstreamer1.0-x \
gstreamer1.0-alsa \
gstreamer1.0-gl \
gstreamer1.0-gtk3 \
gstreamer1.0-qt5 \
gstreamer1.0-pulseaudio
# gtk3와 qt5는 결과 화면 출력용이라 둘 중 하나 선택이 가능하다.
# 둘 다 선택하면 qt5로 출력된다.
# gtk3
$ sudo apt-get install libgtk-3-dev libcanberra-gtk3-module
# qt5
$ sudo apt-get install qtbase5-dev libqt5opengl5-dev libgl1-mesa-dri
7.3. cmake 3.26.3 설치
nvidia에서 제공하는 docker image에는 cmake 3.14.4가 설치되어 있다. VSCode에서 권장하는 cmake의 버전은 3.15 이상이다.
$ wget https://github.com/Kitware/CMake/releases/download/v3.26.3/cmake-3.26.3-linux-x86_64.sh
$ chmod +x cmake-3.26.3-linux-x86_64.sh
$ ./cmake-3.26.3-linux-x86_64.sh --prefix=/usr/local --exclude-subdir --skip-license
$ rm ./cmake-3.26.3-linux-x86_64.sh
7.4. opencv 소스 다운로드
$ mkdir opencv && cd opencv
$ wget -O opencv-4.7.0.tar.gz https://github.com/opencv/opencv/archive/refs/tags/4.7.0.tar.gz
$ tar -zxvf opencv-4.7.0.tar.gz
$ wget -O opencv_contrib-4.7.0.tar.gz https://github.com/opencv/opencv_contrib/archive/refs/tags/4.7.0.tar.gz
$ tar -zxvf opencv_contrib-4.7.0.tar.gz
$ mkdir build && cd build
7.5. cmake
$ 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=OFF \
-D WITH_IPP=OFF \
-D ENABLE_FAST_MATH=OFF \
-D WITH_1394=OFF \
-D WITH_GTK=ON \
-D WITH_QT=ON \
-D WITH_OPENGL=ON \
-D WITH_V4L=ON \
-D WITH_FFMPEG=ON \
-D WITH_EIGEN=ON \
-D WITH_GSTREAMER=ON \
-D WITH_TESSERACT=OFF \
-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.7.0/modules \
-D PYTHON3_PACKAGES_PATH=/usr/local/lib/python3.8/dist-packages \
-D WITH_XINE=ON \
-D BUILD_WITH_DEBUG_INFO=OFF \
-D WITH_CUDA=ON \
-D WITH_CUBLAS=ON \
-D WITH_CUFFT=ON \
-D WITH_CUDNN=ON \
-D OPENCV_DNN_CUDA=ON \
-D CUDA_FAST_MATH=ON \
-D CUDA_ARCH_BIN=7.5 \
-D CUDA_ARCH_PTX=7.5 \
-D WITH_NVCUVID=ON \
-D WITH_NVCUVENC=ON \
-D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda \
-D CUDNN_LIBRARY=/usr/lib/x86_64-linux-gnu/libcudnn.so.8.7.0 \
-D CUDNN_INCLUDE_DIR=/usr/include \
../opencv-4.7.0
7.6. opencv build & install
# 명령어 앞에 "time "을 붙여주면 완료 후 시간이 출력된다.
# $(nproc)은 시스템의 코어 수를 반환한다.
# 아래 명령을 실행하면 시스템 코어 전부를 사용하여 빌드한다.
$ time make -j$(nproc)
# 설치
$ sudo make install
# 컴파일 시, opencv 라이브러리를 찾을 수 있도록 다음 명령을 실행
$ sudo ldconfig
# 확인
$ pkg-config --modversion opencv4
7.6.1. build 하는 중에 GPU 동작을 확인하려면 터미널을 하나 더 열고 "nvidia-smi"를 실행하면 된다.
# -d는 직전과 바뀐 항목 강조
# -n 1은 1초에 한번씩 갱신
$ watch -d -n 1 nvidia-smi
7.7. opencv를 설치한 컨테이너로 이미지 만들기
# 컨테이너로 이미지 만들기
$ docker commit -a [만든이] -m [만들 이미지 이름] [참조 컨테이너 이름] [만들 이미지 이름]:[태그]
# 명령어의 예
$ docker commit -a "j2b2" -m "trt21.10_cv4.7.0" blabla trt21.10_cv4.7.0:0.1
'설치' 카테고리의 다른 글
Windows 10 + Python + OpenCV + OpenVINO + CUDA + VTK (0) | 2023.04.10 |
---|---|
Windows 10 + CUDA + Python + OpenCV DNN + OpenVINO + VTK 설치하기 (0) | 2023.04.10 |