AI 활용 소프트웨어 개발/AI, 머신러닝, 딥러닝

ONNX (Open Neural Network Exchange)

ha2yong 2025. 9. 15. 22:48

🔹 ONNX란?

  • ONNX (Open Neural Network Exchange)
    딥러닝 모델을 위한 범용 교환 포맷(파일 규격) 입니다.
  • 원래는 Facebook(현 Meta) + Microsoft 가 주도해서 만들었고, 지금은 오픈소스 표준으로 관리돼요.
  • 모델을 .onnx 파일로 저장하면, 프레임워크(PyTorch, TensorFlow, MXNet, scikit-learn 등)와 상관없이
    공통된 형식으로 불러와서 실행할 수 있어요.

🔹 변환하면 뭐가 좋은가?

모델을 ONNX로 변환하면 여러 장점이 있습니다:

  1. 프레임워크 독립성
    • PyTorch로 학습한 모델을 TensorFlow, C++ 환경, JavaScript, 모바일 등에서 실행할 수 있어요.
    • 즉, 학습은 한 프레임워크, 배포는 다른 환경 가능.
  2. 광범위한 하드웨어 지원
    • ONNX Runtime, TensorRT, OpenVINO 같은 런타임이 있어서 CPU, GPU, TPU, NPU 등 다양한 하드웨어에서 최적화된 실행 가능.
  3. 추론 속도 개선
    • PyTorch/TensorFlow 모델 그대로 쓰는 것보다, ONNX Runtime이나 TensorRT로 돌리면 더 빠른 경우가 많아요.
    • 특히 배포(Production) 환경에서 속도 향상이 큼.
  4. 크로스 플랫폼
    • PC, 서버, 클라우드, 모바일(Android, iOS), 웹(WebAssembly, ONNX.js) 등 다양한 플랫폼에서 동일 모델 실행.
  5. 경량화 및 최적화
    • 양자화(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 파일만 있으면 모델 자체는 준비 완료.
  • 하지만 실행하려면:
    1. ONNX Runtime (또는 TensorRT/OpenVINO 등) 설치
    2. 추론 코드 (데이터 로딩 + 전처리 + 후처리) 작성
  • 즉, ONNX 파일 = 모델, 런타임 + 코드 = 실행 환경 이라고 보면 됩니다.

 

그러면 ONNX변환한 파일만 있다면 다른 프로젝트 폴더에서 전처리 -> ONNX 파일 -> 후처리 파이프 라인으로 동일하게 모델을 추론할 수 있겠네?

🔹 파이프라인 구조

ONNX 파일만 있으면, 어떤 프로젝트/폴더/환경에서도 같은 파이프라인으로 추론이 가능합니다.

흐름은 딱 이렇게 됩니다:

  1. 전처리 (Preprocessing)
    • 원본 입력 데이터를 모델이 기대하는 형태로 변환
    • 예: resize → normalize → batch 차원 추가
  2. ONNX 모델 실행 (Inference)
    • onnxruntime 같은 런타임으로 .onnx 파일 불러와서 추론
    • 프레임워크(PyTorch, TensorFlow 등) 의존성이 필요 없음
  3. 후처리 (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 환경에서도 가볍고 빠르게 실행 가능하다”
라는 게 가장 큰 매력입니다 🚀