Disabilita le informazioni di debug di Tensorflow


191

Con informazioni di debug intendo ciò che TensorFlow mostra nel mio terminale sulle librerie caricate e sui dispositivi trovati ecc. Non sugli errori 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
...


Tensorflow è ancora all'inizio del codice alfa e stanno ancora risolvendo i bug per la compatibilità di base con numpy e panda. Quindi, per eliminare questi avvisi in un colpo solo, fai import warningsquindi warnings.filterwarnings('ignore'), esegui le tue importazioni di tensorflow e il codice che si basa sul codice alfa-tensorflow rotto, quindi riattiva gli avvisi via warnings.resetwarnings(). Tensorflow non dovrebbe pubblicizzare un nome di versione superiore a 0,05 in questo momento.
Eric Leschinski,

Risposte:


214

Puoi disabilitare tutti i log di debug usando os.environ:

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

Testato su tf 0,12 e 1,0

Nei dettagli,

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

Funziona, ma rimuove il timestamp davanti ai registri - come può essere attivato di nuovo?
DreamFlasher

Cosa significano questi livelli (0, 1, 2, 3)?
diralik,

2
non funziona per 1.13 e python3, anche prima dell'importazione tensorflow
Li haonan,

146

2.0 Update (10/10/19) L' impostazione TF_CPP_MIN_LOG_LEVELdovrebbe comunque funzionare (vedi sotto in v0.12 + update), ma al momento c'è un problema aperto (vedi numero # 31870 ). Se l'impostazione TF_CPP_MIN_LOG_LEVELnon funziona per te (di nuovo, vedi sotto), prova a fare quanto segue per impostare il livello di registro:

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

Inoltre, consultare la documentazione su tf.autograph.set_verbositycui si imposta la verbosità dei messaggi di registro degli autografi, ad esempio:

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

v0.12 + Update (20/05/17), funzionante tramite TF 2.0+:

In TensorFlow 0.12+, per questo problema , ora puoi controllare la registrazione tramite la variabile ambientale chiamata TF_CPP_MIN_LOG_LEVEL; il valore predefinito è 0 (tutti i registri mostrati) ma può essere impostato su uno dei seguenti valori sotto la Levelcolonna.

  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      

Vedi il seguente esempio di sistema operativo generico usando Python:

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

Per essere precisi, si chiama anche impostare il livello per il tf_loggingmodulo Python , che viene utilizzato ad esempio in operazioni di riepilogo, tensorboard, vari stimatori, ecc.

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

Per 1.14 riceverai avvisi se non cambi a utilizzare l'API v1 come segue:

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


Per versioni precedenti di TensorFlow o TF-Learn Logging (v0.11.xo inferiore):

Vedere la pagina seguente per informazioni sulla registrazione di TensorFlow; con il nuovo aggiornamento, siete in grado di impostare il livello di dettaglio di registrazione a uno DEBUG, INFO, WARN, ERROR, o FATAL. Per esempio:

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

La pagina passa inoltre sui monitor che possono essere utilizzati con i modelli TF-Learn. Ecco la pagina .

Questo, tuttavia, non blocca tutte le registrazioni (solo TF-Learn). Ho due soluzioni; una è una soluzione 'tecnicamente corretta' (Linux) e l'altra prevede la ricostruzione di TensorFlow.

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

Per l'altro, si prega di vedere questa risposta che comporta la modifica della sorgente e la ricostruzione di TensorFlow.


i messaggi "I tensorflow" possono essere fastidiosi, dovrebbe fornire un modo per mettere a tacere usando api invece di ricostruire
fisico

2
Questo può essere fatto anche dalla riga di comando:export TF_CPP_MIN_LOG_LEVEL="3" && python your_code.py
Andrew Hundt,

Può anche essere eseguito comeTF_CPP_MIN_LOG_LEVEL="3" python your_code.py
craymichael

C'è un modo per trasformare avvisi / errori di tensorflow in errori?
CMCDragonkai,

1
tf.logging.set_verbosity (tf.logging.ERROR) # o qualsiasi {DEBUG, INFO, WARN, ERROR, FATAL} ha funzionato per me
Amir Md Amiruzzaman

16

Ho avuto anche questo problema (attivo tensorflow-0.10.0rc0), ma non sono riuscito a risolvere il problema eccessivo di registrazione dei test del naso tramite le risposte suggerite.

Sono riuscito a risolverlo sondando direttamente nel logger tensorflow. Non è la più corretta delle correzioni, ma funziona alla grande e inquina solo i file di test che importano direttamente o indirettamente tensorflow:

# Place this before directly or indirectly importing tensorflow
import logging
logging.getLogger("tensorflow").setLevel(logging.WARNING)

1
Ha funzionato per me, mentre la soluzione TF_CPP_MIN_LOG_LEVEL non ha funzionato. Pensare bene!
tollerante ai guasti

L'unica soluzione che ha funzionato per me con tensorflow 1.12.
BiBi

Usando tensorflow-gpu 1.14.0. Ricevuto questo output quando chiamato funzione sopra 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. Piacevole che non ci fossero avvisi dopo questi messaggi
A.Ametov


10

Dato che TF_CPP_MIN_LOG_LEVELnon ha funzionato per me puoi provare:

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

Ha funzionato per me in tensorflow v1.6.0


6

Il solito gestore log python3 funziona per me con tensorflow == 1.11.0:

import logging
logging.getLogger('tensorflow').setLevel(logging.INFO)


2

Per aggiungere un po 'di flessibilità qui, puoi ottenere un controllo più preciso sul livello di registrazione scrivendo una funzione che filtra i messaggi come preferisci:

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

dove my_filter_funcaccetta un LogRecordoggetto come input [ LogRecorddocs ] e restituisce zero se si desidera che il messaggio venga eliminato; diverso da zero.

Ecco un filtro di esempio che mantiene solo ogni ennesimo messaggio informativo (Python 3 grazie all'uso di nonlocalqui):

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

Tutto quanto sopra ha presupposto che TensorFlow abbia già impostato il suo stato di registrazione. Puoi assicurarti questo senza effetti collaterali chiamando tf.logging.get_verbosity()prima di aggiungere un filtro.


2

Sì, sto usando tf 2.0-beta e voglio abilitare / disabilitare la registrazione predefinita. La variabile d'ambiente e i metodi in tf1.X non sembrano più esistere.

Ho fatto un giro in PDB e ho scoperto che funzionava:

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

Aggiungo quindi la mia API logger (in questo caso basata su file)

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)

2

per tensorflow 2.1.0, il seguente codice funziona correttamente.

import tensorflow as tf
tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)

2

Se devi solo eliminare le uscite di avviso sullo schermo , potresti voler cancellare la console schermo subito dopo aver importato il tensorflow usando questo semplice comando (è più efficace che disabilitare tutti i log di debug nella mia esperienza):

In windows:

import os
os.system('cls')

In Linux o Mac:

import os
os.system('clear')

0

Nessuna delle soluzioni di cui sopra potrebbe risolvere il mio problema in Jupyter Notebook, quindi uso il seguente codice snippet sotto Cicoria , e problemi risolti.

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') 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.