当前位置: 首页 > news >正文

终于有人把“嵌入式人工智能”讲明白了

2a80cee7b25259ff80a98725cac048a0.gif

685ec70f263fa77e229e6effeaa74d1a.png

导读:嵌入式人工智能是个很有意思的概念。之前隔一段就要听到要工作或者要考研的同学问嵌入式和人工智能哪个有前途?果然成年人还是全都要更有前途,于是有了嵌入式人工智能。这篇就简单聊下嵌入式人工智能。

90218453d782613df9eaa2b6524f2bcb.png

作者:木羊同学

来源:华章计算机(hzbook_jsj)

aadb1019c0e5a8c813e11afc28786e95.png

嵌入式人工智能,就是在嵌入式的环境下做人工智能。算法模型还是原来原来那些算法模型,但是毕竟是在嵌入式环境下,时代变了,总要有一些东西作出改变。首先,我们来回答为什么要有嵌入式人工智能。

01

为什么需要嵌入式人工智能

现在人工智能发展最大的问题是什么?通过图灵测试?上SOTA?我觉得是落地问题。这几年人工智能大新闻一个接一个,无论是学术界还是工业界,谁都觉得人工智能现在是风口。但是质疑的声音也渐渐走强,不断地有人在问这是不是一个泡沫,甚至已经有人开始预测泡沫什么时候破裂。

为什么同样是人工智能,意见会如此两极化?

开始我也很不理解,问了一些朋友,也看了一些资料,渐渐也就清楚了一点:说到底就是落地问题。人工智能相关的顶会每年好几次,每次都能出来一些值得津津乐道的东西,有时还有意外的突破让人发出“噢还能这样玩”的感叹。公道地说,从研究的角度看,人工智能这几年一直在进步,而且进步还不小,大家都在期待奇点早点来临。

但是,从应用的角度再想一想,事情就没这么乐观了。不少人工智能产品确实让我们眼前一亮,但那已经是好几年前的事情了,不是说这几年啥事没干,主要都在优化,早几年Siri说个话都磕磕巴巴,现在吵个架基本不成问题。不过有什么以前没有的新功能呢?想半天想不出来。一边高歌猛进,一边安静如鸡,这就是问题。

很多人都说,人工智能下一个落地的场景就是下一个风口。我当然猜不准下一个落地的场景究竟是什么,但我知道可选项之一就是嵌入式人工智能。以前一说嵌入式就是单片机,以至于很多同学以为这俩词就是一回事。以前嵌入式系统大体的流程是这样:输入传感器信号,用编写的程序进行处理,然后输出控制信号,为什么学嵌入式感觉都是在学单片机编程,道理就在这。

但是,现在是智能时代了,嵌入式系统也进化成了“智能嵌入式系统”。有什么不同呢?这里引用《AI嵌入式系统》的一个观点:传统的嵌入式系统主要用于控制,而智能嵌入式系统则提升了感知、交互和决策这三方面的智能化水平,分别叫智能感知、智能交互和智能决策。书里清楚解释了这三个名词,这里我想借这个问题说一下为什么嵌入式人工智能会是下一个落地的场景之一。

02

智能的作用

大家最想问的应该是多了“智能”会有什么不同,关键就在于编程。

过去嵌入式系统要干点什么肯定都得编程。编程也不是上来就写代码,首先得分析数据,提炼需求,最后才是编程实现。这几个环节都要投入时间,特别是现在嵌入式部署的环境越来越复杂,问题也越来越多,而按照传统的方式,这些问题都必须在编程时一一加以考虑,把规则一条条写上,系统才能具备处理能力。

手写规则费时费力,而且还容易“挂一漏万”。有没有更好的办法解决呢?有,就是加入人工智能。人工智能不需要人工写规则,而是可以通过数据“自学”。对于一些抽象的、不太好人工描述的规则,人工智能同样可以通过学习来具备相应的能力。这就是智能。嵌入式加上了人工智能,人工成本大大降低,想象空间大大延伸,这其中可能就孕育了下一个杀手级的人工智能应用。

03

嵌入式的特殊局限

现在,我们又有了个新问题:为什么要从人工智能中单独切出一块,叫嵌入式人工智能?

前面已经说过,嵌入式人工智能的模型算法都是原来那套,从理论层面并没有太多的不同,问题就出在嵌入式本身。

嵌入式设备和通用计算机的计算环境大相径庭,平时给我们感受最深的就是存储容量小。《AI嵌入式系统》给出一组对比数据:常见的深度神经网络模型使用单精度浮点数存储参数对应的存储量在20MB至560MB之间,相比之下,传统低成本的嵌入式系统RAM存储容量最高也只有16MB。

