52 votes

Quelle est la différence entre CuDNNLSTM et LSTM dans Keras ?

Sur Keras Dans la bibliothèque d'apprentissage profond de haut niveau, il existe plusieurs types de couches récurrentes, dont les suivantes LSTM (Mémoire à long terme et à court terme) et CuDNNLSTM . Selon le Documentation sur Keras , a CuDNNLSTM est un :

Implémentation rapide de LSTM soutenue par CuDNN. Ne peut être exécuté que sur GPU, avec le backend TensorFlow.

Je pense que Keras utilise automatiquement le GPU chaque fois que cela est possible. Selon le Instructions de construction de TensorFlow Pour avoir un backend GPU TensorFlow fonctionnel, vous aurez besoin de CuDNN :

Les logiciels NVIDIA suivants doivent être installés sur votre système :

  • Cuda Toolkit de NVIDIA (>= 7.0). Nous recommandons la version 9.0. Pour plus de détails, consultez la documentation de NVIDIA. Assurez-vous que vous ajoutez les chemins d'accès Cuda pertinents à la variable d'environnement LD_LIBRARY_PATH comme décrit dans la documentation de NVIDIA.
  • Les pilotes NVIDIA associés au Cuda Toolkit de NVIDIA.
  • cuDNN (>= v3). Nous recommandons la version 6.0. Pour plus de détails, consultez la documentation de NVIDIA, en particulier la description de l'ajout du nom de chemin approprié à votre variable d'environnement LD_LIBRARY_PATH.

Par conséquent, comment un CuDNNLSTM diffèrent en quoi que ce soit d'une LSTM en utilisant un backend GPU TensorFlow ? Est-ce que CuDNNLSTM sont automatiquement sélectionnées et remplacent les LSTM lorsqu'un backend TensorFlow GPU disponible est trouvé ?

32voto

cryanbhu Points 349

Pourquoi ne pas l'essayer vous-même pour voir ? Dans mon cas, la formation d'un modèle avec LSTM a pris 10mins 30secondes. Il suffit de passer l'appel de LSTM() à CuDNNLSTM() a pris moins d'une minute.

J'ai également remarqué que le passage à CuDNNLSTM() accélère model.evaluate() et model.predict() de manière substantielle également.

13voto

TL;DR ; La différence est une vitesse 15x plus rapide dans le temps de formation du modèle !

Étapes de configuration

Dépendances

Benchmark de performance : Comparaison des machines d'essai standard.
1 itération de formation sur 612235 échantillons.

keras.layers.LSTM Intel i5-4690 CPU only: 612235/612235 [==============================] - 3755s 6ms/step - loss: 2.7339 - acc: 0.5067 - val_loss: 2.1149 - val_acc: 0.6175

GTX:950 & Intel i5-4690: 612235/612235 [==============================] - 1417s 2ms/step - loss: 2.7007 - acc: 0.5137 - val_loss: 2.0983 - val_acc: 0.6199

Gain de 2,5 fois avec le GPU.

GTX:970 & Intel i5-4690: 612235/612235 [==============================] - 1322s 2ms/step - loss: 1.9214 - acc: 0.6442 - val_loss: 1.8808 - val_acc: 0.6461

Gain négligeable avec un GPU puissant.

RTX 2070 & Intel i7-9700K: 612235/612235 [==============================] - 1012s 2ms/step - loss: 2.7268 - acc: 0.5111 - val_loss: 2.1162 - val_acc: 0.6234

Gain très minime même avec des améliorations HW impressionnantes !!!

keras.layers.CuDNNLSTM RTX 2070 & Intel i7-9700K: 612235/612235 [==============================] - 69s 112us/step - loss: 1.9139 - acc: 0.6437 - val_loss: 1.8668 - val_acc: 0.6469

Un gain de 54x par rapport au CPU !
Gain de 15x par rapport à l'implémentation LSTM traditionnelle (sans Cuda) !

3voto

Les GPU sont bons pour le calcul parallèle massif, la plupart des opérations d'algèbre linéaire peuvent être parallélisées pour améliorer les performances, les opérations vectorielles comme la multiplication de matrice et la descente de gradient peuvent être appliquées à de grandes matrices qui sont exécutées en parallèle avec le support des GPU. CUDA - Compute Unified Device Architecture fournit une interface qui permet aux opérations vectorielles de tirer parti du parallélisme des GPU. CuDNN implémente des noyaux pour les grandes opérations matricielles sur GPU en utilisant CUDA.

Ici, CuDNNLSTM est conçu pour le traitement parallèle CUDA et ne peut pas fonctionner s'il n'y a pas de GPU. Mais LSTM est conçu pour les CPU normaux. Le temps d'exécution plus rapide est dû au parallélisme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X