1TensorRT란?
TensorRT는 NVIDIA가 개발한 고성능 딥러닝 추론 최적화 SDK입니다. PyTorch, TensorFlow 등으로 학습된 모델을 NVIDIA GPU에서 최대 성능으로 실행할 수 있도록 최적화합니다.
TensorRT Optimization Workflow
PyTorch Model
▼
Training Complete
→
ONNX Export
▼
Standard Format
→
TensorRT Engine
▼
Layer Fusion
FP16/INT8
Kernel Auto-tuning
FP16/INT8
Kernel Auto-tuning
Performance Boost: 2-10x faster than PyTorch on NVIDIA GPU
TensorRT의 핵심 가치: 동일 모델, 동일 GPU에서 PyTorch 대비 2-10배 빠른 추론 속도
2TensorRT 최적화 기법
레이어 퓨전
Conv + BatchNorm + ReLU를 하나의 커널로 융합
정밀도 캘리브레이션
FP32 → FP16 → INT8 변환으로 연산량 감소
커널 오토 튜닝
타겟 GPU에 최적화된 CUDA 커널 자동 선택
동적 텐서 메모리
추론 중 텐서 메모리 재사용으로 효율 극대화
3ONNX to TensorRT 변환
import tensorrt as trt
class TensorRTConverter:
def __init__(self, precision="fp16", workspace_gb=4):
self.precision = precision
self.workspace_size = workspace_gb * (1 << 30)
self.logger = trt.Logger(trt.Logger.WARNING)
def build_engine(self, onnx_path, engine_path):
"""ONNX → TensorRT Engine 변환"""
builder = trt.Builder(self.logger)
network = builder.create_network(
1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)
)
parser = trt.OnnxParser(network, self.logger)
# ONNX 모델 파싱
with open(onnx_path, 'rb') as f:
parser.parse(f.read())
# 빌드 설정
config = builder.create_builder_config()
config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, self.workspace_size)
# 정밀도 설정
if self.precision == "fp16":
config.set_flag(trt.BuilderFlag.FP16)
elif self.precision == "int8":
config.set_flag(trt.BuilderFlag.INT8)
config.int8_calibrator = self._create_calibrator()
# 엔진 빌드
engine = builder.build_serialized_network(network, config)
with open(engine_path, 'wb') as f:
f.write(engine)
return engine_path
4INT8 캘리브레이션
INT8 양자화는 캘리브레이션 데이터셋을 사용하여 최적의 양자화 스케일을 결정합니다:
class INT8Calibrator(trt.IInt8EntropyCalibrator2):
def __init__(self, calibration_images, batch_size=8):
super().__init__()
self.images = calibration_images # 제조 현장 샘플
self.batch_size = batch_size
self.current_index = 0
def get_batch(self, names):
"""캘리브레이션 배치 데이터 제공"""
if self.current_index + self.batch_size > len(self.images):
return None
batch = self.images[self.current_index:self.current_index + self.batch_size]
self.current_index += self.batch_size
return [batch]
FP32
기준 (100%)
FP16
~2x 빠름
INT8
~4x 빠름
5TensorRT 추론 엔진
class TensorRTInference:
def __init__(self, engine_path):
self.logger = trt.Logger(trt.Logger.WARNING)
self.runtime = trt.Runtime(self.logger)
with open(engine_path, 'rb') as f:
self.engine = self.runtime.deserialize_cuda_engine(f.read())
self.context = self.engine.create_execution_context()
self._allocate_buffers()
def infer(self, input_data):
"""동기 추론 실행"""
# 입력 → GPU → 추론 → 출력
np.copyto(self.inputs[0]['host'], input_data.ravel())
cuda.memcpy_htod_async(self.inputs[0]['device'], self.inputs[0]['host'], self.stream)
self.context.execute_async_v2(bindings=self.bindings, stream_handle=self.stream.handle)
cuda.memcpy_dtoh_async(self.outputs[0]['host'], self.outputs[0]['device'], self.stream)
self.stream.synchronize()
return self.outputs[0]['host']
6성능 벤치마크
YOLOv8n
결함 검출
2.1ms
INT8 추론
476 FPS
처리량
6.8x
PyTorch 대비
TensorRT INT8은 제조 비전 AI의 표준입니다. 다음 장에서는 플랫폼 독립적인 ONNX Runtime을 학습합니다.