mirror of
https://github.com/vladmandic/automatic
synced 2026-09-19 01:04:32 +02:00
fix backend switch
This commit is contained in:
@@ -162,6 +162,7 @@ function setupExtraNetworksForTab(tabname) {
|
||||
let text = `${elem.querySelector('.name').textContent.toLowerCase()} ${elem.querySelector('.search_term').textContent.toLowerCase()}`;
|
||||
text = text.replace('models--', 'Diffusers').replace('\\', '/');
|
||||
elem.style.display = text.indexOf(searchTerm) === -1 ? 'none' : '';
|
||||
console.log({ search: searchTerm, text, display: elem.style.display });
|
||||
});
|
||||
searchTimer = null;
|
||||
}, 100);
|
||||
|
||||
@@ -9,7 +9,7 @@ default_memory_provider = "None"
|
||||
if platform.system() == "Windows":
|
||||
memory_providers.append("Performance Counter")
|
||||
default_memory_provider = "Performance Counter"
|
||||
do_nothing = lambda: None
|
||||
do_nothing = lambda: None # pylint: disable=unnecessary-lambda-assignment
|
||||
|
||||
def _set_memory_provider():
|
||||
from modules.shared import opts, cmd_opts, log
|
||||
@@ -63,7 +63,7 @@ def directml_init():
|
||||
return True, None
|
||||
|
||||
def directml_do_hijack():
|
||||
import modules.dml.hijack
|
||||
import modules.dml.hijack # pylint: disable=unused-import
|
||||
from modules.devices import device
|
||||
|
||||
if not torch.dml.has_float64_support(device):
|
||||
@@ -79,9 +79,9 @@ class OverrideItem(NamedTuple):
|
||||
message: Optional[str]
|
||||
|
||||
opts_override_table = {
|
||||
"diffusers_generator_device": OverrideItem("cpu", None, "DirectML does not support torch Generator API."),
|
||||
"diffusers_model_cpu_offload": OverrideItem(False, None, "Diffusers' model CPU offloading does not support DirectML devices."),
|
||||
"diffusers_seq_cpu_offload": OverrideItem(False, lambda opts: opts.diffusers_pipeline != "Stable Diffusion XL", "Diffusers' sequential CPU offloading is available only on StableDiffusionXLPipeline with DirectML devices."),
|
||||
"diffusers_generator_device": OverrideItem("cpu", None, "DirectML does not support torch Generator API"),
|
||||
"diffusers_model_cpu_offload": OverrideItem(False, None, "Diffusers model CPU offloading does not support DirectML devices"),
|
||||
"diffusers_seq_cpu_offload": OverrideItem(False, lambda opts: opts.diffusers_pipeline != "Stable Diffusion XL", "Diffusers sequential CPU offloading is available only on StableDiffusionXLPipeline with DirectML devices"),
|
||||
}
|
||||
|
||||
def directml_override_opts():
|
||||
@@ -96,11 +96,9 @@ def directml_override_opts():
|
||||
if getattr(shared.opts, key) != item.value and (item.condition is None or item.condition(shared.opts)):
|
||||
count += 1
|
||||
setattr(shared.opts, key, item.value)
|
||||
if item.message is not None:
|
||||
shared.log.warning(item.message)
|
||||
shared.log.warning(f'{key} is automatically overriden to {item.value}.')
|
||||
shared.log.warning(f'Overriding: {key}={item.value} {item.message if item.message is not None else ""}')
|
||||
|
||||
if count > 0:
|
||||
shared.log.info(f'{count} options are automatically overriden. If you want to keep them from overriding, run with --experimental argument.')
|
||||
shared.log.info(f'Options override: count={count}. If you want to keep them from overriding, run with --experimental argument.')
|
||||
|
||||
_set_memory_provider()
|
||||
|
||||
@@ -78,8 +78,8 @@ def process_diffusers(p: StableDiffusionProcessing, seeds, prompts, negative_pro
|
||||
model.vae.to(devices.device)
|
||||
latents.to(model.vae.device)
|
||||
|
||||
needs_upcasting = model.vae.dtype == torch.float16 and model.vae.config.force_upcast
|
||||
if needs_upcasting: # this is done by diffusers automatically if output_type != 'latent'
|
||||
upcast = (model.vae.dtype == torch.float16) and model.vae.config.force_upcast and hasattr(model, 'upcast_vae')
|
||||
if upcast: # this is done by diffusers automatically if output_type != 'latent'
|
||||
model.upcast_vae()
|
||||
latents = latents.to(next(iter(model.vae.post_quant_conv.parameters())).dtype)
|
||||
|
||||
@@ -87,7 +87,7 @@ def process_diffusers(p: StableDiffusionProcessing, seeds, prompts, negative_pro
|
||||
if shared.opts.diffusers_move_unet and not model.has_accelerate:
|
||||
model.unet.to(unet_device)
|
||||
t1 = time.time()
|
||||
shared.log.debug(f'VAE decode: name={sd_vae.loaded_vae_file if sd_vae.loaded_vae_file is not None else "baked"} dtype={model.vae.dtype} upcast={model.vae.config.get("force_upcast", None)} images={latents.shape[0]} latents={latents.shape} time={round(t1-t0, 3)}s')
|
||||
shared.log.debug(f'VAE decode: name={sd_vae.loaded_vae_file if sd_vae.loaded_vae_file is not None else "baked"} dtype={model.vae.dtype} upcast={upcast} images={latents.shape[0]} latents={latents.shape} time={round(t1-t0, 3)}s')
|
||||
return decoded
|
||||
|
||||
def full_vae_encode(image, model):
|
||||
|
||||
+1
-1
@@ -398,7 +398,7 @@ class ScriptRunner:
|
||||
|
||||
dropdown.init_field = init_field
|
||||
dropdown.change(fn=select_script, inputs=[dropdown], outputs=[script.group for script in self.selectable_scripts])
|
||||
|
||||
|
||||
def onload_script_visibility(params):
|
||||
title = params.get('Script', None)
|
||||
if title:
|
||||
|
||||
+16
-15
@@ -586,7 +586,7 @@ model_data = ModelData()
|
||||
|
||||
|
||||
def change_backend():
|
||||
shared.log.info(f'Pipeline changed: {shared.backend}')
|
||||
shared.log.info(f'Backend changed: {shared.backend}')
|
||||
unload_model_weights()
|
||||
checkpoints_loaded.clear()
|
||||
from modules.sd_samplers import list_samplers
|
||||
@@ -762,7 +762,7 @@ def load_diffuser(checkpoint_info=None, already_loaded_state_dict=None, timer=No
|
||||
diffusers_load_config.pop('safety_checker', None)
|
||||
diffusers_load_config.pop('requires_safety_checker', None)
|
||||
diffusers_load_config.pop('load_safety_checker', None)
|
||||
shared.log.debug(f'Model {op}: pipeline={sd_model.__class__.__name__} config={diffusers_load_config}') # pylint: disable=protected-access
|
||||
shared.log.debug(f'Setting {op}: pipeline={sd_model.__class__.__name__} config={diffusers_load_config}') # pylint: disable=protected-access
|
||||
except Exception as e:
|
||||
shared.log.error(f'Diffusers failed loading model using pipeline: {checkpoint_info.path} {shared.opts.diffusers_pipeline} {e}')
|
||||
return
|
||||
@@ -773,8 +773,8 @@ def load_diffuser(checkpoint_info=None, already_loaded_state_dict=None, timer=No
|
||||
sd_model.scheduler.name = 'DDIM'
|
||||
|
||||
if (shared.opts.diffusers_model_cpu_offload or shared.cmd_opts.medvram) and (shared.opts.diffusers_seq_cpu_offload or shared.cmd_opts.lowvram):
|
||||
shared.log.warning(f'Model {op}: Model CPU offload (--medvram) and Sequential CPU offload (--lowvram) are not compatible')
|
||||
shared.log.debug(f'Model {op}: disabling model CPU offload and --medvram')
|
||||
shared.log.warning(f'Setting {op}: Model CPU offload and Sequential CPU offload are not compatible')
|
||||
shared.log.debug(f'Setting {op}: disabling model CPU offload')
|
||||
shared.opts.diffusers_model_cpu_offload=False
|
||||
shared.cmd_opts.medvram=False
|
||||
|
||||
@@ -783,7 +783,7 @@ def load_diffuser(checkpoint_info=None, already_loaded_state_dict=None, timer=No
|
||||
sd_model.has_accelerate = False
|
||||
if hasattr(sd_model, "enable_model_cpu_offload"):
|
||||
if (shared.cmd_opts.medvram and devices.backend != "directml") or shared.opts.diffusers_model_cpu_offload:
|
||||
shared.log.debug(f'Model {op}: enable model CPU offload')
|
||||
shared.log.debug(f'Setting {op}: enable model CPU offload')
|
||||
if shared.opts.diffusers_move_base or shared.opts.diffusers_move_unet or shared.opts.diffusers_move_refiner:
|
||||
shared.opts.diffusers_move_base = False
|
||||
shared.opts.diffusers_move_unet = False
|
||||
@@ -793,7 +793,7 @@ def load_diffuser(checkpoint_info=None, already_loaded_state_dict=None, timer=No
|
||||
sd_model.has_accelerate = True
|
||||
if hasattr(sd_model, "enable_sequential_cpu_offload"):
|
||||
if shared.cmd_opts.lowvram or shared.opts.diffusers_seq_cpu_offload:
|
||||
shared.log.debug(f'Model {op}: enable sequential CPU offload')
|
||||
shared.log.debug(f'Setting {op}: enable sequential CPU offload')
|
||||
if shared.opts.diffusers_move_base or shared.opts.diffusers_move_unet or shared.opts.diffusers_move_refiner:
|
||||
shared.opts.diffusers_move_base = False
|
||||
shared.opts.diffusers_move_unet = False
|
||||
@@ -803,19 +803,19 @@ def load_diffuser(checkpoint_info=None, already_loaded_state_dict=None, timer=No
|
||||
sd_model.has_accelerate = True
|
||||
if hasattr(sd_model, "enable_vae_slicing"):
|
||||
if shared.cmd_opts.lowvram or shared.opts.diffusers_vae_slicing:
|
||||
shared.log.debug(f'Model {op}: enable VAE slicing')
|
||||
shared.log.debug(f'Setting {op}: enable VAE slicing')
|
||||
sd_model.enable_vae_slicing()
|
||||
else:
|
||||
sd_model.disable_vae_slicing()
|
||||
if hasattr(sd_model, "enable_vae_tiling"):
|
||||
if shared.cmd_opts.lowvram or shared.opts.diffusers_vae_tiling:
|
||||
shared.log.debug(f'Model {op}: enable VAE tiling')
|
||||
shared.log.debug(f'Setting {op}: enable VAE tiling')
|
||||
sd_model.enable_vae_tiling()
|
||||
else:
|
||||
sd_model.disable_vae_tiling()
|
||||
if hasattr(sd_model, "enable_attention_slicing"):
|
||||
if shared.cmd_opts.lowvram or shared.opts.diffusers_attention_slicing:
|
||||
shared.log.debug(f'Model {op}: enable attention slicing')
|
||||
shared.log.debug(f'Setting {op}: enable attention slicing')
|
||||
sd_model.enable_attention_slicing()
|
||||
else:
|
||||
sd_model.disable_attention_slicing()
|
||||
@@ -832,11 +832,11 @@ def load_diffuser(checkpoint_info=None, already_loaded_state_dict=None, timer=No
|
||||
if shared.opts.no_half_vae:
|
||||
devices.dtype_vae = torch.float32
|
||||
sd_model.vae.to(devices.dtype_vae)
|
||||
shared.log.debug(f'Model {op} VAE: name={sd_vae.loaded_vae_file} upcast={sd_model.vae.config.get("force_upcast", None)}')
|
||||
shared.log.debug(f'Setting {op} VAE: name={sd_vae.loaded_vae_file} upcast={sd_model.vae.config.get("force_upcast", None)}')
|
||||
if shared.opts.cross_attention_optimization == "xFormers" and hasattr(sd_model, 'enable_xformers_memory_efficient_attention'):
|
||||
sd_model.enable_xformers_memory_efficient_attention()
|
||||
if shared.opts.opt_channelslast:
|
||||
shared.log.debug(f'Model {op}: enable channels last')
|
||||
shared.log.debug(f'Setting {op}: enable channels last')
|
||||
sd_model.unet.to(memory_format=torch.channels_last)
|
||||
|
||||
base_sent_to_cpu=False
|
||||
@@ -1163,20 +1163,21 @@ def disable_offload(sd_model):
|
||||
|
||||
|
||||
def unload_model_weights(op='model'):
|
||||
from modules import sd_hijack
|
||||
if op == 'model' or op == 'dict':
|
||||
if model_data.sd_model:
|
||||
if shared.backend == shared.Backend.ORIGINAL:
|
||||
if shared.backend != shared.Backend.ORIGINAL: # moving from diffusers=>original
|
||||
from modules import sd_hijack
|
||||
model_data.sd_model.to(devices.cpu)
|
||||
sd_hijack.model_hijack.undo_hijack(model_data.sd_model)
|
||||
else:
|
||||
else: # moving from original=>diffusers
|
||||
disable_offload(model_data.sd_model)
|
||||
model_data.sd_model.to('meta')
|
||||
model_data.sd_model = None
|
||||
shared.log.debug(f'Unload weights {op}: {memory_stats()}')
|
||||
else:
|
||||
if model_data.sd_refiner:
|
||||
if shared.backend == shared.Backend.ORIGINAL:
|
||||
if shared.backend != shared.Backend.ORIGINAL:
|
||||
from modules import sd_hijack
|
||||
model_data.sd_model.to(devices.cpu)
|
||||
sd_hijack.model_hijack.undo_hijack(model_data.sd_refiner)
|
||||
else:
|
||||
|
||||
Reference in New Issue
Block a user