From 09d1f1e788366c64db16fcaff418800b59877f24 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 31 Jan 2024 09:51:34 -0500 Subject: [PATCH] add sa solver and prototype instaflow --- CHANGELOG.md | 9 +- extensions-builtin/sd-webui-controlnet | 2 +- html/reference.json | 5 + .../XCLiu--instaflow_0_9B_from_sd_1_5.jpg | Bin 0 -> 64721 bytes modules/modeldata.py | 4 +- modules/processing_diffusers.py | 6 +- modules/sd_models.py | 133 +++++++++--------- modules/sd_samplers_diffusers.py | 26 ++-- modules/shared.py | 2 +- modules/shared_items.py | 1 + modules/ui_extra_networks.py | 4 +- modules/ui_extra_networks_checkpoints.py | 2 + 12 files changed, 108 insertions(+), 86 deletions(-) create mode 100644 models/Reference/XCLiu--instaflow_0_9B_from_sd_1_5.jpg diff --git a/CHANGELOG.md b/CHANGELOG.md index a71cd777b..16d047321 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,13 +8,11 @@ BLOCKERS: OPTIONAL: - pending `diffusers==0.26.0` - wuerstchen v3 [pr](https://github.com/huggingface/diffusers/pull/6487) -- style aligned [pr](https://github.com/huggingface/diffusers/pull/6489) -- instaflow [pr](https://github.com/huggingface/diffusers/pull/6057)[repo](https://github.com/gnobitab/RectifiedFlow) - control api - masking api - preprocess api -## Update for 2023-01-30 +## Update for 2023-01-31 Another big release, highlights being: - A lot more functionality in the **Control** module: @@ -133,6 +131,10 @@ As of this release, default backend is set to **diffusers** as its more feature - requires input image - last word in prompt and negative prompt will be used as source and target subjects - sampler must be set to default before loading the model +- [InstaFlow](https://github.com/gnobitab/InstaFlow) + - another take on super-fast image generation in a single step + - set sampler:default steps:1 + - load from networks -> models -> reference - **Improvements** - **ui** - check version and **update** SD.Next via UI @@ -183,6 +185,7 @@ As of this release, default backend is set to **diffusers** as its more feature for example, you can now deploy a zip of the sdnext folder - **latent upscale**: updated latent upscalers (some are new) *nearest, nearest-exact, area, bilinear, bicubic, bilinear-antialias, bicubic-antialias* + - **scheduler**: added `SA Solver` - **model load to gpu** new option in settings->diffusers allowing models to be loaded directly to GPU while keeping RAM free this option is not compatible with any kind of model offloading as model is expected to stay in GPU diff --git a/extensions-builtin/sd-webui-controlnet b/extensions-builtin/sd-webui-controlnet index c5432dd4f..0ee028117 160000 --- a/extensions-builtin/sd-webui-controlnet +++ b/extensions-builtin/sd-webui-controlnet @@ -1 +1 @@ -Subproject commit c5432dd4f605ff5ddc63a6b477d8df68654ea65c +Subproject commit 0ee028117891e7b4b95a056a5c5aaeb1f02bc744 diff --git a/html/reference.json b/html/reference.json index 6aa309e8e..b4b46db1c 100644 --- a/html/reference.json +++ b/html/reference.json @@ -168,5 +168,10 @@ "path": "salesforce/blipdiffusion", "desc": "BLIP-Diffusion, a new subject-driven image generation model that supports multimodal control which consumes inputs of subject images and text prompts. Unlike other subject-driven generation models, BLIP-Diffusion introduces a new multimodal encoder which is pre-trained to provide subject representation.", "preview": "salesforce--blipdiffusion.jpg" + }, + "InstaFlow 0.9B": { + "path": "XCLiu/instaflow_0_9B_from_sd_1_5", + "desc": "InstaFlow is an ultra-fast, one-step image generator that achieves image quality close to Stable Diffusion. This efficiency is made possible through a recent Rectified Flow technique, which trains probability flows with straight trajectories, hence inherently requiring only a single step for fast inference.", + "preview": "XCLiu--instaflow_0_9B_from_sd_1_5.jpg" } } \ No newline at end of file diff --git a/models/Reference/XCLiu--instaflow_0_9B_from_sd_1_5.jpg b/models/Reference/XCLiu--instaflow_0_9B_from_sd_1_5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2bad1f892541fbf071fee1a01401b7642373d49e GIT binary patch literal 64721 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 F|JhmngH-?k literal 0 HcmV?d00001 diff --git a/modules/modeldata.py b/modules/modeldata.py index d04ac2b52..dc32fdea1 100644 --- a/modules/modeldata.py +++ b/modules/modeldata.py @@ -84,8 +84,10 @@ class Shared(sys.modules[__name__].__class__): model_type = 'sd' elif "LatentConsistencyModel" in self.sd_model.__class__.__name__: model_type = 'sd' # lcm is compatible with sd + elif "InstaFlowPipeline" in self.sd_model.__class__.__name__: + model_type = 'sd' # instaflow is compatible with sd elif "AnimateDiffPipeline" in self.sd_model.__class__.__name__: - model_type = 'sd' # ad is compatible with sd + model_type = 'sd' # sd is compatible with sd elif "Kandinsky" in self.sd_model.__class__.__name__: model_type = 'kandinsky' else: diff --git a/modules/processing_diffusers.py b/modules/processing_diffusers.py index b09518cbf..b8e58d828 100644 --- a/modules/processing_diffusers.py +++ b/modules/processing_diffusers.py @@ -442,7 +442,7 @@ def process_diffusers(p: processing.StableDiffusionProcessing): else: steps = p.steps debug_steps(f'Steps: type=base input={p.steps} output={steps} task={sd_models.get_diffusers_task(shared.sd_model)} refiner={use_refiner_start} denoise={p.denoising_strength} model={shared.sd_model_type}') - return max(2, int(steps)) + return max(1, int(steps)) def calculate_hires_steps(): if p.hr_second_pass_steps > 0: @@ -452,7 +452,7 @@ def process_diffusers(p: processing.StableDiffusionProcessing): else: steps = 0 debug_steps(f'Steps: type=hires input={p.hr_second_pass_steps} output={steps} denoise={p.denoising_strength} model={shared.sd_model_type}') - return max(2, int(steps)) + return max(1, int(steps)) def calculate_refiner_steps(): if "StableDiffusionXL" in shared.sd_refiner.__class__.__name__: @@ -467,7 +467,7 @@ def process_diffusers(p: processing.StableDiffusionProcessing): #steps = p.refiner_steps # SD 1.5 with denoise strenght steps = (p.refiner_steps * 1.25) + 1 debug_steps(f'Steps: type=refiner input={p.refiner_steps} output={steps} start={p.refiner_start} denoise={p.denoising_strength}') - return max(2, int(steps)) + return max(1, int(steps)) shared.sd_model = update_pipeline(shared.sd_model, p) base_args = set_pipeline_args( diff --git a/modules/sd_models.py b/modules/sd_models.py index 7fc92be8f..fe0add649 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -536,52 +536,48 @@ def change_backend(): def detect_pipeline(f: str, op: str = 'model', warning=True): - if not f.endswith('.safetensors'): - return None, None guess = shared.opts.diffusers_pipeline warn = shared.log.warning if warning else lambda *args, **kwargs: None + size = 0 if guess == 'Autodetect': try: + guess = 'Stable Diffusion XL' if 'XL' in f.upper() else 'Stable Diffusion' # guess by size - size = round(os.path.getsize(f) / 1024 / 1024) - if size < 128: - warn(f'Model size smaller than expected: {f} size={size} MB') - elif (size >= 316 and size <= 324) or (size >= 156 and size <= 164): # 320 or 160 - warn(f'Model detected as VAE model, but attempting to load as model: {op}={f} size={size} MB') - guess = 'VAE' - elif size >= 5351 and size <= 5359: # 5353 - guess = 'Stable Diffusion' # SD v2 - elif size >= 5791 and size <= 5799: # 5795 - if shared.backend == shared.Backend.ORIGINAL: - warn(f'Model detected as SD-XL refiner model, but attempting to load using backend=original: {op}={f} size={size} MB') - if op == 'model': - warn(f'Model detected as SD-XL refiner model, but attempting to load a base model: {op}={f} size={size} MB') - guess = 'Stable Diffusion XL' - elif (size >= 6611 and size <= 7220): # 6617, HassakuXL is 6776, monkrenRealisticINT_v10 is 7217 - if shared.backend == shared.Backend.ORIGINAL: - warn(f'Model detected as SD-XL base model, but attempting to load using backend=original: {op}={f} size={size} MB') - guess = 'Stable Diffusion XL' - elif size >= 3361 and size <= 3369: # 3368 - if shared.backend == shared.Backend.ORIGINAL: - warn(f'Model detected as SD upscale model, but attempting to load using backend=original: {op}={f} size={size} MB') - guess = 'Stable Diffusion Upscale' - elif size >= 4891 and size <= 4899: # 4897 - if shared.backend == shared.Backend.ORIGINAL: - warn(f'Model detected as SD XL inpaint model, but attempting to load using backend=original: {op}={f} size={size} MB') - guess = 'Stable Diffusion XL Inpaint' - elif size >= 9791 and size <= 9799: # 9794 - if shared.backend == shared.Backend.ORIGINAL: - warn(f'Model detected as SD XL instruct pix2pix model, but attempting to load using backend=original: {op}={f} size={size} MB') - guess = 'Stable Diffusion XL Instruct' - elif size > 3138 and size < 3142: #3140 - if shared.backend == shared.Backend.ORIGINAL: - warn(f'Model detected as Segmind Vega model, but attempting to load using backend=original: {op}={f} size={size} MB') - guess = 'Stable Diffusion XL' - else: - if 'XL' in f.upper(): + if os.path.isfile(f) and f.endswith('.safetensors'): + size = round(os.path.getsize(f) / 1024 / 1024) + if size < 128: + warn(f'Model size smaller than expected: {f} size={size} MB') + elif (size >= 316 and size <= 324) or (size >= 156 and size <= 164): # 320 or 160 + warn(f'Model detected as VAE model, but attempting to load as model: {op}={f} size={size} MB') + guess = 'VAE' + elif size >= 5351 and size <= 5359: # 5353 + guess = 'Stable Diffusion' # SD v2 + elif size >= 5791 and size <= 5799: # 5795 + if shared.backend == shared.Backend.ORIGINAL: + warn(f'Model detected as SD-XL refiner model, but attempting to load using backend=original: {op}={f} size={size} MB') + if op == 'model': + warn(f'Model detected as SD-XL refiner model, but attempting to load a base model: {op}={f} size={size} MB') + guess = 'Stable Diffusion XL' + elif (size >= 6611 and size <= 7220): # 6617, HassakuXL is 6776, monkrenRealisticINT_v10 is 7217 + if shared.backend == shared.Backend.ORIGINAL: + warn(f'Model detected as SD-XL base model, but attempting to load using backend=original: {op}={f} size={size} MB') + guess = 'Stable Diffusion XL' + elif size >= 3361 and size <= 3369: # 3368 + if shared.backend == shared.Backend.ORIGINAL: + warn(f'Model detected as SD upscale model, but attempting to load using backend=original: {op}={f} size={size} MB') + guess = 'Stable Diffusion Upscale' + elif size >= 4891 and size <= 4899: # 4897 + if shared.backend == shared.Backend.ORIGINAL: + warn(f'Model detected as SD XL inpaint model, but attempting to load using backend=original: {op}={f} size={size} MB') + guess = 'Stable Diffusion XL Inpaint' + elif size >= 9791 and size <= 9799: # 9794 + if shared.backend == shared.Backend.ORIGINAL: + warn(f'Model detected as SD XL instruct pix2pix model, but attempting to load using backend=original: {op}={f} size={size} MB') + guess = 'Stable Diffusion XL Instruct' + elif size > 3138 and size < 3142: #3140 + if shared.backend == shared.Backend.ORIGINAL: + warn(f'Model detected as Segmind Vega model, but attempting to load using backend=original: {op}={f} size={size} MB') guess = 'Stable Diffusion XL' - else: - guess = 'Stable Diffusion' # guess by name """ if 'LCM_' in f.upper() or 'LCM-' in f.upper() or '_LCM' in f.upper() or '-LCM' in f.upper(): @@ -589,6 +585,10 @@ def detect_pipeline(f: str, op: str = 'model', warning=True): warn(f'Model detected as LCM model, but attempting to load using backend=original: {op}={f} size={size} MB') guess = 'Latent Consistency Model' """ + if 'instaflow' in f: + if shared.backend == shared.Backend.ORIGINAL: + warn(f'Model detected as InstaFlow model, but attempting to load using backend=original: {op}={f} size={size} MB') + guess = 'InstaFlow' if 'PixArt' in f: if shared.backend == shared.Backend.ORIGINAL: warn(f'Model detected as PixArt Alpha model, but attempting to load using backend=original: {op}={f} size={size} MB') @@ -788,37 +788,38 @@ def load_diffuser(checkpoint_info=None, already_loaded_state_dict=None, timer=No diffusers_load_config["vae"] = vae shared.log.debug(f'Diffusers loading: path="{checkpoint_info.path}"') + pipeline, model_type = detect_pipeline(checkpoint_info.path, op) if os.path.isdir(checkpoint_info.path): - err1 = None - err2 = None - err3 = None - try: # try autopipeline first, best choice but not all pipelines are available - sd_model = diffusers.AutoPipelineForText2Image.from_pretrained(checkpoint_info.path, cache_dir=shared.opts.diffusers_dir, **diffusers_load_config) - sd_model.model_type = sd_model.__class__.__name__ - except Exception as e: - err1 = e - # shared.log.error(f'AutoPipeline: {e}') - try: # try diffusion pipeline next second-best choice, works for most non-linked pipelines - if err1 is not None: - sd_model = diffusers.DiffusionPipeline.from_pretrained(checkpoint_info.path, cache_dir=shared.opts.diffusers_dir, **diffusers_load_config) + if model_type in ['InstaFlow']: # forced pipeline + sd_model = pipeline.from_pretrained(checkpoint_info.path, cache_dir=shared.opts.diffusers_dir, **diffusers_load_config) + else: + err1, err2, err3 = None, None, None + try: # 1 - autopipeline, best choice but not all pipelines are available + sd_model = diffusers.AutoPipelineForText2Image.from_pretrained(checkpoint_info.path, cache_dir=shared.opts.diffusers_dir, **diffusers_load_config) sd_model.model_type = sd_model.__class__.__name__ - except Exception as e: - err2 = e - # shared.log.error(f'DiffusionPipeline: {e}') - try: # try basic pipeline next just in case - if err2 is not None: - sd_model = diffusers.StableDiffusionPipeline.from_pretrained(checkpoint_info.path, cache_dir=shared.opts.diffusers_dir, **diffusers_load_config) - sd_model.model_type = sd_model.__class__.__name__ - except Exception as e: - err3 = e # ignore last error - shared.log.error(f'StableDiffusionPipeline: {e}') - if err3 is not None: - shared.log.error(f'Failed loading {op}: {checkpoint_info.path} auto={err1} diffusion={err2}') - return + except Exception as e: + err1 = e + # shared.log.error(f'AutoPipeline: {e}') + try: # 2 - diffusion pipeline, works for most non-linked pipelines + if err1 is not None: + sd_model = diffusers.DiffusionPipeline.from_pretrained(checkpoint_info.path, cache_dir=shared.opts.diffusers_dir, **diffusers_load_config) + sd_model.model_type = sd_model.__class__.__name__ + except Exception as e: + err2 = e + # shared.log.error(f'DiffusionPipeline: {e}') + try: # 3 - try basic pipeline just in case + if err2 is not None: + sd_model = diffusers.StableDiffusionPipeline.from_pretrained(checkpoint_info.path, cache_dir=shared.opts.diffusers_dir, **diffusers_load_config) + sd_model.model_type = sd_model.__class__.__name__ + except Exception as e: + err3 = e # ignore last error + shared.log.error(f'StableDiffusionPipeline: {e}') + if err3 is not None: + shared.log.error(f'Failed loading {op}: {checkpoint_info.path} auto={err1} diffusion={err2}') + return elif os.path.isfile(checkpoint_info.path) and checkpoint_info.path.lower().endswith('.safetensors'): # diffusers_load_config["local_files_only"] = True diffusers_load_config["extract_ema"] = shared.opts.diffusers_extract_ema - pipeline, model_type = detect_pipeline(checkpoint_info.path, op) if pipeline is None: shared.log.error(f'Diffusers {op} pipeline not initialized: {shared.opts.diffusers_pipeline}') return diff --git a/modules/sd_samplers_diffusers.py b/modules/sd_samplers_diffusers.py index f61d7ddde..5610e2988 100644 --- a/modules/sd_samplers_diffusers.py +++ b/modules/sd_samplers_diffusers.py @@ -11,6 +11,7 @@ try: from diffusers import ( DDIMScheduler, DDPMScheduler, + UniPCMultistepScheduler, DEISMultistepScheduler, DPMSolverMultistepScheduler, DPMSolverSinglestepScheduler, @@ -19,10 +20,9 @@ try: EulerDiscreteScheduler, HeunDiscreteScheduler, KDPM2DiscreteScheduler, - PNDMScheduler, - UniPCMultistepScheduler, - LMSDiscreteScheduler, KDPM2AncestralDiscreteScheduler, + LMSDiscreteScheduler, + PNDMScheduler, LCMScheduler, ) except Exception as e: @@ -32,22 +32,22 @@ except Exception as e: config = { # beta_start, beta_end are typically per-scheduler, but we don't want them as they should be taken from the model itself as those are values model was trained on # prediction_type is ideally set in model as well, but it maybe needed that we do auto-detect of model type in the future - 'All': { 'num_train_timesteps': 500, 'beta_start': 0.0001, 'beta_end': 0.02, 'beta_schedule': 'linear', 'prediction_type': 'epsilon' }, + 'All': { 'num_train_timesteps': 1000, 'beta_start': 0.0001, 'beta_end': 0.02, 'beta_schedule': 'linear', 'prediction_type': 'epsilon' }, 'DDIM': { 'clip_sample': True, 'set_alpha_to_one': True, 'steps_offset': 0, 'clip_sample_range': 1.0, 'sample_max_value': 1.0, 'timestep_spacing': 'linspace', 'rescale_betas_zero_snr': False }, - 'DDPM': { 'variance_type': "fixed_small", 'clip_sample': True, 'thresholding': False, 'clip_sample_range': 1.0, 'sample_max_value': 1.0, 'timestep_spacing': 'linspace'}, + 'UniPC': { 'solver_order': 2, 'thresholding': False, 'sample_max_value': 1.0, 'predict_x0': 'bh2', 'lower_order_final': True }, 'DEIS': { 'solver_order': 2, 'thresholding': False, 'sample_max_value': 1.0, 'algorithm_type': "deis", 'solver_type': "logrho", 'lower_order_final': True }, - 'DPM++ 1S': { 'solver_order': 2, 'thresholding': False, 'sample_max_value': 1.0, 'algorithm_type': "dpmsolver++", 'solver_type': "midpoint", 'lower_order_final': True, 'use_karras_sigmas': False }, - 'DPM++ 2M': { 'thresholding': False, 'sample_max_value': 1.0, 'algorithm_type': "dpmsolver++", 'solver_type': "midpoint", 'lower_order_final': True, 'use_karras_sigmas': False }, + 'DPM 1S': { 'solver_order': 2, 'thresholding': False, 'sample_max_value': 1.0, 'algorithm_type': "dpmsolver++", 'solver_type': "midpoint", 'lower_order_final': True, 'use_karras_sigmas': False, 'final_sigmas_type': 'zero' }, + 'DPM 2M': { 'thresholding': False, 'sample_max_value': 1.0, 'algorithm_type': "dpmsolver++", 'solver_type': "midpoint", 'lower_order_final': True, 'use_karras_sigmas': False, 'final_sigmas_type': 'zero' }, 'DPM SDE': { 'use_karras_sigmas': False }, 'Euler a': { 'rescale_betas_zero_snr': False }, 'Euler': { 'interpolation_type': "linear", 'use_karras_sigmas': False, 'rescale_betas_zero_snr': False }, 'Heun': { 'use_karras_sigmas': False }, + 'DDPM': { 'variance_type': "fixed_small", 'clip_sample': True, 'thresholding': False, 'clip_sample_range': 1.0, 'sample_max_value': 1.0, 'timestep_spacing': 'linspace', 'rescale_betas_zero_snr': False }, 'KDPM2': { 'steps_offset': 0 }, 'KDPM2 a': { 'steps_offset': 0 }, 'LMSD': { 'use_karras_sigmas': False, 'timestep_spacing': 'linspace', 'steps_offset': 0 }, 'PNDM': { 'skip_prk_steps': False, 'set_alpha_to_one': False, 'steps_offset': 0 }, - 'UniPC': { 'solver_order': 2, 'thresholding': False, 'sample_max_value': 1.0, 'predict_x0': 'bh2', 'lower_order_final': True }, - 'LCM': { 'beta_start': 0.00085, 'beta_end': 0.012, 'beta_schedule': "scaled_linear", 'set_alpha_to_one': True, 'rescale_betas_zero_snr': False }, + 'LCM': { 'beta_start': 0.00085, 'beta_end': 0.012, 'beta_schedule': "scaled_linear", 'set_alpha_to_one': True, 'rescale_betas_zero_snr': False, 'thresholding': False }, } samplers_data_diffusers = [ @@ -69,6 +69,14 @@ samplers_data_diffusers = [ sd_samplers_common.SamplerData('LCM', lambda model: DiffusionSampler('LCM', LCMScheduler, model), [], {}), ] +try: + from diffusers import SASolverScheduler + config['SA Solver'] = {'predictor_order': 2, 'corrector_order': 2, 'thresholding': False, 'lower_order_final': True, 'use_karras_sigmas': False, 'timestep_spacing': 'linspace'} + samplers_data_diffusers.append(sd_samplers_common.SamplerData('SA Solver', lambda model: DiffusionSampler('SA Solver', SASolverScheduler, model), [], {})) +except Exception as e: + shared.log.debug(f'Sampler: {e}') + + class DiffusionSampler: def __init__(self, name, constructor, model, **kwargs): if name == 'Default': diff --git a/modules/shared.py b/modules/shared.py index 9d4aa406a..9dffea095 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -581,7 +581,7 @@ options_templates.update(options_section(('sampler-params', "Sampler Settings"), # managed from ui.py for backend diffusers "schedulers_sep_diffusers": OptionInfo("

Diffusers specific config

", "", gr.HTML), - "schedulers_dpm_solver": OptionInfo("sde-dpmsolver++", "DPM solver algorithm", gr.Radio, {"choices": ['dpmsolver', 'dpmsolver++', 'sde-dpmsolver', 'sde-dpmsolver++']}), + "schedulers_dpm_solver": OptionInfo("sde-dpmsolver++", "DPM solver algorithm", gr.Radio, {"choices": ['dpmsolver++', 'sde-dpmsolver++']}), "schedulers_beta_schedule": OptionInfo("default", "Beta schedule", gr.Radio, {"choices": ['default', 'linear', 'scaled_linear', 'squaredcos_cap_v2']}), 'schedulers_beta_start': OptionInfo(0, "Beta start", gr.Slider, {"minimum": 0, "maximum": 1, "step": 0.00001}), 'schedulers_beta_end': OptionInfo(0, "Beta end", gr.Slider, {"minimum": 0, "maximum": 1, "step": 0.00001}), diff --git a/modules/shared_items.py b/modules/shared_items.py index 0796cac43..11e7659d1 100644 --- a/modules/shared_items.py +++ b/modules/shared_items.py @@ -47,6 +47,7 @@ def get_pipelines(): 'Kandinsky 3': getattr(diffusers, 'Kandinsky3Pipeline', None), 'DeepFloyd IF': getattr(diffusers, 'IFPipeline', None), 'Custom Diffusers Pipeline': getattr(diffusers, 'DiffusionPipeline', None), + 'InstaFlow': diffusers.utils.get_class_from_dynamic_module('instaflow_one_step', module_file='pipeline.py') # Segmind SSD-1B, Segmind Tiny } for k, v in pipelines.items(): diff --git a/modules/ui_extra_networks.py b/modules/ui_extra_networks.py index 4d660d08e..eb78940a7 100644 --- a/modules/ui_extra_networks.py +++ b/modules/ui_extra_networks.py @@ -145,7 +145,7 @@ class ExtraNetworksPage: def link_preview(self, filename): quoted_filename = urllib.parse.quote(filename.replace('\\', '/')) - mtime = os.path.getmtime(filename) + mtime = os.path.getmtime(filename) if os.path.exists(filename) else 0 preview = f"./sd_extra_networks/thumb?filename={quoted_filename}&mtime={mtime}" return preview @@ -582,7 +582,7 @@ def create_ui(container, button_parent, tabname, skip_indexing = False): import concurrent with concurrent.futures.ThreadPoolExecutor(max_workers=16) as executor: for page in get_pages(): - executor.submit(page.create_items, page) + executor.submit(page.create_items, ui.tabname) for page in get_pages(): page.create_page(ui.tabname, skip_indexing) with gr.Tab(page.title, id=page.title.lower().replace(" ", "_"), elem_classes="extra-networks-tab") as tab: diff --git a/modules/ui_extra_networks_checkpoints.py b/modules/ui_extra_networks_checkpoints.py index be8729c28..eccb23e20 100644 --- a/modules/ui_extra_networks_checkpoints.py +++ b/modules/ui_extra_networks_checkpoints.py @@ -64,6 +64,8 @@ class ExtraNetworksPageCheckpoints(ui_extra_networks.ExtraNetworksPage): return record def list_items(self): + import sys + shared.log.debug(f'List items: function={sys._getframe(1).f_code.co_name}') # pylint: disable=protected-access # items = [self.create_item(cp) for cp in list(sd_models.checkpoints_list)] + list(self.list_reference()) items = [] with concurrent.futures.ThreadPoolExecutor(max_workers=shared.max_workers) as executor: