7.9. TensorFlow Lite for Microcontrollers

TFLM 是大多数摄像头用来执行已加载模型的运行时。它解析 .tflite 文件——一个由算子、权重和张量形状组成的 FlatBuffer——并按顺序遍历算子列表,把每个算子分派给一个内核,由内核产生下一个中间张量。

中间张量驻留在加载时分配的固定大小 张量竞技场(tensor arena) 中。摄像头分两遍确定竞技场的大小:首先,针对最大可用堆构建一个一次性使用的解释器,使模型能够报告它所需的工作内存;随后以恰好该大小加上一小段余量分配持久化解释器。模型越小,留给脚本其余部分的堆空间就越多。

TFLM 是 H7、RT1062 和 AE3 上的引擎。

三栏并排。左:H7 和 RT1062 在 Cortex-M7 上运行带有 CMSIS-NN 内核的 TFLM。中:AE3 在带有 Ethos-U55 NPU 的 Cortex-M55 上运行带有 CMSIS-NN 和 Ethos-U 算子的 TFLM。 右:N6 在 Neural-ART NPU 上运行 STAI。

位于 predict() 中间的引擎在每个摄像头系列上都是不同的栈。

7.9.1. 算子解析器

TFLM 并不附带所有内核。摄像头链接进一个 解析器(resolver),列出它能够执行的算子;针对该解析器加载的模型如果包含列表之外的算子,就会在加载时失败。随固件发布的构建注册了视觉和信号处理网络中常见的算子——卷积层和全连接层、池化层和激活层、reshape 和 concat 算子、quantize 和 dequantize 算子——因此基于某个标准架构(YOLO、MediaPipe、MobileNet)训练的模型无需扩展列表即可加载。

AE3 构建额外注册了 Ethos-U 算子。一个由 Vela 编译的模型在其他方面就是一个普通的 .tflite,TFLM 会照常遍历它;被 Vela 标记的子图会命中 Ethos-U 算子并分派给 NPU