Deshabilitar la información de depuración de Tensorflow

191

Al depurar información me refiero a lo que muestra TensorFlow en mi terminal sobre bibliotecas cargadas y dispositivos encontrados, etc., no errores de Python.

I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcurand.so locally
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:900] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_init.cc:102] Found device 0 with properties: 
name: Graphics Device
major: 5 minor: 2 memoryClockRate (GHz) 1.0885
pciBusID 0000:04:00.0
Total memory: 12.00GiB
Free memory: 11.83GiB
I tensorflow/core/common_runtime/gpu/gpu_init.cc:126] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:136] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:717] Creating TensorFlow device (/gpu:0) -> (device: 0, name: Graphics Device, pci bus id: 0000:04:00.0)
I tensorflow/core/common_runtime/gpu/gpu_bfc_allocator.cc:51] Creating bin of max chunk size 1.0KiB
...
Ghilas BELHADJ
fuente
55
problema de seguimiento: github.com/tensorflow/tensorflow/issues/1258
Yaroslav Bulatov
Tensorflow todavía es un código alfa temprano y todavía están resolviendo los errores para la compatibilidad básica con numpy y pandas. Así que para noquear a estas advertencias en un solo golpe, hacer import warningsa continuación warnings.filterwarnings('ignore'), a continuación, ejecutar sus importaciones y tensorflow y el código que se basa en el código alfa-tensorflow roto, entonces se convierten advertencias de vuelta en vía warnings.resetwarnings(). Tensorflow no debería anunciar un nombre de versión superior a 0.05 en este momento.
Eric Leschinski

Respuestas:

214

Puede deshabilitar todos los registros de depuración utilizando os.environ:

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' 
import tensorflow as tf

Probado en tf 0.12 y 1.0

En detalles,

0 = all messages are logged (default behavior)
1 = INFO messages are not printed
2 = INFO and WARNING messages are not printed
3 = INFO, WARNING, and ERROR messages are not printed
mwweb
fuente
Esto funciona, pero elimina la marca de tiempo frente a los registros: ¿cómo se puede volver a activar?
DreamFlasher
¿Qué significan estos niveles (0, 1, 2, 3)?
diralik
2
no funciona para 1.13 y python3, incluso antes de importar tensorflow
Li haonan
146

2.0 Actualización (08/10/19) Ajuste TF_CPP_MIN_LOG_LEVELdebería funcionar (véase más adelante en v0.12 + actualización), pero en la actualidad existe un tema abierto (ver la edición # 31870 ). Si la configuración TF_CPP_MIN_LOG_LEVELno funciona para usted (nuevamente, vea a continuación), intente hacer lo siguiente para establecer el nivel de registro:

import tensorflow as tf
tf.get_logger().setLevel('INFO')

Además, consulte la documentación tf.autograph.set_verbosityque establece la verbosidad de los mensajes de registro de autógrafos, por ejemplo:

# Can also be set using the AUTOGRAPH_VERBOSITY environment variable
tf.autograph.set_verbosity(1)

v0.12 + Actualización (20/05/17), Trabajando a través de TF 2.0+:

En TensorFlow 0.12+, según este problema , ahora puede controlar el registro a través de la variable de entorno llamada TF_CPP_MIN_LOG_LEVEL; el valor predeterminado es 0 (se muestran todos los registros) pero se puede establecer en uno de los siguientes valores debajo de la Levelcolumna.

  Level | Level for Humans | Level Description                  
 -------|------------------|------------------------------------ 
  0     | DEBUG            | [Default] Print all messages       
  1     | INFO             | Filter out INFO messages           
  2     | WARNING          | Filter out INFO & WARNING messages 
  3     | ERROR            | Filter out all messages      

Consulte el siguiente ejemplo de sistema operativo genérico con Python:

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'  # or any {'0', '1', '2'}
import tensorflow as tf

Para ser exhaustivo, también debe establecer el nivel para el tf_loggingmódulo Python , que se usa, por ejemplo, en operaciones de resumen, tablero de tensor, varios estimadores, etc.

# append to lines above
tf.logging.set_verbosity(tf.logging.ERROR)  # or any {DEBUG, INFO, WARN, ERROR, FATAL}

Para 1.14, recibirá advertencias si no cambia para usar la API v1 de la siguiente manera:

# append to lines above
tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)  # or any {DEBUG, INFO, WARN, ERROR, FATAL}


Para versiones anteriores de TensorFlow o TF-Learn Logging (v0.11.xo inferior):

Vea la página a continuación para obtener información sobre el registro de TensorFlow; con la nueva actualización, que es capaz de establecer el nivel de detalle de registro que sea DEBUG, INFO, WARN, ERROR, o FATAL. Por ejemplo:

tf.logging.set_verbosity(tf.logging.ERROR)

La página también incluye monitores que se pueden usar con los modelos TF-Learn. Aqui esta la pagina .

Esto no bloquea todo el registro (solo TF-Learn). Tengo dos soluciones; una es una solución 'técnicamente correcta' (Linux) y la otra implica la reconstrucción de TensorFlow.

script -c 'python [FILENAME].py' | grep -v 'I tensorflow/'

Para el otro, vea esta respuesta que implica modificar la fuente y reconstruir TensorFlow.

craymichael
fuente
los mensajes "I tensorflow" pueden ser molestos, tf debería proporcionar alguna forma de silenciarlos usando una API en lugar de reconstruir
físico
2
Esto también se puede hacer desde la línea de comandos:export TF_CPP_MIN_LOG_LEVEL="3" && python your_code.py
Andrew Hundt
También se puede ejecutar comoTF_CPP_MIN_LOG_LEVEL="3" python your_code.py
craymichael
¿Hay alguna forma de convertir las advertencias / errores de tensorflow en errores?
CMCDragonkai
1
tf.logging.set_verbosity (tf.logging.ERROR) # o cualquier {DEPURACIÓN, INFORMACIÓN, ADVERTENCIA, ERROR, FATAL} funcionó para mí
Amir Md Amiruzzaman
16

