Q1. 딥러닝 모델을 ONNX, TensorRT 등의 포맷으로 변환해야 하는 이유는 무엇인가요?
A1. 프레임워크와 플랫폼에 제한을 받지 않고 배포하기 위해서Q2. 양자화 기법인 Post-Training Quantization과 Quantization-Aware Training의 차이를 설명해보세요.
A2. 양자화 시의 정보손실을 고려하고 학습하는지의 차이다. PTQ는 간편하고 저렴하지만 성능 하락이 있으며, QAT는 안정적이지만 복잡하고 시간이 필요하다.Q3. 양자화나 모델 경량화 후 실제 서비스에서 성능이 저하되지 않도록 하기 위해 어떤 테스트나 확인 절차가 필요할까요?
A3. 정확도, 지연시간, 용량, 메모리 사용량 등의 정량적 평가 & 엣지 케이스, A/B 테스트 등의 정성적 평가가 필요하다.
A. 개념
B. 핵심 목표: 상호 운용성 (Interoperability)
C. 주요 장점
# 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 모델 변환 완료")
A. 개념
B. 핵심 최적화 기법
C. 작동 방식
| 구분 | ONNX | TensorRT |
|---|---|---|
| 역할 | 모델의 중간 표현 (표준 형식) | 고성능 추론 엔진 및 런타임 |
| 목표 | 프레임워크 간 호환성 | NVIDIA GPU에서의 추론 속도 극대화 |
| 입력 | PyTorch, TF 등 다양한 모델 | ONNX, TF 등 표준 모델 |
| 출력 | .onnx 파일 | 최적화된 Plan 파일 (엔진) |
| 범용성 | 매우 높음 (다양한 하드웨어/플랫폼) | 낮음 (NVIDIA GPU 전용) |
A. 개념 및 프로세스
훈련된 FP32 모델 준비 → 소량의 보정(Calibration) 데이터셋 준비 → 보정 데이터로 모델의 가중치 및 활성화 값 분포 관찰 → 최적의 스케일링 팩터 계산 → 모델 양자화 변환B. Calibration의 역할
C. 장단점
# 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")
A. 개념 및 프로세스
FP32 모델 구조 준비 → 모델에 가짜 양자화(Fake Quantization) 모듈 삽입 → 양자화를 염두에 둔 상태로 훈련 또는 미세조정 진행 → 학습 완료 후 실제 양자화 모델로 변환B. Fake Quantization의 역할
float -> int -> float으로 변환하는 연산을 수행C. 장단점
| 구분 | PTQ (Post-Training Quantization) | QAT (Quantization-Aware Training) |
|---|---|---|
| 적용 시점 | 훈련 완료 후 | 훈련 또는 미세조정 단계 |
| 핵심 원리 | 훈련된 모델을 사후 변환 (보정 기반) | 양자화 오차를 훈련 과정에 반영 |
| 프로세스 | 간단하고 빠름 (Calibration 후 변환) | 복잡하고 오래 걸림 (재훈련 필요) |
| 정확도 | 손실 가능성 상대적으로 높음 | 손실 최소화, 거의 FP32 수준 유지 가능 |
| 필요 데이터 | 소량의 보정 데이터셋 | 전체 훈련 데이터셋 (또는 일부) |
| 적합한 경우 | 빠른 프로토타이핑, 정확도 하락이 적은 모델 | 정확도 유지가 매우 중요한 서비스 모델 |
A. 모델 성능 지표 (Model-level Metrics)
B. 시스템 성능 지표 (System-level Metrics)
| 평가지표 | 원본 모델 (FP32) | 경량화 모델 (INT8) | 변화량 | 합격 여부 |
|---|---|---|---|---|
| Accuracy | 92.5% | 91.8% | -0.7%p | O (허용치 -1%p 이내) |
| Latency (99%ile) | 120 ms | 45 ms | -62.5% | O |
| VRAM 사용량 | 4.2 GB | 1.1 GB | -73.8% | O |
A. 엣지 케이스 및 견고성 테스트 (Robustness Test)
B. A/B 테스트
| 검증 단계 | 주요 확인 항목 | 결과 |
|---|---|---|
| 1. 정량 평가 | 모델/시스템 성능 지표가 목표치에 도달했는가? | PASS |
| 2. 정성 평가 | 다양한 엣지 케이스에서 예측 결과가 안정적인가? | PASS |
| 3. A/B 테스트 | 실제 사용자 트래픽에서 비즈니스 지표 하락이 없는가? | PASS |
| 최종 결론 | 배포 승인 ✅ |
딥러닝 모델을 ONNX나 TensorRT 같은 포맷으로 변환하는 이유는 주로 모델의 호환성과 성능 최적화 때문입니다.
예를 들어, PyTorch로 학습한 모델을 다양한 플랫폼이나 프레임워크에서 사용할 수 있게 하려면 ONNX로 변환하는 것이 좋습니다. ONNX는 프레임워크 독립적인 모델 포맷이기 때문에 TensorFlow, Caffe2, TensorRT 등 다양한 환경에서 동일한 모델을 재활용할 수 있습니다.
또한 TensorRT는 NVIDIA에서 제공하는 고속 추론 엔진으로, ONNX 모델을 입력으로 받아 GPU 상에서 연산을 최적화해줍니다. 이를 통해 추론 속도가 개선되고, 지연 시간(latency)도 줄어들며, 배포 효율성이 높아집니다.
결국 모델 변환은 모델을 실제 서비스 환경에 적합하게 만들기 위한 전처리 단계로, 성능 최적화와 범용 활용성을 동시에 확보하는 전략이라고 볼 수 있습니다.
Post-Training Quantization(PTQ)과 Quantization-Aware Training(QAT)은 모두 모델을 경량화하고 추론 속도를 높이기 위한 양자화 방법이지만, 적용 시점과 방식에서 큰 차이가 있습니다.
PTQ는 학습이 완료된 모델에 대해 사후적으로 양자화를 적용하는 방식입니다. 보통 float32 정밀도를 int8 등의 낮은 정밀도로 변환하며, 추가 학습 없이 빠르게 적용할 수 있다는 장점이 있지만, 정밀도가 떨어질 경우 성능 저하가 생길 수 있습니다.
반면 QAT는 훈련 단계에서부터 양자화를 고려해서 모델을 학습합니다. 이 방식은 정밀도 손실을 줄이기 위해 가중치와 연산을 양자화된 상태로 시뮬레이션하면서 학습을 진행하므로, 일반적으로 PTQ보다 높은 정확도를 유지할 수 있습니다.
즉, PTQ는 간편하지만 성능 저하 가능성이 있고, QAT는 복잡하지만 정확도 유지에 더 유리한 방법입니다.
모델을 양자화하거나 경량화한 후에는, 실제 서비스에 투입했을 때 원래 모델 대비 성능이 유지되는지를 꼭 확인해야 합니다. 이 과정을 거치지 않으면, 추론 속도는 빨라졌지만 정확도가 크게 떨어지는 문제가 생길 수 있기 때문입니다.
가장 기본적인 검증 절차는 원본 모델과 최적화된 모델의 정확도나 정밀도 같은 평가 지표를 동일한 테스트 데이터셋으로 비교하는 것입니다. 예를 들어, 양자화 모델의 Top-1 accuracy가 원본 모델에 비해 몇 퍼센트 포인트 떨어졌는지 확인하고, 허용 가능한 오차 범위 내인지 판단합니다.
또한 실제 서비스 환경과 유사한 조건에서 추론 속도, 메모리 사용량, GPU 활용률 등을 벤치마크 도구나 프로파일링 툴을 통해 측정합니다. 예를 들어 TensorRT를 적용했다면 trtexec 같은 도구를 이용해서 FPS나 latency를 측정할 수 있습니다.
추가로, 서비스 사용자에게 영향을 줄 수 있는 부분을 검증하기 위해 A/B 테스트나 shadow testing을 통해 실제 트래픽을 흘려보며 성능 저하나 예외 상황이 없는지도 관찰합니다.
이렇게 정확도, 처리 속도, 시스템 자원 사용, 실제 사용자 경험 등을 종합적으로 검증함으로써, 모델 최적화 후에도 안정적이고 신뢰할 수 있는 서비스를 제공할 수 있습니다.