🔹 ONNX란?
- ONNX (Open Neural Network Exchange) 는
딥러닝 모델을 위한 범용 교환 포맷(파일 규격) 입니다. - 원래는 Facebook(현 Meta) + Microsoft 가 주도해서 만들었고, 지금은 오픈소스 표준으로 관리돼요.
- 모델을 .onnx 파일로 저장하면, 프레임워크(PyTorch, TensorFlow, MXNet, scikit-learn 등)와 상관없이
공통된 형식으로 불러와서 실행할 수 있어요.
🔹 변환하면 뭐가 좋은가?
모델을 ONNX로 변환하면 여러 장점이 있습니다:
- 프레임워크 독립성
- PyTorch로 학습한 모델을 TensorFlow, C++ 환경, JavaScript, 모바일 등에서 실행할 수 있어요.
- 즉, 학습은 한 프레임워크, 배포는 다른 환경 가능.
- 광범위한 하드웨어 지원
- ONNX Runtime, TensorRT, OpenVINO 같은 런타임이 있어서 CPU, GPU, TPU, NPU 등 다양한 하드웨어에서 최적화된 실행 가능.
- 추론 속도 개선
- PyTorch/TensorFlow 모델 그대로 쓰는 것보다, ONNX Runtime이나 TensorRT로 돌리면 더 빠른 경우가 많아요.
- 특히 배포(Production) 환경에서 속도 향상이 큼.
- 크로스 플랫폼
- PC, 서버, 클라우드, 모바일(Android, iOS), 웹(WebAssembly, ONNX.js) 등 다양한 플랫폼에서 동일 모델 실행.
- 경량화 및 최적화
- 양자화(Quantization), 프루닝(Pruning), 그래프 최적화(Graph Optimization) 같은 기능을 ONNX 툴체인에서 쉽게 적용할 수 있음.
🔹 정리
- ONNX = 모델 교환용 표준 포맷
- 장점 = 이식성, 속도, 최적화, 배포 편리성
- 한마디로, 연구자는 PyTorch로 편하게 학습하고, 엔지니어는 ONNX로 변환해 배포/실행 최적화 하는 흐름이 많습니다.
그러면 ONNX로 변환한 파일만 있으면 다른 환경에서 의존성만 설치하고 파일로만 실행할 수있는거야?
좋은 이해예요 👌 그런데 딱 “ONNX 파일만 있으면 실행 가능하다”는 건 절반만 맞는 말이에요. 자세히 정리해드릴게요.
🔹 ONNX 파일만으로 가능한 것
- ONNX 파일(.onnx) 자체는 모델의 구조(계산 그래프) + 가중치(Weights) 를 모두 포함합니다.
→ 즉, 학습된 모델 파라미터까지 저장돼 있어서 파일만으로 “모델은 완성” 상태예요.
🔹 추가로 필요한 것
다른 환경에서 실행하려면 런타임(Runtime) + 의존성이 필요합니다.
1.ONNX Runtime 설치
pip install onnxruntime
# GPU 버전 (CUDA 11.8 예시)
pip install onnxruntime-gpu==1.18.0
2. ONNX 파일 로드 & 추론 코드
import onnxruntime as ort
import numpy as np
# 세션 생성
session = ort.InferenceSession("model.onnx")
# 입력 이름 확인
input_name = session.get_inputs()[0].name
output_name = session.get_outputs()[0].name
# 더미 입력
x = np.random.rand(1, 3, 224, 224).astype(np.float32)
# 추론 실행
y = session.run([output_name], {input_name: x})
print(y)
3. 입출력 데이터 전처리/후처리 코드
- ONNX 파일은 단순히 계산 그래프 + 가중치이기 때문에,
원래 PyTorch/TensorFlow 코드에서 했던 데이터 전처리 (resize, normalize 등) 와
후처리 (softmax, NMS, thresholding 등) 는 여전히 필요합니다.
🔹 정리
- ONNX 파일만 있으면 모델 자체는 준비 완료.
- 하지만 실행하려면:
- ONNX Runtime (또는 TensorRT/OpenVINO 등) 설치
- 추론 코드 (데이터 로딩 + 전처리 + 후처리) 작성
- 즉, ONNX 파일 = 모델, 런타임 + 코드 = 실행 환경 이라고 보면 됩니다.
그러면 ONNX변환한 파일만 있다면 다른 프로젝트 폴더에서 전처리 -> ONNX 파일 -> 후처리 파이프 라인으로 동일하게 모델을 추론할 수 있겠네?
🔹 파이프라인 구조
ONNX 파일만 있으면, 어떤 프로젝트/폴더/환경에서도 같은 파이프라인으로 추론이 가능합니다.
흐름은 딱 이렇게 됩니다:
- 전처리 (Preprocessing)
- 원본 입력 데이터를 모델이 기대하는 형태로 변환
- 예: resize → normalize → batch 차원 추가
- ONNX 모델 실행 (Inference)
- onnxruntime 같은 런타임으로 .onnx 파일 불러와서 추론
- 프레임워크(PyTorch, TensorFlow 등) 의존성이 필요 없음
- 후처리 (Postprocessing)
- 모델 출력값을 사람이 이해하거나 응용에 맞게 변환
- 예: softmax → argmax → threshold → NMS(비최대 억제)
🔹 장점
- 폴더/환경 독립적: 다른 프로젝트에서도 ONNX 파일만 가져오면 재사용 가능
- 프레임워크 불필요: PyTorch나 TensorFlow를 설치하지 않아도 됨
- 경량화된 배포: 런타임 + ONNX 파일 + 전/후처리 코드만 있으면 끝
import cv2
import numpy as np
import onnxruntime as ort
# === [1] 전처리 ===
img = cv2.imread("cat.jpg")
img = cv2.resize(img, (224, 224))
img = img.astype(np.float32) / 255.0
img = (img - [0.485, 0.456, 0.406]) / [0.229, 0.224, 0.225] # normalize
img = np.transpose(img, (2, 0, 1)) # (HWC → CHW)
img = np.expand_dims(img, axis=0) # 배치 차원
# === [2] ONNX 추론 ===
session = ort.InferenceSession("resnet50.onnx")
input_name = session.get_inputs()[0].name
output_name = session.get_outputs()[0].name
pred = session.run([output_name], {input_name: img})[0]
# === [3] 후처리 ===
pred = np.squeeze(pred) # (1,1000) → (1000,)
cls_id = np.argmax(pred) # 가장 높은 확률 클래스
print("예측 클래스 ID:", cls_id)
오호 pytorch 의존성이 필요없다는 것은 다른 gpu 환경에서도 잘 돌아간다는 거구나
🔹 PyTorch 의존성이 필요 없다는 의미
- ONNX 모델은 PyTorch / TensorFlow 등 훈련 프레임워크와 분리된 독립 포맷이에요.
- 실행은 ONNX Runtime, TensorRT, OpenVINO 같은 런타임 엔진이 맡습니다.
- 그래서 배포 환경에서는 torch, torchvision 같은 무거운 프레임워크 설치가 필요 없어요.
🔹 GPU 환경에서도 잘 돌아가는 이유
1. ONNX Runtime GPU 버전을 설치하면
CUDA/cuDNN 같은 GPU 가속 라이브러리를 직접 활용합니다.
pip install onnxruntime-gpu
2. NVIDIA라면 TensorRT, Intel이라면 OpenVINO, ARM이라면 CoreML / NNAPI 등
환경에 맞는 최적화 런타임을 선택할 수 있어요.
3. 즉, “PyTorch가 설치되어 있어야만 GPU가 쓸 수 있다” → ❌
“CUDA 드라이버 + 런타임만 있으면 GPU에서 바로 쓴다” → ✅
🔹 장점 요약
- 가볍다: 프레임워크 설치 불필요 → 실행환경 단순화
- 이식성: 학습은 RTX 3090에서 했어도, 배포는 Jetson Nano/서버/모바일에서 가능
- 최적화: 런타임 별로 자동 최적화 (그래프 최적화, 연산 fusion 등)
- 범용성: C++, Java, JS, Python 등 언어 제약 없음
👉 정리하면, ONNX로 변환해두면
“학습 프레임워크에 묶이지 않고, 어떤 GPU/CPU 환경에서도 가볍고 빠르게 실행 가능하다”
라는 게 가장 큰 매력입니다 🚀
'AI 활용 소프트웨어 개발 > AI, 머신러닝, 딥러닝' 카테고리의 다른 글
| 머신러닝 / Pipeline / ColumnTransformer / GridSearchCV (0) | 2025.11.18 |
|---|---|
| 백본 특징 추출기, GAP, Attension Pooling , ContrastiveLoss (0) | 2025.09.04 |
| CNN 구조 안에서 커널(kernel), 스트라이드(stride), 채널(channel), MaxPooling, 다운샘플링(downsampling), Fully Connected Layer의 의미, 그리고 실제 계산 (5) | 2025.08.18 |
| Local GPU (Vscode) 환경 설정 및 사용하기 (0) | 2025.08.13 |
| YOLO 하이퍼파라미터 조정하기 (yaml 파일) (3) | 2025.08.11 |