También he tenido este problema (en tensorflow-0.10.0rc0 ), pero no pude solucionar el problema de registro excesivo de las pruebas de nariz a través de las respuestas sugeridas.

Logré resolver esto sondeando directamente en el registrador de tensorflow. No es la solución más correcta, pero funciona muy bien y solo contamina los archivos de prueba que importan directa o indirectamente tensorflow:

# Place this before directly or indirectly importing tensorflow
import logging
logging.getLogger("tensorflow").setLevel(logging.WARNING)
Pedro Lopes
fuente
1
A mí me funcionó, mientras que la solución TF_CPP_MIN_LOG_LEVEL no. ¡Buen pensamiento!
tolerante a fallas el
La única solución que me funcionó con tensorflow 1.12.
BiBi
Utilizando tensorflow-gpu 1.14.0. Recibí este resultado cuando se llamó a la función anterior. The name tf.logging.set_verbosity is deprecated. Please use tf.compat.v1.logging.set_verbosity instead. WARNING:tensorflow:From C:/.../NN.py:297: The name tf.logging.ERROR is deprecated. Please use tf.compat.v1.logging.ERROR instead. Agradable que no hubo advertencias después de estos mensajes
A.Ametov
15

Para compatibilidad con Tensorflow 2.0 , puede usartf.get_logger

import logging
tf.get_logger().setLevel(logging.ERROR)
serv-inc
fuente
3
Me funcionó con tensorflow 1.13.1
Abramodj
1
Trabajó para mí con 1.13.1. Código de la muestra .
user1857492
10

Como TF_CPP_MIN_LOG_LEVELno funcionó para mí, puedes probar:

tf.logging.set_verbosity(tf.logging.WARN)

Me funcionó en tensorflow v1.6.0

Wikunia
fuente
6

El administrador de registro habitual de python3 funciona para mí con tensorflow == 1.11.0:

import logging
logging.getLogger('tensorflow').setLevel(logging.INFO)
estevo
fuente
4

Resolví con esta publicación No se pueden eliminar todas las advertencias # 27045 , y la solución fue:

import logging
logging.getLogger('tensorflow').disabled = True
Mandy007
fuente
3
no funciona para FutureWarnings durante la importación de tf, tf = 1.13.1 py3
ffeast
2
¡Solo esto funciona para mí! Mi configuración: Keras '2.2.4' (que usa tf 1.15.0) y Python 3.7.4
Mohamad Kouhi Moghadam
2

Para agregar algo de flexibilidad aquí, puede lograr un control más detallado sobre el nivel de registro escribiendo una función que filtre los mensajes como desee:

logging.getLogger('tensorflow').addFilter(my_filter_func)

donde my_filter_funcacepta un LogRecordobjeto como entrada [ LogRecorddocs ] y devuelve cero si desea que se deseche el mensaje; distinto de cero

Aquí hay un filtro de ejemplo que solo guarda cada enésimo mensaje de información (Python 3 debido al uso de nonlocalaquí):

def keep_every_nth_info(n):
    i = -1
    def filter_record(record):
        nonlocal i
        i += 1
        return int(record.levelname != 'INFO' or i % n == 0)
    return filter_record

# Example usage for TensorFlow:
logging.getLogger('tensorflow').addFilter(keep_every_nth_info(5))

Todo lo anterior supone que TensorFlow ya ha configurado su estado de registro. Puede asegurarse de esto sin efectos secundarios llamando tf.logging.get_verbosity()antes de agregar un filtro.

Tyler
fuente
2

Sí, estoy usando tf 2.0-beta y quiero habilitar / deshabilitar el registro predeterminado. La variable de entorno y los métodos en tf1.X ya no parecen existir.

Di un paso en PDB y encontré que esto funcionaba:

# close the TF2 logger
tf2logger = tf.get_logger()
tf2logger.error('Close TF2 logger handlers')
tf2logger.root.removeHandler(tf2logger.root.handlers[0])

Luego agrego mi propia API de registrador (en este caso basada en archivos)

logtf = logging.getLogger('DST')
logtf.setLevel(logging.DEBUG)

# file handler
logfile='/tmp/tf_s.log'
fh = logging.FileHandler(logfile)
fh.setFormatter( logging.Formatter('fh %(asctime)s %(name)s %(filename)s:%(lineno)d :%(message)s') )
logtf.addHandler(fh)
logtf.info('writing to %s', logfile)
dturvene
fuente
2

para tensorflow 2.1.0, el siguiente código funciona bien.

import tensorflow as tf
tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)
Onur Demiray
fuente
2

Si solo necesita deshacerse de las salidas de advertencia en la pantalla , es posible que desee borrar la consola pantalla de justo después de importar el flujo de tensor mediante este simple comando (es más efectivo que deshabilitar todos los registros de depuración en mi experiencia):

En windows:

import os
os.system('cls')

En Linux o Mac:

import os
os.system('clear')
Masoud Masoumi Moghadam
fuente
0

Ninguna de las soluciones anteriores pudo resolver mi problema en Jupyter Notebook, por lo que utilizo el siguiente fragmento de código de Cicoria , y los problemas resueltos.

import warnings  
with warnings.catch_warnings():  
    warnings.filterwarnings("ignore",category=FutureWarning)
    import tensorflow as tf
    from tensorflow import keras
    from tensorflow.keras.preprocessing.text import Tokenizer

print('Done') 
Erman
fuente