3.6 KiB
3.6 KiB
Onnx模型转换示例
本文档以 resnet50 为例介绍如何使用 Netrans 对 pytorch 模型进行转换。 由于pytorch 的动态图特征,需要将 pytorch 模型转换成 onnx 格式后,再以 onnx 格式的模型进行转换。
安装Netrans
创建 conda 环境 .
conda create -n netrans python=3.8 -y
conda activate netrans
下载 Netrans .
mkdir -p ~/app
cd ~/app
git clone https://gitlink.org.cn/nudt_dsp/netrans.git
安装 Netrans。
cd ~/app/netrans
./setup.sh
数据准备
将 pytorch 模型导出成 onnx 模型
cd examples/pytorch/resnet50
python3 export_resnet50_2_onnx.py
cd ..
转换 onnx 模型需准备:
- .onnx 文件:网络模型
- dataset.txt:数据路径配置文件
我们的示例 已经完成数据准备,可以使用下面命令进入目录执行。
cd netrans/
cd examples/onnx
此时目录如下:
resnet50/
├── dataset.txt
├── dog.jpg
└── export_resnet50_2_onnx.py
└── resnet_50.onnx # 网络模型
3.1 使用 netrans_cli 转换 示例模型 resnet50
示例目录如下:
onnx/
└── resnet50
├── 0.jpg
├── dataset.txt
└── resnet50.onnx
3.1.1 导入模型
import.sh resnet50
该命令会在工程目录下生成包含模型信息的 .json 和 .data 数据文件。 此时 resnet50 的目录结构如下
resnet50/
├── 0.jpg
├── dataset.txt
├── resnet50.data
├── resnet50.json
└── resnet50.onnx
3.1.2 生成配置文件
数据在推理前一般会经过预处理,为了确保模型可以正确的输入数据,需要生产对应的配置文件。
config.sh resnet50
此时 resnet50 的目录结构如下:
resnet50/
├── 0.jpg
├── dataset.txt
├── resnet50.data
├── resnet50_inputmeta.yml
├── resnet50.json
└── resnet50.onnx
根据 resnet50 的实际情况 ,我们需要修改yml中的 mean 为 0,scale为 0.003921568627。
打开 resnet50_inputmeta.yml
文件,
修改第30-33行为:
scale:
- 0.003921568627
- 0.003921568627
- 0.003921568627
3.1.3 量化模型
quantize.sh resnet50 uint8
此时 resnet50 的目录结构如下:
resnet50/
├── 0.jpg
├── dataset.txt
├── resnet50_asymmetric_affine.quantize
├── resnet50.data
├── resnet50_inputmeta.yml
├── resnet50.json
└── resnet50.onnx
3.1.4 导出模型
./export.sh resnet50 uint8
此时 resnet50 的目录结构如下:
resnet50/
├── 0.jpg
├── dataset.txt
├── wksp
│ └── asymmetric_affine
│ ├── BUILD
│ ├── dump_core_graph.json
│ ├── graph.json
│ ├── main.c
│ ├── makefile.linux
│ ├── network_binary.nb
│ ├── vnn_global.h
│ ├── vnn_post_process.c
│ ├── vnn_post_process.h
│ ├── vnn_pre_process.c
│ ├── vnn_pre_process.h
│ ├── vnn_resnet50asymmetricaffine.c
│ ├── vnn_resnet50asymmetricaffine.h
│ ├── resnet50asymmetricaffine.2012.vcxproj
│ ├── resnet50_asymmetric_affine.export.data
│ └── resnet50asymmetricaffine.vcxproj
├── resnet50_asymmetric_affine.quantize
├── resnet50.data
├── resnet50_inputmeta.yml
├── resnet50.json
└── resnet50.onnx
3.2 使用 netrans_py 转换 onnx 示例模型 resnet50
example.py resnet50 -q uint8 -m 0 -s 0.003921568627