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




  

相关话题

  如何评价Deepmind自监督新作BYOL? 
  基于深度学习的自然语言处理在 2016 年有哪些值得期待的发展? 
  如何看待谷歌研究人员提出的卷积正则化方法「DropBlock」? 
  如何看待swin transformer成为ICCV2021的 best paper? 
  在文本分类任务中,有哪些论文中很少提及却对性能有重要影响的tricks? 
  能分享你收藏的国外AI talk, seminar平台或网站吗? 
  如何理解链接预测(link prediction)? 
  深度学习有哪些好玩的案例? 
  对自己深度学习方向的论文有idea,可是工程实践能力跟不上,实验搞不定怎么办? 
  深度学习如何入门? 

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





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