File size: 3,242 Bytes
431af92
760bfde
d5d52b4
431af92
760bfde
54b4787
760bfde
 
 
 
 
 
 
 
d5d52b4
760bfde
 
 
d5d52b4
8f4de93
760bfde
 
 
 
 
 
 
d5d52b4
760bfde
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d5d52b4
760bfde
d5d52b4
 
 
760bfde
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d5d52b4
760bfde
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import subprocess
from huggingface_hub import HfApi, hf_hub_download
import gradio as gr

subprocess.run(["git", "clone", "https://github.com/huggingface/diffusers.git", "diffs"])

def error_str(error, title="Error"):
    return f"""#### {title}
            {error}"""

def url_to_model_id(model_id_str):
    return model_id_str.split("/")[-2] + "/" + model_id_str.split("/")[-1] if model_id_str.startswith("https://huggingface.co/") else model_id_str
    
def get_ckpt_names(model_id = "nitrosocke/mo-di-diffusion"):
    
    if model_id == "":
        return error_str("Please enter a model name.", title="Invalid input"), None, None

    try:
        api = HfApi()
        ckpt_files = [f for f in api.list_repo_files(url_to_model_id(model_id)) if f.endswith(".ckpt")]
        
        if len(ckpt_files) == 0:
            return error_str("No checkpoint files found in the model repo."), None, None
        
        return None, gr.update(choices=ckpt_files, visible=True), gr.update(visible=True), "\n".join([f"- {ckpt_file.rfilename}" for ckpt_file in ckpt_files])
        
    except Exception as e:
        return error_str(e), None, None

def convert(model_id, ckpt_name, token = "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"):
    
    model_id = url_to_model_id(model_id)
    
    # 1. Download the checkpoint file
    ckpt_path = hf_hub_download(repo_id=model_id, filename=ckpt_name)

    # 2. Run the conversion script
    subprocess.run(
        [
            "python3",
            "./diffs/scripts/convert_original_stable_diffusion_to_diffusers.py",
            "--checkpoint_path",
            ckpt_path,
            "--dump_path" ,
            model_id,
        ]
    )
    
    # list files in current directory and return them as a list:
    import os
    return f"""files in current directory:
    {[f for f in os.listdir(".") if os.path.isfile(f)]}"""

    
with gr.Blocks() as demo:

    with gr.Row():

        with gr.Column(scale=11):
            with gr.Group():
                gr.Markdown("## 1. Load model info")
                input_token = gr.Textbox(
                    max_lines=1,
                    label="Hugging Face token",
                    placeholder="hf_...",
                )
                gr.Markdown("Get your token [here](https://huggingface.co/settings/tokens).")
                input_model = gr.Textbox(
                    max_lines=1,
                    label="Model name or URL",
                    placeholder="username/model_name",
                )

            btn_get_ckpts = gr.Button("Load")

        with gr.Column(scale=10, visible=False) as col_convert:
            gr.Markdown("## 2. Convert to Diffusers🧨")
            radio_ckpts = gr.Radio(label="Choose a checkpoint to convert", visible=False)
            btn_convert = gr.Button("Convert")

    error_output = gr.Markdown(label="Output")
    btn_get_ckpts.click(
        fn=get_ckpt_names,
        inputs=[input_model],
        outputs=[error_output, radio_ckpts, col_convert],
        scroll_to_output=True
    )

    btn_convert.click(
        fn=convert,
        inputs=[input_model, radio_ckpts, input_token],
        outputs=error_output,
        scroll_to_output=True
    )

demo.launch(debug=True, share=True)