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:为啥在相同数据大小下卷积层甚至比全连接线性层慢的主要内容,如果未能解决你的问题,请参考以下文章

torch教程[1]用numpy实现三层全连接神经网络

如何进行全连接层代码编写

如何进行全连接层代码编写

基础GCN图卷积层的pytorch的三种实现。

pytorch全连接层计算时间短

torch.nn.Linear()函数讲解