한동안 onnx 수정하는 tool을 (https://github.com/PINTO0309/simple-onnx-processing-tools) 개발하더니, 요즘은 이쪽으로 관심을 트는듯 하다.
원래 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를 제공하는게 목표인듯하다.
따끈따끈한 repo 한번 돌려보자
환경설정은 Docker를 써도 되고, pip로도 가능하다
pip install nvidia-pyindex
pip install onnx-graphsurgeon
pip install -U onnx2tf
사용 모델 : 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 실패하는 모델들이 많았다...
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