对于Tensorflow最大需求是能够在桌面系统中训练并运行模型,这种需求影响了很多设计决策,例如为了更低的延迟和更多的功能而增加可执行文件的大小。云端服务器上,RAM以GB为衡量单位,存储空间以TB为单位,几百兆字节的二进制文件通常不是问题。
不过,这些工程上的取舍不适用于其他平台(Android、IOS以及嵌入式平台),哪怕是将应用程序大小仅仅增加几兆字节也会大大减少下载次数并降低客户的满意度。你可以为这些手机平台编译TensorFlow,但是默认情况下,会使应用程序至少增加20MB,即使一些优化也很难减少到2MB以下。
Google在2017年启动了TensorFlow Lite,目标是在移动设备上高效且轻松的运行神经网络模型。为了减少框架的大小和复杂性,TFLite 删除了不常用的功能。例如,它不支持训练模型,而是仅支持模型运行推断。它还不支持TF主线中可用的全部数据类型(例如double)。此外,TFLite也不支持一些使用次数比较少的算子。
作为这些折中的回报,TFLite可以只用几百字节,从而使其更适合大小受到限制的应用程序。它还为Arm Cortex-A 系列CPU提供了高度优化的库。另外一个关键有点是TFLite对网络的8位量化有很好支持。一个模型有数百万个参数,仅仅是从32位浮点数转换为8位整数就能减少75%的大小。
简单的说,TFLite与TF最大的不同,它只关注推断。
TF-Lite for Microcontroller是TFLite在mcu移植的版本(子系统),复用TF-Lite的框架。
TFLite architecture
TFLite的组件构成
下列图来自deeplearningai的 TFLite官方教程,很好阐述Convert的机理:
convert工具链使用同一的接口(调用参数不同),支持从SaveModel(推荐,tfserving也是用这个)、Keras HDF5、 Concreate Function转换为TFLite格式文件,然后让TFLite Interpreter使用推断。
官方推荐使用SavedModel,个人认为SavedModel是机器学习部署应用生产环境的规范产物,有一堆的工具链可以利用。
TF-Lite使用“解释执行模型”(术语来自TinyML书,有机会展开描述,很有意思的实现),与之相对的是“模型生成代码”(code generation)。不恰当的比喻,和C语言和python类似。“模型生成代码”是C语言,直接生成可运行的机器码,“解释执行模型”是python、TFLite Interpreter是,模型是文件(其实内存映像),还需要一个python解释器一样的中间存在,这就是TFLite Interpreter。
下图来自TinyML书的应用程序框架,很好的阐述TF Lite Interpreter
TFLite-Micro在减小模型大小上主要采用了3个技术:
实际代码的量化,如果有校验数据集会有更好的效果:
修剪可以帮助使模型的表示更紧凑。从广义上讲,剪枝试图去除对输出预测没有多大用处的神经元。这通常与较小的神经权重相关联,而较大的权重由于在推理过程中的重要性而保持不变。然后在修剪后的体系结构上重新训练网络,以微调输出。
“Teacher”是一个经过训练的神经网络模型。教师的任务是将其“知识”转移到参数较少的较小网络模型“student”。该过程用于将相同的知识存储在较小的网络中,提供了一种压缩知识表示的方法,从而压缩了神经网络的大小,从而可以将其用于更多内存受限的设备上。
主要内容摘自《TinyML》一书的第13章”TensorFlow Lite for Microcontrollers“,笔者做了归纳和提炼(??):
有些目标平台根本没有操作系统
为了节省空间,比如sprintf()简单的函数要占用20KB空间,唯一例外的是标准的c math库。
没话说,便宜的mcu说硬件浮点要贵2块钱,再买一个不香吗?
运行需要连续运行需要连续几个月或者几年,如果主循环用malloc()/new 和free()/delete来分配和释放内存,难免堆最终不会以碎片状态结束。所以,tflm干脆要求传入一个固定大小的内存空间,让框架在初始化时进行临时分配(如果太小,tflite会马上报错,再调整较大空间),除此之外执行推断将不会有进一步的内存分配需求,因此可以调用而不会有堆碎片或内存错误的微信啊。
为了模块化代码方便维护,另外和TFLite 移动设备方面更轻松的共享代码
Tensorflow Lite 在linux环境中开发的,许多工具基于传统的UNIX工具(shell脚本、Make和python)。
这里要吐槽下什么年代了,还用Makefile,十分晦涩难懂,都怀疑google官方故意为难人,什么年代了,cmake不香吗。
如果要深入理解,makefile文件要好好看看,还有一堆的include macro,头大。笔者看了一遍,大致理解主体过程,由于make造诣不够不够深入。
make 有生成工程项目、bin文件、测试
#sparkfun_edge生成hello world
make -f tensorflow/lite/micro/tools/make/Makefile TARGET=sparkfun_edge hello_world_bin
#生成位于/gen/sparkfun_edge_cortex-m4/bin/hello_world
#ESP32 平台的例子
make -f tensorflow/lite/micro/tools/make/Makefile TARGET=esp generate_hello_world_esp_project
#STM32F746的例子
make -f tensorflow/lite/micro/tools/make/Makefile TARGET=mbed TAGS="CMSIS disco_f746ng" generate_hello_world_mbed_project
除了G家TFLM框架外,microsoft,nvidia等也有自己的方案不展开了。上游厂家有芯片厂在TinyML方面也有各自的亮点。
ARM推出优化AI推断的Cortex-M55 Ethos-U55架构
瞄准TFLM的算子优化方面
ST的Cube全家桶添加了STM32Cube.AI成员,笔者认为在支持tflm方面把G家难用的工具链做了很好的用户界面优化。
https://www.coursera.org/learn/device-based-models-tensorflow/home/welcome
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。