182 lines
8.8 KiB
Markdown
182 lines
8.8 KiB
Markdown
# 命令行工具 netrans_cli 使用介绍
|
||
netrans_cli 是 netrans 进行模型转换的命令行工具,使用 ntrans_cli 完成模型转换的步骤如下:
|
||
1. 导入模型
|
||
2. 生成并修改前处理配置文件 *_inputmeta.yml
|
||
3. 量化模型
|
||
4. 导出模型
|
||
|
||
## netrans_cli 脚本介绍
|
||
|
||
|脚本|功能|使用|
|
||
|:---|---|---|
|
||
|import.sh| 模型导入功能,将模型转换成 pnna 支持的格式| import_model.sh model_name|
|
||
|config.sh| 预处理模版生成功能,生成预处理模版,根据模型进行对于的修改| config.sh model_name|
|
||
|quantize.sh| 量化功能, 对模型进行量化生成量化参数文件| quantize.sh model_name quantize_data_type|
|
||
|export.sh|导出功能,将量化好的模型导出成 pnna 上可以运行的runtime| export.sh model_name quantize_data_type|
|
||
|
||
## 数据准备
|
||
对于不同框架下训练的模型,需要准备不同的数据,所有的数据都需要放在同一个文件夹下。
|
||
模型名和文件名需要保持一致。
|
||
|
||
## import.sh 导入模型
|
||
|
||
使用 import.sh 导入模型
|
||
- 用法: import.sh 以模型文件名命名的模型数据文件夹,例如:
|
||
```bash
|
||
$ import.sh lenet
|
||
```
|
||
|
||
"lenet"是文件夹名,也作为模型名和权重文件名。导入会打印相关日志信息,成功后会打印SUCESS。导入后lenet文件夹应该有"lenet.json"和"lenet.data"文件:
|
||
|
||
```bash
|
||
$ ls -lrt lenet
|
||
total 3396
|
||
-rwxr-xr-x 1 hope hope 1727201 Nov 5 2018 lenet.pb
|
||
-rw-r--r-- 1 hope hope 553 Nov 5 2018 0.jpg
|
||
-rwxr--r-- 1 hope hope 6 Apr 21 17:04 dataset.txt
|
||
-rw-rw-r-- 1 hope hope 69 Jun 7 09:19 inputs_outputs.txt
|
||
-rw-r--r-- 1 hope hope 5553 Jun 7 09:21 lenet.json
|
||
-rw-r--r-- 1 hope hope 1725178 Jun 7 09:21 lenet.data
|
||
```
|
||
|
||
## config 生成 Inputmeta 文件
|
||
使用 config.sh 生成 inputmeta 文件
|
||
- config.sh 以模型文件名命名的模型数据文件夹,例如:
|
||
```bash
|
||
$ config.sh lenet
|
||
```
|
||
inputmeta 文件生成会打印相关日志信息,成功后会打印SUCESS。导入后lenet文件夹应该有 "lenet_inputmeta.yml" 文件:
|
||
```shell
|
||
$ ls -lrt lenet
|
||
total 3400
|
||
-rwxr-xr-x 1 hope hope 1727201 Nov 5 2018 lenet.pb
|
||
-rw-r--r-- 1 hope hope 553 Nov 5 2018 0.jpg
|
||
-rwxr--r-- 1 hope hope 6 Apr 21 17:04 dataset.txt
|
||
-rw-rw-r-- 1 hope hope 69 Jun 7 09:19 inputs_outputs.txt
|
||
-rw-r--r-- 1 hope hope 5553 Jun 7 09:21 lenet.json
|
||
-rw-r--r-- 1 hope hope 1725178 Jun 7 09:21 lenet.data
|
||
-rw-r--r-- 1 hope hope 948 Jun 7 09:35 lenet_inputmeta.yml
|
||
```
|
||
可以看到,最终生成的是*.yml文件,该文件用于为Netrans中间模型配置输入层数据集合。<b>Netrans中的量化、推理、导出和图片转dat的操作都需要用到这个文件。因此,此步骤不可跳过。</b>
|
||
|
||
可以看到,最终生成的是*.yml文件,该文件用于为Netrans中间模型配置输入层数据集合。<b>Netrans中的量化、推理、导出和图片转dat的操作都需要用到这个文件。因此,此步骤不可跳过。</b>
|
||
|
||
Inputmeta.yml文件结构如下:
|
||
```yaml
|
||
%YAML 1.2
|
||
---
|
||
# !!!This file disallow TABs!!!
|
||
# "category" allowed values: "image, undefined"
|
||
# "database" allowed types: "H5FS, SQLITE, TEXT, LMDB, NPY, GENERATOR"
|
||
# "tensor_name" only support in H5FS database
|
||
# "preproc_type" allowed types:"IMAGE_RGB, IMAGE_RGB888_PLANAR, IMAGE_RGB888_PLANAR_SEP,
|
||
IMAGE_I420,
|
||
# IMAGE_NV12, IMAGE_YUV444, IMAGE_GRAY, IMAGE_BGRA, TENSOR"
|
||
input_meta:
|
||
databases:
|
||
- path: dataset.txt
|
||
type: TEXT
|
||
ports:
|
||
- lid: data_0
|
||
category: image
|
||
dtype: float32
|
||
sparse: false
|
||
tensor_name:
|
||
layout: nhwc
|
||
shape:
|
||
- 50
|
||
- 224
|
||
- 224
|
||
- 3
|
||
preprocess:
|
||
reverse_channel: false
|
||
mean:
|
||
- 103.94
|
||
- 116.78
|
||
- 123.67
|
||
scale: 0.017
|
||
preproc_node_params:
|
||
preproc_type: IMAGE_RGB
|
||
add_preproc_node: false
|
||
preproc_perm:
|
||
- 0
|
||
- 1
|
||
- 2
|
||
- 3
|
||
- lid: label_0
|
||
redirect_to_output: true
|
||
category: undefined
|
||
tensor_name:
|
||
dtype: float32
|
||
shape:
|
||
- 1
|
||
- 1
|
||
|
||
```
|
||
|
||
上面示例文件的各个参数解释:
|
||
|
||
| 参数 | 说明 |
|
||
| :--- | ---
|
||
| input_meta | 预处理参数配置申明。 |
|
||
| databases | 数据配置,包括设置 path、type 和 ports 。|
|
||
| path | 数据集文件的相对(执行目录)或绝对路径。默认为 dataset.txt, 不建议修改。 |
|
||
| type | 数据集文件格式,固定为TEXT。 |
|
||
| ports | 指向网络中的输入或重定向的输入,目前只支持一个输入,如果网络存在多个输入,请与@ccyh联系。 |
|
||
| lid | 输入层的lid |
|
||
| category | 输入的类别。将此参数设置为以下值之一:image(图像输入)或 undefined(其他类型的输入)。 |
|
||
| dtype | 输入张量的数据类型,用于将数据发送到 pnna 网络的输入端口。支持的数据类型包括 float32 和 quantized。 |
|
||
| sparse | 指定网络张量是否以稀疏格式存在。将此参数设置为以下值之一:true(稀疏格式)或 false(压缩格式)。 |
|
||
| tensor_name | 留空此参数 |
|
||
| 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 | 预处理步骤和顺序。预处理支持下面的四个键,键的顺序代表预处理的顺序。您可以相应地调整顺序。 |
|
||
| reverse_channel | 指定是否保留通道顺序。将此参数设置为以下值之一:true(保留通道顺序)或 false(不保留通道顺序)。对于 TensorFlow 和 TensorFlow Lite 框架的模型使用 true。 |
|
||
| mean | 用于每个通道的均值。 |
|
||
| scale | 张量的缩放值。均值和缩放值用于根据公式 (inputTensor - mean) × scale 归一化输入张量。|
|
||
| preproc_node_params | 预处理节点参数,在 OVxlib C 项目案例中启用预处理任务 |
|
||
| 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(不直接发送到网络输出)|
|
||
|
||
可以根据实际情况对生成的inputmeta文件进行修改。
|
||
|
||
### 模型量化
|
||
如果我们训练好的模型的数据类型是float32的,为了使模型以更高的效率在pnna上运行,我们可以对模型进行量化操作,量化操作可能会带来一定程度的精度损失。
|
||
|
||
- 在netrans_cli目录下使用quantize.sh脚本进行量化操作。
|
||
|
||
用法:./quantize.sh 以模型文件名命名的模型数据文件夹 量化类型,例如:
|
||
|
||
```bash
|
||
$ quantize.sh lenet uint8
|
||
```
|
||
|
||
支持的量化类型有:uint8、int8、int16
|
||
|
||
### 模型导出
|
||
|
||
使用 export.sh 进行推理。
|
||
|
||
用法:export.sh 以模型文件名命名的模型数据文件夹 数据类型,例如:
|
||
|
||
```bash
|
||
export.sh lenet uint8
|
||
```
|
||
|
||
导出支持的数据类型:float、uint8、int8、int16,其中使用uint8、int8、int16导出时需要先进行模型量化。导出的工程会在模型所在的目录下面的wksp目录里。
|
||
network_binary.nb文件在"asymmetric_affine"文件夹中:
|
||
|
||
```shell
|
||
ls -lrt lenet/wksp/asymmetric_affine/
|
||
-rw-r--r-- 1 hope hope 694912 Jun 7 09:55 network_binary.nb
|
||
```
|
||
|
||
目前支持将生成的network_binary.nb文件部署到pnna硬件平台。具体部署方法请参阅模型部署相关文档。
|
||
|
||
## 使用实例
|
||
|
||
请参照examples,examples 提供 [caffe 模型转换示例](./examples/caffe_model.md),[darknet 模型转换示例](./examples/darknet_model.md),[tensorflow 模型转换示例](./examples/tensorflow_model.md),[onnx 模型转换示例](./examples/onnx_model.md)。
|