另一个同样捉襟见肘的是算力。这个就不说了,嵌入式设备在算力方面什么时候都只是弟弟。还有一个容易被大家忽视但同样存在局限性的是能耗。要知道深度学习模型都是电老虎,每次模型跑训练,显卡的风扇都是要发出即将起飞的声音,哪怕只是要模型跑起来,同样也是一件费电的事情。而嵌入式设备在很多情况下是有耗能限制的。

总而言之,也许我们很容易找到一个嵌入式应用场景需要人工智能,也确实已经有现成的模型足以满足要求,本来马上就是一拍即合的事,但是,嵌入式本身的种种限制,想要简单硬套人工智能的现有成果,只能长使英雄泪满襟。

04

人工智能的应对方法

方法不是没有,有两条路。一条是提升嵌入式设备的硬件条件,不过这也变相限制了应用场景,另一条就是人工智能自己做出优化,减少对空间、算力和能耗的需求。现在大家选择了第二条路,将问题带回到了人工智能这一边,于是有了嵌入式人工智能。

这部分内容很多,这里我做一点简单介绍,方便大家了解嵌入式人工智能都研究哪些方面。人工智能要适应嵌入式环境,就要进行字面意义上的“削足适履”,在大幅减少资源需求的同时,尽量保证性能不至于明显下降,在嵌入式人工智能里面,叫做优化,譬如说矩阵乘法优化。

过去我在介绍机器学习的知识体系时说过,矩阵运算是机器学习的骨骼。机器学习不是一种模型,而是一堆模型,而这些模型都大量使用了矩阵运算,主要是矩阵乘法。如果矩阵乘法的运算量能够降下来,模型整体的运算量也就能够降下来。

道理好懂,可是天下真有这种空手套白狼的好事吗?

科学家还真给研究出来了。这要从Strassen矩阵相乘算法说起,该算法于1969年提出,是第一款算法复杂度低于O(N3)的矩阵乘法。简单来说,就是这款算法能够降低矩阵乘法的运算量,譬如说2×2矩阵相乘,常规算法进行8次乘法运算,而采用本算法只需要进行7次,矩阵乘法的运算量减少12.5%,不过不是没成本的,加法运算从4次提升至18次。就这样看起感觉没什么,但一旦矩阵上了规模,譬如说128×128的矩阵运算,使用该算法能够降低约一半的矩阵乘法运算,优化效果就十分可观了。类似的算法还有Winograd算法,同样能够在大尺寸矩阵运算中将乘法运算降低50%。

上面这类算法称为快速矩阵乘法,另一种方案则是采用了牺牲精度提升速度的思想,允许矩阵乘法结果存在一定误差,这类算法称为近似矩阵乘法,譬如基于数据统计相关性的近似矩阵乘法,以及基于数据协方差低秩分解近似的快速乘法。

类似的从算子层面进行优化的还有对卷积运算的优化。卷积运算的作用不必多说了,现在用深度神经网络做图像处理就离不开卷积运算,优化的方向和矩阵乘法很类似,也是从快速卷积算法和近似卷积算法两个方面展开研究,譬如说一维循环卷积频域快速算法和基于卷积核低秩分解的二维快速卷积。

05

如何开发嵌入式人工智能

既然要应用落地,那么除了理论研究,当然还要有开发工具。不过嵌入式的平台很多,开发环境各不相同,这里我就就着《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库,看名字便可知道这是一个用于构建神经网络的库,同样也可以导入训练好的模型。

06

作者简介

莫凡 ,网名木羊同学。娱乐向机器学习解说选手,《机器学习算法的数学解析与Python实现》作者,前沿技术发展观潮者,擅长高冷技术的“白菜化”解说,微信公众号“睡前机器学习”,个人知乎号“木羊”。

e587da587458808384d29f053ce2421a.png

07

推荐阅读

4e20f10b6c3cbee186c86998f14fe22c.png

《AI嵌入式系统:算法优化与实现》

48a605763cc714239fb837eb2a485631.png20bbaa4216591bb6ef35f8eb50ab0b93.png

作者:应忍冬 刘佩林

嵌入式系统高效嵌入智能的必备参考书

推荐语:ARM中国教育计划推荐。阐述面向人工智能嵌入式应用的机器学习算法优化理论、设计方法与实现。理论与实践相结合的AI嵌入式算法设计与开发参考书和教材。

7359f004a8e462b98799b0ac67bfe329.png

《TinyML:基于TensorFlow Lite在Arduino和超低功耗微控制器上部署机器学习》

073a113461a81546ebb54dec0c9c42c8.png7080300d30c777060b2645f255e2a0f3.png

作者:(美)皮特•沃登(Pete Warden)

(美)丹尼尔•西图纳亚克(Daniel Situnayake)

