[ML Model Convert] ONNX2TF

eetocs·2022년 10월 21일
2

ML Model Convert

목록 보기
2/2

ONNX2TF : PINTO0309님이 새로 만들고 있는 model convert tool

한동안 onnx 수정하는 tool을 (https://github.com/PINTO0309/simple-onnx-processing-tools) 개발하더니, 요즘은 이쪽으로 관심을 트는듯 하다.

1. 설명

원래 onnx-tf(https://github.com/onnx/onnx-tensorflow)라는 repo가 존재했는데, repo의 큰 문제가 하나 있다.

onnx의 구조는[B,C,H,W]를 따르고, Tensorflow는 모델구조가 [B,H,W,C]를 따르는데 적합하게 모델 변환을 하기 위해서는 layer weight Transpose를 해줘야 한다.

onnx-tf에서는 이를 weight를 가지는 layer 자체를 transpose하는 것이 아닌, 앞단에 Transpose layer를 추가하는 방식으로 제공해준다.

해당 방법은 모델 동작은 정상적으로 하지만, weight를 가지는 layer마다 앞단에 transpose가 추가되어 불필요한 latency가 발생하므로 무시못할 단점을 가지게 된다.

해당 단점을 보완하여, weight transpose가 적용이 된 onnx2tf를 제공하는게 목표인듯하다.

2. 돌려보자

환경설정

따끈따끈한 repo 한번 돌려보자
환경설정은 Docker를 써도 되고, pip로도 가능하다


pip install nvidia-pyindex
pip install onnx-graphsurgeon
pip install -U onnx2tf


  • 위 세줄이면 환경 설정 완료, openvino2tensorflow에 비해 설치가 편해졌다
  • openvino2tensorflow는 지원 하는 것들이 많아서, 설정할게 너무 많다...

진짜 돌려보자

사용 모델 : yolov7-tiny에 post-processing(NMS)까지 추가된 모델


onnx2tf -i input.onnx - output_dir


(CLI로 간단하게 돌릴수 있다)

Layer in/out shape을 보여주며 fp32, fp16 tflite모델을 convert해준다.

아래 그림을 보면 TFlite에 추가적인 transpose layer 없이 [BCHW] -> [BHWC]으로 transpose되어 모델 생성 된걸 확인할 수 있다. (좌측이 onnx, 우측이 TFlite)

하지만, 개인적으로 사용하는 모델들을 테스트 해봤을때, convert 실패하는 모델들이 많았다...

  • MoveNet [midiapipe]
  • LitePose [CVPR'22]
  • H3R [TPAMI'21]
    아직 한참 개발 중인 repo이다보니, 지원하는 operation(layer)들이 제한적이다.

결론

  • 잘 follow-up하고 있다가 stable version 나왔을때, 다시 사용해봐야겠다.
  • 아직은 openvino2tensorflow 사용해야할듯
  • (Transformer, LSTM layer 들도 지원좀 해주세요...)
profile
ML 잡부

5개의 댓글

comment-user-thumbnail
2022년 10월 22일

Hello.
Some TrueDiv and Cast operations are not TFLite-compatible, so they are generated as FlexOP, but MoveNet Multi-Pose conversion is already supported.
https://github.com/PINTO0309/onnx2tf#generated-model

Also, Transformer and StableDiffusion conversions are already possible. Just change the behavior of the tool as in openvino2tensorflow before and after Reshape and InstanceNormalization in 3D.
https://github.com/PINTO0309/onnx2tf#parameter-replacement

PINTO0309

1개의 답글
comment-user-thumbnail
2023년 11월 15일

nvidia-pyindex 설치 중에 ModuleNotFoundError: No module named 'pip' 라는 에러가 뜨시는 분들은 파이썬 버전을 3.8 이하로 바꿔보시기 바랍니다. 3.9에서는 해당 에러가 발생하네요.

1개의 답글