| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- 파이썬 클래스
- tensorRT
- yolo11
- 시스템관리
- Python
- Vision AI
- 인공지능
- 앱테크
- 생성형 AI
- comfyui
- 머신러닝
- 산업적용
- stable diffusion
- github
- Windows
- 파이썬
- 오픈소스
- 딥러닝 추론 최적화
- 딥러닝
- 생성형AI
- C++ 기초
- AI
- 프로그래밍
- 리눅스
- git
- YOLO
- 비전AI
- 스마트팩토리
- pytorch
- onnx
- Today
- Total
너도 할 수 있는, 너도밤나무 코딩
ONNX Runtime GPU 성능 비교: CPU vs CUDA vs TensorRT, 무엇을 선택해야 할까? 본문
ONNX Runtime GPU 성능 비교: CPU vs CUDA vs TensorRT, 무엇을 선택해야 할까?
곡마일장 2025. 8. 26. 07:52딥러닝 모델을 서비스에 올릴 때 가장 많이 부딪히는 문제가 바로 추론 속도입니다.
모델 자체는 ONNX로 변환해서 ONNX Runtime에서 불러오기 쉽지만, Execution Provider(EP) 를 어떻게 설정하느냐에 따라 실제 서비스 성능이 크게 달라집니다.
제가 최근에 이미지 분류와 객체 탐지 모델을 ONNX Runtime으로 배포하면서, CPU / CUDA / TensorRT 환경에서 직접 성능을 비교해 본 경험을 공유하려 합니다.

ONNX Runtime Execution Provider란?
ONNX Runtime은 기본적으로 CPU Execution Provider를 사용합니다.
하지만 GPU 환경에서는 NVIDIA가 제공하는 CUDA EP와 TensorRT EP를 통해 훨씬 빠른 속도를 얻을 수 있습니다.
- CPU EP: 모든 환경에서 기본적으로 사용 가능.
- CUDA EP: NVIDIA GPU + CUDA/cuDNN 환경에서 가속.
- TensorRT EP: NVIDIA TensorRT 최적화 적용. FP16, INT8까지 지원.
CPU vs GPU 성능 차이
실제로 ResNet-50 모델을 기준으로 추론 속도를 측정해 봤습니다. (배치 크기: 1, 입력 224x224)
| Execution Provider | 평균 추론 속도 (ms) | 상대 속도 |
| CPU EP | 40~50 ms | 1x |
| CUDA EP (FP32) | 4~6 ms | ~8x |
| TensorRT EP (FP16) | 2~3 ms | ~15x |
단순히 CPU에서 GPU로 옮기는 것만으로도 8배 이상 속도 향상,
TensorRT FP16까지 적용하면 15배 이상 향상을 확인할 수 있었습니다.
CUDA EP와 TensorRT EP 차이
많은 분들이 “CUDA Execution Provider만 쓰면 충분하지 않나?” 하고 묻습니다.
저도 처음엔 그렇게 생각했지만, 실제 배포에서는 TensorRT EP를 더 선호하게 되었습니다.
- CUDA EP
- 설정이 간단하다 (AppendExecutionProvider_CUDA(0) 한 줄이면 끝)
- 대부분의 연산 지원
- FP32 중심 → FP16/INT8 최적화는 직접 모델을 변환해야 함
- TensorRT EP
- 초기화는 다소 오래 걸림 (엔진 빌드 과정 때문, engine 파일을 사용할 수 있음)
- 지원되지 않는 연산은 자동으로 CUDA fallback
- FP16/INT8 최적화로 추가적인 속도 향상 가능 (다만 정확도는 감소 예상)
결론적으로, 짧게 실행되는 테스트 환경 → CUDA EP,
장기 서비스 환경 → TensorRT EP 가 더 적합합니다.
최적화 팁
제가 경험적으로 얻은 CUDA/TensorRT 최적화 팁도 정리해봅니다.
- 고정된 입력 shape 사용하기
- EnableMemPattern 옵션과 그래프 최적화 레벨을 ORT_ENABLE_ALL로 설정하면 효과가 있음 (하지만 미비함)
- 경험적으로 dynamic shape을 사용하기보다는 고정된 shape로 resize한 후 처리하면 코드의 가독성을 확보 가능
- 모델 FP16 변환하기
- onnxruntime_tools.optimizer_cli --float16 옵션을 활용.
- 메모리 사용량이 크게 줄고 속도도 빨라짐.
- 더 작은 구조로 변환한다면 정확도가 현저히 떨어져 fp16이 최선으로 생각함.
- cuDNN 알고리즘 탐색 모드
- 장기 서비스라면 OrtCudnnConvAlgoSearchExhaustive,
- 빠른 초기화가 필요하면 HEURISTIC 권장.
실무 적용 시 고려할 점
- GPU 메모리 관리: 큰 모델은 OOM 발생 가능 → gpu_mem_limit 옵션으로 조정.
- 엔진 캐싱: TensorRT EP를 사용할 경우, 엔진 캐싱을 켜두면 초기화 시간을 단축할 수 있음.
- 멀티 GPU 서버: AppendExecutionProvider_CUDA(1) 식으로 원하는 GPU를 명시적으로 지정해야 안정적.
결론
ONNX Runtime은 단순히 “CPU에서 모델 돌리기”를 넘어서,
CUDA Execution Provider와 TensorRT Execution Provider를 제대로 활용하면 실서비스 수준의 추론 속도를 낼 수 있습니다.
- 테스트 단계: CUDA EP로 간단히 GPU 가속
- 배포 단계: TensorRT EP + FP16 변환으로 최대 성능 확보
감사합니다.
ONNX Runtime GPU 성능 비교, ONNX Runtime CUDA Execution Provider, ONNX Runtime TensorRT, 딥러닝 추론 속도 비교, ONNX FP16 최적화
'인공지능(AI, Artificial Intelligence) > 비전 AI(Vision AI)' 카테고리의 다른 글
| YOLO 인공지능 버전별 진화 정리 (3) | 2025.08.30 |
|---|---|
| ONNX Runtime Quantization 가이드: FP16, INT8 최적화로 추론 속도 끌어올리기 (5) | 2025.08.26 |
| [DatasetHelper] YOLO 학습용 데이터셋 준비와 증강을 자동화하는 나만의 도구 (0) | 2025.08.22 |
| [비전 AI] 데이터셋 관리부터 모델 배포까지 'Roboflow' (0) | 2025.08.19 |
| [YOLO] YOLO export failed : pt to onnx 포맷 변환이 안될때 (2) | 2025.08.18 |