极客时间已完结课程限时免费阅读

39 | 移动开发新大陆: 边缘智能计算的趋势

39 | 移动开发新大陆: 边缘智能计算的趋势-极客时间

39 | 移动开发新大陆: 边缘智能计算的趋势

讲述:冯永吉

时长15:07大小13.81M

你好,我是张绍文。今天文章的作者黄振是算法领域的专家,过去曾经和他合作过移动端的 AI 项目,无论是他的算法水平,还是工程上的能力,都让我深感佩服。今天我非常幸运地请到他来给我们分享关于移动边缘智能计算的认识。
如果说过去几年移动开发是那头在风口上的猪,现在这个风口明显已经转移到 AI,最明显的是国内应届生都纷纷涌向了 AI 方向。那作为移动开发,我们如何在 AI 浪潮之下占据自己的一席之地?
以我个人看法来看,即使目前 AI 在移动端的落地场景有限,但是 AI 这个“坑”我们是一定要跳的。我们可以尝试使用 TensorFlow 这些框架去做一些简单的 Demo,逐步加深对深度学习的理解。
Google 的TensorFlow Lite、Facebook 的Cafe2、腾讯的NCNNFatherCNN、小米的MACE、百度的Paddle-Mobile,各个公司都开源了自己的移动深度学习框架。移动端未来必然是深度学习一个非常重要的战场,移动开发们需要发挥自己的平台特长。我们对于这些移动深度学习框架的优化应该更有发言权,要做到既有算法思维,也有更加强大的工程能力。就像之前黄振合作的项目中,整个框架的性能优化也是由我们来主导,使用了大量 ARM NEON 指令和汇编进行优化。
大家好,我是黄振,目前在一家大型互联网公司从事算法工作。我一直在关注边缘智能计算,正好过去也开展过移动端机器学习的项目,期间也接触了不少 Android 开发的同学。在一起合作期间,我也在思考 AI 和 Android 开发可以相结合的点,也看到团队中不少 Android 开发同学展现出的机器学习技术的开发能力。正好应绍文邀请,在 Android 开发专栏和你分享一下我对移动端机器学习的认识,希望对你有所帮助。
目前,技术的发展有两个趋势。一个趋势是,随着 5G 网络的发展,物联网使“万物互联”成为可能。物联网时代,也是云计算和边缘计算并存的世界,且边缘计算将扮演重要的角色。边缘计算是与云计算相反的计算范式,指的是在网络边缘节点(终端设备)进行数据处理和分析。边缘计算之所以重要,原因在于:首先,在物联网时代,将有数十亿的终端设备持续采集数据,带来的计算量将是云计算所不能承受的;其次,终端设备的计算能力不断提高,并不是所有的计算都需要在云端完成;再有,将数据传回云端计算再将结果返回终端的模式,不可避免存在时延,不仅影响用户体验,有些场景也是不可接受的;最后,随着用户对数据安全和隐私的重视,也会要求在终端进行数据加工和计算。
另一个趋势是,人工智能技术的迅速发展。最近几年,以深度学习为代表的人工智能技术取得了突破性的进展,不仅在社会上引起了人们的兴趣和关注,同时也正在重塑商业的格局。人工智能技术的重大价值在于,借助智能算法和技术,将之前必须人工才能完成的工作进行机器化,用机器的规模化解放人工,突破人力生产要素的瓶颈,从而大幅提高生产效率。在商业社会,“规模化”技术将释放巨大的能量、创造巨大的价值,甚至重塑商业的竞争,拓展整个商业的外部边界。
边缘计算既然有计算能力,在很多应用场景中就会产生智能计算的需求,两者结合在一起,就形成了边缘智能计算。

移动端机器学习的开发技术

