hypertile_script.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import hypertile
  2. from modules import scripts, script_callbacks, shared
  3. class ScriptHypertile(scripts.Script):
  4. name = "Hypertile"
  5. def title(self):
  6. return self.name
  7. def show(self, is_img2img):
  8. return scripts.AlwaysVisible
  9. def process(self, p, *args):
  10. hypertile.set_hypertile_seed(p.all_seeds[0])
  11. configure_hypertile(p.width, p.height, enable_unet=shared.opts.hypertile_enable_unet)
  12. self.add_infotext(p)
  13. def before_hr(self, p, *args):
  14. enable = shared.opts.hypertile_enable_unet_secondpass or shared.opts.hypertile_enable_unet
  15. # exclusive hypertile seed for the second pass
  16. if enable:
  17. hypertile.set_hypertile_seed(p.all_seeds[0])
  18. configure_hypertile(p.hr_upscale_to_x, p.hr_upscale_to_y, enable_unet=enable)
  19. if enable and not shared.opts.hypertile_enable_unet:
  20. p.extra_generation_params["Hypertile U-Net second pass"] = True
  21. self.add_infotext(p, add_unet_params=True)
  22. def add_infotext(self, p, add_unet_params=False):
  23. def option(name):
  24. value = getattr(shared.opts, name)
  25. default_value = shared.opts.get_default(name)
  26. return None if value == default_value else value
  27. if shared.opts.hypertile_enable_unet:
  28. p.extra_generation_params["Hypertile U-Net"] = True
  29. if shared.opts.hypertile_enable_unet or add_unet_params:
  30. p.extra_generation_params["Hypertile U-Net max depth"] = option('hypertile_max_depth_unet')
  31. p.extra_generation_params["Hypertile U-Net max tile size"] = option('hypertile_max_tile_unet')
  32. p.extra_generation_params["Hypertile U-Net swap size"] = option('hypertile_swap_size_unet')
  33. if shared.opts.hypertile_enable_vae:
  34. p.extra_generation_params["Hypertile VAE"] = True
  35. p.extra_generation_params["Hypertile VAE max depth"] = option('hypertile_max_depth_vae')
  36. p.extra_generation_params["Hypertile VAE max tile size"] = option('hypertile_max_tile_vae')
  37. p.extra_generation_params["Hypertile VAE swap size"] = option('hypertile_swap_size_vae')
  38. def configure_hypertile(width, height, enable_unet=True):
  39. hypertile.hypertile_hook_model(
  40. shared.sd_model.first_stage_model,
  41. width,
  42. height,
  43. swap_size=shared.opts.hypertile_swap_size_vae,
  44. max_depth=shared.opts.hypertile_max_depth_vae,
  45. tile_size_max=shared.opts.hypertile_max_tile_vae,
  46. enable=shared.opts.hypertile_enable_vae,
  47. )
  48. hypertile.hypertile_hook_model(
  49. shared.sd_model.model,
  50. width,
  51. height,
  52. swap_size=shared.opts.hypertile_swap_size_unet,
  53. max_depth=shared.opts.hypertile_max_depth_unet,
  54. tile_size_max=shared.opts.hypertile_max_tile_unet,
  55. enable=enable_unet,
  56. is_sdxl=shared.sd_model.is_sdxl
  57. )
  58. def on_ui_settings():
  59. import gradio as gr
  60. options = {
  61. "hypertile_explanation": shared.OptionHTML("""
  62. <a href='https://github.com/tfernd/HyperTile'>Hypertile</a> optimizes the self-attention layer within U-Net and VAE models,
  63. resulting in a reduction in computation time ranging from 1 to 4 times. The larger the generated image is, the greater the
  64. benefit.
  65. """),
  66. "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"),
  67. "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"),
  68. "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"),
  69. "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"),
  70. "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"),
  71. "hypertile_enable_vae": shared.OptionInfo(False, "Enable Hypertile VAE", infotext="Hypertile VAE").info("minimal change in the generated picture"),
  72. "hypertile_max_depth_vae": shared.OptionInfo(3, "Hypertile VAE max depth", gr.Slider, {"minimum": 0, "maximum": 3, "step": 1}, infotext="Hypertile VAE max depth"),
  73. "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"),
  74. "hypertile_swap_size_vae": shared.OptionInfo(3, "Hypertile VAE swap size ", gr.Slider, {"minimum": 0, "maximum": 64, "step": 1}, infotext="Hypertile VAE swap size"),
  75. }
  76. for name, opt in options.items():
  77. opt.section = ('hypertile', "Hypertile")
  78. shared.opts.add_option(name, opt)
  79. def add_axis_options():
  80. xyz_grid = [x for x in scripts.scripts_data if x.script_class.__module__ == "xyz_grid.py"][0].module
  81. xyz_grid.axis_options.extend([
  82. xyz_grid.AxisOption("[Hypertile] Unet First pass Enabled", str, xyz_grid.apply_override('hypertile_enable_unet', boolean=True), choices=xyz_grid.boolean_choice(reverse=True)),
  83. xyz_grid.AxisOption("[Hypertile] Unet Second pass Enabled", str, xyz_grid.apply_override('hypertile_enable_unet_secondpass', boolean=True), choices=xyz_grid.boolean_choice(reverse=True)),
  84. xyz_grid.AxisOption("[Hypertile] Unet Max Depth", int, xyz_grid.apply_override("hypertile_max_depth_unet"), confirm=xyz_grid.confirm_range(0, 3, '[Hypertile] Unet Max Depth'), choices=lambda: [str(x) for x in range(4)]),
  85. xyz_grid.AxisOption("[Hypertile] Unet Max Tile Size", int, xyz_grid.apply_override("hypertile_max_tile_unet"), confirm=xyz_grid.confirm_range(0, 512, '[Hypertile] Unet Max Tile Size')),
  86. xyz_grid.AxisOption("[Hypertile] Unet Swap Size", int, xyz_grid.apply_override("hypertile_swap_size_unet"), confirm=xyz_grid.confirm_range(0, 64, '[Hypertile] Unet Swap Size')),
  87. xyz_grid.AxisOption("[Hypertile] VAE Enabled", str, xyz_grid.apply_override('hypertile_enable_vae', boolean=True), choices=xyz_grid.boolean_choice(reverse=True)),
  88. xyz_grid.AxisOption("[Hypertile] VAE Max Depth", int, xyz_grid.apply_override("hypertile_max_depth_vae"), confirm=xyz_grid.confirm_range(0, 3, '[Hypertile] VAE Max Depth'), choices=lambda: [str(x) for x in range(4)]),
  89. xyz_grid.AxisOption("[Hypertile] VAE Max Tile Size", int, xyz_grid.apply_override("hypertile_max_tile_vae"), confirm=xyz_grid.confirm_range(0, 512, '[Hypertile] VAE Max Tile Size')),
  90. xyz_grid.AxisOption("[Hypertile] VAE Swap Size", int, xyz_grid.apply_override("hypertile_swap_size_vae"), confirm=xyz_grid.confirm_range(0, 64, '[Hypertile] VAE Swap Size')),
  91. ])
  92. script_callbacks.on_ui_settings(on_ui_settings)
  93. script_callbacks.on_before_ui(add_axis_options)