feat(lora): per-layer select stack modes klora and estlora

Two-network subject+style sets select a winner per layer instead of
summing: scores are top-K magnitude sums (klora) or Frobenius energies
(estlora), and a timestep ramp shifts layers from the subject network
toward the style network across sampling, reduced to at most one
precomputed flip per layer per pass. On sub-8-bit SDNQ the pair rides
the side-channel as separate segments flipped in place; other layers
recompute the winner from the pristine backup, so select modes force
backup mode. Selection resets per pass from the callback setup and is
gated off under model compile. estlora's measured style-discrepancy
term is exposed as an option. Adds XYZ axes for the stack settings.
This commit is contained in:
CalamitousFelicitousness
2026-07-18 02:58:11 +01:00
parent 2396185393
commit 259e15fafe
9 changed files with 426 additions and 19 deletions
+16
View File
@@ -104,6 +104,10 @@ class SharedSettingsStackHelper():
todo_ratio = None
teacache_thresh = None
extra_networks_default_multiplier = None
lora_stack_mode = None
lora_stack_density = None
lora_stack_alpha = None
lora_stack_discrepancy = None
disable_apply_metadata = None
disable_apply_params = None
sdnq_quant_mode = None
@@ -136,6 +140,10 @@ class SharedSettingsStackHelper():
self.sd_unet = shared.opts.sd_unet
self.sd_text_encoder = shared.opts.sd_text_encoder
self.extra_networks_default_multiplier = shared.opts.extra_networks_default_multiplier
self.lora_stack_mode = shared.opts.lora_stack_mode
self.lora_stack_density = shared.opts.lora_stack_density
self.lora_stack_alpha = shared.opts.lora_stack_alpha
self.lora_stack_discrepancy = shared.opts.lora_stack_discrepancy
self.teacache_thresh = shared.opts.teacache_thresh
self.disable_apply_metadata = shared.opts.disable_apply_metadata
self.disable_apply_params = shared.opts.disable_apply_params
@@ -148,6 +156,10 @@ class SharedSettingsStackHelper():
shared.opts.data["disable_apply_metadata"] = self.disable_apply_metadata
shared.opts.data["disable_apply_params"] = self.disable_apply_params
shared.opts.data["extra_networks_default_multiplier"] = self.extra_networks_default_multiplier
shared.opts.data["lora_stack_mode"] = self.lora_stack_mode
shared.opts.data["lora_stack_density"] = self.lora_stack_density
shared.opts.data["lora_stack_alpha"] = self.lora_stack_alpha
shared.opts.data["lora_stack_discrepancy"] = self.lora_stack_discrepancy
shared.opts.data["prompt_attention"] = self.prompt_attention
shared.opts.data["schedulers_solver_order"] = self.schedulers_solver_order
shared.opts.data["schedulers_sigma_adjust"] = self.schedulers_sigma_adjust
@@ -205,6 +217,10 @@ axis_options = [
AxisOption("[Prompt] Prompt parser", str, apply_setting("prompt_attention"), choices=lambda: ["native", "compel", "xhinker", "a1111", "fixed"]),
AxisOption("[Network] LoRA", str, apply_lora, cost=0.5, choices=list_lora),
AxisOption("[Network] LoRA strength", float, apply_lora_strength, cost=0.6),
AxisOption("[Network] LoRA stack mode", str, apply_setting("lora_stack_mode"), cost=0.6, choices=lambda: ["sum", "ties", "dare_ties", "dare_linear", "magnitude_prune", "klora", "estlora"]),
AxisOption("[Network] LoRA stack density", float, apply_setting("lora_stack_density"), cost=0.6),
AxisOption("[Network] LoRA stack ramp", float, apply_setting("lora_stack_alpha"), cost=0.6),
AxisOption("[Network] LoRA stack discrepancy", float, apply_setting("lora_stack_discrepancy"), cost=0.6),
AxisOption("[Network] Styles", str, apply_styles, choices=lambda: [s.name for s in shared.prompt_styles.styles.values()]),
AxisOption("[Param] Width", int, apply_field("width")),
AxisOption("[Param] Height", int, apply_field("height")),