TensorFlow: l'heure d'été tenseur n'est pas initialisé
La MNIST For ML Beginners
tutoriel me donne une erreur quand je lance print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
. Tout le reste fonctionne très 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 passé à une version plus récente de CUDA, donc peut-être que cela a quelque chose à faire avec ça? Semble que cette erreur est à propos de la copie d'un tenseur pour le GPU.
Pile: EC2 g2.8xlarge machine, Ubuntu 14.04
Mise à JOUR:
print(sess.run(accuracy, feed_dict={x: batch_xs, y_: batch_ys}))
fonctionne très bien. Cela m'amène à penser que le problème est que je suis en train de transférer un énorme tenseur pour le GPU et il ne peut pas le prendre. Petite tenseurs comme un minibatch fonctionnent tout aussi bien.
Mise à JOUR 2:
J'ai compris exactement comment grand les tenseurs d'être à l'origine de 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]}))
- J'ai aussi eu le même problème mais avec un autre modèle. Cependant, il ne se passe lorsque j'essaie de sélectionner le gpu moi-même à l'aide de td.appareil(). Êtes-vous à l'aide de plusieurs Gpu?
Vous devez vous connecter pour publier un commentaire.
Pour des raisons de concision, ce message d'erreur est généré quand il n'y a pas assez de mémoire pour gérer la taille des lots.
Expansion sur Steven's lien (je ne peut pas poster de commentaires pour l'instant), voici quelques astuces pour surveiller et contrôler l'utilisation de la mémoire dans Tensorflow:
Garder à l'esprit l'ec2 g2.8xlarge a seulement 4 go de mémoire graphique.
https://aws.amazon.com/ec2/instance-types/
Je n'ai pas un bon moyen de savoir comment beaucoup d'espace, le modèle prend d'autres que de courir avec une taille de lot de 1 alors vous pouvez soustraire combien d'espace que l'on occupe.
À partir de là, vous pouvez déterminer la taille maximale des lots. Cela devrait fonctionner, mais je pense que tensorflow alloue de la mémoire gpu de manière dynamique semblable à la flamme et à la différence de caffe qui risque de bloquer le max gpu espace qu'il nécessite de l'aller. Donc, vous voulez probablement d'être prudent avec la taille maximale des lots.
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é (93% occupé) avec la formation d'un autre modèle dans un
screen
. J'avais besoin de tuer les processus, et il était heureux plus tard pour voir des trucs de travail.