2

Я изучаю Теано. Я написал простую функцию отсева, как показано ниже:Почему моя функция отсева в Theano значительно замедляет свертку?

import theano.tensor as T 
srng = T.shared_randomstreams.RandomStreams() 

def drop(input, dropout=0.0): 
    if T.gt(dropout, 0.): 
     retain_prob = 1 - dropout.astype('floatX') 
     mask = srng.binomial(n=1, p=retain_prob, size=input.shape, dtype='floatX') 
     return input * mask/retain_prob 
    else: 
     return input 

Когда я применяю эту функцию для ввода первых двух сверточных слоев, среднее время, проведенное на каждом изображении увеличивается от 0,5 мс до 2,5 мс! Кто-нибудь знает, что может быть причиной такого резкого замедления?

Я использую карту GTX 980 с установленным cuDNN.

ответ

8

RandomStream работает только с процессором. Поэтому mask должен быть скопирован с CPU на GPU каждый раз, когда вызывается падение, что является причиной резкого замедления. Чтобы этого избежать, теперь я использую random stream implementation which works on GPU.

+0

Однако даже версия MRG приведет к резкому замедлению – Jedi

+0

Просто протестировал ее, и версия MRG вообще не вызывала замедление при применении к полностью подключенным слоям (Maxwell Titan X, CUDA 7.5, Theano 0.9.0dev4). Для сравнения, версия T.shared_randomstreams.RandomStreams() вызывала фактор замедления 10! – MichaelSB

0

Похож на аналогичную проблему, как у меня (Lasagne dropoutlayer does not utilize GPU efficiently). Вы проверили, что вы набираете код cuda_enabled = True где-нибудь? в противном случае вы можете вручную установить его в строке 93 https://github.com/Theano/Theano/blob/master/theano/sandbox/cuda/init.py. Я знаю, что это не изящное решение, но на данный момент оно решило мою проблему. :)

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

  • Нет связанных вопросов^_^