禁用 Tensorflow 调试信息
- 2025-01-16 08:37:00
- admin 原创
- 134
问题描述:
我所说的调试信息是指 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
...
解决方案 1:
您可以使用以下方法禁用所有调试日志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
解决方案 2:
2.0 更新(2019 年 10 月 8 日)
设置TF_CPP_MIN_LOG_LEVEL
应该仍然有效(请参阅下面的 v0.12+ 更新),但版本 2.0 到 2.3.z 中有一个报告问题,该问题已在 2.4 及更高版本中修复。如果设置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+ 更新(2017 年 5 月 20 日),通过 TF 2.0+ 进行操作:
在 TensorFlow 0.12+ 中,根据此问题,您现在可以通过名为 的环境变量来控制日志记录TF_CPP_MIN_LOG_LEVEL
;它默认为 0(显示所有日志),但可以设置为列下的以下值之一Level
。
Level | Level for Humans | Level Description
-------|------------------|------------------------------------
0 | INFO | [Default] Print all messages
1 | WARNING | Filter out INFO messages
2 | ERROR | Filter out INFO & WARNING messages
3 | NONE | Filter out all messages
请参阅以下使用 Python 的通用操作系统示例:
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' # or any {'0', '1', '2'}
import tensorflow as tf
您可以在运行脚本的环境中设置此环境变量。例如,使用 bash,它可以在文件~/.bashrc
、、/etc/environment
中/etc/profile
,或在实际 shell 中,如下所示:
TF_CPP_MIN_LOG_LEVEL=2 python my_tf_script.py
为了彻底起见,您还可以设置 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 Logging 的早期版本(v0.11.x 或更低版本):
查看以下页面以获取有关 TensorFlow 日志记录的信息;通过新的更新,您可以将日志记录详细程度设置为DEBUG
、INFO
、WARN
、ERROR
或FATAL
。例如:
tf.logging.set_verbosity(tf.logging.ERROR)
该页面还介绍了可与 TF-Learn 模型一起使用的监视器。以下是页面。
不过,这不会阻止所有日志记录(仅限 TF-Learn)。我有两个解决方案;一个是“技术上正确”的解决方案(Linux),另一个涉及重建 TensorFlow。
script -c 'python [FILENAME].py' | grep -v 'I tensorflow/'
对于其他问题,请参阅这个答案,其中涉及修改源代码和重建 TensorFlow。
解决方案 3:
为了与 Tensorflow 2.0 兼容,您可以使用tf.get_logger
import logging
tf.get_logger().setLevel(logging.ERROR)
解决方案 4:
我也遇到过这个问题(在tensorflow-0.10.0rc0
),但无法通过建议的答案解决过多的鼻子测试记录问题。
我设法通过直接探测 TensorFlow 记录器解决了这个问题。虽然不是最正确的修复方法,但效果很好,而且只会污染直接或间接导入 TensorFlow 的测试文件:
# Place this before directly or indirectly importing tensorflow
import logging
logging.getLogger("tensorflow").setLevel(logging.WARNING)
解决方案 5:
我正在使用 Tensorflow 2.3.1 版本,上述所有解决方案均未完全有效。
直到我找到了这个包。
像这样安装:
使用 Anaconda,
python -m pip install silence-tensorflow
使用 IDE,
pip install silence-tensorflow
并在第一行代码中添加:
from silence_tensorflow import silence_tensorflow
silence_tensorflow()
就是这样!
解决方案 6:
对于仍然os.environ
像我一样努力使解决方案发挥作用的人,请检查在脚本中导入之前tensorflow
是否放置了此内容,就像 mwweb 的答案一样:
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' # or any {'0', '1', '2'}
import tensorflow as tf
解决方案 7:
我通过这篇文章解决了无法删除所有警告#27045的问题,解决方案是:
import logging
logging.getLogger('tensorflow').disabled = True
解决方案 8:
由于TF_CPP_MIN_LOG_LEVEL
对我不起作用,您可以尝试:
tf.logging.set_verbosity(tf.logging.WARN)
在 tensorflow v1.6.0 中为我工作
解决方案 9:
通常,python3 日志管理器适用于 tensorflow==1.11.0:
import logging
logging.getLogger('tensorflow').setLevel(logging.INFO)
解决方案 10:
在导入 TensorFlow 之前,只需silence_tensorflow
从包中运行该函数:silence-tensorflow
"""Module providing tools to shut up tensorflow useless warnings, letting you focus on the actual problems."""
import os
import logging
def silence_tensorflow():
"""Silence every unnecessary warning from tensorflow."""
logging.getLogger('tensorflow').setLevel(logging.ERROR)
os.environ["KMP_AFFINITY"] = "noverbose"
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
# We wrap this inside a try-except block
# because we do not want to be the one package
# that crashes when TensorFlow is not installed
# when we are the only package that requires it
# in a given Jupyter Notebook, such as when the
# package import is simply copy-pasted.
try:
import tensorflow as tf
tf.get_logger().setLevel('ERROR')
tf.autograph.set_verbosity(3)
except ModuleNotFoundError:
pass
免责声明:我不是这个包的作者。
解决方案 11:
对于 tensorflow 2.1.0,以下代码运行良好。
import tensorflow as tf
tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)
解决方案 12:
这个对我来说很完美,可以关闭所有日志
import logging, os
logging.disable(logging.WARNING)
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3"
import tensorflow as tf
解决方案 13:
为了在这里增加一些灵活性,您可以通过编写一个按照您喜欢的方式过滤消息的函数来实现对日志记录级别的更细粒度的控制:
logging.getLogger('tensorflow').addFilter(my_filter_func)
接受my_filter_func
一个LogRecord
对象作为输入 [ LogRecord
docs ],如果您希望抛出消息,则返回零;否则,返回非零。
下面是一个仅保留每第 n 条信息消息的示例过滤器(由于此处使用,因此为 Python 3 nonlocal
):
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()
在添加过滤器之前调用来确保这一点,而不会产生副作用。
解决方案 14:
是的,我正在使用 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)
解决方案 15:
在测试了各种建议以便它们也可以使使用PyInstaller构建的最终可执行文件静音之后,我想出了以下设置:
import logging
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
logging.getLogger('tensorflow').setLevel(logging.ERROR)
import tensorflow as tf
线路
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
将消除关于重建 TensorFlow的警告:
I tensorflow/core/platform/cpu_feature_guard.cc:193] 此 TensorFlow 二进制文件使用 oneAPI 深度神经网络库 (oneDNN) 进行了优化,以便在性能关键型操作中使用以下 CPU 指令:AVX2 FMA。要在其他操作中启用它们,请使用适当的编译器标志重建 TensorFlow。
线路
logging.getLogger('tensorflow').setLevel(logging.ERROR)
将消除有关AutoGraph的警告:
警告:tensorflow:AutoGraph 在此环境中不可用:函数缺少代码信息。这在某些环境中很常见,例如交互式 Python shell。有关更多信息,请参阅https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/autograph/g3doc/reference/limitations.md#access-to-source-code 。
关键点在于将这两者放在导入 Tensorflow之前——尽管 Pylint 发出了警告!
TensorFlow 2.11.0
解决方案 16:
在 Jupyter 笔记本中,你可以使用%env
魔法命令:
%env TF_CPP_MIN_LOG_LEVEL=3
import tensorflow as tf
解决方案 17:
我为此挣扎了一段时间,尝试了这里几乎所有的解决方案,但无法摆脱调试信息TF 1.14
,我尝试了以下多种解决方案:
import os
import logging
import sys
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' # FATAL
stderr = sys.stderr
sys.stderr = open(os.devnull, 'w')
import tensorflow as tf
tf.get_logger().setLevel(tf.compat.v1.logging.FATAL)
tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)
logging.getLogger('tensorflow').setLevel(tf.compat.v1.logging.FATAL)
sys.stderr = stderr
import absl.logging
logging.root.removeHandler(absl.logging._absl_handler)
absl.logging._warn_preinit_stderr = False
调试信息仍然显示出来,最后有用的是重启我的电脑(实际上重启内核应该可以工作)。所以如果有人遇到类似的问题,请尝试在设置环境变量后重启内核,这很简单但可能不太容易想到。
解决方案 18:
这里的大多数答案都有效,但每次打开新会话时都必须使用它们(例如使用 JupyterLab)。要使更改生效,您必须设置环境变量。
Linux:
export TF_CPP_MIN_LOG_LEVEL="3"
(另外将上面的行添加到 .bashrc 以使更改永久生效,而不仅限于会话)
视窗:
setx TF_CPP_MIN_LOG_LEVEL "3"
两者都为用户设置了环境变量。
解决方案 19:
对于 Apple M1 或更高版本的 GPU,您需要安装包 silent_tensorflow。
运行以下命令进行安装
python -m pip install silence-tensorflow
然后在代码中添加以下几行
from silence_tensorflow import silence_tensorflow
silence_tensorflow()
解决方案 20:
如果您只需要摆脱屏幕上的警告输出,您可能希望在导入 tensorflow 后立即使用这个简单的命令清除控制台屏幕(根据我的经验,它比禁用所有调试日志更有效):
在 Windows 中:
import os
os.system('cls')
在Linux或Mac中:
import os
os.system('clear')
解决方案 21:
上述解决方案都无法解决我在 Jupyter Notebook 中的问题,因此我使用下面来自Cicoria的代码片段,问题得以解决。
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')
扫码咨询,免费领取项目管理大礼包!