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.
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. –
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). –
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 –