Deaktivieren Sie die Tensorflow-Debugging-Informationen


186

Mit dem Debuggen von Informationen meine ich, was TensorFlow in meinem Terminal über geladene Bibliotheken und gefundene Geräte usw. anzeigt, nicht über Python-Fehler.

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 ist noch ein früher Alpha-Code und sie arbeiten immer noch an den Fehlern, um die grundlegende Kompatibilität mit Numpy und Pandas zu gewährleisten. Um diese Warnungen mit einem Schlag auszuschalten, führen Sie import warningsdann warnings.filterwarnings('ignore')Ihre Tensorflow-Importe und den Code aus, der auf dem fehlerhaften Alpha-Tensorflow-Code basiert, und schalten Sie die Warnungen über wieder ein warnings.resetwarnings(). Tensorflow sollte zu diesem Zeitpunkt keinen Versionsnamen über 0,05 bewerben.
Eric Leschinski

Antworten:


209

Sie können alle Debugging-Protokolle deaktivieren, indem Sie os.environ:

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

Getestet auf tf 0.12 und 1.0

Im Detail,

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

22
Dies funktionierte nur, wenn ich die os.environ vor dem Import von Tensorflow einfügte.
CMCDragonkai

Dies funktioniert, entfernt jedoch den Zeitstempel vor den Protokollen. Wie kann dies wieder aktiviert werden?
DreamFlasher

Was bedeuten diese Werte (0, 1, 2, 3)?
Diralik

2
funktioniert nicht für 1.13 und Python3, noch vor dem Import Tensorflow
Li Haonan

144

2.0 Update (08.10.19) Die Einstellung TF_CPP_MIN_LOG_LEVELsollte weiterhin funktionieren (siehe unten in Version 0.12 + Update), es ist jedoch derzeit ein Problem offen (siehe Problem Nr. 31870 ). Wenn die Einstellung TF_CPP_MIN_LOG_LEVELfür Sie nicht funktioniert (siehe unten), versuchen Sie Folgendes, um die Protokollstufe festzulegen:

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

Weitere Informationen finden Sie in der Dokumentation, in tf.autograph.set_verbosityder die Ausführlichkeit von Autogrammprotokollnachrichten festgelegt wird. Beispiel:

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

v0.12 + Update (20.05.17), Durcharbeiten von TF 2.0+:

In TensorFlow 0.12+, pro dieser Ausgabe können Sie nun über die Umgebungsvariable steuern Protokollierung genannt TF_CPP_MIN_LOG_LEVEL; Der Standardwert ist 0 (alle Protokolle werden angezeigt), kann jedoch unter der LevelSpalte auf einen der folgenden Werte gesetzt werden .

  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      

Siehe das folgende allgemeine Betriebssystembeispiel mit Python:

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

Um gründlich zu sein, rufen Sie auch die Stufe für das Python- tf_loggingModul auf, das beispielsweise in Zusammenfassungsoperationen, Tensorboards, verschiedenen Schätzern usw. verwendet wird.

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

Für 1.14 erhalten Sie Warnungen, wenn Sie die v1-API nicht wie folgt verwenden:

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


Für frühere Versionen von TensorFlow oder TF-Learn Logging (v0.11.x oder niedriger):

Auf der folgenden Seite finden Sie Informationen zur TensorFlow-Protokollierung. mit dem neuen Update, sind Sie in der Lage , die Protokollierung Ausführlichkeit entweder zu setzen DEBUG, INFO, WARN, ERROR, oder FATAL. Beispielsweise:

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

Die Seite geht zusätzlich über Monitore, die mit TF-Learn-Modellen verwendet werden können. Hier ist die Seite .

Dies blockiert jedoch nicht die gesamte Protokollierung (nur TF-Learn). Ich habe zwei Lösungen; Eine ist eine "technisch korrekte" Lösung (Linux) und die andere beinhaltet die Neuerstellung von TensorFlow.

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

Die andere Antwort finden Sie in dieser Antwort, bei der die Quelle geändert und TensorFlow neu erstellt wird.


Die "I tensorflow" -Nachrichten können ärgerlich sein. Sie sollten eine Möglichkeit bieten, sie mithilfe von API zum Schweigen zu bringen, anstatt sie neu
Physiker

2
Dies kann auch über die Kommandozeile erfolgen:export TF_CPP_MIN_LOG_LEVEL="3" && python your_code.py
Andrew Hundt

