话说唐牛抢了我的餐厅,当上老板後,就开始训斥我的厨师:「椅子要多窄有多窄,吸管要多粗有多粗,冰块要多大有多大,薯条要炸多老有多老,等小鬼们吃完之後要多渴有多渴,你应该知道我的意思!」,厨师害怕轻声的答道:「这样对小朋友的健康不太好吧?」,结果厨师就被一顿爆踢,还口中喃喃自语:「不要逼我,不要逼我,我是个好人啊!把他拖出去。」
听到这个,不禁让我想到上次那想作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。
Fig. 10-1 传统AI及tinyML(MCU AI)应用程序开发流程图。(OmniXRI整理绘制, 2021/8/14)
tinyML整合型开发平台供应商为了让使用者不用懂太多AI技术,也不用会写MCU程序,所以通常提供一站式云端服务,申请一个帐号加上网页浏览器就能开始使用,主要整合了下列项目:
目前常见的tinyML整合型开发平台供应商,如Fig. 10-2所示。当然不只这些,只是这几个平台提供较多的学习资源及参考资料,更重要地是「免费」(不知道何时会开始收费)。这几个平台可支援的开发板清单可参考[Day 03] tinyML开发板介绍。
Fig. 10-2 常见的tinyML整合型开发平台供应商。(OmniXRI整理绘制, 2021/9/24)
如果你是一般的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的,那又是另一个神级工作,这里就不加讨论了。
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 格式
来到这次系列最後想讲的主体:粒子效果 PixiJS 实现粒子效果有两种方式: ParticleCon...
今天我们就来继续做导览列的部分,昨天的HTML已经制作出了导览列的框架,今天就利用CSS来做一些美化...
看这个程序码,结果会是如何? function ArrFunction(){ var arr=[];...
前言 档案架构是在开发前应该要先了解的事,可以让我们在对的地方做对的事情,以节省宝贵的时间。主要有四...
今天邀请到同学系的大四学长,同时也是我参与这届铁人赛组别「NTNU-Unic0rn」的组长大大~ 希...