web-dev-qa-db-fra.com

Comment calculer la taille optimale du lot

Parfois, je rencontre un problème: 

MOO lors de l'affectation d'un tenseur avec une forme

e.q.

MOO lors de l'affectation d'un tenseur avec une forme (1024, 100, 160)

Où 1024 est la taille de mon lot et je ne sais pas quel est le reste. Si je réduis la taille du lot ou le nombre de neurones dans le modèle, tout fonctionne correctement.

Existe-t-il un moyen générique de calculer la taille de lot optimale en fonction du modèle et de la mémoire du processeur graphique afin que le programme ne se bloque pas?

MODIFIER

Puisque ma question peut sembler peu claire, laissez-moi la formuler à sa manière: je veux la plus grande taille de lot possible en termes de modèle, ce qui tiendra dans ma mémoire GPU et ne bloquera pas le programme.

EDIT 2

À quiconque a voté en faveur de la fermeture de la question pour avoir été trop large: Comment diable la question est-elle trop large? Il existe un algorithme qui sélectionne une partie des données à mettre en mémoire GPU. C'est clairement imparfait puisque les données dépassent parfois la mémoire du GPU. Demander le fonctionnement de l'algorithme, afin de prévenir les plantages aléatoires, me semble tout à fait raisonnable.

6
Andrzej Gis

Vous pouvez estimer la plus grande taille de lot en utilisant:

Taille maximale du lot = octets de mémoire GPU disponibles/4/(taille des tenseurs + paramètres pouvant être entraînés)

5
ilan

Du livre Deep Learning récent de Goodfellow et al., Chapitre 8 :

La taille des mini-lots dépend généralement des facteurs suivants:

  • Les lots plus importants fournissent une estimation plus précise du gradient, mais avec des rendements moins que linéaires. 
  • Les architectures multicœurs sont généralement sous-utilisé par des lots extrêmement petits. Cela motive l'utilisation de taille de lot minimale absolue, en dessous de laquelle il n'y a pas de réduction du temps pour traiter un minibatch. 
  • Si tous les exemples du lot doivent être traité en parallèle (comme c'est généralement le cas), puis le montant de mémoire évolue avec la taille du lot. Pour de nombreuses configurations matérielles, il s'agit de le facteur limitant en taille de lot. 
  • Certains types de matériel permettent d'atteindre meilleur temps d'exécution avec des tailles de tableaux spécifiques. Surtout lors de l'utilisation Les GPU, il est courant que la puissance de 2 tailles de lot offre un meilleur temps d’exécution . La puissance typique de 2 tailles de lots va de 32 à 256, avec parfois 16 en cours de tentative pour les grands modèles.
  • Les petits lots peuvent offrir un effet régularisateur (Wilson et Martinez, 2003), peut-être en raison du le bruit qu’ils ajoutent au processus d’apprentissage. L’erreur de généralisation est souvent idéal pour un lot de 1. Formation à un si petit lot peut nécessiter un petit taux d’apprentissage pour maintenir la stabilité à cause de la variance élevée dans l'estimation du gradient. Le temps d'exécution total peut être très élevé en raison de la nécessité de faire plus de pas, à la fois en raison du taux d'apprentissage réduit et parce qu'il faut plus d'étapes observer l'ensemble de l'entraînement.

Ce qui dans la pratique signifie généralement "avec une puissance de 2 et le plus grand, mieux c'est, à condition que le lot tienne dans la mémoire (du GPU)".

Vous voudrez peut-être aussi consulter plusieurs bons messages ici dans Stack Exchange:

Il suffit de garder à l’esprit que l’article de Keskar et al. ' Formation sur les lots importants pour l'apprentissage en profondeur: écart de généralisation et Sharp Minima ', cité par plusieurs des articles précédents, a reçu quelques objections par d'autres chercheurs respectables de la communauté de l'apprentissage en profondeur .

J'espère que cela t'aides...

UPDATE (déc 2017): Il y a un nouveau document de Yoshua Bengio & team, Trois facteurs influençant les minima dans SGD (nov. 2017); cela vaut la peine d'être lu dans le sens où il rapporte de nouveaux résultats théoriques et expérimentaux sur l'interaction entre le taux d'apprentissage et la taille du lot.

10
desertnaut

J'ai rencontré une erreur de mémoire graphique similaire, qui a été résolue en configurant la session tensorflow avec les éléments suivants:

# See https://www.tensorflow.org/tutorials/using_gpu#allowing_gpu_memory_growth
config = tf.ConfigProto()
config.gpu_options.allow_growth = True

voir: google colaboratory `ResourceExhaustedError` avec GPU

1
michael