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

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

3天内不再提示

RT-Thread上部署TinyMaix推理框架,使MCU赋予AI能力

Rice嵌入式开发技术分享 来源:Rice嵌入式开发技术分享 作者:Rice嵌入式开发技术 2023-11-05 08:39 次阅读


概要

当谈到微控制器MCU)和人工智能AI)的结合,我们进入了一个激动人心的领域。传统上,AI应用程序需要大型计算机或云服务器的处理能力,但随着技术的发展,现在可以将AI嵌入到微控制器中。这为嵌入式系统物联网设备、机器人和各种其他应用开启了新的可能性。

MCU AI的崛起

MCU AI代表着微控制器上的人工智能。它是将机器学习深度学习模型部署到资源有限但功能强大的微控制器中,以实现智能决策和感知。以下是MCU AI的一些关键方面:

  • 低功耗:微控制器通常以电池供电,因此低功耗是至关重要的。AI模型需要经过优化,以在微控制器上运行,同时尽量减小能耗。
  • 实时性:微控制器常常用于实时控制系统,因此AI模型需要在极短的时间内执行,以应对即时需求。
  • 感知和决策:MCU AI可以使设备具备感知环境、分析数据并作出决策的能力。这对于自主机器人、智能传感器和自动控制系统尤为有用。

MCU AI的应用

MCU AI可以应用于各种领域,下面是一些示例:

  • 智能物联网设备:微控制器上的AI可以使物联网设备更加智能,例如智能家居设备、智能灯具和智能门锁。它们可以学习用户的偏好,并自动适应不同环境。
  • 自主机器人:微控制器上的AI使自主机器人能够避障、规划路径和执行任务,例如清扫机器人和无人机
  • 医疗设备:在医疗设备中,MCU AI可以用于监测患者的生命体征,提供早期警报和更好的病人护理。
  • 工业自动化:微控制器上的AI可用于工业机器人、自动化生产线和质量控制系统,提高效率和质量。

作者开始深入进嵌入式AI这个领域,不过学习之前先了解如何用起来,跑起来。本篇文章聊一下如何移植TinyMaix推理框架到RT-THREAD并运行起来。

TinyMaix

TinyMaix:是矽速科技Sipeed)利用两个周末的业余时间完成的项目,它是一款专为微控制器设计的轻量级开源机器学习库,面向单片机的超轻量级的神经网络推理库,即TinyML推理库,可以让你在任意单片机上运行轻量级深度学习模型。TinyMaix开源代码链接:https://github.com/sipeed/tinymaix。

TinyMaix关键特性

  • 核心代码少于 400行(tm_layers.c+tm_model.c+arch_cpu.h), 代码段(.text)少于3KB
  • 低内存消耗,甚至 Arduino ATmega328 (32KB Flash, 2KB Ram) 都能基于 TinyMaix 跑 mnist(手写数字识别)
  • 支持 INT8/FP32/FP16 模型,实验性地支持 FP8 模型,支持 keras h5 或 tflite 模型转换
  • 支持多种芯片架构的专用指令优化: ARM SIMD/NEON/MVEI,RV32P, RV64V
  • 友好的用户接口,只需要 load/run 模型~
  • 支持全静态的内存配置(无需 malloc )
  • 即将支持 MaixHub 在线模型训练

TinyMaix底层依赖

TinyMaix可以简单理解为一个矩阵和向量计算库,目前已支持如下几种计算硬件

#defineTM_ARCH_CPU(0)//default,purecpucompute
#defineTM_ARCH_ARM_SIMD(1)//ARMCortexM4/M7,etc.
#defineTM_ARCH_ARM_NEON(2)//ARMCortexA7,etc.
#defineTM_ARCH_ARM_MVEI(3)//ARMv8.1:M55,etc.
#defineTM_ARCH_RV32P(4)//T-headE907,etc.
#defineTM_ARCH_RV64V(5)//T-headC906,C910,etc.
#defineTM_ARCH_CSKYV2(6)//cskyv2withdspcore
#defineTM_ARCH_X86_SSE2(7)//x86sse2

