PTQ 原理及步骤详解
简介
模型转换是指将原始浮点模型转换为 D-Robotics 混合异构模型的过程。原始浮点模型(文中部分地方也称为浮点模型)是指您通过 TensorFlow/PyTorch 等 DL 框架训练得到的可用模型,这个模型的计算精度为 float32;混合异构模型是一种适合在 D-Robotics 处理器上运行的模型格式。 本章节将反复使用到这两种模型名词,为避免理解歧义,请先理解这个概念再阅读下文。
配合 D-Robotics 算法工具链的模型完整开发过程,需要经过 浮点模型准备、 模型验证、 模型转换、 性能评估 和 精度评估 共五个重要阶段,如下图:

浮点模型准备 本阶段用来确保原始浮点模型的格式为 D-Robotics 模型转换工具支持的格式,原始 浮点模型来自于您通过 TensorFlow/PyTorch 等 DL 框架训练得到可用模型。具体的浮点模型要求与建议,请阅读浮点模型准备章节内容。
模型验证 本阶段用来校验原始浮点模型是否满足 D-Robotics 算法工具链的要求。D-Robotics 提供 hb_mapper checker 检查工具来完成浮点模型的检查。具体使用方法,请阅读验证模型 章节内容。
模型转换 本阶段用来完成浮点模型到 D-Robotics 混合异构模型的转换,经过这个阶段,您将得到一个可以在 D-Robotics 处理器上运行的模型。D-Robotics 提供 hb_mapper makertbin 转换工具来完成模型优化、量化和编译等关键步骤。具体使用方法,请阅读模型转换章节内容。
性能评估 本阶段主要用于测评 D-Robotics 混合异构模型的推理性能情况,D-Robotics 提供了模型性能评估的工具,您可以使用这些工具验证模型性能是否达到应用要求。具体使用说明,请阅读 模型性能分析与调优章节内容。
精度评估 本阶段主要用于测评 D-Robotics 混合异构模型的推理精度情况,D-Robotics 提供了模型精度评估的工具。具体使用说明,请阅读模型精度分析与调优章节内容。
模型准备
基于公开 DL 框架训练得到的浮点模型是 D-Robotics 模型转换工具的输入,目前转换工具支持的 DL 框架如下:
| 框架 | Caffe | PyTorch | TensorFlow | MXNet | PaddlePaddle |
|---|---|---|---|---|---|
| D-Robotics 工具链 | 支持 | 支持(转 ONNX) | 支持(转 ONNX) | 支持(转 ONNX) | 支持(转 ONNX) |
以上框架中, Caffe 框架导出的 caffemodel 是直接支持的,PyTorch、TensorFlow 和 MXNet 等 DL 框架通过转换到 ONNX 格式间接支持。
对于不同框架到 ONNX 的转换,目前都有对应的标准化方案,参考如下:
-
Pytorch2Onnx:PytTorch 官方 API 支持直接将模型导出为 ONNX 模型,参考链接: https://pytorch.org/tutorials/advanced/super_resolution_with_onnxruntime.html
-
Tensorflow2Onnx:基于 ONNX 社区的 onnx/tensorflow-onnx 进行转换,参考链接: https://github.com/onnx/tensorflow-onnx
-
MXNet2Onnx:MXNet 官方 API 支持直接将模型导出为 ONNX 模型,参考链接: https://github.com/dotnet/machinelearning/blob/main/test/Microsoft.ML.Tests/OnnxConversionTest.cs
-
更多框架的 ONNX 转换支持,参考链接: https://github.com/onnx/tutorials#converting-to-onnx-format
关于 Pytorch、PaddlePaddle、TensorFlow2 框架的模型,我们也提供了如何导出 ONNX 及模型可视化的教程,请参考:
-
浮点模型中所使用的算子需要符合 D-Robotics 算法工具链的算子约束条件,具体请阅读 模型算子支持列表 章节进行查询。
-
目前转换工具仅支持输出个数小于或等于 32 的模型进行转换。
-
支持
caffe 1.0版本的caffe浮点模型和ir_version≤7,opset=10、opset=11版本的 onnx 浮点模型量化成 D-Robotics 支持的定点模型, onnx 模型的 ir_version 与 onnx 版本的对应关系请参考onnx 官方文档 ; -
模型输入维度只支持
固定4维输入 NCHW 或 NHWC(N 维度只能为 1),例如:1x3x224x224 或 1x224x224x3, 不支持动态维度及非 4 维输入; -
浮点模型中不要包含有
后处理算子,例如:nms 算子。
模型验证
模型正式转换前,请先使用 hb_mapper checker 工具进行模型验证,确保其符合 D-Robotics 处理器的支持约束。
建议参考使用 D-Robotics 模型转换 horizon_model_convert_sample 示例包中的caffe、onnx等示例模型的脚本方法: 01_check_X3.sh。
使用 hb_mapper checker 工具验证模型
hb_mapper checker 工具的使用方式如下:
hb_mapper checker --model-type ${model_type} \
--march ${march} \
--proto ${proto} \
--model ${caffe_model/onnx_model} \
--input-shape ${input_node} ${input_shape} \
--output ${output}
hb_mapper checker 参数解释:
--model-type
用于指定检查输入的模型类型,目前只支持设置 caffe 或者 onnx。
--march
用于指定需要适配的 D-Robotics 处理器类型,可设置值为 bernoulli2 和 bayes;RDK X3设置为 bernoulli2,RDK X5设置为 bayes-e。
--proto
此参数仅在 model-type 指定 caffe 时有效,取值为 Caffe 模型的 prototxt 文件名称。
--model
在 model-type 被指定为 caffe 时,取值为 Caffe 模型的 caffemodel 文件名称。
在 model-type 被指定为 onnx 时,取值为 ONNX 模型文件名称。
--input-shape
可选参数,明确指定模型的输入 shape。
取值为 {input_name} {NxHxWxC/NxCxHxW} ,input_name 与 shape 之间以空格分隔。
例如模型输入名称为 data1,输入shape为 [1,224,224,3],
则配置应该为 --input-shape data1 1x224x224x3。
如果此处配置 shape 与模型内 shape 信息不一致,以此处配置为准。
注意一个 --input-shape 只接受一个 name 和 shape 组合,如果您的模型有多个输入节点,
在命令中多次配置 --input-shape 参数即可。
--output 参数已经废弃,log 信息默认存储于 hb_mapper_checker.log 中。
检查异常处理
如果模型检查步骤异常终止或者出现报错信息,则说明模型验证不通过,请根据终端打印或在当前路径下生成的 hb_mapper_checker.log 日志文件确认报错信息和修改建议。
例如:以下配置中含不可识别算子类型 Accuracy:
layer {
name: "data"
type: "Input"
top: "data"
input_param { shape: { dim: 1 dim: 3 dim: 224 dim: 224 } }
}
layer {
name: "Convolution1"
type: "Convolution"
bottom: "data"
top: "Convolution1"
convolution_param {
num_output: 128
bias_term: false
pad: 0
kernel_size: 1
group: 1
stride: 1
weight_filler {
type: "msra"
}
}
}
layer {
name: "accuracy"
type: "Accuracy"
bottom: "Convolution3"
top: "accuracy"
include {
phase: TEST
}
}
使用 hb_mapper checker 检查这个模型,您会在 hb_mapper_checker.log 中得到如下信息:
ValueError: Not support layer name=accuracy type=Accuracy
- 如果模型检查步骤异常终止或者出现报错信息,则说明模型验证不通过,请根据终端打印或在当前路径下生成的
hb_mapper_checker.log日志文件确认报错信息和修改建议,错误信息可以在 模型量化错误及解决方法 章节来查找错误的解决方法,若以上步骤仍不能排除问题,请联系 D-Robotics 技术支持团队或在D-Robotics 官方技术社区提出您的问题,我们将在 24 小时内给您提供支持。
检查结果解读
如果不存在 ERROR,则顺利通过校验。 hb_mapper checker 工具将直接输出如下信息:
==============================================
Node ON Subgraph Type
----------
conv1 BPU id(0) HzSQuantizedConv
conv2_1/dw BPU id(0) HzSQuantizedConv
conv2_1/sep BPU id(0) HzSQuantizedConv
conv2_2/dw BPU id(0) HzSQuantizedConv
conv2_2/sep BPU id(0) HzSQuantizedConv
conv3_1/dw BPU id(0) HzSQuantizedConv
conv3_1/sep BPU id(0) HzSQuantizedConv
...
结果中每行都代表一个模型节点的 check 情况,每行含 Node、ON、Subgraph 和 Type 四列,分别为节点名称、执行节点计算的硬件、节点所属子图和节点映射到的 D-Robotics 算子名称。 如果模型在网络结构中出现了 CPU 计算的算子,hb_mapper checker 工具将把这个算子前后连续在 BPU 计算的部分拆分为两个 Subgraph(子图)。
检查结果的调优指导
在最理想的情况下,模型网络结构中的算子都应该在 BPU 上运行,也就是只有一个子图。 如果出现了 CPU 算子导致拆分多个子图, hb_mapper checker 工具会给出导致 CPU 算子出现的具体原因,以下给出了在 RDK X3 上示例模型验证的情况;
- 以下在 RDK X3 上运行的 Caffe 模型出现了 Reshape + Pow + Reshape 的结构, 从 RDK X3 的算子约束列表中我们可以看到, Reshape 算子目前为在 CPU 上运行的算子, 而 Pow 的 shape 也是非 4 维的,不符合 X3 BPU 算子约束条件。

因此模型最终检查结果也会出现分段情况, 如下:
2022-05-25 15:16:14,667 INFO The converted model node information:
====================================================================================
Node ON Subgraph Type
-------------
conv68 BPU id(0) HzSQuantizedConv
sigmoid16 BPU id(0) HzLut
axpy_prod16 BPU id(0) HzSQuantizedMul
UNIT_CONV_FOR_eltwise_layer16_add_1 BPU id(0) HzSQuantizedConv
prelu49 BPU id(0) HzPRelu
fc1 BPU id(0) HzSQuantizedConv
fc1_reshape_0 CPU -- Reshape
fc_output/square CPU -- Pow
fc_output/sum_pre_reshape CPU -- Reshape
fc_output/sum BPU id(1) HzSQuantizedConv
fc_output/sum_reshape_0 CPU -- Reshape
fc_output/sqrt CPU -- Pow
fc_output/expand_pre_reshape CPU -- Reshape
fc_output/expand BPU id(2) HzSQuantizedConv
fc1_reshape_1 CPU -- Reshape
fc_output/expand_reshape_0 CPU -- Reshape
fc_output/op CPU -- Mul
根据 hb_mapper checker 给出的提示,一般来说算子运行在 BPU 上会有更好的性能表现,这里可以将 pow、reshape 这类 CPU 算子从模型中移除,将对应算子的功能放入后处理中计算,从而减少子图数量。
当然,多个子图也不会影响整个转换流程,但会较大程度地影响模型性能,建议尽量调整模型算子到 BPU 上执行,可参考 D-Robotics 处理器算子支持列表中的 BPU 算子支持列表来做同功能的算子替换或者将模型中的 CPU 算子移到模型推理的前、后处理中去做 CPU 计算。
模型转换
模型转换阶段会完成浮点模型到 D-Robotics 混合异构模型的转换,经过这个阶段,您将得到一个可以在 D-Robotics 处理器上运行的模型。 在进行转换之前,请确保已经顺利通过了上文的验证模型过程。
模型转换使用 hb_mapper makertbin 工具完成,转换期间会完成模型优化和校准量化等重要过程,校准需要依照模型预处理要求准备校准数据。
为了方便您全面了解模型转换,本节将依次介绍校准数据准备、转换工具使用、转换内部过程解读、转换结果解读和转换产出物解读等内容。
准备校准数据
在进行模型转换时,校 准阶段会需要 100 份左右 标定样本输入,每一份样本都是一个独立的数据文件。 为了确保转换后模型的精度效果,我们希望这些校准样本来自于您训练模型使用的 训练集或验证集 ,不要使用非常少见的异常样本,例如 纯色图片、不含任何检测或分类目标的图片等。
转换配置文件中的 preprocess_on 参数,该参数启用和关闭状态下分别对应了两种不同的预处理样本要求。
(有关参数的详细配置可参考下文校准参数组中相关说明)
preprocess_on 关闭状态下,您需要把取自训练集/验证集的样本做与模型推理(inference)前一样的前处理,
处理完后的校准样本会与原始模型具备一样的数据类型( input_type_train )、尺寸( input_shape )和
layout( input_layout_train ),对于featuremap输入的模型,您可以通过 numpy.tofile 命令将数据保存为 float32 格式的二进制文件,
工具链校准时会基于 numpy.fromfile 命令进行读取。
例如,使用 ImageNet 训练的用于分类的原始浮点模型,它只有一个输入节点,输入信息描述如下:
- 输入类型:
BGR - 输入 layout:
NCHW - 输入尺寸:
1x3x224x224
使用验证集做模型推理(inference)时的数据预处理如下:
- 图像长宽等比 scale,短边缩放到 256。
center_crop方法获取 224x224 大小图像。- 按通道减 mean。
- 数据乘以 scale 系数。
针对上述举例模型的样本处理代码如下:
为避免过长代码篇幅,各种简单 transformer 实现代码未贴出,具体使用请参考transformer 使用方法 章节内容。
建议参考使用 D-Robotics 模型转换 horizon_model_convert_sample 示例包中的caffe、onnx等示例模型的预处理步骤方法: 02_preprocess.sh 和 preprocess.py 。
# 本示例使用skimage,如果是opencv会有所区别
# 需要您特别注意的是,transformers中并没有体现减mean和乘scale的处理
# mean和scale操作已经融合到了模型中,请参考下文norm_type/mean_value/scale_value配置
def data_transformer():
transformers = [
# 长宽等比scale,短边缩放至256
ShortSideResizeTransformer(short_size=256),
# CenterCrop获取224x224图像
CenterCropTransformer(crop_size=224),
# skimage读取结果为NHWC排布,转换为模型需要的NCHW
HWC2CHWTransformer(),
# skimage读取结果通道顺序为RGB,转换为模型需要的BGR
RGB2BGRTransformer(),
# skimage读取数值范围为[0.0,1.0],调整为模型需要的数值范围
ScaleTransformer(scale_value=255)
]
return transformers
# src_image 标定集中的原图片
# dst_file 存放最终标定样本数据的文件名称
def convert_image(src_image, dst_file, transformers):
image = skimage.img_as_float(skimage.io.imread(src_file))
for trans in transformers:
image = trans(image)
# 模型指定的input_type_train BGR数值类型是UINT8
image = image.astype(np.uint8)
# 二进制存储标定样本到数据文件
image.tofile(dst_file)
if __name__ == '__main__':
# 此处表示原始标定图片集合,伪代码
src_images = ['ILSVRC2012_val_00000001.JPEG',...]
# 此处表示最终标定文件名称(后缀名不限制),伪代码
# calibration_data_bgr_f32是您在配置文件中指定的cal_data_dir
dst_files = ['./calibration_data_bgr_f32/ILSVRC2012_val_00000001.bgr',...]
transformers = data_transformer()
for src_image, dst_file in zip(src_images, dst_files):
convert_image(src_image, dst_file, transformers)
preprocess_on 启用状态下,标定样本使用 skimage 支持读取的图片格式文件即可。
转换工具读取这些图片后,会将其缩放到模型输入节点要求的尺寸大小,以此结果作为校准的输入。
这样的操作会简单,但是对于量化的精度没有保障,因此我们强烈建议您使用关闭 preprocess_on 的方式。
请注意,yaml 文件中 input_shape 参数作用为指定原始浮点模型的输入数据尺寸。若为动态输入模型则可通过这个参数设置转换后的输入大小,而校准数据的 shape 大小应与 input_shape 保持一致。
例如:若原始浮点模型输入节点 shape 为?x3x224x224(“?”号代表占位符,即该模型第一维为动态输入), 转换配置文件中设置 input_shape: 8x3x224x224,则用户需要准备的每份校准数据大小为 8x3x224x224。 (请知悉,此类输入 shape 第一维不等于 1 的模型,不支持通过 input_batch 参数修改模型 batch 信息。)
使用 hb_mapper makertbin 工具转换模型
hb_mapper makertbin 提供两种模式,开启 fast-perf 模式和不开启 fast-perf 模式。
fast-perf 模式开启后,会在转换过程中生成可以在板端运行最高性能的 bin 模型,工具内部主要进行以下操作:
-
将 BPU 可执行算子尽可能运行在 BPU 上(若使用
RDK X5则可以通过yaml文件中node_info参数指定在BPU上运行的算子,RDK X3是自动优化,无法通过 yaml 配置文件指定算子)。 -
删除模型首尾不可删除的 CPU 算子,包括:Quantize/Dequantize、Transpose、Cast、Reshape 等。
-
以性能最高的 O3 优化等级编译模型。
建议参考使用 D-Robotics 模型转换 horizon_model_convert_sample 示例包中的caffe、onnx等示例模型的脚本方法: 03_build_X3.sh。
hb_mapper makertbin 命令使用方式如下:
不开启 fast-perf 模式:
hb_mapper makertbin --config ${config_file} \
--model-type ${model_type}
开启 fast-perf 模式:
hb_mapper makertbin --fast-perf --model ${caffe_model/onnx_model} --model-type ${model_type} \
--proto ${caffe_proto} \
--march ${march}
hb_mapper makertbin 参数解释:
--help
显示帮助信息并退出。
-c, --config
模型编译的配置文件,为 yaml 格式,文件名使用.yaml 后缀,完整的配置文件模板参考如下章节内容。
--model-type
用于指定转换输入的模型类型,目前支持设置 caffe 或者 onnx。
--fast-perf
开启 fast-perf 模式,该模式开启后,会在转换过程中生成可以在板端运行最高性能的 bin 模型,方便您用于后续的模型性能评测。
如您开启了 fast-perf 模式,还需要进行如下配置:
--model
Caffe 或 ONNX 浮点模型文件。
--proto
用于指定 Caffe 模型 prototxt 文件。
--march
BPU 的微架构。若使用 RDK X3 则设置为 bernoulli2,若使用 RDK X5 则设置为 bayes-e。
-
RDK X3 yaml配置文件,可直接使用RDK X3 Caffe 模型量化 yaml 文件模板 和RDK X3 ONNX 模型量化 yaml 文件模板模板文件进行填写。 -
RDK X5 yaml配置文件,可直接使用RDK X5 Caffe 模型量化 yaml 文件模板 和RDK X5 ONNX 模型量化 yaml 文件模板模板文件进行填写。 -
若 hb_mapper makertbin 步骤异常终止或者出现报错信息,则说明模型转换失败,请根据终端打印或在当前路径下生成的
hb_mapper_makertbin.log日志文件确认报错信息和修改建议,错误信息可以在 模型量化错误及解决方法章节来查找错误的解决方法,若以上步骤仍不能排除问题,请联系 D-Robotics 技术支持团队或在D-Robotics 官方技术社区提出您的问题,我们将在 24 小时内给您提供支持。
模型转换 yaml 配置参数说明
要么是 Caffe 模型,要么是 ONNX 模型。即 caffe_model + prototxt 或者 onnx_model 二选一。
即,要么是 Caffe 模型,要么是 ONNX 模型。
# 模型参数组
model_parameters:
# 原始Caffe浮点模型描述文件
prototxt: '***.prototxt'
# 原始Caffe浮点模型数据模型文件
caffe_model: '****.caffemodel'
# 原始Onnx浮点模型文件
onnx_model: '****.onnx'
# 转换的目标处理器架构,保持默认,D-Robotics RDK X3使用的是bernoulli2架构, RDK X5使用的是bayes-e架构。march: 'bayes-e'
march: 'bernoulli2'
# 模型转换输出的用于上板执行的模型文件的名称前缀
output_model_file_prefix: 'mobilenetv1'
# 模型转换输出的结果的存放目录
working_dir: './model_output_dir'
# 指定转换后混合异构模型是否保留输出各层的中间结果的能力,保持默认即可
layer_out_dump: False
# 指定模型的输出节点
output_nodes: {OP_name}
# 批量删除某一类型的节点
remove_node_type: Dequantize
# 删除指定名称的节点
remove_node_name: {OP_name}
# 输入信息参数组
input_parameters:
# 原始浮点模型的输入节点名称
input_name: "data"
# 原始浮点模型的输入数据格式(数量/顺序与input_name一致)
input_type_train: 'bgr'
# 原始浮点模型的输入数据排布(数量/顺序与input_name一致)
input_layout_train: 'NCHW'
# 原始浮点模型的输入数据尺寸
input_shape: '1x3x224x224'
# 网络实际执行时,输入给网络的batch_size, 默认值为1
input_batch: 1
# 在模型中添加的输入数据预处理方法
norm_type: 'data_mean_and_scale'
# 预处理方法的图像减去的均值, 如果是通道均值,value之间必须用空格分隔
mean_value: '103.94 116.78 123.68'
# 预处理方法的图像缩放比例,如果是通道缩放比例,value之间必须用空格 分隔
scale_value: '0.017'
# 转换后混合异构模型需要适配的输入数据格式(数量/顺序与input_name一致)
input_type_rt: 'yuv444'
# 输入数据格式的特殊制式
input_space_and_range: 'regular'
# 转换后混合异构模型需要适配的输入数据排布(数量/顺序与input_name一致),若input_type_rt配置为nv12,则此处参数不需要配置
input_layout_rt: 'NHWC'
# 校准参数组
calibration_parameters:
# 模型校准使用的标定样本的存放目录
cal_data_dir: './calibration_data'
# 指定校准数据二进制文件的数据存储类型。
cal_data_type: 'float32'
# 开启图片校准样本自动处理(skimage read; resize到输入节点尺寸)
#preprocess_on: False
# 校准使用的算法类型, 优先使用的 default 校准算法
calibration_type: 'default'
# max 校准方式的参数
# max_percentile: 1.0
# 强制指定OP在CPU上运行,一般不需要配置,在模型精度调优阶段可以开启此功能,用于尝试精度优化
#run_on_cpu: {OP_name}
# 强制指定OP在BPU上运行, 一般不需要配置,在模型性能调优阶段可以开启此功能,用于尝试性能优化
# run_on_bpu: {OP_name}
# 指定是否针对每个channel进行校准
#per_channel: False
# 指定输出节点的数据精度
#optimization: set_model_output_int8
# 编译参数组
compiler_parameters:
# 编译策略选择
compile_mode: 'latency'
# 是否打开编译的debug信息,保持默认的 False
debug: False
# 模型运行核心数
core_num: 1
# 模型编译的优化等级选择,保持默认的 O3
optimize_level: 'O3'
# 指定名称为data的输入数据来源
#input_source: {"data": "pyramid"}
# 指定模型的每个function call的最大可连续执行时间
#max_time_per_fc: 1000
# 指定编译模型时的进程数
#jobs: 8
# 此参数组,无需配置,只在有自定义CPU算子时开启使用
#custom_op:
# 自定义op的校准方式, 推荐使用注册方式 register
#custom_op_method: register
# 自定义OP的实现文件, 多个文件可用";"分隔, 该文件可由模板生成, 详情见自定义OP相关文档
#op_register_files: sample_custom.py
# 自定义OP实现文件所在的文件夹, 请使用相对路径
#custom_op_dir: ./custom_op
配置文件主要包含模型参数组、输入信息参数组、校准参数组和编译参数组。 在您的配置文件中,四个参数组位置都需要存在,具体参数分为可选和必选,可选参数可以不配置。
具体参数的设置形式为: param_name: 'param_value' ;
若参数存在多个值时,每个值之间使用 ';' 符号进行分隔: param_name: 'param_value1; param_value2; param_value3' ;具体配置方法可参考:run_on_cpu: 'conv_0; conv_1; conv12' 。
-
当模型为多输入模型时, 建议用户将可选参数(
input_name,input_shape等)显式的写出, 以免造成参数对应顺序上的错误。 -
在配置 march 为 bayes-e,即在进行 RDK X5 模型转换时,如您将优化等级 optimize_level 配置为 O3,hb_mapper makerbin 默认提供缓存能力。即在您第一次使用 hb_mapper makerbin 对模型进行编译时,会自动创建缓存文件,后续在您的 working_dir 不变的情况下,在重复编译时会自动调用此文件,降低您的编译时间。
- 请注意,如果设置
input_type_rt为nv12或yuv444,则模型的输入尺寸中不能出现奇数。 - 请注意,目前 RDK X3 上暂不支持
input_type_rt为yuv444且input_layout_rt为NCHW组合的场景。 - 模型转换成功后,若出现符合 D-Robotics BPU 算子约束条件的 OP 仍然运行在 CPU 上,其主要原因是该 OP 属于被动量化 OP,关于被动量化相关内容,请阅读 算法工具链中的主动量化和被动量化逻辑 章节。
以下是具体参数信息,参数会比较多,我们依照上述的参数组次序介绍。
-
模型参数组
| 参数名称 | 参数配置说明 | 取值范围说明 | 可选/必选 |
|---|---|---|---|
prototxt | 参数作用:指定Caffe浮点模型的prototxt文件名称。 参数说明:在 hb_mapper makertbin的model-type 为 caffe 时必须配置。 | 取值范围:无。 默认配置:无。 | 可选 |
caffe_model | 参数作用:指定Caffe浮点模型的caffemodel文件名称。 参数说明:在 hb_mapper makertbin 的model-type 为 caffe 时必须配置。 | 取值范围:无。 默认配 置:无。 | 可选 |
onnx_model | 参数作用:指定ONNX浮点模型的onnx文件名称。 参数说明:在 hb_mapper makertbin 的model-type 为 onnx 时必须配置。 | 取值范围:无。 默认配置:无。 | 可选 |
march | 参数作用:指定产出混合异构模型需要支持的平台架构。 参数说明:两个可选配置值依次对应RDK X3 和 RDK Ultra 对应的BPU微框架。根据您使用的平台选择。 | 取值范围:bernoulli2 或 bayes。默认配置:无。 | 必选 |
output_model_file_prefix | 参数作用:指定转换产出混合异构模型的名称前缀。 参数说明:输出的定点模型文件的名称前缀。 | 取值范围:无。 默认配置:无。 | 必选 |
working_dir | 参数作用:指定模型转换输出的结果的存放目录。 参数说明:若该目录不存在, 则工具会自动创建目录。 | 取值范围:无。 默认配置: model_output。 | 可选 |
layer_out_dump | 参数作用:指定混合异构模型是否保留输出中间层值的能力。 参数说明:输出中间层的值是调试需要用到的手段,常规状态下请不要开启。 | 取值范围:True 、 False。默认配置: False。 | 可选 |
output_nodes | 参数作用:指定模型的输出节点。 参数说明:一般情况下,转换工具会自动识别模型的输出节点。此参数用于支持您指定一些中间层次作为输出。设置值为模型中的具体节点名称,多个值的配置方法请参考前文对 param_value 配置描述。需要您注意的是,一旦设置此参数后,工具将不再自动识别输出节点,您通过此参数指定的节点就是全部的输出。 | 取值范围:无。 默认配置:无。 | 可选 |
remove_node_type | 参数作用:设置删除节点的类型。 参数说明:该参数为隐藏参数,不设置或设置为空不影响模型转换过程。此参数用于支持您设置待删除节点的类型信息。被删除的节点必须在模型的开头或者末尾, 与模型的输入或输出连接。注意:待删除节点会按顺序依次删除,并动态更新模型结构;同时在节点删除前还会判断该节点是否位于模型的输入输出处。因此节点的删除顺序很重要。 | 取值范围:”Quantize”, “Transpose”, “Dequantize”, “Cast”, “Reshape”。不同类型用”;”分割。 默认配置:无。 | 可选 |
remove_node_name | 参数作用:设置删除节点的名称。 参数说明:该参数为隐藏参数, 不设置或设置为空不影响模型转换过程。 此参数用于支持您设置待删除节点的名称。被删除的节点必须在模型的开头或者末尾, 与模型的输入或输出连接。注意:待删除节点会按顺序依次删除,并动态更新模型结构;同时在节点删除前还会判断该节点是否位于模型的输入输出处。因此节点的删除顺序很重要。 | 取值范围:无。不同类型用";"分割。 默认配置:无。 | 可选 |
set_node_data_type | 参数作用:配置指定op的输出数据类型为int16,此参数 只支持RDK Ultra和RDK X5配置! 参数说明:在模型转换过程中,大多数op的默认输入输出数据类型为int8,通过该参数可以指定特定op的输出数据类型为int16(在满足一定的约束条件下)。int16相关说明详见:int16配置说明部分的描述。 注意: 该参数相关功能已合并至 node_info 参数中,后续版本计划废弃。 | 取值范围:支持配置 int16 的算子范围您可参考模型算子支持列表中 RDK Ultra 和 RDK X5 算子支持约束列表。 默认配置:无。 | 可选 |
debug_mode | 参数作用:保存用于精度debug分析的校准数据。 参数说明:该参数作用为保存用于精度debug分析的校准数据,数据格式为.npy。该数据通过np.load()可直接送入模型进行推理。若不设置此参数,您也可自行保存数据并使用精度debug工具进行精度分析。 | 取值范围:"dump_calibration_data"默认配置:无。 | 可选 |
node_info | 参数作用:支持配置指定OP的输入输出数据类型为int16以及强制指定算子在CPU或BPU上运行。此参数 只支持RDK Ultra和RDK X5配置! 参数说明:基于减少yaml中的参数的原则,我们将 set_node_data_type 、run_on_cpu 和 run_on_bpu 三个参数的能力融合到本参数中,并在此基础上扩充支持配置指定op输入数据类型为int16的能力。node_info 参数使用方式: - 仅指定OP运行在BPU/CPU上(下以BPU为例,CPU方法一致): node_info: { "node_name" { 'ON': 'BPU',} } - 指定OP运行在BPU上,同时配置OP的输入输出数据类型: node_info: { "node_name": { 'ON': 'BPU', 'InputType': 'int16', 'OutputType': 'int16'}} - 指定多个算子运行: node_info: {"/model.0/conv/Conv": {"ON": "BPU","InputType": "int16","OutputType": "int16"},"/model.0/act/Mul": {"ON": "BPU","InputType": "int16","OutputType": "int16"},"/model.2/Concat": {"ON": "BPU","InputType": "int16","OutputType": "int16"}} | ||
| 'InputType': 'int16'代表指定算子的所有输入数据类型为 int16。 如需指定算子特定输入的 InputType,可在 InputType 后通过指定数字来进行配置。如: 'InputType0': 'int16'代表指定算子的第一个输入数据类型为 int16, 'InputType1': 'int16'代表指定算子的第二个输入数据类型为 int16,以此类推。 注意: 'OutputType' 不支持指定算子特定输出的 OutputType,配置后对算子的所有输出生效,不支持配置 'OutputType0' 、 'OutputType1'等。 | 取值范围:支持配置 int16 的算子范围您可参考 |