diff --git a/blog/TFLite vs TFLite-micro.md b/blog/TFLite vs TFLite-micro.md new file mode 100644 index 0000000000000000000000000000000000000000..95fd300e416e8a166e4a162ccf111d98ac0b3775 --- /dev/null +++ b/blog/TFLite vs TFLite-micro.md @@ -0,0 +1,218 @@ +# TFLite vs TFLite-micro + +## TFLite + +TensorFlow Lite(TFLite)是一个轻量的开源机器学习框架,支持安卓、iOS、嵌入式Linux以及MCU(Mircrocontrollers,微控制器)等多个平台部署,是TensorFlow的一部分。 + +TFLite主要用于端侧机器学习,其主要特性有: + +1. 解决以下 5 项约束条件,针对设备端机器学习进行了优化: + * 延时(数据无需往返服务器) + * 隐私(没有任何个人数据离开设备) + * 连接性(无需连接互联网) + * 大小(缩减了模型和二进制文件的大小) + * 功耗(高效推断,且无需网络连接) +2. 支持多种平台,涵盖 Android 和 iOS 设备、嵌入式 Linux 和微控制器。 +3. 支持多种语言,包括 Java、Swift、Objective-C、C++ 和 Python。 +4. 高性能,支持硬件加速和模型优化。 +5. 提供多种平台上的常见机器学习任务的端到端示例,例如图像分类、对象检测、姿势估计、问题回答、文本分类等。 + +### TFlite架构 + +```txt ++-----------------------------+ +| TensorFlow Model | ++-----------------------------+ + | + v ++-----------------------------+ +| TensorFlow Lite Converter | ++-----------------------------+ + | + v ++-----------------------------+ +| .tflite Model File | ++-----------------------------+ + | + v ++-----------------------------+ +| TensorFlow Lite Interpreter | ++-----------------------------+ + | + v ++-----------------------------+ +| Mobile/Embedded Device | ++-----------------------------+ + +``` + +上图展示了TFLite的主要架构和流程: + +#### TFLite 模型生成 + +为了支持在内存受限(大小、少量支持的内存操作和文件系统操作等)上运行模型,TFLite模型通常由TensorFlow模型生成,经过模型转换器(TensorFlow Lite Converter)转换为TFLite专用的模型文件格式:FlatBuffers,后缀以.tflite命名。 + +FlatBuffers 是一种高效的跨平台序列化库,主要用于游戏开发和其他性能敏感的应用场景。它由Google开发,用于快速读写序列化数据。它支持在序列化缓冲区内访问数据,而无需将其解析到其他数据格式中;且FlatBuffers生成的二进制数据非常紧凑,减少了存储和传输的开销。 + +#### TensorFlow Lite Converter + +TensorFlow Lite Converter (以下将其简称为转换器)用于将已经训练好的TensorFlow模型转换为轻量级的 FlatBuffers 文件格式,可通过Python API 或者 命令的方式使用该转换器,但官方更推荐使用Python API的方法。 + +转换器可接受Frozen GraphDef、GraphDef、Keras、SaveDModel模型进行转换(转换TensorFlow 1.x模型),而对于TensorFlow 2.x模型,还支持转换具体函数,转换示例以及相应的转换函数建议阅读[官方文档](https://www.tensorflow.org/lite/convert/index?hl=zh-cn)。 + +#### TensorFlow Lite Interpreter + +TensorFlow Lite Interpreter(以下简称为解释器)是一个轻量级的推理引擎,负责加载和运行.tflite模型文件。解析器负责加载模型文件、硬件加速、控制模型执行、内存分配(如应对算子的内存需求)和执行模型计算等。 + +算子库(Op Kernels)是与TensorFlow Lite Interpreter紧密相关的部分,其包含了内置算子库和自定义算子库。关于解释器的示例以及函数方法可以阅读[官方文档](https://www.tensorflow.org/lite/guide/inference?hl=zh-cn) + +### TFLite的限制 + +#### 模型转换 + +由于 TensorFlow 算子丰富,而新模型也不断出现,虽然 TFLite 覆盖了很多常见的模型,但是对于普通开发者来说,模型转换仍是较大的痛点。 + +#### 张量限制 + +TFLite 目前对动态张量形状支持有限,需要在转化时将输入设置成固定大小,随后在运行时调用 ResizeInput。很多 TFLite ops 可能还不支持 bfloat 和 string.另外,TFLite 目前只支持 TensorFlow 的某些固定格式,而广播只支持有限的一些 ops (比如tf.add,tf.mul,tf.sub,and tf.div,tf.min,tf.max)。 + +#### 硬件加速 + +硬件加速部分,delegate 的算子不支持仍是主要挑战。总体而言,CPU算子有较好的覆盖率,而 GPU 和 DSP 等覆盖率相对小一些;而 NNAPI 的算子则更新速度较慢,且其硬件驱动的性能不一,建议进行实际模型性能测试。 + +## TFLite-Micro + +TFLite Micro(TensorFlow Lite for Microcontrollers,TFLM)是一个基于解释器的机器学习框架,专门用于在微控制器和其他只有几千字节内存的设备上运行机器学习模型。核心运行时可以放入 Arm Cortex M3 上 16 KB 的存储空间中,并且可以运行许多基本模型。它不需要操作系统支持、任何标准 C/C++ 库或动态内存分配。 + +> 微控制器(Microcontrollers)通常是小型低功耗计算设备,可嵌入到需要执行基本计算的硬件中。通过将机器学习引入尺寸极小的微控制器,我们可以提升生活中数十亿台设备的智能性,包括家用电器和物联网设备,而无需依赖昂贵的硬件或可靠的互联网连接。硬件和互联网连接常常受带宽和功率限制,并且会导致出现长时间延迟。使用微控制器还有助于保护隐私,因为数据不会离开设备。 + +TFLM 旨在在微控制器和其他平台上运行,无需动态内存分配和文件系统。这意味着必须将数据文件(例如 TFLite 模型和测试输入)内置到二进制文件中。参阅这篇[指南](https://github.com/tensorflow/tflite-micro/blob/main/docs/automatically_generated_files.md)。 + +TFLM 接受和 TFLite 同样的模型格式(FlatBuffers),让同样的模型可运行在手机和MCU上,减轻了开发者负担。它的核心运行库在Arm Cortex M3 上小于 16 KB,加上一些关键词检测的算子,总共只需要22 KB。 + +它支持ARM Cortex-M系列芯片以及其他架构比如ESP32。也可以作为Arduino库,对MBed开发环境也有很好的支持.最近,Cadence宣布旗下的Tensilica HiFi DSP系列也支持TFLite微控制器版。 + +### TFLite-Micro的架构 + +#### 设计原则 + +为了使得 TFLM 可以应对 TinyML(Tiny Machine Learning)在微控制器、嵌入式设备上的各种挑战,TFLM 提出并遵循了以下的设计原则: + +1. 最小化功能范围以实现可移植性:模型、输入数据和输出数据应该都在内存中。专注于模型计算而不需要调用外围设备或其他操作系统功能; + +2. 使供应商能够为跨生态系统做出贡献:为开发人员提供测试与基准测试,确保优化核心库操作很容易,以应对微控制器的碎片化生态; + +3. 复用 Tensorflow 算子以实现扩展性:使用导出器将 Tensorflow 模型转化为Tensorflow Lite模型,部署到客户端并使用 Tensorflow Lite 解释器执行; + +4. 构建异构支持系统:优先考虑易于用各种 IDE 和工具链构建的代码,为给定平台创建源文件和标头,然后用户能够将这些文件拖放到他们的 IDE 或工具链中并进行编译而无需进行任何更改,即“文件包原则”; + +#### 架构组成 + +TFLM 的架构是 TFLite 的简化版,专为微控制器和资源极其受限的设备设计。其主要组件包括: + +1. TFLM 模型格式:与 TFLite 模型格式相同,但经过进一步优化以减少内存占用和计算复杂度。 + +2. TTFLM 解释器:一个小巧的解释器,能够在极少的内存和计算资源下运行。解释器采用静态内存分配和简化的操作执行逻辑。 + +3. 操作解析器:一个轻量级的操作解析器,包含常用的操作,如卷积、全连接层、激活函数等。可以根据需要扩展自定义操作。 + +4. 硬件抽象层:支持一些基本的硬件加速选项,如 ARM CMSIS-NN 库,用于在 ARM Cortex-M 系列微控制器上加速推理。 + +TFLM架构与TFLite类似,但TFLM采用了不同的构建方法。基于其“文件包原则”,TFLM选择了基于Makefilede的构建系统来确认当前项目需要哪些文件,本根据特定的平台、设备来生成相应的源文件和目标文件。此外,TFLM还支持执行其他后处理,以将源文件转换为目标工具链格式。 + +由于TFLM 采用了与TFLite相同的模型文件格式,因此它隐性要求平台编译器支持C++11规范(但Google与多家供应商合作以升级他们的平台工具链)。针对基于 Arm Cortex-M 系列架构的众多处理器,它已经过了广泛的测试,并已移植到其他架构(包括 ESP32、TenonOS)。 + +### TFLM的限制 + +TFLM专为满足微控制器开发的特定限制条件而设计。如果使用的是更强大的设备(例如 Raspberry Pi 等嵌入式 Linux 设备),那么TFLite框架可能更易于集成。在使用TFLite Micro前应该考虑应考虑以下限制: + +* 支持的 TensorFlow 操作[有限](https://www.tensorflow.org/lite/microcontrollers/build_convert?hl=zh-cn#operation_support); + +* 支持的设备有限; + +* 需要手动管理内存的低阶 C++ API; + +* 不支持设备端训练; + +## TFLite vs TFLite-Micro + +### 应用场景 + +TFLite支持多种平台,涵盖 Android 和 iOS 设备、嵌入式 Linux 和微控制器,TFLite 主要用于移动设备和嵌入式系统,包括但不限于以下场景: + +* 智能手机应用:如图像分类、对象检测、语音识别、自然语言处理等。 +* 智能家居设备:如智能摄像头、智能音箱、家庭自动化控制器等。 +* 边缘计算设备:如边缘服务器、智能网关、工业控制设备等。 + +而TFLite-Micro是TFLite中的一个分支,专门应用于微控制器等资源及其受限的设备: + +* 微控制器设备:如 ARM Cortex-M 系列微控制器、ESP32、AVR 等。 +* 物联网设备:如智能传感器、环境监测设备、可穿戴设备等。 +* 极低功耗设备:如电池供电设备、能源采集设备等。 + +### 主要区别 + +#### 资源需求 + +TFLite 设计用于在具有较多资源的设备上运行,如智能手机和嵌入式系统。它可以利用设备的多核 CPU、GPU 和其他硬件加速器来提高推理性能。相比之下,TFLite Micro 设计用于在内存和计算能力非常有限的设备上运行,如微控制器。TFLite Micro 使用静态内存分配,并尽量减少计算复杂度,以适应资源受限的环境。 + +#### 运行时架构 + +TFLite 解释器是一个复杂的运行时环境,支持动态内存分配、内存映射文件和各种优化技术,以提高推理效率。TFLite Micro 解释器则是一个简化版,使用静态内存分配,避免了动态内存管理的开销。这使得 TFLite Micro 能够在内存非常有限的设备上运行,同时减少了运行时的复杂性。 + +#### 算子差异 + +TFLite 支持 TensorFlow 中的大多数内置算子。这些算子在设计时考虑了移动和嵌入式设备的性能优化,但仍然保留了一些高级特性,如多线程支持、动态内存分配等;由于资源限制,TFLite Micro 仅支持最常用的基本算子,如卷积层(Conv2D)、全连接层(Fully Connected)、激活函数(Activation)、池化层(Pooling)等。如果需要使用其他算子,需要开发者自行实现; + +#### 硬件加速支持 + +TFLite 支持多种硬件加速选项,包括 GPU、DSP 和 NPU 等。通过利用这些加速器,TFLite 能够显著提高推理性能。TFLite Micro 由于设计用于资源受限的设备,通常不支持复杂的硬件加速选项,但可以利用一些基本的加速库,如 ARM CMSIS-NN 库,在支持的硬件上实现加速。 + +#### 操作支持 + +TFLite 支持的操作种类较多,涵盖了大多数深度学习模型所需的操作,如卷积、池化、全连接层、激活函数等。TFLite Micro 由于设计用于资源受限的设备,默认支持的操作较少,主要包括常见的基本操作。如果需要支持更多或自定义操作,需要开发者自己实现并集成到解释器中。 + +在设计一个面向微控制器的模型时,考虑模型的规模、工作负载,以及用到的运算是非常重要的。 + +#### 简单总结 + +|特性|TensorFlow Lite (TFLite)|TensorFlow Lite Micro (TFLite Micro)| +|-----|:-----------------------:|:-----------------------------------:| +|目标设备|移动设备、边缘设备|微控制器、嵌入式传感器| +|内存管理|动态内存分配|静态内存分配| +|模型支持|复杂模型|简单模型| +|硬件加速|支持GPU、DSP、NPU|通常不支持硬件加速| +|运行时大小|较大|极小| +|操作支持|支持较多操作|仅支持关键操作| + +### 示例应用 + +#### app-object-detection + +TensorFlow Lite 是 TensorFlow 移动和嵌入式设备轻量级解决方案,为Tenon移植后,提供运行物体识别模型的能力,对输入图片中的物体进行识别。 + +app-object-detection为移动和嵌入式设备提供机器学习应用的运行环境,并包含完整的 Python 标准库。用户可以运行自定义的 Python 脚本或定制的机器学习任务。项目还提供了一个图像识别任务作为示例。 + +[示例应用传送门](https://gitee.com/tenonos/app-object-detection.git) + +#### app-object-detection-micro + +TensorFlow Lite for Microcontrollers 是 TensorFlow 微控制器轻量级解决方案,旨在在只有几千字节内存的微控制器和其他设备上运行机器学习模型。核心运行时仅占用 Arm Cortex M3 上的 16 KB,并且能运行许多基本模型。它不需要操作系统支持,任何标准的 C 或 C++ 库,也不需要动态内存分配。 + +app-object-detection为微控制器提供机器学习应用的运行环境,提供运行物体识别模型的能力,对输入图片中的物体进行识别项目提供两个应用示例,分别为Hello World和人脸识别。 + +[示例应用传送门](https://gitee.com/tenonos/app-object-detect-micro.git) + +## 参考引用 + +1. [TensorFlow Lite:端侧机器学习框架](https://crad.ict.ac.cn/fileJSJYJYFZ/journal/article/jsjyjyfz/HTML/2020-9-1839.shtml) + +2. [tflite-micro](https://github.com/tensorflow/tflite-micro) + +3. [Everything about TensorFlow Lite and start deploying your machine learning model](https://www.seeedstudio.com/blog/2022/05/08/everything-about-tensorflow-lite-and-start-deploying-your-machine-learning-model/) + +4. [TensorFlow Lite](https://www.tensorflow.org/lite/guide?hl=zh-cn) + +5. [适用于微控制器的 TensorFlow Lite](https://www.tensorflow.org/lite/microcontrollers?hl=zh-cn) + +6. [TensorFlow Lite Micro: Embedded Machine Learning on TinyML Systems](https://arxiv.org/abs/2010.08678)