3

엣지 배포: ONNX, TensorRT 변환 개요

Day 5: 불량 판별 검사 시스템

학습 목표
  • 모델을 엣지 디바이스에 배포하는 전체 흐름을 이해한다
  • ONNX, TensorRT 형식의 장점과 변환 방법을 파악한다
  • 엣지 배포 시 고려사항(속도, 메모리, 정확도)을 이해한다

엣지 배포: 모델을 생산 라인에 올리기

학습은 GPU 서버에서 했지만, 실제 검사는 생산 라인 옆 소형 PC에서 해야 한다. 이를 위해 모델을 최적화하여 엣지 디바이스에 배포한다.


배포 파이프라인

[모델 배포 파이프라인]

PyTorch 모델 (.pth)
      ↓
ONNX 변환 (.onnx)
      ↓
TensorRT 최적화 (.engine)  [NVIDIA GPU가 있을 때]
또는
OpenVINO 최적화 (.xml)     [Intel CPU/VPU]
      ↓
엣지 디바이스에서 추론

ONNX (Open Neural Network Exchange)

[ONNX란?]
다양한 프레임워크 간 모델 호환 표준

PyTorch → ONNX → TensorRT / OpenVINO / CoreML
                        ↓
               어디서든 추론 가능

[변환 코드]
import torch

model = ...  # 학습된 PyTorch 모델
dummy_input = torch.randn(1, 3, 224, 224)

torch.onnx.export(
    model,
    dummy_input,
    "model.onnx",
    opset_version=11,
    input_names=['input'],
    output_names=['output']
)

[YOLO11 ONNX 변환]
from ultralytics import YOLO
model = YOLO('best.pt')
model.export(format='onnx')  # 한 줄!

TensorRT (NVIDIA 최적화)

[TensorRT 가 하는 일]
- 레이어 융합, 커널 자동 선택, 정밀도 변환으로 NVIDIA GPU 에 맞춰 다시 짠다
- FP16/INT8 양자화 지원
- 메모리 사용량 감소

[YOLO11 TensorRT 변환]
model.export(format='engine')          # FP32
model.export(format='engine', half=True)  # FP16

[속도를 적는 법]
얼마나 빨라지는지는 GPU 세대·모델 크기·입력 해상도·배치·전후처리 포함 여부에 따라
크게 달라진다. 그래서 이 자리에 숫자를 적지 않았다. 우리 장비에서 이렇게 잰다.

  같은 이미지 100장을 같은 배치로 돌려 평균 시간을 낸다
  워밍업(첫 10회)을 버린다. TensorRT 는 첫 추론이 특히 느리다
  전처리와 후처리(NMS)를 포함한 시간과 순수 추론 시간을 나누어 적는다
  표에는 GPU 이름·해상도·배치·정밀도를 함께 적는다

  예) RTX 4060 / 640×640 / batch 1 / FP16 : ___ ms (전후처리 포함 ___ ms)

전후처리를 빼고 잰 값을 라인 택트타임 계산에 쓰면 실제보다 빠르게 잡힌다.

엣지 디바이스 선택

디바이스가속기어디에 맞나
NVIDIA Jetson Orin Nano내장 GPU(CUDA)라인 옆 소형 검사기. 전력·발열 제약이 클 때
NVIDIA Jetson AGX Orin내장 GPU(더 큼)카메라 여러 대를 한 대로 받을 때
Intel NUC + OpenVINO내장 GPU / CPUNVIDIA 를 쓸 수 없는 환경
Raspberry Pi 5없음프로토타입, 이미지 수집·전송 정도
산업용 PC + 외장 GPU외장 GPU처리량이 크고 설치 공간이 있을 때

가격과 FPS 를 이 표에 적지 않았다. 가격은 모델(모듈/개발자 키트)·시점·환율·유통에 따라 크게 달라지고, FPS 는 어떤 모델을 어떤 해상도로 돌렸는지를 함께 적지 않으면 뜻이 없다.

장비를 고를 때는 이 순서로 정한다.

1. 택트타임에서 필요한 처리량(fps)을 구한다  ← Day 1 계산식
2. 후보 장비 한 대를 빌리거나 사서 우리 모델을 올려 실제로 잰다
   (전처리·후처리·저장까지 포함한 시간으로 잰다)
3. 여유율을 둔다. 라인은 최악의 순간에 맞춰야 하고, 모델은 앞으로 커진다
4. 그때의 가격을 공식 유통가로 확인해 품의에 적는다

측정 없이 표를 근거로 품의를 올리면 가격도 성능도 맞지 않는다.


양자화: 정확도와 속도의 트레이드오프

[양자화 수준]

                가중치 크기   정확도
FP32 (기본)     1배          기준
FP16 (반정밀)   0.5배        대체로 차이가 작다
INT8 (정수)     0.25배       캘리브레이션 데이터와 모델에 따라 떨어질 수 있다

* 위 정확도 칸에 숫자를 적지 않은 것은 일부러다.
  "INT8 도 99%"처럼 상대값을 적으면 절대 정확도로 읽히고,
  그 숫자는 어떤 모델을 어떤 데이터로 캘리브레이션했는지에 따라 달라진다.

제조 검사에서 판단하는 법:
  FP16 부터 시도한다. 대체로 손실이 작다.
  INT8 은 미세 결함처럼 신호가 작은 대상에서 위험이 크다.
    - 캘리브레이션에 실제 라인 이미지를 충분히 넣는다
    - 변환 전후를 **같은 검증셋으로** 돌려 미검율이 얼마나 달라지는지 잰다
    - 속도를 얻고 미검을 잃는 거래다. 그 거래를 수치로 확인하기 전에는 넘어가지 않는다
AI로 학습하기 — 꿀팁
ONNX·TensorRT 변환 성능 향상 주장 검증AI 학습 팁

ONNX, TensorRT 변환 후 성능 향상 수치는 하드웨어와 모델 구조에 따라 크게 달라지므로, 과장된 주장을 실제 제조 환경 기준으로 검증해야 한다.

제조 엣지 배포를 위한 ONNX와 TensorRT 변환에 대한 다음 주장들을 검증해줘: 1) 'TensorRT 변환만으로 PyTorch 모델 대비 항상 5배 이상 추론 속도가 향상된다', 2) 'ONNX로 변환하면 모든 PyTorch 모델 연산자를 정확히 재현하여 정확도 손실이 없다', 3) 'INT8 양자화를 적용하면 FP32 모델 대비 4배 빠르고 정확도 손실은 1% 미만이다', 4) 'TensorRT 엔진은 한 번 빌드하면 모든 NVIDIA GPU에서 동일하게 동작한다'. NVIDIA Jetson Nano(메모리 4GB)에 EfficientNet-B0 기반 PCB 불량 검사 모델을 배포하는 시나리오에서 각 주장의 실제 기대치와 주의사항을 설명해줘.
이 팁이 도움이 됐나요?
핵심 포인트
  • PyTorch → ONNX → TensorRT/OpenVINO 변환이 표준 배포 파이프라인
  • YOLO11은 model.export()로 ONNX/TensorRT 한 줄 변환
  • TensorRT FP16 은 대체로 손실이 작고 빨라진다. 배수는 우리 장비에서 전후처리까지 포함해 재고 적는다
  • 엣지 장비는 택트타임에서 필요한 처리량을 먼저 구하고, 후보 장비에 우리 모델을 올려 실제로 재서 고른다. 표의 가격과 FPS 로 결정하지 않는다
용어