diff --git a/CHANGELOG.md b/CHANGELOG.md index c0e649f11..4d4fddab9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,8 @@ - **Internal** - refactor `pip` installer, thanks @awsr - remove obsolete `lora` stepwise and functional code, thanks @awsr + - interrupt model loading between components + - patch `rich` for cleaner exception logging - **Fixes** - add missing `jquery` and `sparkline` js scripts - save handle already decoded images diff --git a/modules/logger.py b/modules/logger.py index 89f5a2277..d912a4cfe 100644 --- a/modules/logger.py +++ b/modules/logger.py @@ -62,11 +62,28 @@ def install_traceback(suppress: list | None = None): -_log_config = {'debug': False, 'trace': False, 'log_filename': None} +_log_config = {'debug': False, 'trace': False, 'log_filename': None, 'traceback_panel_patched': False} def setup_logging(debug=None, trace=None, filename=None): global log_file, console, log_rolled # pylint: disable=global-statement + def patch_traceback_panel(): + # Rich traceback always wraps output in Panel; replace only traceback-local Panel with passthrough. + if str_to_bool(os.environ.get("SD_TRACEBOX", False)): + return + try: + import rich.traceback as rich_traceback + if _log_config['traceback_panel_patched']: + return + + def _panel_passthrough(renderable, *args, **kwargs): # pylint: disable=unused-argument + return renderable + + rich_traceback.Panel = _panel_passthrough + _log_config['traceback_panel_patched'] = True + except Exception: + pass + if debug is not None: _log_config['debug'] = debug if trace is not None: @@ -177,6 +194,7 @@ def setup_logging(debug=None, trace=None, filename=None): Padding.__rich_console__ = override_padding box.ROUNDED = box.SIMPLE + patch_traceback_panel() console = Console( log_time=True, log_time_format='%H:%M:%S-%f', diff --git a/pipelines/generic.py b/pipelines/generic.py index 523d24ce3..ca81703ce 100644 --- a/pipelines/generic.py +++ b/pipelines/generic.py @@ -20,6 +20,8 @@ def _loader(component): def load_transformer(repo_id, cls_name, load_config=None, subfolder="transformer", allow_quant=True, variant=None, dtype=None, modules_to_not_convert=None, modules_dtype_dict=None): + if shared.state.interrupted: + return None transformer = None if load_config is None: load_config = {} @@ -101,6 +103,8 @@ def load_transformer(repo_id, cls_name, load_config=None, subfolder="transformer def load_text_encoder(repo_id, cls_name, load_config=None, subfolder="text_encoder", allow_quant=True, allow_shared=True, variant=None, dtype=None, modules_to_not_convert=None, modules_dtype_dict=None): + if shared.state.interrupted: + return None text_encoder = None if load_config is None: load_config = {} @@ -253,6 +257,8 @@ def load_text_encoder(repo_id, cls_name, load_config=None, subfolder="text_encod def load_vae_override(pipe, load_config=None, override_cls=None, override_args={}): + if shared.state.interrupted: + return None if (shared.opts.sd_vae in [None, 'None', 'Default', 'Automatic']): return if (pipe is None) or (getattr(pipe, 'vae', None) is None):