对于ARM-Cortex系列MCU,可以支持纯CPU计算和SIMD计算。其中CPU计算部分无特殊依赖(计算代码均使用标准C实现)。SIMD部分,部分计算代码使用了C语言内嵌汇编实现,需要CPU支持相应的汇编指令,才可以正常编译、运行。

TinyMaix等级选择

TinyMaix目前支持两种等级:1. 选择最少代码和buf 2. 选择速度,需要更多代码和buf

#defineTM_OPT0(0)//default,leastcodeandbuf
#defineTM_OPT1(1)//optforspeed,needmorecodeandbuf
#defineTM_OPT2(2)//TODO

TinyMaix量化

TinyMaix支持不同位宽的量化:

#defineTM_MDL_INT80
#defineTM_MDL_INT161
#defineTM_MDL_FP322
#defineTM_MDL_FP163
#defineTM_MDL_FP8_1434//experimental
#defineTM_MDL_FP8_1525//experimental

TinyMaix核心API

TinyMaix框架对上层应用程序提供的核心API主要位于代码仓的tinymaix.h文件中,其中:

  1. 模型API包含四个:模型加载,模型卸载,预处理,推理。
/*******************************MODELFUNCTION************************************/
tm_err_ttm_load(tm_mdl_t*mdl,constuint8_t*bin,uint8_t*buf,tm_cb_tcb,tm_mat_t*in);//loadmodel
voidtm_unload(tm_mdl_t*mdl);//removemodel
tm_err_ttm_preprocess(tm_mdl_t*mdl,tm_pp_tpp_type,tm_mat_t*in,tm_mat_t*out);//preprocessinputdata
tm_err_ttm_run(tm_mdl_t*mdl,tm_mat_t*in,tm_mat_t*out);//runmodel
  1. 统计函数:用于输出模型中间层信息
/*******************************STATFUNCTION************************************/
#ifTM_ENABLE_STAT
tm_err_ttm_stat(tm_mdlbin_t*mdl);//statmodel
#endif
  1. 工具函数,包含FP32和uint8的互转
/*******************************UTILSFUNCTION************************************/
uint8_tTM_WEAKtm_fp32to8(floatfp32);
floatTM_WEAKtm_fp8to32(uint8_tfp8);

这里的模型,通常是预训练模型经过脚本转换生成的TinyMaix格式的模型;

TinyMaix移植到RT-Thread

  1. TinyMaix移植到RT-Thread工作量其实不到,主要适配tm_port.h文件即可。
  2. RT-Thread的配置是通过Kconfig设置一些参数的,所以我把硬件类型,选择等级,量化类型都修改为Kconfig进行配置。
#defineTM_ARCHR_TINYMAIX_USING_ARCK_TYPE
#defineTM_OPT_LEVELR_TINYMAIX_USING_OPTION_LEVEL
#defineTM_MDL_TYPER_TINYMAIX_USING_MODULE_TYPE
  1. TinyMaix需要对接平台内联,内存,打印等接口,所以我们修改对应宏定义,将其适配到RT-Thread平台的接口上。
#defineTM_INLINErt_inline
#defineTM_WEAKrt_weak

#definetm_malloc(x)rt_malloc(x)
#definetm_free(x)rt_free(x)

#defineTM_PRINTF(...)rt_kprintf(__VA_ARGS__)
  1. TinyMaix调试依赖于精准的计时,我们需要适配其对应的几个宏定义,因为RT-Thread系统没有提供微秒级的接口,只有毫秒级的接口,所以我做了简单的适配。
#defineTM_GET_US()rt_tick_get_millisecond()/1000;

#defineTM_DBGT_INIT()uint32_t_start,_finish;
float_time;
_start=TM_GET_US();

#defineTM_DBGT_START()_start=TM_GET_US();

