설치 환경

  • OS: Ubuntu-22.04 LTS (WSL)
  • CPU: Intel i9-9900k
  • GPU: RTX 2080 8G
  • RAM: 32G
  • CUDA: 11.8
  • cuDNN: v8.9.7
  • 날짜: 2024.05.14.

Docker based Install

도커 설치

Docker 설치

Docker 설치하기

Nvidia Driver 및 Nvidia Container Toolkit 설치

Nividia driver 설치

(Ubuntu) Nvidia 그래픽 드라이버 설치

Nvidia Container Toolkit 설치

(Docker) Docker - Nvidia CUDA 설치


도커 이미지 실행

이미지 pull

docker pull nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04
  • cuda-toolkit 11.8.0, cudnn8 이 설치되어있는 우분투 20.04 이미지

이미지 run

docker run -i -t --gpus all --name yolov4 -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --privileged -v $(pwd):/workspace/ nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04
  • -i, t: 터미널 입력
  • -v : 볼륨 마운트 ($(pwd) 현재 폴더를 도커 환경의 workspace 폴더와 마운트)
  • -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --privileged : 디스플레이 연결

기본패키지 설치

python, opencv 등 기본 패키지 설치

apt update
apt install git
apt install wget
apt install build-essential
# opencv
apt install libopencv-dev
# nano
apt install nano

YOLOv4

Darknet 소스코드 다운로드

실행한 docker 환경의 workspace에서 yolov4 소스코드 다운로드

git clone https://github.com/AlexeyAB/darknet.git

Darknet 빌드

Darknet 빌드 전 GPU와 Opencv를 사용하기 위해 makefile 수정

cd darknet
nano MakeFile

MakeFile

다음 항목의 값을 1로 수정함

  • GPU=1
  • CUDNN=1
  • CUDNN_HAFL=1
  • OPENCV=1
  • LIBSO = [0, 1] : so 라이브러리 파일을 만든다. darknet python 파일을 실행할 때 사용됨. 제공된 darknet python 파일은 conda 환경에서 실행 불가

본인의 GPU에 해당하는 ARCH 값을 주석 해제하여 수정

ARCH = -gencode arch=compute_75,code=[sm_75,compute_75]

빌드 실행

make

테스트

coco dataset based 사전학습 가중치 파일 다운로드

wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights

데모 코드를 통해 테스트 이미지

# 이미지 테스트
./darknet detect cfg/yolov4.cfg yolov4.weights data/person.jpg
 
# 비디오 테스트
./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights ../dataset/sample_video_hd.mp4 -out_filename results/results1.mp4

+ 이슈

도커환경과 호스트환경의 디스플레이가 연결되지 않아 디스플레이 불가 Unable to init server: Could not connect: Connection refused

**현재 도커 컨테이너 환경을 Commit **

docker commit <contianer id> cuda/cudnn/darknet:v1.0
  • -v로 마운트된 볼륨은 commit 시 이미지로 반영되지 않는다댜

컨테이너 종료

docker stop <container id>
# 컨테이너 강제 종료 후 삭제
docker rm -f <container id>

디스플레이연결 -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --privileged -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --privileged

++ lcuda 라이브러리 못찾는 경우 (WSL - Local 에서 발생)

Error
/usr/bin/ld: cannot find -lcuda
collect2: error: ld returned 1 exit status

nvcc -V 명령어가 실행됨에도 불구하고 발생하는 에러

MakeFile을 수정

MakeFile 의 ifeq ($(GPU), 1) 부분을 수정

LDFLAGS+= -L/usr/local/cuda/lib64 -lcudart -lcublas -lcurand -L/usr/local/cuda/lib64/stubs -lcuda

참고: linux - When I `make` darknet with CUDA=1, `/usr/bin/ld: cannot find -lcuda`occured. How to fix it without root permission - Stack Overflow

++ SSH 환경에서 디스플레이 연결

ssh 연결 시 -X 옵션을 이용해 디스플레이 포워딩

ssh -p [포트] [사용자]@[IP] -X

동작


참고


yoloObjectDetectionDeepLearning