[Day 12] tinyML开发框架(一):TensorFlow Lite Micro初体验(上)

说到tinyML不得不说起「TinyML Machine Learning with TensorFlow Lite on Arduino and Ultra-Low-Power Microcontrollers」一书的作者Pete Warden,他应该是最早将这个概念整理成书的作者(2020/1/7 初版),并且在Youtube上也有多段影音教学影片(如文末参考连结【TinyML Playlist】)。目前这本书也有中文译本在台发售,碁峯於2020/7/31出版,书名「tinyML TensorFlow Lite机器学习 应用Arduino与低耗电微控制器」,如Fig. 12-1所示。

TinyML经典入门书及作者Pete Warden
Fig. 12-1 TinyML经典入门书及作者Pete Warden。(OmniXRI整理绘制, 2021/9/26)

「TinyML」中文版书中对两位作者的介绍:
Pete Warden 是行动及嵌入式TensorFlow的技术主管,也是TensorFlow团队的创始成员之一。他曾经是Jetpac的CTO和创始人,该公司在2014年被Google收购。
Daniel Situnayake 是Google的首席开发布道师,并且协助运作tinyML聚会小组。他也是Tiny Farms的共同创办人,Tiny Farms是美国第一家大规模自动生产昆虫蛋白的公司。

相信可能很多人第一次接触tinyML应该都是跟着这本书来实作和练习,但说实在的,步骤有点多,有很多开发环境要设置,所以对於新手会有些吃力,因为除了AI部份外,还有MCU部份要处理。好在AI的世界进步速度颇快,才过了一年多,就有了不少改进,简化了不少。接下来就让我们跟着Google官网「TensorFlow Lite for Microcontrollers」(以下简称TFLM)的说明来实际操练一下。

什麽是TFLM呢?一般大家在开发深度学习模型时多半会使用Google TensorFlow框架,但到了手机或单板微电脑(如Arm Cortex-A, Cortex-R或树莓派Cortex-A53/A57等)时代,这样的框架太大塞不进这些系统中,於是Google又推出TensorFlow Lite,它不仅更短小精悍,同时还提供的模型优化工作,使得在推论准确率只损失数个百分点甚至几乎没有损失的情况下,让模型缩小十倍以上,不仅更容易塞进这些开发板,同时加快了推论速度。不幸地是,当遇到像MCU(Cortex-M)等级的开发板时,又遇到塞不进的问题,所以Google才会再推出TensorFlow Lite for Microcontroller。表面上名字很像Lite,但实质上为了牵就MCU的开发架构,因此本质上有很大不同,无法直接取代。原则上这些都是开源码,有兴趣研究原始码的朋友可参考文末参考连结【TFLM Github开源码】。另外目前TFLM可支援的开发板可参考[Day 03] tinyML开发板介绍的说明。

接下来就跟着Google TFLM的「Hello World」来建立基本操作观念。这个范例主要分成两个部份,如下所示。

  • 训练模型:使用Python,在Google Colab (jupyter notebook)完成训练、转换及优化模型。
  • 执行推论:使用C++ 11,在开发板上使用C++函式库执行模型推论。

训练模型(Python + Google Colab + GPU)

首先点击Google提供的Colab范例程序,免下载,可直接运行,Jupyter Notebook操作环境,说明文字和程序一起存在,方便学习,只需在每个程序栏位左上角按下黑色箭头(或者点想执行的栏位按Ctrl + Enter亦可)即可单步执行,但切记要按照顺序把每个步骤都执行完,不能跳过任何一步骤。由於开启後会看到先前运行结果都被保留在执行结果栏位,为了更清楚看到所有动作,可执行主选单的[编辑]─[清除所有输出栏位],将所有输出栏位清除。

首先说明这个「Hello World」程序主要想展示如何将一个TensorFlow建立好的模型转换到TFLM,为了方便说明,并没有使用现成常用的资料集,而是以正弦波加乱数方式产生一个资料集,然後训练出一个模型(正弦波函数),使得输入X位置就能推论出Y位置。

