赞
踩
shared.py和sd_models.py中
shared.py:
- options_templates.update(options_section(('sd', "Stable Diffusion"), {
- "sd_model_checkpoint": OptionInfo(None, "Stable Diffusion checkpoint", gr.Dropdown, lambda: {"choices": list_checkpoint_tiles()}, refresh=refresh_checkpoints),
- "sd_checkpoint_cache": OptionInfo(0, "Checkpoints to cache in RAM", gr.Slider, {"minimum": 0, "maximum": 10, "step": 1}),
- "sd_vae_checkpoint_cache": OptionInfo(0, "VAE Checkpoints to cache in RAM", gr.Slider, {"minimum": 0, "maximum": 10, "step": 1}),
- "sd_vae": OptionInfo("Automatic", "SD VAE", gr.Dropdown, lambda: {"choices": shared_items.sd_vae_items()}, refresh=shared_items.refresh_vae_list).info("choose VAE model: Automatic = use one with same filename as checkpoint; None = use VAE from checkpoint"),
- "sd_vae_as_default": OptionInfo(True, "Ignore selected VAE for stable diffusion checkpoints that have their own .vae.pt next to them"),
- "sd_unet": OptionInfo("Automatic", "SD Unet", gr.Dropdown, lambda: {"choices": shared_items.sd_unet_items()}, refresh=shared_items.refresh_unet_list).info("choose Unet model: Automatic = use one with same filename as checkpoint; None = use Unet from checkpoint"),
- "inpainting_mask_weight": OptionInfo(1.0, "Inpainting conditioning mask strength", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.01}),
- "initial_noise_multiplier": OptionInfo(1.0, "Noise multiplier for img2img", gr.Slider, {"minimum": 0.5, "maximum": 1.5, "step": 0.01}),
- "img2img_color_correction": OptionInfo(False, "Apply color correction to img2img results to match original colors."),
- "img2img_fix_steps": OptionInfo(False, "With img2img, do exactly the amount of steps the slider specifies.").info("normally you'd do less with less denoising"),
- "img2img_background_color": OptionInfo("#ffffff", "With img2img, fill image's transparent parts with this color.", ui_components.FormColorPicker, {}),
- "enable_quantization": OptionInfo(False, "Enable quantization in K samplers for sharper and cleaner results. This may change existing seeds. Requires restart to apply."),
- "enable_emphasis": OptionInfo(True, "Enable emphasis").info("use (text) to make model pay more attention to text and [text] to make it pay less attention"),
- "enable_batch_seeds": OptionInfo(True, "Make K-diffusion samplers produce same images in a batch as when making a single image"),
- "comma_padding_backtrack": OptionInfo(20, "Prompt word wrap length limit", gr.Slider, {"minimum": 0, "maximum": 74, "step": 1}).info("in tokens - for texts shorter than specified, if they don't fit into 75 token limit, move them to the next 75 token chunk"),
- "CLIP_stop_at_last_layers": OptionInfo(1, "Clip skip", gr.Slider, {"minimum": 1, "maximum": 12, "step": 1}).link("wiki", "https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#clip-skip").info("ignore last layers of CLIP network; 1 ignores none, 2 ignores one layer"),
- "upcast_attn": OptionInfo(False, "Upcast cross attention layer to float32"),
- "randn_source": OptionInfo("GPU", "Random number generator source.", gr.Radio, {"choices": ["GPU", "CPU"]}).info("changes seeds drastically; use CPU to produce the same picture across different videocard vendors"),
- }))

