| | import gradio as gr
|
| | from os import path
|
| | from backend.lora import (
|
| | get_lora_models,
|
| | get_active_lora_weights,
|
| | update_lora_weights,
|
| | load_lora_weight,
|
| | )
|
| | from state import get_settings, get_context
|
| | from frontend.utils import get_valid_lora_model
|
| | from models.interface_types import InterfaceType
|
| |
|
| |
|
| | _MAX_LORA_WEIGHTS = 5
|
| |
|
| | _custom_lora_sliders = []
|
| | _custom_lora_names = []
|
| | _custom_lora_columns = []
|
| |
|
| | app_settings = get_settings()
|
| |
|
| |
|
| | def on_click_update_weight(*lora_weights):
|
| | update_weights = []
|
| | active_weights = get_active_lora_weights()
|
| | if not len(active_weights):
|
| | gr.Warning("No active LoRAs, first you need to load LoRA model")
|
| | return
|
| | for idx, lora in enumerate(active_weights):
|
| | update_weights.append(
|
| | (
|
| | lora[0],
|
| | lora_weights[idx],
|
| | )
|
| | )
|
| | if len(update_weights) > 0:
|
| | update_lora_weights(
|
| | get_context(InterfaceType.WEBUI).lcm_text_to_image.pipeline,
|
| | app_settings.settings.lcm_diffusion_setting,
|
| | update_weights,
|
| | )
|
| |
|
| |
|
| | def on_click_load_lora(lora_name, lora_weight):
|
| | if app_settings.settings.lcm_diffusion_setting.use_openvino:
|
| | gr.Warning("Currently LoRA is not supported in OpenVINO.")
|
| | return
|
| | lora_models_map = get_lora_models(
|
| | app_settings.settings.lcm_diffusion_setting.lora.models_dir
|
| | )
|
| |
|
| |
|
| | settings = app_settings.settings.lcm_diffusion_setting
|
| | settings.lora.fuse = False
|
| | settings.lora.enabled = False
|
| | print(f"Selected Lora Model :{lora_name}")
|
| | print(f"Lora weight :{lora_weight}")
|
| | settings.lora.path = lora_models_map[lora_name]
|
| | settings.lora.weight = lora_weight
|
| | if not path.exists(settings.lora.path):
|
| | gr.Warning("Invalid LoRA model path!")
|
| | return
|
| | pipeline = get_context(InterfaceType.WEBUI).lcm_text_to_image.pipeline
|
| | if not pipeline:
|
| | gr.Warning("Pipeline not initialized. Please generate an image first.")
|
| | return
|
| | settings.lora.enabled = True
|
| | load_lora_weight(
|
| | get_context(InterfaceType.WEBUI).lcm_text_to_image.pipeline,
|
| | settings,
|
| | )
|
| |
|
| |
|
| | global _MAX_LORA_WEIGHTS
|
| | values = []
|
| | labels = []
|
| | rows = []
|
| | active_weights = get_active_lora_weights()
|
| | for idx, lora in enumerate(active_weights):
|
| | labels.append(f"{lora[0]}: ")
|
| | values.append(lora[1])
|
| | rows.append(gr.Row.update(visible=True))
|
| | for i in range(len(active_weights), _MAX_LORA_WEIGHTS):
|
| | labels.append(f"Update weight")
|
| | values.append(0.0)
|
| | rows.append(gr.Row.update(visible=False))
|
| | return labels + values + rows
|
| |
|
| |
|
| | def get_lora_models_ui() -> None:
|
| | with gr.Blocks() as ui:
|
| | gr.HTML(
|
| | "Download and place your LoRA model weights in <b>lora_models</b> folders and restart App"
|
| | )
|
| | with gr.Row():
|
| | with gr.Column():
|
| | with gr.Row():
|
| | lora_models_map = get_lora_models(
|
| | app_settings.settings.lcm_diffusion_setting.lora.models_dir
|
| | )
|
| | valid_model = get_valid_lora_model(
|
| | list(lora_models_map.values()),
|
| | app_settings.settings.lcm_diffusion_setting.lora.path,
|
| | app_settings.settings.lcm_diffusion_setting.lora.models_dir,
|
| | )
|
| | if valid_model != "":
|
| | valid_model_path = lora_models_map[valid_model]
|
| | app_settings.settings.lcm_diffusion_setting.lora.path = (
|
| | valid_model_path
|
| | )
|
| | else:
|
| | app_settings.settings.lcm_diffusion_setting.lora.path = ""
|
| |
|
| | lora_model = gr.Dropdown(
|
| | lora_models_map.keys(),
|
| | label="LoRA model",
|
| | info="LoRA model weight to load (You can use Lora models from Civitai or Hugging Face .safetensors format)",
|
| | value=valid_model,
|
| | interactive=True,
|
| | )
|
| |
|
| | lora_weight = gr.Slider(
|
| | 0.0,
|
| | 1.0,
|
| | value=app_settings.settings.lcm_diffusion_setting.lora.weight,
|
| | step=0.05,
|
| | label="Initial Lora weight",
|
| | interactive=True,
|
| | )
|
| | load_lora_btn = gr.Button(
|
| | "Load selected LoRA",
|
| | elem_id="load_lora_button",
|
| | scale=0,
|
| | )
|
| |
|
| | with gr.Row():
|
| | gr.Markdown(
|
| | "## Loaded LoRA models",
|
| | show_label=False,
|
| | )
|
| | update_lora_weights_btn = gr.Button(
|
| | "Update LoRA weights",
|
| | elem_id="load_lora_button",
|
| | scale=0,
|
| | )
|
| |
|
| | global _MAX_LORA_WEIGHTS
|
| | global _custom_lora_sliders
|
| | global _custom_lora_names
|
| | global _custom_lora_columns
|
| | for i in range(0, _MAX_LORA_WEIGHTS):
|
| | new_row = gr.Column(visible=False)
|
| | _custom_lora_columns.append(new_row)
|
| | with new_row:
|
| | lora_name = gr.Markdown(
|
| | "Lora Name",
|
| | show_label=True,
|
| | )
|
| | lora_slider = gr.Slider(
|
| | 0.0,
|
| | 1.0,
|
| | step=0.05,
|
| | label="LoRA weight",
|
| | interactive=True,
|
| | visible=True,
|
| | )
|
| |
|
| | _custom_lora_names.append(lora_name)
|
| | _custom_lora_sliders.append(lora_slider)
|
| |
|
| | load_lora_btn.click(
|
| | fn=on_click_load_lora,
|
| | inputs=[lora_model, lora_weight],
|
| | outputs=[
|
| | *_custom_lora_names,
|
| | *_custom_lora_sliders,
|
| | *_custom_lora_columns,
|
| | ],
|
| | )
|
| |
|
| | update_lora_weights_btn.click(
|
| | fn=on_click_update_weight,
|
| | inputs=[*_custom_lora_sliders],
|
| | outputs=None,
|
| | )
|
| |
|