ONNX / TensorRT 변환
PyTorch 모델을 ONNX(Open Neural Network Exchange) 형식으로 내보내고, NVIDIA TensorRT로 최적화하여 추론 속도를 극대화하는 과정을 실습합니다.import torch
import timm
# 모델 준비
model = timm.create_model('efficientnet_b0', pretrained=True, num_classes=5)
model.eval()
# 더미 입력
dummy_input = torch.randn(1, 3, 224, 224)
# ONNX Export
torch.onnx.export(
model,
dummy_input,
'model.onnx',
input_names=['input'],
output_names=['output'],
dynamic_axes={
'input': {0: 'batch_size'},
'output': {0: 'batch_size'},
},
opset_version=17,
)
print("ONNX 내보내기 완료")
import onnx
import onnxruntime as ort
import numpy as np
# ONNX 모델 검증
onnx_model = onnx.load('model.onnx')
onnx.checker.check_model(onnx_model)
print("모델 검증 통과")
# ONNX Runtime 추론
session = ort.InferenceSession('model.onnx', providers=['CUDAExecutionProvider'])
input_data = np.random.randn(1, 3, 224, 224).astype(np.float32)
outputs = session.run(None, {'input': input_data})
print(f"출력 형태: {outputs[0].shape}")
from ultralytics import YOLO
model = YOLO('best.pt')
# ONNX Export
model.export(format='onnx', imgsz=640, simplify=True)
# TensorRT Export (NVIDIA GPU 필요)
model.export(format='engine', imgsz=640, half=True) # FP16
# trtexec CLI 사용 (NVIDIA TensorRT 설치 필요)
# FP16 최적화
# trtexec --onnx=model.onnx --saveEngine=model.engine --fp16
# INT8 최적화 (캘리브레이션 필요)
# trtexec --onnx=model.onnx --saveEngine=model_int8.engine --int8
# --calib=calibration_data/
import time
def benchmark_latency(session, input_data, n_runs=100):
"""추론 지연시간을 벤치마크합니다."""
# 워밍업
for _ in range(10):
session.run(None, {'input': input_data})
# 측정
start = time.perf_counter()
for _ in range(n_runs):
session.run(None, {'input': input_data})
elapsed = (time.perf_counter() - start) / n_runs * 1000
print(f"평균 지연시간: {elapsed:.2f} ms ({1000/elapsed:.1f} FPS)")
input_data = np.random.randn(1, 3, 224, 224).astype(np.float32)
benchmark_latency(session, input_data)
최적화 파이프라인
런타임 비교
| 런타임 | 대상 하드웨어 | 속도 | 설치 난이도 |
|---|---|---|---|
| PyTorch | GPU/CPU | 기준 | 낮음 |
| ONNX Runtime | GPU/CPU | 1.5~2x | 낮음 |
| TensorRT | NVIDIA GPU | 3~5x | 중간 |
| OpenVINO | Intel CPU | 2~3x | 중간 |
ONNX 변환 시 지원되지 않는 연산이 있으면?
ONNX 변환 시 지원되지 않는 연산이 있으면?
opset_version을 높이거나(17 이상), 커스텀 연산을 ONNX 호환 연산으로 교체하세요. torch.onnx.export에서 verbose=True로 변환 과정을 확인할 수 있습니다.TensorRT와 ONNX Runtime 중 어떤 것을 선택하나요?
TensorRT와 ONNX Runtime 중 어떤 것을 선택하나요?
NVIDIA GPU가 있으면 TensorRT가 가장 빠릅니다. 다양한 하드웨어를 지원해야 하거나 설치가 간편해야 하면 ONNX Runtime을 선택하세요.

