本教程将带您深入探索 TensorFlow Lite Micro(TFLM)—— 一款专为资源受限的嵌入式系统打造的机器学习推理框架。从基础原理到实际部署,我们将逐步解析如何将深度学习模型运行在微控制器上,让 TinyML 从概念走向落地。
01 前言
通常情况下,实用的机器学习算法需要耗费大量计算资源,包括 CPU 运算周期和内存占用。不过,TensorFlow Lite 近期推出了一个实验版本,能够在多款微控制器上运行。如果我们能构建出适配资源受限设备的模型,就可以将嵌入式系统改造为小型机器学习(TinyML)设备。
TensorFlow Lite Micro(简称 TFLM)是一款开源机器学习推理框架,专门为在嵌入式系统上运行深度学习模型而设计。由于嵌入式系统面临资源受限的挑战,且碎片化严重,导致跨平台互操作性几乎难以实现,而 TFLM 恰好满足了对效率的严苛要求。该框架采用基于解释器的设计方案,既能克服这些独特难题,又能提供良好的灵活性。

图 1:一个包含两层的简易深度学习网络示意
02 开发
开发 TFLM 应用需遵循清晰的步骤,每一步都针对嵌入式设备的特殊性进行了优化。下面展开详细说明。
步骤一:创建算子解析器
第一步是在内存中创建一个有效的神经网络模型对象。应用开发者通过客户端 API 创建一个 “算子解析器”(operator resolver) 对象。该 “算子解析器”(OpResolver)API 负责控制最终二进制文件所包含的算子,从而最大限度减小文件体积。
步骤二:分配连续内存区域
第二步是提供一块连续的内存 “区域”(arena),用于存储解释器所需的中间结果及其他各类变量。这一步必不可少,因为嵌入式设备默认不支持动态内存分配。
步骤三:编译示例并初始化
第三步是创建一个编译示例,并将模型、算子解析器和内存区域作为参数传入。编译器会在初始化阶段,将运行所需的所有内存分配到该内存区域中。我们避免使用任何动态内存分配,以防止栈碎片化导致长期运行的应用程序出现错误。触发式应用可在模型评估阶段分配所需内存,因此此时会调用算子初始化函数,并将占用的内存转移至解释器。应用程序提供的算子解析器(OpResolver)会将序列化模型中列出的算子类型,映射到对应的执行函数。C 语言 API 调用负责管控解释器与算子之间的所有通信,确保算子的实现具有模块化特性,且独立于解释器的内部细节。这种设计不仅让开发者能轻松将算子执行器实现替换为优化版本,还能更方便地复用其他系统的算子执行库(例如,作为代码生成项目的一部分)。
步骤四:执行模型推理
第四步是执行阶段。应用程序先获取指向模型输入的内存区域指针,然后为其填充数据(这些数据通常来自传感器或其他用户提供的输入)。输入数据准备就绪后,应用程序调用解释器来执行模型计算。该过程包括:遍历按拓扑顺序排序的算子、利用内存规划阶段计算得到的偏移量定位输入与输出数据、以及为每个算子调用对应的评估执行函数。
步骤五:获取输出结果
最后,当所有算子评估执行完成后,解释器将控制权交还给应用程序。大多数微控制器(MCU)采用单线程架构,依靠中断处理紧急任务,这种方式完全可行。不过,应用程序仍可在单线程上运行,特定于平台的算子也能够在多个处理器之间分配计算任务。当解释器调用结束后,应用程序可向解释器查询包含模型计算输出结果的数组所在位置,随后即可使用该输出结果。

图 2:实现模块概览
