专栏算法工具链X3浮点模型转换示例

X3浮点模型转换示例

anming2020-06-29
2535
8
本文主要内容包括:
1.认识浮点模型转换工具链

2.caffe模型转换

3.onnx模型转换

4.上板测试以及模拟器测试

5. 测试mobilenetV2推理速度

第一次使用,可直接参考第五步,评估BPU性能
Netron工具可以可视化Caffe, Onnx模型, https://github.com/lutzroeder/Netron
注意检查模型输入输出等是否符合预期

一,认识浮点模型转换工具链.


详情请阅读X3芯片工具链文档

加载镜像 :

加载成功后会出现镜像名称: Loaded image: docker.hobot.cc/aitools/horizon_x3_tc:1.1.6

启动Docker :

docker run -it --rm -v /home/x3:/data docker.hobot.cc/aitools/horizon_x3_tc:1.1.6

将主机目录: /home/x3 映射 到 Docker中的 /data

需要更具自己下载的镜像版本 和 解压路径做调整

解压软件包到 /home/x3
tar -xvf x3-toolchain-1.0.post10.tar.gz

二, caffe 转 定点模型.

以lenet_gray 为例

进入目录: cd /data/horizon_x3_tc_1.0.post10/samples/miscellaneous/lenet_gray

env.conf: 配置caffe模型地址, 测试图片,模型类型

mapper: 用于将浮点模型转化

01_check.sh : 检查Op类型。hb_mapper checker --help
会打印出每一层运行在CPU或者BPU
02_get_mnist.sh: 下载mnist数据集, 并转换图片格式用于 模型校准
03_build.sh : lenet_gray_config.yaml 包含模型的预处理,layout, 校准类型等 参数配置
详情请参照文档: 5.1. 模型转换功能介绍. 运行的中间结果以及Log在 model_output/
量化后的onnx模型: lenet_gray_optimized_float_model.onnx
模拟器以及芯片运行的bin文件: lenet_gray_hybrid_horizonrt.bin
04_inference.sh: 利用量化onnx模型做单图推理

三.onnx 转 定点模型.

准备onnx模型,以PyTorch 为例,训练LeNet, 保存训练模型output/mnist.pth, 转换为 output/mnist.onnx
详情请参照: https://github.com/onnx/tutorials/blob/master/tutorials/PytorchTensorflowMnist.ipynb
或者直接下载 PytorchTensorflowMnist.ipynb: https://pan.horizon.ai/index.php/s/ESHHfL4EZk97CxL
其他框架如 mxnet, tensorflow, cntk, pytorch等,请参考开源工程: https://github.com/onnx/tutorials/tree/master/tutorials
得到mnist.onnx后,浮点转换流程与 caffe转定点模型类似.
修改01_check.sh: model-type为onnx, proto和 model 为mnist.onnx

会遇到不支持的Op情况,

需要替换 return F.log_softmax(x, dim=1) 为 return x
02_get_mnist.sh: 不做修改
修改03_build.sh:

model_type="onnx"

修改lenet_gray_config.yaml

04_inference.sh : 不做修改

四.定点模型上板测试.

4.1, runtime_arm 为上板测试文件夹

01_build.sh: 编译infer程序, 打包相关依赖库.

源码为: samples\02_rt_sample_src\01_hr_example\src\infer.cc

将测试图片../lenet_data/0.jpg,runtime_arm 文件夹,以及../mapper/model_output/lenet_gray_hybrid_horizonrt.bin

拷贝到开发板的/userdata/

修改dev_board_infer.sh

运行结果:

4.2, runtime_sim 为PC端模拟器测试

01_build.sh :

02_infer.sh


五, 测试mobilenetV2推理速度
5.1 文件功能说明

路径: cd samples/03_classification/01_mobilenet

env.conf: 配置示例名称 sample_name=mobilenetv2

mapper: 将浮点模型转换为定点模型

runtime_arm: 上板测试

runtime_sim: 模拟器测试

5.2 mapper编译模型

检查模型: sh 01_check.sh

放入原始图片到: ../../../01_common/data/imagenet/calibration_data

校准数据预处理: sh 02_preprocess.sh

复制yaml: cp mobilenet_config.yaml mobilenetv2_config.yaml

修改mobilenetv2_config.yaml

修改 03_build.sh: config_file="./mobilenetv2_config.yaml"

编译模型: sh 03_build.sh

编译成功后,runtime使用模型为: model_output/mobilenetv2_hybrid_horizonrt.bin

修改04_inference.sh : model_file="./model_output/mobilenetv2_quantized_model.onnx"

运行单图测试: sh 04_inference.sh

5.3 runtime_arm 上板跑FPS【单核单帧

登陆开发板: ssh root@192.168.168.10 .

固定CPU和BPU频率:

进入文件夹: cd runtime_arm

编译源码: sh 01_build.sh

数据预处理: sh 02_preprocess.sh

将数据和脚本发送到开发板上的/userdata/samples/:

sh 03_scp_to_board.sh 192.168.168.10

跑帧率:

sh 05_perf.sh 192.168.168.10

运行结果:

===REPORT-START{RUNTIME-ARM-PERF}===

Whole process statistics:count:100, duration:298.028ms, min:2.765ms, max:4.475ms, average:2.96722ms, fps:335.539/s

, Infer stage statistics:count:100, duration:296.515ms, min:2.751ms, max:4.456ms, average:2.95212ms, fps:337.251/s

