• stable-diffusion-webui sdxl模型代码分析


    采样器这块基本都是用的k-diffusion,模型用的是stability的原生项目generative-models中的sgm,这点和fooocus不同,fooocus底层依赖comfyui中的models,comfy是用load_state_dict的方式解析的,用的load_checkpoint_guess_config函数,这个函数webui中也有。

    webui在paths中导入了generative-models,在sd_model_config中导入了config.sdxl和config.sdxl_refiner两个config,模型使用sgm下的models/diffusion/DiffusionEngine初始化,refiner和base的模型几乎是一致的。

    python webui.py --port 6006 --no-half-vae

    1. webui()->
    2. initialize()->
    3. initialize_rest()->
    4. - sd_samplers.py -> set_samplers()->sd_samplers_kdiffusion.py->
    5. - extensions.py -> list_extensions()
    6. - initialize_util.py -> restore_config_state_file()
    7. - sd_models.py -> list_models()
    8. - localization.py -> list_localizations()
    9. - scripts.load_scripts() -> scripts.py
    10. -- scripts_txt2img=ScriptRunner()/scripts_img2img=ScriptRunner()/scripts_postpro=scripts_postprocessing.ScriptPostprocessingRunner()(scripts_postprocessing.py)
    11. - modelloader.py -> load_upscaler()
    12. - sd_vae.py -> refresh_vae_list()
    13. - textual_inversion/textual_inversion.py -> list_textual_inversion_templates()
    14. - script_callbacks.py -> on_list_optimizers(sd_hijack_optimizations.list_optimizers)
    15. - sd_hijack.py -> list_optimizers()
    16. - sd_unet.py -> list_unets()
    17. - load_model -> shared.py
    18. - shared_items.py -> reload_hypernetworks() # 这种方式现在几乎不用了
    19. - ui_extra_networks.py -> initialize()/register_default_pages()
    20. - extra_networks.py -> initialize()/register_default_extra_networks()
    21. ui.py -> ui.create_ui()

    ui.py

    一些基础参数的初始化也在这里,关于ui设计在webui中代码还是挺多的

    ui_components.py 一些设计的ui组件

    shared_items.py 重复的一些item

    下面就是一个FormRow:

    1. elif category == "dimensions":
    2. with FormRow():
    3. with gr.Column(elem_id="txt2img_column_size", scale=4):
    4. width = gr.Slider(minimum=64, maximum=2048, step=8, label="Width", value=512, elem_id="txt2img_width")
    5. height = gr.Slider(minimum=64, maximum=2048, step=8, label="Height", value=512, elem_id="txt2img_height")
    6. ....

    调用接口入口:

    1. txt2img_args = dict(
    2. fn=wrap_gradio_gpu_call(modules.txt2img.txt2img, extra_outputs=[None, '', '']),
    3. _js="submit",
    4. inputs=[
    5. dummy_component,
    6. toprow.prompt,
    7. toprow.negative_prompt,
    8. toprow.ui_styles.dropdown,
    9. steps,
    10. sampler_name,
    11. batch_count,
    12. batch_size,
    13. cfg_scale,
    14. height,
    15. width,
    16. enable_hr,
    17. denoising_strength,
    18. hr_scale,
    19. hr_upscaler,
    20. hr_second_pass_steps,
    21. hr_resize_x,
    22. hr_resize_y,
    23. hr_checkpoint_name,
    24. hr_sampler_name,
    25. hr_prompt,
    26. hr_negative_prompt,
    27. override_settings,
    28. ] + custom_inputs,

    txt2img.py

    1. p = processing.StableDiffusionProcessingTxt2Img(sd_model,,prompt,negative_prompt,sampler_name,...)->
    2. processed = processing.process_images(p)

    processing.py

    1. res = process_image_inner(p)
    2. - sample_ddim = p.sample(conditioning,unconditional_conditioning,seeds,subseeds,subseed_strength,prompts)-> StableDiffusionProcessingTxt2Img.sample()
    3. -- self.sampler = sd_sampler.create_sampler(self.sampler_name,self.sd_model)
    4. -- samples = self.samplers.sample(c,uc,image_encoditioning=self.txt2img_image_conditioning(x))

    sd_samplers_kdiffusion.py

    1. sample()->
    2. samples = self.launch_sampling(steps,lambda:self.func(self.model_wrap_cfg,x,self.sampler_extra_args,...))
    3. model_rap_cfg:CFGDenoiseKDiffusion->sd_samplers_cfg_denoiser.CFGDenoiser

    sd_samplers_common.py

    func() = sample_dpmpp_2m ->
    

    repositories/k-diffusion/k_diffusion/sampling.py

    1. sample_dpmpp_2m()->
    2. - denoised = model(x,sigmas[i]*s_in,**extra_args)->
    3. ...
    4. # 此处就是去噪产生图片的过程

    modules/sd_samplers_cfg_denoiser.py  model = 

    1. CFGDenoiser()->
    2. forward(x:2x4x128x128,sigma:[14.6146,14.6146],uncond:SchedulePromptConditionings,cond:MulticondLearnedConditioning,cond_scale:7,s_min_uncond:0,image_cond:2x5x1x1)->
    3. denoised:2x4x128x128
    4. # unet预测都被封装在这里

    modules/sd_models.py  这块主要是

    1. reload_model_weights()->
    2. sd_model = reuse_model_from_already_loaded(sd_model,checkpoint_info,...)
    3. load_model()
    4. ....

    modules/sd_samplers_common.py

    1. sd_models.reload_model_weights(refiner_checkpoint_info)
    2. cfg_denoiser.update_inner_model()->

    modules/sd_samplers_cfg_denoiser.py

    forward()->

  • 相关阅读:
    随笔:分布式锁的一点思想
    LeetCode力扣020:有效的括号
    一个简单的WEB网页制作作业——黑色的山河旅行社网站(5个页面)HTML+CSS+JavaScript
    【Linux】Vim的使用快捷方式
    MVC设计模式+过滤器与监听器
    linux的su:鉴定故障,或当密码正确
    抽象的代理模式1.0版本
    .Net添加了引用,仍然提示找不到命名空间
    幼儿园管理系统|基于springboot框架+ Mysql+Java+Tomcat的幼儿园管理系统设计与实现(可运行源码+数据库+设计文档+部署说明)
    MySQL安装TokuDB引擎
  • 原文地址:https://blog.csdn.net/u012193416/article/details/133868370