[Day 10] tinyML整合开发平台介绍

话说唐牛抢了我的餐厅,当上老板後,就开始训斥我的厨师:「椅子要多窄有多窄,吸管要多粗有多粗,冰块要多大有多大,薯条要炸多老有多老,等小鬼们吃完之後要多渴有多渴,你应该知道我的意思!」,厨师害怕轻声的答道:「这样对小朋友的健康不太好吧?」,结果厨师就被一顿爆踢,还口中喃喃自语:「不要逼我,不要逼我,我是个好人啊!把他拖出去。」

听到这个,不禁让我想到上次那想作AI咖哩饭的AI工程师也是被老板这样要求,「tinyML的资料收集、标注要多简化就多简化,模型参数要多巨量有多巨量,训练时间要多短有多短,测试集推论精度要多棒有多棒(过拟合Overfitting),等模型布署後客人要多抱怨有多抱怨,你应该知道我(可以向客人追加专案预算)的意思!」,AI工程师脸上三百条线的问道:「这样对客人的智能产品不太好吧?我们很难把这麽大的模型塞到MCU中」,结果...(不要乱猜,AI工程师还好好地瘫坐在电脑桌前)

上次在[Day 07]时已有和大家介绍过AI专案的开发流程,但这个流程在tinyML上还适用吗?答案可以说介於可以和不可以之间。为什麽这麽说呢?因为在传统中大型AI应用程序中,几乎都在同一个平台(如云端服务器加AI加速运算装置)或同一部电脑(如PC加Nvidia GPU或树莓派加INTEL神经运算棒)上就能完成资料标注、模型建置、训练调参、模型优化和布署测试,只需会Python语言就几乎能全部搞定,包括人机界面。但遇到像tinyML这种只能在MCU上运作,资源超级少的平台上,很多工作就要分散到其它平台上去开发,只留下推论部份。若再加上先前提过,每个MCU供应商可能有自己的开发平台,那就要学习更多技术(含硬体控制)才能上手,这就导致许多只会Python的AI工程师大呼吃不消,甚至碰不了,因为多数的MCU都是以C语言甚至是ASM(组合)语言开发的。

如图Fig. 10-1所示,为了解决这个麻烦,许多厂商纷纷推出无码(No-Code, 不用写程序)或少码(Low-Code, 只需少量程序)的tinyML开发解决方案,包括整合型开发平台和依MCU框架开发两大类方案。前者把所有AI开发步骤全部整合在云端,使用者只需按着步骤就能完成一些常见的AI应用,如声音辨识,异常振动、影像分类、影像物件侦测等,优点是不需写任何程序码就能布署到MCU上,且提供很多的视觉化工具帮忙调整模型,但缺点就是弹性较小。而後者虽然各家MCU都有自己的开发工具,但如果是使用Arm Cortex-M系列,则Arm有提供Mbed OS作业系统和CMSIS标准函式库,其中更有专门用於神经网路加速运算的CMSIS-NN函式库,方便同样是Arm Cortex-M系列的MCU跨厂牌使用。另外像Google 也有提供TensorFlow Lite Micro (TFLM or TFLu, Microcontroller专用),方便使用自家TensorFlow开发出的模型,使其可以轻易的转成MCU可以运作的程序码。当然目前支援tinyML的开发板多半是Arm Cortex-M系列MCU,所以转换出来的MCU程序也多半是由CMSIS-NN函式来完成。使用MCU框架开发有很大弹性,还可充份融合感测器及周边模组,不过缺点也很明显,就是没有一定MCU程序开发功力的人,一开始会搞得一头雾水,不知从何下手。在接下来的章节中会尽量帮大家介绍不要无脑使用,也不要烧脑使用tinyML on MCU。

传统AI及tinyML(MCU AI)应用程序开发流程图
Fig. 10-1 传统AI及tinyML(MCU AI)应用程序开发流程图。(OmniXRI整理绘制, 2021/8/14)

tinyML整合型开发平台

tinyML整合型开发平台供应商为了让使用者不用懂太多AI技术,也不用会写MCU程序,所以通常提供一站式云端服务,申请一个帐号加上网页浏览器就能开始使用,主要整合了下列项目:

  • 资料收集:可即时收录声音、运动感测器信号、网路摄影机取像,或自行准备预录或影像资料集上传。
  • 资料标注:可分割连续资料并标注,或者直接标注上传的资料集。
  • 模型选用:通常只有数种常用模型可选,可作部份网路结构微调。通常不支援从常见框架(如TensorFlow, PyTorch, ONNX...)建立的模型转换或者仅支援特定框架。
  • 训练调参:提供资料简单滤波(去除杂讯)、资料分布图表、训练结果正确率比较表等各种可视化图表,方便调整特定超参数。
  • 模型优化:一般中大型AI应用如果没有布署空间限制问题,通常不一定需要这个步骤,但对於MCU这种资源很有限的执行推论装置一定要加入。通常这个部份可使用量化、剪枝、蒸馏、压缩等技术来减化模型结构及参数(记忆体使用)量,同时要确保优化後推论准确率只能掉个几%。
  • 布署测试:不管训练结果如何,最後还是要布署到MCU上。有些是将优化後的模型结构和参数转成C语言程序(*.c, *.h),再由原MCU开发平台当成一部份程序一起编译,这样方便整合原先的MCU程序。另一种则是安装一些套件直接帮你烧录到特定开发板的MCU中,再使用虚拟序列埠(COM)将推论结果从MCU输出回电脑上,单纯把tinyML的开发板当成一种智慧型感测器,不用写半行MCU程序。最後如果测试结果不理想或准确率过低,则需回到训练调参,甚至是资料收集、标注步骤重新来过,直至满意为止。

