
轻松学习 TFLM摘要:本文是一份 TFLM(TensorFlow Lite for Microcontrollers)的入门学习地图。文章从“一句话理解 TFLM”切入,介绍了其作为资源受限设备上轻量推理运行时的核心定位;随后梳理了工程顶层结构,并提炼出新手需优先掌握的 5 个核心概念(Model、Interpreter、Op Resolver、Tensor Arena、Kernel)。接着,文章详细拆解了一次推理从创建、AllocateTensors 到 Invoke 的主要调用链,并系统性地遍历了仓库中每个目录与文件的作用与阅读规律。针对 AI 芯片设计商,文章给出了从平台移植、加速模式选择、NN library 边界建立、内存处理到优化 kernel 注册与测试的完整集成路线图。最后,文章提供了一份 5 天新手学习路线与精髓总结,帮助读者快速建立对 TFLM 工程的整体认知。本文基于当前仓库/Users/thomasliu/Documents/projects/tinyml/tflite-micro阅读整理。它的目标不是把 1796 个文件机械抄一遍,而是帮新手建立一张可靠的地图:知道工程由哪些部分组成、每类文件负责什么、一次推理是怎么跑起来的,以及如果你是 AI 芯片设计商,应该把自己的硬件能力接到哪里。1. 一句话理解 TFLMTFLM,全名 TensorFlow Lite for Microcontrollers,是把.tflite模型放到 MCU、DSP、NPU、AI 芯片等资源受限设备上运行的轻量推理运行时。你可以把它想成一个很小的“模型执行器”:读取.tflite模型结构。找到模型需要的算子,比如CONV_2D、FULLY_CONNECTED、SOFTMAX。在一块用户给定的静态内存tensor_arena里完成所有运行时分配。按模型图的顺序调用每个算子的Init、Prepare、Invoke。把输入 tensor 变成输出 tensor。TFLM 的核心哲学是:少依赖、少动态分配、可裁剪、可移植、适合裸机和小系统。2. 工程组成总览顶层结构大致如下:. ├── README.md / CONTRIBUTING.md / LICENSE / SECURITY.md ├── BUILD / MODULE.bazel / .bazelrc ├── tensorflow/ │ └── lite/ │ ├── micro/ # TFLM 主体 │ ├── kernels/internal/ # TFLite 参考算子底层实现 │ ├── c/ core/ schema/ # TFLite 公共 C API、类型、FlatBuffer schema │ └── tools/ python/ # 模型工具和辅助脚本 ├── signal/ # TFLM signal/audio 前处理算子 ├── python/ # Python 包装层和 PyPI 构建 ├── third_party/ # flatbuffers、kissfft、hexagon、xtensa 等依赖 ├── ci/ .github/ # CI、同步、平台构建脚本 ├── docs/ # 仓库级文档 ├── data/ # 连续构建和 profiling 结果 └── tools/ # 通用 Bazel 工具主线代码在tensorflow/lite/micro。如果你只想学会 TFLM,优先读这里。3. 新手先抓住 5 个核心概念3.1 Model模型是.tflite文件,本质是 FlatBuffer。它描述了:有哪些 tensor。有哪些 operator。每个 operator 的输入、输出、参数。权重 buffer 在哪里。相关文件:tensorflow/compiler/mlir/lite/schema/schema.fbstensorflow/lite/schema/schema_generated.htensorflow/lite/schema/schema_utils.htensorflow/lite/micro/flatbuffer_utils.*3.2 InterpreterMicroInterpreter是执行入口。用户通常这样用:consttflite::Model*model=tflite::GetModel(g_model);tflite::MicroMutableOpResolver4resolver;resolver.AddConv2D();resolver.AddFullyConnected();resolver.AddSoftmax();uint8_ttensor_arena[64*1024];tflite::MicroInterpreterinterpreter(model,resolver,tensor_arena,sizeof(tensor_arena));interpreter.AllocateTensors();interpreter.input(0)-data.int8[...]=...;interpreter.Invoke();auto*output=interpreter.output(0);关键文件:tensorflow/lite/micro/micro_interpreter.htensorflow/lite/micro/micro_interpreter.cc3.3 Op ResolverTFLM 不会默认把所有算子都编进来。你要告诉它模型需要哪些算子。关键文件:tensorflow/lite/micro/micro_op_resolver.htensorflow/lite/micro/micro_op_resolver.cctensorflow/lite/micro/micro_mutable_op_resolver.htensorflow/lite/micro/kernels/micro_ops.hMicroMutableOpResolverN里的N是最多注册几个算子。比如模型只用 3 个算子,就不要注册 100 个,这样代码体积更小。3.4 Tensor ArenaTFLM 通常不使用malloc/free。用户给它一整块数组,TFLM 在里面分配:低地址 高地址 ┌──────────────┬───────────────────────┬────────────────────┐ │ Head │ Temporary │ Tail │ │ tensor buffer│ 临时对象/临时 tensor │ 持久结构/OpData │ └──────────────┴───────────────────────┴────────────────────┘关键文件:tensorflow/lite/micro/micro_allocator.*tensorflow/lite/micro/arena_allocator/*tensorflow/lite/micro/memory_planner/*tensorflow/lite/micro/recording_micro_allocator.*tensorflow/lite/micro/docs/memory_management.md3.5 Kernel每个算子 kernel 通常由三部分组成:Init:申请持久化的 op 私有数据。Prepare:检查输入输出类型、形状、量化参数,申请 scratch buffer。Eval/Invoke:真正计算。以FULLY_CONNECTED为例:tensorflow/lite/micro/kernels/fully_connected.cc负责 TFLM kernel 封装。tensorflow/lite/micro/kernels/fully_connected_common.cc负责公共参数计算。tensorflow/lite/kernels/internal/reference/fully_connected.h负责可移植参考实现。tensorflow/lite/micro/kernels/cmsis_nn/fully_connected.cc、xtensa/fully_connected.cc、ceva/fully_connected.cc是硬件优化版本。4. 一次推理的主要调用链4.1 创建阶段用户构造:tflite::MicroInterpreterinterpreter(model,resolver,tensor_arena,arena_size);内部主要调用:MicroInterpreter::MicroInterpreter └── MicroAllocator::Create ├── PersistentArenaBufferAllocator ├── NonPersistentArenaBufferAllocator └── GreedyMemoryPlanner 或 LinearMemoryPlanner相关文件:micro_interpreter.ccmicro_allocator.ccarena_allocator/*.ccmemory_planner/*.cc4.2 AllocateTensors 阶段调用:interpreter.AllocateTensors();内部主线:MicroInterpreter::AllocateTensors ├── allocator_.StartModelAllocation(model) ├── PrepareNodeAndRegistrationDataFromFlatbuffer │ ├── 读取 FlatBuffer operator code │ ├── op_resolver.FindOp(...) │ ├── parser 解析 builtin_data │ └── 构造 TfLiteNode + TFLMRegistration ├── graph_.InitSubgraphs │ └── 调每个 kernel 的 init ├── graph_.PrepareSubgraphs │ └── 调每个 kernel 的 prepare ├── allocator_.FinishModelAllocation │ ├── 生成 tensor 生命周期信息 │ ├── GreedyMemoryPlanner 规划 Head │ └── 提交 scratch buffer 和 tensor buffer 地址 └── 准备 input/output TfLiteTensor 访问器4.3 Invoke 阶段调用:interpreter.Invoke();