百科问答小站 logo
百科问答小站 font logo



为什么 MobileNet、ShuffleNet 在理论上速度很快,工程上并没有特别大的提升? 第1页

  

user avatar   zhangjiajie043 网友的相关建议: 
      

一句话解释:因为 CPU 和 GPU 的计算方式不一样

CPU 读取数据不是每次都从内存(RAM)拿的,会有缓存,缓存的读取速度比内存快很多很多。两个时间复杂度一样的算法,如果一个缓存命中率高,那可能实际跑起来比另一个快上十倍二十倍也不稀奇。尤其是计算卷积这种包含大量循环的操作,缓存命中率显得尤为重要。

而在 GPU 上数据传输读取的方式是不一样的,所谓的缓存命中也是完全不一样的概念。粗略讲在小卷积核卷积这种操作情况下是不受缓存影响的(相对 CPU 而言)。

mobilenet 就是利用了分离的技巧,用更多的层数换取了更高的缓存命中率,所以对 CPU 计算更友好。为什么要这样?从名字看出来,mobilenet 是希望提高移动端计算的速度,目前为止移动端神经网络推理大多数情况下还是使用 CPU 进行。虽然很多手机厂商大吹特吹什么 NPU,毕竟还是不够成熟,广大第三方开发者很难直接使用。那 GPU 呢?桌面端有 CUDA,cuDNN 给你铺好路了,移动端可啥都没有啊,连 OpenGL ES 3.0 支持都零零落落,还指望有神经网络相关的驱动?做梦呢。所以这就是为什么 Google 研究出各种神奇吊炸天的算法,也只用在自家的 pixel 手机上,毕竟自家的手机,硬件好统一,驱动能跟上。


插个题外话,这两天又到校招季,知乎上也多了很多提问。有抱怨的,有忿忿不平的,有觉得做算法为什么要懂工程的。那这个问题就是一个例子了。如果你知道一些计算机底层的机制,自然知道为什么,知道为什么也就能动手把你的模型改造成适合移动端计算的形式。相比于整个替换 backbone 重新训练,也许只要改改某些层就能让计算速度获得极大提升。

举个简单栗子,两个矩阵相乘,简单直白的三重循环就搞定,时间复杂度 O(mnk),可是同样是三重循环,实际运行速度可以差好多倍。简单调换一下三重循环的内外顺序,就可以做到。是不是很神奇?我打赌现在大批做算法的同学,听都没听过这种事情。这在以前,可是学计算机要掌握的基础知识啊。

我一直说一句话,算法工程师也是工程师,工程师是解决问题的。模型结果可以很酷炫,但用不到产品中去,不能给公司带来收益,那都是花架子。

我作为面试官,如果候选人拿出手机给我演示了一个他的模型使用的 demo,哪怕网络模型本身毫无创新点,只要在手机上流畅运行起来,我就会毫不犹豫给出一个高分。


再插个题外话,同样的模型,只要调整一些局部顺序就可以大幅提高运算速度。有人也许会不屑,知道了又有什么用?呐,这就是你和陈天奇这样的大佬的差距了。看看大佬的 TVM,就是在做这样一件事呀。




  

相关话题

  为什么中文 NLP 数据集这么少? 
  如何评价 DeepMind 在星际中的失利,以及 OpenAI 在 Dota 上的成功? 
  请问一下,机器学习领域的联邦学习技术,目前看到最多的是微众银行,国内还有哪些顶级专家及机构和大学? 
  生成式对抗网络GAN有哪些最新的发展,可以实际应用到哪些场景中? 
  AI(或者说神经网络/深度学习)能够实现科学(尤其是物理学)研究中提出假设这一步嘛? 
  如何直观地解释 backpropagation 算法? 
  深度学习的多个loss如何平衡? 
  计算机视觉(cv)方向今年招聘情况怎么样?是否已经人才过剩? 
  机器学习,深度神经网络等方法是否是正确的方向? 
  NTIRE2017夺冠的EDSR去掉了Batch Normalization层就获得了提高为什么? 

前一个讨论
如何看待AAAI22《Mind Your Clever Neighbours》疑似真实标签做无监督?
下一个讨论
独孤求败的生平是怎样的?





© 2024-11-21 - tinynew.org. All Rights Reserved.
© 2024-11-21 - tinynew.org. 保留所有权利