当前位置: 首页 > 面试题库 >

Depthwise 卷积实际速度与理论速度差距较大,解释原因。

呼延衡
2023-03-14
本文向大家介绍Depthwise 卷积实际速度与理论速度差距较大,解释原因。相关面试题,主要包含被问及Depthwise 卷积实际速度与理论速度差距较大,解释原因。时的应答技巧和注意事项,需要的朋友参考一下

参考回答:

首先,caffe原先的gpu实现group convolution很糟糕,用for循环每次算一个卷积,速度极慢。第二,cudnn7.0及之后直接支持group convolution,但本人实测,速度比github上几个直接写cuda kernel计算的dw convolution速度慢。例如对于n=128, c=512, h=32, w=32, group=512的卷积跑100次,cudnn 7.0里的group convolution需要4秒多,而DepthwiseConvolution大概只需要1秒。

分析了一下dw convolution与普通convolution的理论计算复杂度,举例如下:

卷积1:普通卷积,输入为6464256,输出为6464256,卷积核大小为33。参数为33256256=590K,计算量为646425633256=2.42G,计算过程的工作集内存总量(输入输出数据+参数)为64642562 + 33256*256 = 2.69M。

卷积2:dw卷积,输入为6464256,输出为6464256,卷积核大小为33。参数为33256=2.3K个,计算量为646425633=9.44M,计算过程的工作集内存总量为64642562 + 33256=2.10M。

卷积3:普通卷积,输入为646416,输出为646416,卷积核大小为33。参数为331616=2.3K个,计算量为6464163316=9.44M,计算过程的工作集内存总量为6464162 + 3316*16=133K。

可以看到卷积2肯定比卷积1快,因为计算量下降到1/256了,但卷积2实际上无法达到卷积1的256倍速度(我记得我测得结果大概是快10倍左右),因为工作集内存大小并没有显著降低。卷积2也无法达到卷积3的速度,因为虽然FLOPS相同,但工作集内存大小相差了很多倍,因此单位数据的计算密度小很多,很难充分利用GPU上的计算单元。

 类似资料:
  • 问题内容: 它们看起来几乎一样,甚至是语法? 使用什么?或什么时候使用什么? 问题答案: 速度不再是真正活跃的开发。Freemarker是。 根据我的经验,Freemarker也更加灵活。

  • 问题内容: 我已经在Scala中编程了一段时间了,我喜欢它,但是令我烦恼的是编译程序所花费的时间。这似乎是一件小事,但是使用Java可以对程序进行一些小的更改,单击netbeans中的运行按钮,然后BOOM就会运行,随着时间的推移,在scala中进行编译似乎会花费大量时间。我听说在许多大型项目中,脚本编写语言变得非常重要,因为需要花费大量的编译时间,而使用Java时却没有看到这种需求。 但是我来自

  • 问题内容: 我构建了一个在我的本地主机(tomcat)中运行良好的webapp。但是,当我尝试部署时,init()中的速度崩溃了,这给我留下了这个奇怪的堆栈跟踪信息(抱歉,大小不一): 有谁知道解决方法?或至少了解错误?我做了一些谷歌搜索,但没有任何线索。.仅此页面面临相同的问题,但没有解决方案.. 问题答案: 我认为这行有答案。似乎在创建velocity.log文件时出现问题。您的配置文件是什么

  • 这最好用一段视频来解释(或者看下面的gif): 你会注意到Karma progress记者报告说测试只需几毫秒,但显然要花很长时间... 我在推特上说了这件事,然后被告知 所以,我的问题是,为什么它报告说它跑得超快,但实际上不是跑得超快,我怎样才能让它跑得快?

  • 问题内容: 这很有趣; 强制迭代器获取实际列表的速度比(理解)快得多。 这是真实的还是我的测试太简单了?下面是代码: 问题答案: 列表推导以Python字节码执行循环,就像常规循环一样。 该调用完全在C代码中进行迭代,这要快得多。 列表理解的字节码如下所示: 该指针大致给你执行循环的界限,让你有百万,和步骤在Python字节码估价循环执行。 另一方面,仅使用C API进行对象迭代即可直接从Iter

  • 我正在学习卷积神经网络,并试图弄清楚数学计算是如何发生的。假设有一个输入图像有3个通道(RGB),所以图像的形状是28*28*3。考虑为下一层应用大小为5*5*3和步幅为1的6个过滤器。这样,我们将在下一层得到24*24*6。由于输入图像是RGB图像,每个滤波器的24*24图像如何解释为RGB图像,即每个滤波器的内部构造的图像大小为24*24*3?