本文主要内容包括:-
1.认识浮点模型转换工具链
2.caffe模型转换
3.onnx模型转换
4.上板测试以及模拟器测试
5. 测试mobilenetV2推理速度
第一次使用,可直接参考第五步,评估BPU性能-
Netron工具可以可视化Caffe, Onnx模型, https://github.com/lutzroeder/Netron-
注意检查模型输入输出等是否符合预期
一,认识浮点模型转换工具链.
详情请阅读X3芯片工具链文档
加载镜像 :
export version=... # 写成实际的版本号 gunzip -c docker_horizon_x3_tc_${version}.tar.gz | docker load
加载成功后会出现镜像名称: 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
# Caffe浮点网络数据模型文件caffe_model: '../../../01_common/modelzoo/mapper/classification/mobilenet/mobilenet_v2.caffemodel'# Caffe网络描述文件prototxt: '../../../01_common/modelzoo/mapper/classification/mobilenet/mobilenet_v2_deploy.prototxt'# 模型转换输出的用于上板执行的模型文件output_model_file_prefix: 'mobilenetv2'
修改 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频率:
echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governorexport HR_NODE_PROFILER=true
进入文件夹: 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频率:
echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governorexport HR_NODE_PROFILER=true
修改配置: 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
以上测试结果仅供参考,以实际测试为准