File size: 5,951 Bytes
aac338f
 
 
 
8fce0f2
aac338f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8fce0f2
 
aac338f
 
 
 
 
 
 
 
8fce0f2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
aac338f
 
8fce0f2
 
 
 
 
 
 
 
 
 
aac338f
cfc497d
cae13fb
 
 
f3c6857
cae13fb
 
 
aac338f
 
dfaae48
633f735
7a27113
633f735
cfc497d
aac338f
c89c6a3
aac338f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8fce0f2
 
aac338f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import gradio as gr
from random import randint
from all_models import models

from externalmod import gr_Interface_load, randomize_seed

import asyncio
import os
from threading import RLock
lock = RLock()
HF_TOKEN = os.environ.get("HF_TOKEN") if os.environ.get("HF_TOKEN") else None # If private or gated models aren't used, ENV setting is unnecessary.


def load_fn(models):
    global models_load
    models_load = {}
    
    for model in models:
        if model not in models_load.keys():
            try:
                m = gr_Interface_load(f'models/{model}', hf_token=HF_TOKEN)
            except Exception as error:
                print(error)
                m = gr.Interface(lambda: None, ['text'], ['image'])
            models_load.update({model: m})


load_fn(models)


num_models = 6

default_models = models[:num_models]
inference_timeout = 600
MAX_SEED=3999999999
starting_seed = randint(1941, 2024)

def extend_choices(choices):
    return choices[:num_models] + (num_models - len(choices[:num_models])) * ['NA']


def update_imgbox(choices):
    choices_plus = extend_choices(choices[:num_models])
    return [gr.Image(None, label=m, visible=(m!='NA')) for m in choices_plus]

async def infer(model_str, prompt, seed=1, timeout=inference_timeout):
    from pathlib import Path
    kwargs = {}
    noise = ""
    kwargs["seed"] = seed
    task = asyncio.create_task(asyncio.to_thread(models_load[model_str].fn,
                               prompt=f'{prompt} {noise}', **kwargs, token=HF_TOKEN))
    await asyncio.sleep(0)
    try:
        result = await asyncio.wait_for(task, timeout=timeout)
    except (Exception, asyncio.TimeoutError) as e:
        print(e)
        print(f"Task timed out: {model_str}")
        if not task.done(): task.cancel()
        result = None
    if task.done() and result is not None:
        with lock:
            png_path = "image.png"
            result.save(png_path)
            image = str(Path(png_path).resolve())
        return image
    return None


def gen_fnseed(model_str, prompt, seed=1):
    if model_str == 'NA':
        return None
    try:
        loop = asyncio.new_event_loop()
        result = loop.run_until_complete(infer(model_str, prompt, seed, inference_timeout))
    except (Exception, asyncio.CancelledError) as e:
        print(e)
        print(f"Task aborted: {model_str}")
        result = None
    finally:
        loop.close()
    return result

with gr.Blocks() as demo:
    gr.HTML(
    """
        <div>
        <p> <center>For more options like negative prompts, single model x6 or seeds up to 4294967295 check out <a href="https://huggingface.co/spaces/John6666/Diffusion80XX4sg">Diffusion80XX4sg</a> by John6666!</center>
        </p></div>
    """
)  
    with gr.Tab('πŸ€— Huggingface Diffusion πŸ€—'): 
        txt_input = gr.Textbox(label='Your prompt:', lines=4)
        gen_button = gr.Button('Generate up to 6 images in up to 3 minutes total')
        with gr.Row():
            seed = gr.Slider(label="Use a seed to replicate the same image later (maximum 3999999999)", minimum=0, maximum=MAX_SEED, step=1, value=starting_seed, scale=3)
            seed_rand = gr.Button("Randomize Seed 🎲", size="sm", variant="secondary", scale=1)    
        seed_rand.click(randomize_seed, None, [seed], queue=False)
        #stop_button = gr.Button('Stop', variant = 'secondary', interactive = False)
               
        gen_button.click(lambda s: gr.update(interactive = True), None)
        gr.HTML(
        """
            <div style="text-align: center; max-width: 1200px; margin: 0 auto;">
              <div>
                <body>
                <div class="center"><p style="margin-bottom: 10px; color: #000000;">Scroll down to see more images and select models.</p>
                </div>
                </body>
              </div>
            </div>
        """
               )
        with gr.Row():
            output = [gr.Image(label = m, min_width=480) for m in default_models]
            current_models = [gr.Textbox(m, visible = False) for m in default_models]
                        
            for m, o in zip(current_models, output):
                gen_event = gr.on(triggers=[gen_button.click, txt_input.submit], fn=gen_fnseed,
                            inputs=[m, txt_input, seed], outputs=[o], concurrency_limit=None, queue=False)
                #stop_button.click(lambda s: gr.update(interactive = False), None, stop_button, cancels = [gen_event])
        with gr.Accordion('Model selection'):
            model_choice = gr.CheckboxGroup(models, label = f'Choose up to {int(num_models)} different models from the {len(models)} available!', value=default_models, interactive=True)
            #model_choice = gr.CheckboxGroup(models, label = f'Choose up to {num_models} different models from the 2 available! Untick them to only use one!', value = default_models, multiselect = True, max_choices = num_models, interactive = True, filterable = False)
            model_choice.change(update_imgbox, model_choice, output)
            model_choice.change(extend_choices, model_choice, current_models)
        with gr.Row():
            gr.HTML(
    """
        <div class="footer">
        <p> Based on the <a href="https://huggingface.co/spaces/John6666/hfd_test_nostopbutton">Huggingface NoStopButton</a> Space by John6666, <a href="https://huggingface.co/spaces/derwahnsinn/TestGen">TestGen</a> Space by derwahnsinn, the <a href="https://huggingface.co/spaces/RdnUser77/SpacIO_v1">SpacIO</a> Space by RdnUser77 and Omnibus's Maximum Multiplier! For 6 images with the same model check out the <a href="https://huggingface.co/spaces/Yntec/PrintingPress">Printing Press</a>, for the classic UI with prompt enhancer try <a href="https://huggingface.co/spaces/Yntec/blitz_diffusion">Blitz Diffusion!</a>
        </p>
    """
)

demo.queue(default_concurrency_limit=200, max_size=200)
demo.launch(show_api=False, max_threads=400)