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
3 Réponses :
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'):
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)
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.