서론
YOLO(You Only Look Once)는 실시간 객체 탐지를 위한 강력한 딥러닝 알고리즘이다. 최신 버전인 YOLO v8은 더욱 향상된 성능을 제공한다. 본 포스트에서는 YOLO v8을 이미지 및 동영상 처리에 사용할 때, CPU와 GPU(1개(single) 및 2개(multi))간의 동작시간(YOLO v8 log에 나오는 Speed)을 비교 분석해 볼 예정이다.
YOLO v8 알고리즘 소개
YOLO v8은 이미지 내의 객체를 식별하고 위치를 파악하는 데 사용되는 딥러닝 기반 알고리즘이며, 이전 버전들에 비해 더 많은 레이어와 복잡한 구조를 가지고 있어, 높은 정확도와 빠른 속도를 제공한다.
CPU vs GPU
- CPU (Central Processing Unit): 범용 계산에 사용되는 컴퓨터의 주요 계산 단위이다.
- GPU (Graphics Processing Unit): 병렬 계산에 특화되어 있어, 딥러닝과 같은 고도의 병렬 계산이 필요한 작업에서 뛰어난 성능을 발휘한다.
실험 설정
- 하드웨어
- CPU: Intel 13th Gen Intel Core(TM) i9-13900KF CPU
- MEMORY: DDR5 128GB
- GPU: Single(NVIDIA RTX 4090 GPU 1개), Multi(NVIDIA RTX 4090 GPU 2개)
- 소프트웨어: YOLO v8, CUDA, cuDNN
- 모델: yolov8n.pt, yolov8x.pt
- 데이터: 3024*4032 해상도의 이미지(3.2Mb), 3840*2160 해상도의 1분 길이(30fps) 블랙박스 동영상(169Mb)
YOLO v8의 CPU와 GPU 동작시간 비교
이미지 처리
- yolov8n.pt 모델 사용
- CPU: 이미지 1장 처리에 평균 42.9ms 소요
- Single GPU: 이미지 1장 처리에 평균 11ms 소요
- Multi GPU: 이미지 1장 처리에 평균 11.8ms 소요
- CPU: 이미지 1장 처리에 평균 42.9ms 소요
- yolov8x.pt 모델 사용
- CPU: 이미지 1장 처리에 평균 225.9ms 소요
- Single GPU: 이미지 1장 처리에 평균 16.7ms 소요
- Multi GPU: 이미지 1장 처리에 평균 16.8ms 소요
- CPU: 이미지 1장 처리에 평균 225.9ms 소요
동영상 처리
- yolov8n.pt 모델 사용
- CPU: 1분 길이 동영상 처리에 약 1분12초 소요(프레임당 39.5ms 소요)
- Single GPU: 1분 길이 동영상 처리에 약 17초 소요(프레임당 9.1ms 소요)
- Multi GPU: 1분 길이 동영상 처리에 약 16초 소요(프레임당 8.8ms 소요)
- CPU: 1분 길이 동영상 처리에 약 1분12초 소요(프레임당 39.5ms 소요)
- yolov8x.pt 모델 사용
- CPU: 1분 길이 동영상 처리에 약 5분 50초 소요(프레임당 194.3ms 소요)
- Single GPU: 1분 길이 동영상 처리에 약 1분 2초 소요(프레임당 34.2ms 소요)
- Multi GPU: 1분 길이 동영상 처리에 약 1분 3초 소요(프레임당 34.9ms 소요)
- CPU: 1분 길이 동영상 처리에 약 5분 50초 소요(프레임당 194.3ms 소요)
로그 및 분석
동작시간 로그를 통해 GPU를 사용했을 때 CPU에 비해 상당한 성능 향상이 있음을 확인할 수 있다. 놀라운 점은, GPU를 2개 사용했을 때 GPU 1개를 사용했을 때와 별차이가 없었다는 점이다.
우선 GPU가 CPU보다 빠른 결과는 YOLO v8의 복잡한 계산이 GPU의 병렬 처리 능력을 활용하기에 적합하다는 것을 보여준다.
Single GPU와 Multi GPU간 차이가 없었던 점은 실제로 MultiGPU를 사용한다고 설정은 했지만 Device=0의 Single GPU만 사용하고 있음을 볼 수 있었다(Inference 당시 Device=1의 GPU는 사용률이 0였다. 참고로 Device=0의 GPU CUDA 사용률은 30%수준이었다.). 이는 YOLOv8의 계산 부하가 GPU 두 개를 완전히 활용하기에 충분하지 않을 수 있음을 의미할 수 있다.
결론
GPU를 사용하면 이미지와 동영상 처리 시간을 크게 줄일 수 있으며, 특히 복잡한 모델을 사용할 때 그 차이가 더욱 두드러지는 것을 확인 할 수 있다. 또한 YOLOv8x 모델은 YOLOv8n 모델에 비해 계산 부하가 더 크기 때문에 처리 시간이 더 길어지는 것을 볼 수 있었다.
프레임당 평균 처리 시간이 YOLOv8n 모델의 경우 CPU에서 39.5ms, Single GPU에서 9.1ms, Multi GPU에서 8.8ms로 측정되었다. 반면, YOLOv8x 모델은 CPU에서 194.3ms, Single GPU에서 34.2ms, Multi GPU에서 34.9ms로 측정되었다.
성능측면에서 보면 CPU의 성능이 1이라고 가정했을 때 GPU사용시 성능 우의 특성 차이가 위 그래프와 같이 보였다.
최종적으로, 알고 싶었던 실시간 처리 측면을 보면 30fps를 영상의 경우 한 프레임에 분석 가능한 시간이 이론적으로 33ms정도 이므로 YOLOv8n 모델은 GPU를 사용했을 때 충분히 실시간 Detection이 가능할 것으로 보인다. 반면 YOLOv8x 모델은 GPU를 사용하더라도 지연이 발생될 것으로 보인다.