Es kann auch ausgeführt werden alsTF_CPP_MIN_LOG_LEVEL="3" python your_code.py
craymichael

Gibt es eine Möglichkeit, Tensorflow-Warnungen / Fehler in Fehler umzuwandeln?
CMCDragonkai

1
tf.logging.set_verbosity (tf.logging.ERROR) # oder irgendein {DEBUG, INFO, WARN, ERROR, FATAL} hat für mich gearbeitet
Amir Md Amiruzzaman

16

Ich hatte auch dieses Problem (an tensorflow-0.10.0rc0), konnte aber das Problem mit der Protokollierung übermäßiger Nasentests nicht über die vorgeschlagenen Antworten beheben.

Ich habe es geschafft, dies zu lösen, indem ich direkt in den Tensorflow-Logger gesucht habe. Nicht die korrekteste Korrektur, funktioniert aber hervorragend und verschmutzt nur die Testdateien, die direkt oder indirekt Tensorflow importieren:

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

1
Hat für mich funktioniert, die TF_CPP_MIN_LOG_LEVEL-Lösung jedoch nicht. Gute Idee!
Fehlertolerant

Einzige Lösung, die bei mir mit Tensorflow 1.12 funktioniert hat.
BiBi

Verwenden von tensorflow-gpu 1.14.0. Erhielt diese Ausgabe, als die obige Funktion aufgerufen wurde. 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. Erfreulich, dass es nach diesen Nachrichten keine Warnungen gab
A.Ametov

15

Zur Kompatibilität mit Tensorflow 2.0 können Sie verwendentf.get_logger

import logging
tf.get_logger().setLevel(logging.ERROR)

3
Arbeitete für mich mit Tensorflow 1.13.1
Abramodj

1
Arbeitete für mich mit 1.13.1. Beispielcode .
user1857492

1
Ich liebe die Kommentare hier.
Markroxor

1
@markroxor: siehe Bearbeitungsverlauf: Ich hatte geschrieben, dass es bei mir nicht funktioniert. Nach so vielen Kommentaren, dass es funktioniert hat, wurde dieser Teil entfernt.
serv-inc

1
Oh LOL, es hat auch bei mir nicht funktioniert, aber der Top-Kommentar - @ mwwebs Antwort hat bei mir funktioniert.
Markroxor

10

Da TF_CPP_MIN_LOG_LEVELes bei mir nicht funktioniert hat kannst du versuchen:

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

Arbeitete für mich in Tensorflow v1.6.0


6

Der übliche Python3-Protokollmanager funktioniert bei mir mit Tensorflow == 1.11.0:

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


2

Um hier etwas Flexibilität zu schaffen, können Sie die Protokollierungsstufe genauer steuern, indem Sie eine Funktion schreiben, die Nachrichten nach Belieben herausfiltert:

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

Dabei my_filter_funcakzeptiert ein LogRecordObjekt als Eingabe [ LogRecorddocs ] und gibt Null zurück, wenn die Nachricht verworfen werden soll. sonst ungleich Null.

Hier ist ein Beispielfilter, der nur jede n-te Infomeldung speichert (Python 3 aufgrund der Verwendung von nonlocalhier):

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

Bei alledem wurde davon ausgegangen, dass TensorFlow seinen Protokollierungsstatus bereits eingerichtet hat. Sie können dies ohne Nebenwirkungen sicherstellen, indem Sie tf.logging.get_verbosity()vor dem Hinzufügen eines Filters aufrufen .


2

Ja, ich verwende tf 2.0-beta und möchte die Standardprotokollierung aktivieren / deaktivieren. Die Umgebungsvariable und Methoden in tf1.X scheinen nicht mehr zu existieren.

Ich bin in PDB herumgetreten und habe festgestellt, dass dies funktioniert:

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

Ich füge dann meine eigene Logger-API hinzu (in diesem Fall dateibasiert).

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

Für Tensorflow 2.1.0 funktioniert der folgende Code einwandfrei.

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

2

Wenn Sie nur die Warnausgaben auf dem Bildschirm entfernen müssen , können Sie den Konsolenbildschirm direkt nach dem Importieren des Tensorflows mit diesem einfachen Befehl löschen (meiner Erfahrung nach ist dies effektiver als das Deaktivieren aller Debugging-Protokolle):

In Fenstern:

import os
os.system('cls')

Unter Linux oder Mac:

import os
os.system('clear')
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.