ONNX(Open Neural Network Exchange)는 서로 다른 딥 러닝 프레임워크 간에 모델을 교환할 수 있도록 Microsoft와 Facebook에서 개발한 오픈 소스 프레임워크이다.
ONNX는 프레임워크를 바꿀 때 모델을 처음부터 다시 빌드하지 않고도 프레임워크 간에 모델을 전송할 수 있다.
또 프로그램을 사용해 모델을 시각화할 수 있다.
ONNX 사용의 주요 이점은 다양한 딥러닝 프레임워크의 장점을 활용할 수 있다는 것이다.
예를 들어 PyTorch에서 모델을 트레이닝하고 ONNX로 내보낸 다음 모델을 다시 트레이닝하지 않고도 TensorFlow와 같은 다른 프레임워크에서 같은 모델을 사용할 수 있다.
이제 ONNX을 사용해서 모델의 프레임워크를 전환하는 방법과 시각화하는 방법을 알아보자.
ONNX 설치
ONNX는 아래 명령어로 간단히 설치할 수 있다.
pip install onnx
간혹 protobuf 버전이 안 맞다고 에러를 뱉기는 하는데 사용하는데 문제가 없으므로 무시하자.
ONNX로 모델 내보내기
예시를 통해 살펴보자. PyTorch에서 모델을 내보내는 예시이다.
import torch
import torch.nn as nn
import torch.onnx
# Define your PyTorch model
class MyModel(torch.nn.Module):
def __init__(self):
super(MyModel, self).__init__()
self.linear = torch.nn.Linear(1, 1)
def forward(self, x):
return self.linear(x)
model = MyModel()
# Export the PyTorch model to ONNX format
input_shape = (1, 1)
x = torch.randn(input_shape)
torch.onnx.export(model, x, "model.onnx", input_names=["input"], output_names=["output"])
맨 마지막 줄에 유의하자.
torch.onnx.export에 정의한 모델과 모델의 인풋을 넣으면 .onnx 파일을 만들 수 있다.
ONNX로 모델 가져오기
위에서 PyTorch 프레임워크에서 모델을 내보냈으니 TensorFlow에서 ONNX 모델을 가져오는 방법을 살펴보자.
import onnx
from onnx_tf.backend import prepare
# Load the ONNX model
onnx_model = onnx.load("model.onnx")
# Convert the ONNX model to TensorFlow format
tf_model = prepare(onnx_model)
# Use the TensorFlow model
output = tf_model.run({"input": x.numpy()})
이러면 모델을 다시 작성하지 않고도 PyTorch에서 만든 모델을 Tensorflow으로 가져올 수 있다.
ONNX 파일로 모델 시각화하기
Netron(https://netron.app/)과 같은 ONNX 형식의 파일을 지원하는 프로그램을 사용하여 ONNX 파일을 열거나 모델을 시각화할 수 있다.
Netron에 접속하자.

가운데 로고를 눌러 GitHub 페이지로 이동해 로컬에 NETRON을 설치할 수도 있고 Open Model ...을 눌러서 웹에서 작업할 수도 있다.
모델을 업로드하면 자동으로 시각화를 해준다.

왼쪽 위의 메뉴를 눌러 모양을 변경할 수 있고 png나 svg파일로 시각화한 자료를 다운로드 할 수 있다.

혹은 프로그램을 로컬에 설치했다면 다음 코드로 모델을 시각화할 수 있다.
import netron
# Load the ONNX model
model_path = "model.onnx"
# Start Netron web server and open the model in the default browser
netron.start(model_path)
그러면 브라우저에서 모델을 볼 수 있을 것이다.
살펴본 것처럼 ONNX는 프레임워크 간 모델을 주고받거나 모델을 시각화하는데 유용하게 쓸 수 있다.
사실 프레임워크를 전환할 일은 별로 없기 때문에 나는 ONNX를 발표 자료같은데 넣을 모델 시각화에 주로 사용한다.
모델이 간단하면 모델을 직접 그려도 되지만 모델이 복잡하고 크기가 클 경우 ONNX을 유용하게 사용할 수 있다.
'코딩 환경 > PyTorch' 카테고리의 다른 글
| [PyTorch] GPU을 사용할 때 to(device)와 cuda() 차이 (2) | 2023.02.27 |
|---|---|
| [PyTorch] MNIST 데이터셋 다운로드하고 열어보기 (0) | 2023.02.26 |
| [PyTorch] IProgress not found 에러 해결 방법 (0) | 2023.02.26 |
| [PyTorch] 파이토치 torchinfo, summary 사용 방법 / 여러 input 설정 (0) | 2023.02.24 |
| [PyTorch] m1 맥에 GPU 사용 Pytorch 설치 및 에러 해결 / ERROR: Could not find a version that satisfies the requirement torch (0) | 2023.02.15 |