Вимкнути інформацію про налагодження 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
...


Tensorflow все ще є початковим альфа-кодом, і вони все ще розробляють помилки для базової сумісності з numpy та пандами. Отже, щоб вибити ці застереження одним ударом, зробіть import warningsтоді warnings.filterwarnings('ignore'), потім запустіть свій імпорт та тензор, що покладається на порушений код альфа-тензорфлоу, а потім увімкніть попередження через via 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)?
diralik

2
не працює для 1,13 та python3, навіть до імпорту tensorflow
Li haonan

146

Оновлення 2.0 (8.10.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 (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.


повідомлення "Я tensorflow" можуть дратувати, 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

Чи є спосіб перетворити тензорні попередження / помилки в помилки?
CMCDragonkai

1
tf.logging.set_verbosity (tf.logging.ERROR) # або будь-який {DEBUG, INFO, WARN, ERROR, FATAL} працював на мене
Amir Md Amiruzzaman

16

У мене була ця проблема також (увімкнено tensorflow-0.10.0rc0), але не вдалося виправити проблему реєстрації надмірних тестів носа через запропоновані відповіді.

Мені вдалося вирішити це шляхом зондування безпосередньо в тензорфлор-лісоруб. Не найправильніші виправлення, але чудово працюють і лише забруднюють тестові файли, які безпосередньо чи опосередковано імпортують tensorflow:

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

1
Працював для мене, поки рішення TF_CPP_MIN_LOG_LEVEL не зробило. Гарне мислення!
відмовостійкість

Єдине рішення, яке працювало для мене з tensorflow 1.12.
BiBi

Використання 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)

Працював для мене в tensorflow v1.6.0


6

Звичайний менеджер журналів python3 працює для мене з tensorflow == 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
ffeast

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

2

Щоб додати тут деяку гнучкість, ви можете домогтися більш тонкого контролю над рівнем ведення журналу, записавши функцію, яка фільтрує повідомлення, як би ви не хотіли:

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

де my_filter_funcприймає LogRecordоб’єкт як вхід [ 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

для tensorflow 2.1.0 наступний код працює чудово.

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

2

Якщо вам потрібно позбутися лише попереджувальних виходів на екрані , ви, можливо, захочете очистити екран консолі відразу після імпортування tensorflow за допомогою цієї простої команди (Це більш ефективно, ніж відключення всіх журналів налагодження за моїм досвідом):

У вікнах:

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.