目前,移动端机器学习的应用技术主要集中在图像处理、自然语言处理和语音处理。在具体的应用上,包括但不限于视频图像的物体检测、语言翻译、语音助手、美颜等,在自动驾驶、教育、医疗、智能家居和物联网等方面有巨大的应用需求。
1. 计算框架
因为深度学习算法具有很多特定的算法算子,为了提高移动端开发和模型部署的效率,各大厂都开发了移动端深度学习的计算框架,例如谷歌的TensorFlow Lite、Facebook 的Caffe2等,Android 开发的同学还是挺有必要去了解这些计算框架的。为了培养兴趣这方面的兴趣并获得感性的认识,你可以挑选一个比较成熟的大厂框架,例如 TensorFlow Lite,在手机开发一个物体检测的 Demo 练练手。
在实际项目中,TensorFlow Lite 和 Caffe2 等通常运行比较慢。在网上可以很容易找到各个计算框架的对比图。如果要真正入门的话,在这里我推荐大家使用NCNN框架。NCNN 是腾讯开源的计算框架,优点比较明显,代码结构清晰、文件不大,而且运行效率高。强烈推荐有兴趣的 Android 开发同学把源码阅读几遍,不仅有助于理解深度学习常用的算法,也有助于理解移动端机器学习的计算框架。
阅读 NCNN 源码抓住三个最基础的数据结构,Mat、Layer 和 Net。其中,Mat 用于存储矩阵的值,神经网络中的每个输入、输出以及权重,都是用 Mat 来存储的。Layer 实际上表示操作,所以每个 Layer 都必须有前向操作函数(forward 函数),所有算子,例如,卷积操作(convolution)、LSTM 操作等都是从 Layer 派生出来的。Net 用来表示整个网络,将所有数据节点和操作结合起来。
在阅读 NCNN 源码的同时,建议大家也看些关于卷积神经网络算法的入门资料,会有助于理解。
2. 计算性能优化
在实际项目中,如果某个路径成为时间开销的瓶颈,通常可以将该节点用 NDK 去实现。但在通常情况下,移动端机器学习的计算框架已经是 NDK 实现的,这时改进的方向是采用 ARM NEON 指令 + 汇编进行优化。
NEON 是适用于 ARM Cortex-A 系列处理器的一种 128Bit SIMD(Single Instruction, Multiple Data,单指令、多数据)扩展结构。ARM NEON 指令之所有能达到性能优化的目的,关键就在于单指令多数据。如下图所示:
两个操作数各有 128Bit,各包含 4 个 32Bit 的同类型的寄存器,通过如下所示的一条指令,就可以实现 4 个 32Bit 数据的并行计算,从而达到性能优化的效果。
VADDQ.S32 Q0,Q1,Q2
我们曾经用 NDK 的方式实现了深度学习算法中的 PixelShuffle 操作,后来采用 ARM NEON+ 汇编优化的方式,计算的效率提升 40 倍,效果还是很显著的。
如果还想进一步提高计算的性能,可以采用 Int 8 量化的方法。在深度学习里面,大多数运算都是基于 Float 32 类型进行的,Float 32 是 32Bit,128Bit 的寄存器一次可以存储 4 个 Float 32 类型数据;相比之下,Int 8 类型的数据可以存储 16 个。结合前面提到的单指令多数据,如果采用 Int 8 类型的数据,单条指令可以同时执行 16 个 Int 8 数据的运算,从而大大提高了并行性。
但是,将 Float 32 类型的数值量化到 Int 8 表达,不可避免会影响到数据的精度,而且量化的过程也是需要时间开销的,这些都是需要注意的地方。关于量化的方法,感兴趣的同学可以阅读这篇论文
如果设备具有 GPU,还可以应用 OpenCL 进行 GPU 加速,例如小米开源的移动端机器学习框架MACE

移动端机器学习的算法技术

