web-dev-qa-db-fra.com

Erreur lors de l'utilisation de Tensorflow avec GPU

J'ai essayé un tas d'exemples Tensorflow différents, qui fonctionnent bien sur le processeur mais génèrent la même erreur lorsque j'essaie de les exécuter sur le GPU. Voici un petit exemple:

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)

L'erreur est toujours la même, 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)

Je suppose que le problème est lié à ma configuration plutôt qu'à l'utilisation de la mémoire de ce petit exemple. Est-ce que quelqu'un a une idée?

Modifier:

J'ai découvert que le problème peut être aussi simple que quelqu'un d'autre exécutant un travail sur le même GPU, ce qui expliquerait le peu de mémoire disponible. Dans ce cas: désolé d'avoir pris votre temps ...

15
user5654767

Il semble y avoir deux problèmes ici:

  1. Par défaut, TensorFlow alloue une grande partie (95%) de la mémoire GPU disponible (sur chaque périphérique GPU) lorsque vous créez un tf.Session. Il utilise un heuristique qui réserve 200 Mo de mémoire GPU pour les utilisations "système", mais ne le met pas de côté si la quantité de mémoire libre est inférieure à celle .

  2. Il semble que vous ayez très peu de mémoire GPU libre sur l'un de vos périphériques GPU (105,73 Mo et 133,48 Mo). Cela signifie que TensorFlow tentera d'allouer de la mémoire qui devrait probablement être réservée au système, et donc l'allocation échoue.

Est-il possible que vous ayez un autre processus TensorFlow (ou un autre code gourmand en GPU) en cours d'exécution lorsque vous essayez d'exécuter ce programme? Par exemple, un interpréteur Python avec une session ouverte - même s'il n'utilise pas le GPU) tentera d'allouer la quasi-totalité de la mémoire du GPU.

Actuellement, la seule façon de restreindre la quantité de mémoire GPU utilisée par TensorFlow est l'option de configuration suivante (de cette question ):

# 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))
23
mrry

Cela peut se produire car votre session TensorFlow n'est pas en mesure d'obtenir suffisamment de mémoire dans le GPU. Vous disposez peut-être d'une faible quantité de mémoire libre pour d'autres processus comme TensorFlow ou une autre session TensorFlow est en cours d'exécution sur votre système. vous devez donc configurer la quantité de mémoire que la session TensorFlow utilisera

si vous utilisez TensorFlow 1.x

gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)

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

comme Tensorflow 2.x a subi des changements majeurs par rapport à 1.x.si vous souhaitez utiliser la méthode/fonction des versions TensorFlow 1.x, un module de compatibilité est conservé dans TensorFlow 2.x. Donc TensorFlow 2.x l'utilisateur peut utiliser ce morceau de code

gpu_options = tf.compat.v1.GPUOptions(per_process_gpu_memory_fraction=0.333)

sess = tf.compat.v1.Session(config=tf.compat.v1.ConfigProto(gpu_options=gpu_options))
0
ujjal das