Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RTThreaed
移植CMSIS-NN v6.0.0版本到VisionBoard
发布于 2024-07-11 15:34:11 浏览:360
订阅该版
[tocm] ## CMSIS-NN是什么? 官方的解释是: CMSIS NN software library is a collection of efficient neural network kernels developed to maximize the performance and minimize the memory footprint of neural networks on Arm Cortex-M processors. 翻译一下就是: CMSIS NN 软件库是一组高效的神经网络核(函数),旨在最大限度地提高 Arm Cortex-M 处理器上神经网络的性能并最大限度地减少内存占用。 CMSIS-NN是一个计算库,它向上提供了神经网络(NN)计算接口,实现了神经网络计算的硬件加速。它内部实现了纯CPU计算、DSP计算、MVE计算,屏蔽了底层硬件的具体细节,降低了编程难度。 ## 为什么移植CMSIS-NN v6.0.0版本? ### 1.CMSIS-NN核心特性 总结一下官方的介绍,可以知道CMSIS-NN库的核心特性: 专为Cortex-M处理器开发; 神经网络计算函数; 最大化性能; 最小化内存占用 ### 2.CMSIS-NN的硬件和软件支持 除此之外,CMSIS-NN库还有几点也是值得关注的: 支持DSP扩展的处理器,使用SIMD优化,例如Cortex-M4核; 支持ARM的Heilum技术的处理器,使用M核向量扩展(MVE,M-profile Vector Extension)进行优化,例如 Cortex-M55 或 Cortex-M85; MVE扩展恰好是ARM Cortex-M85内置的; VisionBoard主控芯片瑞萨RA8D1的CPU核正是ARM Cortex-M85; CMSIS-NN可以作为TensorFlow Lite for Microcontroller的后端实现; ### 3.CMSIS-NN核心特性 CMSIS-NN v6.0.0版本的发布说明中,介绍了新特性: 全连接(FC)、卷积(CONV)和深度卷积(DWCONV)添加了MVE指令的int4类型支持; 重新实现 LSTM 以与 TFLM 参考内核保持一致; LSTM 对 int16 输入的支持 DSP/MVEI 支持转置卷积 支持分组卷积 支持 FC 的非零滤波器偏移 对 MVEI 的 Int16 输入卷积支持 对 int16x8 卷积的 Int32 偏置支持 更能多内容可以查看本文末尾的CMSIS-NN v6.0.0 Release Note; ## 如何移植CMSIS-NN v6.0.0到VisionBoard? ### 1.创建RT-Thread项目 RT-Thread Studio创建基于VisionBoard开发板的模板项目,过程比较简单,不再赘述。 ### 2.添加CMSIS-NN源码 RT-Thread Studio创建基于VisionBoard开发板的模板项目后, 在packages目录手动下载CMSIS-NN v6.0.0版本: ![1.png](https://oss-club.rt-thread.org/uploads/20240711/d467831bb0744bc9ac5368f09c7cf408.png) ### 3.修改RT-Thread代码 修改项目顶层的Kconfig文件,添加如下代码行: ![2.png](https://oss-club.rt-thread.org/uploads/20240711/9895c9ea96882e3624e61d40a1941d80.png) 注意:Kconfig修改需要完需要保证最后有一行空行,否则menuconfig命令会报奇怪的错误。 检查packages目录内是否有SConsript文件,并且内容如下: ![3.png](https://oss-club.rt-thread.org/uploads/20240711/cf411ab4147b8d9589364d09354496f7.png.webp) 如果没有,可以手动创建。 ### 4.修改CMSIS-NN代码 CMSIS-NN目录顶层创建SConscript文件,内容如下: ![4.png](https://oss-club.rt-thread.org/uploads/20240711/528c2aee74271b08c0186f6c8fa0a75c.png.webp) ![5.png](https://oss-club.rt-thread.org/uploads/20240711/29741608ba07f35997772184253a5276.png.webp) ![6.png](https://oss-club.rt-thread.org/uploads/20240711/29741608ba07f35997772184253a5276.png.webp) 创建Kconfig文件,内容如下: ![7.png](https://oss-club.rt-thread.org/uploads/20240711/2cbf4a8c81260e25474b42969d1b3c62.png.webp) ### 5.编译RT-Thread项目 完成以上修改之后,已经可以编译CMSIS-NN库的代码了。 在命令行中执行如下命令,编译整个项目: ![8.png](https://oss-club.rt-thread.org/uploads/20240711/10a2771a28bb87ae2b5877034e5efe18.png) 编译输出最后部分如下图所示: ![9.png](https://oss-club.rt-thread.org/uploads/20240711/018589b6169d59c6bf9c206efb147cb7.png) ## 如何测试CMSIS-NN v6.0.0? ### 1.CMSIS-NN核心特性 CMSIS-NN库内部带有了单元测试,具体位于 Tests/UnitTest 子目录,其中 unittest_targets.py 脚本可以用于生成测试脚手架代码,使用方法如下: ![10.png](https://oss-club.rt-thread.org/uploads/20240711/c82234c8fa0dc09c0d2d163971c40691.png) 、 当前生成的代码是单独生成elf文件,并在ARM虚拟硬件(AVH)平台上运行的。 默认情况下,执行python unittest_targets.py —download-and-generate-test-runners命令,会为每个测试用例生成一个main函数,每个测试用例单独编译为一个elf文件,之后使用ARM虚拟硬件(AVH)执行elf进行测试。 为了能够生成在RT-Thread上运行的测试代码,需要修改部分测试脚本代码,实现将每个测试用例注册为一个独立的finsh命令,在串口命令行中交互测试。 具体修改的代码差异如下: ![11.png](https://oss-club.rt-thread.org/uploads/20240711/a103acd1b466308de244295d125401dc.png.webp) ![12.png](https://oss-club.rt-thread.org/uploads/20240711/ee6392454eb7bdcf93d8b5507fde3c48.png.webp) 这段修改实现了: 调用unity的ruby脚本,传递main_name命令行参数,用于修改单元测试入口函数名称(不指定默认是main); 生成一个独立的RT-Thread finsh命令注册代码.c文件; 生成一个用于编译的SConscript代码文件; 另外,再结合上层目录的SConcsript包含所有子目录的SConscript,就可以实现将所有单元测试编译为finsh命令了。 修改完该脚本文件后,执行如下命令,生成RT-Thread平台测试代码: ![13.png](https://oss-club.rt-thread.org/uploads/20240711/0cd87c7b422b96e57f920e44b3a2bd11.png) 命令执行输出如下: ![14.png](https://oss-club.rt-thread.org/uploads/20240711/ec1206e7283d1653e31267a66ce710dd.png.webp) ### 2.测试代码的构建规则SConscript 然后需要在CMSIS-NN的Tests子目录内,添加SConscript文件: ![15.png](https://oss-club.rt-thread.org/uploads/20240711/ec87ec6bcc5b2606750018ffd7bfe830.png) 这段SConscript的作用是,将子目录的SConscript脚本包含到整个项目的构建流程中去。 接着需要在CMSIS-NN的Tests/UnitTest子目录内,添加SConscript文件: ![16.png](https://oss-club.rt-thread.org/uploads/20240711/fad9966e40c990cc8e918b5bf832bb25.png) 完成以上修改后,通过menuconfig打开 PKG_USING_CMSIS_NN_TESTS 配置项目,再次 scons 编译,就可以编译单元测试代码文件了。 ### 3.解决链接失败问题 但是还会有一些编译错误,原因主要有: 原来的测试脚本为每个测试用例独立生成main函数,每个目录单独编译; 链接到一起时,会有大量重复的setUp/tearDown/resetTest/verifyTest函数定义; 原来的测试数据数组没有加static修饰,被重复include到多个.c文件; 链接到一起时,会有数组重复的数组定义; 为了解决上述两类问题,分别创建两个脚本。 修复重复函数定义的 fix_testCode.sh: ![17.png](https://oss-club.rt-thread.org/uploads/20240711/7ebef6d71f43f100ec5717b4c0dfa7df.png) 解决方法,所有 setUp/tearDown/resetTest/verifyTest 函数添加 weak 属性修饰; 修复重复数组定义的 fix_testData.sh: ![18.png](https://oss-club.rt-thread.org/uploads/20240711/fcc1f0825e371d515890c88a8d0fa78c.png) 解决方法,所有测试数据的数组添加static修饰。 分别执行上面两个脚本之后,再次编译,就没有编译错误了。 ### 4.运行单元测试 顺利编译之后,下载固件: ![19.png](https://oss-club.rt-thread.org/uploads/20240711/0e58c20acafd892f1a0e99b623180234.png) 运行后,在串口输入help命令可以看到: ![20.png](https://oss-club.rt-thread.org/uploads/20240711/b3c89c81a3587e6d64ee3bf17f676eb9.png) 输入命令,运行avgpool算子的测试: ![21.png](https://oss-club.rt-thread.org/uploads/20240711/4ec7d0d8631eaf41391d60d4bc610923.png) 其他几个算子的s8类型测试: ![22.png](https://oss-club.rt-thread.org/uploads/20240711/6d9c753aff0a6f76cae58ecab2ed3726.png) ![23.png](https://oss-club.rt-thread.org/uploads/20240711/32b3f685c84da5f896a9f1f803d1e50f.png.webp) ![24.png](https://oss-club.rt-thread.org/uploads/20240711/98095205115dfbcadb08abe8b42e4060.png) ![25.png](https://oss-club.rt-thread.org/uploads/20240711/a58c7215539f77a9c41a801e969e35de.png) ![26.png](https://oss-club.rt-thread.org/uploads/20240711/b5969a78c52df3b45e3694661a74e3a8.png.webp) ![27.png](https://oss-club.rt-thread.org/uploads/20240711/9df070028057a0e8c3b313459938e7a0.png) ![28.png](https://oss-club.rt-thread.org/uploads/20240711/bb131672fdfa1565b5a8e487ecf38446.png.webp) ![29.png](https://oss-club.rt-thread.org/uploads/20240711/b8e0ec87498ccdf914d243d584144a3b.png) ![30.png](https://oss-club.rt-thread.org/uploads/20240711/2e8553bf9336bc74bcc5db080dde45b7.png) ![31.png](https://oss-club.rt-thread.org/uploads/20240711/b880b95bf432c3869b382a2ed52554f3.png) ![32.png](https://oss-club.rt-thread.org/uploads/20240711/05c2527fd07439513c9693ce0d13ae8c.png) 修改后的CMSIS-NN代码仓: https://github.com/xusiwei/CMSIS-NN ## 参考链接 1.CMSIS-NN源码仓: https://github.com/ARM-software/CMSIS-NN 2.TFLM项目介绍页:https://tensorflow.google.cn/lite/microcontrollers/overview?hl=zh-cn 3.CMSIS-NN v6.0.0 Release Note: https://github.com/ARM-software/CMSIS-NN/releases/tag/v6.0.0 4.Ruby下载页面:https://www.ruby-lang.org/zh_cn/downloads/ ![33.png](https://oss-club.rt-thread.org/uploads/20240711/5ec1be1df1b02a3dfea410b45f806c78.png.webp) https://m.tb.cn/h.g0TaaKTnfx6iM2W?tk=lI8TWrhauqR ——————End——————
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
RT-Thread小师弟
微信:rtthread2020
文章
293
回答
171
被采纳
33
关注TA
发私信
相关文章
1
RTThread支持loongson2k1000了么?
2
终端出现The aht10 is under an abnormal status
3
为什么系统一直在重启?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
9
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
4
次点赞
Ghost_Girls
1
篇文章
7
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部