对于刚开始学习算法的同学,我一直主张不要把算法想象得太复杂,也不要想得太数学化,否则容易让人望而生畏。数学是思维逻辑的表达,我们希望用数学帮助我们理解算法。我们要能够达到对算法的直观理解,从直观上知道和理解为什么这个算法会有这样的效果,只有这样才算是真正掌握了算法。相反,对于一个算法,如果你只记住了数学推导,没形成直观的理解,是不能够灵活应用的。
1. 算法设计
深度学习的图像处理具有很广的应用,而且比较直观和有趣,建议你可以从深度学习的图像处理入手。深度学习的图像处理,最基本的知识是卷积神经网络,所以你可以先学习卷积神经网络。网上有很多关于卷积神经网络的介绍,这里就不赘述了。
理解卷积神经网络关键是理解卷积神经网络的学习机制,理解为什么能够学习。想要理解这一点,首先需要明确两个关键点“前向传播”和“反向传播”。整个神经网络在结构和激活函数确定之后,所谓“训练”或者“学习”的过程,其实就是在不断地调整神经网络的每个权重,让整个网络的计算结果趋近于期望值(目标值)。前向传播是从输入端开始计算,目标是得到网络的输出结果,再将输出结果和目标值相比较,得到结果误差。之后将结果误差沿着网络结构反向传播拆解到每个节点,得到每个节点的误差,然后根据每个节点的误差调整该节点的权重。“前向传播”的目的是得到输出结果,“反向传播”的目的是通过反向传播误差来调整权重。通过两者互相交替迭代,希望达到输出结果和目标值一致。
理解卷积神经网络之后,我们可以动手实现手写字体识别的示例。掌握之后,可以接着学习深度学习里的物体检测算法,例如 YOLO、Faster R-CNN 等,最后可以动手用 TensorFlow 都写一遍,跑跑训练数据、调调参数,边动手边理解。在学习过程中,要特别留意算法模型的设计思想和解决思路。
2. 效果优化
效果优化指提升算法模型的准确率等指标,通常的方式有以下几种:
优化训练数据
优化算法设计
优化模型训练方式
优化训练数据
因为算法模型是从训练数据中学习的,模型无法学习到训练数据之外的模式。所以,在选择训练数据时要特别小心,必须使得训练数据包含实际场景中会出现的模式。精心挑选或标注训练数据,会有效提升模型的效果。训练数据的标注对效果非常重要,以至于有创业公司专门从事数据标注,还获得了不少融资。
优化算法设计
根据问题采用更好的算法模型,采用深度学习模型而不是传统的机器学习模型,采用具有更高特征表达能力的模型等,例如使用残差网络或 DenseNet 提高网络的特征表达能力。
优化模型训练方式
优化模型训练方式包括采用哪种损失函数、是否使用正则项、是否使用 Dropout 结构、使用哪种梯度下降算法等。
3. 计算量优化
虽然我们在框架侧做了大量的工作来提高计算性能,但是如果在算法侧能够减少计算量,那么整体的计算实时性也会提高。从模型角度,减少计算量的思路有两种,一种是设计轻量型网络模型,一种是对模型进行压缩。
轻量型网络设计
学术界和工业界都设计了轻量型卷积神经网络,在保证模型精度的前提下,大幅减少模型的计算量,从而减少模型的计算开销。这种思路的典型代表是谷歌提出的MobileNet,从名字上也可以看出设计的目标是移动端使用的网络结构。MobileNet 是将标准的卷积神经网络运算拆分成 Depthwise 卷积运算和 Pointwise 卷积运算,先用 Depthwise 卷积对输入各个通道分别进行卷积运算,然后用 Pointwise 卷积实现各个通道间信息的融合。
模型压缩
模型压缩包括结构稀疏化和蒸馏两种方式。
在逻辑回归算法中,我们通过引入正则化,使得某些特征的系数近似为 0。在卷积神经网络中,我们也希望通过引入正则化,使得卷积核的系数近似为 0。与普通的正则化不同的是,在结构稀疏化中,我们希望正则化实现结构性的稀疏,比如某几个通道的卷积核的系数全部近似为 0,从而可以将这几个通道的卷积核剪枝掉,减少不必要的计算开销。
蒸馏方法有迁移学习的意思,就是设计一个简单的网络,通过训练的方式,使得该简单的网络具有目标网络近似的表示能力,从而达到“蒸馏”的效果。

Android 开发同学的机会

移动端机器学习的计算框架和算法,前者负责模型计算的性能,减少时间开销;后者主要负责模型的精度,还可以通过一些算法设计减少算法的计算量,从而达到减少时间开销的目的。
需要注意的是,在移动端机器学习中,算法模型的训练通常是在服务器端进行的。目前,终端设备通常不负责模型的训练。在使用时,由终端设备加载训练结果模型,执行前向计算得到模型的计算结果。
但是前面讲了那么多行业趋势和机器学习的基本技术,那对于移动开发的同学来说,如何进入这个“热门”的领域呢?移动端机器学习是边缘智能计算范畴的一个领域,而且移动端开发是 Android 开发同学特别熟悉的领域,所以这也是 Android 开发同学的一个发展机会,转型进入边缘智能计算领域。Android 开发同学可以发挥自己的技术专业优势,先在边缘计算的终端设备程序开发中站稳脚跟,在未来的技术分工体系中有个坚固的立足点;同时,逐步学习深度学习算法,以备将来往前迈一步,进入边缘智能计算领域,创造更高的技术价值。
可能在大部分情况下,Android 开发同学在深度学习算法领域,跟专业的算法同学相比,不具有竞争优势,所以我们千万不要放弃自己所专长的终端设备的开发经验。对大多数 Android 开发同学而言,“专精 Android 开发 + 懂深度学习算法”才是在未来技术分工中,创造最大价值的姿势。
对于学习路径,我建议 Android 开发同学可以先学习卷积神经网络的基础知识(结构、训练和前向计算),然后阅读学习 NCNN 开源框架,掌握计算性能的优化方法,把开发技术掌握好。同时,可以逐步学习算法技术,主要学习各种常见的深度学习算法模型,并重点学习近几年出现轻量型神经网络算法。总之,Android 开发同学要重点掌握提高计算实时性的开发技术和算法技术,兼顾学习深度学习算法模型。
基于前面的描述,我梳理了移动端机器学习的技术大图供你参考。图中红圈的部分,是我建议 Android 开发同学重点掌握的内容。
欢迎你点击“请朋友读”,把今天的内容分享给好友,邀请他一起学习。我也为认真思考、积极分享的同学准备了丰厚的“学习加油礼包”,期待与你一起切磋进步哦。
分享给需要的人,Ta购买本课程,你将得18
生成海报并分享

