【问题标题】:Disable Tensorflow debugging information禁用 TensorFlow 调试信息
【发布时间】:2025-12-11 03:20:16
【问题描述】:

我所说的调试信息是指 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 warnings,然后执行warnings.filterwarnings('ignore'),然后运行您的 tensorflow 导入和依赖于损坏的 alpha-tensorflow 代码的代码,然后通过 warnings.resetwarnings() 重新打开警告。目前,Tensorflow 不应宣传超过 0.05 的版本名称。

标签: python tensorflow


【解决方案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

【讨论】:

  • 不适用于 1.13 和 python3,甚至在导入 tensorflow 之前
  • 在 TF2.0.0 上唯一对我有用的解决方案只有在导入 tensorflow 之前放置时才有效
  • 适用于 TF2.0 和 Python 3。在导入 tensorflow 之前导入 os。
  • 即使在将 tf 2.4.1 和 python 3.7 添加到导入 tensorflow 之前也无法正常工作
  • 这并没有得到一切。有没有办法甚至停止所有 tensorflow 输出,甚至是插件消息,例如“金属设备设置为:Apple M1”?
【解决方案2】:

2.0 更新(2019 年 10 月 8 日) 设置TF_CPP_MIN_LOG_LEVEL 应该仍然有效(请参阅下面的 v0.12+ 更新),但目前存在一个问题(请参阅issue #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+ 中,根据 issue,您现在可以通过名为 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 的通用操作系统示例:

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 日志记录的信息;通过新的更新,您可以将日志记录详细程度设置为 DEBUGINFOWARNERRORFATAL。例如:

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

该页面还包含可与 TF-Learn 模型一起使用的监视器。 Here is the page.

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

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

其他的请看this answer,涉及修改源码和重建TensorFlow。

【讨论】:

  • “I tensorflow”消息可能很烦人,tf 应该提供一些使用 api 而不是重建的方式来使它们静音
  • 这也可以从命令行完成:export TF_CPP_MIN_LOG_LEVEL="3" && python your_code.py
  • 也可以运行TF_CPP_MIN_LOG_LEVEL="3" python your_code.py
  • 有没有办法将 tensorflow 警告/错误变成错误?
  • tf.logging.set_verbosity(tf.logging.ERROR) # 或任何 {DEBUG, INFO, WARN, ERROR, FATAL} 对我有用
【解决方案3】:

为了兼容Tensorflow 2.0,可以使用tf.get_logger

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

【讨论】:

  • 使用 tensorflow 1.13.1 为我工作
  • 使用 1.13.1 为我工作。 Sample code.
  • 也可以作为字符串使用tf.get_logger().setLevel('ERROR')
  • 这是解决我关于 0 渐变的错误的唯一方法
  • 在 jupyter notebook 中这对我有用。
【解决方案4】:

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

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

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

【讨论】:

  • 为我工作,而 TF_CPP_MIN_LOG_LEVEL 解决方案没有。好主意!
  • 唯一适用于 tensorflow 1.12 的解决方案。
  • 使用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. 这些消息之后没有任何警告
【解决方案5】:

TF_CPP_MIN_LOG_LEVEL 对我不起作用,你可以试试:

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

在 tensorflow v1.6.0 中为我工作

【讨论】:

    【解决方案6】:

    对于仍在努力让os.environ 解决方案像我一样工作的人,请检查它是否放置在之前您在脚本中导入tensorflow,就像 mwweb 的回答一样:

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

    【讨论】:

    • 仅适用于 tensorflow-2.4.1
    【解决方案7】:

    我用这个帖子 Cannot remove all warnings #27045 解决了,解决方法是:

    import logging
    logging.getLogger('tensorflow').disabled = True
    

    【讨论】:

    • 在 tf 导入期间对 FutureWarnings 不起作用,tf=1.13.1 py3
    • 只有这个对我有用!我的配置:Keras '2.2.4'(使用 tf 1.15.0)和 Python 3.7.4
    【解决方案8】:

    我使用的是 Tensorflow 2.3.1 版,上述解决方案均未完全有效。
    直到,我找到了this 包。

    像这样安装:

    与 Anaconda,

    python -m pip install silence-tensorflow
    

    使用 IDE,

    pip install silence-tensorflow
    

    并添加到第一行代码:

    from silence_tensorflow import silence_tensorflow
    silence_tensorflow()
    

    就是这样!

    【讨论】:

      【解决方案9】:

      通常的 python3 日志管理器适用于 tensorflow==1.11.0:

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

      【讨论】:

        【解决方案10】:

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

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

        【讨论】:

          【解决方案11】:

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

          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() 来确保这一点没有副作用。

          【讨论】:

            【解决方案12】:

            是的,我正在使用 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)
            

            【讨论】:

              【解决方案13】:

              我为此苦苦挣扎了一段时间,在这里尝试了几乎所有的解决方案,但无法摆脱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
              

              调试信息仍然出现,最终帮助我重新启动了我的电脑(实际上重新启动内核应该可以工作)。因此,如果有人遇到类似问题,请在设置环境变量后尝试重新启动内核,简单但可能不会想到。

              【讨论】:

                【解决方案14】:

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

                在窗口中:

                import os
                os.system('cls')
                

                在 Linux 或 Mac 中:

                import os
                os.system('clear')
                

                【讨论】:

                • 1.不,不是更有效。 2.是否存在潜在的安全风险。 3. 你不应该为这样的任务调用系统。 4. 如这里的许多答案所述,有更好的方法来做到这一点。
                【解决方案15】:

                以上解决方案都不能解决我在 Jupyter Notebook 中的问题,所以我使用下面来自Cicoria 的 sn-p 代码,问题就解决了。

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

                【讨论】: