Отключить отладочную информацию 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')