Add the official Anima 1.0 Aesthetic and Turbo releases in diffusers
format. The previous turbo entry pointed at an unofficial build (base
with a fused community turbo lora); the official distilled checkpoint
replaces it.
- reference-base.json: add anima 1.0 aesthetic
- reference-distilled.json: point anima 1.0 turbo at the official v1.0
- add reference previews, remove the replaced turbo preview
allow_shared=False predates the Qwen-3 0.5B entries in shared_te_map, so
every Anima repo downloaded its own copy of the text encoder. Remove it
so all variants share the canonical Anima-1.0-Base text encoder.
Benchmark and validate sdnq attention on the local gpu: correctness
checks for mask, causal, gqa and padding code paths, float8 support
probe, per-shape speed and error comparison against torch sdpa and
sageattention, and measured recommendations for the settings section.
Tables fill in live with per-config compile/warmup/timing progress,
current settings are compared against recommended values, and --save
writes a plain-text transcript of the results. --config-timeout turns
stuck compiles into failed rows; sd15 skips its hadamard configs since
compiling hadamard with a non pow2 head dim currently hangs inductor.
- shape presets follow real model geometries: sd15, sdxl, anima,
flux2 klein, wan22 a14b, ltx 2.3, plus a masked joint-attention case
- runs the shipped kernel from modules/sdnq/kernels/triton_atten.py
directly, with stock sdpa restored for baselines and references
All-in-one exports bundle the text encoder and VAE alongside the
transformer under LDM-style family prefixes (cond_stage_model.,
first_stage_model., text_encoders., vae.). The native loader treated
those keys as a mixed-prefix error and rejected the file. Drop known
companion families before prefix detection and log what was skipped;
keys matching neither a transformer prefix nor a known family still
raise. TE and VAE keep coming from the base repo or their own overrides.
diffusers pipeline downloads build subfolder config.json allow-patterns
with os.path.join, and huggingface_hub>=1.22 matches patterns with
fnmatchcase which does not normalize path separators
(huggingface/huggingface_hub#4435). On windows the resulting backslash
patterns match nothing, so per-component config.json files are never
downloaded and the incomplete snapshot still passes the diffusers
cache-completeness check, failing every subsequent load with
"no file named config.json".
Prefetch component configs with forward-slash patterns before pipeline
load. This covers all model families and also repairs snapshots already
broken by the bug on the next load attempt. No-op on linux, in offline
mode, and for local folder or single-file models.
Removing all loras never called set_adapters, so peft adapters stayed
active until model reload. Removal now uses disable_lora, which keeps
modules intact; unload_lora_weights would detach balanced offload hooks.
Load calls enable_lora after set_adapters since peft set_adapter does
not clear the disabled flag. Removal of fused diffusers loras remains
unhandled.
NetworkModule.multiplier matched text encoders via 'transformer' in the
key prefix, which fits dit keys but never lora_te keys, so text encoder
modules followed unet_multiplier[0] and the te= tag strength was ignored.
Network activation ran after prompt encoding, so text encoder lora
weights never affected embeds on the first generation and the stale
result was then served from the embed cache. The trailing unfiltered
activate in network_load also overrode the te exclude filter, so the
lora_apply_te setting was never honored.
- parse and activate networks in process_base before pipeline args are built
- activate_filtered gates text encoder components on per-request or global
lora_apply_te; used by base, hires, detailer and faceid call sites
- network_load accepts activate=False for callers that run their own
deactivate/activate sequence with include/exclude
- network_activate walks excluded components in restore-only mode so a
filtered text encoder reverts to backup instead of keeping stale deltas
- loaded_loras cache is single-entry since per-filter entries go stale when
the setting toggles
- prompt embed cache key includes the effective lora_apply_te value
transformers >=5.6 removed the text_model wrapper from CLIPTextModel, so
kohya te keys no longer matched the network layer mapping and text encoder
weights were silently skipped. KeyConvert retries te keys with the
text_model segment dropped; lora extraction keeps writing canonical kohya
naming for flattened encoders.
The single-file override loaded via from_pretrained(state_dict=...) without a
quantization_config and then relied on do_post_load_quant, which no-ops on a
bare module (it maps Model/TE onto pipeline attributes that a lone encoder does
not have). A custom TE therefore loaded full-precision regardless of the SDNQ
setting. Pass quant_args into from_pretrained like the repo/default path so SDNQ
quantizes during load.
When a checkpoint change switches the model type, a custom sd_text_encoder no
longer fits, so reset it to Default and clear loaded_te, mirroring the sd_unet
reset. The type is resolved with detect_pipeline on both the loaded and incoming
checkpoints, so same-arch switches (Krea2 Base and Turbo share one pipeline
class) do not reset. The checkpoint handler also returns sd_text_encoder
alongside sd_unet so the dropdown reflects it.
cfg=-1 means use the pipeline's own default. Krea2Pipeline serves both Base
and Turbo under one class, so a static signature default cannot fit both: Base
needs real guidance while the distilled Turbo runs guidance-free. Resolve the
unset default from is_distilled (Base 4.5, Turbo 1.0). Explicit cfg is passed
through unchanged.
reload_text_encoder only hot-swapped T5-family encoders and ran only at initial
load, so changing sd_text_encoder for a model with a generic encoder (Krea2's
Qwen3-VL) never took effect until a full model reload. Track the loaded
selection and, for encoders with no in-place swap, reload the model on change,
triggered from the settings handler. The fresh model object also invalidates
the prompt cache.
The single-file override path built a T5EncoderModel regardless of the
requested class, so a non-T5 override (Qwen3-VL for Krea2) became a T5 with the
wrong vocab and overflowed its embedding into a CUDA device-side assert. Load
the file as the class the pipeline requests via from_pretrained(state_dict=...),
letting transformers reconcile per-arch key prefixes, and fall back to the base
text encoder on failure.
git() returns command output on failure instead of raising, so a failed
rev-parse read as != commit and spuriously flagged the repo upgraded and
required a restart. Guard on a 40-char sha, matching the latest-commit check.
strip_prefix returns the detected prefix instead of logging it, so the load
summary reports it alongside the key count and the redundant reading-state
marker is gone. Four near-identical cls/file lines become one.
Base ships last.up all-zeros so the branch is a no-op; pre-branch
finetunes omit both keys. A zero_init_missing spec field zero-fills
them on load instead of falling back to the base transformer.
Under uv, install --upgrade re-resolves the full dependency set eagerly: the pinned tokenizers and transformers installs bumped typing-extensions past its requirements pin on every update, and the requirements check then downgraded it back, flagging a restart each time. The preceding uninstall and exact pins already force the intended change, so the flag only produced churn. The pip-routed diffusers install is aligned for consistency.
The post-upgrade restart depended on a pinned requirement drifting in the same run, since the requirements check was the only place that set restart_required. The direct check compared a short hash and date string against a full sha and never fired. Set restart_required when the repository update moves HEAD so an upgrade restarts even when no package pins changed; a no-op pull now logs the repository as unchanged instead of upgraded and skips the restart.
check_transformers and check_diffusers compared the target commit against a marker stored in server options, which is only persisted after full webui startup. An upgrade restart fires before that point, so the marker stayed stale and the next launch reinstalled the same pin again. Read the installed commit from the package dist-info direct_url.json instead; the options values remain as informational display.