, Post process stage statistics:count:100, duration:1.376ms, min:0.012ms, max:0.056ms, average:0.0133469ms, fps:72674.4/s

===REPORT-END{RUNTIME-ARM-PERF}===

测试结果解读:

Whole process: 模型推理耗时+后处理耗时,

最短耗时:2.765ms, 最长耗时:4.475ms, 平均耗时:2.96722ms, 帧率为 335.539 FPS

Infer stage: 模型推理耗时统计

Post process stage: 后处理耗时统计

5.4 运行【双核双帧】测试

登陆开发板: ssh root@192.168.168.10 .

固定CPU和BPU频率:

修改配置: mobilenetv2_config.yaml

input_type_rt: 'nv12'

编译模型: sh 03_build.sh

进入双帧双核测试目录:

cd samples/05_miscellaneous/06_dual_frame_dual_core/shell

编译测试源码:

注释掉: #export LINARO_GCC_ROOT=

sh build.sh

拷贝定点模型到shell目录:

cp ../../../03_classification/01_mobilenet/mapper/model_output/mobilenetv2_hybrid_horizonrt.bin ./

将shell文件夹拷贝到开发板/userdata/samples:

scp -r ../shell root@192.168.168.10:/userdata/samples/

开始测试, 开发板上执行:

sh start_mobileNetV2.sh

运行一段时间,终止程序, 查看Log:

method name:PostProcessMethod time:0.146

frame_rate: 672.438

测试结果解读:

PostProcessMethod: 后处理耗时,0.146ms

frame_rate: 帧率 672.438 FPS, 每个BPU核独立跑一帧 为 672.438/2 = 336.219 FPS

以上测试结果仅供参考,以实际测试为准

算法工具链
官方教程
+2
评论3
0/1000
  • hjw
    Lv.1
    当前使用 docker_horizon_x3_tc_v1.1.6.tar.gz 和 x3-toolchain-1.1.6.tar.gz,在 三、onnx转定点模型 修改 lenet_gray_config.yaml,除了model_parameters需要修改,其他的item要修改吗?(input_parameters、calibration_parameters、compiler_parameters)现在有如下报错:

    2020-09-01 11:18:17,396 INFO Start hb_mapper....

    2020-09-01 11:18:17,396 INFO hb_mapper version 1.1.6

    2020-09-01 11:18:18,107 INFO Working dir: /horizon_x3_tc/samples/05_miscellaneous/01_lenet_gray/mapper/model_output

    2020-09-01 11:18:18,107 INFO Start Model Convert....

    2020-09-01 11:18:18,120 INFO Parsing the input parameter:{'data': {'input_shape': [1, 1, 28, 28], 'expected_input_type': 'GRAY_128', 'original_input_type': 'GRAY'}}

    2020-09-01 11:18:18,120 INFO Parsing the calibration parameter

    2020-09-01 11:18:18,121 INFO Parsing the hbdk parameter:{'compile_mode': 'latency', 'debug': True, 'input_source': {'data': 'pyramid'}}

    2020-09-01 11:18:18,122 INFO HorizonNN version: 0.6.10

    2020-09-01 11:18:18,122 INFO HBDK version: 3.10.3

    2020-09-01 11:18:18,122 INFO Start to parse the onnx model.

    2020-09-01 11:18:18,140 INFO ONNX model info:

    ONNX IR version: 6

    Opset version: 10

    Input name: data, [1, 1, 28, 28]

    2020-09-01 11:18:18,148 INFO The onnx model was parsed successfully.

    2020-09-01 11:18:18,148 INFO Model input names: ['data']

    2020-09-01 11:18:18,148 INFO Input preprocessing:{'data': {'input_shape': [1, 1, 28, 28], 'expected_input_type': 'GRAY_128', 'original_input_type': 'GRAY'}}

    2020-09-01 11:18:18,148 INFO Create a preprocessing operator for input_name data with means=NULL, scales=NULL, original_input_type=GRAY, expected_input_type=GRAY_128, original_input_layout=NULL

    2020-09-01 11:18:18,150 ERROR Preprocess node for data already exists, duplicated insertion is forbidden.

    2020-09-01
    0
    2
    • anming回复hjw:
      先跑通sample里面的 mobilenet, 然后参照修改
      ERROR Preprocess node for data already exists, duplicated insertion is forbidden.
      你得模型里面已经包含了预处理,需要删除
      2020-09-03
      0
    • hjw回复anming:

      好的,入门是个痛苦的过程,后面遇到问题,再问你了

      2020-09-03
      0
  • shaun
    Lv.1

    请问有没有下载好的数据集呢,02_get_mnist.sh下不动。。

    2021-03-22
    0
    2
    • admin回复shaun:

      这个网络问题,可以换个网络试一下哈,我这边网络也不行,不然就给你打包过去了

      2021-03-29
      2
    • admin回复BrokenDusk:
      您好,calibration_parameters 是02_preprocess.sh,校正数据使用,可以根据我们的python脚本进行转化,没找到您说的feasure_fill
      2021-03-29
      0
  • BrokenDusk
    Lv.1
    请问模型的config.yaml里面参数calibration_parameters有个cal_data_dir,inference.sh中要指定feature_file,这两个参数有什么区别和联系么?需要怎么通过自己的数据集生成?
    2021-03-25
    0
    1
    • admin回复BrokenDusk:
      您好,calibration_parameters 是02_preprocess.sh,校正数据使用,可以根据我们的python脚本进行转化,没找到您说的feasure_fill
      2021-03-29
      0