Update docs
This commit is contained in:
parent
19e41d9e83
commit
bf306e8504
|
@ -1,2 +1,6 @@
|
|||
# netrans
|
||||
# netrans
|
||||
Netrans 是一套运行在unbuntu 20.04上的模型处理工具,提供命令行工具 netrans_cli 和 python api netrans_py, 其核心功能是将模型权重转换成在pnna芯片上运行的 nbg(network binary graph)格式(.nb 为后缀)。
|
||||
|
||||
快速使用请参考[quick_start_guide.md](./quick_start_guide.md)
|
||||
详细说明请参考[introduction.md](./introduction.md)
|
||||
具体示例请参考examples。
|
||||
|
|
|
@ -0,0 +1,175 @@
|
|||
# Onnx模型转换示例
|
||||
本文档以 resnet50 为例介绍如何使用 Netrans 对 pytorch 模型进行转换。
|
||||
由于pytorch 的动态图特征,需要将 pytorch 模型转换成 onnx 格式后,再以 onnx 格式的模型进行转换。
|
||||
|
||||
## 安装Netrans
|
||||
创建 conda 环境 .
|
||||
```bash
|
||||
conda create -n netrans python=3.8 -y
|
||||
conda activate netrans
|
||||
```
|
||||
|
||||
下载 Netrans .
|
||||
```bash
|
||||
mkdir -p ~/app
|
||||
cd ~/app
|
||||
git clone https://gitlink.org.cn/nudt_dsp/netrans.git
|
||||
```
|
||||
|
||||
安装 Netrans。
|
||||
```bash
|
||||
cd ~/app/netrans
|
||||
./setup.sh
|
||||
```
|
||||
|
||||
## 数据准备
|
||||
|
||||
将 pytorch 模型导出成 onnx 模型
|
||||
```bash
|
||||
cd examples/pytorch/resnet50
|
||||
python3 export_resnet50_2_onnx.py
|
||||
cd ..
|
||||
```
|
||||
|
||||
转换 onnx 模型需准备:
|
||||
|
||||
- .onnx 文件:网络模型
|
||||
- dataset.txt:数据路径配置文件
|
||||
|
||||
我们的示例 已经完成数据准备,可以使用下面命令进入目录执行。
|
||||
|
||||
```bash
|
||||
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 导入模型
|
||||
|
||||
```bash
|
||||
import.sh resnet50
|
||||
```
|
||||
|
||||
该命令会在工程目录下生成包含模型信息的 .json 和 .data 数据文件。
|
||||
此时 resnet50 的目录结构如下
|
||||
```
|
||||
resnet50/
|
||||
├── 0.jpg
|
||||
├── dataset.txt
|
||||
├── resnet50.data
|
||||
├── resnet50.json
|
||||
└── resnet50.onnx
|
||||
```
|
||||
|
||||
#### 3.1.2 生成配置文件
|
||||
数据在推理前一般会经过预处理,为了确保模型可以正确的输入数据,需要生产对应的配置文件。
|
||||
|
||||
```bash
|
||||
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 量化模型
|
||||
|
||||
```bash
|
||||
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 导出模型
|
||||
|
||||
```bash
|
||||
./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
|
||||
|
||||
```bash
|
||||
example.py resnet50 -q uint8 -m 0 -s 0.003921568627
|
||||
```
|
|
@ -0,0 +1 @@
|
|||
dog.jpg
|
Binary file not shown.
After Width: | Height: | Size: 9.8 KiB |
|
@ -0,0 +1,6 @@
|
|||
import torch
|
||||
import torchvision.models as models
|
||||
model = models.resnet50()
|
||||
input_tensor = torch.rand(1,3,224,224)
|
||||
model_onnx = torch.jit.trace(model, input_tensor)
|
||||
model_onnx.save('resnet50.onnx')
|
|
@ -81,7 +81,7 @@ Netrans 支持目前大多数的主流框架。具体如下表
|
|||
| Pytorch | 支持 Pytorch 至 1.5.1 |
|
||||
| Darknet |支持[官网](https://pjreddie.com/darknet/)列出 darknet 模型|
|
||||
|
||||
<font color="#dd0000">注意:</font> Pytorch 动态图的特性,我们建议将 Pytorch 模型导出成 onnx ,再使用 Netrans 进行转换。
|
||||
<font color="#dd0000">注意:</font> Pytorch 动态图的特性,建议将 Pytorch 模型导出成 onnx ,再使用 Netrans 进行转换。
|
||||
|
||||
## 算子支持
|
||||
|
||||
|
@ -325,7 +325,7 @@ input_meta:
|
|||
| layout | 输入张量的格式,使用 nchw 用于 Caffe、Darknet、ONNX 和 PyTorch 模型。使用 nhwc 用于 TensorFlow、TensorFlow Lite 和 Keras 模型。 |
|
||||
| shape | 此张量的形状。第一维,shape[0],表示每批的输入数量,允许在一次推理操作之前将多个输入发送到网络。如果batch维度设置为0,则需要从命令行指定--batch-size。如果 batch维度设置为大于1的值,则直接使用inputmeta.yml中的batch size并忽略命令行中的--batch-size。 |
|
||||
| fitting | 保留字段 |
|
||||
| preprocess | 预处理步骤和顺序。预处理支持下面的四个键,键的顺序代表预处理的顺序。您可以相应地调整顺序。 |
|
||||
| preprocess | 预处理步骤和顺序。预处理支持下面的四个参数,参数的顺序代表预处理的顺序。 |
|
||||
| reverse_channel | 指定是否保留通道顺序。将此参数设置为以下值之一:true(保留通道顺序)或 false(不保留通道顺序)。对于 TensorFlow 和 TensorFlow Lite 框架的模型使用 true。 |
|
||||
| mean | 用于每个通道的均值。 |
|
||||
| scale | 张量的缩放值。均值和缩放值用于根据公式 (inputTensor - mean) × scale 归一化输入张量。|
|
||||
|
@ -333,6 +333,6 @@ input_meta:
|
|||
| add_preproc_node | 用于处理 OVxlib C 项目案例中预处理节点的插入。[true, false] 中的布尔值,表示通过配置以下参数将预处理层添加到导出的应用程序中。此参数仅在 add_preproc_node 参数设置为 true 时有效。|
|
||||
| preproc_type | 预处理节点输入类型。 [IMAGE_RGB, IMAGE_RGB888_PLANAR,IMAGE_YUV420, IMAGE_GRAY, IMAGE_BGRA, TENSOR] 中的字符串值 |
|
||||
| preproc_perm | 预处理节点输入的置换参数。 |
|
||||
| redirect_to_output | 将database张量重定向到图形输出的特殊属性。如果为该属性设置了一个port,网络构建器将自动为该port生成一个输出层,以便后处理文件可以直接处理来自database的张量。 如果使用网络进行分类,则上例中的lid“input_0”表示输入数据集的标签lid。 您可以设置其他名称来表示标签的lid。 请注意,redirect_to_output 必须设置为 true,以便后处理文件可以直接处理来自database的张量。 标签的lid必须与后处理文件中定义的 labels_tensor 的lid相同。 [true, false] 中的布尔值。 指定是否将由张量表示的输入端口的数据直接发送到网络输出。true(直接发送到网络输出)或 false(不直接发送到网络输出)|
|
||||
| redirect_to_output | 将database张量重定向到图形输出的特殊属性。如果为该属性设置了一个port,网络构建器将自动为该port生成一个输出层,以便后处理文件可以直接处理来自database的张量。 如果使用网络进行分类,则上例中的lid“input_0”表示输入数据集的标签lid。 请注意,redirect_to_output 必须设置为 true,以便后处理文件可以直接处理来自database的张量。 标签的lid必须与后处理文件中定义的 labels_tensor 的lid相同。 [true, false] 中的布尔值。 指定是否将由张量表示的输入端口的数据直接发送到网络输出。true(直接发送到网络输出)或 false(不直接发送到网络输出)|
|
||||
|
||||
可以根据实际情况对生成的inputmeta文件进行修改。
|
Loading…
Reference in New Issue