위클리페이퍼(15) ONNX, TensorRT, 양자화(Post-Training Quantization, Quantization-Aware Training)

윤승호·2025년 8월 18일

◆ Q & A 요약

Q1. 딥러닝 모델을 ONNX, TensorRT 등의 포맷으로 변환해야 하는 이유는 무엇인가요?
A1. 프레임워크와 플랫폼에 제한을 받지 않고 배포하기 위해서

Q2. 양자화 기법인 Post-Training Quantization과 Quantization-Aware Training의 차이를 설명해보세요.
A2. 양자화 시의 정보손실을 고려하고 학습하는지의 차이다. PTQ는 간편하고 저렴하지만 성능 하락이 있으며, QAT는 안정적이지만 복잡하고 시간이 필요하다.

Q3. 양자화나 모델 경량화 후 실제 서비스에서 성능이 저하되지 않도록 하기 위해 어떤 테스트나 확인 절차가 필요할까요?
A3. 정확도, 지연시간, 용량, 메모리 사용량 등의 정량적 평가 & 엣지 케이스, A/B 테스트 등의 정성적 평가가 필요하다.


1. 딥러닝 모델을 ONNX, TensorRT 등의 포맷으로 변환해야 하는 이유는 무엇인가요?

(1) ONNX?

A. 개념

  • Open Neural Network Exchange의 약자
  • 딥러닝 모델을 표현하는 개방형 표준 포맷
  • 특정 프레임워크에 종속되지 않는 중간 표현(Intermediate Representation, IR) 역할 수행

B. 핵심 목표: 상호 운용성 (Interoperability)

  • PyTorch, TensorFlow, Keras 등 다양한 프레임워크에서 훈련된 모델을 ONNX 포맷으로 변환
  • 변환된 ONNX 모델을 Caffe2, MXNet, TensorRT 등 다른 프레임워크나 추론 엔진에서 사용 가능하게 함
  • 한 번의 모델 개발로 여러 플랫폼에 쉽게 배포하는 'Create once, run anywhere'를 지향

C. 주요 장점

  • 프레임워크 독립성: 특정 딥러닝 프레임워크의 업데이트나 정책 변경에 자유로워짐
  • 하드웨어 가속 활용: 다양한 하드웨어(CPU, GPU, DPU, NPU 등) 가속 라이브러리가 ONNX를 표준 입력으로 지원하는 경우가 많음
  • 거대한 생태계: ONNX를 중심으로 모델 시각화, 디버깅, 최적화를 위한 다양한 툴이 존재
# PyTorch 모델을 ONNX로 변환하는 예시
import torch
import torchvision

# 1. 미리 훈련된 모델 불러오기
model = torchvision.models.resnet18(pretrained=True)
model.eval() # 추론 모드로 설정

# 2. 모델 입력에 대한 더미 데이터 생성
# (batch_size, channels, height, width)
dummy_input = torch.randn(1, 3, 224, 224)

# 3. ONNX로 변환
torch.onnx.export(model,               # 실행될 모델
                  dummy_input,         # 모델 입력값
                  "resnet18.onnx",     # 저장될 ONNX 파일명
                  export_params=True,  # 모델 파라미터 저장 여부
                  opset_version=11,    # ONNX 버전
                  input_names = ['input'],   # 입력 텐서 이름
                  output_names = ['output']) # 출력 텐서 이름

print("ONNX 모델 변환 완료")

(2) TensorRT

A. 개념

  • NVIDIA에서 제공하는 고성능 딥러닝 추론(Inference)을 위한 SDK
  • 학습된 모델을 입력받아, NVIDIA GPU (Tesla, Jetson 등)에 최적화된 추론 엔진을 생성

B. 핵심 최적화 기법

  • 정밀도 보정 (Precision Calibration): 모델 성능 저하를 최소화하면서 FP32 연산을 FP16이나 INT8로 변환하여 속도 향상 및 메모리 사용량 감소
  • 레이어 & 텐서 융합 (Layer & Tensor Fusion): 여러 개의 레이어를 하나의 레이어로, 또는 여러 텐서 연산을 하나의 커널로 통합하여 GPU 커널 실행 오버헤드를 줄임
  • 커널 자동 튜닝 (Kernel Auto-Tuning): 타겟 GPU 아키텍처에 가장 효율적인 CUDA 커널을 찾아 자동으로 선택
  • 동적 텐서 메모리 (Dynamic Tensor Memory): 추론 시 텐서에 필요한 메모리만 할당하고 재사용하여 메모리 점유율을 최소화

