2016-05-19 41 views
13

Il tutorial MNIST For ML Beginners mi dà un errore quando corro print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})). Tutto il resto funziona bene.TensorFlow: il tensore Dst non è inizializzato

di errore e di traccia:

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"]()]] 

Ho appena passato a una versione più recente di CUDA, quindi forse questo ha qualcosa a che fare con questo? Sembra che questo errore riguardi la copia di un tensore sulla GPU.

Stack: EC2 macchina g2.8xlarge, Ubuntu 14.04

UPDATE:

print(sess.run(accuracy, feed_dict={x: batch_xs, y_: batch_ys})) viene eseguita correttamente. Questo mi porta a sospettare che il problema è che sto cercando di trasferire un enorme tensore alla GPU e non ce la faccio. Piccoli tensori come un minibatch funzionano bene.

UPDATE 2:

ho capito esattamente quanto grande sia il tensori devono essere a causare questo problema:

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]})) 
+0

Ho anche lo stesso problema, anche se con un modello diverso. Tuttavia, succede solo quando provo a selezionare il gpus me stesso usando td.device(). Stai usando più GPU? – Cesar

risposta

2

Tenete a mente il g2.8xlarge EC2 ha solo 4 GB di gpu memoria.
https://aws.amazon.com/ec2/instance-types/

non ho un buon modo per scoprire quanto spazio il modello prende altro che correre con una dimensione del lotto di 1 allora si può sottrarre la quantità di spazio un'immagine occupa.

Da lì è possibile determinare la dimensione massima del lotto. Questo dovrebbe funzionare, ma penso che tensorflow alloca la memoria gpu in modo dinamico simile alla torcia e diversamente dal caffe che bloccherà lo spazio massimo di gpu che richiede fin dall'inizio. Quindi probabilmente vorrai essere prudente con la dimensione massima del batch.

5

Per brevità, questo messaggio di errore viene generato quando non c'è abbastanza memoria per gestire la dimensione del batch.

Ampliando collegamento Steven s'(non posso postare ancora commenti), qui ci sono alcuni trucchi per monitorare/utilizzo della memoria di controllo in tensorflow:

  • per monitorare l'utilizzo della memoria durante la corsa, prendere in considerazione la registrazione di metadati corsa. È quindi possibile visualizzare l'utilizzo della memoria per nodo nel grafico in Tensorboard. Vedere lo Tensorboard information page per ulteriori informazioni e un esempio di questo.
  • Per impostazione predefinita, Tensorflow proverà ad allocare più memoria GPU possibile. Puoi cambiarlo usando le opzioni di GPUConfig, in modo che Tensorflow assegni solo la quantità di memoria necessaria. Vedere lo documentation su questo. Lì troverai anche un'opzione che ti permetterà di allocare solo una certa frazione della tua memoria della GPU (a volte ho trovato che a volte si rompeva).
+0

si prega di notare che ['grazie'] (https://meta.stackoverflow.com/questions/288160/no-thanks-damn-it) e ['saluti'] (https://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts) sono considerati di cattivo gusto per questo tipo di sito di domande frequenti. Volevo passare le informazioni, come ho imparato di recente! – Zroach

Problemi correlati