0
votes

Utilisation de tensorflow lorsqu'une session est déjà en cours d'exécution sur le GPU

J'entraîne un réseau de neurones avec tensorflow 2 (gpu) sur ma machine locale, j'aimerais faire du code tensorflow en parallèle (il suffit de charger un modèle et d'enregistrer son graphique).

Lors du chargement du modèle, j'obtiens une erreur cuda. Comment puis-je utiliser tensorflow 2 sur le processeur pour charger et enregistrer un modèle, lorsqu'une autre instance de tensorflow s'entraîne sur le GPU?

    132         self._config = config
    133         self._hyperparams['feature_extractor'] = self._get_feature_extractor(hyperparams['feature_extractor'])
--> 134         self._input_shape_tensor = tf.constant([input_shape[0], input_shape[1]])
    135         self._build(**self._hyperparams)
    136         # save parameter dict for serialization

~/.anaconda3/envs/posenet2/lib/python3.7/site-packages/tensorflow_core/python/framework/constant_op.py in constant(value, dtype, shape, name)
    225   """
    226   return _constant_impl(value, dtype, shape, name, verify_shape=False,
--> 227                         allow_broadcast=True)
    228 
    229 

~/.anaconda3/envs/posenet2/lib/python3.7/site-packages/tensorflow_core/python/framework/constant_op.py in _constant_impl(value, dtype, shape, name, verify_shape, allow_broadcast)
    233   ctx = context.context()
    234   if ctx.executing_eagerly():
--> 235     t = convert_to_eager_tensor(value, ctx, dtype)
    236     if shape is None:
    237       return t

~/.anaconda3/envs/posenet2/lib/python3.7/site-packages/tensorflow_core/python/framework/constant_op.py in convert_to_eager_tensor(value, ctx, dtype)
     93     except AttributeError:
     94       dtype = dtypes.as_dtype(dtype).as_datatype_enum
---> 95   ctx.ensure_initialized()
     96   return ops.EagerTensor(value, ctx.device_name, dtype)
     97 

~/.anaconda3/envs/posenet2/lib/python3.7/site-packages/tensorflow_core/python/eager/context.py in ensure_initialized(self)
    490         if self._default_is_async == ASYNC:
    491           pywrap_tensorflow.TFE_ContextOptionsSetAsync(opts, True)
--> 492         self._context_handle = pywrap_tensorflow.TFE_NewContext(opts)
    493       finally:
    494         pywrap_tensorflow.TFE_DeleteContextOptions(opts)

InternalError: CUDA runtime implicit initialization on GPU:0 failed. Status: out of memory


0 commentaires

3 Réponses :


0
votes

Vous chargez le modèle sur le GPU et comme il est déjà utilisé pour l'entraînement, il out of memory . Vous devez placer le chargement sur le CPU. Essayez de charger le modèle à l'intérieur

with tf.device('/CPU:0'):


0 commentaires

0
votes

Par défaut, TensorFlow 2 alloue 90% de votre GPU: 0 mémoire au démarrage. Si vous définissez

gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
  # Restrict TensorFlow to only allocate 2 GB of memory on the first GPU
  try:
    tf.config.experimental.set_virtual_device_configuration(
        gpus[0],
        [tf.config.experimental.VirtualDeviceConfiguration(memory_limit=2048)]) # limit in megabytes
    logical_gpus = tf.config.experimental.list_logical_devices('GPU')
    print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
  except RuntimeError as e:
    # Virtual devices must be set before GPUs have been initialized
    print(e)

vous pourrez utiliser votre GPU pour vos deux tâches (bien sûr, si votre GPU a assez de mémoire pour cela).
Si vous souhaitez plus de contrôle sur l'utilisation de la mémoire GPU, vous pouvez créer un GPU virtuel avec une taille de mémoire vidéo codée en dur:

import tensorflow as tf
tf.config.experimental.set_memory_growth(tf.config.experimental.list_physical_devices('GPU')[0], True)


0 commentaires

1
votes

Il m'a fallu un certain temps pour trouver cette réponse:

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
import tensorflow as tf

Commencer votre code avec ces lignes vous permet d'exécuter votre code tf sur le CPU (éviter d'utiliser CUDA est la solution, évidemment) tout en exécutant en même temps un entraînement lourd chargé en GPU.


0 commentaires