ปิดใช้งานข้อมูลการดีบัก Tensorflow


191

โดยการแก้ไขข้อมูลฉันหมายถึงสิ่งที่ TensorFlow แสดงใน terminal ของฉันเกี่ยวกับห้องสมุดที่โหลดและพบอุปกรณ์ ฯลฯ ไม่ใช่ข้อผิดพลาดของ 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
ปัญหาการติดตาม: github.com/tensorflow/tensorflow/issues/1258
Yaroslav Bulatov

Tensorflow ยังคงเป็นรหัสอัลฟ่าในช่วงต้นและพวกมันยังคงทำงานบั๊กเพื่อใช้งานร่วมกันได้กับ numpy และ pandas ดังนั้นจะเคาะออกคำเตือนเหล่านี้ในการตีเพียงครั้งเดียวไม่import warningsแล้วwarnings.filterwarnings('ignore')แล้วใช้การนำเข้า tensorflow ของคุณและและรหัสที่อาศัยรหัสอัลฟา tensorflow warnings.resetwarnings()เสียแล้วเลี้ยวกลับคำเตือนผ่านทาง Tensorflow ไม่ควรโฆษณาชื่อเวอร์ชั่นเกิน 0.05 ในขณะนี้
Eric Leschinski

คำตอบ:


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 อัปเดต (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ที่กำหนด verbosity ของข้อความบันทึกลายเซ็น - ตัวอย่างเช่น:

# Can also be set using the AUTOGRAPH_VERBOSITY environment variable
tf.autograph.set_verbosity(1)

v0.12 + อัปเดต (5/20/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 ซึ่งใช้ในการสรุป ops, tenorboard, ตัวประมาณต่างๆเป็นต้น

# append to lines above
tf.logging.set_verbosity(tf.logging.ERROR)  # or any {DEBUG, INFO, WARN, ERROR, FATAL}

สำหรับ 1.14 คุณจะได้รับคำเตือนหากคุณไม่เปลี่ยนไปใช้ v1 API ดังต่อไปนี้:

# 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 ขึ้นมาใหม่


ข้อความ "I tensorflow" นั้นน่ารำคาญ tf ควรให้วิธีปิดเสียงพวกเขาโดยใช้ api แทนที่จะสร้างใหม่
นักฟิสิกส์

2
สิ่งนี้สามารถทำได้จากบรรทัดคำสั่ง:export TF_CPP_MIN_LOG_LEVEL="3" && python your_code.py
Andrew Hundt

นอกจากนี้ยังสามารถเรียกใช้เป็น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) แต่ไม่สามารถแก้ไขปัญหาการบันทึกการทดสอบจมูกมากเกินไปผ่านคำตอบที่แนะนำ

ฉันจัดการเพื่อแก้ปัญหานี้โดยการตรวจสอบโดยตรงในเครื่องบันทึกเทนเซอร์กระแส ไม่ใช่การแก้ไขที่ถูกต้องที่สุด แต่ใช้งานได้ดีและมีมลพิษเพียงไฟล์ทดสอบที่นำเข้าเทนทอร์โฟลว์โดยตรงหรือโดยอ้อม:

# 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. พอใจว่าไม่มีคำเตือนหลังจากข้อความเหล่านี้
A.Ametov

15

สำหรับความเข้ากันได้กับ Tensorflow 2.0คุณสามารถใช้tf.get_logger

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

3
ทำงานให้ฉันด้วย tensorflow 1.13.1
Abramodj

1
ทำงานให้ฉันด้วย 1.13.1 โค้ดตัวอย่าง
user1857492

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' (ซึ่งใช้ TF 1.15.0) และ Python 3.7.4
Mohamad Kouhi Moghadam

2

ในการเพิ่มความยืดหยุ่นคุณสามารถควบคุมระดับการบันทึกได้อย่างละเอียดยิ่งขึ้นโดยการเขียนฟังก์ชั่นที่กรองข้อความตามที่คุณต้องการ:

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

โดยที่my_filter_funcรับLogRecordวัตถุเป็นอินพุต [ LogRecordเอกสาร] ] และคืนค่าศูนย์ถ้าคุณต้องการให้ข้อความถูกส่งออกไป ไม่ใช่ศูนย์มิฉะนั้น

ต่อไปนี้เป็นตัวอย่างตัวกรองที่เก็บเฉพาะข้อความข้อมูลทุกลำดับที่ (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

หากคุณต้องการกำจัดเอาต์พุตแจ้งเตือนบนหน้าจอคุณอาจต้องการล้างคอนโซลหน้าจอทันทีหลังจากอิมพอร์ต tenorflow โดยใช้คำสั่งง่าย ๆ นี้ (มีประสิทธิภาพมากกว่าการปิดใช้งานบันทึกการดีบักทั้งหมดในประสบการณ์ของฉัน):

ใน windows:

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') 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.