Deep Learning study

딥러닝 모델 배포: TorchScript vs ONNX 비교 본문

AI/Pytorch

딥러닝 모델 배포: TorchScript vs ONNX 비교

illinaire 2025. 4. 17. 21:47
반응형
딥러닝 모델 배포: TorchScript vs ONNX 비교

딥러닝 모델 배포: TorchScript vs ONNX 비교

포스트 요약: PyTorch 모델을 프로덕션 환경에 배포하기 위해 자주 사용하는 TorchScriptONNX 포맷의 원리, 워크플로우, 장단점을 깊이 있게 분석합니다. 코드 예제와 실전 팁을 통해 배포 파이프라인을 구축하는 방법을 단계별로 소개합니다.


1. 배포의 필요성과 요구사항

연구 단계에서 개발한 PyTorch 모델을 프로덕션(서버, 모바일, 엣지) 환경에 안정적으로 배포하려면 다음 요구사항을 충족해야 합니다:

  • 런타임 언어 독립성 (C++, Java, Python 외 환경 지원)
  • 최적화된 성능 (저지연·높은 처리량)
  • 버전·플랫폼 간 호환성 유지
  • 보안·검증 기능 (static graph로 분석·검증 가능)

이러한 요구를 해결하는 대표적 솔루션이 TorchScriptONNX입니다.


2. TorchScript 심층 분석

2.1 개념 및 아키텍처

TorchScript는 PyTorch 모델을 static graph 형태로 변환해 C++ 런타임(Libtorch)에서 직접 실행하도록 지원합니다. 두 가지 변환 방식이 있습니다:

  1. Tracing: 실제 입력을 전달하며 실행 경로를 기록→ 그래프 생성
  2. Scripting: 모델의 Python AST를 직접 컴파일→ 조건문·반복문 등 제어 흐름 보존

2.2 Tracing vs Scripting 비교

특징TracingScripting
제어 흐름고정된 실행 경로if/for 등 동적 지원
변환 완전성간단·빠름복잡 모델 완벽 지원
추천 사용처단순·피드포워드 모델RNN, 조건문 포함 모델

2.3 TorchScript 예제

import torch

class MyModel(torch.nn.Module):
    def __init__(self): super().__init__(); self.fc = torch.nn.Linear(10,10)
    def forward(self, x):
        if x.sum() > 0: x = x * 2
        return self.fc(x)

model = MyModel()
# 1) Scripting
scripted = torch.jit.script(model)
scripted.save("model_scripted.pt")

# 2) Tracing
example = torch.randn(1,10)
traced = torch.jit.trace(model, example)
traced.save("model_traced.pt")

2.4 장단점

  • ✔️ Python 런타임 의존성 제거 → 경량 C++ 서버 배포
  • ✔️ 디버깅용 IR(graph) 시각화 가능
  • ❌ Tracing은 제어 흐름 누락 위험
  • ❌ 모델 크기 증가 가능성 (serialized graph 포함)

3. ONNX(Open Neural Network Exchange) 심층 분석

3.1 개념 및 생태계

ONNX는 다양한 프레임워크 간 모델 교환을 위한 표준 포맷입니다. PyTorch, TensorFlow, MXNet 등에서 내보내고, ONNX Runtime, TensorRT, OpenVINO 등에서 로드해 실행할 수 있습니다.

3.2 PyTorch→ONNX 변환

import torch

model.eval()
dummy = torch.randn(1,3,224,224)
torch.onnx.export(
    model, dummy, "model.onnx",
    input_names=["input"], output_names=["output"],
    opset_version=13, do_constant_folding=True
)

opset_version에 따라 지원하는 연산 세트가 달라지며, do_constant_folding으로 그래프 최적화를 수행합니다.

3.3 ONNX Runtime 예시

import onnxruntime as ort
import numpy as np

sess = ort.InferenceSession("model.onnx")
inp = np.random.randn(1,3,224,224).astype(np.float32)
out = sess.run(None, {"input": inp})
print(out[0].shape)

3.4 장단점

  • ✔️ 다양한 백엔드 지원 (TensorRT, OpenVINO 등)
  • ✔️ 프레임워크 간 호환성 확보
  • ❌ PyTorch 고유 연산(custom ops) 변환 어려움
  • ❌ 제어 흐름 복잡 모델 변환 제한 (opset 호환성 문제)

4. TorchScript vs ONNX 비교

항목TorchScriptONNX
런타임Libtorch (C++)ONNX Runtime, TensorRT 등
제어 흐름Scripting 지원Limited (Loop, If 지원 opset 필요)
최적화JIT 패스 기반플랫폼별 최적화 (TF-TRT, OpenVINO)
호환성PyTorch 생태계크로스 프레임워크
사용 난이도중간 (Python 지식 필요)쉬움 (export API 단일 호출)

5. 실전 배포 팁

  1. 모델 로깅: TorchScript 그래프와 ONNX 메타데이터 저장
  2. Benchmark: 동일 입력으로 두 포맷 latency/throughput 비교
  3. Fallback: ONNX 변환 실패 시 TorchScript로 대체
  4. Custom Op 관리: TorchScript는 C++로 직접 구현, ONNX는 onnx.custom_op 활용
  5. Security: Serialized 모델 서명(signing) 및 검증

6. 결론 및 다음 단계

TorchScript는 PyTorch 생태계 최적화에, ONNX는 프레임워크 호환성과 다양한 실행 백엔드 지원에 강점을 보입니다. 배포 환경 요구사항에 따라 적절한 포맷을 선택하고, 성능 벤치마크를 통해 최종 파이프라인을 완성하세요.

  1. 두 포맷 병행 실험 및 모니터링 자동화
  2. TensorRT, OpenVINO 백엔드 성능 비교
  3. 모델 보안 및 서명 워크플로우 구축

참고 문헌

  1. PyTorch Docs: TorchScript — https://pytorch.org/docs/stable/jit.html
  2. ONNX Docs: Exporting PyTorch Models — https://onnx.ai/
  3. Vaswani et al. (2017). Attention is All You Need. NeurIPS.
반응형
Comments