From fd722311db70863f680149f4fc7644c96d07644f Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 27 Jul 2025 08:17:41 -0400 Subject: [PATCH] css and logging tweaks Signed-off-by: Vladimir Mandic --- extensions-builtin/sdnext-modernui | 2 +- modules/hidiffusion/__init__.py | 2 +- modules/linfusion/__init__.py | 6 ++++-- modules/processing_diffusers.py | 8 ++++++-- modules/sd_hijack_freeu.py | 2 +- modules/sd_hijack_hypertile.py | 4 ++-- modules/sd_models.py | 8 +------- modules/ui_common.py | 11 ++++++----- scripts/prompt_enhance.py | 8 ++++---- 9 files changed, 26 insertions(+), 25 deletions(-) diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index 0f49bd254..2900b8def 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit 0f49bd2540f443b551795e99aa55659ead336d30 +Subproject commit 2900b8defd8e320179ef0e7f9dd5dd51cfeb9cc1 diff --git a/modules/hidiffusion/__init__.py b/modules/hidiffusion/__init__.py index 8c93d68ef..004d54b33 100644 --- a/modules/hidiffusion/__init__.py +++ b/modules/hidiffusion/__init__.py @@ -34,7 +34,7 @@ def apply(p, model_type): hidiffusion.apply_hidiffusion(pipe, apply_raunet=shared.opts.hidiffusion_raunet, apply_window_attn=shared.opts.hidiffusion_attn, model_type=model_type, steps=p.steps) p.extra_generation_params['HiDiffusion'] = f'{shared.opts.hidiffusion_raunet}/{shared.opts.hidiffusion_attn}/{shared.opts.hidiffusion_steps > 0}:{shared.opts.hidiffusion_steps}' t1 = time.time() - shared.log.debug(f'HiDiffusion apply: raunet={shared.opts.hidiffusion_raunet} attn={shared.opts.hidiffusion_attn} aggressive={shared.opts.hidiffusion_steps > 0}:{shared.opts.hidiffusion_steps} t1={shared.opts.hidiffusion_t1} t2={shared.opts.hidiffusion_t2} time={t1-t0:.2f} type={shared.sd_model_type} width={p.width} height={p.height}') + shared.log.debug(f'Applying HiDiffusion: raunet={shared.opts.hidiffusion_raunet} attn={shared.opts.hidiffusion_attn} aggressive={shared.opts.hidiffusion_steps > 0}:{shared.opts.hidiffusion_steps} t1={shared.opts.hidiffusion_t1} t2={shared.opts.hidiffusion_t2} time={t1-t0:.2f} type={shared.sd_model_type} width={p.width} height={p.height}') def unapply(): diff --git a/modules/linfusion/__init__.py b/modules/linfusion/__init__.py index b263002bb..34495936b 100644 --- a/modules/linfusion/__init__.py +++ b/modules/linfusion/__init__.py @@ -16,6 +16,8 @@ def detect(pipeline): def apply(pipeline, pretrained: bool = True): global applied # pylint: disable=global-statement + if not shared.opts.enable_linfusion: + return if applied is not None: return # linfusion = LinFusion.construct_for(pipeline=pipeline) @@ -31,14 +33,14 @@ def apply(pipeline, pretrained: bool = True): return applied = LinFusion.from_pretrained(model_path, cache_dir=shared.opts.hfcache_dir).to(device=pipeline.unet.device, dtype=pipeline.unet.dtype) applied.mount_to(unet=pipeline.unet) - shared.log.debug(f'LinFusion: apply class={applied.__class__.__name__} model="{model_path}" modules={len(applied.modules_dict)}') + shared.log.info(f'Applying LinFusion: class={applied.__class__.__name__} model="{model_path}" modules={len(applied.modules_dict)}') def unapply(pipeline): global applied # pylint: disable=global-statement if applied is None: return - shared.log.debug('LinFusion: unapply') + # shared.log.debug('LinFusion: unapply') sd_models.set_diffusers_attention(pipeline) devices.torch_gc() applied = None diff --git a/modules/processing_diffusers.py b/modules/processing_diffusers.py index 87a14b3ac..5ed047c2c 100644 --- a/modules/processing_diffusers.py +++ b/modules/processing_diffusers.py @@ -53,7 +53,8 @@ def restore_state(p: processing.StableDiffusionProcessing): def process_pre(p: processing.StableDiffusionProcessing): - from modules import ipadapter, sd_hijack_freeu, para_attention, teacache, hidiffusion, ras, pag, cfgzero, transformer_cache, token_merge + from modules import ipadapter, sd_hijack_freeu, para_attention, teacache, hidiffusion, ras, pag, cfgzero, transformer_cache, token_merge, linfusion + shared.log.info('Processing apply modifiers') try: # apply-with-unapply @@ -64,6 +65,7 @@ def process_pre(p: processing.StableDiffusionProcessing): ras.apply(shared.sd_model, p) pag.apply(p) cfgzero.apply(p) + linfusion.apply(shared.sd_model) # apply-only sd_hijack_freeu.apply_freeu(p) @@ -84,7 +86,8 @@ def process_pre(p: processing.StableDiffusionProcessing): def process_post(p: processing.StableDiffusionProcessing): - from modules import ipadapter, hidiffusion, ras, pag, cfgzero, token_merge + from modules import ipadapter, hidiffusion, ras, pag, cfgzero, token_merge, linfusion + shared.log.info('Processing unapply modifiers') try: sd_models_compile.check_deepcache(enable=False) @@ -94,6 +97,7 @@ def process_post(p: processing.StableDiffusionProcessing): ras.unapply(shared.sd_model) pag.unapply() cfgzero.unapply() + linfusion.unapply(shared.sd_model) except Exception as e: shared.log.error(f'Processing unapply: {e}') errors.display(e, 'unapply') diff --git a/modules/sd_hijack_freeu.py b/modules/sd_hijack_freeu.py index e56ea02ba..9019301e3 100644 --- a/modules/sd_hijack_freeu.py +++ b/modules/sd_hijack_freeu.py @@ -156,4 +156,4 @@ def apply_freeu(p): p.sd_model.disable_freeu() state_enabled = False if shared.opts.freeu_enabled and state_enabled: - shared.log.info(f'Applying free-u: b1={shared.opts.freeu_b1} b2={shared.opts.freeu_b2} s1={shared.opts.freeu_s1} s2={shared.opts.freeu_s2}') + shared.log.info(f'Applying Free-U: b1={shared.opts.freeu_b1} b2={shared.opts.freeu_b2} s1={shared.opts.freeu_s1} s2={shared.opts.freeu_s2}') diff --git a/modules/sd_hijack_hypertile.py b/modules/sd_hijack_hypertile.py index 1cec39012..ec8f0c64f 100644 --- a/modules/sd_hijack_hypertile.py +++ b/modules/sd_hijack_hypertile.py @@ -198,7 +198,7 @@ def context_hypertile_vae(p): else: tile_size = shared.opts.hypertile_vae_tile if shared.opts.hypertile_vae_tile > 0 else max(128, 64 * min(p.width // 128, p.height // 128)) min_tile_size = shared.opts.hypertile_unet_min_tile if shared.opts.hypertile_unet_min_tile > 0 else 128 - shared.log.info(f'Applying hypertile: vae={min_tile_size}/{tile_size}') + shared.log.info(f'Applying HyperTile: vae={min_tile_size}/{tile_size}') p.extra_generation_params['Hypertile VAE'] = tile_size return split_attention(vae, tile_size=tile_size, min_tile_size=min_tile_size, swap_size=shared.opts.hypertile_vae_swap_size) @@ -227,7 +227,7 @@ def context_hypertile_unet(p): else: tile_size = shared.opts.hypertile_unet_tile if shared.opts.hypertile_unet_tile > 0 else max(128, 64 * min(p.width // 128, p.height // 128)) min_tile_size = shared.opts.hypertile_unet_min_tile if shared.opts.hypertile_unet_min_tile > 0 else 128 - shared.log.info(f'Applying hypertile: unet={min_tile_size}/{tile_size}') + shared.log.info(f'Applying HyperTile: unet={min_tile_size}/{tile_size}') p.extra_generation_params['Hypertile UNet'] = tile_size return split_attention(unet, tile_size=tile_size, min_tile_size=min_tile_size, swap_size=shared.opts.hypertile_unet_swap_size, depth=shared.opts.hypertile_unet_depth) diff --git a/modules/sd_models.py b/modules/sd_models.py index 774b903a5..b9e9cfa4f 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -145,12 +145,6 @@ def set_diffuser_options(sd_model, vae=None, op:str='model', offload:bool=True, shared.log.quiet(quiet, f'Setting {op}: fused-qkv=True') except Exception as e: shared.log.error(f'Setting {op}: fused-qkv=True {e}') - if shared.opts.enable_linfusion: - try: - from modules import linfusion - linfusion.apply(sd_model) - except Exception as e: - shared.log.error(f'Setting {op}: LinFusion=True {e}') if shared.opts.diffusers_eval: def eval_model(model, op=None, sd_model=None): # pylint: disable=unused-argument if hasattr(model, "requires_grad_"): @@ -477,7 +471,7 @@ def load_diffuser_file(model_type, pipeline, checkpoint_info, diffusers_load_con from diffusers.utils import import_utils import_utils._accelerate_available = False # pylint: disable=protected-access if shared.opts.diffusers_to_gpu and model_type.startswith('Stable Diffusion'): - shared.log.debug(f'Setting {op}: component=accelerate: direct={shared.opts.diffusers_to_gpu}') + shared.log.debug(f'Setting {op}: component=accelerate direct={shared.opts.diffusers_to_gpu}') sd_hijack_accelerate.hijack_accelerate() else: sd_hijack_accelerate.restore_accelerate() diff --git a/modules/ui_common.py b/modules/ui_common.py index 454775e1b..dfaad5d38 100644 --- a/modules/ui_common.py +++ b/modules/ui_common.py @@ -30,8 +30,8 @@ def update_generation_info(generation_info, html_info, img_index): return html_info, html_info -def plaintext_to_html(text): - res = '

