The onnx2tnn is the most important converter in TNN, which converts the ONNX model to a TNN model. The onnx2tnn tool mainly supports CNN common network structure. Because the Pytorch officially supports exporting to ONNX format, we only need to ensure that the ONNX model can be converted into a TNN model so that we could directly guarantee the Pytorch model can be directly converted into a TNN model.
onnx2tnn has an out-of-the-box web version available at https://convertmodel.com/#outputFormat=tnn. Skip the "Environment requirements and Compile" step if you use the web version. The web version converts the model locally, so there is no need to warry about the mode security.
The following environment is suitable for Macos and Linux systems. The example is based on centos7.2.
-Install protobuf (version >= 3.4.0)
Macos:
brew install protobuf
Linux:
For linux systems, we recommend to refer to the official README document of protobuf and install directly from the source code.
If you are using Ubuntu system, you can use the following instructions to install:
sudo apt-get install libprotobuf-dev protobuf-compiler
- Install python (version >= 3.6)
Macos
brew install python3
Centos:
yum install python3 python3-devel
- Install python dependencies
onnx=1.6.0
onnxruntime>=1.1.0
numpy>=1.17.0
onnx-simplifier>=0.2.4
pip3 install onnx==1.6.0 onnxruntime numpy onnx-simplifier
- cmake (version >= 3.0) Download the latest cmake from official website, and follow the instructions. It is recommended to use the latest cmake.
The onnx2tnn tool runs directly on Mac and Linux with automatic compilation scripts
cd <path-to-tnn>/tools/onnx2tnn/onnx-converter
./build.sh
you could compile the tool manually:
# make a new build directory to build
mkdir build
cd build cmake ./../
make -j 4
#copy the so lib
cp ./*.so ./../
#delete build directory
cd ./../
rm -r build
Although we provide the automated script to compile,you could compile the tool manually:
- cd to the directy
cd <path-to-tnn>/tools/onnx2tnn/onnx-converter
- onnx_converter Compile
# make a new build directory to build
mkdir build
cd build cmake ./../
make -j 4
#copy the so lib
cp ./*.so ./../
#delete build directory
cd ./../
rm -r build
Check the tool help information
python3 onnx2tnn.py -h
help information shows as follow:
usage: onnx2tnn.py [-h] [-version VERSION] [-optimize OPTIMIZE] [-half HALF]
[-o OUTPUT_DIR]
onnx_model_path
positional arguments:
onnx_model_path Input ONNX model path
optional arguments:
-h, --help show this help message and exit
-version VERSION Algorithm version string
-optimize OPTIMIZE Optimize model befor convert, 1:default yes, 0:no
-half HALF Save model using half, 1:yes, 0:default no
-o OUTPUT_DIR the output dir for tnn model
-align align the onnx model with tnn model
-input_file INPUT_FILE the input file path which contains the input data for the inference model
-ref_file REF_FILE the reference file path which contains the reference data to compare the results
python3 onnx2tnn.py model.onnx -version=algo_version -optimize=1 -half=0
Parameter:
-version
Version information
-optimize
1(Default): lossless operator fusion optimisation. For example, BN+Scale..fused into Conv layer;
0 :If the fusion goes wrong, try set this value.
-half
1: store in FP16,to reduce the model size.
0(Default): Stored in fp32.
Note: Whether using fp16 depends on the platform,mobile GPU only allows fp16 calculation
-o
output_dir : The directory the model to be saved in,the directory must exit already.
-align
model align, if you want to use it, you can add '-align' in your command
-input_file
input_file : The path of input file, which will be used in model align
-ref_file
reference_file : The path of reference file, which will be used in model align. Compare tnn's output and reference file.
The list of operators currently supported by the onnx2tnn tool can be found in Model Support
- The tnn2onnx only supports 4-dimensional (nchw) data type.
- It is recommended to set the batch size of the model input to 1, and not recommended to set the batch_size to a relatively large value.
- Asymmetric padding is not supported. (This special situation occurs in "pool5/7x7_s1_1" in the inceptionv1 model)
- The upsample layer of onnxruntime version 1.1 and the Pytoch Upsample layer have inconsistent results in the align_corners = 0 mode. Be careful using the onnxruntime calculation result when aligning the results.
Pytorch supports direct converting from the trained model to the ONNX model, so using the Pytorch's own export method will easily export the Pytorch model to the ONNX model. The following code shows how to export the resnet50 Pytorch model to the ONNX model. Pytorch also provides more detailed documentation on how to export Pytorch models as ONNX models. For details, please refer to pytorch export onnx
import torch.hub
import numpy as np
torch.hub.list('pytorch/vision')
se_resnet50 = torch.hub.load(
'moskomule/senet.pytorch',
'se_resnet50',
pretrained=True,)
senet = se_resnet50()
senet.load_state_dict(torch.load("./seresnet50-60a8950a85b2b.pkl"))
senet.eval()
random_data = np.random.rand(1, 3, 224, 224).astype(np.float)
torch.onnx.export(senet,
random_data,
"./sent.onnx",
export_params=True,
opset_version=11,
do_constant_folding=True,
input_names= ['input'],
output_names = ['output'])
Through the code above, after converting the Pytorch model to the ONNX model, you could refer to the onnx2TNN which then converts the onnx model to a TNN model.