0

Je suis en train d'implémenter des réseaux convolutifs dans MATLAB, et j'ai ajouté un support pour les GPU (j'utilise gpuArrays). J'ai implémenté la partie feed forward. Quand je l'exécute avec le tableau standard (j'ai déjà les tableaux dans mon espace de travail), cela prend 0,15 sec. Cependant, lorsque je lance la même chose avec EXACT, mais que les tableaux sont gpuArrays, qui se trouvent tous dans mon espace de travail avant d'exécuter le script de feed forward, cela prend ~ 1,39 sec. Quelqu'un peut-il expliquer ce qui se passe ici? MerciLes tableaux standard semblent plus rapides que ceux de gpuArray sur conv net feed

MISE À JOUR: Je TESTE temps d'exécution et tout porte à croire que le principal goulot d'étranglement est ma partie de convolution, donc je vais coller cette partie du Code ici:

  pad = (size(layers_W{layerNum}, 1)-1)/2; 

      for imageNum = 1:options.minibatchSize 
       for filterNum = 1:size(layers_W{layerNum}, 4) 
        for filterD = 1:size(layers_W{layerNum}, 3) 
         c = conv2(convInput(:, :, filterD, imageNum), ... 
          rot90(layers_W{layerNum}(:, :, filterD, filterNum), 2), 'valid'); 
         layers_activations{layerNum}(pad+1:end-pad, pad+1:end-pad, filterNum, imageNum) = ... 
          layers_activations{layerNum}(pad+1:end-pad, pad+1:end-pad, filterNum, imageNum) + ... 
          c; 
        end 

        layers_activations{layerNum}(pad+1:end-pad, pad+1:end-pad, filterNum, imageNum) = ... 
          layers_activations{layerNum}(pad+1:end-pad, pad+1:end-pad, filterNum, imageNum) + ... 
          layers_b{layerNum}(filterNum); 
       end 
      end 

      if strcmp(options.activation, 'relu') == 1 
       layers_activations{layerNum} = max(0, layers_activations{layerNum}); 
      elseif strcmp(options.activation, 'sigmoid') == 1 
       layers_activations{layerNum} = 1 ./ (1 + exp(-layers_activations{layerNum})); 
      end 

Cette pièce exacte du code est ~ 52 fois plus lent sur GPU que sur CPU. Des idées?

MAJ2: testé séparément la ligne qui fait convolution 2d (~ 10 fois plus lent sur GPU) et la ligne en dessous qui ajoute deux matrices (~ 100 fois plus lent sur GPU). Je suis complètement confus pourquoi cela se produit.

+1

Le transfert des données vers le GPU prend un certain temps. Si vous n'avez pas assez de calculs à faire sur le GPU (il semble que vous ne le faites pas), le processeur sera plus rapide. –

+0

Mais tout ne devrait pas être dans la mémoire du GPU? Depuis l'autre script fait ces vecteurs et tout et ils sont assis dans l'espace de travail avant que je cours en avant. Je suis absolument sûr que mon GPU a assez de mémoire pour contenir tout cela dans sa mémoire (6 Go, et seulement tester sur un petit réseau). –

+0

Tout n'est pas plus rapide dans un GPU. Profil votre code pour voir quelle est la partie la plus lente. Aussi, sauf si vous montrez le code entier, il est difficile pour nous de vous aider –

Répondre

2

Ce n'est pas du tout une surprise. Le GPU est efficace pour faire des convolutions sur de grandes images (HD, 4K) mais pas particulièrement sur des images 227x227 ou plus petites, comme c'est le cas dans les CNN. Vous devez au moins exécuter une convolution 3D afin de pouvoir appliquer tous les filtres sur chaque activation d'entrée en un seul appel, plutôt que de boucler tous les filtres et toutes les images. Essayez de remplacer la boucle interne par un appel à convn. Les implémentations Smart GPU de convolution dans ce contexte, telles que celles utilisées par Neural Network Toolbox dans MATLAB, utilisent les noyaux personnalisés et le multithreading pour tirer parti du parallélisme spatial et du parallélisme dans les dimensions de lots des filtres et des entrées. Votre implémentation jette tout le parallélisme par lots.

+0

Merci pour votre réponse. Connaissez-vous des sources d'information sur ces implémentations ou sur la façon dont je peux utiliser ces convolutions intelligentes intégrées et d'autres opérations? –

+0

https://www.mathworks.com/help/nnet/deep-learning.html –