Wyłącz informacje debugowania Tensorflow

191

Poprzez debugowanie informacji mam na myśli to, co TensorFlow pokazuje w moim terminalu na temat załadowanych bibliotek i znalezionych urządzeń itp., A nie błędów w Pythonie.

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
źródło
5
problem ze śledzeniem: github.com/tensorflow/tensorflow/issues/1258
Jarosław
Tensorflow wciąż jest wczesnym kodem alfa i wciąż pracuje nad poprawkami dotyczącymi podstawowej kompatybilności z numpy i pandami. Aby więc wyeliminować te ostrzeżenia jednym uderzeniem, wykonaj import warningsnastępnie warnings.filterwarnings('ignore'), a następnie uruchom import tensorflow i kod oparty na zepsutym kodzie alfa-tensorflow, a następnie włącz ponownie ostrzeżenia za pośrednictwem warnings.resetwarnings(). W tej chwili Tensorflow nie powinien reklamować nazwy wersji powyżej 0,05.
Eric Leschinski

Odpowiedzi:

214

Możesz wyłączyć wszystkie dzienniki debugowania, używając os.environ:

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

Testowane na tf 0.12 i 1.0

W szczegółach,

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
źródło
To działa, ale usuwa znacznik czasu przed dziennikami - jak można to ponownie włączyć?
DreamFlasher
Co oznaczają te poziomy (0, 1, 2, 3)?
diralik,
2
nie działa dla 1.13 i python3, nawet przed importem tensorflow
Li haonan
146