模型的列表在list_checkpoint_tiles()中,更新在refresh_checkpoints中,282行
- def list_checkpoint_tiles():
- import modules.sd_models
- return modules.sd_models.checkpoint_tiles()
- def refresh_checkpoints():
- import modules.sd_models
- return modules.sd_models.list_models()
点击选中更改,sd_model.py的519行:
- def reload_model_weights(sd_model=None, info=None):
- from modules import lowvram, devices, sd_hijack
- checkpoint_info = info or select_checkpoint()
-
- if not sd_model:
- sd_model = model_data.sd_model
-
- if sd_model is None: # previous model load failed
- current_checkpoint_info = None
- else:
- current_checkpoint_info = sd_model.sd_checkpoint_info
- if sd_model.sd_model_checkpoint == checkpoint_info.filename:
- return
-
- sd_unet.apply_unet("None")
-
- if shared.cmd_opts.lowvram or shared.cmd_opts.medvram:
- lowvram.send_everything_to_cpu()
- else:
- sd_model.to(devices.cpu)
-
- sd_hijack.model_hijack.undo_hijack(sd_model)
-
- timer = Timer()
-
- state_dict = get_checkpoint_state_dict(checkpoint_info, timer)
-
- checkpoint_config = sd_models_config.find_checkpoint_config(state_dict, checkpoint_info)
-
- timer.record("find config")
-
- if sd_model is None or checkpoint_config != sd_model.used_config:
- del sd_model
- load_model(checkpoint_info, already_loaded_state_dict=state_dict)
- return model_data.sd_model
-
- try:
- load_model_weights(sd_model, checkpoint_info, state_dict, timer)
- except Exception:
- print("Failed to load checkpoint, restoring previous")
- load_model_weights(sd_model, current_checkpoint_info, None, timer)
- raise
- finally:
- sd_hijack.model_hijack.hijack(sd_model)
- timer.record("hijack")
-
- script_callbacks.model_loaded_callback(sd_model)
- timer.record("script callbacks")
-
- if not shared.cmd_opts.lowvram and not shared.cmd_opts.medvram:
- sd_model.to(devices.device)
- timer.record("move model to device")
-
- print(f"Weights loaded in {timer.summary()}.")
-
- return sd_model

其中sd_model.py的165行中的select_checkpoint
- def select_checkpoint():
- """Raises `FileNotFoundError` if no checkpoints are found."""
- model_checkpoint = shared.opts.sd_model_checkpoint
-
- checkpoint_info = checkpoint_alisases.get(model_checkpoint, None)
- if checkpoint_info is not None:
- return checkpoint_info
-
- if len(checkpoints_list) == 0:
- error_message = "No checkpoints found. When searching for checkpoints, looked at:"
- if shared.cmd_opts.ckpt is not None:
- error_message += f"\n - file {os.path.abspath(shared.cmd_opts.ckpt)}"
- error_message += f"\n - directory {model_path}"
- if shared.cmd_opts.ckpt_dir is not None:
- error_message += f"\n - directory {os.path.abspath(shared.cmd_opts.ckpt_dir)}"
- error_message += "Can't run without a checkpoint. Find and place a .ckpt or .safetensors file into any of those locations."
- raise FileNotFoundError(error_message)
-
- checkpoint_info = next(iter(checkpoints_list.values()))
- if model_checkpoint is not None:
- print(f"Checkpoint {model_checkpoint} not found; loading fallback {checkpoint_info.title}", file=sys.stderr)
-
- return checkpoint_info

实际如果在代码中想要更改权重:
reload_model_weights(model_checkpoint=input_json.get('model', "chilloutmix_NiPrunedFp32Fix.safetensors"))
即可。
初始化在webui.py的270行
modules.sd_models.list_models()
中,主要Stable-diffusion下的模型都是提前初始化,在整个工程启动前,sd_model.py的113行
- def list_models():
- checkpoints_list.clear()
- checkpoint_alisases.clear()
-
- cmd_ckpt = shared.cmd_opts.ckpt
- if shared.cmd_opts.no_download_sd_model or cmd_ckpt != shared.sd_model_file or os.path.exists(cmd_ckpt):
- model_url = None
- else:
- model_url = "https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.safetensors"
-
- model_list = modelloader.load_models(model_path=model_path, model_url=model_url, command_path=shared.cmd_opts.ckpt_dir, ext_filter=[".ckpt", ".safetensors"], download_name="v1-5-pruned-emaonly.safetensors", ext_blacklist=[".vae.ckpt", ".vae.safetensors"])
-
- if os.path.exists(cmd_ckpt):
- checkpoint_info = CheckpointInfo(cmd_ckpt)
- checkpoint_info.register()
-
- shared.opts.data['sd_model_checkpoint'] = checkpoint_info.title
- elif cmd_ckpt is not None and cmd_ckpt != shared.default_sd_model_file:
- print(f"Checkpoint in --ckpt argument not found (Possible it was moved to {model_path}: {cmd_ckpt}", file=sys.stderr)
-
- for filename in sorted(model_list, key=str.lower):
- checkpoint_info = CheckpointInfo(filename)
- checkpoint_info.register()

