2017-05-07 1 views
5

J'essaie de comprendre pourquoi chaque itération de train prend environ 1,5 s. J'ai utilisé la méthode de traçage décrite here. Je travaille sur un GPU TitanX Pascal. Mes résultats semblent très étranges, il semble que chaque opération soit relativement rapide et que le système reste inactif la plupart du temps entre les opérations. Comment puis-je comprendre à partir de ce qui limite le système? Regular Batch Size Il semble toutefois que lorsque je réduis drastiquement la taille du lot, les écarts se referment, comme on peut le voir ici.Tensorflow - Profilage en temps réel - Comprendre ce qui limite le système

Small Batch Size Malheureusement, le code est très compliqué et je ne peux pas poster une petite version de ce qui a le même problème

Est-il possible de comprendre le profileur ce qui prend l'espace dans les espaces entre opérations?

Merci!

EDIT:

Sur CPU ony Je ne vois pas ce comportement: CPU Only

Je dirigeais une

+0

BTW, il n'est pas nécessaire d'utiliser la timeline maintenant. Jetez un oeil à [ma réponse ici] (http://stackoverflow.com/a/43692312/1090562) pour voir comment vous pouvez déboguer votre modèle via tensorboard. –

+0

Merci, mais pour une raison quelconque, je ne vois pas les Stats Node dans mon TB ... – aarbelle

+1

Quelques réflexions: certaines choses pourraient ne pas être reflétées dans la timeline - le temps passé à transférer des données via dict dict, la latence grpc. Avez-vous des lacunes similaires si vous utilisez uniquement le processeur? Est-ce que des choses pourraient être en attente de certaines opérations de déqueue? Vous pouvez également insérer des noeuds tf.Print et regarder les horodatages qui y sont générés. –

Répondre

0

Voici quelques suppositions, mais il est difficile de dire sans autonome reproduction que je peux exécuter et déboguer.

  • Est-il possible que vous n'ayez plus de mémoire GPU? Un signal de ceci est si vous voyez des messages de journal du formulaire Allocator ... ran out of memory pendant l'entraînement. Si vous n'avez plus de mémoire GPU, l'allocateur se désactive et attend dans l'espoir de plus devient disponible. Cela pourrait expliquer les grandes lacunes inter-opérateurs qui disparaissent si vous réduisez la taille du lot.

  • Comme le suggère Yaroslav dans un commentaire ci-dessus, que se passe-t-il si vous exécutez le modèle uniquement sur le processeur? À quoi ressemble la chronologie?

  • Est-ce un travail de formation distribué ou un travail sur une seule machine? S'il s'agit d'un travail distribué, une version mono-machine présente-t-elle le même comportement?

  • Appelez-vous souvent session.run() ou eval(), ou une seule fois par étape d'entraînement? Chaque appel run() ou eval() va drainer le pipeline GPU, donc pour l'efficacité, vous devez généralement exprimer votre calcul comme un grand graphe avec un seul appel run(). (Je doute que ce soit votre problème, mais je le mentionne pour l'exhaustivité.)

+0

1. Je ne manque pas de mémoire. J'utilise sur ~ 10% de ma mémoire gpu. 2. Cela ne se produit pas uniquement sur la CPU. J'ai ajouté la chronologie à la question originale 3. Ceci est un travail sur une seule machine. 4. J'appelle sess.run() une fois pour chaque étape d'entraînement. Merci! – aarbelle