Pourquoi la formation des RNN n'utilise-t-elle pas 100% du GPU?


8

Je me demande pourquoi la formation des RNN n'utilise généralement pas 100% du GPU.

Par exemple, si j'exécute ce test RNN sur un Maxwell Titan X sur Ubuntu 14.04.4 LTS x64, l'utilisation du GPU est inférieure à 90%:

entrez la description de l'image ici

Le benchmark a été lancé à l'aide de la commande:

python rnn.py -n 'fastlstm' -l 1024 -s 30 -b 128

Comment diagnostiquer le goulot d'étranglement?

Réponses:


5

J'obtiens à peu près le même taux d'utilisation lorsque j'entraîne des modèles à l'aide de Tensorflow. La raison est assez claire dans mon cas, je choisis manuellement un lot d'échantillons aléatoire et appelle l'optimisation pour chaque lot séparément.

Cela signifie que chaque lot de données est dans la mémoire principale, il est ensuite copié dans la mémoire GPU où se trouve le reste du modèle, puis la propagation avant / arrière et la mise à jour sont effectuées en GPU, puis l'exécution est rendue à mon code où je récupère un autre lot et appelez optimiser dessus.

Il existe un moyen plus rapide de le faire si vous passez quelques heures à configurer Tensorflow pour effectuer le chargement par lots en parallèle à partir d'enregistrements TF pré-préparés.

Je me rends compte que vous pouvez utiliser ou non tensorflow sous keras, mais comme mon expérience tend à produire des nombres d'utilisation très similaires, je sors sur une branche en suggérant qu'il existe un lien de causalité raisonnablement probable à tirer de ces corrélations. Si votre infrastructure charge chaque lot de la mémoire principale dans le GPU sans l'efficacité / complexité supplémentaire du chargement asynchrone (que le GPU lui-même peut gérer), alors ce serait un résultat attendu.



Je ne peux pas dire que j'ai jamais envisagé d'essayer de surveiller cela, mais vous êtes curieux maintenant.
davidparks21

J'obtiens toujours environ 90% avec des keras aussi. Je n'ai jamais vérifié son code source, mais je m'attendrais à ce qu'un framework comme celui-là fournisse des lots au GPU en parallèle (au moins en option si vous pouvez vous permettre la mémoire .. pourquoi ne le ferait-il pas?).
stmax

1
Keras est un wrapper autour de Tensorflow ou Theano. Je n'ai qu'une expérience dans Tensorflow, donc, de ce point de vue, le processus nécessaire pour activer le chargement de données asynchrones nécessite que vous prétraitez les données dans un format binaire spécifique à Tensorflow. Je suppose que Theano a une manière équivalente de procéder. La plupart des modèles commencent probablement par un chargement de mémoire par lot (faites-le fonctionner avant d'optimiser la vitesse). Et puisque la charte de Keras est "garder les choses simples", il n'est pas surprenant qu'elles adoptent l'approche la plus directe / simple pour seulement une perte d'efficacité de ~ 10%.
davidparks21
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.