Commit Graph

9233 Commits

Author SHA1 Message Date
CalamitousFelicitousness 4d6f2b65c8 chore(settings): remove the bmm attention methods
Batch matrix-matrix and Dynamic Attention BMM applied a legacy Attention
processor to pipe.unet, which a diffusion transformer does not have, so
they served unet models alone and said nothing elsewhere. The choices, the
processor and its slice helper are removed, an unrecognized method now
warns rather than selecting nothing, and a stored value is rewritten to
Scaled-Dot-Product on load.
2026-08-24 19:59:41 +01:00
CalamitousFelicitousness 26d922371d fix(attention): honor the disabled choice for attention slicing
attention_slicing holds one of Default, Enabled or Disabled, so testing the
string for truth sent Disabled down the enable branch and left the disable
call unreachable, while the log line below it reported the choice rather
than the action taken.
2026-08-24 19:08:55 +01:00
Vladimir Mandic 991590d210 Merge branch 'dev' into feat/attention-core 2026-08-23 11:57:27 +02:00
Vladimir Mandic 38324a198e more api cleanup
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-08-23 11:40:53 +02:00
Vladimir Mandic f4aa9d1b86 batch processing run register after script
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-08-23 11:34:34 +02:00
Vladimir Mandic c5e29e3d7b api schema updates
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-08-23 11:28:50 +02:00
Vladimir Mandic cf3dfebc98 fix file logger traceback
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-08-23 09:59:38 +02:00
CalamitousFelicitousness e0c3e00af2 chore(settings): remove dead attention options
xformers_options had no reader, and Sub-quadratic has not been an
attention choice for a long time, so the hypertile branches keyed on it
never ran. Configs that still store xformers_options load without the
unknown-setting warning.
2026-08-23 08:21:28 +01:00
CalamitousFelicitousness b57b8c6a64 perf(attention): capture backend options once per chain
The sdnq backend read six settings on every call; it now captures them
when the chain is built. Each backend declares the settings its call
captures, and webui registers one onchange over those names plus the
override set and the torch kernel flags, so a change rebuilds the chain
between jobs. When a compiled model is resident the rebuild also resets
dynamo, since its graphs hold the previous router.
2026-08-23 08:21:28 +01:00
CalamitousFelicitousness 125ae8e2bf feat(attention): route tracing and chain telemetry
SD_ATTN_DEBUG logs each distinct route once: backend, component role,
step, shapes, dtype and mask presence. The router takes an optional
observer for it, so the clean path carries one pointer check. report()
returns the active chain and generation context, and torch_info records
the whole chain as one string instead of the last prepared backend.
2026-08-23 08:20:46 +01:00
CalamitousFelicitousness 4509b145cd feat(attention): generation context
A module-level context tells attention consumers what is running: the
component role (transformer, text encoder, vae), the index of the
denoiser forward about to run, the pass length, and the model. It is
opened and closed around process_images, reset per denoising pass beside
the callback setup, and advanced by both step sources: the classic
callback passes the completed step plus one, the modular pre-forward
hook counts forwards. Roles come from the existing text encoder and vae
hijacks and the modular phase hooks. The step also lives in a device
scalar updated in place, so a compiled reader keeps its graph across
steps.
2026-08-23 08:20:46 +01:00
CalamitousFelicitousness 9d1d7c839a fix(processing): re-apply attention when the overrides change
The generate-time gate compared the stored processor name against the
sdp_overrides list, which can never be equal, so the check reduced to
the processor name alone and a changed override set was never applied
until the next model load. set_diffusers_attention now stamps the
override set it applied beside the processor name, the gate compares
both, and pipe switches carry the new attribute with the old one.
2026-08-23 08:20:46 +01:00
CalamitousFelicitousness bb0cc5328e fix(attention): flex joins the chain instead of ending it
The flex backend never called the sdpa it replaced, so any backend
stacked before it was unreachable and every call it could not serve,
cpu or 3d inputs included, failed inside flex_attention. It is now an
ordinary entry gated on what flex_attention accepts: 4d tensors on one
non-cpu device. The mask path drops the 2d special case, which indexed
attn_mask.size and reshaped the mask onto the wrong axis; expanding to
(batch, heads, q, kv) already follows sdpa broadcast semantics.
2026-08-23 08:20:46 +01:00
CalamitousFelicitousness 3302e78af6 refactor(attention): backend registry and a single sdpa router
Replace the six closure hijacks stacked in devices.set_sdpa_params with
a registry of declarative backends and one router installed in their
place. Each backend declares the constraints its closure carried as a
predicate, a priority matching its old stacking position, and a prepare
step that imports and configures the implementation; the router walks
the prepared entries by priority and hands declined calls to the
terminal backend (dynamic, flex) or the original sdpa, so fallback is
the router's job rather than each closure's.

- parity held: gates transcribed literally, the same kernel kwargs,
  enable_gqa passed to the original only when set, torch_info keeps the
  last prepared backend, the dynamic pin still set
- a backend enabled on a platform without it warns instead of silently
  doing nothing
