설치 환경
- 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 설치
Nvidia Driver 및 Nvidia Container Toolkit 설치
Nividia driver 설치
Nvidia Container Toolkit 설치
도커 이미지 실행
이미지 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
++ SSH 환경에서 디스플레이 연결
ssh 연결 시 -X 옵션을 이용해 디스플레이 포워딩
ssh -p [포트] [사용자]@[IP] -X