netrans docs

This commit is contained in:
xujiao 2025-04-07 11:33:23 +08:00
parent 5efdea39c5
commit b569d174a3
2 changed files with 461 additions and 0 deletions

265
introduction.md Normal file
View File

@ -0,0 +1,265 @@
# 模型转换简介
Netrans 是一套运行在unbuntu 20.04上的模型处理工具,提供命令行工具 netrans_cli 和 python api netrans_py 其核心功能是将模型权重转换成在pnna芯片上运行的 nbgnetwork binary graph格式.nb 为后缀)。
Netrans 目录结构如下:
```
netrans
├── bin
├── netrans_cli
├── netrans_py
└── examples
```
| 目录 | 说明 |
| :--- | ---
| bin | 导入,量化,推理,导出工程等工具的二进制文件 |
| netrans_cli | 导入,量化,推理和导出的一键运行命令行工具 |
| netrans_py | 导入量化推理和导出的一键运行python api |
| examples | tensorflow、caffe、darknet 和 onnx 的模型转换示例 |
<font color="#dd0000">注意:运行 Netrans 的计算机应该满足以下要求。</font>
|资源|描述|
|:---|---|
| CPU | Intel® Core™ i5-6500 CPU @ 3.2 GHz x4 支持 the Intel® Advanced Vector Extensions.|
| RAM | 至少8GB |
| 硬盘 | 160GB |
| 操作系统 | Ubuntu 20.04 LTS 64-bit with Python 3.8 <br/> 注意:不推荐使用其他版本|
## 安装
- 确保Python 3.8环境配置完成
- 使用apt安装“build-essential”
```shell
sudo apt update
sudo apt install build-essential
```
- 计算机需要满足上面描述的硬件需求
Netrans为编译好的文件只需要在系统中添加对应的路径即可直接使用。
方案一:需要修改.bashrc文件增加以下行请注意路径匹配下行命令中的install_path 需要修改为您实际的安装目录。
```shell
export NETRANS_PATH= install_path/netrans/bin
```
然后执行
```shell
source ~/.bashrc
```
方案二在命令行中直接输入以下行请注意路径匹配下行命令中的install_path 需要修改为您实际的安装目录。
```shell
export NETRANS_PATH=netrans/bin
```
如果使用方案二,则每次使用 Nertans 之前都需要执行 export 操作。
如果您想使用 Netrans python api , 需要安装 netrans_py。请注意路径匹配下行命令中的install_path 需要修改为您实际的安装目录。
```bash
cd install_path/netrans/netrans_py
pip3 install -e .
```
## Netrans 工作流程介绍。
使用 Netrans_cli 将工作流程如下:
- 1. 使用 import_model.sh 导入并转换模型到中间模型文件
- 2. 使用 gen_inputmeta.sh 生成gen_inputmeta文件
- 3. 使用quantize.sh 量化导入后的中间模型文件
- 4. 使用export.sh 导出应用部署程序工程,以便部署到硬件。
在使用 gen_inputmeta.sh 生成gen_inputmeta文件时您可能需要根据您预训练模型的数据预处理流程修改生成的inputmeta.yml文件。具体请参考[introduction.md](./introduction.md)
使用 Netrans_py 的工作流程如下:
- 1. 始化 Netrans
- 2. 使用 model2nbg 函数实现模型导入、预处理参数配置、量化和导出,生成应用部署程序工程。
Netrans 提供 tensorflow、caffe、darknet 和 onnx 的模型转换示例,请参考 examples。
## 模型支持
Netrans 支持目前大多数的主流框架。具体如下表
|输入支持|描述|
|:---|---|
| caffe|支持所有的Caffe 模型 |
| Tensorflow|支持版本1.4.x, 2.0.x, 2.3.x, 2.6.x, 2.8.x, 2.10.x, 2.12.x 以tf.io.write_graph()保存的模型 |
| ONNX|支持 ONNX 至 1.14.0 opset支持至19 |
| Pytorch | 支持 Pytorch 至 1.5.1 |
| Darknet |支持[官网](https://pjreddie.com/darknet/)列出 darknet 模型|
<font color="#dd0000">注意:</font> Pytorch 动态图的特性,我们建议将 Pytorch 模型导出成 onnx ,再使用 Netrans 进行转换。
## 算子支持
### 支持的Caffe算子
| | | |
|:---| -- | -- |
absval | innerproduct | reorg
axpy | lrn | roipooling
batchnorm/bn | l2normalizescale | relu
convolution | leakyrelu | reshape
concat | lstm | reverse
convolutiondepthwise | normalize | swish
dropout | poolwithargmax | slice
depthwiseconvolution | premute | scale
deconvolution | prelu | shufflechannel
elu | pooling | softmax
eltwise | priorbox | sigmoid
flatten | proposal | tanh
### 持的TensorFlow算子
| | | |
|:---| -- | -- |
tf.abs | tf.nn.rnn_cell_GRUCell | tf.negative
tf.add | tf.nn.dynamic_rnn | tf.pad
tf.nn.bias_add | tf.nn.rnn_cell_GRUCell | tf.transpose
tf.add_n | tf.greater | tf.nn.avg_pool
tf.argmin | tf.greater_equal | tf.nn.max_pool
tf.argmax | tf.image.resize_bilinear | tf.reduce_mean
tf.batch_to_space_nd | tf.image.resize_nearest_neighbor | tf.nn.max_pool_with_argmax
tf.nn.batch_normalization | tf.contrib.layers.instance_norm | tf.pow
tf.nn.fused_batchnorm | tf.nn.fused_batch_norm | tf.reduce_mean
tf.cast | tf.stack | tf.reduce_sum
tf.clip_by_value | tf.nn.sigmoid | tf.reverse
tf.concat | tf.signal.frame | tf.reverse_sequence
tf.nn.conv1d | tf.slice | tf.nn.relu
tf.nn.conv2d | tf.nn.softmax | tf.nn.relu6
tf.nn.depthwise_conv2d | tf.space_to_batch_nd | tf.rsqrt
tf.nn.conv1d | tf.space_to_depth | tf.realdiv
tf.nn.conv3d | tf.nn.local_response_normalization | tf.reshape
tf.image.crop_and_resize | tf.nn.l2_normalize | tf.expand_dims
tf.nn.conv2d_transposed | tf.nn.rnn_cell_LSTMCelltf.nn_dynamic_rnn | tf.squeeze
tf.depth_to_space | tf.rnn_cell.LSTMCell | tf.strided_slice
tf.equal | tf.less | tf.sqrt
tf.exp | tf.less_equal | tf.square
tf.nn.elu | tf.logical_or | tf.subtract
tf.nn.embedding_lookup | tf.logical_add | tf.scatter_nd
tf.maximum | tf.nn.leaky_relu | tf.split
tf.floor | tf.multiply | tf.nn.swish
tf.matmul | tf.nn.moments | tf.tile
tf.floordiv | tf.minimum | tf.nn.tanh
tf.gather_nd | tf.matmul | tf.unstack
tf.gather | tf.batch_matmul | tf.where
tf.nn.embedding_lookup | tf.not_equal | tf.select
### 支持的ONNX算子
| | | |
|:---| -- | -- |
ArgMin | LeakyRelu | ReverseSequence
ArgMax | Less | ReduceMax
Add | LSTM | ReduceMin
Abs | MatMul | ReduceL1
And | Max | ReduceL2
BatchNormalization | Min | ReduceLogSum
Clip | MaxPool | ReduceLogSumExp
Cast | AveragePool | ReduceSumSquare
Concat | Globa | Reciprocal
ConvTranspose | lAveragePool | Resize
Conv | GlobalMaxPool | Sum
Div | MaxPool | SpaceToDepth
Dropout | AveragePool | Sqrt
DepthToSpace | Mul | Split
DequantizeLinear | Neg | Slice
Equal | Or | Squeeze
Exp | Prelu | Softmax
Elu | Pad | Sub
Expand | POW | Sigmoid
Floor | QuantizeLinear | Softsign
InstanceNormalization | QLinearMatMul | Softplus
Gemm | QLinearConv | Sin
Gather | Relu | Tile
Greater | Reshape | Transpose
GatherND | Squeeze | Tanh
GRU | Unsqueeze | Upsample
Logsoftmax | Flatten | Where
LRN | ReduceSum | Xor
Log | ReduceMean | |
### 支持的Darknet算子
| | | |
|:---| -- | -- |
avgpool | maxpool | softmax
batch_normalize | mish | shortcut
connected | region | scale_channels
convolutional | reorg | swish
depthwise_convolutional | relu | upsample
leaky | route | yolo
logistic
## 数据准备
对于不同框架下训练的模型,需要准备不同的数据,并且所有的数据都需要放在同一个文件夹下。
### caffe
转换 caffe 模型时,模型工程目录应包含以下文件:
- 以 .prototxt 结尾的模型结构定义文件
- 以 .caffemode 结尾的模型权重文件
- dataset.txt 包含数据路径的文本文件支持图像和NPY格式
以 lenet_caffe 为例,初始目录为:
```bash
lenet_caffe/
├── 0.jpg # 校准数据
├── dataset.txt # 指定数据地址的文件
├── lenet_caffe.caffemodel # caffe 模型权重
└── lenet_caffe.prototxt # caffe 模型结构
```
### tensorflow
转换 tenrsorflow 模型时,模型工程目录应包含以下文件:
- .pb 文件:冻结图模型文件
- inputs_outputs.txt输入输出节点定义文件
- dataset.txt数据路径配置文件
以 lenet 为例,初始目录为:
```bash
lenet/
├── 0.jpg # 校准数据
├── dataset.txt # 指定数据地址的文件
├── inputs_outputs.txt # 输入输出节点定义文件
└── lenet.pb # 冻结图模型文件
```
### darknet
转换Darknet模型需准备
- .cfg 文件:网络结构配置文件
- .weights 文件:训练权重文件
- .dataset.txt数据路径配置文件
以 yolov4_tiny 为例,初始目录为:
```bash
yolov4_tiny/
├── 0.jpg # 校准数据
├── dataset.txt # 指定数据地址的文件
├── yolov4_tiny.cfg # 网络结构配置文件
└── yolov4_tiny.weights # 预训练权重文件
```
### onnx
转换ONNX模型需准备
- .onnx 文件:网络模型
- dataset.txt数据路径配置文件
以 yolov5s 为例,初始目录为:
```bash
yolov5s/
├── 0.jpg # 校准数据
├── dataset.txt # 指定数据地址的文件
└── yolov5s.onnx # 网络模型
```

196
quickly_start.md Normal file
View File

@ -0,0 +1,196 @@
# 快速入门手册
本文档以 onnx 的 yolov5s 为例演示如何快速安装Nertans 并使用 Netrans 量化模型并生成 nbg 文件。
<font color="#dd0000">注意:</font> 在该项目中,项目下载目录为 `/home/nudt_dps/netrans`,在您应用的过程中,可以使用 `pwd` 来确认您的项目目录。
## 配置确认
在开始之前,请确保以下项目已经准备好
- 具有 pnna 芯片的板卡
- Ubuntu 20.04 或其他支持的操作系统
- Python 3.8 或其他支持的 Python 版本
- RAM 至少 8GB
## 安装Netrans
设置环境变量 NETRANS_PATH 并指向该 bin 目录。
<font color="#dd0000">注意:</font> 在该项目中,项目下载目录为 `/home/nudt_dps/netrans`,在您应用的过程中,可以使用 `pwd` 来确认您的项目目录。
```bash
export NETRANS_PATH=/home/nudt_dps/netrans/bin
```
同时设置LD_LIBRARY_PATH(Ubuntu其他系统根据具体情况设置)
```bash
export LD_LIBRARY_PATH=/home/nudt_dps/netrans/bin:$LD_LIBRARY_PATH
```
注意这一步每次使用前都需要执行,或者您可以写入 .bashrc (路径为 `~/.bashrc` )。
现在您可以在命令行中使用 Netrans 了!
如果您想使用 Netrans python api , 需要安装 netrans_py。
```bash
cd /home/nudt_dps/netrans/netrans_py
pip3 install -e .
```
## 使用 Netrans 转换 onnx 示例模型 yolov5s
Netrans 提供 tensorflow、caffe、darknet 和 onnx 的模型转换示例,本文档以 onnx 为例,为您演示如何使用 Netrans 进行模型环转。
使用 Netrans 进行模型量化,需要确保以下文件已经准备好并符合文件结构,具体请参考[introduction.md](introduction.md)。
examples 已经完成数据准备,可以使用下面命令进入目录执行。
```bash
cd netrans/
cd examples/onnx
cp ../../netrans_cli/*sh ./
```
此时目录如下:
```
onnx/
├── export.sh
├── gen_inputmeta.sh
├── import_model.sh
├── infer.sh
├── quantize.sh
└── yolov5s
├── 0.jpg
├── dataset.txt
└── yolov5s.onnx
```
### 使用 netrans_cli 转换 onnx 示例模型 yolov5s
#### 导入模型
```bash
./import_model.sh yolov5s
```
该步骤会生成 .json 结尾的网络结构文件和 .data 结尾的权重数据文件。
此时 yolov5s 的目录结构如下
```
yolov5s/
├── 0.jpg
├── dataset.txt
├── yolov5s.data
├── yolov5s.json
└── yolov5s.onnx
```
#### 生成配置文件
数据在推理前一般会经过预处理,为了确保模型可以正确的输入数据,需要生产对应的配置文件。
```bash
./gen_inputmeta.sh yolov5s
```
此时 yolov5s 的目录结构如下:
```
yolov5s/
├── 0.jpg
├── dataset.txt
├── yolov5s.data
├── yolov5s_inputmeta.yml
├── yolov5s.json
└── yolov5s.onnx
```
根据 yolov5s 的实际情况 我们需要修改yml中的 mean 为 0scale为 0.003921568627。
打开 ` yolov5s_inputmeta.yml ` 文件,
修改第30-33行为
```
scale:
- 0.003921568627
- 0.003921568627
- 0.003921568627
```
关闭并保存。
#### 量化模型
```bash
./quantize.sh yolov5s uint8
```
量化模型需要两个参数目录模型名字和量化类型。量化类型包括float int8和uint8。
此时 yolov5s 的目录结构如下:
```
yolov5s/
├── 0.jpg
├── dataset.txt
├── yolov5s_asymmetric_affine.quantize
├── yolov5s.data
├── yolov5s_inputmeta.yml
├── yolov5s.json
└── yolov5s.onnx
```
#### 导出模型
```bash
./export.sh yolov5s uint8
```
此时 yolov5s 的目录结构如下:
```
yolov5s/
├── 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_yolov5sasymmetricaffine.c
│ ├── vnn_yolov5sasymmetricaffine.h
│ ├── yolov5sasymmetricaffine.2012.vcxproj
│ ├── yolov5s_asymmetric_affine.export.data
│ └── yolov5sasymmetricaffine.vcxproj
├── yolov5s_asymmetric_affine.quantize
├── yolov5s.data
├── yolov5s_inputmeta.yml
├── yolov5s.json
└── yolov5s.onnx
```
### 使用 netrans_py 转换 onnx 示例模型 yolov5s
#### 安装netrans_py
```bash
cd netrans_py
pip3 install -e .
```
#### 准备示例脚本
```bash
cd ../example/onnx
cp ../../netrans_py/example.py ./
```
#### 运行示例脚本
```bash
python3 example.py yolov5s -q uint8 -m 0 -s 0.003921568627
```