netrans/netrans_cli/README.md

193 lines
8.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# netrans_cli 使用
netrans_cli 是 netrans 进行模型转换的命令行工具,使用 ntrans_cli 完成模型转换的步骤如下:
1. 导入模型
2. 生成并修改前处理配置文件 *_inputmeta.yml
3. 量化模型
4. 导出模型
## netrans_cli 脚本
|脚本|功能|使用|
|:---|---|---|
|load.sh| 模型导入功能,将模型转换成 Pnna 支持的格式| load.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|
<font color="#dd0000">对于不同框架下训练的模型,需要准备不同的数据,所有的数据都需要与模型放在同一个文件夹下,模型文件名和文件夹名需要保持一致。</font>
## load.sh 模型导入
使用 load.sh 导入模型
- 用法: load.sh 以模型文件名命名的模型数据文件夹,例如:
```bash
load.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.sh 预处理配置文件生成
使用 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>
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
```
上面示例文件的各个参数解释:
```{table}
:widths: 20, 80
:align: left
| 参数 | 说明 |
| :--- | --- |
| 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文件进行修改。
## quantize.sh 模型量化
如果我们训练好的模型的数据类型是float32的为了使模型以更高的效率在Pnna上运行我们可以对模型进行量化操作量化操作可能会带来一定程度的精度损失。
- 在netrans_cli目录下使用quantize.sh脚本进行量化操作。
用法:./quantize.sh 以模型文件名命名的模型数据文件夹 量化类型,例如:
```bash
quantize.sh lenet uint8
```
支持的量化类型有uint8、int8、int16
## export.sh 模型导出
使用 export.sh 导出模型生成nbg文件。
用法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硬件平台。具体部署方法请参阅模型部署相关文档。
## 使用示例
请参照examplesexamples 提供 [caffe 模型转换示例](./examples/caffe_model.md),[darknet 模型转换示例](./examples/darknet_model.md),[tensorflow 模型转换示例](./examples/tensorflow_model.md),[onnx 模型转换示例](./examples/onnx_model.md)。