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




  

相关话题

  如何解决测试中充斥着大量训练集中没见过的样本类型模型将其识别成非我族类仍然保持测试集的高精度? 
  如何评价最近火热的对比学习,会引领预训练模型新的范式嘛? 
  有哪些人工智能上的事实,没有一定人工智能知识的人不会相信? 
  如何评价微软亚研院提出的把 Transformer 提升到了 1000 层的 DeepNet? 
  如何看待马毅老师深度学习第一性原理的文章在 ICML 四个审稿人一致接收的情况下被 AC 拒了? 
  物理专业的学生如何看待机器学习和大数据这些方向呢? 
  有哪些令你印象深刻的魔改transformer? 
  北京深鉴科技基于FPGA平台的DPU架构如何? 
  如何评价清华大学发布的自研深度学习框架-计图(Jittor)? 
  如何评价生成模型框架 ZhuSuan? 

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





© 2024-12-26 - tinynew.org. All Rights Reserved.
© 2024-12-26 - tinynew.org. 保留所有权利