배경지식: https://velog.io/@eric9687/Onnx-simplifier-feat.-Netron
pth와 pb등을 모델과 함께 onnx로 포팅하여서 쓰는 경험이 조금씩 생기면서 든 의문이 "onnx는 모델 구조뿐만 아니라 가중치까지 다 들어 있는데, 다시 pytorch나 tensorflow로 바꿀 수 있지 않을까? 특히 자동으로!"였다.
와.... 역시나... 저만 이런 생각을 한 건 아니죠.. 실제로 존재했습니다. 그게 바로 onnx2torch입니다.
onnx2torch
![](https://velog.velcdn.com/images/eric9687/post/f156edf4-0d66-478f-abfa-5c9d2c6848f5/image.png)
- url: https://github.com/ENOT-AutoDL/onnx2torch
- 소개를 해석하자면,
- onnx2torch는 onnx를 pytorch로 바꾸는 변환기
- 사용하기 쉬워요! : convert함수만 사용하면 끝.
- 확장하기 쉬워요! : 없는 함수는 @add_converter로 추가해요
- 다시 변환할 수 있어요!: torch.onnx.export 사용하여 다시 onnx로
- 사용방법:
- 다운로드:
pip install onnx2torch
- 사용 예시:
import torch
from onnx2torch import convert
# Path to ONNX model
onnx_model_path = '/some/path/mobile_net_v2.onnx'
# You can pass the path to the onnx model to convert it or...
torch_model_1 = convert(onnx_model_path)
# Or you can load a regular onnx model and pass it to the converter
onnx_model = onnx.load(onnx_model_path)
torch_model_2 = convert(onnx_model)
- 위에서 설명한 바와 같이, 지원하지 않는 함수는 추가할 수 있습니다. 특히, tensorflow로 만들어진 onnx를 pytorch로 변환하는 경우에 사용하면됩니다. 경험상, argmax와 gatherND 없어요...
- 그런데!! 혹시나!! 아무리 함수를 추가해도 계속 오류가 난다!(경험담)하면....onnx-modifier를 쓰면 됩니다. 그걸로 일단 변환안되는 함수 앞뒤를 자르고, 변환한 후에, 중간에 변환하지 못한 operation정도는 직접 써주는 성의를 보이면 돼요 :)
onnx-modifier
![](https://velog.velcdn.com/images/eric9687/post/5863a9be-5984-4dde-b368-5f23cbaf978d/image.png)
-
url: https://github.com/ZhangGe6/onnx-modifier
-
(중국인이 만든 것이니, 중국어 readme를 해석하겠습니다)
-
netron을 베이스로 flask로 만든 onnx-modifier는 눈으로 보면서 직접 onnx모델을 수정할 수 있도록 합니다. 제공하는 기능으로는
- 노드 삭제/복원
- 노드 하나만 삭제
- 특정 노드를 root로 하는 모든 노드 삭제
- 삭제되 노드 복원
- 노드 Input/Output 이름 변경
- 모델 Input/output 이름 변경
- 아웃풋 추가
- 노드의 attribute(속성값) 변경
- 노드 추가
- batch size 변경
- 모델 initializer 변경
-
사용방법:
-
다운로드 1:
git clone git@github.com:ZhangGe6/onnx-modifier.git
cd onnx-modifier
-
다운로드 2:pip install onnx flask
-
실행: python app.py
-
그럼, 브라우저가 열리면서, 이런 페이지가 나옵니다.
![](https://velog.velcdn.com/images/eric9687/post/cef795b6-f283-4c86-8d35-c9e7007bb9cd/image.png)
-
여기서, open model로 모델을 열면,
![](https://velog.velcdn.com/images/eric9687/post/0a083be2-80a3-47b2-a686-e03928ffe5e2/image.png)
-
이런 메뉴들을 통해, 모델을 변경하고 저장할 수 있습니다.
MMdnn
![](https://velog.velcdn.com/images/eric9687/post/9f2fdc75-a1f6-4886-bf6b-06dfc202425f/image.png)
- 추가로, "그럼 중간 onnx말고도 바로 pytorch에서 tensorflow로도 바꿀 수 있지 않을까"하다가 찾았습니다. 역시 Ms.....
- url: https://github.com/microsoft/MMdnn#-mmdnn
![](https://velog.velcdn.com/images/eric9687/post/91c195f9-c83c-4b47-b39a-c69c8d367104/image.png)
- MMdnn은 딥러닝 모델을 시각화하고 분석하고 변환하는 프레임워크 호환 툴입니다.
- 모델 변환
- 모델 재학습
- 모델 찾기와 시각화
- 모델 deploy
- 사실, mmdnn을 이용하기 위해서는 dependency를 다 설정해줘야하는데, tensorflow는 1.15.2, pytorch는 0.4.0 or 1.5.1로 한정적이라는 단점이 있습니다.