kohya_ss / library /extract_lycoris_locon_gui.py
Ateras's picture
Upload folder using huggingface_hub
fe6327d
import gradio as gr
from easygui import msgbox
import subprocess
import os
from .common_gui import (
get_saveasfilename_path,
get_any_file_path,
get_file_path,
)
from library.custom_logging import setup_logging
# Set up logging
log = setup_logging()
folder_symbol = '\U0001f4c2' # πŸ“‚
refresh_symbol = '\U0001f504' # πŸ”„
save_style_symbol = '\U0001f4be' # πŸ’Ύ
document_symbol = '\U0001F4C4' # πŸ“„
PYTHON = 'python3' if os.name == 'posix' else './venv/Scripts/python.exe'
def extract_lycoris_locon(
db_model,
base_model,
output_name,
device,
is_v2,
mode,
linear_dim,
conv_dim,
linear_threshold,
conv_threshold,
linear_ratio,
conv_ratio,
linear_quantile,
conv_quantile,
use_sparse_bias,
sparsity,
disable_cp,
):
# Check for caption_text_input
if db_model == '':
msgbox('Invalid finetuned model file')
return
if base_model == '':
msgbox('Invalid base model file')
return
# Check if source model exist
if not os.path.isfile(db_model):
msgbox('The provided finetuned model is not a file')
return
if not os.path.isfile(base_model):
msgbox('The provided base model is not a file')
return
run_cmd = f'{PYTHON} "{os.path.join("tools","lycoris_locon_extract.py")}"'
if is_v2:
run_cmd += f' --is_v2'
run_cmd += f' --device {device}'
run_cmd += f' --mode {mode}'
run_cmd += f' --safetensors'
if mode == 'fixed':
run_cmd += f' --linear_dim {linear_dim}'
run_cmd += f' --conv_dim {conv_dim}'
if mode == 'threshold':
run_cmd += f' --linear_threshold {linear_threshold}'
run_cmd += f' --conv_threshold {conv_threshold}'
if mode == 'ratio':
run_cmd += f' --linear_ratio {linear_ratio}'
run_cmd += f' --conv_ratio {conv_ratio}'
if mode == 'quantile':
run_cmd += f' --linear_quantile {linear_quantile}'
run_cmd += f' --conv_quantile {conv_quantile}'
if use_sparse_bias:
run_cmd += f' --use_sparse_bias'
run_cmd += f' --sparsity {sparsity}'
if disable_cp:
run_cmd += f' --disable_cp'
run_cmd += f' "{base_model}"'
run_cmd += f' "{db_model}"'
run_cmd += f' "{output_name}"'
log.info(run_cmd)
# Run the command
if os.name == 'posix':
os.system(run_cmd)
else:
subprocess.run(run_cmd)
###
# Gradio UI
###
# def update_mode(mode):
# # 'fixed', 'threshold','ratio','quantile'
# if mode == 'fixed':
# return gr.Row.update(visible=True), gr.Row.update(visible=False), gr.Row.update(visible=False), gr.Row.update(visible=False)
# if mode == 'threshold':
# return gr.Row.update(visible=False), gr.Row.update(visible=True), gr.Row.update(visible=False), gr.Row.update(visible=False)
# if mode == 'ratio':
# return gr.Row.update(visible=False), gr.Row.update(visible=False), gr.Row.update(visible=True), gr.Row.update(visible=False)
# if mode == 'threshold':
# return gr.Row.update(visible=False), gr.Row.update(visible=False), gr.Row.update(visible=False), gr.Row.update(visible=True)
def update_mode(mode):
# Create a list of possible mode values
modes = ['fixed', 'threshold', 'ratio', 'quantile']
# Initialize an empty list to store visibility updates
updates = []
# Iterate through the possible modes
for m in modes:
# Add a visibility update for each mode, setting it to True if the input mode matches the current mode in the loop
updates.append(gr.Row.update(visible=(mode == m)))
# Return the visibility updates as a tuple
return tuple(updates)
def gradio_extract_lycoris_locon_tab(headless=False):
with gr.Tab('Extract LyCORIS LoCON'):
gr.Markdown(
'This utility can extract a LyCORIS LoCon network from a finetuned model.'
)
lora_ext = gr.Textbox(
value='*.safetensors', visible=False
) # lora_ext = gr.Textbox(value='*.safetensors *.pt', visible=False)
lora_ext_name = gr.Textbox(value='LoRA model types', visible=False)
model_ext = gr.Textbox(value='*.safetensors *.ckpt', visible=False)
model_ext_name = gr.Textbox(value='Model types', visible=False)
with gr.Row():
db_model = gr.Textbox(
label='Finetuned model',
placeholder='Path to the finetuned model to extract',
interactive=True,
)
button_db_model_file = gr.Button(
folder_symbol,
elem_id='open_folder_small',
visible=(not headless),
)
button_db_model_file.click(
get_file_path,
inputs=[db_model, model_ext, model_ext_name],
outputs=db_model,
show_progress=False,
)
base_model = gr.Textbox(
label='Stable Diffusion base model',
placeholder='Stable Diffusion original model: ckpt or safetensors file',
interactive=True,
)
button_base_model_file = gr.Button(
folder_symbol,
elem_id='open_folder_small',
visible=(not headless),
)
button_base_model_file.click(
get_file_path,
inputs=[base_model, model_ext, model_ext_name],
outputs=base_model,
show_progress=False,
)
with gr.Row():
output_name = gr.Textbox(
label='Save to',
placeholder='path where to save the extracted LoRA model...',
interactive=True,
)
button_output_name = gr.Button(
folder_symbol,
elem_id='open_folder_small',
visible=(not headless),
)
button_output_name.click(
get_saveasfilename_path,
inputs=[output_name, lora_ext, lora_ext_name],
outputs=output_name,
show_progress=False,
)
device = gr.Dropdown(
label='Device',
choices=[
'cpu',
'cuda',
],
value='cuda',
interactive=True,
)
is_v2 = gr.Checkbox(label='is v2', value=False, interactive=True)
mode = gr.Dropdown(
label='Mode',
choices=['fixed', 'threshold', 'ratio', 'quantile'],
value='fixed',
interactive=True,
)
with gr.Row(visible=True) as fixed:
linear_dim = gr.Slider(
minimum=1,
maximum=1024,
label='Network Dimension',
value=1,
step=1,
interactive=True,
)
conv_dim = gr.Slider(
minimum=1,
maximum=1024,
label='Conv Dimension',
value=1,
step=1,
interactive=True,
)
with gr.Row(visible=False) as threshold:
linear_threshold = gr.Slider(
minimum=0,
maximum=1,
label='Linear threshold',
value=0.65,
step=0.01,
interactive=True,
info='The higher the value, the smaller the file. Recommended starting value: 0.65',
)
conv_threshold = gr.Slider(
minimum=0,
maximum=1,
label='Conv threshold',
value=0.65,
step=0.01,
interactive=True,
info='The higher the value, the smaller the file. Recommended starting value: 0.65',
)
with gr.Row(visible=False) as ratio:
linear_ratio = gr.Slider(
minimum=0,
maximum=1,
label='Linear ratio',
value=0.75,
step=0.01,
interactive=True,
info='The higher the value, the smaller the file. Recommended starting value: 0.75',
)
conv_ratio = gr.Slider(
minimum=0,
maximum=1,
label='Conv ratio',
value=0.75,
step=0.01,
interactive=True,
info='The higher the value, the smaller the file. Recommended starting value: 0.75',
)
with gr.Row(visible=False) as quantile:
linear_quantile = gr.Slider(
minimum=0,
maximum=1,
label='Linear quantile',
value=0.75,
step=0.01,
interactive=True,
info='The higher the value, the larger the file. Recommended starting value: 0.75',
)
conv_quantile = gr.Slider(
minimum=0,
maximum=1,
label='Conv quantile',
value=0.75,
step=0.01,
interactive=True,
info='The higher the value, the larger the file. Recommended starting value: 0.75',
)
with gr.Row():
use_sparse_bias = gr.Checkbox(
label='Use sparse biais', value=False, interactive=True
)
sparsity = gr.Slider(
minimum=0,
maximum=1,
label='Sparsity',
value=0.98,
step=0.01,
interactive=True,
)
disable_cp = gr.Checkbox(
label='Disable CP decomposition', value=False, interactive=True
)
mode.change(
update_mode,
inputs=[mode],
outputs=[
fixed,
threshold,
ratio,
quantile,
],
)
extract_button = gr.Button('Extract LyCORIS LoCon')
extract_button.click(
extract_lycoris_locon,
inputs=[
db_model,
base_model,
output_name,
device,
is_v2,
mode,
linear_dim,
conv_dim,
linear_threshold,
conv_threshold,
linear_ratio,
conv_ratio,
linear_quantile,
conv_quantile,
use_sparse_bias,
sparsity,
disable_cp,
],
show_progress=False,
)