Отключить отладочную информацию 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
...
Ответы
Ответ 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 (08.10.19)
Настройка 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+ Обновление (20.05.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:
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 вы будете получать предупреждения, если не переключитесь на использование API v1 следующим образом:
# 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-0.10.0rc0
), но я не мог исправить проблему регистрации журналов чрезмерного носа с помощью предлагаемых ответов.
Мне удалось решить это, прощупывая непосредственно в регистратор тензорного потока. Не самый правильный из исправлений, но отлично работает и только загрязняет тестовые файлы, которые прямо или косвенно импортируют shadoworflow:
# Place this before directly or indirectly importing tensorflow
import logging
logging.getLogger("tensorflow").setLevel(logging.WARNING)
Ответ 4
Для совместимости с Tensorflow 2.0 вы можете использовать tf.get_logger
import logging
tf.get_logger().setLevel(logging.ERROR)
Ответ 5
Поскольку TF_CPP_MIN_LOG_LEVEL
не работает для меня, вы можете попробовать:
tf.logging.set_verbosity(tf.logging.WARN)
У меня работало в tenorflow v1.6.0
Ответ 6
Обычный менеджер журналов python3 у меня работает с tenorflow == 1.11.0:
import logging
logging.getLogger('tensorflow').setLevel(logging.INFO)
Ответ 7
Чтобы добавить здесь некоторую гибкость, вы можете добиться более детального контроля над уровнем ведения журнала, написав функцию, которая отфильтровывает сообщения так, как вам нравится:
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()
перед добавлением фильтра.
Ответ 8
Да, я использую 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)
Ответ 9
Я решил с помощью этого поста Не могу удалить все предупреждения # 27045, и решение было:
import logging
logging.getLogger('tensorflow').disabled = True