netrans/netrans_cli
xujiao 7e737e423b Align commands with the CLI 2025-04-09 11:27:25 +08:00
..
README.md Align commands with the CLI 2025-04-09 11:27:25 +08:00
config.sh 重命名脚本 2025-04-08 15:42:40 +08:00
example.py update netrans_cli 2025-04-09 10:45:36 +08:00
export.sh update netrans_cli 2025-04-09 10:45:36 +08:00
import.sh 重命名脚本 2025-04-08 15:42:40 +08:00
infer.sh 增加配置环境脚本;修改netrans_cli脚本,支持传入多级目录; 2025-04-08 15:07:25 +08:00
quantize.sh 增加配置环境脚本;修改netrans_cli脚本,支持传入多级目录; 2025-04-08 15:07:25 +08:00

README.md

命令行工具 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 以模型文件名命名的模型数据文件夹,例如:

    $ 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 以模型文件名命名的模型数据文件夹,例如:
    $ config.sh lenet
    
    inputmeta 文件生成会打印相关日志信息成功后会打印SUCESS。导入后lenet文件夹应该有 "lenet_inputmeta.yml" 文件:
     $ 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的操作都需要用到这个文件。因此此步骤不可跳过。

可以看到,最终生成的是*.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硬件平台。具体部署方法请参阅模型部署相关文档。

使用实例

请参照examplesexamples 提供 caffe 模型转换示例,darknet 模型转换示例,tensorflow 模型转换示例,onnx 模型转换示例