接下来就快速摘要一下整个程序在做什麽?程序部份请参考原始程序,这里仅作重点摘要及补充说明,方便大家更容易理解。程序运作後产生的相关图表可参考Fig. 12-2。

  • 配置模型工作路径名称。
  • 安装TensorFlow 2.4.0版环境,并导入Python所需套件。
  • 产生资料
    • 产生正弦波基本数据,在0~2 PI间产生1000点当作x,再将其顺序打乱,并依正弦(Sine)函式计算出对应的y值,得到1000组原始资料,(x,y)。
    • 增加杂讯,为了使资料更接近真实世界随意变动,所以将原始资料的y值随机加入10%的变动。
    • 分割资料集,为了後续训练、验证及测试模型的效能,所以将资料集分割成60%, 20%, 20%。
  • 模型训练
    • 设计模型,一般来说像正弦波这类资料,采用「机器学习」的「多项式回归」方法大概就能解出不错的结果。不过这里故意使用一个全连结的神经网路来代替,输入层就只有一个神经元,输入值就是x,输出层也只有一个神经元,而隐藏层使用8个神经元,每个神经元的输出激励函数采用「ReLu」,最终训练时判定损失的函数则采用MSE(Mean Square Error, 均方误差),度量方法采MAE(Mean Absolute Error, 平均绝对误差),而调整优化方法则采「Adam」。整体模型采用TensorFlow的Keras方法来建构。更多损失函数和优化方法可参考NTUST Edge AI Ch6-1 模型优化与布署─模型训练优化
    • 训练模型,设定好模型後就可以开始训练,由於这个范例很小,所以原始档案并没有启动GPU加速计算,如果有需要可选择主选单的[编辑]─[笔记本设定]─[硬体加速器]将[None]改成[GPU(Nvidia)]或[TPU(Google)]即可。这个范例指定训练迭代次数(Epochs)次为500次,意思是不管是否达到满意程度,到达设定值就停止。批量大小(batch_size)则是一次取多少笔资料来训练,以600笔资料批量大小为64为例则要取10次才能完成一次迭代,所以理论上批量大小大一点会好些,但会随资料性质及多样性可能会造成模型训练结有很大不同,所以可自行调整大小来加速训练速度及测试收歛速度。
    • 绘制图表,为了更清楚知道训练过程中损失收歛的速度,可将训练过程的输出值绘成图表来观察,以图示约在100次迭代後就几乎收歛,只有很小幅度的下降。若想更清楚看到变化细节,可忽略前50笔(可自行调整)。另外除了损失率外亦可将平均绝对误差(MAE)当成观察内容。接着为了知道训练了500次迭代的模型效能好不好,此时就可把测试集拿来当输入求预测值,再将实际值和预测一起绘出,很明显差了很多,还不满足需求。表示训练看起来好像不错但实际上根本不能用。
  • 训练一个大模型
    • 设计模型,接着把隐藏层变成两层,且两层都使用16个神经元进行全连结,其它条件和先前一样。
    • 训练模型,同样地训练500次迭代。
    • 绘制图表,同样绘出LOSS和MAE,可看出大约在350次迭代後才趋於收歛。最後实际值和预测值也趋於拟合,已可看出一条很接近正弦波的曲(红)线。代表这个模型已可应付大部份的状况。
  • 产生TensorFlow Lite模型
    • 产生有量化和没有量化的模型,原始TensorFlow模型是以FP32(32bit浮点数)格式进行训练,接着将其转成TensorFlow Lite格式,接着若能把训练好的参数降到INT8(8bit整数)则模型大小就能变为1/4。但前提是预测的结果不能变化太大才有意义。
    • 比较模型效能,在比较之前需将模型以不同参数格式载入,为了正确配置相关记忆体,需初始化TFLite的直译器(Interpreter)再载入,最後将有无量化的比较结果绘制成图表。由图可看出绿色X和蓝色X几乎重叠,代表量化後的结果几乎没有影响。再经由数字来看,原始TensorFlow的模型损失率1.02%和转成TensorFlow Lite 未优化前几乎相同,而经过量化後变成1.08%,变化极小。此时再来看模型(参数)大小,原始TensorFlow使用了4096 Byte,经转成TFLite後缩小至2788(减少1308)Byte,而经量化後,只剩2488(再减少300)Byte,和原本模型相比仅为60.7%。虽然离目标的25%(1/4大小)还很远,这是因为这个模型不算太复杂且很小,所以暂时无法发挥太明显效益。
  • 产生TFLM模型,接着要安装xxd工具程序,利用它将TFLite已量化的模型再转成TFLM格式,即C语言格式档案,预设会於/hello_world/train/models下产生一个model.cc的档案,打开看就是一个2488 Byte的int格式阵列。
  • 布署到MCU上,最後把model.cc和其它MCU相关的程序(*.cc)一起编译就能布署到MCU上,不过这部份不在Colab上完成,MCU程序编译和TFLM执行推论部份就留待下回分解。

TensorFlow Lite for Microcontroller Hello Wolrd范例相关图示
Fig. 12-2 TensorFlow Lite for Microcontroller Hello Wolrd范例相关图示。(OmniXRI整理制作, 2021/9/26)

参考连结

Google TensorFlow Lite for Microcontrollers 中文学习指南
Pete Warden Youtube, TinyML Book Screencasts Playlist 影片清单
TensorFlow Lite for Microcontrollers Github 开源码
TFLM Get started with microcontrollers, The Hello World example
Experiments with Google = TensorFlow Lite for Microcontrollers 案例分享


<<:  【day12】InvitationDetailFragment

>>:  D12 - 那些年算不出来的 Math

WSL2/ WSLg下使用snap store

更多会员限定文章可以到patreon观看 WSLg + Snap 如果清除/snap後还是不能mou...

Scrum 也自然吗

前言 昨天谈到敏捷的重点是其背後的精神,而 Scrum 也不例外,但为什麽 Scrum 的导入还是这...

JavaScript Day 8. 浅谈 Function-操作实例

上一篇大略的说明了 function 的两个大类别,这里试着放比较多的简易操作实例。 注册多组函式 ...

例行监督表单撰写实务

上一篇内部稽核讲到 5. 监督作业:进行下列监督作业,以确定本制度之有效性、及时性及确实性: (1)...

Day20 xib传值的小教室!

首先,尽然要传值,就要有两个页面才能使其中一页的值传至另一页面,所以我们要先准备好两个xib。 当然...