본문 바로가기
Development/Onnx

[Onnx] onnx-simplifier를 이용한 onnx 모델 간소화

by shuka 2021. 8. 23.
728x90
728x90

onnx-simplifier란?

onnx-simplifier은 복잡한 구조의 onnx 모델을 간소화하는 작업을 진행해 준다.

 

모델에 따라 복잡한 모델의 구조라고 하더라도 간소화되는 부분이 많을 수도 있고 적을 수도 있다.

onnx-simplifier에 대한 git 주소를 들어가보면 3.4M모델을 1.9M모델로 간소화 시켰는데, 내가 가지고 있는 모델들은 저정도 까지는 아니지만 보통 사용하면 적으면 0.1M, 보통은 0.5M정도는 모델이 간소화 되었다.

 

그리고, onnx를 tensorrt로 변환할 때 오류가 발생하는 모델에 대해 onnx-simplifier을 한번 해주면 가끔 오류 없이 변환이 완료될 때도 있다. 

(해당 오류의 경우에 대해서는 연구하다가 다시 발생하면 추가할 예정)

 

https://github.com/daquexian/onnx-simplifier

 

GitHub - daquexian/onnx-simplifier: Simplify your onnx model

Simplify your onnx model. Contribute to daquexian/onnx-simplifier development by creating an account on GitHub.

github.com

 

 

onnx-simplifier 설치 및 사용

onnx-simplifier를 설치하고 사용하는건 정말 간단하다.

 

onnx-simplifier 설치 명령어

pip3 install -U pip && pip3 install onnx-simplifier

 

onnx-simplifier 사용 방법

python3 -m onnxsim input.onnx output.onnx

 

onnx-simplifier Option

python3 -m onnxsim -h

usage: __main__.py [-h] [--enable-fuse-bn] [--skip-fuse-bn]
                   [--skip-optimization]
                   [--input-shape INPUT_SHAPE [INPUT_SHAPE ...]]
                   [--skip-optimizer SKIP_OPTIMIZER [SKIP_OPTIMIZER ...]]
                   [--skip-shape-inference] [--dynamic-input-shape]
                   [--input-data-path INPUT_DATA_PATH [INPUT_DATA_PATH ...]]
                   [--custom-lib CUSTOM_LIB]
                   input_model output_model [check_n]

positional arguments:
  input_model           Input ONNX model
  output_model          Output ONNX model
  check_n               Check whether the output is correct with n random
                        inputs

optional arguments:
  -h, --help            show this help message and exit
  --enable-fuse-bn      This option is deprecated. Fusing bn into conv is
                        enabled by default.
  --skip-fuse-bn        Skip fusing batchnorm into conv.
  --skip-optimization   Skip optimization of ONNX optimizers.
  --input-shape INPUT_SHAPE [INPUT_SHAPE ...]
                        The manually-set static input shape, useful when the
                        input shape is dynamic. The value should be
                        "input_name:dim0,dim1,...,dimN" or simply
                        "dim0,dim1,...,dimN" when there is only one input, for
                        example, "data:1,3,224,224" or "1,3,224,224". Note:
                        you might want to use some visualization tools like
                        netron to make sure what the input name and dimension
                        ordering (NCHW or NHWC) is.
  --skip-optimizer SKIP_OPTIMIZER [SKIP_OPTIMIZER ...]
                        Skip a certain ONNX optimizer
  --skip-shape-inference
                        Skip shape inference. Shape inference causes segfault
                        on some large models
  --dynamic-input-shape
                        This option enables dynamic input shape support.
                        "Shape" ops will not be eliminated in this case. Note
                        that "--input-shape" is also needed for generating
                        random inputs and checking equality. If
                        "dynamic_input_shape" is False, the input shape in
                        simplified model will be overwritten by the value of
                        "input_shapes" param.
  --input-data-path INPUT_DATA_PATH [INPUT_DATA_PATH ...]
                        input data, The value should be "input_name1:xxx1.bin"
                        "input_name2:xxx2.bin ...", input data should be a
                        binary data file.
  --custom-lib CUSTOM_LIB
                        custom lib path which should be absolute path, if you
                        have custom onnxruntime backend you should use this to
                        register you custom op

 

728x90
반응형

댓글