diff --git a/extensions-builtin/Lora/network.py b/extensions-builtin/Lora/network.py index 05bb8cc87..e259fbd7a 100644 --- a/extensions-builtin/Lora/network.py +++ b/extensions-builtin/Lora/network.py @@ -65,8 +65,14 @@ class NetworkOnDisk: if arch.startswith("flux"): return 'f1' + if "v1-5" in str(self.metadata.get('ss_sd_model_name', "")): + return 'sd1' if str(self.metadata.get('ss_v2', "")) == "True": return 'sd2' + if 'flux' in self.name.lower(): + return 'f1' + if 'xl' in self.name.lower(): + return 'xl' return '' diff --git a/installer.py b/installer.py index f7fc7962b..9ddde8d4d 100644 --- a/installer.py +++ b/installer.py @@ -240,7 +240,8 @@ def pip(arg: str, ignore: bool = False, quiet: bool = False, uv = True): log.info(f'Install: package="{arg.replace("install", "").replace("--upgrade", "").replace("--no-deps", "").replace("--force", "").replace(" ", " ").strip()}" mode={"uv" if uv else "pip"}') env_args = os.environ.get("PIP_EXTRA_ARGS", "") all_args = f'{pip_log}{arg} {env_args}'.strip() - log.debug(f'Running: {pipCmd}="{all_args}"') + if not quiet: + log.debug(f'Running: {pipCmd}="{all_args}"') result = subprocess.run(f'"{sys.executable}" -m {pipCmd} {all_args}', shell=True, check=False, env=os.environ, stdout=subprocess.PIPE, stderr=subprocess.PIPE) txt = result.stdout.decode(encoding="utf8", errors="ignore") if len(result.stderr) > 0: @@ -430,7 +431,7 @@ def check_python(supported_minors=[9, 10, 11, 12], reason=None): # check diffusers version def check_diffusers(): - sha = '14a1b86fc7de53ff1dbf803f616cbb16ad530e45' + sha = 'aa73072f1f7014635e3de916cbcf47858f4c37a0' pkg = pkg_resources.working_set.by_key.get('diffusers', None) minor = int(pkg.version.split('.')[1] if pkg is not None else 0) cur = opts.get('diffusers_version', '') if minor > 0 else '' diff --git a/modules/processing_vae.py b/modules/processing_vae.py index 30901fdb9..2edff668f 100644 --- a/modules/processing_vae.py +++ b/modules/processing_vae.py @@ -59,7 +59,7 @@ def full_vae_decode(latents, model): model.vae = model.vae.to(dtype=torch.float32) latents = latents.to(torch.float32) else: - latents = latents.to(model.vae.device) + latents = latents.to(devices.device) if getattr(model.vae, "post_quant_conv", None) is not None: latents = latents.to(next(iter(model.vae.post_quant_conv.parameters())).dtype) diff --git a/modules/shared.py b/modules/shared.py index 172ca42cb..e9c85ff0c 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -216,6 +216,10 @@ if cmd_opts.use_openvino: # override for openvino backend = Backend.DIFFUSERS from modules.intel.openvino import get_device_list as get_openvino_device_list # pylint: disable=ungrouped-imports native = backend == Backend.DIFFUSERS +cpu_memory = round(psutil.virtual_memory().total / 1024 / 1024 / 1024, 2) +mem_stat = memory_stats() +gpu_memory = mem_stat['gpu']['total'] if "gpu" in mem_stat else 0 + class OptionInfo: def __init__(self, default=None, label="", component=None, component_args=None, onchange=None, section=None, refresh=None, folder=None, submit=None, comment_before='', comment_after=''): @@ -361,52 +365,48 @@ def temp_disable_extensions(): cmd_opts.controlnet_loglevel = 'WARNING' return disabled -gpu_memory = 0 -offload_mode_default = "none" -cpu_memory = round(psutil.virtual_memory().total / 1024 / 1024 / 1024, 2) -mem_stat = memory_stats() -if "gpu" in mem_stat: - gpu_memory = mem_stat['gpu']['total'] +def get_default_modes(): + default_offload_mode = "none" + if not (cmd_opts.lowvram or cmd_opts.medvram): + if "gpu" in mem_stat: + if gpu_memory <= 4: + cmd_opts.lowvram = True + default_offload_mode = "sequential" + log.info(f"GPU detect: memory={gpu_memory} optimization=lowvram") + elif gpu_memory <= 8: + cmd_opts.medvram = True + default_offload_mode = "model" + log.info(f"GPU detect: memory={gpu_memory} ptimization=medvram") + else: + default_offload_mode = "none" + log.info(f"GPU detect: memory={gpu_memory} optimization=none") + elif cmd_opts.medvram: + default_offload_mode = "model" + elif cmd_opts.lowvram: + default_offload_mode = "sequential" -if not (cmd_opts.lowvram or cmd_opts.medvram): - if "gpu" in mem_stat: - if gpu_memory <= 4: - cmd_opts.lowvram = True - offload_mode_default = "sequential" - log.info(f"VRAM: Detected={gpu_memory} GB Optimization=lowvram") - elif gpu_memory <= 8: - cmd_opts.medvram = True - offload_mode_default = "model" - log.info(f"VRAM: Detected={gpu_memory} GB Optimization=medvram") - else: - offload_mode_default = "none" - log.info(f"VRAM: Detected={gpu_memory} GB Optimization=none") -elif cmd_opts.medvram: - offload_mode_default = "model" -elif cmd_opts.lowvram: - offload_mode_default = "sequential" + if devices.backend == "directml": # Force BMM for DirectML instead of SDP + default_cross_attention = "Dynamic Attention BMM" if native else "Sub-quadratic" + elif devices.backend == "cpu": + default_cross_attention = "Scaled-Dot-Product" if native else "Doggettx's" + elif devices.backend == "mps": + default_cross_attention = "Scaled-Dot-Product" if native else "Doggettx's" + else: # cuda, rocm, ipex, openvino + default_cross_attention ="Scaled-Dot-Product" + if devices.backend == "rocm": + default_sdp_options = ['Memory attention', 'Math attention'] + #elif devices.backend == "zluda": + # sdp_options_default = ['Math attention'] + else: + default_sdp_options = ['Flash attention', 'Memory attention', 'Math attention'] + if (cmd_opts.lowvram or cmd_opts.medvram) and 'Flash attention' not in default_sdp_options: + default_sdp_options.append('Dynamic attention') -if devices.backend == "directml": # Force BMM for DirectML instead of SDP - cross_attention_optimization_default = "Dynamic Attention BMM" if native else "Sub-quadratic" -elif devices.backend == "cpu": - cross_attention_optimization_default = "Scaled-Dot-Product" if native else "Doggettx's" -elif devices.backend == "mps": - cross_attention_optimization_default = "Scaled-Dot-Product" if native else "Doggettx's" -else: # cuda, rocm, ipex, openvino - cross_attention_optimization_default ="Scaled-Dot-Product" + return default_offload_mode, default_cross_attention, default_sdp_options - -if devices.backend == "rocm": - sdp_options_default = ['Memory attention', 'Math attention'] -#elif devices.backend == "zluda": -# sdp_options_default = ['Math attention'] -else: - sdp_options_default = ['Flash attention', 'Memory attention', 'Math attention'] - -if (cmd_opts.lowvram or cmd_opts.medvram) and 'Flash attention' not in sdp_options_default: - sdp_options_default.append('Dynamic attention') +startup_offload_mode, startup_cross_attention, startup_sdp_options = get_default_modes() options_templates.update(options_section(('sd', "Execution & Models"), { "sd_backend": OptionInfo(default_backend, "Execution backend", gr.Radio, {"choices": ["diffusers", "original"] }), @@ -446,8 +446,8 @@ options_templates.update(options_section(('cuda', "Compute Settings"), { "rollback_vae": OptionInfo(False, "Attempt VAE roll back for NaN values"), "cross_attention_sep": OptionInfo("