- the legacy set_* entry points are gone; devices.py installs the router
- test/test-attention-router.py checks every override subset against the
  old stacking order, gate parity over 16,000 shape cases, dispatch,
  terminal handoff and prepare isolation, offline
2026-08-23 08:20:45 +01:00
CalamitousFelicitousness 6ed1b99aaa refactor(attention): move into a package
modules/attention.py becomes modules/attention/: hijacks.py keeps the six
sdpa monkeypatch setters, dispatcher.py the diffusers-side processor and
dispatcher setup with the kernels hub hijack, and the package facade
re-exports every public name so call sites are unchanged. The devices
import moves inside set_diffusers_attention, which removes the
devices <-> attention import cycle.
2026-08-23 08:20:45 +01:00
Vladimir Mandic e17efc19f7 update upscaler workflow
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-08-22 20:10:02 +02:00
Vladimir Mandic 9920004dec update file logger and requirements
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-08-22 17:52:49 +02:00
Vladimir Mandic 69d8f4f7c4 handle torchsde
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-08-22 16:08:58 +02:00
Vladimir Mandic 87cb999713 fix missing export
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-08-22 11:38:51 +02:00
Vladimir Mandic 864e9a497f Merge branch 'dev' into master 2026-08-22 11:30:18 +02:00
Vladimir Mandic 63a5722429 prepare queue mgmt
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-08-22 11:24:41 +02:00
Vladimir Mandic 8cc52889a3 lint
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-08-21 20:35:15 +02:00
Vladimir Mandic 84c1ed66b3 video upscaling
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-08-21 20:28:44 +02:00
Vladimir Mandic 9dd1d73f6d video upscaling using spandrel
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-08-21 16:21:12 +02:00
Vladimir Mandic d239bfcde1 placeholder video upscale
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-08-21 10:26:17 +02:00
Vladimir Mandic 52f5c17435 update spandrel integation
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-08-21 09:35:15 +02:00
CalamitousFelicitousness 25b7961e4e fix(lora): refuse a network whose deltas do not fit the model
A delta that does not fit its target module cannot apply, and applying only
the layers that do fit leaves the model in a state nothing was trained for,
so try_load_chain drops the whole file when any family reports a mismatch.
Bias deltas were never checked against the target bias and could only surface
at apply time; a module with no bias stays a non-mismatch, since whole
architectures are built bias=False.

- check bias deltas against the module bias in the lora, norm and full loaders
- carry the mismatch count on the network so the chain can refuse the file
- record refused writes in the infotext so a partial apply is not read as clean
- point the krea2 full-diff test at a module that has a bias
2026-08-21 02:12:16 +01:00
CalamitousFelicitousness 6a354cdbc6 fix(lora): apply bias deltas onto the bias, not the weight
network_add_weights defaulted its base tensor to self.weight for the bias
delta as well, so in fuse mode a diff_b was added to the weight matrix and
the result written into the bias. Layers where in and out differ threw a
shape error and had the weight matrix installed as their bias, square layers
broadcast silently, and either way the summary still counted the delta as
applied.

