Adding GUI support for new features

This commit is contained in:
bmaltais 2023-02-22 20:32:57 -05:00
parent 2a5fb346d5
commit bf0344ba9e
8 changed files with 60 additions and 22 deletions

View File

@ -164,8 +164,10 @@ This will store your a backup file with your current locally installed pip packa
## Change History
* 2023/02/22 (v20.8.0):
- Add gui support for optimizers: `AdamW, AdamW8bit, Lion, SGDNesterov, SGDNesterov8bit, DAdaptation, AdaFactor`
- Add gui support for `--noise_offset`
- Refactor optmizer options. Thanks to mgz-dev!
- Add `--optimizer_type` option for each training script. Please see help. Japanese documentation is [here](https://github.com/kohya-ss/sd-scripts/blob/main/train_network_README-ja.md#%E3%82%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%9E%E3%82%A4%E3%82%B6%E3%81%AE%E6%8C%87%E5%AE%9A%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6).
- Add `--optimizer_type` option for each training script. Please see help. Japanese documentation is [here](https://github-com.translate.goog/kohya-ss/sd-scripts/blob/main/train_network_README-ja.md?_x_tr_sl=fr&_x_tr_tl=en&_x_tr_hl=en-US&_x_tr_pto=wapp#%E3%82%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%9E%E3%82%A4%E3%82%B6%E3%81%AE%E6%8C%87%E5%AE%9A%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6).
- `--use_8bit_adam` and `--use_lion_optimizer` options also work and will override the options above for backward compatibility.
- Add SGDNesterov and its 8bit.
- Add [D-Adaptation](https://github.com/facebookresearch/dadaptation) optimizer. Thanks to BootsofLagrangian and all!

View File

@ -90,6 +90,7 @@ def save_configuration(
bucket_reso_steps,
caption_dropout_every_n_epochs, caption_dropout_rate,
optimizer,
optimizer_args,noise_offset,
):
# Get list of function parameters and values
parameters = list(locals().items())
@ -188,6 +189,7 @@ def open_configuration(
bucket_reso_steps,
caption_dropout_every_n_epochs, caption_dropout_rate,
optimizer,
optimizer_args,noise_offset,
):
# Get list of function parameters and values
parameters = list(locals().items())
@ -263,6 +265,7 @@ def train_model(
bucket_reso_steps,
caption_dropout_every_n_epochs, caption_dropout_rate,
optimizer,
optimizer_args,noise_offset,
):
if pretrained_model_name_or_path == '':
msgbox('Source model information is missing')
@ -407,7 +410,8 @@ def train_model(
seed=seed,
caption_extension=caption_extension,
cache_latents=cache_latents,
optimizer=optimizer
optimizer=optimizer,
optimizer_args=optimizer_args,
)
run_cmd += run_cmd_advanced_training(
@ -432,6 +436,7 @@ def train_model(
bucket_reso_steps=bucket_reso_steps,
caption_dropout_every_n_epochs=caption_dropout_every_n_epochs,
caption_dropout_rate=caption_dropout_rate,
noise_offset=noise_offset,
)
print(run_cmd)
@ -552,7 +557,7 @@ def dreambooth_tab(
seed,
caption_extension,
cache_latents,
optimizer,
optimizer,optimizer_args,
) = gradio_training(
learning_rate_value='1e-5',
lr_scheduler_value='cosine',
@ -610,7 +615,7 @@ def dreambooth_tab(
bucket_no_upscale,
random_crop,
bucket_reso_steps,
caption_dropout_every_n_epochs, caption_dropout_rate,
caption_dropout_every_n_epochs, caption_dropout_rate,noise_offset,
) = gradio_advanced_training()
color_aug.change(
color_aug_changed,
@ -680,7 +685,7 @@ def dreambooth_tab(
random_crop,
bucket_reso_steps,
caption_dropout_every_n_epochs, caption_dropout_rate,
optimizer,
optimizer,optimizer_args,noise_offset,
]
button_open_config.click(

View File

@ -85,7 +85,7 @@ def save_configuration(
random_crop,
bucket_reso_steps,
caption_dropout_every_n_epochs, caption_dropout_rate,
optimizer,
optimizer,optimizer_args,noise_offset,
):
# Get list of function parameters and values
parameters = list(locals().items())
@ -189,7 +189,7 @@ def open_config_file(
random_crop,
bucket_reso_steps,
caption_dropout_every_n_epochs, caption_dropout_rate,
optimizer,
optimizer,optimizer_args,noise_offset,
):
# Get list of function parameters and values
parameters = list(locals().items())
@ -271,7 +271,7 @@ def train_model(
random_crop,
bucket_reso_steps,
caption_dropout_every_n_epochs, caption_dropout_rate,
optimizer,
optimizer,optimizer_args,noise_offset,
):
# create caption json file
if generate_caption_database:
@ -397,6 +397,7 @@ def train_model(
caption_extension=caption_extension,
cache_latents=cache_latents,
optimizer=optimizer,
optimizer_args=optimizer_args,
)
run_cmd += run_cmd_advanced_training(
@ -421,6 +422,7 @@ def train_model(
bucket_reso_steps=bucket_reso_steps,
caption_dropout_every_n_epochs=caption_dropout_every_n_epochs,
caption_dropout_rate=caption_dropout_rate,
noise_offset=noise_offset,
)
print(run_cmd)
@ -575,7 +577,7 @@ def finetune_tab():
seed,
caption_extension,
cache_latents,
optimizer,
optimizer,optimizer_args,
) = gradio_training(learning_rate_value='1e-5')
with gr.Row():
dataset_repeats = gr.Textbox(label='Dataset repeats', value=40)
@ -607,7 +609,7 @@ def finetune_tab():
bucket_no_upscale,
random_crop,
bucket_reso_steps,
caption_dropout_every_n_epochs, caption_dropout_rate,
caption_dropout_every_n_epochs, caption_dropout_rate,noise_offset,
) = gradio_advanced_training()
color_aug.change(
color_aug_changed,
@ -673,7 +675,7 @@ def finetune_tab():
random_crop,
bucket_reso_steps,
caption_dropout_every_n_epochs, caption_dropout_rate,
optimizer,
optimizer,optimizer_args,noise_offset,
]
button_run.click(train_model, inputs=settings_list)

View File

@ -469,11 +469,20 @@ def gradio_training(
label='Optimizer',
choices=[
'AdamW',
'AdamW8bit',
'Adafactor',
'DAdaptation',
'Lion',
'SGDNesterov',
'SGDNesterov8bit'
],
value="AdamW",
interactive=True,
)
with gr.Row():
optimizer_args = gr.Textbox(
label='Optimizer extra arguments', placeholder='(Optional) eg: relative_step=True scale_parameter=True warmup_init=True'
)
return (
learning_rate,
lr_scheduler,
@ -488,6 +497,7 @@ def gradio_training(
caption_extension,
cache_latents,
optimizer,
optimizer_args,
)
@ -522,7 +532,9 @@ def run_cmd_training(**kwargs):
if kwargs.get('caption_extension')
else '',
' --cache_latents' if kwargs.get('cache_latents') else '',
' --use_lion_optimizer' if kwargs.get('optimizer') == 'Lion' else '',
# ' --use_lion_optimizer' if kwargs.get('optimizer') == 'Lion' else '',
f' --optimizer_type="{kwargs.get("optimizer", "AdamW")}"',
f' --optimizer_args {kwargs.get("optimizer_args", "")}' if not kwargs.get('optimizer_args') == '' else '',
]
run_cmd = ''.join(options)
return run_cmd
@ -597,6 +609,10 @@ def gradio_advanced_training():
random_crop = gr.Checkbox(
label='Random crop instead of center crop', value=False
)
noise_offset = gr.Textbox(
label='Noise offset (0 - 1)', placeholder='(Oprional) eg: 0.1'
)
with gr.Row():
caption_dropout_every_n_epochs = gr.Number(
label="Dropout caption every n epochs",
@ -644,7 +660,7 @@ def gradio_advanced_training():
bucket_no_upscale,
random_crop,
bucket_reso_steps,
caption_dropout_every_n_epochs, caption_dropout_rate,
caption_dropout_every_n_epochs, caption_dropout_rate,noise_offset,
)
@ -695,6 +711,9 @@ def run_cmd_advanced_training(**kwargs):
else '',
' --bucket_no_upscale' if kwargs.get('bucket_no_upscale') else '',
' --random_crop' if kwargs.get('random_crop') else '',
f' --noise_offset={float(kwargs.get("noise_offset", 0))}'
if not kwargs.get('noise_offset', '') == ''
else '',
]
run_cmd = ''.join(options)
return run_cmd

View File

@ -1633,7 +1633,7 @@ def get_optimizer(args, trainable_params):
if optimizer_kwargs["relative_step"]:
print(f"relative_step is true / relative_stepがtrueです")
if lr != 0.0:
print(f"learning rate is used as initial_lr / 指定したlearning rateはinitial_lrとして使用されます")
print(f"learning rate is used as initial_lr / 指定したlearning rate はinitial_lrとして使用されます: {lr}")
args.learning_rate = None
# trainable_paramsがgroupだった時の処理lrを削除する

View File

@ -101,6 +101,7 @@ def save_configuration(
bucket_reso_steps,
caption_dropout_every_n_epochs, caption_dropout_rate,
optimizer,
optimizer_args,noise_offset,
):
# Get list of function parameters and values
parameters = list(locals().items())
@ -206,6 +207,7 @@ def open_configuration(
bucket_reso_steps,
caption_dropout_every_n_epochs, caption_dropout_rate,
optimizer,
optimizer_args,noise_offset,
):
# Get list of function parameters and values
parameters = list(locals().items())
@ -288,6 +290,7 @@ def train_model(
bucket_reso_steps,
caption_dropout_every_n_epochs, caption_dropout_rate,
optimizer,
optimizer_args,noise_offset,
):
if pretrained_model_name_or_path == '':
msgbox('Source model information is missing')
@ -468,6 +471,7 @@ def train_model(
caption_extension=caption_extension,
cache_latents=cache_latents,
optimizer=optimizer,
optimizer_args=optimizer_args,
)
run_cmd += run_cmd_advanced_training(
@ -492,6 +496,7 @@ def train_model(
bucket_reso_steps=bucket_reso_steps,
caption_dropout_every_n_epochs=caption_dropout_every_n_epochs,
caption_dropout_rate=caption_dropout_rate,
noise_offset=noise_offset,
)
print(run_cmd)
@ -621,6 +626,7 @@ def lora_tab(
caption_extension,
cache_latents,
optimizer,
optimizer_args,
) = gradio_training(
learning_rate_value='0.0001',
lr_scheduler_value='cosine',
@ -708,7 +714,7 @@ def lora_tab(
bucket_no_upscale,
random_crop,
bucket_reso_steps,
caption_dropout_every_n_epochs, caption_dropout_rate,
caption_dropout_every_n_epochs, caption_dropout_rate,noise_offset,
) = gradio_advanced_training()
color_aug.change(
color_aug_changed,
@ -791,6 +797,7 @@ def lora_tab(
bucket_reso_steps,
caption_dropout_every_n_epochs, caption_dropout_rate,
optimizer,
optimizer_args,noise_offset,
]
button_open_config.click(

View File

@ -95,7 +95,7 @@ def save_configuration(
random_crop,
bucket_reso_steps,
caption_dropout_every_n_epochs, caption_dropout_rate,
optimizer,
optimizer,optimizer_args,noise_offset,
):
# Get list of function parameters and values
parameters = list(locals().items())
@ -199,7 +199,7 @@ def open_configuration(
random_crop,
bucket_reso_steps,
caption_dropout_every_n_epochs, caption_dropout_rate,
optimizer,
optimizer,optimizer_args,noise_offset,
):
# Get list of function parameters and values
parameters = list(locals().items())
@ -280,7 +280,7 @@ def train_model(
random_crop,
bucket_reso_steps,
caption_dropout_every_n_epochs, caption_dropout_rate,
optimizer,
optimizer,optimizer_args,noise_offset,
):
if pretrained_model_name_or_path == '':
msgbox('Source model information is missing')
@ -441,6 +441,7 @@ def train_model(
caption_extension=caption_extension,
cache_latents=cache_latents,
optimizer=optimizer,
optimizer_args=optimizer_args,
)
run_cmd += run_cmd_advanced_training(
@ -465,6 +466,7 @@ def train_model(
bucket_reso_steps=bucket_reso_steps,
caption_dropout_every_n_epochs=caption_dropout_every_n_epochs,
caption_dropout_rate=caption_dropout_rate,
noise_offset=noise_offset,
)
run_cmd += f' --token_string="{token_string}"'
run_cmd += f' --init_word="{init_word}"'
@ -630,7 +632,7 @@ def ti_tab(
seed,
caption_extension,
cache_latents,
optimizer,
optimizer,optimizer_args,
) = gradio_training(
learning_rate_value='1e-5',
lr_scheduler_value='cosine',
@ -688,7 +690,7 @@ def ti_tab(
bucket_no_upscale,
random_crop,
bucket_reso_steps,
caption_dropout_every_n_epochs, caption_dropout_rate,
caption_dropout_every_n_epochs, caption_dropout_rate,noise_offset,
) = gradio_advanced_training()
color_aug.change(
color_aug_changed,
@ -764,7 +766,7 @@ def ti_tab(
random_crop,
bucket_reso_steps,
caption_dropout_every_n_epochs, caption_dropout_rate,
optimizer,
optimizer,optimizer_args,noise_offset,
]
button_open_config.click(

View File

@ -36,7 +36,8 @@ def generate_step_logs(args: argparse.Namespace, current_loss, avr_loss, lr_sche
logs["lr/unet"] = float(lr_scheduler.get_last_lr()[-1]) # may be same to textencoder
if args.optimizer_type.lower() == "DAdaptation".lower(): # tracking d*lr value of unet.
logs["lr/d*lr"] = lr_scheduler.optimizers[-1].param_groups[0]['d']*lr_scheduler.optimizers[-1].param_groups[0]['lr']
logs["lr/d*lr-textencoder"] = lr_scheduler.optimizers[-1].param_groups[0]['d']*lr_scheduler.optimizers[-1].param_groups[0]['lr']
logs["lr/d*lr-unet"] = lr_scheduler.optimizers[-1].param_groups[1]['d']*lr_scheduler.optimizers[-1].param_groups[1]['lr']
return logs