Отключить отладочную информацию Tensorflow

Под отладочной информацией я имею в виду то, что 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
...

20 ответов

Вы можете отключить все журналы отладки, используя os.environ:

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

Протестировано на TF 0,12 и 1,0

Обновление 1.0+ (20.05.17):

В TensorFlow 0.12+ для этой проблемы теперь вы можете контролировать ведение журнала через переменную среды, которая называется TF_CPP_MIN_LOG_LEVEL; по умолчанию он равен 0 (показаны все журналы), но может быть установлен в 1 для фильтрации INFO журналы, 2 для дополнительной фильтрации WARNING журналы и 3 для дополнительной фильтрации ERROR журналы. Смотрите следующий общий пример ОС с использованием Python:

import os
import tensorflow as tf

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

Предыдущие версии журналов TensorFlow или TF-Learn см. В следующих статьях:

Посмотрите страницу ниже для получения информации о ведении журнала 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.

Вы могли бы испытать желание использовать tf.get_logger для совместимости с Tensorflow 2.0

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

но это не сработало для меня.

У меня тоже была эта проблема (на tensorflow-0.10.0rc0), но не удалось решить проблему регистрации чрезмерных тестов носа с помощью предложенных ответов.

Мне удалось решить это, исследуя непосредственно в регистраторе tenorflow. Не самое правильное из исправлений, но прекрасно работает и только загрязняет тестовые файлы, которые прямо или косвенно импортируют tenorflow:

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

Я использую Tensorflow версии 2.3.1, и ни одно из приведенных выше решений не было полностью эффективным.
Пока не найду этот пакет.

Установите так:

с Анакондой,

      python -m pip install silence-tensorflow

с интегрированными средами разработки,

      pip install silence-tensorflow

И добавьте в первую строку кода:

      from silence_tensorflow import silence_tensorflow
silence_tensorflow()

Это оно!

Всем, кто все еще пытается получить os.environрешение работать так же, как и я, убедитесь, что оно размещено перед импортом tensorflow в вашем скрипте, как и ответ mwweb:

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

Я решил с этим сообщением Невозможно удалить все предупреждения #27045, и решение было:

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

Как TF_CPP_MIN_LOG_LEVEL не работает для меня, вы можете попробовать:

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

У меня работало в tenorflow v1.6.0

Обычный менеджер логов python3 работает для меня с tenorflow==1.11.0:

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

Для tensorflow 2.1.0 следующий код работает нормально.

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

Просто запустите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

Отказ от ответственности: я не являюсь автором этого пакета.

Чтобы добавить здесь некоторую гибкость, вы можете добиться более детального контроля над уровнем ведения журнала, написав функцию, которая отфильтровывает сообщения так, как вам нравится:

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() перед добавлением фильтра.

В блокнотах Jupyter вы можете использовать%envмагическая команда:

      %env TF_CPP_MIN_LOG_LEVEL=3
import tensorflow as tf

Да, я использую 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)

Если вам нужно только избавиться от вывода предупреждений на экране, вы можете очистить экран консоли сразу после импорта тензорного потока с помощью этой простой команды (по моему опыту, это более эффективно, чем отключение всех журналов отладки):

В окнах:

import os
os.system('cls')

В Linux или Mac:

import os
os.system('clear')

После тестирования различных предложений, чтобы они также могли отключить результирующий исполняемый файл, созданный с помощью 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) для использования следующих инструкций ЦП в операциях, критически важных для производительности: AVX2 FMA. Чтобы включить их в других операциях, перестройте TensorFlow с соответствующими флагами компилятора.

Линия

      logging.getLogger('tensorflow').setLevel(logging.ERROR)

отключит предупреждение об AutoGraph:

ПРЕДУПРЕЖДЕНИЕ:tensorflow:AutoGraph недоступен в этой среде: функциям не хватает информации о коде. Это типично для некоторых сред, таких как интерактивная оболочка Python. См. https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/autograph/g3doc/reference/limitations.md#access-to-source-code для получения дополнительной информации.

Ключевым моментом является размещение этих двух перед импортом Tensorflow, несмотря на предупреждение Pylint!

тензорный поток 2.11.0

Какое-то время я боролся с этим, перепробовал почти все решения здесь, но не смог избавиться от информации об отладке в , я пробовал следующие несколько решений:

      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

Информация об отладке все еще появлялась, что, наконец, помогло, так это перезагрузка моего компьютера (на самом деле перезапуск ядра должен работать). Поэтому, если у кого-то есть похожая проблема, попробуйте перезапустить ядро ​​​​после того, как вы установите переменные среды, это просто, но может не прийти в голову.

У меня это отлично сработало, чтобы отключить все логи

      import logging, os

logging.disable(logging.WARNING)
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3"

import tensorflow as tf

Большинство ответов здесь работают, но вы должны использовать их каждый раз, когда открываете новый сеанс (например, с JupyterLab). Чтобы изменения закрепились, вы должны установить переменную среды.

Линукс:

      export TF_CPP_MIN_LOG_LEVEL="3"

(Также добавьте приведенную выше строку в .bashrc, чтобы сделать изменение постоянным, а не только для сеанса)

Окна:

      setx TF_CPP_MIN_LOG_LEVEL "3"

Оба устанавливают переменные среды для пользователя.

Ни одно из приведенных выше решений не может решить мою проблему в 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') 
Другие вопросы по тегам