| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410 |
- # coding=utf-8
- # Copyright 2020 Optuna, Hugging Face
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- """Logging utilities."""
- import functools
- import logging
- import os
- import sys
- import threading
- from logging import (
- CRITICAL, # NOQA
- DEBUG, # NOQA
- ERROR, # NOQA
- FATAL, # NOQA
- INFO, # NOQA
- NOTSET, # NOQA
- WARN, # NOQA
- WARNING, # NOQA
- )
- from logging import captureWarnings as _captureWarnings
- from typing import Optional
- import huggingface_hub.utils as hf_hub_utils
- from tqdm import auto as tqdm_lib
- _lock = threading.Lock()
- _default_handler: Optional[logging.Handler] = None
- log_levels = {
- "detail": logging.DEBUG, # will also print filename and line number
- "debug": logging.DEBUG,
- "info": logging.INFO,
- "warning": logging.WARNING,
- "error": logging.ERROR,
- "critical": logging.CRITICAL,
- }
- _default_log_level = logging.WARNING
- _tqdm_active = not hf_hub_utils.are_progress_bars_disabled()
- def _get_default_logging_level():
- """
- If TRANSFORMERS_VERBOSITY env var is set to one of the valid choices return that as the new default level. If it is
- not - fall back to `_default_log_level`
- """
- env_level_str = os.getenv("TRANSFORMERS_VERBOSITY", None)
- if env_level_str:
- if env_level_str in log_levels:
- return log_levels[env_level_str]
- else:
- logging.getLogger().warning(
- f"Unknown option TRANSFORMERS_VERBOSITY={env_level_str}, "
- f"has to be one of: { ', '.join(log_levels.keys()) }"
- )
- return _default_log_level
- def _get_library_name() -> str:
- return __name__.split(".")[0]
- def _get_library_root_logger() -> logging.Logger:
- return logging.getLogger(_get_library_name())
- def _configure_library_root_logger() -> None:
- global _default_handler
- with _lock:
- if _default_handler:
- # This library has already configured the library root logger.
- return
- _default_handler = logging.StreamHandler() # Set sys.stderr as stream.
- # set defaults based on https://github.com/pyinstaller/pyinstaller/issues/7334#issuecomment-1357447176
- if sys.stderr is None:
- sys.stderr = open(os.devnull, "w")
- _default_handler.flush = sys.stderr.flush
- # Apply our default configuration to the library root logger.
- library_root_logger = _get_library_root_logger()
- library_root_logger.addHandler(_default_handler)
- library_root_logger.setLevel(_get_default_logging_level())
- # if logging level is debug, we add pathname and lineno to formatter for easy debugging
- if os.getenv("TRANSFORMERS_VERBOSITY", None) == "detail":
- formatter = logging.Formatter("[%(levelname)s|%(pathname)s:%(lineno)s] %(asctime)s >> %(message)s")
- _default_handler.setFormatter(formatter)
- library_root_logger.propagate = False
- def _reset_library_root_logger() -> None:
- global _default_handler
- with _lock:
- if not _default_handler:
- return
- library_root_logger = _get_library_root_logger()
- library_root_logger.removeHandler(_default_handler)
- library_root_logger.setLevel(logging.NOTSET)
- _default_handler = None
- def get_log_levels_dict():
- return log_levels
- def captureWarnings(capture):
- """
- Calls the `captureWarnings` method from the logging library to enable management of the warnings emitted by the
- `warnings` library.
- Read more about this method here:
- https://docs.python.org/3/library/logging.html#integration-with-the-warnings-module
- All warnings will be logged through the `py.warnings` logger.
- Careful: this method also adds a handler to this logger if it does not already have one, and updates the logging
- level of that logger to the library's root logger.
- """
- logger = get_logger("py.warnings")
- if not logger.handlers:
- logger.addHandler(_default_handler)
- logger.setLevel(_get_library_root_logger().level)
- _captureWarnings(capture)
- def get_logger(name: Optional[str] = None) -> logging.Logger:
- """
- Return a logger with the specified name.
- This function is not supposed to be directly accessed unless you are writing a custom transformers module.
- """
- if name is None:
- name = _get_library_name()
- _configure_library_root_logger()
- return logging.getLogger(name)
- def get_verbosity() -> int:
- """
- Return the current level for the 🤗 Transformers's root logger as an int.
- Returns:
- `int`: The logging level.
- <Tip>
- 🤗 Transformers has following logging levels:
- - 50: `transformers.logging.CRITICAL` or `transformers.logging.FATAL`
- - 40: `transformers.logging.ERROR`
- - 30: `transformers.logging.WARNING` or `transformers.logging.WARN`
- - 20: `transformers.logging.INFO`
- - 10: `transformers.logging.DEBUG`
- </Tip>"""
- _configure_library_root_logger()
- return _get_library_root_logger().getEffectiveLevel()
- def set_verbosity(verbosity: int) -> None:
- """
- Set the verbosity level for the 🤗 Transformers's root logger.
- Args:
- verbosity (`int`):
- Logging level, e.g., one of:
- - `transformers.logging.CRITICAL` or `transformers.logging.FATAL`
- - `transformers.logging.ERROR`
- - `transformers.logging.WARNING` or `transformers.logging.WARN`
- - `transformers.logging.INFO`
- - `transformers.logging.DEBUG`
- """
- _configure_library_root_logger()
- _get_library_root_logger().setLevel(verbosity)
- def set_verbosity_info():
- """Set the verbosity to the `INFO` level."""
- return set_verbosity(INFO)
- def set_verbosity_warning():
- """Set the verbosity to the `WARNING` level."""
- return set_verbosity(WARNING)
- def set_verbosity_debug():
- """Set the verbosity to the `DEBUG` level."""
- return set_verbosity(DEBUG)
- def set_verbosity_error():
- """Set the verbosity to the `ERROR` level."""
- return set_verbosity(ERROR)
- def disable_default_handler() -> None:
- """Disable the default handler of the HuggingFace Transformers's root logger."""
- _configure_library_root_logger()
- assert _default_handler is not None
- _get_library_root_logger().removeHandler(_default_handler)
- def enable_default_handler() -> None:
- """Enable the default handler of the HuggingFace Transformers's root logger."""
- _configure_library_root_logger()
- assert _default_handler is not None
- _get_library_root_logger().addHandler(_default_handler)
- def add_handler(handler: logging.Handler) -> None:
- """adds a handler to the HuggingFace Transformers's root logger."""
- _configure_library_root_logger()
- assert handler is not None
- _get_library_root_logger().addHandler(handler)
- def remove_handler(handler: logging.Handler) -> None:
- """removes given handler from the HuggingFace Transformers's root logger."""
- _configure_library_root_logger()
- assert handler is not None and handler not in _get_library_root_logger().handlers
- _get_library_root_logger().removeHandler(handler)
- def disable_propagation() -> None:
- """
- Disable propagation of the library log outputs. Note that log propagation is disabled by default.
- """
- _configure_library_root_logger()
- _get_library_root_logger().propagate = False
- def enable_propagation() -> None:
- """
- Enable propagation of the library log outputs. Please disable the HuggingFace Transformers's default handler to
- prevent double logging if the root logger has been configured.
- """
- _configure_library_root_logger()
- _get_library_root_logger().propagate = True
- def enable_explicit_format() -> None:
- """
- Enable explicit formatting for every HuggingFace Transformers's logger. The explicit formatter is as follows:
- ```
- [LEVELNAME|FILENAME|LINE NUMBER] TIME >> MESSAGE
- ```
- All handlers currently bound to the root logger are affected by this method.
- """
- handlers = _get_library_root_logger().handlers
- for handler in handlers:
- formatter = logging.Formatter("[%(levelname)s|%(filename)s:%(lineno)s] %(asctime)s >> %(message)s")
- handler.setFormatter(formatter)
- def reset_format() -> None:
- """
- Resets the formatting for HuggingFace Transformers's loggers.
- All handlers currently bound to the root logger are affected by this method.
- """
- handlers = _get_library_root_logger().handlers
- for handler in handlers:
- handler.setFormatter(None)
- def warning_advice(self, *args, **kwargs):
- """
- This method is identical to `logger.warning()`, but if env var TRANSFORMERS_NO_ADVISORY_WARNINGS=1 is set, this
- warning will not be printed
- """
- no_advisory_warnings = os.getenv("TRANSFORMERS_NO_ADVISORY_WARNINGS", False)
- if no_advisory_warnings:
- return
- self.warning(*args, **kwargs)
- logging.Logger.warning_advice = warning_advice
- @functools.lru_cache(None)
- def warning_once(self, *args, **kwargs):
- """
- This method is identical to `logger.warning()`, but will emit the warning with the same message only once
- Note: The cache is for the function arguments, so 2 different callers using the same arguments will hit the cache.
- The assumption here is that all warning messages are unique across the code. If they aren't then need to switch to
- another type of cache that includes the caller frame information in the hashing function.
- """
- self.warning(*args, **kwargs)
- logging.Logger.warning_once = warning_once
- @functools.lru_cache(None)
- def info_once(self, *args, **kwargs):
- """
- This method is identical to `logger.info()`, but will emit the info with the same message only once
- Note: The cache is for the function arguments, so 2 different callers using the same arguments will hit the cache.
- The assumption here is that all warning messages are unique across the code. If they aren't then need to switch to
- another type of cache that includes the caller frame information in the hashing function.
- """
- self.info(*args, **kwargs)
- logging.Logger.info_once = info_once
- class EmptyTqdm:
- """Dummy tqdm which doesn't do anything."""
- def __init__(self, *args, **kwargs): # pylint: disable=unused-argument
- self._iterator = args[0] if args else None
- def __iter__(self):
- return iter(self._iterator)
- def __getattr__(self, _):
- """Return empty function."""
- def empty_fn(*args, **kwargs): # pylint: disable=unused-argument
- return
- return empty_fn
- def __enter__(self):
- return self
- def __exit__(self, type_, value, traceback):
- return
- class _tqdm_cls:
- def __call__(self, *args, **kwargs):
- if _tqdm_active:
- return tqdm_lib.tqdm(*args, **kwargs)
- else:
- return EmptyTqdm(*args, **kwargs)
- def set_lock(self, *args, **kwargs):
- self._lock = None
- if _tqdm_active:
- return tqdm_lib.tqdm.set_lock(*args, **kwargs)
- def get_lock(self):
- if _tqdm_active:
- return tqdm_lib.tqdm.get_lock()
- tqdm = _tqdm_cls()
- def is_progress_bar_enabled() -> bool:
- """Return a boolean indicating whether tqdm progress bars are enabled."""
- global _tqdm_active
- return bool(_tqdm_active)
- def enable_progress_bar():
- """Enable tqdm progress bar."""
- global _tqdm_active
- _tqdm_active = True
- hf_hub_utils.enable_progress_bars()
- def disable_progress_bar():
- """Disable tqdm progress bar."""
- global _tqdm_active
- _tqdm_active = False
- hf_hub_utils.disable_progress_bars()
|