web-dev-qa-db-fra.com

TensorFlow: le tenseur Dst n'est pas initialisé

Le tutoriel MNIST For ML Beginners me donne une erreur lorsque j'exécute print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})). Tout le reste fonctionne bien. 

Erreur et trace:

InternalErrorTraceback (most recent call last)
<ipython-input-16-219711f7d235> in <module>()
----> 1 print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc in run(self, fetches, feed_dict, options, run_metadata)
    338     try:
    339       result = self._run(None, fetches, feed_dict, options_ptr,
--> 340                          run_metadata_ptr)
    341       if run_metadata:
    342         proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)

/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc in _run(self, handle, fetches, feed_dict, options, run_metadata)
    562     try:
    563       results = self._do_run(handle, target_list, unique_fetches,
--> 564                              feed_dict_string, options, run_metadata)
    565     finally:
    566       # The movers are no longer used. Delete them.

/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc in _do_run(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)
    635     if handle is None:
    636       return self._do_call(_run_fn, self._session, feed_dict, fetch_list,
--> 637                            target_list, options, run_metadata)
    638     else:
    639       return self._do_call(_prun_fn, self._session, handle, feed_dict,

/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc in _do_call(self, fn, *args)
    657       # pylint: disable=protected-access
    658       raise errors._make_specific_exception(node_def, op, error_message,
--> 659                                             e.code)
    660       # pylint: enable=protected-access
    661 

InternalError: Dst tensor is not initialized.
     [[Node: _recv_Placeholder_3_0/_1007 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/gpu:0", send_device="/job:localhost/replica:0/task:0/cpu:0", send_device_incarnation=1, tensor_name="Edge_312__recv_Placeholder_3_0", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/gpu:0"]()]]
     [[Node: Mean_1/_1011 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="Edge_319_Mean_1", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

Je viens de passer à une version plus récente de CUDA, alors peut-être que cela a quelque chose à voir avec ça? On dirait que cette erreur concerne la copie d'un tenseur sur le GPU.

Pile: EC2 g2.8xlarge machine, Ubuntu 14.04 

METTRE À JOUR:

print(sess.run(accuracy, feed_dict={x: batch_xs, y_: batch_ys})) fonctionne correctement. Cela me laisse penser que le problème est que j'essaie de transférer un tenseur énorme sur le GPU et que cela ne peut pas le supporter. Les petits tenseurs, comme les mini-lots, fonctionnent parfaitement.

MISE À JOUR 2:

J'ai compris exactement la taille que doivent avoir les tenseurs pour causer ce problème:

batch_size = 7509 #Works.
print(sess.run(accuracy, feed_dict={x: mnist.test.images[0:batch_size], y_: mnist.test.labels[0:batch_size]}))

batch_size = 7510 #Doesn't work. Gets the Dst error.
print(sess.run(accuracy, feed_dict={x: mnist.test.images[0:batch_size], y_: mnist.test.labels[0:batch_size]}))
24
rafaelcosman

Par souci de brièveté, ce message d'erreur est généré lorsqu'il n'y a pas assez de mémoire pour gérer la taille du lot.

En développant le lien de Steven (je ne peux pas encore publier de commentaires), voici quelques astuces pour surveiller/contrôler l'utilisation de la mémoire dans Tensorflow:

  • Pour surveiller l'utilisation de la mémoire lors des exécutions, envisagez de consigner les métadonnées d'exécution. Vous pouvez ensuite voir l'utilisation de la mémoire par nœud dans votre graphique dans Tensorboard. Voir la page Tensorboard information pour plus d’informations et un exemple.
  • Par défaut, Tensorflow tentera d'allouer le plus de mémoire GPU possible. Vous pouvez changer cela en utilisant les options de GPUConfig, de sorte que Tensorflow n'alloue que la quantité de mémoire nécessaire. Voir la documentation à ce sujet. Vous y trouverez également une option qui vous permettra d’allouer uniquement une certaine fraction de la mémoire de votre GPU (j’ai trouvé que cela était parfois endommagé.).
15
Lars Mennen

Gardez à l'esprit que l'ec2 g2.8xlarge ne dispose que de 4 Go de mémoire gpu.
https://aws.Amazon.com/ec2/instance-types/

Je ne dispose pas d'un moyen efficace de connaître la quantité d'espace occupée par le modèle, si ce n'est de l'exécuter avec une taille de lot de 1, puis vous pouvez soustraire la quantité d'espace occupée par une image. 

De là, vous pouvez déterminer la taille maximale de votre lot. Cela devrait fonctionner, mais je pense que tensorflow alloue de la mémoire gpu de manière dynamique, semblable à la torche et contrairement à caffe, qui bloquera l’espace gpu maximum requis dès le départ. Donc, vous voudrez probablement être prudent avec la taille maximale du lot.

3
Steven

Je pense que ce lien peut aider https://github.com/aymericdamien/TensorFlow-Examples/issues/38#issuecomment-223793214 . Dans mon cas, c’était le GPU qui était occupé (occupé à 93%) à former un autre modèle dans une screen. J'avais besoin de mettre fin à ce processus et j'étais heureux plus tard de voir les choses fonctionner.

0
Julien Nyambal