#defineTM_DBGT(x){
_finish=TM_GET_US();
_time=(float)(_finish-_start)/1.0;
TM_PRINTF("===%suse%.3fmsn",(x),_time);
_start=TM_GET_US();
}
  1. TinyMaix提供了多个实例,如:cifar10,mnist,vww等,RT-Thread支持命令行输入,为了实例可以在通过命令函运行,我们需要修改一下文件名和接口名字。
  • 我们将examples下的cifar10,mnist,vww三个实例下的main.c修改为对应实例的名字:cifar10.c,mnist.c,vww.c。
  • 将cifar10.c,mnist.c,vww.c中的main函数修改为对应实例名字。
intcifar10(intargc,char**argv)

intmnist(intargc,char**argv)

intvww(intargc,char**argv)
  • 将实例接口导出到命令行中。
MSH_CMD_EXPORT(cifar10,TinyMaixcifar10example);

MSH_CMD_EXPORT(mnist,TinyMaixmnistexample);

MSH_CMD_EXPORT(vww,TinyMaixvwwexample);

TinyMaix运行效果

实例的运行环境:STM32F401RE,M4内核,时钟频率:84MHz,RAM:96 KB,Flash:512 KB

  1. cifar10实例,分类检测,识别图片是一只鸟:
c22d8754-7b73-11ee-b3e3-92fbcf53809c.jpgc241c2be-7b73-11ee-b3e3-92fbcf53809c.jpg
  1. mnist实例,数字识别,图片是一个数字2:

c2558a9c-7b73-11ee-b3e3-92fbcf53809c.png

c2693f74-7b73-11ee-b3e3-92fbcf53809c.jpg
  1. vww实例,检测有没有人,图片有人:
c27013e4-7b73-11ee-b3e3-92fbcf53809c.jpg

c2758cc0-7b73-11ee-b3e3-92fbcf53809c.png

总结

  1. TinyMaix作者已经做了一个RT-Thread的软件包:r-tinymaix。可以在RT-Thread中工程中加入软件包即可以验证。
  2. r-tinymaix的开源链接:https://github.com/RiceChen0/r-tinymaix
  3. TinyMaix非常赞,可以让一个普普通通的单片机拥有AI能力,让嵌入式AI成本减低。

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

    关注

    146

    文章

    16211

    浏览量

    345511
  • AI
    AI
    +关注

    关注

    87

    文章

    27470

    浏览量

    265147
  • RT-Thread
    +关注

    关注

    31

    文章

    1196

    浏览量

    39057
  • 深度学习
    +关注

    关注

    73

    文章

    5270

    浏览量

    120176
  • TinyML
    +关注

    关注

    0

    文章

    42

    浏览量

    1145
