Desativar informações de depuração do Tensorflow


191

Ao depurar informações, quero dizer o que o TensorFlow mostra no meu terminal sobre bibliotecas carregadas e dispositivos encontrados etc., não erros 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
...


O Tensorflow ainda é um código alfa antigo e eles ainda estão trabalhando nos bugs para obter compatibilidade básica com numpy e pandas. Portanto, para eliminar esses avisos de uma só import warningsvez warnings.filterwarnings('ignore'), execute as importações ee o código que depende do código de alfa-tensor-fluxo quebrado e ative novamente os avisos via warnings.resetwarnings(). O Tensorflow não deve anunciar um nome de versão acima de 0,05 neste momento.
Eric Leschinski 24/09/19

Respostas:


214

Você pode desativar todos os logs de depuração usando os.environ :

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

Testado em tf 0,12 e 1,0

Em detalhes,

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

Isso funciona, mas remove o registro de data e hora na frente dos logs - como isso pode ser ativado novamente?
DreamFlasher

O que esses níveis (0, 1, 2, 3) significam?
diralik

2
não trabalhando para 1,13 e python3, mesmo antes tensorflow importação
Li HaoNan

146

Atualização 2.0 (08/10/19) A configuração TF_CPP_MIN_LOG_LEVELainda deve funcionar (veja abaixo na v0.12 + atualização), mas atualmente há um problema em aberto (consulte o número 31870 ). Se a configuração TF_CPP_MIN_LOG_LEVELnão funcionar para você (novamente, veja abaixo), tente fazer o seguinte para definir o nível do log:

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

Além disso, consulte a documentação em tf.autograph.set_verbosityque define a verbosidade das mensagens de log de autógrafos - por exemplo:

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

v0.12 + atualização (20/5/17), trabalhando com o TF 2.0+:

No TensorFlow 0.12+, por esse problema , agora você pode controlar o log através da variável ambiental chamada TF_CPP_MIN_LOG_LEVEL; o padrão é 0 (todos os logs mostrados), mas pode ser definido como um dos seguintes valores na Levelcoluna.

  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      

Veja o seguinte exemplo genérico do sistema operacional usando Python:

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

Para ser completo, você também define o nível do tf_loggingmódulo Python , que é usado em, por exemplo, operações de resumo, tensorboard, vários estimadores, etc.

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

Para a 1.14, você receberá avisos se não mudar para usar a API v1 da seguinte maneira:

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


Para versões anteriores do registro do TensorFlow ou TF-Learn (v0.11.x ou inferior):

Veja a página abaixo para obter informações sobre o registro do TensorFlow; com a nova atualização, você é capaz de definir a verbosidade de registro para tanto DEBUG, INFO, WARN, ERROR, ou FATAL. Por exemplo:

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

A página passa por cima de monitores que podem ser usados ​​com os modelos TF-Learn. Aqui está a página .

Esta não bloquear todo o registo, embora (somente TF-Learn). Eu tenho duas soluções; uma é uma solução 'tecnicamente correta' (Linux) e a outra envolve a reconstrução do TensorFlow.

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

Para o outro, veja esta resposta que envolve a modificação da fonte e a reconstrução do TensorFlow.


o "eu tensorflow" mensagens podem ser irritante, tf deve fornecer alguma forma de silenciar-los usando api em vez de reconstruir
físico

2
Isso também pode ser feito a partir da linha de comando:export TF_CPP_MIN_LOG_LEVEL="3" && python your_code.py
Andrew Hundt

Ele também pode ser executado comoTF_CPP_MIN_LOG_LEVEL="3" python your_code.py
craymichael

Existe uma maneira de transformar avisos / erros de tensorflow em erros?
precisa saber é o seguinte

1
tf.logging.set_verbosity (tf.logging.ERROR) # ou qualquer {DEBUG, INFO, WARN, ERROR, FATAL} funcionou para mim
Amir Md Amiruzzaman

16

Eu também tive esse problema (ativado tensorflow-0.10.0rc0), mas não foi possível corrigir o problema excessivo de registro de testes nasais através das respostas sugeridas.

Consegui resolver isso sondando diretamente no registrador de fluxo tensor. Não é a correção mais correta, mas funciona muito bem e polui apenas os arquivos de teste que importam direta ou indiretamente o fluxo tensor:

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

1
Funcionou para mim, enquanto a solução TF_CPP_MIN_LOG_LEVEL não funcionou. Bem pensado!
tolerante a falhas

Única solução que funcionou para mim com o tensorflow 1.12.
BiBi 8/01/19

Usando tensorflow-gpu 1.14.0. Recebeu esta saída quando chamada a função acima 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. Agradável por não haver avisos após essas mensagens
A.Ametov 06/10/19


10

Como TF_CPP_MIN_LOG_LEVELnão funcionou para mim, você pode tentar:

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

Trabalhou para mim no tensorflow v1.6.0


6

O gerenciador de logs python3 usual funciona para mim com tensorflow == 1.11.0:

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


2

Para adicionar um pouco de flexibilidade aqui, você pode obter um controle mais refinado sobre o nível de log escrevendo uma função que filtra as mensagens da maneira que desejar:

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

onde my_filter_funcaceita um LogRecordobjeto como entrada [ LogRecorddocs ] e retorna zero se você deseja que a mensagem seja descartada; diferente de zero caso contrário.

Aqui está um exemplo de filtro que mantém apenas todas as enésimas mensagens informativas (Python 3 devido ao uso nonlocalaqui):

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

Todos os itens acima assumiram que o TensorFlow já configurou seu estado de log. Você pode garantir isso sem efeitos colaterais ligando tf.logging.get_verbosity()antes de adicionar um filtro.


2

Sim, estou usando o tf 2.0-beta e quero ativar / desativar o log padrão. A variável de ambiente e os métodos no tf1.X parecem não existir mais.

Eu pisei no PDB e achei que isso funcionava:

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

Em seguida, adiciono minha própria API do logger (neste caso, com base em arquivos)

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

para tensorflow 2.1.0, o código a seguir funciona bem.

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

2

Se você precisar se livrar apenas das saídas de aviso na tela , limpe o console tela logo após importar o fluxo tensor usando este comando simples (é mais eficaz do que desativar todos os logs de depuração na minha experiência):

No Windows:

import os
os.system('cls')

No Linux ou Mac:

import os
os.system('clear')

0

Nenhuma das soluções acima poderia resolver meu problema no Jupyter Notebook, então eu uso o seguinte código de trecho abaixo da Cicoria e os problemas resolvidos.

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') 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.