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(子图)。