收藏 人收藏

    评论

    相关推荐

    基于RT-Thread的RoboMaster电控框架设计

    由于 RT-Thread 稳定高效的内核,丰富的文档教程,积极活跃的社区氛围,以及设备驱动框架、Kconfig、Scons、日志系统、海量的软件包……很难不选择 RT-Thread 进行项目开发。
    发表于 09-06 15:21 480次阅读

    RT-Thread AI kit轻松部署 STM32Cube-AIRT-Thread 精选资料推荐

    RT-AK 简介RT-AK:RT-Thread AI kit,RT-Thread AI套件
    发表于 07-20 08:20

    轻松实现一键部署AI模型至RT-Thread系统

    RT-AK 是 RT-Thread 团队为 RT-Thread 实时操作系统所开发的 AI 套件,能够一键将 AI 模型
    发表于 09-02 15:06

    关于RT-AK开源轻松实现一键部署AI模型至RT-Thread解析

    RT-AK 是 RT-Thread 团队为 RT-Thread 实时操作系统所开发的 AI 套件,能够一键将 AI 模型
    的头像 发表于 04-26 18:07 3998次阅读
    关于<b class='flag-5'>RT</b>-AK开源轻松实现一键<b class='flag-5'>部署</b><b class='flag-5'>AI</b>模型至<b class='flag-5'>RT-Thread</b>解析

    RT-Thread AI kit开源:轻松实现一键部署AI模型至 RT-Thread

    RT-AK 是 RT-Thread 团队为 RT-Thread 实时操作系统所开发的 AI 套件,能够一键将 AI 模型
    发表于 01-25 18:18 3次下载
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>AI</b> kit开源:轻松实现一键<b class='flag-5'>部署</b><b class='flag-5'>AI</b>模型至 <b class='flag-5'>RT-Thread</b>

    RT-Thread大会:瑞萨e- AI成功案例及部署

      RT-Thread IoT OS Global Tech Conference (RT-Thread GTC,RT-Thread全球技术大会)致力于围绕RT-Thread IoT
    的头像 发表于 05-27 10:18 1204次阅读
    <b class='flag-5'>RT-Thread</b>大会:瑞萨e- <b class='flag-5'>AI</b>成功案例及<b class='flag-5'>部署</b>

    RT-Thread全球技术大会:RT-Thread上的单元测试框架与运行测试用例

    RT-Thread全球技术大会:RT-Thread上的单元测试框架与运行测试用例                 审核编辑:彭静
    的头像 发表于 05-27 16:21 1320次阅读
    <b class='flag-5'>RT-Thread</b>全球技术大会:<b class='flag-5'>RT-Thread</b>上的单元测试<b class='flag-5'>框架</b>与运行测试用例

    RT-Thread文档_RT-Thread SMP 介绍与移植

    RT-Thread文档_RT-Thread SMP 介绍与移植
    发表于 02-22 18:31 8次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> SMP 介绍与移植

    RT-Thread文档_utest 测试框架

    RT-Thread文档_utest 测试框架
    发表于 02-22 18:43 2次下载
    <b class='flag-5'>RT-Thread</b>文档_utest 测试<b class='flag-5'>框架</b>

    如何在RT-Thread OS环境下使用ncnn进行AI推理

    今天简报较短,主要演示一下如何在RT-Thread OS环境下使用ncnn进行AI推理
    的头像 发表于 05-04 16:29 930次阅读
    如何在<b class='flag-5'>RT-Thread</b> OS环境下使用ncnn进行<b class='flag-5'>AI</b><b class='flag-5'>推理</b>

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

    本期内容由先楫开发者社区大咖@xusiwei1236分享基于先楫HPM6750的轻量级AI推理框架,赶紧来瞧瞧~一、TinyMaix是什么?Tiny
    的头像 发表于 12-12 17:57 1194次阅读
    测评分享 | 如何在先楫HPM6750上运行轻量级<b class='flag-5'>AI</b><b class='flag-5'>推理</b><b class='flag-5'>框架</b><b class='flag-5'>TinyMaix</b>

    基于 RT-Thread 的 RoboMaster 电控框架(一)

    由于 RT-Thread 稳定高效的内核,丰富的文档教程,积极活跃的社区氛围,以及设备驱动框架、Kconfig、Scons、日志系统、海量的软件包……很难不选择 RT-Thread 进行项目开发
    的头像 发表于 09-19 19:55 506次阅读

    4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    4月10日我们将在深圳福田举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread
    的头像 发表于 03-27 08:34 267次阅读
    4月10日深圳场<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合<b class='flag-5'>部署</b>新模式!

    4月25日北京站RT-Thread线下workshop,探索RT-Thread混合部署新模式

    4月25日,下午我们将在北京举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Threa
    的头像 发表于 04-16 08:35 215次阅读
    4月25日北京站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合<b class='flag-5'>部署</b>新模式

    6月6日杭州站RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    6月6日下午我们将在杭州举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread
    的头像 发表于 05-28 08:35 192次阅读
    6月6日杭州站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合<b class='flag-5'>部署</b>新模式!