Désactiver les informations de débogage de Tensorflow


191

Par informations de débogage, je veux dire ce que TensorFlow montre dans mon terminal à propos des bibliothèques chargées et des périphériques trouvés, etc., pas des erreurs 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 est encore un code alpha précoce et ils travaillent toujours sur les bogues pour la compatibilité de base avec numpy et pandas. Donc, pour éliminer ces avertissements en un seul coup, faites- import warningsle warnings.filterwarnings('ignore'), puis exécutez vos importations tensorflow et code qui repose sur le code alpha-tensorflow cassé, puis réactivez les avertissements via warnings.resetwarnings(). Tensorflow ne devrait pas annoncer un nom de version supérieur à 0,05 pour le moment.
Eric Leschinski

Réponses:


214

Vous pouvez désactiver tous les journaux de débogage en utilisant os.environ:

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

Testé sur tf 0.12 et 1.0

En détails,

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

Cela fonctionne, mais cela supprime l'horodatage devant les journaux - comment cela peut-il être réactivé?
DreamFlasher

Que signifient ces niveaux (0, 1, 2, 3)?
diralik

2
ne fonctionne pas pour 1.13 et python3, même avant l'importation tensorflow
Li haonan

146

2.0 Mise à jour (08/10/19) Réglage TF_CPP_MIN_LOG_LEVELdevrait fonctionner (voir ci - dessous dans v0.12 + mise à jour), mais il est actuellement une question ouverte (voir le numéro # 31870 ). Si le paramètre TF_CPP_MIN_LOG_LEVELne fonctionne pas pour vous (encore une fois, voir ci-dessous), essayez de faire ce qui suit pour définir le niveau de journalisation:

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

En outre, veuillez consulter la documentation sur tf.autograph.set_verbositylaquelle définit la verbosité des messages du journal d'autographes - par exemple:

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

v0.12 + mise à jour (20/05/17), fonctionnant via TF 2.0+:

Dans TensorFlow 0.12+, par ce problème , vous pouvez désormais contrôler la journalisation via la variable d'environnement appelée TF_CPP_MIN_LOG_LEVEL; il est par défaut à 0 (tous les journaux sont affichés) mais peut être défini sur l'une des valeurs suivantes sous la Levelcolonne.

  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      

Consultez l'exemple de système d'exploitation générique suivant utilisant Python:

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

Pour être minutieux, vous appelez également définir le niveau du tf_loggingmodule Python , qui est utilisé par exemple dans les opérations récapitulatives, le tensorboard, divers estimateurs, etc.

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

Pour 1.14, vous recevrez des avertissements si vous ne changez pas pour utiliser l'API v1 comme suit:

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


Pour les versions antérieures de TensorFlow ou de la journalisation TF-Learn (v0.11.x ou antérieure):

Consultez la page ci-dessous pour obtenir des informations sur la journalisation TensorFlow; avec la nouvelle mise à jour, vous êtes en mesure de régler la verbosité de l' exploitation forestière soit DEBUG, INFO, WARN, ERRORou FATAL. Par exemple:

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

La page passe également en revue les moniteurs qui peuvent être utilisés avec les modèles TF-Learn. Voici la page .

Cela ne bloque toute exploitation forestière, mais (seulement TF-savoir). J'ai deux solutions; l'une est une solution «techniquement correcte» (Linux) et l'autre implique la reconstruction de TensorFlow.

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

Pour l'autre, veuillez consulter cette réponse qui implique la modification de la source et la reconstruction de TensorFlow.


les messages "I tensorflow" peuvent être ennuyeux, tf devrait fournir un moyen de les faire taire en utilisant l'api au lieu de les reconstruire
physicien

2
Cela peut également être fait à partir de la ligne de commande:export TF_CPP_MIN_LOG_LEVEL="3" && python your_code.py
Andrew Hundt

Il peut également être exécuté commeTF_CPP_MIN_LOG_LEVEL="3" python your_code.py
craymichael

Existe-t-il un moyen de transformer les avertissements / erreurs Tensorflow en erreurs?
CMCDragonkai

1
tf.logging.set_verbosity (tf.logging.ERROR) # ou tout {DEBUG, INFO, WARN, ERROR, FATAL} a fonctionné pour moi
Amir Md Amiruzzaman

16

J'ai également eu ce problème (activé tensorflow-0.10.0rc0), mais je n'ai pas pu résoudre le problème de journalisation des tests de nez excessifs via les réponses suggérées.

J'ai réussi à résoudre ce problème en sondant directement dans l'enregistreur tensorflow. Ce n'est pas le plus correct des correctifs, mais fonctionne très bien et ne pollue que les fichiers de test qui importent directement ou indirectement tensorflow:

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

1
Cela a fonctionné pour moi, contrairement à la solution TF_CPP_MIN_LOG_LEVEL. Bien pensé!
tolérant aux pannes

Seule solution qui a fonctionné pour moi avec tensorflow 1.12.
BiBi

Utilisation tensorflow-gpu 1.14.0. Recieved cette sortie lorsqu'elle est appelée la fonction ci - dessus 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. Plaire qu'il n'y avait pas aucun avertissement après ces messages
A.Ametov


10

Comme cela TF_CPP_MIN_LOG_LEVELn'a pas fonctionné pour moi, vous pouvez essayer:

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

A travaillé pour moi dans tensorflow v1.6.0


6

Le gestionnaire de journaux python3 habituel fonctionne pour moi avec tensorflow == 1.11.0:

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


2

Pour ajouter une certaine flexibilité ici, vous pouvez obtenir un contrôle plus fin sur le niveau de journalisation en écrivant une fonction qui filtre les messages comme vous le souhaitez:

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

my_filter_funcaccepte un LogRecordobjet comme entrée [ LogRecorddocs ] et renvoie zéro si vous voulez que le message soit jeté; différent de zéro sinon.

Voici un exemple de filtre qui ne conserve que chaque nième message d'information (Python 3 en raison de l'utilisation d' nonlocalici):

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

Tout ce qui précède suppose que TensorFlow a déjà configuré son état de journalisation. Vous pouvez vous en assurer sans effets secondaires en appelant tf.logging.get_verbosity()avant d'ajouter un filtre.


2

Ouais, j'utilise tf 2.0-beta et je veux activer / désactiver la journalisation par défaut. La variable d'environnement et les méthodes de tf1.X ne semblent plus exister.

Je suis entré dans PDB et j'ai trouvé que cela fonctionnait:

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

J'ajoute ensuite ma propre API logger (dans ce cas basée sur un fichier)

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

pour tensorflow 2.1.0, le code suivant fonctionne correctement.

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

2

Si vous avez seulement besoin de vous débarrasser des sorties d'avertissement à l'écran , vous voudrez peut-être effacer l' écran de la console juste après l'importation du tensorflow en utilisant cette commande simple (c'est plus efficace que de désactiver tous les journaux de débogage selon mon expérience):

Dans Windows:

import os
os.system('cls')

Sous Linux ou Mac:

import os
os.system('clear')

0

Aucune des solutions ci-dessus ne peut résoudre mon problème dans Jupyter Notebook, j'utilise donc l'extrait de code suivant de Cicoria et les problèmes sont résolus.

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') 
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.