C. 작동 방식

  • 1단계 (Parser): ONNX, TensorFlow 등의 모델 파일을 파싱하여 TensorRT 네트워크로 변환
  • 2단계 (Optimizer & Builder): 위에서 설명한 다양한 최적화 기법을 적용하여 타겟 GPU에 맞는 플랜(Plan) 파일, 즉 실행 가능한 엔진을 빌드
  • 3단계 (Runtime): 생성된 엔진을 실행하여 실제 추론을 초고속으로 수행
구분ONNXTensorRT
역할모델의 중간 표현 (표준 형식)고성능 추론 엔진 및 런타임
목표프레임워크 간 호환성NVIDIA GPU에서의 추론 속도 극대화
입력PyTorch, TF 등 다양한 모델ONNX, TF 등 표준 모델
출력.onnx 파일최적화된 Plan 파일 (엔진)
범용성매우 높음 (다양한 하드웨어/플랫폼)낮음 (NVIDIA GPU 전용)

2. 양자화 기법인 Post-Training Quantization과 Quantization-Aware Training의 차이를 설명해보세요.

(1) PTQ (Post-Training Quantization)

A. 개념 및 프로세스

  • 이미 훈련이 완료된 FP32 모델을 INT8 등 저정밀도 모델로 변환하는 기법
  • 프로세스: 훈련된 FP32 모델 준비소량의 보정(Calibration) 데이터셋 준비보정 데이터로 모델의 가중치 및 활성화 값 분포 관찰최적의 스케일링 팩터 계산모델 양자화 변환

B. Calibration의 역할

  • 모델에 실제 데이터와 유사한 분포의 데이터를 흘려보내면서 각 레이어의 가중치(weights)와 활성화(activations) 값의 최솟값, 최댓값을 기록
  • 이 범위를 바탕으로 FP32 값을 INT8로 매핑할 때 정보 손실을 최소화하는 변환 계수(Scale factor)와 제로 포인트(Zero point)를 결정
  • 좋은 보정 데이터셋을 사용하는 것이 양자화 후 정확도 유지에 매우 중요

C. 장단점

  • 장점: 적용이 매우 간단하고 빠름, 재훈련이 필요 없어 시간과 리소스 절약 가능
  • 단점: 모델이 양자화를 고려하지 않고 학습되었기 때문에 정확도 손실이 발생할 수 있음, 특히 MobileNet, EfficientNet 등 이미 경량화된 모델에서 성능 하락이 두드러질 수 있음
# PyTorch 동적 PTQ 예시 (가장 간단한 형태)
import torch
from torch.quantization import quantize_dynamic

# 1. 미리 훈련된 모델 불러오기 (예: LSTM)
model_fp32 = torch.nn.LSTM(input_size=10, hidden_size=20)
model_fp32.eval()

# 2. 동적 양자화 적용 (주로 RNN, Transformer 계열에 사용)
# 가중치는 미리 양자화, 활성화 값은 실행 시점에 동적으로 양자화
model_quantized = quantize_dynamic(
    model_fp32,         # 원본 32비트 모델
    {torch.nn.LSTM},    # 양자화할 레이어 타입 지정
    dtype=torch.qint8)  # 타겟 데이터 타입

# 3. 모델 크기 비교
def print_model_size(model, label):
    torch.save(model.state_dict(), "temp.p")
    size = torch.os.path.getsize("temp.p")/1e6
    print(f"{label} Model size: {size:.2f} MB")
    torch.os.remove("temp.p")

print_model_size(model_fp32, "FP32")
print_model_size(model_quantized, "Quantized")

(2) QAT (Quantization-Aware Training)

A. 개념 및 프로세스

  • 훈련(또는 Fine-tuning) 과정에 양자화로 인한 오차를 미리 시뮬레이션하여 모델이 이에 적응하도록 학습시키는 기법
  • 프로세스: FP32 모델 구조 준비모델에 가짜 양자화(Fake Quantization) 모듈 삽입양자화를 염두에 둔 상태로 훈련 또는 미세조정 진행학습 완료 후 실제 양자화 모델로 변환

B. Fake Quantization의 역할

  • 훈련의 순전파(Forward pass) 과정에서 가중치와 활성화 값을 float -> int -> float으로 변환하는 연산을 수행
  • 이는 양자화 시 발생할 정보 손실을 미리 흉내 내는 것과 같음
  • 모델은 이 '가짜' 양자화 노이즈가 있는 상태에서도 정답을 잘 맞히도록 학습 방향을 조정
  • 역전파(Backward pass) 시에는 실제 그래디언트(gradient)를 그대로 흘려보내 안정적인 학습을 보장

C. 장단점

  • 장점: PTQ에 비해 월등히 높은 정확도를 보존할 수 있음, 모델이 양자화에 매우 견고해짐
  • 단점: 재훈련 또는 미세조정 과정이 필요하여 복잡하고 시간이 오래 걸림, 하이퍼파라미터 튜닝 등 추가적인 노력이 필요
구분PTQ (Post-Training Quantization)QAT (Quantization-Aware Training)
적용 시점훈련 완료 후훈련 또는 미세조정 단계
핵심 원리훈련된 모델을 사후 변환 (보정 기반)양자화 오차를 훈련 과정에 반영
프로세스간단하고 빠름 (Calibration 후 변환)복잡하고 오래 걸림 (재훈련 필요)
정확도손실 가능성 상대적으로 높음손실 최소화, 거의 FP32 수준 유지 가능
필요 데이터소량의 보정 데이터셋전체 훈련 데이터셋 (또는 일부)
적합한 경우빠른 프로토타이핑, 정확도 하락이 적은 모델정확도 유지가 매우 중요한 서비스 모델

3. 양자화나 모델 경량화 후 실제 서비스에서 성능이 저하되지 않도록 하기 위해 어떤 테스트나 확인 절차가 필요할까요?

(1) 정량적 성능 평가

A. 모델 성능 지표 (Model-level Metrics)

  • 분류(Classification): 정확도(Accuracy), 정밀도(Precision), 재현율(Recall), F1-Score, Confusion Matrix, 각 클래스별 성능 비교
  • 객체 탐지(Object Detection): mAP (mean Average Precision), IoU (Intersection over Union)
  • 자연어(NLP): BLEU, ROUGE (번역/요약), Perplexity (언어 모델)
  • 원본 모델과 경량화 모델의 지표를 동일한 테스트셋 기준으로 비교하여 성능 하락의 폭과 양상을 구체적으로 분석

B. 시스템 성능 지표 (System-level Metrics)

  • 지연 시간 (Latency): 단일 요청에 대한 응답 시간 (ms 단위), 응답 시간의 분포(평균, 95%, 99%ile) 확인이 중요
  • 처리량 (Throughput): 초당 처리 가능한 요청 수 (RPS, QPS)
  • 리소스 사용량: CPU/GPU 점유율, 메모리(RAM, VRAM) 사용량, 전력 소모량
  • 경량화의 목표였던 속도, 리소스 효율성이 실제로 달성되었는지 수치로 증명
평가지표원본 모델 (FP32)경량화 모델 (INT8)변화량합격 여부
Accuracy92.5%91.8%-0.7%pO (허용치 -1%p 이내)
Latency (99%ile)120 ms45 ms-62.5%O
VRAM 사용량4.2 GB1.1 GB-73.8%O

(2) 정성적 평가 및 실전 테스트

A. 엣지 케이스 및 견고성 테스트 (Robustness Test)

  • 일반적인 테스트셋에서는 드러나지 않는 문제점을 찾는 과정
  • 어둡거나, 노이즈가 많거나, 각도가 틀어진 이미지, 오타가 포함된 문장 등 비정형적인 입력값에 대한 모델의 반응을 확인
  • 특정 입력에 대해 경량화 모델이 유독 치명적인 오류를 일으키지 않는지 수동으로 검증하는 과정도 포함

B. A/B 테스트

  • 실제 서비스 환경에서 신구 모델의 성능을 직접 비교하는 최종 관문
  • 일부 사용자 트래픽을 경량화 모델(B그룹)로 보내고, 나머지(A그룹)는 기존 모델을 사용하도록 설정
  • 모델의 예측 정확도뿐만 아니라, 예측 결과가 비즈니스 지표(예: 클릭률, 구매 전환율, 사용자 만족도)에 미치는 영향을 종합적으로 판단
  • A/B 테스트를 통해 경량화 모델이 실제 서비스에서도 문제가 없다는 확신을 얻은 후 전면 배포
검증 단계주요 확인 항목결과
1. 정량 평가모델/시스템 성능 지표가 목표치에 도달했는가?PASS
2. 정성 평가다양한 엣지 케이스에서 예측 결과가 안정적인가?PASS
3. A/B 테스트실제 사용자 트래픽에서 비즈니스 지표 하락이 없는가?PASS
최종 결론배포 승인 ✅


