
TinyML是指在边缘设备上运行的机器学习模型,通常是在资源受限的嵌入式系统上运行的轻量级模型。这些设备可以是智能手机、传感器、微控制器或其他嵌入式设备。 TinyML的目标是在这些设备上实现低功耗、低延迟和隐私保护的机器学习应用。 TinyML的发展受益于多个技术进步,包括模型压缩、量化、剪枝和量化训练等技术。这些技术允许将大型的深度学习模型压缩到足够小的尺寸,以适应嵌入式设备的资源限制。 此外,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 在线模型训练支持 项目地址: https://github.com/sipeed/TinyMaix 下面 说明 如何移植。官方文档内有说明如何移植(readme文档),** 在这里 重新记录一下。** TinyMaix的核心文件只有这5个: tm_model.c, tm_layers.c, tinymaix.h, tm_port.h, arch_xxx.h 如果你使用没有任何指令加速的普通单片机,选择 arch_cpu.h, 否则选择对应架构的头文件。 然后你需要编辑tm_port.h,填写你需要的配置,所有配置宏后面都有注释说明。注意 TM_MAX_CSIZE,TM_MAX_KSIZE,TM_MAX_KCSIZE 会占用静态缓存。 最后你只需要把他们放进你的工程里编译即可。 如何使用 (API)** 使用步骤-》1、加载模型-》2、输入数据预处理-》3、运行模型-》4、移除模型 加载模型* tm_err_t tm_load (tm_mdl_t mdl, const uint8_t* bin, uint8_tbuf, tm_cb_t cb, tm_mat_t in); mdl: 模型句柄; bin: 模型bin内容; buf: 中间结果的主缓存;如果NULL,则内部自动malloc申请;否则使用提供的缓存地址 cb: 网络层回调函数; in: 返回输入张量,包含输入缓存地址 //可以忽略之,如果你使用自己的静态输入缓存 输入数据预处理 tm_err_t tm_preprocess(tm_mdl_t mdl, tm_pp_t pp_type, tm_mat_t in, tm_mat_t* out); TMPP_FP2INT //用户自己的浮点缓存转换到int8缓存 TMPP_UINT2INT //典型uint8原地转换到int8数据;int16则需要额外缓存 TMPP_UINT2FP01 //uint8转换到01的浮点数 u8/255.0 TMPP_UINT2FPN11//uint8转换到-11的浮点数 运行模型 tm_err_t tm_run (tm_mdl_t mdl, tm_mat_t in, tm_mat_t* out); 移除模型 void tm_unload(tm_mdl_t* mdl); 怎样添加新平台的加速代码 对于新增平台,你只需要在src里添加arch_xxx.h文件并实现其中的函数即可,主要为以下几个函数(重要性降序排列,不重要的函数可以直接拷贝纯CPU运算的函数): a. TM_INLINE void tm_dot_prod(mtype_t sptr, mtype_t kptr,uint32_t size, sumtype_t result) 实现平台相关的点积函数,可以使用MAC相关的加速指令加速。 b. TM_INLINE void tm_dot_prod_pack2(mtype_t sptr, mtype_t kptr, uint32_t size, sumtype_t result) 实现平台相关的双通道点积函数。(仅提供到双通道是因为有些芯片平台的寄存器不足以支持更多通道的点积加速) c. TM_INLINE void tm_postprocess_sum(int n, sumtype_t sums, btype_t bs, int act, mtype_t outp, sctype_t scales, sctype_t out_s, zptype_t out_zp) 实现平台相关的批量后处理函数,注意n为2的次幂。 d. TM_INLINE void tm_dot_prod_3x3x1(mtype_t sptr, mtype_t kptr, sumtype_t result) 实现平台相关的3x3点积加速 e. TM_INLINE void tm_dot_prod_gap_3x3x1(mtype_t sptr, mtype_t kptr, uint32_t k_oft, sumtype_t* result) 实现平台相关的3x3 gap的点积加速 下面分享基于STM32U545的具体移植过程。 首先下载源码,添加到工程中。 接着修改tm_port.h文件配置 由于代码中使用了动态分配,所以工程中堆栈的容量最好先设置大一些。 下面是添加数字识别例子。 然后要包含TinyML的头文件路径。设置优化等级。 再就是主函数中调用例子。 编译整个工程,然后下载到开发板上。通过串口可以看到识别结果。 我在lcd屏上也显示了输出结果。 |
LCD屏设计的真不错- X% a( S6 L9 {9 y& k x |
STM32U5低功耗测试
STM32怎么选型
内存配置的艺术:STM32为嵌入式系统高端UI优化RAM和闪存的三大策略
STM32U5 系列使用 LPBAM 进行功耗优化
【STM32U545】实现CAN数据收发
【我的STM32U5 项目秀】+04-MPU6050在STM32U5上的移植
实战经验 | 基于 STM32U5 创建 USBx_CustomHID 通信
STM32U5 x E-BIKE,记录你的骑行多巴胺
基于STM32U5系列TIMER+DMA+DAC应用经验分享
实战经验 | 基于 STM32U5 片内温度传感器正确测算温度