너도 할 수 있는, 너도밤나무 코딩

ONNX Runtime GPU 성능 비교: CPU vs CUDA vs TensorRT, 무엇을 선택해야 할까? 본문

인공지능(AI, Artificial Intelligence)/비전 AI(Vision AI)

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 EPTensorRT 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 최적화 팁도 정리해봅니다.

  1. 고정된 입력 shape 사용하기
    • EnableMemPattern 옵션과 그래프 최적화 레벨을 ORT_ENABLE_ALL로 설정하면 효과가 있음 (하지만 미비함)
    • 경험적으로 dynamic shape을 사용하기보다는 고정된 shape로 resize한 후 처리하면 코드의 가독성을 확보 가능
  2. 모델 FP16 변환하기
    • onnxruntime_tools.optimizer_cli --float16 옵션을 활용.
    • 메모리 사용량이 크게 줄고 속도도 빨라짐.
    • 더 작은 구조로 변환한다면 정확도가 현저히 떨어져 fp16이 최선으로 생각함.
  3. cuDNN 알고리즘 탐색 모드
    • 장기 서비스라면 OrtCudnnConvAlgoSearchExhaustive,
    • 빠른 초기화가 필요하면 HEURISTIC 권장.

실무 적용 시 고려할 점

  • GPU 메모리 관리: 큰 모델은 OOM 발생 가능 → gpu_mem_limit 옵션으로 조정.
  • 엔진 캐싱: TensorRT EP를 사용할 경우, 엔진 캐싱을 켜두면 초기화 시간을 단축할 수 있음.
  • 멀티 GPU 서버: AppendExecutionProvider_CUDA(1) 식으로 원하는 GPU를 명시적으로 지정해야 안정적.

결론

ONNX Runtime은 단순히 “CPU에서 모델 돌리기”를 넘어서,
CUDA Execution ProviderTensorRT Execution Provider를 제대로 활용하면 실서비스 수준의 추론 속도를 낼 수 있습니다.

  • 테스트 단계: CUDA EP로 간단히 GPU 가속
  • 배포 단계: TensorRT EP + FP16 변환으로 최대 성능 확보

감사합니다.

ONNX Runtime GPU 성능 비교, ONNX Runtime CUDA Execution Provider, ONNX Runtime TensorRT, 딥러닝 추론 속도 비교, ONNX FP16 최적화
반응형