Caffe的卷积如何真正起作用?

时间:2016-07-08 03:24:55

标签: performance gpu convolution pycaffe

所以我正在玩pycaffe的卷积功能作为基本卷积层的一部分实现。这是我的convolution.prototxt文件:

name: "convolution"
input: "data"
input_dim: 1
input_dim: 1
input_dim: 227
input_dim: 227

layer {
  name: "conv"
  type: "Convolution"
  bottom: "data"
  top: "conv"
  convolution_param {
    num_output: 96
    kernel_size: 11
    stride: 1
  }
}

这些参数与AlexNet的第一个CONV层相同(步幅除外,实际上是4)。

我有一台配备NVIDIA GeForce GT 650M 1024 MB GPU的Macbook Pro。我不确定这意味着什么,但我的笔记本电脑也有Intel HD 4000作为内置GPU。

我在笔记本电脑上做了一些测试,同时改变了步幅超参数,首先是GPU模式,然后是CPU。

1)在调用caffe.set_device(0); caffe.set_mode_gpu()

后改变步伐
Stride 1: 27.26 ms
Stride 2: 14.27 ms
Stride 3: 10.57 ms
Stride 4: 7.45 ms

2)在调用caffe.set_mode_cpu()后改变步伐:

Stride 1: 49.77 ms # expected
Stride 2: 9.92 ms # this and the results after this don't make sense
Stride 3: 4.50 ms
Stride 4: 1.96 ms

(平均3分)

我只是想了解Caffe的卷积是如何基于这些测试而运作的。任何人都可以帮我解释一下吗?为什么CPU模式比GPU模式执行得更快?

如果您对自己有兴趣,我会使用测试代码:

import numpy as np
import caffe
import time

caffe.set_device(0)
caffe.set_mode_gpu() # caffe.set_mode_cpu()

net = caffe.Net('convolution.prototxt', caffe.TEST)
total = 0.0
for _ in range(3):
    net.blobs['data'].data[...] = np.random.randn(1, 1, 227, 227) # there really is an ellipsis there
    net.params['conv'][0].data[...] = np.random.randn(96, 1, 11, 11)
    s = time.time()
    r = net.forward()
    e = time.time()
    total += (e - s)

print total / 3 * 1000

1 个答案:

答案 0 :(得分:1)

因此,在挖掘之后,我发现Caffe基本上使用额外的内存来平坦局部区域,然后使用level3 BLAS例程(特别是cblas_sgemm)来执行矩阵乘法以获得结果。这导致以额外内存为代价进行快速计算。

可以找到引用herehere

通常,使用GPU的内存操作比CPU更昂贵。所有额外的内存使用量可能是在GPU模式下运行时遇到的减速的可能解释。这也取决于GPU的规格本身。