import hypertile from modules import scripts, script_callbacks, shared from scripts.hypertile_xyz import add_axis_options class ScriptHypertile(scripts.Script): name = "Hypertile" def title(self): return self.name def show(self, is_img2img): return scripts.AlwaysVisible def process(self, p, *args): hypertile.set_hypertile_seed(p.all_seeds[0]) configure_hypertile(p.width, p.height, enable_unet=shared.opts.hypertile_enable_unet) self.add_infotext(p) def before_hr(self, p, *args): enable = shared.opts.hypertile_enable_unet_secondpass or shared.opts.hypertile_enable_unet # exclusive hypertile seed for the second pass if enable: hypertile.set_hypertile_seed(p.all_seeds[0]) configure_hypertile(p.hr_upscale_to_x, p.hr_upscale_to_y, enable_unet=enable) if enable and not shared.opts.hypertile_enable_unet: p.extra_generation_params["Hypertile U-Net second pass"] = True self.add_infotext(p, add_unet_params=True) def add_infotext(self, p, add_unet_params=False): def option(name): value = getattr(shared.opts, name) default_value = shared.opts.get_default(name) return None if value == default_value else value if shared.opts.hypertile_enable_unet: p.extra_generation_params["Hypertile U-Net"] = True if shared.opts.hypertile_enable_unet or add_unet_params: p.extra_generation_params["Hypertile U-Net max depth"] = option('hypertile_max_depth_unet') p.extra_generation_params["Hypertile U-Net max tile size"] = option('hypertile_max_tile_unet') p.extra_generation_params["Hypertile U-Net swap size"] = option('hypertile_swap_size_unet') if shared.opts.hypertile_enable_vae: p.extra_generation_params["Hypertile VAE"] = True p.extra_generation_params["Hypertile VAE max depth"] = option('hypertile_max_depth_vae') p.extra_generation_params["Hypertile VAE max tile size"] = option('hypertile_max_tile_vae') p.extra_generation_params["Hypertile VAE swap size"] = option('hypertile_swap_size_vae') def configure_hypertile(width, height, enable_unet=True): hypertile.hypertile_hook_model( shared.sd_model.first_stage_model, width, height, swap_size=shared.opts.hypertile_swap_size_vae, max_depth=shared.opts.hypertile_max_depth_vae, tile_size_max=shared.opts.hypertile_max_tile_vae, enable=shared.opts.hypertile_enable_vae, ) hypertile.hypertile_hook_model( shared.sd_model.model, width, height, swap_size=shared.opts.hypertile_swap_size_unet, max_depth=shared.opts.hypertile_max_depth_unet, tile_size_max=shared.opts.hypertile_max_tile_unet, enable=enable_unet, is_sdxl=shared.sd_model.is_sdxl ) def on_ui_settings(): import gradio as gr options = { "hypertile_explanation": shared.OptionHTML(""" Hypertile optimizes the self-attention layer within U-Net and VAE models, resulting in a reduction in computation time ranging from 1 to 4 times. The larger the generated image is, the greater the benefit. """), "hypertile_enable_unet": shared.OptionInfo(False, "Enable Hypertile U-Net", infotext="Hypertile U-Net").info("enables hypertile for all modes, including hires fix second pass; noticeable change in details of the generated picture"), "hypertile_enable_unet_secondpass": shared.OptionInfo(False, "Enable Hypertile U-Net for hires fix second pass", infotext="Hypertile U-Net second pass").info("enables hypertile just for hires fix second pass - regardless of whether the above setting is enabled"), "hypertile_max_depth_unet": shared.OptionInfo(3, "Hypertile U-Net max depth", gr.Slider, {"minimum": 0, "maximum": 3, "step": 1}, infotext="Hypertile U-Net max depth").info("larger = more neural network layers affected; minor effect on performance"), "hypertile_max_tile_unet": shared.OptionInfo(256, "Hypertile U-Net max tile size", gr.Slider, {"minimum": 0, "maximum": 512, "step": 16}, infotext="Hypertile U-Net max tile size").info("larger = worse performance"), "hypertile_swap_size_unet": shared.OptionInfo(3, "Hypertile U-Net swap size", gr.Slider, {"minimum": 0, "maximum": 64, "step": 1}, infotext="Hypertile U-Net swap size"), "hypertile_enable_vae": shared.OptionInfo(False, "Enable Hypertile VAE", infotext="Hypertile VAE").info("minimal change in the generated picture"), "hypertile_max_depth_vae": shared.OptionInfo(3, "Hypertile VAE max depth", gr.Slider, {"minimum": 0, "maximum": 3, "step": 1}, infotext="Hypertile VAE max depth"), "hypertile_max_tile_vae": shared.OptionInfo(128, "Hypertile VAE max tile size", gr.Slider, {"minimum": 0, "maximum": 512, "step": 16}, infotext="Hypertile VAE max tile size"), "hypertile_swap_size_vae": shared.OptionInfo(3, "Hypertile VAE swap size ", gr.Slider, {"minimum": 0, "maximum": 64, "step": 1}, infotext="Hypertile VAE swap size"), } for name, opt in options.items(): opt.section = ('hypertile', "Hypertile") shared.opts.add_option(name, opt) script_callbacks.on_ui_settings(on_ui_settings) script_callbacks.on_before_ui(add_axis_options)