嵌入式AI,就是在嵌入式的环境下做AI。算法模型还是原来原来那些算法模型,不过毕竟是在嵌入式环境下,时代变了,总要有一些东西作出改变。首先,我们来回答为什么要有嵌入式AI。
01 为什么需要嵌入式AI
现在AI发展最大的问题是什么?通过图灵测试?上SOTA?我觉得是落地问题。这几年AI大新闻一个接一个,无论是学术界还是工业界,谁都觉得AI现在是风口。不过质疑的声音也渐渐走强,不断地有人在问这是不是一个泡沫,甚至已经有人开始预测泡沫什么时候破裂。
为什么同样是AI,意见会如此两极化?
开始我也很不理解,问了一些朋友,也看了一些资料,渐渐也就清楚了一点:说到底就是落地问题。AI相关的顶会每年好几次,每次都能出来一些值得津津乐道的东西,有时还有意外的突破让人发出“噢还能这样玩”的感叹。公道地说,从研究的角度看,AI这几年一直在进步,而且进步还不小,大家都在期待奇点早点来临。
不过,从应用的角度再想一想,事情就没这么乐观了。不少AI产品确实让我们眼前一亮,但那已经是好几年前的事情了,不是说这几年啥事没干,主要都在优化,早几年Siri说个话都磕磕巴巴,现在吵个架基本不成问题。不过有什么以前没有的新功能呢?想半天想不出来。一边高歌猛进,一边安静如鸡,这就是问题。
许多人都说,AI下一个落地的场景就是下一个风口。我当然猜不准下一个落地的场景究竟是什么,但我知道可选项之一就是嵌入式AI。以前一说嵌入式就是单片机,以至于许多同学以为这俩词就是一回事。
以前嵌入式系统大体的流程是这样:输入传感器信号,用编写的程序进行处理,然后输出控制信号,为什么学嵌入式感觉都是在学单片机编程,道理就在这。
不过,现在是智能时代了,嵌入式系统也进化成了“智能嵌入式系统”。有什么不同呢?
这里引用《AI嵌入式系统》的一个观点:传统的嵌入式系统主要用于控制,而智能嵌入式系统则提升了感知、交互和决策这三方面的智能化水平,分别叫智能感知、智能交互和智能决策。书里清楚解释了这三个名词,这里我想借这个问题说一下为什么嵌入式AI会是下一个落地的场景之一。
02 智能的作用
大家最想问的应该是多了“智能”会有什么不同,关键就在于编程。
过去嵌入式系统要干点什么肯定都得编程。编程也不是上来就写代码,首先得分析数据,提炼需求,最后才是编程实现。这几个环节都要投入时间,尤其是现在嵌入式部署的环境愈来愈复杂,问题也愈来愈多,而按照传统的方式,这些问题都必须在编程时一一加以考虑,把规则一条条写上,系统才能具备处理能力。
手写规则费时费力,而且还容易“挂一漏万”。有没有更好的办法解决呢?有,就是加入AI。AI不需要人工写规则,而是可以通过数据“自学”。对于一些抽象的、不太好人工描述的规则,AI同样可以通过学习来具备相应的能力。这就是智能。
嵌入式加上了AI,人工成本大大降低,想象空间大大延伸,这其中可能就孕育了下一个杀手级的AI应用。
03 嵌入式的特殊局限
现在,我们又有了个新问题:为什么要从AI中单独切出一块,叫嵌入式AI?
前面已经说过,嵌入式AI的模型算法都是原来那套,从理论层面并没有太多的不同,问题就出在嵌入式本身。
嵌入式设备和通用计算机的计算环境大相径庭,平时给我们感受最深的就是存储容量小。《AI嵌入式系统》给出一组对比数据:常见的深度神经网络模型使用单精度浮点数存储参数对应的存储量在20MB至560MB之间,相比之下,传统低成本的嵌入式系统RAM存储容量最高也只有16MB。
另一个同样捉襟见肘的是算力。这个就不说了,嵌入式设备在算力方面什么时候都只是弟弟。还有一个容易被大家忽视但同样存在局限性的是能耗。要知道深度学习模型都是电老虎,每次模型跑训练,显卡的风扇都是要发出即将起飞的声音,哪怕只是要模型跑起来,同样也是一件费电的事情。而嵌入式设备在许多情况下是有耗能限制的。
总而言之,也许我们很容易找到一个嵌入式应用场景需要AI,也确实已经有现成的模型足以满足要求,本来马上就是一拍即合的事,不过,嵌入式本身的种种限制,想要简单硬套AI的现有成果,只能长使英雄泪满襟。
04 AI的应对方法
方法不是没有,有两条路。一条是提升嵌入式设备的硬件条件,不过这也变相限制了应用场景,另一条就是AI自己做出优化,减少对空间、算力和能耗的需求。现在大家选择了第二条路,将问题带回到了AI这一边,于是有了嵌入式AI。
这部分内容许多,这里我做一点简单介绍,方便大家了解嵌入式AI都研究哪些方面。AI要适应嵌入式环境,就要进行字面意义上的“削足适履”,在大幅减少资源需求的同时,尽量保证性能不至于明显下降,在嵌入式AI里面,叫做优化,譬如说矩阵乘法优化。
过去我在介绍机器学习的知识体系时说过,矩阵运算是机器学习的骨骼。机器学习不是一种模型,而是一堆模型,而这些模型都大量使用了矩阵运算,主要是矩阵乘法。假如矩阵乘法的运算量能够降下来,模型整体的运算量也就能够降下来。
道理好懂,可是天下真有这种空手套白狼的好事吗?
科学家还真给研究出来了。这要从Strassen矩阵相乘算法说起,该算法于1969年提出,是第一款算法复杂度低于O(N3)的矩阵乘法。
简单来说,就是这款算法能够降低矩阵乘法的运算量,譬如说2×2矩阵相乘,常规算法进行8次乘法运算,而采用本算法只需要进行7次,矩阵乘法的运算量减少12.5%,不过不是没成本的,加法运算从4次提升至18次。
就这样看起感觉没什么,但一旦矩阵上了规模,譬如说128×128的矩阵运算,使用该算法能够降低约一半的矩阵乘法运算,优化效果就十分可观了。类似的算法还有Winograd算法,同样能够在大尺寸矩阵运算中将乘法运算降低50%。
上面这类算法称为快速矩阵乘法,另一种方案则是采用了牺牲精度提升速度的思想,允许矩阵乘法结果存在一定误差,这类算法称为近似矩阵乘法,譬如基于数据统计相关性的近似矩阵乘法,以及基于数据协方差低秩分解近似的快速乘法。
类似的从算子层面进行优化的还有对卷积运算的优化。卷积运算的作用不必多说了,现在用深度神经网络做图像处理就离不开卷积运算,优化的方向和矩阵乘法很类似,也是从快速卷积算法和近似卷积算法两个方面展开研究,譬如说一维循环卷积频域快速算法和基于卷积核低秩分解的二维快速卷积。
05 怎样开发嵌入式AI
既然要应用落地,那么除了理论研究,当然还要有开发工具。不过嵌入式的平台许多,开发环境各不相同,这里我就就着《AI嵌入式系统》对Arm平台上的机器学习工具做一点介绍。
Arm本身就不说了,早个十年学嵌入式这可能还算是个新词,现在智能手机人手一台,里面装的就是Arm的处理器。不过,按照处理器划分,Arm平台大致可分为Cortex-A、Cortex-M和Cortex-R三大系列。
我们手机里装的就是Cortex-A系列,据说算力超过NASA当年搞登月时使用的超级计算机,硬件条件相对宽裕,开发资源也很丰富,深度学习的两大框架Pytorch和Tensorflow都推出了针对Cortex-A的版本。Arm也推出了ACL(Arm Compute Libray)等库来支持Arm平台的高性能数据运算。
Cortex-M和Cortex-R系列我们听得较少,因为这俩主要是面向工业应用,Cortex-M主打低成本低能耗应用场景,而Cortex-R则可以用于对实时性有更高要求的任务。相比Cortex-A,这俩个系列的算力就非常有限了。Arm专门推出了CMSIS软件架构来方便Cortex-M系列的应用开发。
CMSIS与机器学习关系较密切的库有两个,一个是CMSIS-DSP库,里面提供了基本数学运算操作如矩阵运算、部分机器学习算法如SVM、以及FIR滤波、计算KL距离、DCT转换、PID控制和排序等功能函数。CMSIS-DSP使用的是C语言,不过可以导入使用Python的Scikit-Learn库训练得到的模型。
另一个是CMSIS-NN库,看名字便可知道这是一个用于构建神经网络的库,同样也可以导入训练好的模型。