stable-diffusion-webui 的模型更新

stable-diffusion-webui 的模型更新

    正在检查是否收录...
一言准备中...

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

sharecodeimuidediffusionclipclistable diffusionurlappscriptcpuelowebuiwebtokencreatepromptgpuctofixgithubutmhuggingfacejsongitgeneratorwordrap
  • 本文作者:WAP站长网
  • 本文链接: https://wapzz.net/post-3453.html
  • 版权声明:本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。
本站部分内容来源于网络转载,仅供学习交流使用。如涉及版权问题,请及时联系我们,我们将第一时间处理。
文章很赞!支持一下吧 还没有人为TA充电
为TA充电
还没有人为TA充电
0
  • 支付宝打赏
    支付宝扫一扫
  • 微信打赏
    微信扫一扫
感谢支持
文章很赞!支持一下吧
关于作者
2.7W+
9
1
2
WAP站长官方

AI视野:OpenAI否认即将发布GPT-4.5;Stability AI推出新会员模式;DomoAI支持视频一键转动漫;阿里I2VGen-XL模型代码公布

上一篇

突发!GPT-4.5泄露传闻:是圣诞的礼物,还是传言的迷雾?

下一篇
  • 复制图片
按住ctrl可打开默认菜单