【云+社区年度征文】TinyML实践-2:How TinyML Works?

2020-12-07 18:45:05 浏览数 (1)

对于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的框架。

1.Tensorflow-lite框架

架构&组件

TFLite architecture

tflite architecture.pngtflite architecture.png

TFLite的组件构成

components in tensorflow lite.pngcomponents in tensorflow lite.png

Converter

下列图来自deeplearningai的 TFLite官方教程,很好阐述Convert的机理:

TF Lite Converter.pngTF Lite Converter.png

convert工具链使用同一的接口(调用参数不同),支持从SaveModel(推荐,tfserving也是用这个)、Keras HDF5、 Concreate Function转换为TFLite格式文件,然后让TFLite Interpreter使用推断。

parameters for convrsion.pngparameters for convrsion.png

官方推荐使用SavedModel,个人认为SavedModel是机器学习部署应用生产环境的规范产物,有一堆的工具链可以利用。

Interpreter

TF-Lite使用“解释执行模型”(术语来自TinyML书,有机会展开描述,很有意思的实现),与之相对的是“模型生成代码”(code generation)。不恰当的比喻,和C语言和python类似。“模型生成代码”是C语言,直接生成可运行的机器码,“解释执行模型”是python、TFLite Interpreter是,模型是文件(其实内存映像),还需要一个python解释器一样的中间存在,这就是TFLite Interpreter。

下图来自TinyML书的应用程序框架,很好的阐述TF Lite Interpreter

a_basic_TinyML_application_architecture.pnga_basic_TinyML_application_architecture.png

2.关键技术

TFLite-Micro在减小模型大小上主要采用了3个技术:

  • Quantization 量化
  • weight pruning 减少权重
  • Model topology transforms 模型拓扑转换 Tensor Decomposition 张量分解 Distillation 蒸馏 其实,笔者重于工程,理论才疏学浅、不求甚解,没有深入理解;且当个搬运工(),如有错误还望指出。Quantization为什么量化是必要的?想象一个使用ATmega328P微控制器的Arduino Uno,它使用8位算法。要在Uno上运行一个模型,理想情况下模型权重必须存储为8位整数值(而许多台式计算机和笔记本电脑使用32位或64位浮点表示)。通过量化模型,权重的存储大小减少了4倍(对于从32位到8位值的量化),并且精度通常会受到忽略的影响(通常约为1–3%)。
llustration of quantization error during 8-bit encoding.pngllustration of quantization error during 8-bit encoding.png

实际代码的量化,如果有校验数据集会有更好的效果:

post-training quantization calibration data.pngpost-training quantization calibration data.png

Weight pruning

修剪可以帮助使模型的表示更紧凑。从广义上讲,剪枝试图去除对输出预测没有多大用处的神经元。这通常与较小的神经权重相关联,而较大的权重由于在推理过程中的重要性而保持不变。然后在修剪后的体系结构上重新训练网络,以微调输出。

Illustration of pruning for distilling a model’s knowledge representation.pngIllustration of pruning for distilling a model’s knowledge representation.png

Model topology transforms

“Teacher”是一个经过训练的神经网络模型。教师的任务是将其“知识”转移到参数较少的较小网络模型“student”。该过程用于将相同的知识存储在较小的网络中,提供了一种压缩知识表示的方法,从而压缩了神经网络的大小,从而可以将其用于更多内存受限的设备上。

teacher_student.pngteacher_student.png

3.深入:浅述Tensorflow Lite for Microcontrollers

主要内容摘自《TinyML》一书的第13章”TensorFlow Lite for Microcontrollers“,笔者做了归纳和提炼(??):

嵌入式环境运行前提对TFLM需求

1)没有操作系统依赖项

有些目标平台根本没有操作系统

2)链接时没有标准的C或C 库依赖项

为了节省空间,比如sprintf()简单的函数要占用20KB空间,唯一例外的是标准的c math库。

3)不需要浮点硬件

没话说,便宜的mcu说硬件浮点要贵2块钱,再买一个不香吗?

4)没有动态内存分配

运行需要连续运行需要连续几个月或者几年,如果主循环用malloc()/new 和free()/delete来分配和释放内存,难免堆最终不会以碎片状态结束。所以,tflm干脆要求传入一个固定大小的内存空间,让框架在初始化时进行临时分配(如果太小,tflite会马上报错,再调整较大空间),除此之外执行推断将不会有进一步的内存分配需求,因此可以调用而不会有堆碎片或内存错误的微信啊。

5)C 11

为了模块化代码方便维护,另外和TFLite 移动设备方面更轻松的共享代码

编译系统

Tensorflow Lite 在linux环境中开发的,许多工具基于传统的UNIX工具(shell脚本、Make和python)。

这里要吐槽下什么年代了,还用Makefile,十分晦涩难懂,都怀疑google官方故意为难人,什么年代了,cmake不香吗。

如果要深入理解,makefile文件要好好看看,还有一堆的include macro,头大。笔者看了一遍,大致理解主体过程,由于make造诣不够不够深入。

make 有生成工程项目、bin文件、测试

代码语言:txt复制
#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

4.主流大厂对tinyml的支持

除了G家TFLM框架外,microsoft,nvidia等也有自己的方案不展开了。上游厂家有芯片厂在TinyML方面也有各自的亮点。

Arm: Energy-efficient On-device Processing for Next-generation

ARM推出优化AI推断的Cortex-M55 Ethos-U55架构

arm-solution for endpoint ai.pngarm-solution for endpoint ai.png

瞄准TFLM的算子优化方面

Mapping of NNs to hw using TFLite.pngMapping of NNs to hw using TFLite.png

ST:Making optimizing and deploying Tiny Machine Learning on STM32 Microcontrollers easy

ST的Cube全家桶添加了STM32Cube.AI成员,笔者认为在支持tflm方面把G家难用的工具链做了很好的用户界面优化。

stm32cube-ai solution.pngstm32cube-ai solution.png

a.附录&参考

1 deeplearning ai 的课程《Device-based Models with TensorFlow Lite》

https://www.coursera.org/learn/device-based-models-tensorflow/home/welcome

2 TinyML书

3 (ST) Making optimizing and deploying Tiny Machine Learning on STM32 Microcontrollers easy

4 (ARM) Tomas Edso: Energy-efficient On-device Processing for Next-generation

0 人点赞