被注册在checkpoint_info中
webui.py的311行,加载模型:
- def load_model():
- """
- Accesses shared.sd_model property to load model.
- After it's available, if it has been loaded before this access by some extension,
- its optimization may be None because the list of optimizaers has neet been filled
- by that time, so we apply optimization again.
- """
-
- shared.sd_model # noqa: B018
-
- if modules.sd_hijack.current_optimizer is None:
- modules.sd_hijack.apply_optimizations()
-
- Thread(target=load_model).start()
在shared.py的714行中
- class Shared(sys.modules[__name__].__class__):
- """
- this class is here to provide sd_model field as a property, so that it can be created and loaded on demand rather than
- at program startup.
- """
-
- sd_model_val = None
-
- @property
- def sd_model(self):
- import modules.sd_models
-
- return modules.sd_models.model_data.get_sd_model()
-
- @sd_model.setter
- def sd_model(self, value):
- import modules.sd_models
-
- modules.sd_models.model_data.set_sd_model(value)
-
-
- sd_model: LatentDiffusion = None # this var is here just for IDE's type checking; it cannot be accessed because the class field above will be accessed instead
- sys.modules[__name__].__class__ = Shared

sd_model的getter/setter属性,在sd_model.py的406行
- class SdModelData:
- def __init__(self):
- self.sd_model = None
- self.was_loaded_at_least_once = False
- self.lock = threading.Lock()
-
- def get_sd_model(self):
- if self.was_loaded_at_least_once:
- return self.sd_model
-
- if self.sd_model is None:
- with self.lock:
- if self.sd_model is not None or self.was_loaded_at_least_once:
- return self.sd_model
-
- try:
- load_model()
- except Exception as e:
- errors.display(e, "loading stable diffusion model", full_traceback=True)
- print("", file=sys.stderr)
- print("Stable diffusion model failed to load", file=sys.stderr)
- self.sd_model = None
-
- return self.sd_model
-
- def set_sd_model(self, v):
- self.sd_model = v

在sd_model.py的438行,加载模型:
-
- def load_model(checkpoint_info=None, already_loaded_state_dict=None):
- from modules import lowvram, sd_hijack
- checkpoint_info = checkpoint_info or select_checkpoint()
-
- if model_data.sd_model:
- sd_hijack.model_hijack.undo_hijack(model_data.sd_model)
- model_data.sd_model = None
- gc.collect()
- devices.torch_gc()
-
- do_inpainting_hijack()
-
- timer = Timer()
-
- if already_loaded_state_dict is not None:
- state_dict = already_loaded_state_dict
- else:
- state_dict = get_checkpoint_state_dict(checkpoint_info, timer)
-
- checkpoint_config = sd_models_config.find_checkpoint_config(state_dict, checkpoint_info)
- clip_is_included_into_sd = sd1_clip_weight in state_dict or sd2_clip_weight in state_dict
-
- timer.record("find config")
-
- sd_config = OmegaConf.load(checkpoint_config)
- repair_config(sd_config)
-
- timer.record("load config")
-
- print(f"Creating model from config: {checkpoint_config}")
-
- sd_model = None
- try:
- with sd_disable_initialization.DisableInitialization(disable_clip=clip_is_included_into_sd):
- sd_model = instantiate_from_config(sd_config.model)
- except Exception:
- pass
-
- if sd_model is None:
- print('Failed to create model quickly; will retry using slow method.', file=sys.stderr)
- sd_model = instantiate_from_config(sd_config.model)
-
- sd_model.used_config = checkpoint_config
-
- timer.record("create model")
-
- load_model_weights(sd_model, checkpoint_info, state_dict, timer)
-
- if shared.cmd_opts.lowvram or shared.cmd_opts.medvram:
- lowvram.setup_for_low_vram(sd_model, shared.cmd_opts.medvram)
- else:
- sd_model.to(shared.device)
-
- timer.record("move model to device")
-
- sd_hijack.model_hijack.hijack(sd_model)
-
- timer.record("hijack")
-
- sd_model.eval()
- model_data.sd_model = sd_model
- model_data.was_loaded_at_least_once = True
-
- sd_hijack.model_hijack.embedding_db.load_textual_inversion_embeddings(force_reload=True) # Reload embeddings after model load as they may or may not fit the model
-
- timer.record("load textual inversion embeddings")
-
- script_callbacks.model_loaded_callback(sd_model)
-
- timer.record("scripts callbacks")
-
- with devices.autocast(), torch.no_grad():
- sd_model.cond_stage_model_empty_prompt = sd_model.cond_stage_model([""])
-
- timer.record("calculate empty prompt")
-
- print(f"Model loaded in {timer.summary()}.")
-
- return sd_model

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。