es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El asignador de memoria se quedó sin memoria – ¿cómo se puede liberar la memoria de la GPU de un conjunto de datos de TensorFlow?

Suponiendo una matriz de Numpy X_train de forma (4559552, 13, 22), el siguiente código funciona bien una vez. Cuando lo vuelvo a ejecutar (después de realizar pequeñas modificaciones en X_train), entonces se produce un InternalError debido a que la GPU se queda sin memoria:

2021-12-19 15:36:58.460497: W tensorflow/core/common_runtime/bfc_allocator.cc:457]
Allocator (GPU_0_bfc) se quedó sin memoria al intentar asignar 9.71GiB solicitados por la operación _EagerConst

Parece que la primera vez encuentra memoria GPU 100% libre, por lo que todo funciona bien, pero las siguientes veces la memoria GPU ya está casi llena y, por lo tanto, se produce el error.

Según entiendo, parece que simplemente limpiar la memoria GPU del antiguo train_dataset sería suficiente para solucionar el problema, pero no pude encontrar ninguna forma de lograrlo en TensorFlow. Actualmente, la única forma de asignar de nuevo el conjunto de datos es matar el kernel de Python y volver a ejecutar todo desde el principio.

¿Hay alguna forma de evitar reiniciar el kernel de Python desde cero y, en su lugar, liberar la memoria GPU para que se pueda cargar el nuevo conjunto de datos?

El conjunto de datos no necesita toda la memoria GPU, por lo que consideraría cambiar a una solución de TFRecord como una solución no ideal aquí (ya que conlleva complicaciones adicionales).

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de liberar la memoria de la GPU en TensorFlow sin reiniciar el kernel de Python. Puedes utilizar el siguiente fragmento de código antes de ejecutar nuevamente el código train_dataset:

    import tensorflow as tf
    
    tf.keras.backend.clear_session()
    

    Esto limpiará la sesión actual de TensorFlow, lo cual incluye todos los tensores y variables almacenados en caché. De esta manera, debería liberar la memoria de la GPU ocupada por el conjunto de datos anterior y permitirte cargar el nuevo conjunto de datos.

    Alternativamente, también puedes utilizar el método tf.data.Dataset.cache() para almacenar en caché el conjunto de datos en memoria o en disco, para su reutilización rápida, evitando la necesidad de cargar los datos cada vez. Esto puede ser especialmente útil si tienes un conjunto de datos relativamente pequeño que cabe en memoria. Sin embargo, si tu conjunto de datos es grande, puede que no sea práctico almacenarlo en memoria, y almacenarlo en disco puede ser más lento que simplemente volver a cargar los datos desde cero.

    ¡Espero que esto te sea de ayuda!

Comments are closed.