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]}))
Ответы
Ответ 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. Поэтому вы, вероятно, захотите быть консервативными с максимальным размером партии.