|
import gradio as gr |
|
from modules import scripts |
|
|
|
from lib_multidiffusion.tiled_diffusion import TiledDiffusion |
|
|
|
|
|
opTiledDiffusion = TiledDiffusion().apply |
|
|
|
|
|
class MultiDiffusionForForge(scripts.Script): |
|
sorting_priority = 16 |
|
|
|
def title(self): |
|
return "MultiDiffusion Integrated" |
|
|
|
def show(self, is_img2img): |
|
|
|
return scripts.AlwaysVisible |
|
|
|
def ui(self, *args, **kwargs): |
|
with gr.Accordion(open=False, label=self.title()): |
|
enabled = gr.Checkbox(label='Enabled', value=False) |
|
method = gr.Radio(label='Method', choices=['MultiDiffusion', 'Mixture of Diffusers'], |
|
value='MultiDiffusion') |
|
tile_width = gr.Slider(label='Tile Width', minimum=16, maximum=8192, step=16, value=768) |
|
tile_height = gr.Slider(label='Tile Height', minimum=16, maximum=8192, step=16, value=768) |
|
tile_overlap = gr.Slider(label='Tile Overlap', minimum=0, maximum=2048, step=32, value=64) |
|
tile_batch_size = gr.Slider(label='Tile Batch Size', minimum=1, maximum=8192, step=1, value=4) |
|
|
|
return enabled, method, tile_width, tile_height, tile_overlap, tile_batch_size |
|
|
|
def process_before_every_sampling(self, p, *script_args, **kwargs): |
|
|
|
|
|
|
|
enabled, method, tile_width, tile_height, tile_overlap, tile_batch_size = script_args |
|
|
|
if not enabled: |
|
return |
|
|
|
unet = p.sd_model.forge_objects.unet |
|
|
|
unet = opTiledDiffusion(unet, method, tile_width, tile_height, tile_overlap, tile_batch_size)[0] |
|
|
|
p.sd_model.forge_objects.unet = unet |
|
|
|
|
|
|
|
p.extra_generation_params.update(dict( |
|
multidiffusion_enabled=enabled, |
|
multidiffusion_method=method, |
|
multidiffusion_tile_width=tile_width, |
|
multidiffusion_tile_height=tile_height, |
|
multidiffusion_tile_overlap=tile_overlap, |
|
multidiffusion_tile_batch_size=tile_batch_size, |
|
)) |
|
|
|
return |
|
|