diff --git a/CHANGELOG.md b/CHANGELOG.md index aa87a33bb..2bd841510 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ # Change Log for SD.Next -## Update for 2026-09-07 +## Update for 2026-09-08 -### Highlights for 2026-09-07 +### Highlights for 2026-09-08 All-about-optimizations: - improved LoRA performance and quality, especially with quantized models @@ -12,7 +12,7 @@ All-about-optimizations: - compute updates across the board - enhanced cloud model support -### Details for 2026-09-07 +### Details for 2026-09-08 - **Models** - [Anima 2.9B Preview v1](https://huggingface.co/yeoj34760/Anima-2.9B) diff --git a/installer.py b/installer.py index 6da642eec..4e2288cec 100644 --- a/installer.py +++ b/installer.py @@ -409,7 +409,7 @@ def branch(folder=None): b = 'master' else: b = b.split('\n')[0].replace('*', '').strip() - log.debug(f'Git submodule: {folder} / {b}') + log.debug(f'Submodule: folder="{folder}" branch="{b}"') git(f'checkout {b}', folder, ignore=True, optional=True) ts('branch', t_start) return b @@ -1386,7 +1386,10 @@ def install_requirements(): # set environment variables controlling the behavior of various libraries def set_environment(): + log.debug('Setting environment tuning') + from modules.logger import console + log.debug(f'Console: terminal={console.is_terminal} width={console.width} height={console.height} color={console.color_system} legacy={console.legacy_windows}') os.environ.setdefault('ACCELERATE', 'True') os.environ.setdefault('ATTN_PRECISION', 'fp16') os.environ.setdefault('ClDeviceGlobalMemSizeAvailablePercent', '100') @@ -1704,7 +1707,7 @@ def check_version(reset=True): # pylint: disable=unused-argument else: dt = commits["commit"]["commit"]["author"]["date"] commit = commits["commit"]["sha"][:8] - log.info(f'Version: app=sd.next latest={dt} hash={commit} branch={branch_name}') + log.info(f'Version: app="sd.next" latest={dt} hash={commit} branch={branch_name}') except Exception as e: log.error(f'Repository failed to check version: {e} {commits}') ts('latest', t_start) diff --git a/launch.py b/launch.py index 34c007331..06ba83b29 100755 --- a/launch.py +++ b/launch.py @@ -238,7 +238,7 @@ def main(): init_args() # setup argparser and default folders installer.args = args installer.setup_logging(debug=args.debug, trace=args.trace, filename=args.log) - log.info('Starting SD.Next') + log.info('[bold cyan]SD.Next[/]: starting') installer.get_logfile() try: sys.excepthook = installer.custom_excepthook diff --git a/modules/logger.py b/modules/logger.py index 91f9b2327..b9ec471f7 100644 --- a/modules/logger.py +++ b/modules/logger.py @@ -232,20 +232,26 @@ def setup_logging(debug=None, trace=None, filename=None): log.setLevel(logging.DEBUG) # log to file is always at level debug for facility `sd` log.print = rprint + # use only the 16 standard ANSI color names (+ dim/bold modifiers) so the theme renders correctly on basic 16-color terminals too theme = Theme({ "traceback.border": "black", "inspect.value.border": "black", - "traceback.border.syntax_error": "dark_red", - "logging.level.info": "blue_violet", - "logging.level.debug": "orchid", - "logging.level.trace": "dark_blue", - "repr.attrib_name": "bright_cyan", - "repr.attrib_value": "orchid", - "repr.str": "sandy_brown", - "repr.number": "bright_green", - "repr.bool_true": "bright_green", + "traceback.border.syntax_error": "red", + + "logging.level.trace": "dim cyan", + "logging.level.debug": "cyan", + "logging.level.info": "bright_cyan", + "logging.level.warning": "yellow", + "logging.level.error": "red", + "logging.level.critical": "bold bright_red", + + "repr.attrib_name": "bright_white", + "repr.attrib_value": "cyan", + "repr.str": "bright_cyan", + "repr.none": "yellow", + "repr.number": "bright_yellow", + "repr.bool_true": "green", "repr.bool_false": "bright_red", - "repr.values": "bright_cyan", }) Padding.__rich_console__ = override_padding @@ -270,7 +276,7 @@ def setup_logging(debug=None, trace=None, filename=None): log_filter = LogFilter() # handlers - rh = RichHandler(show_time=True, omit_repeated_times=False, show_level=True, show_path=False, markup=False, rich_tracebacks=True, log_time_format='%H:%M:%S-%f', level=level, console=console) + rh = RichHandler(show_time=True, omit_repeated_times=False, show_level=True, show_path=False, markup=True, rich_tracebacks=True, log_time_format='%H:%M:%S-%f', level=level, console=console) if trace: rh.formatter = logging.Formatter('[%(module)s][%(pathname)s:%(lineno)d] %(message)s') rh.addFilter(log_filter) @@ -319,3 +325,12 @@ def setup_logging(debug=None, trace=None, filename=None): logging.getLogger("torch").setLevel(logging.DEBUG) else: logging.getLogger("torch").setLevel(logging.WARNING) + + +if __name__ == "__main__": + setup_logging(debug=True, trace=False, filename=None) + for l in [logging.TRACE, logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, logging.CRITICAL]: + log.log(l, f"Test log level: {logging.getLevelName(l)}") + values = [None, True, False, "yes", "no", "sd.next", 1, 0, 1.0, [1,2,3], {"key": "value"}, (1,2), {1,2}, object()] + for v in values: + log.info(f"Test values: {type(v).__name__}={v}") diff --git a/modules/ui_extra_networks_checkpoints.py b/modules/ui_extra_networks_checkpoints.py index 56eb1b3bf..a7db53fbc 100644 --- a/modules/ui_extra_networks_checkpoints.py +++ b/modules/ui_extra_networks_checkpoints.py @@ -111,6 +111,7 @@ class ExtraNetworksPageCheckpoints(ui_extra_networks.ExtraNetworksPage): primary = tag.split(',')[0].strip() if len(tag) > 0 else '' else: primary = '' + primary = primary.lower() if ('nunchaku' in tag) and (devices.backend != 'cuda' and not shared.cmd_opts.experimental): count['hidden'] += 1 diff --git a/pipelines/model_llada.py b/pipelines/model_llada.py index bd0a1297e..4a0f65f60 100644 --- a/pipelines/model_llada.py +++ b/pipelines/model_llada.py @@ -19,15 +19,21 @@ def load_llada_image(checkpoint_info, diffusers_load_config=None): if repo_id is None or repo_id.lower() == 'none': return None + sdnq_quantize_weights_mode = None + sdnq_quantize_weights_mode_te = None + sdnq_quantize_matmul_mode_te = None if 'Model' in shared.opts.sdnq_quantize_weights: if any(x in shared.opts.sdnq_quantize_weights_mode for x in ['2', '3', '4', '5', '6']): + sdnq_quantize_weights_mode = shared.opts.sdnq_quantize_weights_mode shared.opts.sdnq_quantize_weights_mode = 'uint8' log.warning('LLaDAImage: cls=LLaDAImageTransformer2DModel quant=uint8 override') if 'TE' in shared.opts.sdnq_quantize_weights: if any(x in shared.opts.sdnq_quantize_weights_mode_te for x in ['2', '3', '4', '5', '6']): + sdnq_quantize_weights_mode_te = shared.opts.sdnq_quantize_weights_mode_te shared.opts.sdnq_quantize_weights_mode_te = 'uint8' log.warning('LLaDAImage: cls=LLaDA2MoeModelLM quant=uint8 override') if shared.opts.sdnq_quantize_matmul_mode_te != 'disabled': + sdnq_quantize_matmul_mode_te = shared.opts.sdnq_quantize_matmul_mode_te shared.opts.sdnq_quantize_matmul_mode_te = 'disabled' log.warning('LLaDAImage: cls=LLaDA2MoeModelLM matmul=disabled override') @@ -72,6 +78,14 @@ def load_llada_image(checkpoint_info, diffusers_load_config=None): } # generation_mode = "text", "vq", "editing" + # restore settings post-load + if sdnq_quantize_weights_mode is not None: + shared.opts.sdnq_quantize_weights_mode = sdnq_quantize_weights_mode + if sdnq_quantize_weights_mode_te is not None: + shared.opts.sdnq_quantize_weights_mode_te = sdnq_quantize_weights_mode_te + if sdnq_quantize_matmul_mode_te is not None: + shared.opts.sdnq_quantize_matmul_mode_te = sdnq_quantize_matmul_mode_te + del transformer, text_encoder sd_hijack_te.init_hijack(pipe) sd_hijack_vae.init_hijack(pipe) diff --git a/webui.py b/webui.py index 70b1595d7..731ec5fea 100644 --- a/webui.py +++ b/webui.py @@ -249,7 +249,7 @@ def async_policy(): if shared.cmd_opts.profile: loop.slow_callback_duration = 0.001 loop.set_debug(shared.cmd_opts.profile) - log.debug(f'AsyncIO: loop={loop}') + log.debug(f'AsyncIO: loop={loop.__class__.__name__}') loop.set_task_factory(verbose_task_factory) loop.set_exception_handler(self.handle_exception) return loop