原创 TinyMaix

2024-1-13 14:09 180 0 分类: 物联网 文集: 学习分享
1 TinyMaix简介

TinyMaix是国内sipeed团队开发一个轻量级AI推理框架,TinyMaix 是面向单片机的超轻量级的神经网络推理库,即 TinyML 推理库,可以让你在任意单片机上运行轻量级深度学习模型。

  • 关键特性
  • 核心代码少于 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 在线模型训练
1.1 TinyMaix核心API

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

/******************************* 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 /******************************* UTILS FUNCTION ************************************/ uint8_t TM_WEAK tm_fp32to8(float fp32); float TM_WEAK tm_fp8to32(uint8_t fp8); /******************************* STAT FUNCTION ************************************/ #if TM_ENABLE_STAT tm_err_t tm_stat(tm_mdlbin_t* mdl); //stat model #endif

主要分为三类:

  • 模型函数,包括模型加载、卸载、预处理、推理;
  • 工具函数,包含FP32和uint8的互转;
  • 统计函数,用于输出模型中间层信息;

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

1.2 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的示例代码依赖于精准计时和打印输出能力,具体是项目的tm_port.h中的几个宏定义:

#define TM_GET_US() ((uint32_t)((uint64_t)clock()*1000000/CLOCKS_PER_SEC)) #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)/1000.0;\ TM_PRINTF("===%s use %.3f ms\n", (x), _time);\ _start=TM_GET_US();}

作者: 丙丁先生, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3996156.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论0条评论)

登录后参与讨论
我要评论
0
0
关闭 站长推荐上一条 /2 下一条