【问题标题】: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 慢。

提前致谢

【问题讨论】:

    标签: machine-learning neural-network gpu convolution torch


    【解决方案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 快得多。
      猜你喜欢
      • 2020-03-26
      • 2018-07-13
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-28
      • 2018-12-22
      • 2018-07-30
      相关资源
      最近更新 更多