Deep Learning Model Deployment Stack ( ONNX, TensorRT)

유한성·2025년 12월 27일

대학원 과정 동안 딥러닝 연구를 수행하며, 학습된 모델을 .pt, .pth 형태로 저장하고 관리하는 일이 많았다.

주로 연구 환경에서는 GPU와의 높은 호환성을 고려해 PyTorch 기반으로 모델을 학습·실험하는 경우가 많았다.

그러나 최근 기업 채용 공고를 살펴보면, ONNX, TensorRT와 같은 모델 배포 및 추론 최적화 기술에 대한 이해와 실무 경험을 요구하는 경우가 많다는 것을 알 수 있었다. 이에 따라 관련 개념을 간단히 정리하고자 한다.

일반적으로 연구 단계에서는 PyTorch가 널리 사용되지만, 실제 서비스 환경, 특히 edge device나 모바일 환경에서는 Google 생태계와의 호환성을 고려해 TensorFlow 또는 TensorFlow Lite가 사용되는 경우가 많다.

이 과정에서 문제가 되는 점은 PyTorch와 TensorFlow가 서로 다른 연산 그래프 표현 방식과 프레임워크 종속적인 연산자 정의를 사용하기 때문에, PyTorch로 학습한 모델을 TensorFlow 환경에서 그대로 사용하는 것이 어렵다.

항목PyTorchTensorFlow
그래프 방식Dynamic graph (eager)Static graph (GraphDef)
IRTorchScriptGraphDef / SavedModel
Op 정의torch::opstf ops
Custom opC++ / Python extensiontf custom op
Control flowPython 기반graph 기반

이러한 프레임워크 간 비호환성 문제를 해결하기 위해 등장한 표준 모델 교환 포맷이 ONNX이다.

ONNX

ONNX(Open Neural Network Exchange)는 서로 다른 딥러닝 프레임워크 간의 모델 호환성과 이식성을 확보하기 위해 설계된 표준 중간 표현이다.

PyTorch, TensorFlow 등 각 프레임워크는 내부적으로 서로 다른 연산 그래프 표현 방식과 연산자(operator) 정의를 사용하기 때문에, 한 프레임워크에서 학습된 모델을 다른 환경에서 사용할 수 없다. ONNX는 이러한 문제를 해결하기 위해 프레임워크에 독립적인 연산 그래프와 표준화된 연산자 집합을 정의한다.

이를 통해 사용자는 특정 프레임워크에서 학습한 모델을 ONNX 형식으로 변환한 뒤, 다양한 추론 엔진이나 하드웨어 환경(CPU, GPU, edge device)에서 실행할 수 있다.

TensorRT

TensorRT는 NVIDIA GPU 환경에서 딥러닝 모델의 추론 성능을 극대화하기 위해 설계된 고성능 추론 최적화 엔진이다. 주요 목적은 학습된 모델을 실제 서비스 환경에서 더 빠르고, 더 효율적으로 실행하는 데 있다.

TensorRT는 일반적으로 ONNX 형식으로 변환된 모델을 입력으로 받아, 다음과 같은 최적화 과정을 수행한다.

  • 연산 그래프 최적화: 불필요한 연산 제거 및 그래프 단순화

  • Layer Fusion: 연속된 연산을 하나의 커널로 결합하여 메모리 접근 감소

  • 정밀도 축소(Precision Reduction): FP32(일반적인 연구에서 사용) → FP16 또는 INT8 변환을 통한 연산 속도 향상, 하지만 정밀도 축소에 따른 trade-off가 발생

  • 커널 자동 선택(Auto-tuning): GPU 아키텍처에 최적화된 연산 커널 선택

  • 메모리 최적화: GPU 메모리 사용량 감소 및 latency 최소화

이러한 최적화를 통해 TensorRT는 동일한 모델에 대해 PyTorch 또는 TensorFlow의 기본 추론 대비 수 배 이상의 성능 향상을 제공할 수 있으며,
실시간 처리가 요구되는 자율주행, 로보틱스, 영상 분석, 서버 기반 추론 환경에서 널리 활용된다.


그동안 PyTorch 기반으로 모델 학습과 성능 향상에 집중하며 연구를 진행해 왔지만, 실제 배포 단계에서는 프레임워크 간 호환성, 하드웨어 제약, 그리고 메모리 효율성과 정확도 사이의 trade-off를 함께 고려해야 한다는 점이 중요하게 다가왔다.

단순히 연구 환경에서의 computational complexity를 고려하는 것을 넘어서 다양한 제약 조건을 종합적으로 고려한 설계가 요구된다는 것을 느꼈다.

0개의 댓글