Cross Attention

", "", gr.HTML), - "cross_attention_optimization": OptionInfo(cross_attention_optimization_default, "Attention optimization method", gr.Radio, lambda: {"choices": shared_items.list_crossattention(native) }), - "sdp_options": OptionInfo(sdp_options_default, "SDP options", gr.CheckboxGroup, {"choices": ['Flash attention', 'Memory attention', 'Math attention', 'Dynamic attention'] }), + "cross_attention_optimization": OptionInfo(startup_cross_attention, "Attention optimization method", gr.Radio, lambda: {"choices": shared_items.list_crossattention(native) }), + "sdp_options": OptionInfo(startup_sdp_options, "SDP options", gr.CheckboxGroup, {"choices": ['Flash attention', 'Memory attention', 'Math attention', 'Dynamic attention'] }), "xformers_options": OptionInfo(['Flash attention'], "xFormers options", gr.CheckboxGroup, {"choices": ['Flash attention'] }), "dynamic_attention_slice_rate": OptionInfo(4, "Dynamic Attention slicing rate in GB", gr.Slider, {"minimum": 0.1, "maximum": gpu_memory, "step": 0.1, "visible": native}), "sub_quad_sep": OptionInfo("

Sub-quadratic options

", "", gr.HTML, {"visible": not native}), @@ -552,9 +552,9 @@ options_templates.update(options_section(('diffusers', "Diffusers Settings"), { "diffusers_move_refiner": OptionInfo(False, "Move refiner model to CPU when not in use"), "diffusers_extract_ema": OptionInfo(False, "Use model EMA weights when possible"), "diffusers_generator_device": OptionInfo("GPU", "Generator device", gr.Radio, {"choices": ["GPU", "CPU", "Unset"]}), - "diffusers_offload_mode": OptionInfo(offload_mode_default, "Model offload mode", gr.Radio, {"choices": ['none', 'balanced', 'model', 'sequential']}), - "diffusers_offload_max_gpu_memory": OptionInfo(round(gpu_memory * 0.75, 2), "Max GPU memory for balanced offload mode in GB", gr.Slider, {"minimum": 0, "maximum": gpu_memory, "step": 0.01,}), - "diffusers_offload_max_cpu_memory": OptionInfo(round(cpu_memory * 0.75, 2), "Max CPU memory for balanced offload mode in GB", gr.Slider, {"minimum": 0, "maximum": cpu_memory, "step": 0.01,}), + "diffusers_offload_mode": OptionInfo(startup_offload_mode, "Model offload mode", gr.Radio, {"choices": ['none', 'balanced', 'model', 'sequential']}), + "diffusers_offload_max_gpu_memory": OptionInfo(round(gpu_memory * 0.75, 1), "Max GPU memory for balanced offload mode in GB", gr.Slider, {"minimum": 0, "maximum": gpu_memory, "step": 0.01,}), + "diffusers_offload_max_cpu_memory": OptionInfo(round(cpu_memory * 0.75, 1), "Max CPU memory for balanced offload mode in GB", gr.Slider, {"minimum": 0, "maximum": cpu_memory, "step": 0.01,}), "diffusers_vae_upcast": OptionInfo("default", "VAE upcasting", gr.Radio, {"choices": ['default', 'true', 'false']}), "diffusers_vae_slicing": OptionInfo(True, "VAE slicing"), "diffusers_vae_tiling": OptionInfo(cmd_opts.lowvram or cmd_opts.medvram, "VAE tiling"), @@ -866,7 +866,7 @@ options_templates.update(options_section(('extra_networks', "Networks"), { "lora_maybe_diffusers": OptionInfo(False, "LoRA force loading of specific models using Diffusers"), "lora_fuse_diffusers": OptionInfo(False if not cmd_opts.use_openvino else True, "LoRA use merge when using alternative method"), "lora_apply_tags": OptionInfo(0, "LoRA auto-apply tags", gr.Slider, {"minimum": -1, "maximum": 32, "step": 1}), - "lora_in_memory_limit": OptionInfo(1 if not cmd_opts.use_openvino else 0, "LoRA memory cache", gr.Slider, {"minimum": 0, "maximum": 24, "step": 1}), + "lora_in_memory_limit": OptionInfo(0, "LoRA memory cache", gr.Slider, {"minimum": 0, "maximum": 24, "step": 1}), "lora_functional": OptionInfo(False, "Use Kohya method for handling multiple LoRA", gr.Checkbox, { "visible": False }), "hypernetwork_enabled": OptionInfo(False, "Enable Hypernetwork support"), "sd_hypernetwork": OptionInfo("None", "Add hypernetwork to prompt", gr.Dropdown, { "choices": ["None"], "visible": False }),