diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b1a291a2..f35f7b675 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,10 +48,12 @@ - **gallery**: add http fallback for slow/unreliable links - **splash**: add legacy mode indicator on splash screen - **network**: extract thumbnail from model metadata if present + - **network**: setting value to disable use of reference models - **Refactor**: - **upscale**: code refactor to unify latent, resize and model based upscalers - **loader**: ability to run in-memory models - **schedulers**: ability to create model-less schedulers + - **quantiation**: code refactor into dedicated module - **Fixes**: - non-full vae decode - send-to image transfer diff --git a/modules/face/photomaker_pipeline.py b/modules/face/photomaker_pipeline.py index ec5728961..657e96fc7 100644 --- a/modules/face/photomaker_pipeline.py +++ b/modules/face/photomaker_pipeline.py @@ -272,7 +272,7 @@ class PhotoMakerStableDiffusionXLPipeline(StableDiffusionXLPipeline): # textual inversion: process multi-vector tokens if necessary prompt_embeds_list = [] prompts = [prompt, prompt_2] - for prompt, tokenizer, text_encoder in zip(prompts, tokenizers, text_encoders): + for prompt, tokenizer, text_encoder in zip(prompts, tokenizers, text_encoders): # pylint: disable=redefined-argument-from-local if isinstance(self, TextualInversionLoaderMixin): prompt = self.maybe_convert_prompt(prompt, tokenizer) @@ -367,7 +367,7 @@ class PhotoMakerStableDiffusionXLPipeline(StableDiffusionXLPipeline): f"`negative_prompt` should be the same type to `prompt`, but got {type(negative_prompt)} !=" f" {type(prompt)}." ) - elif batch_size != len(negative_prompt): + if batch_size != len(negative_prompt): raise ValueError( f"`negative_prompt`: {negative_prompt} has batch size {len(negative_prompt)}, but `prompt`:" f" {prompt} has batch size {batch_size}. Please make sure that passed `negative_prompt` matches" @@ -377,7 +377,7 @@ class PhotoMakerStableDiffusionXLPipeline(StableDiffusionXLPipeline): uncond_tokens = [negative_prompt, negative_prompt_2] negative_prompt_embeds_list = [] - for negative_prompt, tokenizer, text_encoder in zip(uncond_tokens, tokenizers, text_encoders): + for negative_prompt, tokenizer, text_encoder in zip(uncond_tokens, tokenizers, text_encoders): # pylint: disable=redefined-argument-from-local if isinstance(self, TextualInversionLoaderMixin): negative_prompt = self.maybe_convert_prompt(negative_prompt, tokenizer) @@ -735,8 +735,8 @@ class PhotoMakerStableDiffusionXLPipeline(StableDiffusionXLPipeline): ): discrete_timestep_cutoff = int( round( - self.scheduler.config.num_train_timesteps - - (self.denoising_end * self.scheduler.config.num_train_timesteps) + self.scheduler.config.num_train_timesteps # pylint: disable=no-member + - (self.denoising_end * self.scheduler.config.num_train_timesteps) # pylint: disable=no-member ) ) num_inference_steps = len(list(filter(lambda ts: ts >= discrete_timestep_cutoff, timesteps))) diff --git a/modules/intel/openvino/__init__.py b/modules/intel/openvino/__init__.py index a4000c43a..11fa0426f 100644 --- a/modules/intel/openvino/__init__.py +++ b/modules/intel/openvino/__init__.py @@ -221,10 +221,10 @@ def openvino_compile(gm: GraphModule, *example_inputs, model_hash_str: str = Non for idx, _ in enumerate(example_inputs): new_inputs.append(example_inputs[idx].detach().cpu().numpy()) new_inputs = [new_inputs] - if shared.opts.nncf_quant_mode == "INT8": + if shared.opts.nncf_quantize_mode == "INT8": om = nncf.quantize(om, nncf.Dataset(new_inputs)) else: - om = nncf.quantize(om, nncf.Dataset(new_inputs), mode=getattr(nncf.QuantizationMode, shared.opts.nncf_quant_mode), + om = nncf.quantize(om, nncf.Dataset(new_inputs), mode=getattr(nncf.QuantizationMode, shared.opts.nncf_quantize_mode), advanced_parameters=nncf.quantization.advanced_parameters.AdvancedQuantizationParameters( overflow_fix=nncf.quantization.advanced_parameters.OverflowFix.DISABLE, backend_params=None)) @@ -281,10 +281,10 @@ def openvino_compile_cached_model(cached_model_path, *example_inputs): for idx, _ in enumerate(example_inputs): new_inputs.append(example_inputs[idx].detach().cpu().numpy()) new_inputs = [new_inputs] - if shared.opts.nncf_quant_mode == "INT8": + if shared.opts.nncf_quantize_mode == "INT8": om = nncf.quantize(om, nncf.Dataset(new_inputs)) else: - om = nncf.quantize(om, nncf.Dataset(new_inputs), mode=getattr(nncf.QuantizationMode, shared.opts.nncf_quant_mode), + om = nncf.quantize(om, nncf.Dataset(new_inputs), mode=getattr(nncf.QuantizationMode, shared.opts.nncf_quantize_mode), advanced_parameters=nncf.quantization.advanced_parameters.AdvancedQuantizationParameters( overflow_fix=nncf.quantization.advanced_parameters.OverflowFix.DISABLE, backend_params=None)) diff --git a/modules/merging/modules_sdxl.py b/modules/merging/modules_sdxl.py index 61f2cf948..ec994d567 100644 --- a/modules/merging/modules_sdxl.py +++ b/modules/merging/modules_sdxl.py @@ -67,13 +67,13 @@ def load_base(override:str=None): pipeline = diffusers.StableDiffusionXLPipeline.from_pretrained(fn, cache_dir=shared.opts.hfcache_dir, torch_dtype=recipe.dtype, add_watermarker=False) else: yield msg('base: not found') - return None + return pipeline.vae.register_to_config(force_upcast = False) def load_unet(pipe: diffusers.StableDiffusionXLPipeline, override:str=None): if (recipe.unet is None or len(recipe.unet) == 0) and override is None: - return None + return fn = override or recipe.unet if not os.path.isabs(fn): fn = os.path.join(shared.opts.unet_dir, fn) @@ -92,7 +92,7 @@ def load_unet(pipe: diffusers.StableDiffusionXLPipeline, override:str=None): def load_scheduler(pipe: diffusers.StableDiffusionXLPipeline, override:str=None): if recipe.scheduler is None and override is None: - return None + return config = pipe.scheduler.config.__dict__ scheduler = override or recipe.scheduler yield msg(f'scheduler={scheduler}') @@ -107,7 +107,7 @@ def load_scheduler(pipe: diffusers.StableDiffusionXLPipeline, override:str=None) def load_vae(pipe: diffusers.StableDiffusionXLPipeline, override:str=None): if (recipe.vae is None or len(recipe.vae) == 0)and override is None: - return None + return fn = override or recipe.vae if not os.path.isabs(fn): fn = os.path.join(shared.opts.vae_dir, fn) @@ -128,7 +128,7 @@ def load_vae(pipe: diffusers.StableDiffusionXLPipeline, override:str=None): def load_te1(pipe: diffusers.StableDiffusionXLPipeline, override:str=None): if (recipe.te1 is None or len(recipe.te1) == 0) and override is None: - return None + return config = pipe.text_encoder.config.__dict__ pretrained_config = transformers.PretrainedConfig.from_dict(config) fn = override or recipe.te1 @@ -149,7 +149,7 @@ def load_te1(pipe: diffusers.StableDiffusionXLPipeline, override:str=None): def load_te2(pipe: diffusers.StableDiffusionXLPipeline, override:str=None): if (recipe.te2 is None or len(recipe.te2) == 0) and override is None: - return None + return config = pipe.text_encoder_2.config.__dict__ pretrained_config = transformers.PretrainedConfig.from_dict(config) fn = override or recipe.te2 @@ -170,7 +170,7 @@ def load_te2(pipe: diffusers.StableDiffusionXLPipeline, override:str=None): def load_lora(pipe: diffusers.StableDiffusionXLPipeline, override: dict=None, fuse: float=None): if recipe.lora is None and override is None: - return None + return names = [] pipe.unfuse_lora() pipe.unload_lora_weights() diff --git a/modules/model_quant.py b/modules/model_quant.py index 24c517dc3..6798160a8 100644 --- a/modules/model_quant.py +++ b/modules/model_quant.py @@ -223,7 +223,7 @@ def nncf_compress_model(model, op=None, sd_model=None): nncf_send_to_device(model, devices.device) if hasattr(model, "set_input_embeddings") and backup_embeddings is not None: model.set_input_embeddings(backup_embeddings) - if op is not None and shared.opts.quant_shuffle_weights: + if op is not None and shared.opts.nncf_quantize_shuffle_weights: if quant_last_model_name is not None: if "." in quant_last_model_name: last_model_names = quant_last_model_name.split(".") @@ -290,7 +290,7 @@ def optimum_quanto_model(model, op=None, sd_model=None, weights=None, activation quanto.freeze(model) if hasattr(model, "set_input_embeddings") and backup_embeddings is not None: model.set_input_embeddings(backup_embeddings) - if op is not None and shared.opts.quant_shuffle_weights: + if op is not None and shared.opts.optimum_quanto_shuffle_weights: if quant_last_model_name is not None: if "." in quant_last_model_name: last_model_names = quant_last_model_name.split(".") diff --git a/modules/perflow/pfode_solver.py b/modules/perflow/pfode_solver.py index db1b8e903..bffdd1494 100644 --- a/modules/perflow/pfode_solver.py +++ b/modules/perflow/pfode_solver.py @@ -49,7 +49,7 @@ class PFODESolver(): timestep_cond = None if unet.config.time_cond_proj_dim is not None: guidance_scale_tensor = torch.tensor(guidance_scale - 1).repeat(bsz) - timestep_cond = self.get_guidance_scale_embedding( + timestep_cond = self.get_guidance_scale_embedding( # pylint: disable=no-member guidance_scale_tensor, embedding_dim=unet.config.time_cond_proj_dim ).to(device=latents.device, dtype=latents.dtype) @@ -124,7 +124,7 @@ class PFODESolverSDXL(): self.t_terminal = t_terminal self.scheduler = scheduler - train_step_terminal = 0 + train_step_terminal = 0 train_step_initial = train_step_terminal + self.scheduler.config.num_train_timesteps # 0+1000 self.stepsize = (t_terminal-t_initial) / (train_step_terminal - train_step_initial) #1/1000 @@ -186,7 +186,7 @@ class PFODESolverSDXL(): timestep_cond = None if unet.config.time_cond_proj_dim is not None: guidance_scale_tensor = torch.tensor(guidance_scale - 1).repeat(bsz) - timestep_cond = self.get_guidance_scale_embedding( + timestep_cond = self.get_guidance_scale_embedding( # pylint: disable=no-member guidance_scale_tensor, embedding_dim=unet.config.time_cond_proj_dim ).to(device=latents.device, dtype=latents.dtype) diff --git a/modules/sd_models_compile.py b/modules/sd_models_compile.py index 6754984e5..407eeebd8 100644 --- a/modules/sd_models_compile.py +++ b/modules/sd_models_compile.py @@ -1,9 +1,8 @@ -import copy import time import logging import torch -from modules import shared, devices, sd_models, model_quant -from installer import install, setup_logging +from modules import shared, devices, sd_models +from installer import setup_logging #Used by OpenVINO, can be used with TensorRT or Olive diff --git a/modules/shared.py b/modules/shared.py index 7f406d950..da9fa3f6d 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -560,7 +560,7 @@ options_templates.update(options_section(('backends', "Backend Settings"), { })) options_templates.update(options_section(('quantization', "Quantization Settings"), { - "bnb_sep": OptionInfo("