目录
一、ARM虚拟硬件平台介绍
二、心电疾病分类模型介绍
三、部署流程
3.1 基于百度云平台订阅虚拟硬件镜像
3.2 安装编译相关组件
3.1 数据加载
3.2 模型转换
方式一: tensorflow模型转换为onnx模型,onnx模型转换为TVM模型
方式二: tensorflow模型转换为tensorflow lite模型,tflite模型转换为tvm模型
3)两种方式部署的差异
3.3 环境变量配置
3.4 模型编译
3.5 模型运行
四、部署测试效果
方式一:tf->onnx->tvm
方式二:tf-tflite->tvm
五、问题QA
六、总结
七、参考文档
一、ARM虚拟硬件平台介绍
Arm 虚拟硬件平台 AVH(Arm Virtual Hardware),是ARM公司推出的虚拟硬件开发方式,通过在云平台中虚拟化流行的物联网开发套件、ARM的处理器和系统,从而扩展并加速了物联网软件开发。--通俗的讲:我们可以通过云平台来远程部署和运行程序在该硬件上(该硬件称为虚拟硬件),在该虚拟硬件平台上可以连接众多arm合作的硬件板。因此可以让我们在开发产品的前期得以在不同的硬件上进行模拟验证。
虚拟硬件平台的架构:
图中红色圈住的地方为本文所采用的开发方式:也即是基于百度云以及AVH FVP models。
包含的硬件:
cortex-m55 、cortex-m85等。本文基于cortex-m55进行验证。
二、心电疾病分类模型介绍
心电图(ECG)是诊断心脏疾病的关键工具,本文介绍基于心电数据进行疾病的分类的模型,该模型分类输出为7种。输入数据为10s的心电数据维数1x3600,输出维度为1x7。 模型基于TensorFlow框架训练,结构为CNN网络架构,模型训练保存输出为pb格式(model.pb)
三、部署流程
3.1 基于百度云平台订阅虚拟硬件镜像
參考文档2进行订阅。
3.2 安装编译相关组件
1)离线下载并上传到百度云安装这些组件
cpackget add ARM.CMSIS.5.9.0.pack
cpackget add ARM::CMSIS-DSP@1.15.0
cpackget add ARM::CMSIS-NN@4.1.0
cpackget add ARM::V2M_MPS3_SSE_300_BSP@1.4.0
cpackget add ARM::V2M_MPS3_SSE_310_BSP@1.3.0
cpackget add Keil::ARM_Compiler@1.7.2
参考文档2,官方提供了相对比较完整的pack包汇总的文件包,只要把这个文件下载下来,并传输到云服务器指定位置,即可自动识别,完成pack包的安装。
wget https://Arm-workshop.bj.bcebos.com/packs.tar.bz2
2)执行命令
配置cmsis
# download cmsis-toolbox
cmsis_toolbox_name="cmsis-toolbox-linux-amd64"
cmsis_toolbox_version="2.2.1"
cmsis_toolbox_url="https://github.com/Open-CMSIS-Pack/cmsis-toolbox/releases/download/${cmsis_toolbox_version}/${cmsis_toolbox_name}.tar.gz"
wget ${cmsis_toolbox_url}
tar -vxf ${cmsis_toolbox_name}.tar.gz
rm ${cmsis_toolbox_name}.tar.gz
# copy to opt
mv ${cmsis_toolbox_name} ctools
rm -rf /opt/ctools
mv ctools /opt
配置tvm和onnx
echo 'export PATH=/home/ubuntu/.local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
pip install --upgrade pip
pip install opencv-python
pip install apache-tvm
pip install onnx
3.1 数据加载
1)编写python文件加载心电数据,并将数据转换为input.h文件,输出数据类别数组转换为output.h文件。
2)执行转换数据程序
#Windows执行
python3 convert_ECGData.py data/TestX_eu_MLIII.csv
#linux python3 ./convert_ECGData.py ./data/TestX_eu_MLIII.csv
2)执行 label转换程序,将标签序列转换为label.h头文件
# windows执行
python convert_labels.py data/TestY_eu_MLIII.csv
#linux: python3 ./convert_labels.py ./data/TestY_eu_MLIII.csv
3.2 模型转换
方式一: tensorflow模型转换为onnx模型,onnx模型转换为TVM模型
pip install tf2onnx
1)执行以下程序进行tf到onnx模型转换:
python -m tf2onnx.convert --saved-model save/CNN --output onnx/cnn_model.onnx
2)重命令onnx模型
读取onnx模型输入名称
查到輸入名称为input_1
INPUT_NODE_NAME="input_1"
sudo python rename_onnx_model.py --model cnn_model.onnx \
--origin_names ${INPUT_NODE_NAME} \
--new_names x \
--save_file cnn_model.onnx
3)onnx模型转换为tvm模型
TVM_TARGET="cortex-m55"
sudo python3 -m tvm.driver.tvmc compile --target=cmsis-nn,c \
--target-cmsis-nn-mcpu=$TVM_TARGET \
--target-c-mcpu=$TVM_TARGET \
--runtime=crt \
--executor=aot \
--executor-aot-interface-api=c \
--executor-aot-unpacked-api=1 \
--pass-config tir.usmp.enable=1 \
--pass-config tir.usmp.algorithm=hill_climb \
--pass-config tir.disable_storage_rewrite=1 \
--pass-config tir.disable_vectorize=1 \
cnn_model.onnx \
--output-format=mlf \
--model-format=onnx \
--input-shapes x:[1,3600] \
--module-name=cls \
--output=cls.tar
结果:
4)解压tvm模型文件
sudo mkdir -p "${PWD}/cls"
sudo tar -xvf cls.tar -C "${PWD}/cls"
方式二: tensorflow模型转换为tensorflow lite模型,tflite模型转换为tvm模型
1)安装tflite包:
pip install pyserial==3.5 tflite=-2.1
2)查询tflite模型的输入和输出
3)更改main.c文件
4) tflite 转换为tvm
TVM_TARGET="cortex-m55"
python3 -m tvm.driver.tvmc compile --target=cmsis-nn,c \
--target-cmsis-nn-mcpu=$TVM_TARGET \
--target-c-mcpu=$TVM_TARGET \
--runtime=crt \
--executor=aot \
--executor-aot-interface-api=c \
--executor-aot-unpacked-api=1 \
--pass-config tir.usmp.enable=1 \
--pass-config tir.usmp.algorithm=hill_climb \
--pass-config tir.disable_storage_rewrite=1 \
--pass-config tir.disable_vectorize=1 \
model.tflite \
--output-format=mlf \
--model-format=tflite \
--input-shapes serving_default_input_1:[1,3600] \
--module-name=cls\
--output=cls.tar
3)两种方式部署的差异
支持TF、Pytorch、onnx转换为tvm。因此前一种方式比第二种方式多了一步转换步骤。
3.3 环境变量配置
3.4 模型编译
RUN_DEVICE_NAME="M55"
cbuild object_classification+PaddleClas$RUN_DEVICE_NAME.cprj
生成:tmp(makefile相关文件)out文件(目标文件axf)
3.5 模型运行
VHT_Platform="FVP_Corstone_SSE-300"
$VHT_Platform -C cpu0.CFGDTCMSZ=15 \
-C cpu0.CFGITCMSZ=15 \
-C mps3_board.uart0.out_file=\"-\" \
-C mps3_board.uart0.shutdown_tag=\"EXITTHESIM\" \
-C mps3_board.visualisation.disable-visualisation=1 \
-C mps3_board.telnetterminal0.start_telnet=0 \
-C mps3_board.telnetterminal1.start_telnet=0 \
-C mps3_board.telnetterminal2.start_telnet=0 \
-C mps3_board.telnetterminal5.start_telnet=0 \
"out/ECG_classification/PaddleClas$RUN_DEVICE_NAME/ECG_classification.axf" \
--stat
四、部署测试效果
方式一:tf->onnx->tvm
方式二:tf-tflite->tvm
对比运行时间,方式二快一些,相差 7s
五、问题QA
1)出现package"tflite.Model" is not installed. Hint:"pip installtlcpack[tvmc]"
解决方式:
安装:pip install pyserial==3.5 tflite=-2.1
参考【3】
2)找不到路径或写入文件失败
添加权限:sudo chmod -R 777 tmp
3)license error
Error: license error: License checkout for feature SG_Simulator with version 11.19 has been denied by Flex back-end. Error code: -10
Feature has expired.
Feature: SG_Simulator
Expire date: 31-mar-2024
License path: /opt/data.dat:/opt/arm/licenses/license.dat:
FlexNet Licensing error:-10,32License checkout for feature FM_Simulator with version 11.19 has been denied by Flex back-end. Error code: -5
No such feature exists.
Feature: FM_Simulator
License path: /opt/data.dat:/opt/arm/licenses/license.dat:
FlexNet Licensing error:-5,357License checkout for feature SG_Simulator with version 11.19 has been denied by Flex back-end. Error code: -10
Feature has expired.
Feature: SG_Simulator
Expire date: 31-mar-2024
License path: /opt/data.dat:/opt/arm/licenses/license.dat:
FlexNet Licensing error:-10,32
In file: /tmp/plgbuild/abs_build/1228881_61942/trunk/work/fastsim/Framework/scx/SCXSimulationEngine.cpp:3276Error: license error: Simulation Engine module unavailable!
In file: /tmp/plgbuild/abs_build/1228881_61942/trunk/work/fastsim/Framework/scx/SCXSimulationEngine.cpp:2875
ERROR: uncaught exception occurred. Exception message follows:
Error: Wrong version of armctmodel. Version 11.19.25 (API Version 1.2) of the Portfolio was used to build the model. Please use identical major.minor versions of the Portfolio and the Tools.
解决方式:重新订阅新版镜像
4) 出现.x =input 错误
/home/ubuntu/ECG_classification/main.c:20:4: error: field designator 'x' does not refer to any field in type 'struct tvmgen_cls_inputs'
.x = input,
^
/home/ubuntu/ECG_classification/main.c:23:4: error: field designator 'output' does not refer to any field in type 'struct tvmgen_cls_outputs'
.output = output,
^
2 errors generated.
ninja: build stopped: subcommand failed.
error cbuild: error executing 'cmake' build
解决方式:更改结构体变量和模型输入输出名称一致
六、总结
该文章完成了深度学习模型的训练、验证、模型导出,模型转换、模型部署以及相关环境配置,最终编译和运行成功。通过ARM虚拟硬件平台进行软件程序的验证是一个很好的选择。未来可以进一步尝试其它的硬件部署以验证模型的性能。
七、参考文档
【1】Virtual Hardware – Software Development Without Hardware – Arm®
【2】iot-demo
【3】1. microTVM CLI Tool — tvm 0.17.dev0 documentation
【4】Paddle-examples-for-AVH