禁用Tensorflow调试信息


189

通过调试信息,我的意思是TensorFlow在我的终端中显示的有关加载的库和找到的设备等的内容,不是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仍然是早期的Alpha代码,他们仍在解决与numpy和pandas基本兼容的错误。因此,淘汰单一打击这些警告,这样做import warningswarnings.filterwarnings('ignore'),然后运行tensorflow进口,并依赖于破碎字母tensorflow代码代码,然后打开警告上通过背warnings.resetwarnings()。Tensorflow不应在此时宣传版本名称超过0.05。
埃里克·莱斯钦斯基

Answers:


211

您可以使用os.environ以下命令禁用所有调试日志:

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

在tf 0.12和1.0上测试

详细来说,

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

这可以工作,但是会删除日志前面的时间戳-如何再次将其打开?
DreamFlasher

这些级别(0、1、2、3)是什么意思?
diralik

2
即使在导入张量流之前也无法在1.13和python3中工作
Li haonan

145

2.0更新(10/8/19) 设置TF_CPP_MIN_LOG_LEVEL仍然应该起作用(请参见v0.12 +更新中的以下内容),但是当前存在一个未解决的问题(请参阅问题#31870)。如果该设置TF_CPP_MIN_LOG_LEVEL对您不起作用(再次参见下文),请尝试执行以下操作来设置日志级别:

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

此外,请参阅有关tf.autograph.set_verbosity设置签名日志消息详细程度的文档-例如:

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

v0.12 +更新(5/20/17),通过TF 2.0+进行工作:

在TensorFlow 0.12+中,针对此问题,您现在可以通过称为TF_CPP_MIN_LOG_LEVEL; 的环境变量控制日志记录。它默认为0(显示所有日志),但可以设置为该Level列下的以下值之一。

  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      

请参阅以下使用Python的通用OS示例:

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

为了更全面,您还调用了设置Python tf_logging模块的级别,该模块用于摘要操作,张量板,各种估计器等。

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

对于1.14,如果不按以下说明使用v1 API,则会收到警告:

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


对于TensorFlow或TF-Learn日志的早期版本(v0.11.x或更低版本):

查看以下页面以获取有关TensorFlow日志记录的信息; 与新的更新,你能在日志记录级别设置为DEBUGINFOWARNERROR,或FATAL。例如:

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

该页面还翻过了可与TF-Learn模型一起使用的监视器。这是页面

但是,这不会阻止所有日志记录(仅TF-Learn)。我有两种解决方案;一种是“技术上正确”的解决方案(Linux),另一种是重建TensorFlow。

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

对于其他,请参见此答案,其中涉及修改源和重建TensorFlow。


“ I tensorflow”消息可能很烦人,tf应该提供某种使用api而不是重建它们的方式来使它们静音
物理学家

2
这也可以从命令行完成:export TF_CPP_MIN_LOG_LEVEL="3" && python your_code.py
Andrew Hundt,

它也可以运行为TF_CPP_MIN_LOG_LEVEL="3" python your_code.py
craymichael '18

有没有办法将张量流警告/错误变成错误?
CMCDragonkai

1
tf.logging.set_verbosity(tf.logging.ERROR)#或任何{调试,信息,警告,错误,致命}对我
有用

16

我也有这个问题(位于tensorflow-0.10.0rc0),但是无法通过建议的答案解决过多的鼻子测试记录问题。

我设法通过直接研究tensorflow记录器来解决这个问题。不是最正确的修复程序,但效果很好,并且只会污染直接或间接导入张量流的测试文件:

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

1
为我工作,而TF_CPP_MIN_LOG_LEVEL解决方案却没有。好想法!
容错的

tensorflow 1.12是唯一对我有用的解决方案。
BiBi

使用tensorflow-gpu 1.14.0。在上面的函数中调用此函数后,收到了此输出,请 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. 在这些消息之后没有任何警告
A.Ametov '19


10

由于TF_CPP_MIN_LOG_LEVEL对我不起作用,您可以尝试:

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

在Tensorflow v1.6.0中为我工作


6

通常的python3日志管理器为我使用tensorflow == 1.11.0:

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


2

为了在此处增加一些灵活性,您可以编写一个函数来过滤出您喜欢的消息,从而实现对日志记录级别的更精细控制:

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

其中,如果您希望抛出该消息,则my_filter_func接受一个LogRecord对象作为输入[ LogRecorddocs ]并返回零;否则为非零。

这是一个示例过滤器,仅保留每第n条信息消息(由于使用了nonlocalhere ,因此使用了Python 3 ):

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

以上所有假设均假设TensorFlow已设置其日志记录状态。您可以通过tf.logging.get_verbosity()添加过滤器之前进行调用来确保没有副作用。


2

是的,我正在使用tf 2.0-beta,并且想要启用/禁用默认日志记录。tf1.X中的环境变量和方法似乎不再存在。

我进入PDB,发现它可以正常工作:

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

然后,我添加自己的记录器API(在这种情况下,基于文件)

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

对于tensorflow 2.1.0,以下代码可以正常工作。

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

2

如果您只需要消除屏幕上的警告输出,则可以使用以下简单命令在导入tensorflow之后立即清除控制台屏幕(根据我的经验,它比禁用所有调试日志更有效):

在Windows中:

import os
os.system('cls')

在Linux或Mac中:

import os
os.system('clear')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.