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): # make this extension visible in both txt2img and img2img tab. 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): # This will be called before every sampling. # If you use highres fix, this will be called twice. 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 # Below codes will add some logs to the texts below the image outputs on UI. # The extra_generation_params does not influence results. 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