Upgrade Gradio release

pull/2250/head
bmaltais 2024-04-10 20:48:12 -04:00
parent 49c34a0ac2
commit fd8bfa8a39
15 changed files with 138 additions and 76 deletions

View File

@ -1 +1 @@
v23.1.4
v23.1.5

View File

@ -42,6 +42,7 @@ The GUI allows you to set the training parameters and generate and run the requi
- [SDXL training](#sdxl-training)
- [Masked loss](#masked-loss)
- [Change History](#change-history)
- [2024/04/10 (v23.1.5)](#20240410-v2315)
- [2024/04/08 (v23.1.4)](#20240408-v2314)
- [2024/04/08 (v23.1.3)](#20240408-v2313)
- [2024/04/08 (v23.1.2)](#20240408-v2312)
@ -407,6 +408,11 @@ ControlNet dataset is used to specify the mask. The mask images should be the RG
## Change History
### 2024/04/10 (v23.1.5)
- Fix issue with Textual Inversion configuration file selection.
- Upgrade to gradio 4.19.2 to fix several high security risks associated to earlier versions. Hoping this will not introduce undorseen issues.
### 2024/04/08 (v23.1.4)
- Relocate config accordion to the top of the GUI.

View File

@ -332,7 +332,7 @@ def gradio_blip2_caption_gui_tab(headless=False, directory_path=None):
)
top_p = gr.Slider(
minimum=-0,
minimum=0,
maximum=1,
value=0.9,
step=0.1,

View File

@ -19,9 +19,9 @@ class BasicTraining:
def __init__(
self,
sdxl_checkbox: gr.Checkbox,
learning_rate_value: str = "1e-6",
learning_rate_value: float = "1e-6",
lr_scheduler_value: str = "constant",
lr_warmup_value: str = "0",
lr_warmup_value: float = "0",
finetuning: bool = False,
dreambooth: bool = False,
config: dict = {},

View File

@ -257,7 +257,7 @@ class SourceModel:
min_width=60,
)
with gr.Column():
gr.Box(visible=False)
gr.Group(visible=False)
with gr.Row():
self.training_comment = gr.Textbox(

View File

@ -47,7 +47,7 @@ PYTHON = sys.executable
def save_configuration(
save_as,
save_as_bool,
file_path,
pretrained_model_name_or_path,
v2,
@ -160,8 +160,6 @@ def save_configuration(
original_file_path = file_path
save_as_bool = True if save_as.get("label") == "True" else False
if save_as_bool:
log.info("Save as...")
file_path = get_saveasfile_path(file_path)
@ -301,8 +299,6 @@ def open_configuration(
# Get list of function parameters and values
parameters = list(locals().items())
ask_for_file = True if ask_for_file.get("label") == "True" else False
original_file_path = file_path
if ask_for_file:
@ -740,8 +736,8 @@ def dreambooth_tab(
headless=False,
config: KohyaSSGUIConfig = {},
):
dummy_db_true = gr.Label(value=True, visible=False)
dummy_db_false = gr.Label(value=False, visible=False)
dummy_db_true = gr.Checkbox(value=True, visible=False)
dummy_db_false = gr.Checkbox(value=False, visible=False)
dummy_headless = gr.Label(value=headless, visible=False)
with gr.Tab("Training"), gr.Column(variant="compact"):
@ -764,9 +760,9 @@ def dreambooth_tab(
with gr.Accordion("Basic", open="True"):
with gr.Group(elem_id="basic_tab"):
basic_training = BasicTraining(
learning_rate_value="1e-5",
learning_rate_value=1e-5,
lr_scheduler_value="cosine",
lr_warmup_value="10",
lr_warmup_value=10,
dreambooth=True,
sdxl_checkbox=source_model.sdxl_checkbox,
config=config,

View File

@ -53,7 +53,7 @@ presets_dir = rf"{scriptdir}/presets"
def save_configuration(
save_as,
save_as_bool,
file_path,
pretrained_model_name_or_path,
v2,
@ -170,8 +170,6 @@ def save_configuration(
original_file_path = file_path
save_as_bool = True if save_as.get("label") == "True" else False
if save_as_bool:
log.info("Save as...")
file_path = get_saveasfile_path(file_path)
@ -319,9 +317,6 @@ def open_configuration(
# Get list of function parameters and values
parameters = list(locals().items())
ask_for_file = True if ask_for_file.get("label") == "True" else False
apply_preset = True if apply_preset.get("label") == "True" else False
# Check if we are "applying" a preset or a config
if apply_preset:
log.info(f"Applying preset {training_preset}...")
@ -764,8 +759,8 @@ def train_model(
def finetune_tab(headless=False, config: dict = {}):
dummy_db_true = gr.Label(value=True, visible=False)
dummy_db_false = gr.Label(value=False, visible=False)
dummy_db_true = gr.Checkbox(value=True, visible=False)
dummy_db_false = gr.Checkbox(value=False, visible=False)
dummy_headless = gr.Label(value=headless, visible=False)
with gr.Tab("Training"), gr.Column(variant="compact"):
gr.Markdown("Train a custom model using kohya finetune python code...")
@ -818,7 +813,7 @@ def finetune_tab(headless=False, config: dict = {}):
with gr.Accordion("Basic", open="True"):
with gr.Group(elem_id="basic_tab"):
basic_training = BasicTraining(
learning_rate_value="1e-5",
learning_rate_value=1e-5,
finetuning=True,
sdxl_checkbox=source_model.sdxl_checkbox,
config=config,
@ -837,7 +832,7 @@ def finetune_tab(headless=False, config: dict = {}):
with gr.Row():
gradient_accumulation_steps = gr.Number(
label="Gradient accumulate steps",
value="1",
value=1,
)
block_lr = gr.Textbox(
label="Block LR (SDXL)",

View File

@ -146,7 +146,7 @@ def gradio_group_images_gui_tab(headless=False):
group_size = gr.Slider(
label="Group size",
info="Number of images to group together",
value="4",
value=4,
minimum=1,
maximum=64,
step=1,

View File

@ -83,7 +83,7 @@ def update_network_args_with_kohya_lora_vars(
def save_configuration(
save_as,
save_as_bool,
file_path,
pretrained_model_name_or_path,
v2,
@ -233,9 +233,6 @@ def save_configuration(
original_file_path = file_path
# Determine whether to save as a new file or overwrite the existing file
save_as_bool = True if save_as.get("label") == "True" else False
# If saving as a new file, get the file path for saving
if save_as_bool:
log.info("Save as...")
@ -423,12 +420,6 @@ def open_configuration(
# Get list of function parameters and values
parameters = list(locals().items())
# Convert 'ask_for_file' and 'apply_preset' from string to boolean based on their 'label' value
# This corrects a critical oversight in the original code, where `.get("label")` method calls were
# made on boolean variables instead of dictionaries
ask_for_file = True if ask_for_file.get("label") == "True" else False
apply_preset = True if apply_preset.get("label") == "True" else False
# Determines if a preset configuration is being applied
if apply_preset:
if training_preset != "none":
@ -1091,8 +1082,8 @@ def lora_tab(
headless=False,
config: dict = {},
):
dummy_db_true = gr.Label(value=True, visible=False)
dummy_db_false = gr.Label(value=False, visible=False)
dummy_db_true = gr.Checkbox(value=True, visible=False)
dummy_db_false = gr.Checkbox(value=False, visible=False)
dummy_headless = gr.Label(value=headless, visible=False)
with gr.Tab("Training"), gr.Column(variant="compact") as tab:
@ -1210,9 +1201,9 @@ def lora_tab(
info="Automatically determine the dim(rank) from the weight file.",
)
basic_training = BasicTraining(
learning_rate_value="0.0001",
learning_rate_value=0.0001,
lr_scheduler_value="cosine",
lr_warmup_value="10",
lr_warmup_value=10,
sdxl_checkbox=source_model.sdxl_checkbox,
config=config,
)
@ -1220,7 +1211,7 @@ def lora_tab(
with gr.Row():
text_encoder_lr = gr.Number(
label="Text Encoder learning rate",
value="0.0001",
value=0.0001,
info="(Optional)",
minimum=0,
maximum=1,
@ -1228,7 +1219,7 @@ def lora_tab(
unet_lr = gr.Number(
label="Unet learning rate",
value="0.0001",
value=0.0001,
info="(Optional)",
minimum=0,
maximum=1,
@ -1286,7 +1277,7 @@ def lora_tab(
visible=False,
)
constrain = gr.Number(
value="0.0",
value=0.0,
label="Constrain OFT",
info="Limits the norm of the oft_blocks, ensuring that their magnitude does not exceed a specified threshold, thus controlling the extent of the transformation applied.",
visible=False,

View File

@ -269,8 +269,8 @@ def gradio_manual_caption_gui_tab(headless=False, default_images_dir=None):
with gr.Tab("Manual Captioning"):
gr.Markdown("This utility allows quick captioning and tagging of images.")
page = gr.Number(-1, visible=False)
max_page = gr.Number(1, visible=False)
page = gr.Number(value=-1, visible=False)
max_page = gr.Number(value=1, visible=False)
loaded_images_dir = gr.Text(visible=False)
with gr.Group(), gr.Row():
images_dir = gr.Dropdown(
@ -336,7 +336,7 @@ def gradio_manual_caption_gui_tab(headless=False, default_images_dir=None):
def render_pagination():
gr.Button("< Prev", elem_id="open_folder").click(
paginate,
inputs=[page, max_page, gr.Number(-1, visible=False)],
inputs=[page, max_page, gr.Number(value=-1, visible=False)],
outputs=[page],
)
page_count = gr.Label("Page 1", label="Page")
@ -352,7 +352,7 @@ def gradio_manual_caption_gui_tab(headless=False, default_images_dir=None):
)
gr.Button("Next >", elem_id="open_folder").click(
paginate,
inputs=[page, max_page, gr.Number(1, visible=False)],
inputs=[page, max_page, gr.Number(value=1, visible=False)],
outputs=[page],
)
return page_count

View File

@ -47,7 +47,7 @@ executor = CommandExecutor()
def save_configuration(
save_as,
save_as_bool,
file_path,
pretrained_model_name_or_path,
v2,
@ -159,8 +159,6 @@ def save_configuration(
original_file_path = file_path
save_as_bool = True if save_as.get("label") == "True" else False
if save_as_bool:
log.info("Save as...")
file_path = get_saveasfile_path(file_path)
@ -301,8 +299,6 @@ def open_configuration(
# Get list of function parameters and values
parameters = list(locals().items())
ask_for_file = True if ask_for_file.get("label") == "True" else False
original_file_path = file_path
if ask_for_file:
@ -710,8 +706,8 @@ def train_model(
def ti_tab(headless=False, default_output_dir=None, config: dict = {}):
dummy_db_true = gr.Label(value=True, visible=False)
dummy_db_false = gr.Label(value=False, visible=False)
dummy_db_true = gr.Checkbox(value=True, visible=False)
dummy_db_false = gr.Checkbox(value=False, visible=False)
dummy_headless = gr.Label(value=headless, visible=False)
current_embedding_dir = (
@ -725,7 +721,7 @@ def ti_tab(headless=False, default_output_dir=None, config: dict = {}):
# Setup Configuration Files Gradio
with gr.Accordion("Configuration", open=False):
configuration = ConfigurationFile(headless=headless)
configuration = ConfigurationFile(headless=headless, config=config)
with gr.Accordion("Accelerate launch", open=False), gr.Column():
accelerate_launch = AccelerateLaunch(config=config)
@ -824,9 +820,9 @@ def ti_tab(headless=False, default_output_dir=None, config: dict = {}):
value="caption",
)
basic_training = BasicTraining(
learning_rate_value="1e-5",
learning_rate_value=1e-5,
lr_scheduler_value="cosine",
lr_warmup_value="10",
lr_warmup_value=10,
sdxl_checkbox=source_model.sdxl_checkbox,
config=config,
)
@ -863,10 +859,6 @@ def ti_tab(headless=False, default_output_dir=None, config: dict = {}):
)
gradio_dataset_balancing_tab(headless=headless)
# Setup Configuration Files Gradio
with gr.Accordion("Configuration", open=False):
configuration = ConfigurationFile(headless=headless)
with gr.Column(), gr.Group():
with gr.Row():
button_run = gr.Button("Start training", variant="primary")

View File

@ -7,7 +7,7 @@ easygui==0.98.3
einops==0.7.0
fairscale==0.4.13
ftfy==6.1.1
gradio==3.50.2
gradio==4.19.2
huggingface-hub==0.20.1
imagesize==1.4.1
invisible-watermark==0.2.0

View File

@ -5,43 +5,72 @@
"bucket_reso_steps": 64,
"cache_latents": true,
"cache_latents_to_disk": false,
"caption_dropout_every_n_epochs": 0.0,
"caption_dropout_every_n_epochs": 0,
"caption_dropout_rate": 0.05,
"caption_extension": "",
"clip_skip": 2,
"color_aug": false,
"dataset_config": "",
"debiased_estimation_loss": false,
"enable_bucket": true,
"epoch": 1,
"extra_accelerate_launch_args": "",
"flip_aug": false,
"full_bf16": false,
"full_fp16": false,
"gradient_accumulation_steps": 1.0,
"gpu_ids": "",
"gradient_accumulation_steps": 1,
"gradient_checkpointing": false,
"huber_c": 0.1,
"huber_schedule": "snr",
"ip_noise_gamma": 0,
"ip_noise_gamma_random_strength": false,
"keep_tokens": "0",
"learning_rate": 5e-05,
"learning_rate_te": 1e-05,
"learning_rate_te1": 1e-05,
"learning_rate_te2": 1e-05,
"log_tracker_config": "",
"log_tracker_name": "",
"logging_dir": "./test/logs",
"loss_type": "l2",
"lr_scheduler": "constant",
"lr_scheduler_args": "",
"lr_scheduler_num_cycles": "",
"lr_scheduler_power": "",
"lr_warmup": 0,
"main_process_port": 0,
"masked_loss": false,
"max_bucket_reso": 2048,
"max_data_loader_n_workers": "0",
"max_resolution": "512,512",
"max_timestep": 1000,
"max_token_length": "75",
"max_train_epochs": "",
"max_train_steps": "",
"mem_eff_attn": false,
"min_bucket_reso": 256,
"min_snr_gamma": 0,
"min_timestep": 0,
"mixed_precision": "bf16",
"model_list": "runwayml/stable-diffusion-v1-5",
"multi_gpu": false,
"multires_noise_discount": 0,
"multires_noise_iterations": 0,
"no_token_padding": false,
"noise_offset": "0.05",
"noise_offset": 0.05,
"noise_offset_random_strength": false,
"noise_offset_type": "Original",
"num_cpu_threads_per_process": 2,
"num_machines": 1,
"num_processes": 1,
"optimizer": "AdamW",
"optimizer_args": "",
"output_dir": "./test/output",
"output_name": "db-AdamW",
"persistent_data_loader_workers": false,
"pretrained_model_name_or_path": "runwayml/stable-diffusion-v1-5",
"prior_loss_weight": 1.0,
"prior_loss_weight": 1,
"random_crop": false,
"reg_data_dir": "",
"resume": "",
@ -49,6 +78,7 @@
"sample_every_n_steps": 25,
"sample_prompts": "a painting of a gas mask , by darius kawasaki",
"sample_sampler": "euler_a",
"save_as_bool": false,
"save_every_n_epochs": 1,
"save_every_n_steps": 0,
"save_last_n_steps": 0,
@ -56,7 +86,9 @@
"save_model_as": "safetensors",
"save_precision": "fp16",
"save_state": false,
"save_state_on_train_end": false,
"scale_v_pred_loss_like_noise_pred": false,
"sdxl": false,
"seed": "1234",
"shuffle_caption": false,
"stop_text_encoder_training": 0,
@ -65,9 +97,11 @@
"use_wandb": false,
"v2": false,
"v_parameterization": false,
"v_pred_like_loss": 0,
"vae": "",
"vae_batch_size": 0,
"wandb_api_key": "",
"wandb_run_name": "",
"weighted_captions": false,
"xformers": true
"xformers": "xformers"
}

View File

@ -7,7 +7,7 @@
"bucket_reso_steps": 1,
"cache_latents": true,
"cache_latents_to_disk": false,
"caption_dropout_every_n_epochs": 0.0,
"caption_dropout_every_n_epochs": 0,
"caption_dropout_rate": 0,
"caption_extension": ".txt",
"caption_metadata_filename": "meta-1_cap.json",
@ -18,26 +18,34 @@
"dataset_config": "",
"dataset_repeats": "50",
"epoch": 2,
"extra_accelerate_launch_args": "",
"flip_aug": false,
"full_bf16": false,
"full_fp16": false,
"full_path": true,
"gpu_ids": "",
"gradient_accumulation_steps": 1.0,
"gradient_accumulation_steps": 1,
"gradient_checkpointing": false,
"huber_c": 0.1,
"huber_schedule": "snr",
"image_folder": ".\\test\\img\\10_darius kawasaki person",
"ip_noise_gamma": 0,
"ip_noise_gamma_random_strength": false,
"keep_tokens": 0,
"latent_metadata_filename": "meta-1_lat.json",
"learning_rate": 1e-05,
"learning_rate_te": 5e-06,
"learning_rate_te1": 5e-06,
"learning_rate_te2": 0.0,
"learning_rate_te2": 0,
"log_tracker_config": "",
"log_tracker_name": "",
"logging_dir": "./test/ft",
"loss_type": "l2",
"lr_scheduler": "cosine_with_restarts",
"lr_scheduler_args": "",
"lr_warmup": 10,
"main_process_port": 0,
"masked_loss": false,
"max_bucket_reso": "1024",
"max_data_loader_n_workers": "0",
"max_resolution": "512,512",
@ -55,6 +63,7 @@
"multires_noise_discount": 0,
"multires_noise_iterations": 0,
"noise_offset": 0,
"noise_offset_random_strength": false,
"noise_offset_type": "Original",
"num_cpu_threads_per_process": 2,
"num_machines": 1,
@ -71,6 +80,7 @@
"sample_every_n_steps": 0,
"sample_prompts": "",
"sample_sampler": "euler_a",
"save_as_bool": false,
"save_every_n_epochs": 1,
"save_every_n_steps": 0,
"save_last_n_steps": 0,
@ -78,6 +88,7 @@
"save_model_as": "safetensors",
"save_precision": "bf16",
"save_state": false,
"save_state_on_train_end": false,
"scale_v_pred_loss_like_noise_pred": false,
"sdxl_cache_text_encoder_outputs": false,
"sdxl_checkbox": false,

View File

@ -1,5 +1,6 @@
{
"LoRA_type": "Kohya LoCon",
"LyCORIS_preset": "full",
"adaptive_noise_scale": 0,
"additional_parameters": "",
"block_alphas": "",
@ -7,71 +8,100 @@
"block_lr_zero_threshold": "",
"bucket_no_upscale": true,
"bucket_reso_steps": 64,
"bypass_mode": false,
"cache_latents": true,
"cache_latents_to_disk": false,
"caption_dropout_every_n_epochs": 0.0,
"caption_dropout_every_n_epochs": 0,
"caption_dropout_rate": 0.05,
"caption_extension": "",
"clip_skip": 2,
"color_aug": false,
"constrain": 0,
"conv_alpha": 8,
"conv_alphas": "",
"conv_block_alphas": "",
"conv_block_dims": "",
"conv_dim": 16,
"conv_dims": "",
"dataset_config": "",
"debiased_estimation_loss": false,
"decompose_both": false,
"dim_from_weights": false,
"dora_wd": false,
"down_lr_weight": "",
"enable_bucket": true,
"epoch": 1,
"extra_accelerate_launch_args": "",
"factor": -1,
"flip_aug": false,
"fp8_base": false,
"full_bf16": false,
"full_fp16": false,
"gpu_ids": "",
"gradient_accumulation_steps": 4,
"gradient_checkpointing": false,
"huber_c": 0.1,
"huber_schedule": "snr",
"ip_noise_gamma": 0,
"ip_noise_gamma_random_strength": false,
"keep_tokens": "0",
"learning_rate": 0.0005,
"log_tracker_config": "",
"log_tracker_name": "",
"logging_dir": "./test/logs",
"lora_network_weights": "",
"loss_type": "l2",
"lr_scheduler": "constant",
"lr_scheduler_args": "",
"lr_scheduler_num_cycles": "",
"lr_scheduler_power": "",
"lr_warmup": 0,
"main_process_port": 0,
"masked_loss": false,
"max_bucket_reso": 2048,
"max_data_loader_n_workers": "0",
"max_grad_norm": 1,
"max_resolution": "512,512",
"max_timestep": 1000,
"max_token_length": "75",
"max_train_epochs": "",
"max_train_steps": "",
"mem_eff_attn": false,
"mid_lr_weight": "",
"min_bucket_reso": 256,
"min_snr_gamma": 0,
"min_timestep": 0,
"mixed_precision": "bf16",
"model_list": "runwayml/stable-diffusion-v1-5",
"module_dropout": 0.1,
"multi_gpu": false,
"multires_noise_discount": 0,
"multires_noise_iterations": 0,
"network_alpha": 8,
"network_dim": 16,
"network_dropout": 0.1,
"no_token_padding": false,
"noise_offset": "0.05",
"noise_offset": 0.05,
"noise_offset_random_strength": false,
"noise_offset_type": "Original",
"num_cpu_threads_per_process": 2,
"num_machines": 1,
"num_processes": 1,
"optimizer": "AdamW",
"optimizer_args": "",
"output_dir": "./test/output",
"output_name": "locon-AdamW",
"persistent_data_loader_workers": false,
"pretrained_model_name_or_path": "runwayml/stable-diffusion-v1-5",
"prior_loss_weight": 1.0,
"prior_loss_weight": 1,
"random_crop": false,
"rank_dropout": 0.1,
"rank_dropout_scale": false,
"reg_data_dir": "",
"rescaled": false,
"resume": "",
"sample_every_n_epochs": 0,
"sample_every_n_steps": 25,
"sample_prompts": "a painting of a gas mask , by darius kawasaki",
"sample_sampler": "euler_a",
"save_as_bool": false,
"save_every_n_epochs": 1,
"save_every_n_steps": 0,
"save_last_n_steps": 0,
@ -79,6 +109,7 @@
"save_model_as": "safetensors",
"save_precision": "fp16",
"save_state": false,
"save_state_on_train_end": false,
"scale_v_pred_loss_like_noise_pred": false,
"scale_weight_norms": 1,
"sdxl": false,
@ -90,17 +121,23 @@
"text_encoder_lr": 0.0001,
"train_batch_size": 1,
"train_data_dir": "./test/img",
"train_norm": false,
"train_on_input": false,
"training_comment": "",
"unet_lr": 0.0001,
"unit": 1,
"up_lr_weight": "",
"use_cp": false,
"use_scalar": false,
"use_tucker": false,
"use_wandb": false,
"v2": false,
"v_parameterization": false,
"v_pred_like_loss": 0,
"vae": "",
"vae_batch_size": 0,
"wandb_api_key": "",
"wandb_run_name": "",
"weighted_captions": false,
"xformers": true
"xformers": "xformers"
}