百科问答小站 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,就是在做这样一件事呀。




  

相关话题

  你遇见过什么当时很有潜力但是最终没有流行的深度学习算法? 
  如何评价余凯创立的horizon robotics? 
  注意力机制是如何学习到模型所应注意的区域的? 
  为什么相比于计算机视觉(cv),自然语言处理(nlp)领域的发展要缓慢? 
  AI(或者说神经网络/深度学习)能够实现科学(尤其是物理学)研究中提出假设这一步嘛? 
  现代人工神经网络是不是一个死胡同?这个技术是不是骗人的? 
  从今年校招来看,机器学习等算法岗位应届生超多,竞争激烈,未来 3-5 年机器学习相关就业会达到饱和吗? 
  为什么yolov5从零开始训练(不在ImageNet上预训练)能够达到如此高的性能? 
  如何看待 Richard Sutton 说的「人工智能中利用算力才是王道」? 
  如何看待鄂维南院士等发起的机器学习联合研讨计划(c2sml.cn)? 

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





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