- pick the base tensor from the bias flag
- name the layer, target and both shapes in the mismatch error
- return which of (weight, bias) took a write, count the rest as refused
- report refused= on partially applied and partially removed networks
- cover both apply paths in test/test-lora-apply.py
2026-08-21 01:42:25 +01:00
Dity0 43b739066d Add tensor-wise quantization support with group_size=-2 2026-08-21 00:04:33 +03:00
Vladimir Mandic c66342e2e6 fallback unpack-latents, log client auth, update login page
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-08-19 18:03:39 +02:00
Vladimir Mandic 1b13e732e0 add cookie-based auth for remote-ip
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-08-19 16:28:07 +02:00
Vladimir Mandic a393373b3a Merge pull request #5039 from resonantsky/dev
Added ROCm Multi-Arch installation support
2026-08-19 16:24:04 +02:00
Vladimir Mandic 85235a8bcd Merge pull request #5041 from vladmandic/feat/ltx-keyword-core
feat(ltx): add a keyword core to the ltx runner
2026-08-19 08:35:08 +02:00
CalamitousFelicitousness 9c11929780 fix(ltx): place the 0.9 latent upsampler on the compute device
Its 2.x sibling always did, so only the 0.9 path hit a cpu weight against cuda
latents. Also logs why a run is refused, which until now travelled only in the
raised error.
2026-08-19 01:45:46 +01:00
CalamitousFelicitousness 5deeeebbdc fix(framepack): decode tiny video without a second normalize
TAEHV.decode_video already returns [-1,1] and framepack applied its own x2-1 on
top, landing near [-3,1] where the worker documents [-1,1]. The path was
unreachable until the taesd loader began honoring an explicit variant.
2026-08-19 01:45:46 +01:00
CalamitousFelicitousness 8d69b011e1 feat(ltx): add a keyword core to the ltx runner
run_ltx reported failure by yielding a string, which is why LTX had no API.
run() is the core underneath: keyword arguments named as video_run.run names
them, a VideoResult back, VideoError out with 499 for an interrupt. The lock,
progress and summary stay in the adapter, whose signature is unchanged since
callers bind to it by keyword. Failure now closes the processing object and
deactivates networks, which abort never did.
2026-08-19 01:45:46 +01:00
CalamitousFelicitousness bd0ea5ee1b fix(ltx): resolve every conditioning source the same way
The gallery branch took an upload handle or a PIL image, so an encoded string
fell through to .convert and was logged as a failed condition. Strings now go
to the api decoder, which reads base64 and upload refs rather than paths.
2026-08-19 01:45:46 +01:00
CalamitousFelicitousness 5837dcdd63 refactor(video): carry output resolution on the video result
Both runners round the requested resolution and the two-stage LTX path derives
its own, so the request never recorded what came out. Read it off the decoded
frames instead.
2026-08-19 01:45:46 +01:00
Dity0 0218a0aadc Add FP16 Accumulation option to SDNQ Atten 2026-08-18 20:44:05 +03:00
Vladimir Mandic 8fa9eda7c1 Merge pull request #5036 from vladmandic/fix/scripts-empty-arg-vector
Fix/scripts empty arg vector
2026-08-18 17:35:05 +02:00
resonantsky 50494ee6d4 fix: remove unnecessary parens after if keyword 2026-08-18 11:59:10 +02:00
resonantsky d9642f8eaf Added ROCm Multi-Arch installation support 2026-08-18 11:50:48 +02:00
Vladimir Mandic 3e64c2d92a Merge pull request #5038 from vladmandic/fix/video-tiny-vae
Fix/video tiny vae
2026-08-18 10:47:40 +02:00
CalamitousFelicitousness 8774cc72b9 fix(video): return none when the av package is unavailable
check_av returned the module on success and False on failure, so the two
callers testing for None treated a failed import as a working av and reached
into it anyway. It now returns None, and the guard that had to test for both
tests for one.
2026-08-18 03:13:00 +01:00
CalamitousFelicitousness 05574bc30a fix(video): route tiny decode through the vae hijack
Tiny decode lost its call site when the video vae hijack was replaced by the
shared one, which has no tiny branch, so selecting it on the video tab quietly
decoded through the full vae for every engine. The decode hijack now takes the
tiny path when the run asked for it, falling back to the full vae whenever
there is no tiny counterpart to use.

The class test also spelled Wan in capitals and matched none of the four Wan
pipeline classes. Alongside that:

- the requested type travels on the pipe rather than a module global, so the
  hijack reads the same value the run set
- a latent whose channel count taehv cannot take is reported and falls back
  instead of failing inside the first convolution
- decode_video already returns the range the pipelines expect, so the second
  normalization that followed it is gone
2026-08-18 03:13:00 +01:00
CalamitousFelicitousness 6779707fde fix(vae): honor an explicitly requested taesd variant
get_model discarded the variant its caller asked for and re-derived one from
the loaded model type. None of the video model types appear in those sets, so
every video caller got None back and no tiny decoder at all, while kandinsky5
matched the flux group and would have been handed an image decoder.

The derivation now runs only when the caller named nothing. Callers that name
nothing are unaffected, and the one video type that resolved before keeps the
same variant and cache key.
2026-08-18 00:54:30 +01:00
CalamitousFelicitousness ab5056199d fix(video): align ltx frame counts on the shared path with the tab
LTX generates 8n+1 frames and floors anything else internally, so a request
for 120 frames on the shared path silently produced 113. The tab has always
snapped the count before requesting it; the shared path now applies the same
rule, next to the width and height rounding it already did.
2026-08-18 00:46:22 +01:00
CalamitousFelicitousness bd6abfc3e4 fix(video): resolve dropdown model selection through the registry
Both load buttons matched the dropdown value against the raw row list, so the
separators the list uses for grouping resolved to a row with no repo. The
loader returned early on that row without loading or reporting, and the ltx
tab went on to record load and offload timings for a load that never ran.

Selection now goes through models_def.find, which knows a separator names no
model, and both buttons say what happened. The ltx button had no output bound
at all, so its message went nowhere.
2026-08-18 00:46:16 +01:00
CalamitousFelicitousness 2c66039c37 feat(video): derive input mode from the registry row
Two ladders decided how a model's inputs get wired, and they had drifted: the
api reported an unrecognized row as t2v while run() fell through to a branch
that wires nothing. Eight LTX condition rows sat in that gap, advertised as
text to video and generating without their conditioning.

dispatch_mode answers once from the row, reading name markers before the
pipeline class because one class serves several modes: six LTXConditionPipeline
rows are named T2V or I2V and generate as such. Rows that declare nothing now
resolve as condition, and the api reports that instead of guessing t2v.
2026-08-18 00:44:28 +01:00
CalamitousFelicitousness 9f987aad8e fix(scripts): range-check the selectable script arg slice
The selectable run and after paths sliced the incoming vector behind an
attribute check alone, so a short vector reached the script as too few
positionals and raised a TypeError out of the runner. Both now resolve the
slice the same way the alwayson hooks do and report the mismatch instead.
2026-08-18 00:36:05 +01:00