compute python tensorflow nvidia-titan

python - compute - ¿Cómo evitar que tensorflow asigne la totalidad de una memoria de GPU?



tensorflow hardware (10)

Trabajo en un entorno en el que se comparten recursos computacionales, es decir, tenemos algunas máquinas de servidor equipadas con algunas GPU Nvidia Titan X cada una.

Para modelos de tamaño pequeño a moderado, los 12 GB del Titan X suelen ser suficientes para que 2-3 personas realicen un entrenamiento al mismo tiempo en la misma GPU. Si los modelos son lo suficientemente pequeños como para que un solo modelo no aproveche al máximo todas las unidades computacionales del Titan X, esto puede resultar en una aceleración en comparación con la ejecución de un proceso de entrenamiento después del otro. Incluso en los casos en que el acceso simultáneo a la GPU ralentiza el tiempo de entrenamiento individual, sigue siendo agradable tener la flexibilidad de tener varios usuarios ejecutando cosas en las GPU a la vez.

El problema con TensorFlow es que, de forma predeterminada, asigna la cantidad total de memoria disponible en la GPU cuando se inicia. Incluso para una pequeña red neuronal de 2 capas, veo que los 12 GB del Titan X están agotados.

¿Hay alguna manera de hacer que TensorFlow solo asigne, digamos, 4 GB de memoria de GPU, si se sabe que esa cantidad es suficiente para un modelo dado?




Aquí hay un extracto del Libro Deep Learning with TensorFlow

En algunos casos, es deseable que el proceso solo asigne un subconjunto de la memoria disponible o que solo aumente el uso de la memoria según lo necesite el proceso. TensorFlow proporciona dos opciones de configuración en la sesión para controlar esto. La primera es la opción allow_growth , que intenta asignar solo la cantidad de memoria GPU basada en asignaciones de tiempo de ejecución, comienza asignando muy poca memoria, y a medida que se ejecutan las sesiones y se necesita más memoria GPU, ampliamos la región de memoria GPU necesaria para el Proceso TensorFlow.

1) Permitir crecimiento: (más flexible)

config = tf.ConfigProto() config.gpu_options.allow_growth = True session = tf.Session(config=config, ...)

El segundo método es la opción per_process_gpu_memory_fraction , que determina la fracción de la cantidad total de memoria que debe asignarse a each GPU visible. Nota: No se necesita liberar memoria, incluso puede empeorar la fragmentación de la memoria cuando se hace.

2) Asignar memoria fija :

Para asignar solo el 40% de la memoria total de cada GPU:

config = tf.ConfigProto() config.gpu_options.per_process_gpu_memory_fraction = 0.4 session = tf.Session(config=config, ...)

Nota: eso solo es útil si realmente desea vincular la cantidad de memoria de GPU disponible en el proceso TensorFlow.


Bueno, soy nuevo en Tensorflow, tengo Geforce 740m o algo GPU con 2GB de RAM, estaba ejecutando mnist tipo de ejemplo escrito a mano para un idioma nativo con datos de entrenamiento que contienen 38700 imágenes y 4300 imágenes de prueba y estaba tratando de obtener precisión, recordar, F1 usando el siguiente código como sklearn no me estaba dando resultados precisos. Una vez que agregué esto a mi código existente, comencé a recibir errores de GPU.

TP = tf.count_nonzero(predicted * actual) TN = tf.count_nonzero((predicted - 1) * (actual - 1)) FP = tf.count_nonzero(predicted * (actual - 1)) FN = tf.count_nonzero((predicted - 1) * actual) prec = TP / (TP + FP) recall = TP / (TP + FN) f1 = 2 * prec * recall / (prec + recall)

Además, supongo que mi modelo era pesado, estaba recibiendo un error de memoria después de 147, 148 épocas, y luego pensé por qué no crear funciones para las tareas, así que no sé si funciona de esta manera en el flujo de tensión, pero pensé si una variable local es utilizado y cuando está fuera de alcance puede liberar memoria y definí los elementos anteriores para la capacitación y las pruebas en los módulos, pude lograr 10000 épocas sin ningún problema, espero que esto ayude.


Enchufe desvergonzado: si instala el Tensorflow compatible con GPU, la sesión primero asignará todas las GPU si lo configura para usar solo CPU o GPU. Puedo agregar mi consejo de que incluso si configura el gráfico para usar la CPU, solo debe establecer la misma configuración (como se respondió anteriormente :)) para evitar la ocupación no deseada de la GPU.

Y en una interfaz interactiva como IPython, también debe configurar esa configuración, de lo contrario, asignará toda la memoria y dejará casi ninguna para los demás. Esto a veces es difícil de notar.


Puede establecer la fracción de memoria de GPU que se asignará cuando construya una tf.Session pasando una tf.GPUOptions como parte del argumento de config opcional:

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

per_process_gpu_memory_fraction actúa como un límite superior duro en la cantidad de memoria de GPU que utilizará el proceso en cada GPU en la misma máquina. Actualmente, esta fracción se aplica de manera uniforme a todas las GPU en la misma máquina; no hay forma de configurar esto por GPU.


Puedes usar

TF_FORCE_GPU_ALLOW_GROWTH=true

en sus variables de entorno.

En el código de tensorflow :

bool GPUBFCAllocator::GetAllowGrowthValue(const GPUOptions& gpu_options) { const char* force_allow_growth_string = std::getenv("TF_FORCE_GPU_ALLOW_GROWTH"); if (force_allow_growth_string == nullptr) { return gpu_options.allow_growth(); }


Todas las respuestas anteriores suponen la ejecución con una llamada sess.run() , que se está convirtiendo en la excepción en lugar de la regla en las versiones recientes de TensorFlow.

Cuando se usa el marco tf.Estimator (TensorFlow 1.4 y superior), la forma de pasar la fracción a la MonitoredTrainingSession creada implícitamente es,

opts = tf.GPUOptions(per_process_gpu_memory_fraction=0.333) conf = tf.ConfigProto(gpu_options=opts) trainingConfig = tf.estimator.RunConfig(session_config=conf, ...) tf.estimator.Estimator(model_fn=..., config=trainingConfig)

Del mismo modo, en modo Eager (TensorFlow 1.5 y superior),

opts = tf.GPUOptions(per_process_gpu_memory_fraction=0.333) conf = tf.ConfigProto(gpu_options=opts) tfe.enable_eager_execution(config=conf)

Editar: 11-04-2018 Como ejemplo, si va a usar tf.contrib.gan.train , puede usar algo similar a lo siguiente:

tf.contrib.gan.gan_train(........, config=conf)


Traté de entrenar unet en el conjunto de datos voc pero debido al gran tamaño de la imagen, la memoria termina. Probé todos los consejos anteriores, incluso probé con el tamaño del lote == 1, pero sin ninguna mejora. a veces la versión TensorFlow también causa problemas de memoria. intente usando

pip install tensorflow-gpu == 1.8.0