赞 8

提建议

上一篇
38 | 移动开发新大陆:Android音视频开发
下一篇
40 | 动态化实践,如何选择适合自己的方案?
unpreview
 写留言

精选留言(15)

  • moluren
    2019-04-22
    文章最后的图片中的计算框架是不是要加入MACE,对了解移动端的异构计算很有帮助?

    作者回复: 技术日新月异,可能不一定可以搞全

    2
  • 聂旋
    2021-08-24
    说白了, 数据不全就是瞎扯,这个技术火起来就是因为有了一个比较好的图片库。 之前有人说,计算机技术可以改变世界, 然而 这世道越来越难混, 官僚还是官僚,有个屁的改变。 一个技术,就是混口饭吃的 工具。 技术换了折磨多年,程序员换了一波又一波,大家也就混口饭吃。 不要做技术吹,也不要神话技术。 平常心看技术。
    共 1 条评论
    2
  • 山鬼
    2019-04-12
    1
  • archmageforac
    2022-02-23
    请问:移动端机器学习的技术大图中,计算性能优化里的低精度矩阵运算,有详细介绍资料吗? 我只找到了一篇https://blog.csdn.net/yunqiinsight/article/details/80163734,里面提到了低精度矩阵计算工具AliNN&BNN,但没有进一步搜索到AliNN的相关介绍,BNN(这里B是Binary而不是Bayesian吧?)也没找到中文资料,英文资料也比较少。
  • 文培定
    2021-05-11
    看了之后再次后悔做应用,应用常被说一套经验用了N年,但你有听说做底层驱动的被说这样的话吗?
  • 无悔
    2020-03-27
    请问一下,因为感觉开发AI比较重视学历,所以是不是留在移动端并往AI应用方向相结合会好点?这样应该怎么做?文章最后说的计算框架和计算性能优化,是移动端开发负责这一块吗?(之前有看过人工智能的课程)还有必要深入学习深度学习吗?一直挺疑惑的.
  • 林哥
    2019-10-25
    真棒
  • 瞬间
    2019-07-30
    最近感觉遇到瓶颈了,这才发现开阔的眼界很重要,想请教下作者,如何拓宽自己的眼界呢?有哪些博客、新闻网站、官方日志等信息渠道可以分享么?想拓宽一下自己获取信息的渠道。
  • 程序员小跃
    2019-07-26
    原来服务端也有机会呀,眼界又开阔了
  • ken
    2019-06-24
    我开发了一个人证核身的app,也掌握了
    共 1 条评论
  • 长街
    2019-04-22
    有没有相关书籍推荐呢?

    作者回复: 网上开源的框架和资料还是比较多的,可以先从基础知识和这些框架入手

  • 小梅
    2019-04-19
    感谢作者🙏,最近有点迷茫,想往AI方向转型,学了python,接触了下tensorflow。看了作者的分享,感觉找到了以后发力的方向了,万分感谢🙏
  • 拾识物者
    2019-04-06
    灵活运用算法比了解数学细节更优先,这句说得好,毕竟我们是要拿来用的。刚学机器学习的时候就卡在了吴恩达的公开课上。。。
    共 1 条评论
  • 赵捌玖
    2019-04-06
    是个不错的方向啊👍🏻👍🏻👍🏻👍🏻👍🏻
  • Z
    2019-04-06
    赞一个,tf刚出就比较关注,很看好移动端和机器学习的结合

    作者回复: 是的,这一块各大厂尝试会越来越多,从Google I/O和F8会议日程就可以看出来