Ошибка при использовании Tensorflow с графическим процессором

Я пробовал кучу разных примеров Tensorflow, которые отлично работают на процессоре, но генерируют ту же ошибку, когда я пытаюсь запустить их на графическом процессоре. Один маленький пример:

import tensorflow as tf

# Creates a graph.
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
# Creates a session with log_device_placement set to True.
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
# Runs the op.
print sess.run(c)

Ошибка всегда одна и та же: CUDA_ERROR_OUT_OF_MEMORY:

I tensorflow/stream_executor/dso_loader.cc:101] successfully opened CUDA library libcublas.so.7.0 locally
I tensorflow/stream_executor/dso_loader.cc:101] successfully opened CUDA library libcudnn.so.6.5 locally
I tensorflow/stream_executor/dso_loader.cc:101] successfully opened CUDA library libcufft.so.7.0 locally
I tensorflow/stream_executor/dso_loader.cc:101] successfully opened CUDA library libcuda.so locally
I tensorflow/stream_executor/dso_loader.cc:101] successfully opened CUDA library libcurand.so.7.0 locally
I tensorflow/core/common_runtime/local_device.cc:40] Local device intra op parallelism threads: 24
I tensorflow/core/common_runtime/gpu/gpu_init.cc:103] Found device 0 with properties: 
name: Tesla K80
major: 3 minor: 7 memoryClockRate (GHz) 0.8235
pciBusID 0000:0a:00.0
Total memory: 11.25GiB
Free memory: 105.73MiB
I tensorflow/core/common_runtime/gpu/gpu_init.cc:103] Found device 1 with properties: 
name: Tesla K80
major: 3 minor: 7 memoryClockRate (GHz) 0.8235
pciBusID 0000:0b:00.0
Total memory: 11.25GiB
Free memory: 133.48MiB
I tensorflow/core/common_runtime/gpu/gpu_init.cc:127] DMA: 0 1 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:137] 0:   Y Y 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:137] 1:   Y Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:702] Creating TensorFlow device (/gpu:0) -> (device: 0, name: Tesla K80, pci bus id: 0000:0a:00.0)
I tensorflow/core/common_runtime/gpu/gpu_device.cc:702] Creating TensorFlow device (/gpu:1) -> (device: 1, name: Tesla K80, pci bus id: 0000:0b:00.0)
I tensorflow/core/common_runtime/gpu/gpu_bfc_allocator.cc:42] Allocating 105.48MiB bytes.
E tensorflow/stream_executor/cuda/cuda_driver.cc:932] failed to allocate 105.48M (110608384 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY
F tensorflow/core/common_runtime/gpu/gpu_bfc_allocator.cc:47] Check failed: gpu_mem != nullptr  Could not allocate GPU device memory for device 0. Tried to allocate 105.48MiB
Aborted (core dumped)

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

Edit:

Я выяснил, что проблема может быть такой же простой, как и кто-то другой, выполняющий задание на одном и том же графическом процессоре, что объясняет малое количество свободной памяти. В этом случае: извините за то, что вы занимаете свое время...

Ответ 1

Здесь могут быть две проблемы:

  • По умолчанию TensorFlow выделяет большую долю (95%) доступной памяти GPU (на каждом устройстве GPU) при создании tf.Session. Он использует эвристический, который резервирует 200 МБ памяти GPU для использования "системой", но не откладывает это в сторону, если количество свободной памяти меньше, чем.

  • Похоже, у вас очень мало бесплатной памяти GPU на любом из ваших GPU-устройств (105.73MiB и 133.48MiB). Это означает, что TensorFlow попытается выделить память, которая, вероятно, должна быть зарезервирована для системы, и, следовательно, распределение не выполняется.

Возможно ли, что при попытке запустить эту программу у вас есть другой процесс TensorFlow (или какой-нибудь другой графический процессор)? Например, интерпретатор Python с открытым сеансом &mdash, даже если он не использует графический процессор, попытается выделить почти всю память GPU.

В настоящее время единственный способ ограничить объем памяти GPU, который использует TensorFlow, - это следующий вариант конфигурации (от этого вопроса):

# Assume that you have 12GB of GPU memory and want to allocate ~4GB:
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)

sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))