0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

测评分享 | 如何在先楫HPM6750上运行轻量级AI推理框架TinyMaix

先楫半导体HPMicro 2022-12-12 17:57 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

3f2eb1e6-78ab-11ed-b116-dac502259ad0.png本期内容由先楫开发者社区大咖@xusiwei1236分享基于先楫HPM6750的轻量级AI推理框架,赶紧来瞧瞧~

一、TinyMaix是什么?
TinyMaix是国内sipeed团队开发一个轻量级AI推理框架,官方介绍如下:TinyMaix 是面向单片机的超轻量级的神经网络推理库,即 TinyML 推理库,可以让你在任意单片机上运行轻量级深度学习模型。甚至在 Arduino ATmega328 (32KB Flash, 2KB RAM) 上都能基于 TinyMaix 进行手写数字识别。TinyMaix官网提供了详细介绍,可以在本文末尾的参考链接中找到链接。
二、TinyMaix移植
本节介绍如何将TinyMaix移植到HPM6750,详细步骤如下:
2.1 开发环境搭建先楫官方支持SDK开发环境和RT-Thread开发环境,两种开发环境的搭建方法均可在官方提供的开发板用户手册(HPM6750EVKMINI USER GUIDE.pdf 或 HPM6750EVK USER GUIDE.pdf 文件)中找到,也可以参考我此前发布的帖子,具体见本文最后的参考链接。考虑到TinyMaix对于现已支持的MCU,基准测试都是基于裸机进行的,因此这里使用的是HPM SDK开发环境。另外,基于裸机的移植在RTOS环境下一般也可以运行。因此,对于MCU芯片的计算类开源项目的移植(例如这里的TinyMaix),最好是基于裸机进行。使用的HPM SDK版本为0.14.0,使用的SEGGER Embedded Studio版本信息为:

SEGGER Embedded Studio for RISC-VRelease 6.40 Build 2022102501.51567Windows x64
2014-2022 SEGGER Microcontroller GmbH 1997-2022 Rowley Associates Ltd.
segger-cc: version 15.0.0segger-ld: version 4.36.0segger-rtl: version 4.20.0
GCC/BINUTILS: built using the GNU RISC-V Toolchain version GCC 12.20/Binutils 2.39 source distribution
Clang/LLVM:builtusingtheversion15.0.0sourcedistribution

2.2 TinyMaix移植步骤由于TinyMaix本身的源代码文件不多,整个移植过程相对还是比较简单的。整体基本上分为三步:

  • 目录规划;
  • 修改源码;
  • 编译运行;

下面介绍具体操作步骤。2.2.1 目录规划考虑到TinyMaix和hpm_sdk都是使用CMake构建的,为了不对TinyMaix进行过多侵入性修改,这里采取的策略是——添加一个中间层。具体是将HPM6750平台的CMakeLists.txt文件放在TinyMaix源码目录的上一层,如下所示:

hpm_sdk/app/├── CMakeLists.txt # HPM6750平台的CMakeLists.txt├── src│ └── benchmark.c└── TinyMaix/ # TinyMaix源码目录

2.2.2 修改源码

这里在src/benchmark.c文件内容如下:

#include #include "board.h"
#define MODEL_MNIST 1#define MODEL_CIFAR10 2#define MODEL_VWW 3#define MODEL_MBNET 4
#define CONFIG_MODEL MODEL_CIFAR10 // 修改这一行切换 测试程序
#define main benchmark_main#if (CONFIG_MODEL == MODEL_MNIST)#include "mnist/main.c"#elif (CONFIG_MODEL == MODEL_CIFAR10)#include "cifar10/main.c"#elif (CONFIG_MODEL == MODEL_VWW)#include "vww/main.c"#elif (CONFIG_MODEL == MODEL_MBNET)#include "mbnet/label.c"#include "mbnet/main.c"#endif#undef main
int main(void){ board_init();
printf("benchmark start...\n"); benchmark_main(0, NULL);
__asm__("wfi");return 0;}

为了不直接拷贝基准测试代码,简化代码结构,这里使用了不太常见的:直接#include 某个.c文件;在#include "xxx/main.c"前面,定义宏#define main benchmark_main,之后取消宏定义;这样实现了将TinyMaix原有的测试代码作为benchmark.c一部分,而又不与这里的main函数相冲突的目的。PS:这里为了简便,并没有把TinyMaix放到hpm_sdk的middleware目录,实际项目中使用的话最好将TinyMaix放到middleware目录。另外,还需要修改`tm_port.h文件:

