Torch:为啥在相同数据大小下卷积层甚至比全连接线性层慢
Posted
技术标签:
【中文标题】Torch:为啥在相同数据大小下卷积层甚至比全连接线性层慢【英文标题】:Torch: why convolution layer is even slower than full connect linear layer when in same data sizeTorch:为什么在相同数据大小下卷积层甚至比全连接线性层慢 【发布时间】:2018-06-04 17:58:21 【问题描述】:我正在实现一个神经网络来使用 torch7(LUA5.3) 训练 mnist 数据集,但我在 Torch7(LUA5.3) 中发现了 2 个奇怪的问题:1.在相同的数据量下,卷积层比全连接线性层慢。2. GPU(TITAN X with cuda9.0)中的卷积层比 CPU 慢
我做了一些简单的实验来证明:对于第一个问题: (1) 当batch size为500,特征维度为784(28 * 28)时,对于一个全连接的线性层,输入大小为500*784,输出大小为300(我们设置为300),需要1.67s转发数据
picture: 784 * 300 full connected linear layer
(2)在batch size相同的情况下,卷积层耗时3.07s,input2的size为500*1*28*28,表示500张1通道图片,图片为28*28。卷积层有1个输入平面和3个输出平面,kernel size为2*2,step为1,padding为0
picture: convolution layer
第二个问题: (1) 在相同的数据量和神经网络结构的情况下,GPU 比 CPU 需要更多的时间:
picture: It takes 11s in GPU however 3.07s in CPU
(2) 线性层运行良好,在 GPU 中确实比在 CPU 中花费的时间更少
picture: it takes only 0.27s when running full connected linear layer in GPU
但是,很明显卷积层的权重较小,需要的计算量也较少,我认为它应该比线性层快得多。此外,GPU 不应该比 CPU 慢。
提前致谢
【问题讨论】:
【参考方案1】:虽然我不知道为什么在 GPU 中运行卷积层会很慢,但我找到了一种加速它的方法。 'cudnn' 是基于 NVIDIA CUDNN 构建的 Torch 包,可以大大加快卷积层的计算速度。有关详细信息,请参阅here。据我所知,线性层不能提速太多,而卷积层则不同
【讨论】:
【参考方案2】:第一个问题:计算时间不仅仅取决于输入数据的大小。它还取决于权重大小、权重与输入数据之间的操作次数
第二个问题:
(1)
它在我的计算机上的 GPU(GeForce GTX TITAN X)上运行 11 秒,在 CPU(Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz)上运行 14 秒。
用于 GPU,11 秒
对于 CPU,14 秒
带有 nn.SpatialConvolutionMM 的 GPU,8s
如果使用 nn.SpatialConvolutionMM,它会运行得更快。
最后一件事
权重越少并不意味着计算量越少。说到计算,就是加法和乘法的次数。
卷积层耗时较长的原因于2018-01-11补充
即使计算复杂度低于线性回归,卷积层也需要更多时间的原因。我找到了关于卷积层如何使用here 的解释。卷积层会大量复制输入数据,因此可以通过矩阵乘法来完成前向运算,但是,我还没有进行任何实验。可以尝试用数据重复实现卷积运算来验证原因吗?
【讨论】:
对不起,可能是我没有把问题描述清楚。很明显,CNN 需要较少的计算。对于一个线性层,每个前向过程需要 784*300 的乘法和 784*300 的加法。对于一个卷积层,每个特征图是27*27[(28-2)/1+1 = 27],内核大小是2*2,所以只需要27*27*4乘法和27*27*4加法对于每个特征图,考虑到有3个特征图,答案是27*27*4*3的加法和乘法。还是远小于784*300 特征图是 27*27 因为 (28-2)/1+1 = 27,2 是内核宽度,前 1 是步长 能否请您再次在 CPU 上运行相同的代码? 确保 CPU 处于空闲状态,我在 CPU 上运行相同的代码只需要 3.xs,我的 CPU 是 Intel(R) Core(TM) i7-5930K CPU @ 3.50GHz,12 个内核. CPU虽然不如GPU强大,但14s还是太长了,784也不算大,我觉得应该不会花那么多时间 第一个问题,我同意你的看法。对于第二个问题,CPU 与 GPU 在小任务上无关紧要。无论如何,在卷积网络上,GPU 比 CPU 快得多。以上是关于Torch:为啥在相同数据大小下卷积层甚至比全连接线性层慢的主要内容,如果未能解决你的问题,请参考以下文章