Подтвердить что ты не робот

TensorFlow: тензор Dst не инициализирован

Учебник MNIST For ML Beginners дает мне ошибку при запуске print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})). Все остальное работает нормально.

Ошибка и трассировка:

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

Я просто переключился на более новую версию CUDA, так что, возможно, это имеет какое-то отношение к этому? Похоже, эта ошибка заключается в копировании тензора на графический процессор.

Стек: EC2 g2.8xбольшая машина, Ubuntu 14.04

UPDATE:

print(sess.run(accuracy, feed_dict={x: batch_xs, y_: batch_ys})) работает нормально. Это заставляет меня подозревать, что проблема в том, что я пытаюсь передать огромный тензор на графический процессор, и он не может его принять. Небольшие тензоры, такие как мини-барабан, отлично работают.

ОБНОВЛЕНИЕ 2:

Я выяснил, насколько велики тензоры, чтобы вызвать эту проблему:

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]}))
4b9b3361

Ответ 1

Для краткости это сообщение об ошибке генерируется, когда памяти недостаточно для обработки размера партии.

Расширение на Steven (пока я не могу оставлять комментарии), вот несколько трюков для мониторинга/управления использованием памяти в Tensorflow:

  • Чтобы отслеживать использование памяти во время прогонов, рассмотрите метаданные запуска ведения журнала. Затем вы можете увидеть использование памяти на node на вашем графике в Tensorboard. Дополнительную информацию см. на странице Страница информации о тензонах.
  • По умолчанию Tensorflow попытается выделить как можно больше памяти GPU. Вы можете изменить это с помощью параметров GPUConfig, чтобы Tensorflow выделял столько памяти, сколько необходимо. См. документация об этом. Там вы также найдете вариант, который позволит вам выделять определенную часть вашей памяти GPU (я иногда обнаружил, что это может быть сломан.).

Ответ 2

Имейте в виду, что ec2 g2.8xlarge имеет только 4 ГБ памяти gpu.
https://aws.amazon.com/ec2/instance-types/

У меня нет хорошего способа узнать, сколько пространства занимает модель, кроме запуска с размером партии 1, тогда вы можете вычесть, сколько пространства занимает одно изображение.

Оттуда вы можете определить максимальный размер партии. Это должно работать, но я думаю, что tensorflow выделяет память gpu, динамически подобную факелу, и в отличие от caffe, которая блокирует пространство max gpu, которое оно требует от get go. Поэтому вы, вероятно, захотите быть консервативными с максимальным размером партии.