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
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을 학습합니다.