Aktualizacja 2.0 (10/8/19) Ustawienie TF_CPP_MIN_LOG_LEVELpowinno nadal działać (patrz poniżej w aktualizacji v0.12 +), ale obecnie jest otwarty problem (patrz problem # 31870 ). Jeśli ustawienie TF_CPP_MIN_LOG_LEVELnie działa dla Ciebie (ponownie, patrz poniżej), spróbuj wykonać następujące czynności, aby ustawić poziom dziennika:

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

Ponadto zapoznaj się z dokumentacją, w tf.autograph.set_verbosityktórej ustala się szczegółowość komunikatów dziennika autografów - na przykład:

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

Aktualizacja v0.12 + (5/20/17), Praca za pośrednictwem TF 2.0+:

W TensorFlow 0.12+, w zależności od tego problemu , możesz teraz kontrolować rejestrowanie za pomocą zmiennej środowiskowej o nazwie TF_CPP_MIN_LOG_LEVEL; domyślnie wynosi 0 (pokazane wszystkie dzienniki), ale można ustawić jedną z następujących wartości w Levelkolumnie.

  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      

Zobacz następujący ogólny przykład systemu operacyjnego przy użyciu Pythona:

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

Aby być dokładnym, wywołujesz również ustawienie poziomu dla tf_loggingmodułu Python , który jest używany np. W ops podsumowaniu, tablicy wyników, różnych estymatorach itp.

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

W przypadku wersji 1.14 otrzymasz ostrzeżenia, jeśli nie zmienisz sposobu używania interfejsu API v1 w następujący sposób:

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


Wcześniejsze wersje rejestrowania TensorFlow lub TF-Learn (v0.11.x lub nowsza):

Zobacz poniższą stronę, aby uzyskać informacje na temat rejestrowania w TensorFlow; z nową aktualizacją, jesteś w stanie ustawić szczegółowość zapisów w dzienniku albo DEBUG, INFO, WARN, ERROR, lub FATAL. Na przykład:

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

Strona dodatkowo omawia monitory, których można używać z modelami TF-Learn. Oto strona .

To nie blokować wszystkie rejestrowanie, chociaż (tylko TF-Learn). Mam dwa rozwiązania; jedno jest rozwiązaniem „technicznie poprawnym” (Linux), a drugie wymaga przebudowania TensorFlow.

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

Po drugie, zapoznaj się z odpowiedzią, która obejmuje modyfikację źródła i przebudowanie TensorFlow.

Craymichael
źródło
komunikaty „I tensorflow” mogą być denerwujące, tf powinien zapewnić jakiś sposób wyciszenia ich za pomocą interfejsu API zamiast przebudowy
fizyk
2
Można to również zrobić z wiersza poleceń:export TF_CPP_MIN_LOG_LEVEL="3" && python your_code.py
Andrew Hundt,
Można go również uruchomić jakoTF_CPP_MIN_LOG_LEVEL="3" python your_code.py
craymichael
Czy istnieje sposób na przekształcenie ostrzeżeń / błędów tensorflow w błędy?
CMCDragonkai
1
tf.logging.set_verbosity (tf.logging.ERROR) # lub dowolny {DEBUG, INFO, WARN, ERROR, FATAL} pracował dla mnie
Amir Md Amiruzzaman
16

Miałem również ten problem (włączony tensorflow-0.10.0rc0), ale nie mogłem rozwiązać problemu nadmiernego rejestrowania testów nosa za pomocą sugerowanych odpowiedzi.

Udało mi się to rozwiązać, sondując bezpośrednio w rejestratorze przepływu tensorflow. Nie jest to najbardziej poprawna poprawka, ale działa świetnie i zanieczyszcza tylko pliki testowe, które bezpośrednio lub pośrednio importują tensorflow:

# Place this before directly or indirectly importing tensorflow
import logging
logging.getLogger("tensorflow").setLevel(logging.WARNING)
Pedro Lopes
źródło
1
Pracowało dla mnie, podczas gdy rozwiązanie TF_CPP_MIN_LOG_LEVEL nie. Dobre myślenie!
odporny na uszkodzenia
Jedyne rozwiązanie, które działało dla mnie z tensorflow 1.12.
BiBi
Korzystanie tensorflow-gpu 1.14.0. Odebrano ten wynik, gdy 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.
wywołano
15

Aby zapewnić zgodność z Tensorflow 2.0 , możesz użyćtf.get_logger

import logging
tf.get_logger().setLevel(logging.ERROR)
serv-inc
źródło
3
Pracowałem dla mnie z tensorflow 1.13.1
Abramodj
1
Pracował dla mnie z 1.13.1. Przykładowy kod .
user1857492
10

Jak TF_CPP_MIN_LOG_LEVELdla mnie nie zadziałało, możesz spróbować:

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

Pracował dla mnie w tensorflow v1.6.0

Wikunia
źródło
6

Zwykły menedżer dziennika Python3 działa dla mnie z tensorflow == 1.11.0:

import logging
logging.getLogger('tensorflow').setLevel(logging.INFO)
estevo
źródło
4

Rozwiązałem ten post Nie można usunąć wszystkich ostrzeżeń # 27045 , a rozwiązaniem było:

import logging
logging.getLogger('tensorflow').disabled = True
Mandy007
źródło
3
nie działa dla FutureWarnings podczas importu tf, tf = 1.13.1 py3
ffeast
2
Tylko to działa dla mnie! Moja konfiguracja: Keras '2.2.4' (który używa tf 1.15.0) i Python 3.7.4
Mohamad Kouhi Moghadam
2

Aby dodać tutaj pewnej elastyczności, możesz uzyskać bardziej szczegółową kontrolę nad poziomem rejestrowania, pisząc funkcję, która filtruje wiadomości w dowolny sposób:

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

gdzie my_filter_funcakceptuje LogRecordobiekt jako dane wejściowe [ LogRecorddokumenty ] i zwraca zero, jeśli chcesz, aby wiadomość została wyrzucona; niezerowe inaczej.

Oto przykładowy filtr, który zachowuje tylko każdy n-ty komunikat informacyjny (Python 3 z powodu użycia nonlocaltutaj):

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

Wszystkie powyższe założyły, że TensorFlow ustawił już swój stan rejestrowania. Możesz to zapewnić bez skutków ubocznych, dzwoniąc tf.logging.get_verbosity()przed dodaniem filtra.

Tyler
źródło
2

Tak, używam TF 2.0-beta i chcę włączyć / wyłączyć rejestrowanie domyślne. Wydaje się, że zmienna środowiskowa i metody w tf1.X już nie istnieją.

Odszedłem w PDB i stwierdziłem, że to działa:

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

Następnie dodaję własny interfejs API rejestratora (w tym przypadku oparty na plikach)

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
źródło
2

w przypadku tensorflow 2.1.0 następujący kod działa poprawnie.

import tensorflow as tf
tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)
Onur Demiray
źródło
2

Jeśli chcesz tylko pozbyć się wyjść ostrzegawczych na ekranie , możesz wyczyścić ekran konsoli zaraz po zaimportowaniu przepływu tensor przy użyciu tego prostego polecenia (Jest to bardziej skuteczne niż wyłączenie wszystkich dzienników debugowania z mojego doświadczenia):

W systemie Windows:

import os
os.system('cls')

W systemie Linux lub Mac:

import os
os.system('clear')
Masoud Masoumi Moghadam
źródło
0

Żadne z powyższych rozwiązań nie rozwiązało mojego problemu w Jupyter Notebook, dlatego używam poniższego kodu fragmentu z Cicoria i rozwiązano problemy.

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
źródło