游乐游手机版
首页/AI热点日报/热点详情

先楫HPM6750上运行TinyMaix轻量级AI推理框架详细测评

类型:热点整理2026-07-16
基于先楫HPM6750移植轻量级AI推理框架TinyMaix,使用HPMSDK裸机环境,通过目录规划、源码修改和编译运行完成移植。基准测试涵盖mnist、cifar10等模型,在INT8和FP32模式下验证运行效果。注意事项包括堆大小调整和RISC-VISA设置。

本期内容由先楫开发者社区大咖@xusiwei1236分享基于先楫HPM6750的轻量级AI推理框架,快来一起了解吧~

一、TinyMaix是什么?

TinyMaix是由国内sipeed团队开发的一款超轻量级神经网络推理库,专为单片机等资源受限设备设计。官方介绍如下:TinyMaix 是面向单片机的超轻量级神经网络推理库,即 TinyML 推理库,可以让你在任意单片机上运行轻量级深度学习模型。即使在 Arduino ATmega328 (32KB Flash, 2KB RAM) 上,也能基于 TinyMaix 实现手写数字识别。TinyMaix官网提供了详细说明,可在本文末尾的参考链接中找到。

二、TinyMaix移植

本节将介绍如何将TinyMaix成功移植到HPM6750开发板上,具体步骤如下:

2.1 开发环境搭建

先楫官方提供了SDK开发环境RT-Thread开发环境两种方案,搭建方法均可在官方开发板用户手册(HPM6750EVKMINI USER GUIDE.pdfHPM6750EVK USER GUIDE.pdf)中找到,也可参考我此前发布的帖子(详见文末参考链接)。鉴于TinyMaix针对已支持MCU的基准测试均基于裸机,因此此处选用HPM SDK开发环境。此外,基于裸机的移植在RTOS环境下通常也能正常运行。因此,对于MCU芯片的计算类开源项目移植(例如本案例中的TinyMaix),建议优先采用裸机方案

使用的HPM SDK版本为0.14.0,SEGGER Embedded Studio版本信息如下:

  • SEGGER Embedded Studio for RISC-V
  • Release 6.40 Build 2022102501.51567
  • Windows x64
  • 2014-2022 SEGGER Microcontroller GmbH
  • 1997-2022 Rowley Associates Ltd.
  • segger-cc: version 15.0.0
  • segger-ld: version 4.36.0
  • segger-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: built using the version 15.0.0 source distribution

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 函数冲突。

小提示: 为了简便起见,这里并未将TinyMaix放入hpm_sdk的middleware目录;在实际项目中使用时,建议将其放置到middleware目录下以便管理。

此外,还需要修改 tm_port.h 文件,具体差异如下:

diff --git a/include/tm_port.h b/include/tm_port.h
index 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 ha ve FPU, may speed up 1/3, but decrease accuracy
-#define TM_LOCAL_MATH (0) //use local math func (like exp()) to a void libm
+#define TM_LOCAL_MATH (1) //use local math func (like exp()) to a void 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();
 #define TM_DBGT_START()    _start=TM_GET_US();

2.2.3 编译运行

HPM6750项目的生成命令如下:

generate_project -b hpm6750evkmini -t flash_xip -f

关于HPM6750项目的编译与运行,具体可参考开发环境搭建文章(链接见文末)。手写数字识别(mnist模型)运行后,串口输出结果如下:

三、基准测试

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

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

3.1 场景1: TM_MDL_INT8 + TM_OPT0

3.2 场景2: TM_MDL_INT8 + TM_OPT1

3.3 场景3: TM_MDL_FP32 + TM_OPT0

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 改为 rv32gcCode -> Code Generation -> RIS-V ISA),以确保编译器能生成浮点运算指令。

常见问题 (FAQ)

  1. 问:移植时提示“undefined reference”错误怎么办?
    答:通常是因为未正确包含TinyMaix的源文件或头文件路径。请检查CMakeLists.txt中是否添加了TinyMaix的源文件目录和头文件搜索路径。同时确保tm_port.h中的宏定义(如TM_LOCAL_MATHTM_GET_US)已按HPM6750平台正确修改。
  2. 问:运行vww或mbnet模型时程序跑飞或死机?
    答:通常由堆内存不足引发。请按上述注意事项将Heap Size设置为至少512KB。若问题依然存在,请检查是否开启了FPU相关编译选项(对于FP32模型需将ISA设为rv32gc)。
  3. 问:基准测试结果中的时间单位是什么?
    答:TinyMaix内部使用微秒(us)计时,输出结果通常为毫秒(ms)或微秒(us),具体可查看源码中的时间打印格式。
  4. 问:能否在RT-Thread系统上使用TinyMaix?
    答:可以。本移植基于裸机,但同样的步骤也适用于RT-Thread等RTOS环境。只需将tm_port.h中的时钟获取函数替换为RT-Thread提供的rt_tick_get()或类似函数即可。

结语

本文详细介绍了将TinyMaix轻量级AI推理框架移植到先楫HPM6750开发板的全过程,涵盖开发环境搭建、目录规划、源码修改、编译运行以及基准测试结果。通过本教程,你可以在HPM6750上轻松运行手写数字识别、图像分类等典型AI模型,为嵌入式AI应用开发筑牢基础。如需进一步了解TinyMaix的更多功能,请访问其官方仓库和文档。

来源:https://m.elecfans.com/article/2135085.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。