2022-12-18 18:11:10 +00:00
import gradio as gr
from easygui import msgbox
import subprocess
import os
import shutil
from . common_gui import get_folder_path , get_file_path
folder_symbol = ' \U0001f4c2 ' # 📂
refresh_symbol = ' \U0001f504 ' # 🔄
save_style_symbol = ' \U0001f4be ' # 💾
2022-12-20 02:50:05 +00:00
document_symbol = ' \U0001F4C4 ' # 📄
2023-03-04 23:56:22 +00:00
PYTHON = ' python3 ' if os . name == ' posix ' else ' ./venv/Scripts/python.exe '
2022-12-20 02:50:05 +00:00
def convert_model (
source_model_input ,
source_model_type ,
target_model_folder_input ,
target_model_name_input ,
target_model_type ,
target_save_precision_type ,
) :
2022-12-18 18:11:10 +00:00
# Check for caption_text_input
2022-12-20 02:50:05 +00:00
if source_model_type == ' ' :
msgbox ( ' Invalid source model type ' )
2022-12-18 18:11:10 +00:00
return
2022-12-20 02:50:05 +00:00
2022-12-18 18:11:10 +00:00
# Check if source model exist
if os . path . isfile ( source_model_input ) :
print ( ' The provided source model is a file ' )
elif os . path . isdir ( source_model_input ) :
print ( ' The provided model is a folder ' )
else :
2022-12-20 02:50:05 +00:00
msgbox ( ' The provided source model is neither a file nor a folder ' )
2022-12-18 18:11:10 +00:00
return
2022-12-20 02:50:05 +00:00
2022-12-18 18:11:10 +00:00
# Check if source model exist
if os . path . isdir ( target_model_folder_input ) :
print ( ' The provided model folder exist ' )
else :
2022-12-20 02:50:05 +00:00
msgbox ( ' The provided target folder does not exist ' )
2022-12-18 18:11:10 +00:00
return
2022-12-20 02:50:05 +00:00
2023-03-04 05:11:23 +00:00
run_cmd = f ' { PYTHON } " tools/convert_diffusers20_original_sd.py " '
2022-12-20 02:50:05 +00:00
2022-12-18 18:11:10 +00:00
v1_models = [
2022-12-20 02:50:05 +00:00
' runwayml/stable-diffusion-v1-5 ' ,
' CompVis/stable-diffusion-v1-4 ' ,
2022-12-18 18:11:10 +00:00
]
2022-12-20 02:50:05 +00:00
2022-12-18 18:11:10 +00:00
# check if v1 models
if str ( source_model_type ) in v1_models :
print ( ' SD v1 model specified. Setting --v1 parameter ' )
run_cmd + = ' --v1 '
else :
print ( ' SD v2 model specified. Setting --v2 parameter ' )
run_cmd + = ' --v2 '
2022-12-20 02:50:05 +00:00
2022-12-18 18:11:10 +00:00
if not target_save_precision_type == ' unspecified ' :
run_cmd + = f ' -- { target_save_precision_type } '
2022-12-20 02:50:05 +00:00
if (
target_model_type == ' diffuser '
or target_model_type == ' diffuser_safetensors '
) :
2022-12-18 18:11:10 +00:00
run_cmd + = f ' --reference_model= " { source_model_type } " '
2022-12-20 02:50:05 +00:00
2022-12-19 14:22:52 +00:00
if target_model_type == ' diffuser_safetensors ' :
run_cmd + = ' --use_safetensors '
2022-12-20 02:50:05 +00:00
2022-12-18 18:11:10 +00:00
run_cmd + = f ' " { source_model_input } " '
2022-12-20 02:50:05 +00:00
if (
target_model_type == ' diffuser '
or target_model_type == ' diffuser_safetensors '
) :
target_model_path = os . path . join (
target_model_folder_input , target_model_name_input
)
2022-12-18 18:11:10 +00:00
run_cmd + = f ' " { target_model_path } " '
else :
2022-12-20 02:50:05 +00:00
target_model_path = os . path . join (
target_model_folder_input ,
f ' { target_model_name_input } . { target_model_type } ' ,
)
2022-12-18 18:11:10 +00:00
run_cmd + = f ' " { target_model_path } " '
2022-12-20 02:50:05 +00:00
2022-12-18 18:11:10 +00:00
print ( run_cmd )
2022-12-20 02:50:05 +00:00
2022-12-18 18:11:10 +00:00
# Run the command
2023-03-05 16:43:59 +00:00
if os . name == ' posix ' :
os . system ( run_cmd )
else :
subprocess . run ( run_cmd )
2022-12-20 02:50:05 +00:00
if (
not target_model_type == ' diffuser '
or target_model_type == ' diffuser_safetensors '
) :
v2_models = [
' stabilityai/stable-diffusion-2-1-base ' ,
' stabilityai/stable-diffusion-2-base ' ,
]
v_parameterization = [
' stabilityai/stable-diffusion-2-1 ' ,
' stabilityai/stable-diffusion-2 ' ,
]
2022-12-18 18:11:10 +00:00
if str ( source_model_type ) in v2_models :
2022-12-20 02:50:05 +00:00
inference_file = os . path . join (
target_model_folder_input , f ' { target_model_name_input } .yaml '
)
2022-12-18 18:11:10 +00:00
print ( f ' Saving v2-inference.yaml as { inference_file } ' )
shutil . copy (
f ' ./v2_inference/v2-inference.yaml ' ,
f ' { inference_file } ' ,
)
2022-12-20 02:50:05 +00:00
2022-12-18 18:11:10 +00:00
if str ( source_model_type ) in v_parameterization :
2022-12-20 02:50:05 +00:00
inference_file = os . path . join (
target_model_folder_input , f ' { target_model_name_input } .yaml '
)
2022-12-18 18:11:10 +00:00
print ( f ' Saving v2-inference-v.yaml as { inference_file } ' )
shutil . copy (
f ' ./v2_inference/v2-inference-v.yaml ' ,
f ' { inference_file } ' ,
)
2022-12-20 02:50:05 +00:00
2022-12-18 18:11:10 +00:00
# parser = argparse.ArgumentParser()
# parser.add_argument("--v1", action='store_true',
# help='load v1.x model (v1 or v2 is required to load checkpoint) / 1.xのモデルを読み込む')
# parser.add_argument("--v2", action='store_true',
# help='load v2.0 model (v1 or v2 is required to load checkpoint) / 2.0のモデルを読み込む')
# parser.add_argument("--fp16", action='store_true',
# help='load as fp16 (Diffusers only) and save as fp16 (checkpoint only) / fp16形式で読み込み( Diffusers形式のみ対応) 、保存する( checkpointのみ対応) ')
# parser.add_argument("--bf16", action='store_true', help='save as bf16 (checkpoint only) / bf16形式で保存する( checkpointのみ対応) ')
# parser.add_argument("--float", action='store_true',
# help='save as float (checkpoint only) / float(float32)形式で保存する( checkpointのみ対応) ')
# parser.add_argument("--epoch", type=int, default=0, help='epoch to write to checkpoint / checkpointに記録するepoch数の値')
# parser.add_argument("--global_step", type=int, default=0,
# help='global_step to write to checkpoint / checkpointに記録するglobal_stepの値')
# parser.add_argument("--reference_model", type=str, default=None,
# help="reference model for schduler/tokenizer, required in saving Diffusers, copy schduler/tokenizer from this / scheduler/tokenizerのコピー元のDiffusersモデル、Diffusers形式で保存するときに必要")
# parser.add_argument("model_to_load", type=str, default=None,
# help="model to load: checkpoint file or Diffusers model's directory / 読み込むモデル、checkpointかDiffusers形式モデルのディレクトリ")
# parser.add_argument("model_to_save", type=str, default=None,
# help="model to save: checkpoint (with extension) or Diffusers model's directory (without extension) / 変換後のモデル、拡張子がある場合はcheckpoint、ない場合はDiffusesモデルとして保存")
###
# Gradio UI
###
def gradio_convert_model_tab ( ) :
with gr . Tab ( ' Convert model ' ) :
gr . Markdown (
' This utility can be used to convert from one stable diffusion model format to another. '
)
with gr . Row ( ) :
source_model_input = gr . Textbox (
label = ' Source model ' ,
placeholder = ' path to source model folder of file to convert... ' ,
interactive = True ,
)
button_source_model_dir = gr . Button (
folder_symbol , elem_id = ' open_folder_small '
)
button_source_model_dir . click (
2023-03-04 23:56:22 +00:00
get_folder_path ,
outputs = source_model_input ,
show_progress = False ,
2022-12-18 18:11:10 +00:00
)
2022-12-20 02:50:05 +00:00
2022-12-18 18:11:10 +00:00
button_source_model_file = gr . Button (
document_symbol , elem_id = ' open_folder_small '
)
button_source_model_file . click (
2022-12-20 02:50:05 +00:00
get_file_path ,
inputs = [ source_model_input ] ,
outputs = source_model_input ,
2023-03-04 23:56:22 +00:00
show_progress = False ,
2022-12-18 18:11:10 +00:00
)
2022-12-20 02:50:05 +00:00
source_model_type = gr . Dropdown (
label = ' Source model type ' ,
choices = [
2022-12-18 18:11:10 +00:00
' stabilityai/stable-diffusion-2-1-base ' ,
' stabilityai/stable-diffusion-2-base ' ,
' stabilityai/stable-diffusion-2-1 ' ,
' stabilityai/stable-diffusion-2 ' ,
' runwayml/stable-diffusion-v1-5 ' ,
' CompVis/stable-diffusion-v1-4 ' ,
2022-12-20 02:50:05 +00:00
] ,
)
2022-12-18 18:11:10 +00:00
with gr . Row ( ) :
target_model_folder_input = gr . Textbox (
label = ' Target model folder ' ,
placeholder = ' path to target model folder of file name to create... ' ,
interactive = True ,
)
button_target_model_folder = gr . Button (
folder_symbol , elem_id = ' open_folder_small '
)
button_target_model_folder . click (
2023-03-04 23:56:22 +00:00
get_folder_path ,
outputs = target_model_folder_input ,
show_progress = False ,
2022-12-18 18:11:10 +00:00
)
2022-12-20 02:50:05 +00:00
2022-12-18 18:11:10 +00:00
target_model_name_input = gr . Textbox (
label = ' Target model name ' ,
placeholder = ' target model name... ' ,
interactive = True ,
)
2022-12-20 02:50:05 +00:00
target_model_type = gr . Dropdown (
label = ' Target model type ' ,
choices = [
2022-12-18 18:11:10 +00:00
' diffuser ' ,
2022-12-19 14:22:52 +00:00
' diffuser_safetensors ' ,
2022-12-18 18:11:10 +00:00
' ckpt ' ,
' safetensors ' ,
2022-12-20 02:50:05 +00:00
] ,
)
target_save_precision_type = gr . Dropdown (
2023-03-02 00:20:05 +00:00
label = ' Target model precision ' ,
2022-12-20 02:50:05 +00:00
choices = [ ' unspecified ' , ' fp16 ' , ' bf16 ' , ' float ' ] ,
value = ' unspecified ' ,
)
2022-12-18 18:11:10 +00:00
convert_button = gr . Button ( ' Convert model ' )
convert_button . click (
convert_model ,
2022-12-20 02:50:05 +00:00
inputs = [
source_model_input ,
source_model_type ,
target_model_folder_input ,
target_model_name_input ,
target_model_type ,
target_save_precision_type ,
2022-12-18 18:11:10 +00:00
] ,
2023-03-04 23:56:22 +00:00
show_progress = False ,
2022-12-18 18:11:10 +00:00
)