mirror of
https://github.com/vladmandic/automatic
synced 2026-09-19 17:24:32 +02:00
Merge pull request #4900 from vladmandic/fix/sampler-fallback-paths
Fix/sampler fallback paths
This commit is contained in:
@@ -10,6 +10,10 @@ install_traceback()
|
||||
already_displayed = {}
|
||||
|
||||
|
||||
class ValidationError(ValueError):
|
||||
"""Expected validation failure: display() reports the message without a traceback."""
|
||||
|
||||
|
||||
def install(suppress=None):
|
||||
if suppress is None:
|
||||
suppress = []
|
||||
@@ -23,6 +27,9 @@ def display(e: Exception, task: str, suppress=None):
|
||||
suppress = []
|
||||
if isinstance(e, ErrorLimiterAbort):
|
||||
return
|
||||
if isinstance(e, ValidationError):
|
||||
log.error(f"{task or 'error'}: {e}")
|
||||
return
|
||||
log.error(f"{task or 'error'}: {type(e).__name__}")
|
||||
"""
|
||||
trace = traceback.format_exc()
|
||||
|
||||
@@ -584,9 +584,9 @@ def update_sampler(p, sd_model, second_pass=False):
|
||||
if sampler_selection == 'None':
|
||||
return
|
||||
sampler = sd_samplers.find_sampler(sampler_selection)
|
||||
if sampler is None:
|
||||
log.warning(f'Sampler: "{sampler_selection}" not found')
|
||||
sampler = sd_samplers.all_samplers_map.get("UniPC")
|
||||
resolved = sampler is not None
|
||||
if not resolved:
|
||||
log.warning(f'Sampler: name="{sampler_selection}" not found')
|
||||
sched_override_keys = [
|
||||
'schedulers_prediction_type', 'schedulers_beta_schedule', 'schedulers_timesteps',
|
||||
'schedulers_sigma', 'schedulers_use_thresholding', 'schedulers_use_loworder',
|
||||
@@ -596,8 +596,8 @@ def update_sampler(p, sd_model, second_pass=False):
|
||||
'schedulers_timestep_spacing', 'schedulers_timesteps_range',
|
||||
]
|
||||
scheduler_overrides = {k: getattr(p, k) for k in sched_override_keys if getattr(p, k, None) is not None}
|
||||
sampler = sd_samplers.create_sampler(sampler.name, sd_model, scheduler_overrides=scheduler_overrides)
|
||||
if sampler is None or sampler_selection == 'Default':
|
||||
sampler = sd_samplers.create_sampler(sampler.name if resolved else sampler_selection, sd_model, scheduler_overrides=scheduler_overrides)
|
||||
if sampler is None or not resolved or sampler_selection == 'Default':
|
||||
if second_pass:
|
||||
p.hr_sampler = 'Default'
|
||||
else:
|
||||
|
||||
+10
-8
@@ -1,6 +1,6 @@
|
||||
import os
|
||||
import copy
|
||||
from modules import shared
|
||||
from modules import shared, errors
|
||||
from modules.logger import log
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ loaded_config = None
|
||||
|
||||
def find_sampler(name:str):
|
||||
if name is None or name == 'None':
|
||||
return all_samplers_map.get("UniPC", None)
|
||||
return all_samplers_map.get("Default", None)
|
||||
for sampler in all_samplers:
|
||||
if sampler.name.lower() == name.lower() or name in sampler.aliases:
|
||||
return sampler
|
||||
@@ -107,6 +107,8 @@ def create_sampler(name, model, scheduler_overrides=None):
|
||||
config = find_sampler_config(name)
|
||||
|
||||
if config is None or config.constructor is None:
|
||||
if debug or not shared.opts.schedulers_fallback:
|
||||
raise errors.ValidationError(f'Sampler: name="{name}" unknown')
|
||||
return restore_default(model, name)
|
||||
|
||||
from modules import sd_samplers_diffusers
|
||||
@@ -126,16 +128,16 @@ def create_sampler(name, model, scheduler_overrides=None):
|
||||
pass
|
||||
elif (model is not None) and (is_flow and not requires_flow):
|
||||
log.error(f'Sampler: "{sampler.name}" cls={sampler.sampler.__class__.__name__} pipe={model.__class__.__name__} type={pred_type} model requires sampler with discrete prediction')
|
||||
if not debug:
|
||||
return restore_default(model, name)
|
||||
if debug or not shared.opts.schedulers_fallback:
|
||||
raise errors.ValidationError(f'Sampler: name="{sampler.name}" cls={sampler.sampler.__class__.__name__} type={pred_type} model requires sampler with discrete prediction')
|
||||
else:
|
||||
raise ValueError(f'Sampler: name="{sampler.name}" cls={sampler.sampler.__class__.__name__} type={pred_type} model requires sampler with discrete prediction')
|
||||
return restore_default(model, name)
|
||||
elif (model is not None) and (not is_flow and requires_flow):
|
||||
log.error(f'Sampler: "{sampler.name}" cls={sampler.sampler.__class__.__name__} pipe={model.__class__.__name__} type={pred_type} model requires sampler with flow prediction')
|
||||
if not debug:
|
||||
return restore_default(model, name)
|
||||
if debug or not shared.opts.schedulers_fallback:
|
||||
raise errors.ValidationError(f'Sampler: name="{sampler.name}" cls={sampler.sampler.__class__.__name__} type={pred_type} model requires sampler with flow prediction')
|
||||
else:
|
||||
raise ValueError(f'Sampler: name="{sampler.name}" cls={sampler.sampler.__class__.__name__} type={pred_type} model requires sampler with flow prediction')
|
||||
return restore_default(model, name)
|
||||
|
||||
# assign sampler
|
||||
if model is not None:
|
||||
|
||||
@@ -450,7 +450,7 @@ class DiffusionSampler:
|
||||
sigma_applied = True
|
||||
if not sigma_applied:
|
||||
if debug or not shared.opts.schedulers_fallback:
|
||||
raise ValueError(f'Sampler: name="{name}" does not support sigma="{sched_sigma}"')
|
||||
raise errors.ValidationError(f'Sampler: name="{name}" does not support sigma="{sched_sigma}"')
|
||||
else:
|
||||
log.warning(f'Sampler: name="{name}" does not support sigma="{sched_sigma}", using default schedule')
|
||||
else:
|
||||
@@ -519,6 +519,8 @@ class DiffusionSampler:
|
||||
log.error(f'Sampler: "{name}" {e}')
|
||||
if debug:
|
||||
errors.display(e, 'Samplers')
|
||||
if debug or not shared.opts.schedulers_fallback:
|
||||
raise errors.ValidationError(f'Sampler: name="{name}" {e}') from e
|
||||
self.sampler = None
|
||||
return
|
||||
|
||||
@@ -527,7 +529,7 @@ class DiffusionSampler:
|
||||
cls_source = inspect.getsource(constructor)
|
||||
if '"flow_prediction"' not in cls_source and "'flow_prediction'" not in cls_source:
|
||||
if debug or not shared.opts.schedulers_fallback:
|
||||
raise ValueError(f'Sampler: name="{name}" does not appear to support flow_prediction')
|
||||
raise errors.ValidationError(f'Sampler: name="{name}" does not appear to support flow_prediction')
|
||||
else:
|
||||
log.warning(f'Sampler: name="{name}" does not support flow_prediction')
|
||||
self.sampler = None
|
||||
@@ -547,7 +549,7 @@ class DiffusionSampler:
|
||||
default_accept_sigmas = (model is not None) and hasattr(model.default_scheduler, 'set_timesteps') and "sigmas" in set(inspect.signature(model.default_scheduler.set_timesteps).parameters.keys())
|
||||
if default_accept_sigmas and not accept_sigmas:
|
||||
if debug or not shared.opts.schedulers_fallback:
|
||||
raise ValueError(f'Sampler: name="{name}" does not accept sigmas')
|
||||
raise errors.ValidationError(f'Sampler: name="{name}" does not accept sigmas')
|
||||
else:
|
||||
log.warning(f'Sampler: name="{name}" does not accept sigmas')
|
||||
self.sampler = None
|
||||
@@ -557,7 +559,7 @@ class DiffusionSampler:
|
||||
if default_accept_scale_noise and not accept_scale_noise:
|
||||
log.warning(f'Sampler: name="{name}" does not implement scale noise')
|
||||
if debug or not shared.opts.schedulers_fallback:
|
||||
raise ValueError(f'Sampler: name="{name}" does not implement scale noise')
|
||||
raise errors.ValidationError(f'Sampler: name="{name}" does not implement scale noise')
|
||||
else:
|
||||
log.warning(f'Sampler: name="{name}" does not implement scale noise')
|
||||
self.sampler = None
|
||||
|
||||
Reference in New Issue
Block a user