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();}