netrans/examples/pytorch/README.md

3.6 KiB
Raw Blame History

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 为 0scale为 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