TensorFlow Lite Micro简介与使用

简介

TensorFlow Lite是Tensorflow库中针对像笔记本、手机、树莓派、FPGA等边缘设备而设计的机器学习库,而TensorFlow Lite Micro则更加轻量级,专门针对microcontroller(MCU,即单片机)。我们生活中常见的AI都是基于云计算,就是得联网,由远处的服务器运算好了结果再将结果发回边缘设备,而TensorFlow Lite Micro的出现使得边缘的MCU能自主进行机器学习运算,即智能化,这是非常不可思议的。如今全球MCU已经部署超过2000亿,数量将继续指数级上升。如果这些边缘传感器都能运行机器学习算法,升级为智能传感器,AIoT和边缘计算将更加普及,整个世界将更加智能。

为何不直接使用TensorFlow模型

一个常规的ML模型包括以下功能:
Data loading、Scripting Interface、Cloud Serving、Metric Visualizer、Model Optimization、Labeling Tools、Feature Generation、Training Loop、Variable Storage、Distributed Compute、Math Library。
(数据加载,脚本接口,云服务,度量可视化工具,模型优化,标签工具,特征生成,训练循环,变量存储,分布式计算,数学库)
看着都很多很复杂对不对,看着就很占内存,事实确实如何,很多google的工程师之前也尝试过,结果表明正常训练好的tensorflow模型对于资源受限的边缘设备来说太大了,构建所需要的所有依赖关系和优化这么大的代码库是痛苦而困难的,即使这个模型大小合适,还有一系列的导出问题。为了缩小模型,我们可以删除反向传播、数据加载、特征生成组件等功能,将变量转换为常量,模型优化等等。
最终google实现了利用tensorflow lite使得手机或MCU上的ML框架只有:Math Library,为导入MCU增添了可能,但是还是有很多挑战。

Challenges(挑战)

将正常model转入MCU中面临很多挑战:

  • 正常模型中的权重是存储在变量中,但转换后的文件里面没有变量这个操作
  • 输入的特征需要被计算
  • 正常模型中有些结构部分用脚本语言表示
  • 分布式计算是图的一部分
  • 数据加载是图的一部分
  • 反向传播是图的一部分
  • 在训练过程中有不起作用的推理

所以编写一个将大型model转换为小型的运行在边缘端的model的转换器将会非常困难,我们需要在训练之前就做好相对应的对策。

模型转换

一个tensorflow训练好的模型会按一下步骤转换为TFLite模型
在这里插入图片描述

在python中转换的代码就两行:
在这里插入图片描述

上面简单的两行代码里完成了这些操作:

  1. 将TensorFlow操作转换为TF Lite等价表示。
  2. 移除反向传递、数据加载、调试、分布式计算和特征生成等操作! 训练图除了我们进行预测所需要的推断部分外,还有很多内容。去除所有无关的成分意味着理解不同比特的含义,而不是仅仅把它当作一个数学运算图。这意味着,如果我们能够在构建模型时继承关于开发人员意图的信息,我们通常可以提供更好的支持。所执行的数学运算列表是汇编程序级别,为了有效地转换(并提供有意义的调试信息),我们必须将其与用户熟悉的脚本语言连接起来。
  3. 将权重都变成常数! 神经网络中的权重在训练过程中不断更新,因此它们被存储在变量中。还有其他的值也存储在变量中,比如全局步长或动量信息。在TensorFlow中,完全连接或卷积的输入也可能是变量以外的东西,但这在TF Lite中不支持。导出程序必须解决这些问题,并输出一个文件,其中包含所有权重、形状和其他对推断很重要的变量,并存储为常量。
  4. 模型性能优化。 优化批量规范化和其他纯训练结构,量化、剪枝、权重聚集等
  5. 从拓扑学角度对图进行执行顺序排序。 TensorFlow图存储为节点和边的网络,表示操作之间的输入依赖关系。在训练过程中,遍历有向图是必要的,因为可能会有动态的变化。推断的顺序是固定的,因此我们将图转换为要执行的操作的有序列表。所以我们的解释器可以是一个简单的循环,对所有操作进行迭代。但是这意味着像控制流或条件执行这样的概念不能很好地被我们表示。

模型导出为MCU能识别的文件

在手机上,我们可以使用flatbuffer,一个超轻量的序列表示工具。(需要文件系统)

嵌入式设备通常没有文件系统,所以我们将文件转换为C数据数组,并将其编译为可执行文件。我们使用Linux命令xxd来完成这个转换:

在这里插入图片描述

TF Lite怎么在MCU上运行

主要是靠tensorflow lite里面的interpreter(解释执行器),针对移动小型设备专门优化、更少的依赖库、文件更小、快速加载、静态内存规划、静态执行规划。它会为model分配所需的空间(空间由我们自己定义,如果太小会报错)、循环文件中的操作、调用invoke函数等等。
还有kernal和registration等操作,大家可以去arduino里装一个tensorflowlite的库,找个实例看看,百来行的代码,很快就上手。
如果想体验基于tensorflow lite实现嵌入式机器学习,可以去康康我的另一篇 最简单体验TinyML、TensorFlow Lite

猜你喜欢

转载自blog.csdn.net/weixin_45116099/article/details/126324856