' + "
\n".join([f"{html.escape(x)}" for x in text.split('\n')]) + '

' +def plaintext_to_html(text, elem_classes=[]): + res = f'

' + '
\n'.join([f"{html.escape(x)}" for x in text.split('\n')]) + '

' return res @@ -81,7 +81,7 @@ def delete_files(js_data, files, all_files, index): except Exception as e: shared.log.error(f'Delete: image="{fn}" {e}') deleted = ', '.join(deleted) if len(deleted) > 0 else 'none' - return all_files, plaintext_to_html(f"Deleted: {deleted}") + return all_files, plaintext_to_html(f"Deleted: {deleted}", ['performance']) def save_files(js_data, files, html_info, index): @@ -136,7 +136,6 @@ def save_files(js_data, files, html_info, index): p.infotexts.append(p.infotext) if 'name' in filedata and ('tmp' not in filedata['name']) and os.path.isfile(filedata['name']): fullfn = filedata['name'] - filenames.append(os.path.basename(fullfn)) fullfns.append(fullfn) destination = shared.opts.outdir_save namegen = images.FilenameGenerator(p, seed=p.all_seeds[i], prompt=p.all_prompts[i], image=None) # pylint: disable=no-member @@ -145,6 +144,8 @@ def save_files(js_data, files, html_info, index): destination = namegen.sanitize(destination) os.makedirs(destination, exist_ok = True) tgt_filename = os.path.join(destination, os.path.basename(fullfn)) + relfn = os.path.relpath(tgt_filename, shared.opts.outdir_save) + filenames.append(relfn) if not os.path.exists(tgt_filename): try: shutil.copy(fullfn, destination) @@ -199,7 +200,7 @@ def save_files(js_data, files, html_info, index): with open(fullfns[i], mode="rb") as f: zip_file.writestr(filenames[i], f.read()) fullfns.insert(0, zip_filepath) - return gr.File.update(value=fullfns, visible=True), plaintext_to_html(f"Saved: {filenames[0] if len(filenames) > 0 else 'none'}") + return gr.File.update(value=fullfns, visible=True), plaintext_to_html(f"Saved: {filenames[0] if len(filenames) > 0 else 'none'}", ['performance']) def open_folder(result_gallery, gallery_index = 0): diff --git a/scripts/prompt_enhance.py b/scripts/prompt_enhance.py index 3d27d95a4..eed90501a 100644 --- a/scripts/prompt_enhance.py +++ b/scripts/prompt_enhance.py @@ -9,7 +9,7 @@ import torch import transformers import gradio as gr from PIL import Image -from modules import scripts_manager, shared, devices, errors, processing, sd_models, sd_modules +from modules import scripts_manager, shared, devices, errors, processing, sd_models, sd_modules, timer debug_enabled = os.environ.get('SD_LLM_DEBUG', None) is not None @@ -70,7 +70,7 @@ class Options: }, } # default = list(models)[1] # gemma-3-4b-it - default = 'Qwen/Qwen3-0.6B-FP8' + default = 'google/gemma-3-4b-it' supported = list(transformers.integrations.ggml.GGUF_CONFIG_MAPPING) t2i_prompt: str = 'You are a helpful assistant. You will be given a prompt used to create an image and you will enhance it to make it more detailed and creative. ' i2i_prompt: str = 'You are a helpful assistant. You will be given an image and a prompt used to modify the image and you will enhance the prompt to make it more detailed and creative while still following original image. ' @@ -394,9 +394,8 @@ class Script(scripts_manager.Script): if not is_censored: response = self.clean(response) response = self.post(response, prefix, suffix, networks) - shared.log.info(f'Prompt enhance: model="{model}" mode="{mode}" nsfw={nsfw} time={t1-t0:.2f} inputs={input_len} outputs={outputs.shape[-1] if isinstance(outputs, torch.Tensor) else 0} prompt={len(prompt_text)} response={len(response)}') # Added check for outputs + shared.log.info(f'Prompt enhance: model="{model}" mode="{mode}" nsfw={nsfw} time={t1-t0:.2f} seed={seed} sample={sample} temperature={temperature} penalty={penalty} thinking={thinking} tokens={tokens} inputs={input_len} outputs={outputs.shape[-1] if isinstance(outputs, torch.Tensor) else 0} prompt={len(prompt_text)} response={len(response)}') # Added check for outputs if debug_enabled: - shared.log.trace(f'Prompt enhance: sample={sample} tokens={tokens} temperature={temperature} penalty={penalty} thinking={thinking}') shared.log.trace(f'Prompt enhance: prompt="{prompt_text}"') shared.log.trace(f'Prompt enhance: response="{response}"') self.busy = False @@ -526,5 +525,6 @@ class Script(scripts_manager.Script): thinking=thinking_mode, nsfw=nsfw_mode, ) + timer.process.record('prompt') p.extra_generation_params['LLM'] = llm_model shared.state.end()