The settings rows were verdicted one at a time against int8 qk alone, so
the table could assemble a tuple no row ever measured and contradict its
own stars: pv lost a solo 10 percent margin test while the starred best
config carried pv at four of nine shapes, and the emitted smooth-only
stack was strictly dominated by measured rows at three shapes.
- select the recommendation as the best measured quantized config by the
star rule (lowest error within 5 percent of the fastest, error cap vs
int8), then gate that one config against unquantized at a z adjusted
for having selected the best of the pool
- decompose the winner into the settings rows; each reason cites the
measured sibling that isolates its setting, replacing the blanket no
gain wording that hid an 8 percent measured win
- drop the additive stack estimate, composition check and float8 rescue,
which the joint selection covers by construction on measured rows
- name each shape's selected config in the per-shape verdict note and
compute sidak z exactly for any candidate count
Hoisting the function-local imports to module scope wrote
`import importlib.import_module`, which cannot resolve because
import_module is a function in importlib, not a submodule, so the
benchmark failed at startup with ModuleNotFoundError.
- import importlib, which is what the module-scope call sites need
The toggle changes no output, so the verdict is a symmetric
faster/slower test on the layer forward it gates, voted across every
measured dequant shape; the standalone kernel ratio stays in the notes.
Every dequant shape and block geometry comes from a real transformer config,
one source of truth per model.
- flux.1: attention linears 3072x3072, feed-forward 12288x3072, block at
3072 wide, 24 heads, 12288 ff, 4608 joint tokens
- krea 2: standalone wq 6144x6144, swiglu gate 16384x6144, block at 6144
wide, 48 heads, 4608 joint tokens
- the block section measures every geometry in block_geometries; buyback
costs are judged at the block matching the reference shape, with the
geometry named in the reason
- te shape lookup keys on its label instead of a list index
Krea 2 runs joint attention over one text plus image stream with a segment
mask: text is padded to a fixed 512 tokens and the padded tail is masked for
queries and keys both, so fully masked query rows yield nan under sdpa. The
preset carries the transformer's exact (B, 1, L, L) mask, nan-guards the
error path the way the model does, and uses the 48 kernel-level heads left
after gqa expansion at 4608 joint tokens.
- fix the drift fields crashing when save_report rebuilt the run info
Per-preset include lists trimmed video and masked shapes for runtime, which
left the composition check without its smooth_hadamard row there. Only hard
technical exclusions remain, as an exclusion map: sd15 skips hadamard configs
because compiling hadamard with a non pow2 head dim hangs torch inductor.
- wan22, wan22-cfg, ltx2 and masked gain smooth_hadamard, fp16qk, fp8qk and
fp8full rows; availability gates and the per-config timeout still apply
Repeat-pair runs measured 2-4% between-run drift on one machine, enough to
flip threshold verdicts near the margin on every rerun.
- bench keeps its iteration samples: rows carry a median sigma, and per-shape
sentinel re-measurements sample run-level clock drift
- on/off verdicts are three-zone at the run's own noise level; too close to
the margin keeps the current setting and says so
- pv candidates (now including fp16) are tested independently against the
margin at a sidak-adjusted z instead of min-then-threshold
- unmeasured toggle stacks are estimated additively in the composition check
- per-shape qk verdicts print alongside the reference-shape verdict
- cross-gpu error sanity bands flag corrupted measurements
- on/off verdicts share one speed margin (recommend_speed_margin, 10%) across
attention, dequant, compile, te and conv rows
- re-check the recommended toggle stack against unquantized; individually passing
buybacks can eat a marginal qk gain
- judge smooth k and hadamard cost at block scope when measured: kernel rows hand
the prep contiguous q/k/v, real models hand it strided views from the fused qkv
projection; reasons cite both scopes
- give bare float8 qk its own shot at the margin before disabling, the verdict
must not hinge on int8 alone
- compare triton flash against the recommended config, not always int8
- note self-attention shapes that disagree with the reference verdict
- fold the enable rows into the type rows: disabled, enabled or an explicit dtype
- pv keep-unquantized value is disabled; enabled means int8 pv
- add a text encoder row judged at te geometry
- update locale hints, drop the orphaned checkbox hint
The native loader entry log repeated the name and full file path already
printed one line earlier by network_load. Remove it and fold cache-hit
status into the network_load announce line, so a native load emits one
starting line plus the result line instead of three with a duplicated
path.
The Krea 2 transformer keeps checkpoint-style module names while the
official krea/Krea-2-LoRA releases are saved with upstream-diffusers
names, so all 264 modules failed to bind and the LoRAs silently did
nothing. Krea 2 is the only native-LoRA arch with an sdnext-owned
transformer, so its module names diverge from the diffusers ecosystem.
- native_adapter.resolve_group_targets consults the arch resolver first
for passthrough prefixes, falling back to verbatim binding; a no-op
for arches that load the diffusers class
- krea2_lora maps diffusers attn/ff/text_fusion/embedder names onto the
checkpoint module tree; checkpoint-named LoRAs still bind verbatim
- add test/test-krea2-native-adapters.py