diff --git a/include/tm_port.h b/include/tm_port.hindex 357fc6b..5d1768c 100644--- a/include/tm_port.h+++ b/include/tm_port.h@@ -31,7 +31,7 @@ limitations under the License.#define TM_OPT_LEVEL TM_OPT0#define TM_MDL_TYPE TM_MDL_INT8#define TM_FASTSCALE (0) //enable if your chip don't have FPU, may speed up 1/3, but decrease accuracy-#define TM_LOCAL_MATH (0) //use local math func (like exp()) to avoid libm+#define TM_LOCAL_MATH (1) //use local math func (like exp()) to avoid libm#define TM_ENABLE_STAT (1) //enable mdl stat functions#define TM_MAX_CSIZE (1000) //max channel num //used if INT8 mdl //cost TM_MAX_CSIZE*4 Byte#define TM_MAX_KSIZE (5*5) //max kernel_size //cost TM_MAX_KSIZE*4 Byte@@ -49,9 +49,10 @@ limitations under the License.#define TM_DBGL() TM_PRINTF("###L%d\n",__LINE__);
/******************************* DBG TIME CONFIG ************************************/-#include -#include -#define TM_GET_US() ((uint32_t)((uint64_t)clock()*1000000/CLOCKS_PER_SEC))+#include "board.h"+#define TM_GET_US() (uint32_t)(HPM_MCHTMR->MTIME * 1000000uLL / clock_get_frequency(clock_mchtmr0))
#define TM_DBGT_INIT() uint32_t _start,_finish;float _time;_start=TM_GET_US();#defineTM_DBGT_START()_start=TM_GET_US();

2.2.3 编译运行HPM6750项目的生成命令:

generate_project -b hpm6750evkmini -t flash_xip -f

HPM6750项目的编译、运行,具体可以开发环境搭建文章,链接见本文末尾。手写数字识别(mnist模型),运行后,串口输出结果如下:3f91d53c-78ab-11ed-b116-dac502259ad0.png

三、基准测试

下面是TinyMaix四种常用的基准测试模型的基准测试,四个模型分别为:

  • mnist——手写数字识别模型,输入28x28x1
  • cifar——10分类模型,输入32x32x3
  • vww——人体检测二分类模型,输入96x96x3,输出有无人
  • mbnet——1000分类模型,输入128x128x3


3.1 场景1: TM_MDL_INT8 + TM_OPT0

3fee72a6-78ab-11ed-b116-dac502259ad0.png
3.2 场景2: TM_MDL_INT8 + TM_OPT1400c7b34-78ab-11ed-b116-dac502259ad0.png
3.3 场景3: TM_MDL_FP32 + TM_OPT0403c1a2e-78ab-11ed-b116-dac502259ad0.png

