2016-07-08 2 views
1

Итак, я играл с функцией свертки пикаффа, реализованной как часть базового слоя свертки. Вот мой convolution.prototxt файл:Как действительно работает свертка Caffe?

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 
    } 
} 

Эти параметры такие же, как и первого CONV слоя AlexNet (кроме походку, которая на самом деле 4).

У меня есть Macbook Pro с графическим процессором NVIDIA GeForce GT 650M 1024 МБ. Я не уверен, что это много значит, но у моего ноутбука также есть Intel HD 4000 как встроенный графический процессор.

Я провел несколько тестов на своем ноутбуке, изменяя гиперпараметр шага, сначала в режиме 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

Таким образом, после того, как копаться, я узнал, что Caffe в основном использует дополнительную память для расплющить локальные области, и затем использует процедуры уровня 3 BLAS (cblas_sgemm в частности) для выполнения умножения матрицы для получения результата. Это приводит к быстрому вычислению за счет дополнительной памяти.

Ссылки могут быть найдены here и here.

Операции с памятью с графическими процессорами, в общем, намного дороже, чем для процессоров. Все дополнительное использование памяти может быть возможным объяснением замедления, возникающего при работе в режиме GPU. Это также будет зависеть от характеристик самого GPU.

Смежные вопросы