译者:魏兰,卜杰 译 王铁震 

推荐语:谷歌TensorFlow团队创始成员领衔撰写,谷歌工程师翻译并审校,Arduino联合创始人、Arm副总裁联袂推荐!TinyML里程碑级著作,手把手教你在Arduino和微控制器上部署ML。“美亚”嵌入式系统畅销榜首图书。

5d4c8765b96c61a73c8c4b2753471820.png

《移动平台深度神经网络实战:原理、架构与优化》

709eda78da9f36c8155e13fdbcfd934c.pngde383fddb1361eb6ddb914dd9938c33b.png

作者:卢誉声

推荐语:谷歌、华为,Arm专家及C++专家侯捷联袂推荐!AIoT时代来临,移动平台正在成为工业实践最重要的阵地!这本书手把手教会你如何把智能装进移动端,开发移动平台人工智能系统解决方案,不止分享知识,还完整呈现深度学习的学习路径!让你的学习之路有方向,不迷茫!


推荐文章:机器学习领域已经百花齐放了,为何还要搞个TinyML?

cc0b535620dc93fe6740d1cd6389430c.gif

be07a0bccde88bba703e2c63cc250413.png

扫码关注【华章计算机】视频号

每天来听华章哥讲书

788032d89309598b487602ab6790f754.gif

更多精彩回顾

书讯 | 1月书讯(下)| 2022年的第一本书

书讯 | 1月书讯(上)| 2022年的第一本书

资讯 | 重磅!达摩院发布2022十大科技趋势

书单 | 6本书,读懂2022年最火的边缘计算

干货 | Flink1.14.2发布,除了log4j漏洞你还需要关注什么?

收藏 | Docker冲顶技术热词,微服务应用热度不减,中国云原生开发者真实现状如何?

上新 | 【新书速递】金融领域可解释机器学习模型与实践

赠书 | 【第87期】程序员怎样上元宇宙的车?

bcd123af55c5b7b367f8a320177a5daa.gif

9f78a8f6a8391ccf3acc38cebcfb5750.gif

点击阅读全文购买

相关文章:

  • 数据分析的 5 种归纳方法
  • 四位RISC先驱获「工程学界诺贝尔奖」,图灵奖得主David Patterson、John Hennessy获奖...
  • 【第88期】这10本硬核技术书,带你读懂5G、物联网和边缘计算,玩转元宇宙
  • 抖音的推荐技术这么强,为什么还有人觉得推荐的一点都不准呢?
  • 【新书速递】如何高效学习存储系统?一本书全都讲明白
  • 学会这10个设计原则,离架构师又进了一步!!!
  • Electron开发者该如何提升自己的技能水平
  • 终于有人把ROS机器人操作系统讲明白了
  • 一文看懂——序列数据的生成:GAN的方法
  • “三行代码,确实需要耗上一整天!”
  • GraalVM下一代JVM到底是什么?
  • 【第89期】推荐几本电商必读书
  • 一文带你了解LoongArch自主指令系统
  • 2021年数据中台行业十大关键词
  • 测试工程师的未来发展方向在哪里?
  • 深入了解以太坊
  • 【面试系列】之二:关于js原型
  • co模块的前端实现
  • Java超时控制的实现
  • js 实现textarea输入字数提示
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • uva 10370 Above Average
  • 不上全站https的网站你们就等着被恶心死吧
  • 回顾 Swift 多平台移植进度 #2
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 如何学习JavaEE,项目又该如何做?
  • 世界上最简单的无等待算法(getAndIncrement)
  • 线性表及其算法(java实现)
  • 学习HTTP相关知识笔记
  • 学习Vue.js的五个小例子
  • 用Python写一份独特的元宵节祝福
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • linux 淘宝开源监控工具tsar
  • ​马来语翻译中文去哪比较好?
  • ​如何防止网络攻击?
  • #pragam once 和 #ifndef 预编译头
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • .NET Core引入性能分析引导优化
  • .NET 常见的偏门问题
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET中 MVC 工厂模式浅析
  • // an array of int
  • @property括号内属性讲解
  • @ResponseBody
  • @synthesize和@dynamic分别有什么作用?
  • [ SNOI 2013 ] Quare
  • [C++][数据结构][算法]单链式结构的深拷贝
  • [C++]C++类基本语法
  • [Docker]十.Docker Swarm讲解
  • [LeetCode] Longest Common Prefix 字符串公有前序
  • [linux运维] 利用zabbix监控linux高危命令并发送告警(基于Zabbix 6)
  • [MySQL FAQ]系列 -- 账号密码包含反斜线时怎么办
  • [No000016]为什么假期计划总是做不到?
  • [office] 怎么在Excel2003菜单栏自定义一个选项卡 #其他#微信#知识分享