|
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 |
|
|
|
|
|
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, |
|
): |
|
|
|
if db_model == '': |
|
msgbox('Invalid finetuned model file') |
|
return |
|
|
|
if base_model == '': |
|
msgbox('Invalid base model file') |
|
return |
|
|
|
|
|
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) |
|
|
|
|
|
if os.name == 'posix': |
|
os.system(run_cmd) |
|
else: |
|
subprocess.run(run_cmd) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def update_mode(mode): |
|
|
|
modes = ['fixed', 'threshold', 'ratio', 'quantile'] |
|
|
|
|
|
updates = [] |
|
|
|
|
|
for m in modes: |
|
|
|
updates.append(gr.Row.update(visible=(mode == m))) |
|
|
|
|
|
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_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, |
|
) |
|
|