|
|
import sys |
|
|
|
|
|
from absl import logging |
|
|
|
|
|
from keras.src.api_export import keras_export |
|
|
from keras.src.backend.common import global_state |
|
|
|
|
|
|
|
|
@keras_export( |
|
|
[ |
|
|
"keras.config.enable_interactive_logging", |
|
|
"keras.utils.enable_interactive_logging", |
|
|
] |
|
|
) |
|
|
def enable_interactive_logging(): |
|
|
"""Turn on interactive logging. |
|
|
|
|
|
When interactive logging is enabled, Keras displays logs via stdout. |
|
|
This provides the best experience when using Keras in an interactive |
|
|
environment such as a shell or a notebook. |
|
|
""" |
|
|
global_state.set_global_attribute("interactive_logging", True) |
|
|
|
|
|
|
|
|
@keras_export( |
|
|
[ |
|
|
"keras.config.disable_interactive_logging", |
|
|
"keras.utils.disable_interactive_logging", |
|
|
] |
|
|
) |
|
|
def disable_interactive_logging(): |
|
|
"""Turn off interactive logging. |
|
|
|
|
|
When interactive logging is disabled, Keras sends logs to `absl.logging`. |
|
|
This is the best option when using Keras in a non-interactive |
|
|
way, such as running a training or inference job on a server. |
|
|
""" |
|
|
global_state.set_global_attribute("interactive_logging", False) |
|
|
|
|
|
|
|
|
@keras_export( |
|
|
[ |
|
|
"keras.config.is_interactive_logging_enabled", |
|
|
"keras.utils.is_interactive_logging_enabled", |
|
|
] |
|
|
) |
|
|
def is_interactive_logging_enabled(): |
|
|
"""Check if interactive logging is enabled. |
|
|
|
|
|
To switch between writing logs to stdout and `absl.logging`, you may use |
|
|
`keras.config.enable_interactive_logging()` and |
|
|
`keras.config.disable_interactive_logging()`. |
|
|
|
|
|
Returns: |
|
|
Boolean, `True` if interactive logging is enabled, |
|
|
and `False` otherwise. |
|
|
""" |
|
|
return global_state.get_global_attribute("interactive_logging", True) |
|
|
|
|
|
|
|
|
def set_logging_verbosity(level): |
|
|
"""Sets the verbosity level for logging. |
|
|
|
|
|
Supported log levels are as follows: |
|
|
|
|
|
- `"FATAL"` (least verbose) |
|
|
- `"ERROR"` |
|
|
- `"WARNING"` |
|
|
- `"INFO"` |
|
|
- `"DEBUG"` (most verbose) |
|
|
|
|
|
Args: |
|
|
level: A string corresponding to the level of verbosity for logging. |
|
|
""" |
|
|
valid_levels = { |
|
|
"FATAL": logging.FATAL, |
|
|
"ERROR": logging.ERROR, |
|
|
"WARNING": logging.WARNING, |
|
|
"INFO": logging.INFO, |
|
|
"DEBUG": logging.DEBUG, |
|
|
} |
|
|
verbosity = valid_levels.get(level) |
|
|
if verbosity is None: |
|
|
raise ValueError( |
|
|
"Please pass a valid level for logging verbosity. " |
|
|
f"Expected one of: {set(valid_levels.keys())}. " |
|
|
f"Received: {level}" |
|
|
) |
|
|
logging.set_verbosity(verbosity) |
|
|
|
|
|
|
|
|
def print_msg(message, line_break=True): |
|
|
"""Print the message to absl logging or stdout.""" |
|
|
message = str(message) |
|
|
if is_interactive_logging_enabled(): |
|
|
message = message + "\n" if line_break else message |
|
|
try: |
|
|
sys.stdout.write(message) |
|
|
except UnicodeEncodeError: |
|
|
|
|
|
|
|
|
|
|
|
message = _replace_special_unicode_character(message) |
|
|
message_bytes = message.encode(sys.stdout.encoding, errors="ignore") |
|
|
message = message_bytes.decode(sys.stdout.encoding) |
|
|
sys.stdout.write(message) |
|
|
sys.stdout.flush() |
|
|
else: |
|
|
logging.info(message) |
|
|
|
|
|
|
|
|
def ask_to_proceed_with_overwrite(filepath): |
|
|
"""Produces a prompt asking about overwriting a file. |
|
|
|
|
|
Args: |
|
|
filepath: the path to the file to be overwritten. |
|
|
|
|
|
Returns: |
|
|
True if we can proceed with overwrite, False otherwise. |
|
|
""" |
|
|
overwrite = ( |
|
|
input(f"[WARNING] {filepath} already exists - overwrite? [y/n]") |
|
|
.strip() |
|
|
.lower() |
|
|
) |
|
|
while overwrite not in ("y", "n"): |
|
|
overwrite = ( |
|
|
input('Enter "y" (overwrite) or "n" (cancel).').strip().lower() |
|
|
) |
|
|
if overwrite == "n": |
|
|
return False |
|
|
print_msg("[TIP] Next time specify overwrite=True!") |
|
|
return True |
|
|
|
|
|
|
|
|
def _replace_special_unicode_character(message): |
|
|
message = str(message).replace("━", "=") |
|
|
return message |
|
|
|