目前常见的tinyML整合型开发平台供应商,如Fig. 10-2所示。当然不只这些,只是这几个平台提供较多的学习资源及参考资料,更重要地是「免费」(不知道何时会开始收费)。这几个平台可支援的开发板清单可参考[Day 03] tinyML开发板介绍

常见的tinyML整合型开发平台供应商
Fig. 10-2 常见的tinyML整合型开发平台供应商。(OmniXRI整理绘制, 2021/9/24)

依MCU框架开发tinyML

如果你是一般的MCU工程师,那大概对Fig. 10-3的程序开发堆叠(Stack)不会太陌生,只是最上面应用层和C Code中间多了一些东西,接下来就帮大家补充说明一下。

一般从事AI应用开发的人多半会选择较多人使用的框架(建模、训练、布署),如TensorFlow, PyTorch, ONNX等。不过这样的框架都太大,通常连小型单板微电脑(如树莓派、手机、平板等)都塞不进去。所以需要一些优化工具来把模型简化、参数减小,如Google TensorFlow Lite, Nvidia TensorRT, Intel OpenVINO等。不过这些工具转换後的内容对於tinyML所使用的MCU来说还是太大,所以才有像Google TensorFlow Lite for Microcontroller这类的工具出现,企图用更精简的方式来产生MCU所需执行的程序码。

我们都知道在电脑上可用多执行绪或单指令多资料流(SIMD)指令集的CPU或者是具有超多乘加器的GPU来加速运算(训练及推论),但在一般MCU上就很难有这些,只能靠CPU慢慢算。幸运地是,在[Day 06] tinyML的重要推手Arm Cortex-M MCU时曾介绍过Arm Cortex-M4以上MCU就有支援单指令周期乘加器、硬体除法和SIMD指令,这可大幅提升运算速度。但这些超强功能,没有写组合语言根本很难作到,所以Arm CMSIS就提供了通用介面程序方便大家使用,尤其更提供的CMSIS-NN来完善神经网路加速运算,把常用的基本元素都已封装好。因此像TFLM就能轻松使用这样的介面来转换成MCU通用的C语言程序。

在MCU开发中,通常写好C语言後配合GCC或者专属编译器(Compiler)就能产生能在MCU上运行的执行档案(*.bin或 *.hex)。有时为了更方便管理工作排程、资源冲突、档案管理等高阶动作,有时也会MCU上加入超迷你的作业系统,如Arm Mbed OS, freeRTOS等。当然不使用通用型要自己开发作业也是OK的,那又是另一个神级工作,这里就不加讨论了。

小型AI(tinyML)应用程序开发堆叠
Fig. 10-3 小型AI(tinyML)应用程序开发堆叠。(OmniXRI整理绘制, 2021/8/14)

由Fig. 10-3及以上说明,大概就能理解整合型开发平台和使用MCU框架开发其实都差不多,只是这些供应商帮你省去那人烦人的步骤,让你完全不用懂MCU的运作就能使用。另外为了让MCU发挥更多的计算能力或者能使用标准型框架开发出的模型,有些整合型平台供应商也会自行提供专属的函式库(SDK/Lib)甚至结合编译器厂商让自家产生的MCU码执行上更有效率。而至於想走那条开发路线就随个人喜好而定了,没有绝对好坏。

参考连结

Arm Mbed OS
Arm Mbed OS Github
Arm Common Microcontroller Software Interface Standard (CMSIS) Documentation
Arm CMSIS Version 5 Github

ps. 为让文章更活泼传达硬梆梆的技术内容,所以引用了经典电影「食神」的桥段,希望小弟戏剧性的二创不会引起电影公司的不悦,在此对星爷及电影公司致上崇高的敬意,敬请见谅。


<<:  从中国恒大事件看停损的重要性

>>:  【Day 11】 实作 - 透过 AWS 服务 - Lambda 将 JSON 格式转换成 Parquet 格式

[Re:PixiJS - Day43] pixi-particles 粒子效果 1/2:plugin 安装与开始使用

来到这次系列最後想讲的主体:粒子效果 PixiJS 实现粒子效果有两种方式: ParticleCon...

30天打造品牌特色电商网站 Day.14 导览列基础制作(下)

今天我们就来继续做导览列的部分,昨天的HTML已经制作出了导览列的框架,今天就利用CSS来做一些美化...

JavaScript 闭包(Closure) 下集

看这个程序码,结果会是如何? function ArrFunction(){ var arr=[];...

[Day11] Tableau 轻松学 - Workbook/Worksheet/Dashboard/Story

前言 档案架构是在开发前应该要先了解的事,可以让我们在对的地方做对的事情,以节省宝贵的时间。主要有四...

[访谈] APCS x 资工学长 Bogay

今天邀请到同学系的大四学长,同时也是我参与这届铁人赛组别「NTNU-Unic0rn」的组长大大~ 希...