netrans/introduction.md

8.1 KiB
Raw Blame History

模型转换简介

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 的模型转换示例

注意:运行 Netrans 的计算机应该满足以下要求。

资源 描述
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
注意:不推荐使用其他版本

安装

  • 确保Python 3.8环境配置完成

  • 使用apt安装“build-essential”

    sudo apt update
    sudo apt install build-essential
    
  • 计算机需要满足上面描述的硬件需求

执行以下命令安装 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

Netrans 工作流程介绍。

Netrans 工作流程如下:

    1. 导入并转换模型到中间模型文件
    1. 生成 inputmeta 文件
    1. 量化模型
    1. 导出模型应用部署程序工程,以便部署到硬件。

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 支持官网列出 darknet 模型

注意: 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 为例,初始目录为:

lenet_caffe/
├── 0.jpg                   # 校准数据
├── dataset.txt             # 指定数据地址的文件
├── lenet_caffe.caffemodel  # caffe 模型权重
└── lenet_caffe.prototxt    # caffe 模型结构

tensorflow

转换 tenrsorflow 模型时,模型工程目录应包含以下文件:

  • .pb 文件:冻结图模型文件
  • inputs_outputs.txt输入输出节点定义文件
  • dataset.txt数据路径配置文件

以 lenet 为例,初始目录为:

lenet/
├── 0.jpg                # 校准数据
├── dataset.txt          # 指定数据地址的文件 
├── inputs_outputs.txt   # 输入输出节点定义文件
└── lenet.pb             # 冻结图模型文件

darknet

转换Darknet模型需准备

  • .cfg 文件:网络结构配置文件
  • .weights 文件:训练权重文件
  • .dataset.txt数据路径配置文件

以 yolov4_tiny 为例,初始目录为:

yolov4_tiny/
├── 0.jpg                 # 校准数据
├── dataset.txt           # 指定数据地址的文件 
├── yolov4_tiny.cfg       # 网络结构配置文件
└── yolov4_tiny.weights   # 预训练权重文件

onnx

转换ONNX模型需准备

  • .onnx 文件:网络模型
  • dataset.txt数据路径配置文件

以 yolov5s 为例,初始目录为:

yolov5s/
├── 0.jpg          # 校准数据
├── dataset.txt    # 指定数据地址的文件 
└── yolov5s.onnx   # 网络模型