![]() |
||
---|---|---|
.. | ||
README.md | ||
config.sh | ||
example.py | ||
export.sh | ||
import.sh | ||
infer.sh | ||
quantize.sh |
README.md
命令行工具 netrans_cli 使用介绍
netrans_cli 是 netrans 进行模型转换的命令行工具,使用 ntrans_cli 完成模型转换的步骤如下:
- 导入模型
- 生成并修改前处理配置文件 *_inputmeta.yml
- 量化模型
- 导出模型
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 以模型文件名命名的模型数据文件夹,例如:
$ import.sh lenet
"lenet"是文件夹名,也作为模型名和权重文件名。导入会打印相关日志信息,成功后会打印SUCESS。导入后lenet文件夹应该有"lenet.json"和"lenet.data"文件:
$ 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 以模型文件名命名的模型数据文件夹,例如:
inputmeta 文件生成会打印相关日志信息,成功后会打印SUCESS。导入后lenet文件夹应该有 "lenet_inputmeta.yml" 文件:$ config.sh lenet
可以看到,最终生成的是*.yml文件,该文件用于为Netrans中间模型配置输入层数据集合。Netrans中的量化、推理、导出和图片转dat的操作都需要用到这个文件。因此,此步骤不可跳过。$ 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中间模型配置输入层数据集合。Netrans中的量化、推理、导出和图片转dat的操作都需要用到这个文件。因此,此步骤不可跳过。
Inputmeta.yml文件结构如下:
%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 以模型文件名命名的模型数据文件夹 量化类型,例如:
$ quantize.sh lenet uint8
支持的量化类型有:uint8、int8、int16
模型导出
使用 export.sh 进行推理。
用法:export.sh 以模型文件名命名的模型数据文件夹 数据类型,例如:
export.sh lenet uint8
导出支持的数据类型:float、uint8、int8、int16,其中使用uint8、int8、int16导出时需要先进行模型量化。导出的工程会在模型所在的目录下面的wksp目录里。 network_binary.nb文件在"asymmetric_affine"文件夹中:
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 模型转换示例,darknet 模型转换示例,tensorflow 模型转换示例,onnx 模型转换示例。