3.4 注意事项

  • 在SEGGER Embedded Studio中, 可以通过如下菜单Project 'xxx' Options -> Code -> Code Generation -> Optimization Level修改优化等级;
  • 在SEGGER Embedded Studio中, 默认的堆大小设置为16384 字节(16KB),不够运行vww96 和 mbnet128 模型,你可以通过菜单 Code -> Runtime Memory Area -> Heap Size修改具体配置大小,例如可以为524288(512KB);
  • 对于FP32模型,需要将RISC-V ISA设置从默认的rv32imac改为rv32gc(Code -> Code Generation -> RIS-V ISA),确保编译器可以生成浮点数操作指令。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • AI
    AI
    +关注

    关注

    89

    文章

    38170

    浏览量

    296871
  • 先楫半导体
    +关注

    关注

    12

    文章

    270

    浏览量

    3149
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【CW32】uart_obj_fw 轻量级串口框架

    轻量级跨平台串口通信框架,专为资源受限的嵌入式设备设计。单个对象RAM占用最小68字节左右(不算缓冲区),ROM占用1-2k字节左右,功能支持裁剪,资源占用小并不代表低性能,该库参考了freeRTOS
    的头像 发表于 09-29 18:02 7442次阅读

    请问如何在RK3588使用npu,用onnx模型来推理

    请问如何在瑞芯微 RK3588使用npu,用onnx模型来推理。官网上介绍说要把ONNX模型转换成RKNN模型。但是我并不想这么干,请问有什么办法吗?
    发表于 08-09 00:51

    基于米尔瑞芯微RK3576开发板部署运行TinyMaix:超轻量级推理框架

    本文将介绍基于米尔电子MYD-LR3576开发平台部署超轻量级推理框架方案:TinyMaix 摘自优秀创作者-短笛君 TinyMaix
    发表于 07-25 16:35

    何在RK3576开发板运行TinyMaix :超轻量级推理框架--基于米尔MYD-LR3576开发板

    本文将介绍基于米尔电子MYD-LR3576开发平台部署超轻量级推理框架方案:TinyMaix摘自优秀创作者-短笛君TinyMaix是面向单片
    的头像 发表于 07-25 08:03 4011次阅读
    如<b class='flag-5'>何在</b>RK3576开发板<b class='flag-5'>上</b><b class='flag-5'>运行</b><b class='flag-5'>TinyMaix</b> :超<b class='flag-5'>轻量级</b><b class='flag-5'>推理</b><b class='flag-5'>框架</b>--基于米尔MYD-LR3576开发板

    信而泰×DeepSeek:AI推理引擎驱动网络智能诊断迈向 “自愈”时代

    、资源分配的最优策略建议,减少资源浪费,提升整体网络效率。 客户实证:AI推理引擎的精准力量某大型政务云平台遭遇核心业务运行缓慢问题,初步怀疑网络带宽不足。在利用信而泰xnSight网络应用性能管理系统
    发表于 07-16 15:29

    半导体HPM6E8Y:先实时控制芯片驱动的机器人关节“芯”时代

    机器人的运动控制需要兼顾通信的高实时性及高带宽,以确保机器人能够迅速响应外部指令和环境变化。如何去解决机器人运动下的通信难题,在松山湖中国IC创新高峰论坛,上海先半导体科技有限公司嵌入式专家
    发表于 05-13 11:50 1603次阅读
    先<b class='flag-5'>楫</b>半导体<b class='flag-5'>HPM</b>6E8Y:先<b class='flag-5'>楫</b>实时控制芯片驱动的机器人关节“芯”时代

    重磅更新 | 先半导体HPM_APPS v1.9.0发布

    重磅更新 | 先半导体HPM_APPS v1.9.0发布
    的头像 发表于 05-13 11:29 1361次阅读
    重磅更新 | 先<b class='flag-5'>楫</b>半导体<b class='flag-5'>HPM</b>_APPS v1.9.0发布

    【强势新】HPM5E00:EtherCAT运动控制MCU,先半导体再拓工业总线产品新版图

    。该系列是继HPM6E00后的又一重磅布局,标志着先在EtherCAT工业通信领域的持续发力与技术深化。 HPM5E00系列 在延续HPM6E00高算力基因的基础
    发表于 05-07 14:07 971次阅读
    【强势<b class='flag-5'>上</b>新】<b class='flag-5'>HPM</b>5E00:EtherCAT运动控制MCU,先<b class='flag-5'>楫</b>半导体再拓工业总线产品新版图

    【强势新】HPM5E00:EtherCAT运动控制MCU,先半导体再拓工业总线产品新版图

    HPM6E00后的又一重磅布局,标志着先在EtherCAT工业通信领域的持续发力与技术深化。HPM5E00系列在延续HPM6E00高算力基因的基础
    的头像 发表于 05-06 11:09 982次阅读
    【强势<b class='flag-5'>上</b>新】<b class='flag-5'>HPM</b>5E00:EtherCAT运动控制MCU,先<b class='flag-5'>楫</b>半导体再拓工业总线产品新版图

    重磅更新 | 先半导体HPM_SDK v1.9.0 发布

    版本更新概况[New]增加HPM6P00系列MCU以及hpm6p00evk支持[New]增加了开发板已知问题说明[Update]将全系列开发板VCore电压调节至1.275V,HPM6750系列开发板主频设成816MHz,
    的头像 发表于 04-02 08:31 832次阅读
    重磅更新 | 先<b class='flag-5'>楫</b>半导体<b class='flag-5'>HPM</b>_SDK v1.9.0 发布

    何在NXP MCU启用D-Cache?

    我正在 NXP FRDM-MCXN947 MCU 测试 TFLite AI 模型的推理时间和性能。虽然我使用 NPU 获得了良好的性能,但在不使用 NPU 时,我的推理时间相对较慢。
    发表于 03-27 07:48

    高速链路设计难?利用HPM6750双千兆以太网透传实现LED大屏实时控制

    HPM6750双千兆以太网透传方案演示LED大屏显示系统利用发光二极管构成的点阵模块或像素单元组成大面积显示屏显示字符、图像等信息,具有低功耗、低成本、高亮度、长寿命、宽视角等优点,近年来随着
    的头像 发表于 02-08 13:45 1660次阅读
    高速链路设计难?利用<b class='flag-5'>HPM6750</b>双千兆以太网透传实现LED大屏实时控制

    半导体HPM_SDK v1.7.0发布!这些更新你值得关注!

    半导体HPM_SDK v1.7.0发布!这些更新你值得关注!
    的头像 发表于 02-08 13:42 1054次阅读
    先<b class='flag-5'>楫</b>半导体<b class='flag-5'>HPM</b>_SDK v1.7.0发布!这些更新你值得关注!

    半导体hpm_apps v1.7.0上线

    半导体hpm_apps v1.7.0上线
    的头像 发表于 02-08 13:41 1302次阅读
    先<b class='flag-5'>楫</b>半导体<b class='flag-5'>hpm</b>_apps v1.7.0上线

    半导体HPM_SDK v1.8.0 发布

    半导体HPM_SDK v1.8.0 发布
    的头像 发表于 02-08 13:39 1020次阅读
    先<b class='flag-5'>楫</b>半导体<b class='flag-5'>HPM</b>_SDK v1.8.0 发布