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


191

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

5

Tensorflow - все еще ранний альфа-код, и они все еще работают над ошибками для базовой совместимости с numpy и пандами. Таким образом , чтобы выбить эти предупреждения в один ударе, делать import warningsто warnings.filterwarnings('ignore'), а затем запускать импорт tensorflow и и код , который зависит от разбитого кода альфа-tensorflow, затем включите предупреждения обратно на помощь warnings.resetwarnings(). На данный момент Tensorflow не должен рекламировать название версии более 0,05.
Эрик Лещинский

Ответы:


214

Вы можете отключить все журналы отладки, используя 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

Это работает, но удаляет временную метку перед журналами - как это снова включить?
DreamFlasher

Что означают эти уровни (0, 1, 2, 3)?
Диралик

2
не работает для 1.13 и python3, даже до импорта тензорного потока
Ли Хаонан

146

Обновление 2.0 (10/8/19) Настройка TF_CPP_MIN_LOG_LEVELдолжна работать (см. Ниже в v0.12 + обновление), но в настоящее время существует открытая проблема (см. Проблема # 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

Чтобы быть точным, вы также можете установить уровень для tf_loggingмодуля Python , который используется, например, в сводных операциях, тензорной доске, различных оценках и т. Д.

# 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.


сообщения «I tenorflow» могут раздражать, поэтому tf должен обеспечить способ заставить их замолчать, используя api вместо восстановления
физик

2
Это также можно сделать из командной строки:export TF_CPP_MIN_LOG_LEVEL="3" && python your_code.py
Эндрю Хандт

Это может также быть выполнено какTF_CPP_MIN_LOG_LEVEL="3" python your_code.py
craymichael

Есть ли способ превратить предупреждения / ошибки tenorflow в ошибки?
CMCDragonkai

1
tf.logging.set_verbosity (tf.logging.ERROR) # или любой {DEBUG, INFO, WARN, ERROR, FATAL} работал на меня
Амир Md Амируззаман

16

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

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

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

1
Работал на меня, а решение TF_CPP_MIN_LOG_LEVEL - нет. Хорошая мысль!
отказоустойчивый

Единственное решение, которое работало для меня с tenorflow 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. Приятно, что после этих сообщений не было никаких предупреждений
А.Аметов


10

Поскольку 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)

4

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

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

3
не работает для FutureWarnings во время импорта tf, tf = 1.13.1 py3
праздник

2
Только это работает для меня! Моя конфигурация: Keras '2.2.4' (который использует tf 1.15.0) и Python 3.7.4
Mohamad Kouhi Moghadam

2

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

logging.getLogger('tensorflow').addFilter(my_filter_func)

где my_filter_funcпринимает LogRecordобъект как input [ LogRecorddocs ] и возвращает ноль, если вы хотите, чтобы сообщение было выброшено; ненулевое в противном случае.

Вот пример фильтра, который хранит только каждое 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()перед добавлением фильтра.


2

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

2

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

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

2

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

В окнах:

import os
os.system('cls')

В Linux или Mac:

import os
os.system('clear')

0

Ни одно из приведенных выше решений не может решить мою проблему в 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') 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.