◆ 해설

1. 딥러닝 모델을 ONNX, TensorRT 등의 포맷으로 변환해야 하는 이유는 무엇인가요?

딥러닝 모델을 ONNX나 TensorRT 같은 포맷으로 변환하는 이유는 주로 모델의 호환성과 성능 최적화 때문입니다.

예를 들어, PyTorch로 학습한 모델을 다양한 플랫폼이나 프레임워크에서 사용할 수 있게 하려면 ONNX로 변환하는 것이 좋습니다. ONNX는 프레임워크 독립적인 모델 포맷이기 때문에 TensorFlow, Caffe2, TensorRT 등 다양한 환경에서 동일한 모델을 재활용할 수 있습니다.

또한 TensorRT는 NVIDIA에서 제공하는 고속 추론 엔진으로, ONNX 모델을 입력으로 받아 GPU 상에서 연산을 최적화해줍니다. 이를 통해 추론 속도가 개선되고, 지연 시간(latency)도 줄어들며, 배포 효율성이 높아집니다.

결국 모델 변환은 모델을 실제 서비스 환경에 적합하게 만들기 위한 전처리 단계로, 성능 최적화와 범용 활용성을 동시에 확보하는 전략이라고 볼 수 있습니다.


2. 양자화 기법인 Post-Training Quantization과 Quantization-Aware Training의 차이를 설명해보세요.

Post-Training Quantization(PTQ)과 Quantization-Aware Training(QAT)은 모두 모델을 경량화하고 추론 속도를 높이기 위한 양자화 방법이지만, 적용 시점과 방식에서 큰 차이가 있습니다.

PTQ는 학습이 완료된 모델에 대해 사후적으로 양자화를 적용하는 방식입니다. 보통 float32 정밀도를 int8 등의 낮은 정밀도로 변환하며, 추가 학습 없이 빠르게 적용할 수 있다는 장점이 있지만, 정밀도가 떨어질 경우 성능 저하가 생길 수 있습니다.

반면 QAT는 훈련 단계에서부터 양자화를 고려해서 모델을 학습합니다. 이 방식은 정밀도 손실을 줄이기 위해 가중치와 연산을 양자화된 상태로 시뮬레이션하면서 학습을 진행하므로, 일반적으로 PTQ보다 높은 정확도를 유지할 수 있습니다.

즉, PTQ는 간편하지만 성능 저하 가능성이 있고, QAT는 복잡하지만 정확도 유지에 더 유리한 방법입니다.


3. 양자화나 모델 경량화 후 실제 서비스에서 성능이 저하되지 않도록 하기 위해 어떤 테스트나 확인 절차가 필요할까요?

모델을 양자화하거나 경량화한 후에는, 실제 서비스에 투입했을 때 원래 모델 대비 성능이 유지되는지를 꼭 확인해야 합니다. 이 과정을 거치지 않으면, 추론 속도는 빨라졌지만 정확도가 크게 떨어지는 문제가 생길 수 있기 때문입니다.

가장 기본적인 검증 절차는 원본 모델과 최적화된 모델의 정확도나 정밀도 같은 평가 지표를 동일한 테스트 데이터셋으로 비교하는 것입니다. 예를 들어, 양자화 모델의 Top-1 accuracy가 원본 모델에 비해 몇 퍼센트 포인트 떨어졌는지 확인하고, 허용 가능한 오차 범위 내인지 판단합니다.

또한 실제 서비스 환경과 유사한 조건에서 추론 속도, 메모리 사용량, GPU 활용률 등을 벤치마크 도구나 프로파일링 툴을 통해 측정합니다. 예를 들어 TensorRT를 적용했다면 trtexec 같은 도구를 이용해서 FPS나 latency를 측정할 수 있습니다.

추가로, 서비스 사용자에게 영향을 줄 수 있는 부분을 검증하기 위해 A/B 테스트나 shadow testing을 통해 실제 트래픽을 흘려보며 성능 저하나 예외 상황이 없는지도 관찰합니다.

이렇게 정확도, 처리 속도, 시스템 자원 사용, 실제 사용자 경험 등을 종합적으로 검증함으로써, 모델 최적화 후에도 안정적이고 신뢰할 수 있는 서비스를 제공할 수 있습니다.

profile
나는 AI 엔지니어가 된다.

0개의 댓글