当谈到微控制器(MCU)和人工智能(AI)的结合,我们进入了一个激动人心的领域。传统上,AI应用程序需要大型计算机或云服务器的处理能力,但随着技术的发展,现在可以将AI嵌入到微控制器中。这为嵌入式系统、物联网设备、机器人和各种其他应用开启了新的可能性。
MCU AI代表着微控制器上的人工智能。它是将机器学习和深度学习模型部署到资源有限但功能强大的微控制器中,以实现智能决策和感知。以下是MCU AI的一些关键方面:
MCU AI可以应用于各种领域,下面是一些示例:
作者开始深入进嵌入式AI这个领域,不过学习之前先了解如何用起来,跑起来。本篇文章聊一下如何移植TinyMaix推理框架到RT-THREAD并运行起来。
TinyMaix:是矽速科技(Sipeed)利用两个周末的业余时间完成的项目,它是一款专为微控制器设计的轻量级开源机器学习库,面向单片机的超轻量级的神经网络推理库,即TinyML推理库,可以让你在任意单片机上运行轻量级深度学习模型。TinyMaix开源代码链接:https://github.com/sipeed/tinymaix。
TinyMaix可以简单理解为一个矩阵和向量计算库,目前已支持如下几种计算硬件:
#define TM_ARCH_CPU (0) //default, pure cpu compute
#define TM_ARCH_ARM_SIMD (1) //ARM Cortex M4/M7, etc.
#define TM_ARCH_ARM_NEON (2) //ARM Cortex A7, etc.
#define TM_ARCH_ARM_MVEI (3) //ARMv8.1: M55, etc.
#define TM_ARCH_RV32P (4) //T-head E907, etc.
#define TM_ARCH_RV64V (5) //T-head C906,C910, etc.
#define TM_ARCH_CSKYV2 (6) //cskyv2 with dsp core
#define TM_ARCH_X86_SSE2 (7) //x86 sse2
对于ARM-Cortex系列MCU,可以支持纯CPU计算和SIMD计算。其中CPU计算部分无特殊依赖(计算代码均使用标准C实现)。SIMD部分,部分计算代码使用了C语言内嵌汇编实现,需要CPU支持相应的汇编指令,才可以正常编译、运行。
TinyMaix目前支持两种等级:1. 选择最少代码和buf 2. 选择速度,需要更多代码和buf
#define TM_OPT0 (0) //default, least code and buf
#define TM_OPT1 (1) //opt for speed, need more code and buf
#define TM_OPT2 (2) //TODO
TinyMaix支持不同位宽的量化:
#define TM_MDL_INT8 0
#define TM_MDL_INT16 1
#define TM_MDL_FP32 2
#define TM_MDL_FP16 3
#define TM_MDL_FP8_143 4 //experimental
#define TM_MDL_FP8_152 5 //experimental
TinyMaix框架对上层应用程序提供的核心API主要位于代码仓的tinymaix.h文件中,其中:
/******************************* MODEL FUNCTION ************************************/
tm_err_t tm_load (tm_mdl_t* mdl, const uint8_t* bin, uint8_t*buf, tm_cb_t cb, tm_mat_t* in); //load model
void tm_unload(tm_mdl_t* mdl); //remove model
tm_err_t tm_preprocess(tm_mdl_t* mdl, tm_pp_t pp_type, tm_mat_t* in, tm_mat_t* out); //preprocess input data
tm_err_t tm_run (tm_mdl_t* mdl, tm_mat_t* in, tm_mat_t* out); //run model
/******************************* STAT FUNCTION ************************************/
#if TM_ENABLE_STAT
tm_err_t tm_stat(tm_mdlbin_t* mdl); //stat model
#endif
/******************************* UTILS FUNCTION ************************************/
uint8_t TM_WEAK tm_fp32to8(float fp32);
float TM_WEAK tm_fp8to32(uint8_t fp8);
这里的模型,通常是预训练模型经过脚本转换生成的TinyMaix格式的模型;
#define TM_ARCH R_TINYMAIX_USING_ARCK_TYPE
#define TM_OPT_LEVEL R_TINYMAIX_USING_OPTION_LEVEL
#define TM_MDL_TYPE R_TINYMAIX_USING_MODULE_TYPE
#define TM_INLINE rt_inline
#define TM_WEAK rt_weak
#define tm_malloc(x) rt_malloc(x)
#define tm_free(x) rt_free(x)
#define TM_PRINTF(...) rt_kprintf(__VA_ARGS__)
#define TM_GET_US() rt_tick_get_millisecond() / 1000;
#define TM_DBGT_INIT() uint32_t _start,_finish;
float _time;
_start = TM_GET_US();
#define TM_DBGT_START() _start = TM_GET_US();
#define TM_DBGT(x) {
_finish=TM_GET_US();
_time = (float)(_finish-_start) / 1.0;
TM_PRINTF("===%s use %.3f msn", (x), _time);
_start=TM_GET_US();
}
int cifar10(int argc, char** argv)
int mnist(int argc, char** argv)
int vww(int argc, char** argv)
MSH_CMD_EXPORT(cifar10, TinyMaix cifar10 example);
MSH_CMD_EXPORT(mnist, TinyMaix mnist example);
MSH_CMD_EXPORT(vww, TinyMaix vww example);
实例的运行环境:STM32F401RE,M4内核,时钟频率:84MHz,RAM:96 KB,Flash:512 KB
全部0条评论
快来发表一下你的评论吧 !