From e2d3ac5159dcd2aa6def06cfb2aa4671b9071498 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Tue, 14 Jul 2026 16:00:03 +0300 Subject: [PATCH 01/64] ipex check last_level_cache_size for l2 cache --- modules/intel/ipex/hijacks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/intel/ipex/hijacks.py b/modules/intel/ipex/hijacks.py index 6fb0714c0..afd45768d 100644 --- a/modules/intel/ipex/hijacks.py +++ b/modules/intel/ipex/hijacks.py @@ -342,7 +342,7 @@ def get_device_properties(device=None): "multi_processor_count": device_prop.gpu_subslice_count, } if not hasattr(device_prop, "L2_cache_size"): - new_keys["L2_cache_size"] = cache_size_dict.get(getattr(device_prop, "device_id", 0x56A0), cache_size_dict[0x0000]) + new_keys["L2_cache_size"] = getattr(device_prop, "last_level_cache_size", cache_size_dict.get(getattr(device_prop, "device_id", 0x56A0), cache_size_dict[0x0000])) return DeviceProperties(device_prop, new_keys) From 0d15fd1f62f3537579314e95a8319db87a4fe387 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Tue, 14 Jul 2026 17:16:25 +0300 Subject: [PATCH 02/64] upcast fp8 mm to fp16 on unsupported gpus and disable triton mm on alchemist and igpus --- modules/sdnq/kernel_wrappers.py | 52 ++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/modules/sdnq/kernel_wrappers.py b/modules/sdnq/kernel_wrappers.py index fbdb85f89..f123632cb 100644 --- a/modules/sdnq/kernel_wrappers.py +++ b/modules/sdnq/kernel_wrappers.py @@ -32,13 +32,18 @@ if devices.backend == "rocm": else: is_rdna2_and_older = False +if devices.backend in {"ipex", "xpu"}: + is_alchemist_or_igpu = bool(not torch.xpu.get_device_capability(devices.device).get("has_subgroup_2d_block_io", False)) +else: + is_alchemist_or_igpu = False + if os.environ.get("SDNQ_USE_OPENVINO_MM", None) is None: use_openvino_mm = bool(devices.backend in {"cpu", "openvino"}) else: use_openvino_mm = bool(os.environ.get("SDNQ_USE_OPENVINO_MM", "0").lower() not in {"0", "false", "no"}) if os.environ.get("SDNQ_USE_TRITON_MM", None) is None: - use_triton_mm = bool(is_rdna2_and_older or devices.backend in {"zluda", "ipex", "xpu"}) + use_triton_mm = bool(not is_alchemist_or_igpu and (is_rdna2_and_older or devices.backend in {"zluda", "ipex", "xpu"})) else: use_triton_mm = bool(os.environ.get("SDNQ_USE_TRITON_MM", "0").lower() not in {"0", "false", "no"}) @@ -56,6 +61,20 @@ else: use_contiguous_fp16_mm = use_contiguous_int8_mm +def fp_mm_torch_cuda(a: torch.Tensor, b: torch.Tensor, out_dtype: torch.dtype = torch.float32) -> torch.FloatTensor: + return torch.mm(a,b, out_dtype=out_dtype) + +def fp_mm_torch(a: torch.Tensor, b: torch.Tensor, out_dtype: torch.dtype = torch.float32) -> torch.FloatTensor: + if b.dtype == torch.float8_e4m3fn: + fp16_scale = 4 * b.shape[-2] + else: + fp16_scale = 65536 * b.shape[-2] + in_scale = fp16_scale**0.5 + a = a.to(dtype=torch.float32).div_(in_scale).to(dtype=torch.float16) + b = b.to(dtype=torch.float32).div_(in_scale).to(dtype=torch.float16) + return torch.mm(a,b).to(dtype=torch.float32).mul_(fp16_scale).to(dtype=out_dtype) + + int_mm_func = None fp_mm_func = None fp8_mm_func = None @@ -81,11 +100,11 @@ elif use_triton_mm: if is_fp8_mm_supported: fp8_mm_func = sdnq_triton_mm fp8_scaled_mm_func = sdnq_scaled_mm - use_tensorwise_fp8_matmul = False + use_tensorwise_fp8_matmul = True except Exception: use_triton_mm = False -if fp_mm_func is None and os.environ.get("SDNQ_USE_TRITON_MM", "1").lower() not in {"0", "false", "no"}: +if fp_mm_func is None and not is_alchemist_or_igpu and os.environ.get("SDNQ_USE_TRITON_MM", "1").lower() not in {"0", "false", "no"}: try: from .kernels.triton_mm import sdnq_triton_mm from .kernels.triton_scaled_mm import sdnq_scaled_mm @@ -102,25 +121,18 @@ if int_mm_func is None: if fp_mm_func is None: if devices.backend == "cuda": - def fp_mm_torch(a: torch.Tensor, b: torch.Tensor, out_dtype: torch.dtype = torch.float32) -> torch.FloatTensor: - return torch.mm(a,b, out_dtype=out_dtype) + fp_mm_func = fp_mm_torch_cuda else: - def fp_mm_torch(a: torch.Tensor, b: torch.Tensor, out_dtype: torch.dtype = torch.float32) -> torch.FloatTensor: - if b.dtype == torch.float8_e4m3fn: - fp16_scale = 4 * b.shape[-2] - else: - fp16_scale = 65536 * b.shape[-2] - in_scale = fp16_scale**0.5 - a = a.to(dtype=torch.float32).div_(in_scale).to(dtype=torch.float16) - b = b.to(dtype=torch.float32).div_(in_scale).to(dtype=torch.float16) - return torch.mm(a,b).to(dtype=torch.float32).mul_(fp16_scale).to(dtype=out_dtype) - fp_mm_func = fp_mm_torch + fp_mm_func = fp_mm_torch if fp8_mm_func is None: - def fp8_mm_torch(a: torch.Tensor, b: torch.Tensor, out_dtype: torch.dtype = torch.float32) -> torch.FloatTensor: - dummy_input_scale = torch.ones(1, device=a.device, dtype=torch.float32) - return torch._scaled_mm(a, b, scale_a=dummy_input_scale, scale_b=dummy_input_scale, bias=None, out_dtype=out_dtype) - fp8_mm_func = fp8_mm_torch + if is_fp8_mm_supported: + def fp8_mm_torch(a: torch.Tensor, b: torch.Tensor, out_dtype: torch.dtype = torch.float32) -> torch.FloatTensor: + dummy_input_scale = torch.ones(1, device=a.device, dtype=torch.float32) + return torch._scaled_mm(a, b, scale_a=dummy_input_scale, scale_b=dummy_input_scale, bias=None, out_dtype=out_dtype) + fp8_mm_func = fp8_mm_torch + else: + fp8_mm_func = fp_mm_torch if int_scaled_mm_func is None: @@ -140,7 +152,7 @@ if fp_scaled_mm_func is None: fp_scaled_mm_func = fp_scaled_mm_torch if fp8_scaled_mm_func is None: - if use_tensorwise_fp8_matmul: + if use_tensorwise_fp8_matmul or not is_fp8_mm_supported: def fp8_scaled_mm_torch(a: torch.Tensor, b: torch.Tensor, scale_a: torch.Tensor, scale_b: torch.Tensor, bias: torch.FloatTensor | None = None, out_dtype: torch.dtype = torch.float32) -> torch.FloatTensor: if bias is None: return fp8_mm_func(a,b, out_dtype=scale_a.dtype).mul_(scale_a).mul_(scale_b).to(dtype=out_dtype) From 6dcdbdc86e5213337ce7b711087167685d991496 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Tue, 14 Jul 2026 17:22:37 +0300 Subject: [PATCH 03/64] upcast fp8 weights instead of disable compile --- modules/sdnq/dequantizer.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/modules/sdnq/dequantizer.py b/modules/sdnq/dequantizer.py index 1344f60a2..26f6add91 100644 --- a/modules/sdnq/dequantizer.py +++ b/modules/sdnq/dequantizer.py @@ -13,10 +13,6 @@ from .packed_float import unpack_float from .layers import SDNQLayer -def skip_fp8_compile(weights_dtype: str) -> bool: # triton has no e4m3 conversions before sm_89, compiled dequant would crash - return not is_fp8_compile_supported and dtype_dict[weights_dtype]["storage_dtype"] == torch.float8_e4m3fn - - @devices.inference_context() def dequantize_asymmetric( weight: torch.Tensor, @@ -300,7 +296,12 @@ class SDNQDequantizer: ) -> tuple[torch.Tensor, torch.FloatTensor]: # pylint: disable=unused-argument if hadamard is None and self.use_hadamard and not non_hadamard: hadamard = get_hadamard(self.hadamard_group_size, dtype=self.result_dtype, device=weight.device) - re_quantize_matmul_func = re_quantize_matmul if skip_compile or skip_fp8_compile(self.weights_dtype) else re_quantize_matmul_compiled + if skip_compile: + re_quantize_matmul_func = re_quantize_matmul + else: + re_quantize_matmul_func = re_quantize_matmul_compiled + if not is_fp8_compile_supported and weight.dtype == torch.float8_e4m3fn: + weight = weight.to(dtype=scale.dtype) return re_quantize_matmul_func( self.weights_dtype, weight, @@ -333,7 +334,12 @@ class SDNQDequantizer: if hadamard is None and self.use_hadamard and not non_hadamard: hadamard = get_hadamard(self.hadamard_group_size, dtype=dtype, device=weight.device) re_quantize_for_matmul = self.re_quantize_for_matmul or self.is_packed - dequantize_weight_func = dequantize_weight if skip_compile or skip_fp8_compile(self.weights_dtype) else dequantize_weight_compiled + if skip_compile: + dequantize_weight_func = dequantize_weight + else: + dequantize_weight_func = dequantize_weight_compiled + if not is_fp8_compile_supported and weight.dtype == torch.float8_e4m3fn: + weight = weight.to(dtype=scale.dtype) return dequantize_weight_func( self.weights_dtype, weight, From 63aa0adfa8f6cf2010353c6813802f6359dd87b2 Mon Sep 17 00:00:00 2001 From: Oleksandr Liutyi Date: Tue, 14 Jul 2026 15:33:43 +0000 Subject: [PATCH 04/64] Missing covers: Lumina-DiMOO, Anima-1.0-Turbo-sdnq --- models/Reference/Alpha-VLLM--Lumina-DiMOO.jpg | Bin 0 -> 73937 bytes ...-Anima-1.0-Turbo-sdnq-svd-dynamic-uint4.jpg | Bin 0 -> 107351 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 models/Reference/vladmandic--Anima-1.0-Turbo-sdnq-svd-dynamic-uint4.jpg diff --git a/models/Reference/Alpha-VLLM--Lumina-DiMOO.jpg b/models/Reference/Alpha-VLLM--Lumina-DiMOO.jpg index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..4e2b81c6b3017263739c119ea446078ef923ee9d 100644 GIT binary patch literal 73937 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 z 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 Date: Tue, 14 Jul 2026 12:41:21 +0100 Subject: [PATCH 05/64] fix(sdnq): keep the attention benchmark alive on a windows console Hiding the sdnext startup log by pointing fds 1 and 2 at a file kills the process when stdout is a real console: sys.stdout writes through the win32 console api on the handle behind fd 1, so the first bootstrap log line raises OSError 'the handle is invalid', and with stderr broken the same way the interpreter aborts with no message, no traceback and no results. - swap sys.stdout/sys.stderr to a buffer along with the fd redirect - capture the startup log instead of discarding it to devnull, replay it on failure - catch SystemExit: loader.py and installer.py exit on fatal startup errors --- cli/sdnq-attention-benchmark.py | 64 +++++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 18 deletions(-) diff --git a/cli/sdnq-attention-benchmark.py b/cli/sdnq-attention-benchmark.py index db95417c9..cf43441c8 100755 --- a/cli/sdnq-attention-benchmark.py +++ b/cli/sdnq-attention-benchmark.py @@ -40,6 +40,7 @@ The first run of each shape includes triton autotune and torch.compile time; res cached on disk and reused by the webui for matching shapes. """ +import io import os import sys import json @@ -48,6 +49,7 @@ import time import signal import logging import argparse +import tempfile import importlib.metadata from contextlib import contextmanager @@ -284,25 +286,45 @@ def triton_version(): @contextmanager -def suppress_console_output(): +def capture_console_output(): # gate stdout and stderr at the fd level: covers python loggers regardless of their - # handler plumbing plus native-code writes (onnxruntime device discovery on wsl) - saved_stdout, saved_stderr = os.dup(1), os.dup(2) - devnull = os.open(os.devnull, os.O_WRONLY) + # handler plumbing plus native-code writes (onnxruntime device discovery on wsl). + # capture to a file rather than devnull: the sdnext bootstrap calls sys.exit on fatal + # startup errors (modules/loader.py, installer.py), so discarding this stream turns a + # startup failure into a silent process exit with nothing to debug. + # the python-level streams must move with the fds: on a windows console sys.stdout writes + # through the console api using the handle behind fd 1, so once fd 1 is a file the next + # print raises OSError 'the handle is invalid' and, with stderr equally broken, kills the + # interpreter before any handler or finally can run. buffer is deliberately left open: + # library loggers built during the import (transformers, torch) capture sys.stderr at + # handler construction and would raise on a closed stream long after the window closes + captured = {"text": ""} + buffer = io.StringIO() + saved_stdout_fd, saved_stderr_fd = os.dup(1), os.dup(2) + saved_stdout, saved_stderr = sys.stdout, sys.stderr + sink_fd, sink_path = tempfile.mkstemp(prefix="sdnq-bench-startup-", suffix=".log") try: sys.stdout.flush() sys.stderr.flush() - os.dup2(devnull, 1) - os.dup2(devnull, 2) - yield + os.dup2(sink_fd, 1) + os.dup2(sink_fd, 2) + sys.stdout, sys.stderr = buffer, buffer + yield captured finally: - sys.stdout.flush() - sys.stderr.flush() - os.dup2(saved_stdout, 1) - os.dup2(saved_stderr, 2) - os.close(devnull) - os.close(saved_stdout) - os.close(saved_stderr) + os.dup2(saved_stdout_fd, 1) + os.dup2(saved_stderr_fd, 2) + sys.stdout, sys.stderr = saved_stdout, saved_stderr + os.close(sink_fd) + os.close(saved_stdout_fd) + os.close(saved_stderr_fd) + native_text = "" + try: + with open(sink_path, "r", encoding="utf-8", errors="replace") as fh: + native_text = fh.read() + os.unlink(sink_path) + except OSError: + pass + captured["text"] = buffer.getvalue() + native_text def load_sdnext(): @@ -317,15 +339,21 @@ def load_sdnext(): # the webui startup log (device detect, packages, settings validation) is noise here: the # environment panel reports the stack. the bootstrap reconfigures its loggers during # import and onnxruntime's device discovery warns from c++, so gate the os-level fds for - # the import window; failures still surface as exceptions printed after the gate lifts + # the import window; on failure the captured log is replayed after the gate lifts os.environ.setdefault("TRANSFORMERS_VERBOSITY", "error") try: - with suppress_console_output(): + with capture_console_output() as startup_log: from modules import shared as shared_module from modules import devices as devices_module from modules.sdnq.kernels.triton_atten import sdnq_triton_atten as atten - except Exception as e: - console.print(f"[red]failed to import the sdnq attention kernel: {e}[/red]") + except BaseException as e: # pylint: disable=broad-exception-caught # SystemExit is not an Exception: the bootstrap exits on a failed torch or library import + if isinstance(e, KeyboardInterrupt): + raise + detail = f"exited with code {e.code}" if isinstance(e, SystemExit) else f"{type(e).__name__}: {e}" + console.print(f"[red]sdnext failed to start: {detail}[/red]") + text = startup_log["text"].strip() + if text: + console.print(Panel(escape(text[-4000:]), title="sdnext startup log", box=ROUNDED_BOX)) console.print("run from the sdnext root with the venv active; triton is required") return False # keep the sdnext loggers quiet after the bootstrap too, so stray log lines cannot tear From 101ead95368da06ff747e09f808b0053357481b2 Mon Sep 17 00:00:00 2001 From: CalamitousFelicitousness Date: Tue, 14 Jul 2026 17:37:41 +0100 Subject: [PATCH 06/64] fix(sdnq): follow the e4m3 upcast in the benchmark dequant path sdnq no longer skips compile for fp8 storage, it upcasts e4m3 to the scale dtype before the compiled dequant, so the tool's mirror of the deleted skip_fp8_compile gate went dead and fed the raw e4m3 weight to its compiled dequant: on pre-ada gpus that reports a compile failure for rows the webui runs fine. - mirror the upcast in dequant_args, keep the hardware probe on the raw weight - drop dequant_gated_to_eager and the gated-to-eager row, fp8 rows are measured now - say upcast, not eager fallback, in the environment panel and dequant notes --- cli/sdnq-attention-benchmark.py | 83 +++++++++++++++------------------ 1 file changed, 37 insertions(+), 46 deletions(-) diff --git a/cli/sdnq-attention-benchmark.py b/cli/sdnq-attention-benchmark.py index cf43441c8..834c539db 100755 --- a/cli/sdnq-attention-benchmark.py +++ b/cli/sdnq-attention-benchmark.py @@ -594,8 +594,8 @@ def free_vram_gb(): def fp8_compile_gate_flag(): - # present and False on sdnq builds that gate fp8 storage weights to eager dequant on - # gpus where triton cannot compile e4m3; absent on builds without the gate + # False on gpus where sdnq upcasts e4m3 storage to the scale dtype before the compiled + # dequant, because triton cannot convert e4m3 there; absent on builds without the gate try: from modules.sdnq import kernel_wrappers as sdnq_kernel_wrappers return getattr(sdnq_kernel_wrappers, "is_fp8_compile_supported", None) @@ -654,9 +654,9 @@ def print_environment(fp8_result, prep_status, prep_detail, weight_dequant_resul if e4m3_ok: lines.append("compiled weight dequant, float8_e4m3fn storage: [green]supported[/green]") else: - lines.append(f"compiled weight dequant, float8_e4m3fn storage: [red]fails on this gpu[/red] [dim]({escape(e4m3_detail)})[/dim]") + lines.append(f"compiled weight dequant, raw float8_e4m3fn storage: [red]fails on this gpu[/red] [dim]({escape(e4m3_detail)})[/dim]") if gate_flag is False: - lines.append(" this sdnq build gates fp8 storage weights to eager dequant, generation is safe (SDNQ_ALLOW_FP8_COMPILE overrides)") + lines.append(f" sdnq upcasts e4m3 weights to {dtype_label()} before the compiled dequant, so generation is safe and the fp8 rows below are measured that way (SDNQ_ALLOW_FP8_COMPILE overrides)") elif gate_flag is None: lines.append(" [red]this sdnq build has no fp8 compile gate: loading fp8 storage weights with Dequantize using torch.compile enabled fails at generation[/red]") e5m2_verdict = "[green]supported[/green]" if e5m2_ok else f"[red]fails[/red] [dim]({escape(e5m2_detail)})[/dim]" @@ -896,10 +896,15 @@ def quant_cell(quant_seconds): return f"{quant_seconds * 1000.0:5.0f}ms" if quant_seconds is not None else "-" -def dequant_args(layer): +def dequant_args(layer, upcast_fp8=True): # mirror SDNQDequantizer.__call__'s marshaling so the direct compiled call below measures - # the same graph the instance would compile + # the same graph the instance would compile, including the e4m3 upcast sdnq applies before + # the compiled dequant on gpus where triton cannot convert it (pre sm_89). + # upcast_fp8=False keeps the hardware probe honest: it must compile the raw e4m3 weight deq = layer.sdnq_dequantizer + weight = layer.weight + if upcast_fp8 and weight.dtype == torch.float8_e4m3fn and fp8_compile_gate_flag() is False: + weight = weight.to(dtype=layer.scale.dtype) kwargs = dict( zero_point=getattr(layer, "zero_point", None), svd_up=getattr(layer, "svd_up", None), @@ -909,7 +914,7 @@ def dequant_args(layer): quantized_weight_shape=deq.quantized_weight_shape, re_quantize_for_matmul=deq.re_quantize_for_matmul or deq.is_packed, ) - return (deq.weights_dtype, layer.weight, layer.scale), kwargs + return (deq.weights_dtype, weight, layer.scale), kwargs def get_compiled_dequantize_weight(): @@ -928,27 +933,17 @@ def get_compiled_dequantize_weight(): return compiled_dequantize_weight -def dequant_gated_to_eager(weights_dtype): - # sdnq builds with the fp8 compile gate route e4m3 storage to eager dequant on gpus - # where triton cannot compile it; report instead of measuring a silently-eager row - try: - from modules.sdnq import dequantizer as dequantizer_module - gate = getattr(dequantizer_module, "skip_fp8_compile", None) - return bool(gate(weights_dtype)) if gate is not None else False - except Exception: - return False - - def probe_weight_dequant_compile(): # compiled weight dequantization per fp8 storage dtype: triton before sm_89 lacks e4m3 - # conversions, so compiled dequant of float8_e4m3fn storage crashes on ampere while e5m2 - # is expected to compile; the verdicts show whether this build needs the fp8 compile gate + # conversions, so compiled dequant of raw float8_e4m3fn storage crashes on ampere while + # e5m2 is expected to compile; the verdicts show whether sdnq's e4m3 upcast is load-bearing + # on this gpu, so probe the raw weight rather than the upcast one the bench rows use result = {} for name in ("float8_e4m3fn", "float8_e5m2"): with console.status(f"probing compiled weight dequant: {name} storage (a compile failure here is expected for e4m3 on pre-ada nvidia)"): try: layer, _quant_seconds = make_quantized_linear(make_source_weight(256, 256), name) - args, kwargs = dequant_args(layer) + args, kwargs = dequant_args(layer, upcast_fp8=False) out = get_compiled_dequantize_weight()(*args, **kwargs) torch_device_module.synchronize() result[name] = (bool(torch.isfinite(out).all().item()), "compiles and runs") @@ -1308,29 +1303,25 @@ def bench_dequant_shape(shape_label, out_features, in_features, iters, warmup, p del layer continue - if dequant_gated_to_eager(cfg["weights_dtype"]): - compiled_cell = "[yellow]gated to eager[/yellow]" - entry["compiled_gated"] = True - else: - try: - args, kwargs = dequant_args(layer) - def compiled_fn(current_args=args, current_kwargs=kwargs): - return get_compiled_dequantize_weight()(*current_args, **current_kwargs) - phase("compiling dequant") - with time_limit(config_timeout, label): - compiled_out = compiled_fn() - torch_device_module.synchronize() - entry["compiled_ms"] = bench(compiled_fn, warmup, iters, on_phase=phase) - compiled_cell = f"{entry['compiled_ms']:8.3f} ms" - drift = rel_err(compiled_out, eager_out) - if drift > 1e-3: - notes.append(f"[yellow]{label}: compiled dequant differs from eager by {drift:.2e} relative[/yellow]") - entry["compiled_drift"] = drift - del compiled_out - except Exception as e: - entry["compiled_error"] = error_summary(e, 200) - compiled_cell = failure_text(e) - reset_compiled_dequant() + try: + args, kwargs = dequant_args(layer) + def compiled_fn(current_args=args, current_kwargs=kwargs): + return get_compiled_dequantize_weight()(*current_args, **current_kwargs) + phase("compiling dequant") + with time_limit(config_timeout, label): + compiled_out = compiled_fn() + torch_device_module.synchronize() + entry["compiled_ms"] = bench(compiled_fn, warmup, iters, on_phase=phase) + compiled_cell = f"{entry['compiled_ms']:8.3f} ms" + drift = rel_err(compiled_out, eager_out) + if drift > 1e-3: + notes.append(f"[yellow]{label}: compiled vs eager dequant drift {drift:.2e}[/yellow]") + entry["compiled_drift"] = drift + del compiled_out + except Exception as e: + entry["compiled_error"] = error_summary(e, 200) + compiled_cell = failure_text(e) + reset_compiled_dequant() del eager_out def fwd_fn(current=layer): @@ -2752,9 +2743,9 @@ def build_dequant_recommendations(dequant_results, weight_dequant_result, varian e5m2_ok = weight_dequant_result["float8_e5m2"][0] e4m3_ok = weight_dequant_result["float8_e4m3fn"][0] if not e4m3_ok and e5m2_ok: - notes.append("float8_e5m2 storage compiles on this gpu while float8_e4m3fn does not; a compile gate only needs to cover e4m3") + notes.append("compiled dequant: e5m2 compiles raw, e4m3 does not; sdnq's upcast covers e4m3") elif not e4m3_ok and not e5m2_ok: - notes.append("[yellow]neither fp8 storage dtype compiles on this gpu; both need the compile gate[/yellow]") + notes.append("[yellow]compiled dequant: neither fp8 dtype compiles raw; sdnq upcasts e4m3, e5m2 has no such path[/yellow]") fp8_mm_failed = [dtype_id for dtype_id, _label, _cfg in dequant_dtype_configs if entry(dtype_id).get("mm_error") and entry(dtype_id).get("mm_dtype") == "float8_e4m3fn"] if fp8_mm_failed: notes.append(f"[yellow]quantized matmul auto-selected float8_e4m3fn for {', '.join(fp8_mm_failed)} and failed on this gpu; set MatMul type explicitly to use quantized matmul with float weight dtypes[/yellow]") From ce373df6e5ac9913d1b7e6b6cfadf7fa5f22bf4d Mon Sep 17 00:00:00 2001 From: CalamitousFelicitousness Date: Tue, 14 Jul 2026 17:39:39 +0100 Subject: [PATCH 07/64] style(sdnq): tighten the benchmark notes Notes ran to paragraph length and wrapped in the terminal, burying the numbers. - lead with the topic, keep the numbers and the fix, drop the restatement - one line per note at 140 columns, except the sd15 compile warning --- cli/sdnq-attention-benchmark.py | 56 ++++++++++++++++----------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/cli/sdnq-attention-benchmark.py b/cli/sdnq-attention-benchmark.py index 834c539db..673db8fdd 100755 --- a/cli/sdnq-attention-benchmark.py +++ b/cli/sdnq-attention-benchmark.py @@ -1385,7 +1385,7 @@ def bench_dequant_shape(shape_label, out_features, in_features, iters, warmup, p mm_cell = failure_text(e) if entry["fwd_err"] and entry["weight_err"] and abs(entry["fwd_err"] - entry["weight_err"]) > 0.2 * entry["weight_err"]: - notes.append(f"[yellow]{label}: forward output error {entry['fwd_err']:.5f} diverges from weight error {entry['weight_err']:.5f}[/yellow]") + notes.append(f"[yellow]{label}: fwd err {entry['fwd_err']:.5f} diverges from weight err {entry['weight_err']:.5f}[/yellow]") table.add_row(label, quant_cell(entry["quant_s"]), size_cell(entry["size_bytes"]), eager_cell, compiled_cell, err_cell(entry["weight_err"]), fwd_eager_cell, fwd_compiled_cell, mm_cell, err_cell(entry["mm_err"]), speedup) live.update(panel) console.line() # separate sections; Live's final frame also lacks a trailing newline when output is piped @@ -2328,15 +2328,15 @@ def bench_block_section(iters, warmup, config_timeout=300, selected=None): notes.append("speed/error frontier: " + ", ".join(f"{label} {ms:.2f}ms err {err:.4f}" for label, ms, err in frontier)) growth = [entry["err4"] / entry["err"] for entry in results.values() if entry.get("err") and entry.get("err4") and math.isfinite(entry["err4"] / entry["err"])] if growth: - notes.append(f"output error grows x{sum(growth) / len(growth):.2f} on average over four stacked blocks; residual connections dampen compounding") + notes.append(f"four stacked blocks: error grows x{sum(growth) / len(growth):.2f} avg, residuals dampen compounding") weights_mode = str(getattr(shared.opts, "sdnq_quantize_weights_mode", "")) current_id = None if weights_mode == "int8" and getattr(shared.opts, "sdnq_use_quantized_matmul", False): current_id = "int8-mm-atten" if "SDNQ attention" in shared.opts.sdp_overrides else "int8-mm" if current_id and results.get(current_id, {}).get("ms"): - notes.append(f"the {results[current_id]['label']} row is what the current config runs for int8-quantized models") + notes.append(f"current config runs the {results[current_id]['label']} row for int8-quantized models") if any(entry.get("ms") for config_id, entry in results.items() if config_id.endswith("sagefp16")): - notes.append("sage fp16 accum is a benchmark-only baseline: no sdnext setting reaches it (sage is pinned to fp32 accumulation on sm86 and sage's own dispatch never selects fp16 accum elsewhere)") + notes.append("sage fp16 accum: benchmark-only, no sdnext setting reaches it (sage pins fp32 accum on sm86)") if notes: emit(Panel("\n".join(notes), title="block notes", box=ROUNDED_BOX)) report["block"] = dict(geometry=dict(block_geometry), results=results) @@ -2474,36 +2474,36 @@ def build_recommendations(all_results, fp8_result, prep_status): if base_ms and best_id is not None: best_ms = results[best_id]["ms"] if best_ms < base_ms * 0.95: - notes.append(f"sdnq attention is worth enabling on this gpu: {labels[best_id]} measured x{base_ms / best_ms:.2f} vs torch sdpa at {reference}") + notes.append(f"worth enabling: {labels[best_id]} measured x{base_ms / best_ms:.2f} vs torch sdpa at {reference}") else: - notes.append(f"[yellow]sdnq attention measured no speedup over torch sdpa on this gpu (best: {labels[best_id]} at x{base_ms / best_ms:.2f}); the sdp override costs performance here[/yellow]") + notes.append(f"[yellow]not worth enabling: best is {labels[best_id]} at x{base_ms / best_ms:.2f} vs torch sdpa, the sdp override costs performance here[/yellow]") # the individual setting rows above compose into one config; cite it as actually measured full_ms, full_err = measured(results, "full") if full_ms and base_ms and int8_ms: - stack_note = f"all options on together (smooth k + hadamard + int8 pv over int8 qk) measured x{base_ms / full_ms:.2f} vs torch sdpa" + stack_note = f"all options on (smooth k + hadamard + int8 pv over int8 qk): x{base_ms / full_ms:.2f} vs torch sdpa" if full_err is not None: stack_note += f", error {full_err:.5f}" if int8_err is not None: stack_note += f"; int8 qk alone x{base_ms / int8_ms:.2f}, error {int8_err:.5f}" notes.append(stack_note) if prep_status == "failing_dynamic": - notes.append("[red]the current environment fails at generation: torch compile cannot build the dynamic-shape input prep; numbers above were measured with the SDNQ_COMPILE_KWARGS='{\"dynamic\": false}' workaround applied, set it (verified working here) or install msvc build tools[/red]") + notes.append("[red]generation fails here: compile cannot build the dynamic-shape prep. fix: set SDNQ_COMPILE_KWARGS='{\"dynamic\": false}' (verified on this machine) or install msvc build tools; numbers above use that workaround[/red]") elif prep_status == "failing": - notes.append("[red]the current environment fails at generation: torch compile is broken; numbers above were measured with eager input prep, matching what you get after disabling Dequantize using torch.compile; alternatively install msvc build tools[/red]") + notes.append("[red]generation fails here: torch compile is broken. fix: disable Dequantize using torch.compile or install msvc build tools; numbers above use eager prep[/red]") if not fp8_result["qk"][0]: if fp8_failure_is_capability(fp8_result["qk"][1]): - notes.append("[red]float8_e4m3fn is unsupported on this gpu: selecting it in either dropdown fails generation with a compile error[/red]") + notes.append("[red]float8_e4m3fn unsupported on this gpu: selecting it in either dropdown fails generation[/red]") else: - notes.append("[red]float8_e4m3fn failed to compile in this environment: selecting it in either dropdown fails generation[/red]; the error is not the hardware-capability signature, so the fp8 rows above are missing for a torch or triton reason, not a gpu one") + notes.append("[red]float8_e4m3fn failed to compile here: selecting it in either dropdown fails generation[/red]; not the hardware signature, so a torch or triton issue rather than the gpu") sage_ms, _sage_err = measured(results, "sage") if sage_ms and int8_ms: - notes.append(f"sageattention comparison at {reference}: sdnq int8 {int8_ms:.2f} ms vs sage {sage_ms:.2f} ms; sdnq additionally covers masks, gqa and causal attention") + notes.append(f"vs sage at {reference}: sdnq int8 {int8_ms:.2f} ms, sage {sage_ms:.2f} ms; sdnq also covers masks, gqa, causal") sagefp16_ms, _sagefp16_err = measured(results, "sagefp16") if sagefp16_ms: - notes.append("sage fp16 accum is a benchmark-only baseline: no sdnext setting reaches it (sage is pinned to fp32 accumulation on sm86 and sage's own dispatch never selects fp16 accum elsewhere)") + notes.append("sage fp16 accum: benchmark-only, no sdnext setting reaches it (sage pins fp32 accum on sm86)") amdflash_ms, _amdflash_err = measured(results, "amdflash") if amdflash_ms and int8_ms: - notes.append(f"triton flash comparison at {reference}: sdnq int8 {int8_ms:.2f} ms vs triton flash {amdflash_ms:.2f} ms; sdnq additionally covers masks and its gain depends on this gpu's int8 throughput") + notes.append(f"vs triton flash at {reference}: sdnq int8 {int8_ms:.2f} ms, flash {amdflash_ms:.2f} ms; sdnq also covers masks, its gain tracks this gpu's int8 throughput") # cross-reference the combined block section when it ran in this invocation: kernel-scope # error buybacks can vanish at block output, and per-call costs differ inside a real block block_results = report.get("block", {}).get("results", {}) @@ -2522,12 +2522,12 @@ def build_recommendations(all_results, fp8_result, prep_status): if not buyback_seen: cross_note += "; the kernel-scope error buybacks above did not change block output error at this image shape" notes.append(cross_note) - notes.append("* marks the best config per shape: lowest error among rows within 5% of the fastest sdnq time") - notes.append("the int8 qk row is what default settings run: MatMul type auto resolves to int8 and pv stays unquantized") - notes.append("the prep column is time spent quantizing q/k/v before the attention kernel, included in median time; it shrinks where torch compile can fuse it") - notes.append("[yellow]non pow2 head dims (sd 1.5): quantized matmul configs currently fail torch compile and hadamard hangs it; disable quantized matmul for sd 1.5 sessions or set SDNQ_COMPILE_KWARGS='{\"dynamic\": false}'[/yellow]") - notes.append("the six settings above apply on the next generation; toggling the 'SDNQ attention' SDP override requires a restart") - notes.append("errors are measured on synthetic tensors with outlier-heavy keys; real models, especially qk-normed dits, sit lower") + notes.append("*: best config per shape, lowest error among rows within 5% of the fastest sdnq time") + notes.append("default settings run the int8 qk row: MatMul auto resolves to int8, pv stays unquantized") + notes.append("prep: q/k/v quantization before the kernel, included in the median; shrinks where compile fuses it") + notes.append("[yellow]non pow2 head dims (sd 1.5): quantized matmul fails compile, hadamard hangs it; disable quantized matmul there or set SDNQ_COMPILE_KWARGS='{\"dynamic\": false}'[/yellow]") + notes.append("settings above apply on the next generation; the SDNQ attention SDP override needs a restart") + notes.append("errors use synthetic outlier-heavy keys; real models, especially qk-normed dits, sit lower") emit(Panel("\n".join(notes), title="notes", box=ROUNDED_BOX)) report["recommendations_attention"] = dict(reference=reference, rows=[list(row) for row in rows], notes=notes) @@ -2736,9 +2736,9 @@ def build_dequant_recommendations(dequant_results, weight_dequant_result, varian notes.append(f"compiled dequant speedup vs eager at {reference}: {', '.join(speedups)}") fp8_entry, fp8sdnq_entry = entry("fp8"), entry("fp8sdnq") if fp8_entry.get("compiled_ms") and fp8sdnq_entry.get("compiled_ms"): - notes.append(f"fp8 storage: native float8_e4m3fn compiled measured {ratio_text(fp8sdnq_entry['compiled_ms'], fp8_entry['compiled_ms'])} vs the float8_e4m3fn_sdnq uint8 view") + notes.append(f"fp8 storage: native e4m3 compiled {ratio_text(fp8sdnq_entry['compiled_ms'], fp8_entry['compiled_ms'])} vs the float8_e4m3fn_sdnq uint8 view") elif fp8sdnq_entry.get("compiled_ms") and fp8_entry.get("eager_ms"): - notes.append(f"fp8 storage on this gpu: float8_e4m3fn_sdnq (uint8 view) compiled measured {ratio_text(fp8_entry['eager_ms'], fp8sdnq_entry['compiled_ms'])} vs eager float8_e4m3fn dequant, the fallback when e4m3 cannot compile") + notes.append(f"fp8 storage: float8_e4m3fn_sdnq (uint8 view) compiled {ratio_text(fp8_entry['eager_ms'], fp8sdnq_entry['compiled_ms'])} vs eager e4m3 dequant") if weight_dequant_result is not None: e5m2_ok = weight_dequant_result["float8_e5m2"][0] e4m3_ok = weight_dequant_result["float8_e4m3fn"][0] @@ -2748,7 +2748,7 @@ def build_dequant_recommendations(dequant_results, weight_dequant_result, varian notes.append("[yellow]compiled dequant: neither fp8 dtype compiles raw; sdnq upcasts e4m3, e5m2 has no such path[/yellow]") fp8_mm_failed = [dtype_id for dtype_id, _label, _cfg in dequant_dtype_configs if entry(dtype_id).get("mm_error") and entry(dtype_id).get("mm_dtype") == "float8_e4m3fn"] if fp8_mm_failed: - notes.append(f"[yellow]quantized matmul auto-selected float8_e4m3fn for {', '.join(fp8_mm_failed)} and failed on this gpu; set MatMul type explicitly to use quantized matmul with float weight dtypes[/yellow]") + notes.append(f"[yellow]quantized matmul auto-selected float8_e4m3fn for {', '.join(fp8_mm_failed)} and failed; set MatMul type explicitly for float weight dtypes[/yellow]") for dtype_id in fp8_mm_failed: alt_parts = [] for alt_dtype in float_mm_alternative_dtypes: @@ -2765,7 +2765,7 @@ def build_dequant_recommendations(dequant_results, weight_dequant_result, varian base_part += f" err {dequant_err:.5f}" notes.append(f"{dtype_id} with MatMul type set explicitly: {', '.join(alt_parts)}; {base_part}") if base_ms and entry(mm_id).get("fwd_ms"): - notes.append(f"current quantization type {weights_mode}: the dequant-path forward costs {ratio_text(entry(mm_id)['fwd_ms'], base_ms)} vs a {dtype_label()} nn.Linear at {reference}") + notes.append(f"current quantization type {weights_mode}: dequant-path forward {ratio_text(entry(mm_id)['fwd_ms'], base_ms)} vs a {dtype_label()} nn.Linear at {reference}") # size/error frontier: the dtypes no other measured dtype beats on both axes at once sized = [(dtype_id, e["size_bytes"], e["weight_err"]) for dtype_id, _label, _cfg in dequant_dtype_configs for e in [entry(dtype_id)] if e.get("size_bytes") and e.get("weight_err")] frontier = sorted((c for c in sized if not any(o is not c and o[1] <= c[1] and o[2] <= c[2] for o in sized)), key=lambda c: c[1]) @@ -2815,7 +2815,7 @@ def build_dequant_recommendations(dequant_results, weight_dequant_result, varian te_results = dequant_results.get(te_shape) or {} if te_shape else {} te_int8 = te_results.get("int8") or {} if te_int8.get("fwd_ms") and te_int8.get("mm_ms") and entry("int8").get("fwd_ms") and entry("int8").get("mm_ms"): - notes.append(f"text-encoder geometry ({te_shape}): int8 quantized mm {ratio_text(te_int8['fwd_ms'], te_int8['mm_ms'])} vs the dequant path, {ratio_text(entry('int8')['fwd_ms'], entry('int8')['mm_ms'])} at {reference}; the TE override dropdowns follow these numbers") + notes.append(f"text-encoder geometry ({te_shape}): int8 quantized mm {ratio_text(te_int8['fwd_ms'], te_int8['mm_ms'])} vs the dequant path, {ratio_text(entry('int8')['fwd_ms'], entry('int8')['mm_ms'])} at {reference}; the TE override dropdowns follow these") svd_sweep = sweeps.get("svd") or {} if svd_sweep and sweeps_at_reference: for dtype_id in svd_rank_sweep_dtypes: @@ -2841,9 +2841,9 @@ def build_dequant_recommendations(dequant_results, weight_dequant_result, varian cpu_quant_s = (sweeps.get("toggles") or {}).get("cpu_quant_s") gpu_quant_s = (sweeps.get("toggles") or {}).get("gpu_quant_s") if cpu_quant_s and gpu_quant_s: - notes.append(f"Quantize using GPU: one int8 layer at {dequant_shapes[0][0]} quantized in {quant_cell(gpu_quant_s).strip()} on gpu vs {quant_cell(cpu_quant_s).strip()} on cpu; scales linearly with layer count at load") - notes.append("weight err is the relative quantization error of the dequantized weight vs the fp32 original; forward outputs inherit it") - notes.append("errors are measured on synthetic weights with exaggerated outlier channels; rotation and svd gains are outlier-driven, so real models sit closer to plain quantization") + notes.append(f"Quantize using GPU: one int8 layer at {dequant_shapes[0][0]} takes {quant_cell(gpu_quant_s).strip()} on gpu vs {quant_cell(cpu_quant_s).strip()} on cpu; scales with layer count at load") + notes.append("weight err: relative error of the dequantized weight vs fp32; forward outputs inherit it") + notes.append("errors use synthetic outlier-heavy weights; rotation and svd gains are outlier-driven, real models gain less") if notes: emit(Panel("\n".join(notes), title="dequant notes", box=ROUNDED_BOX)) report["recommendations_dequant"] = dict(reference=reference, rows=[list(row) for row in rows], notes=notes) From b1c3578b27d51f364eb3097e5cc499262f9288e3 Mon Sep 17 00:00:00 2001 From: CalamitousFelicitousness Date: Tue, 14 Jul 2026 17:40:01 +0100 Subject: [PATCH 08/64] feat(sdnq): name the sage kernel the benchmark actually ran "sage" is a different kernel per gpu: sageattention dispatches the pv dtype and accumulator by arch and cuda version, and modules/attention.py forces the fp16-pv cuda kernel on sm86, so one label across shared reports compares unlike kernels. - resolve the row label from the dispatch: sm89 with cuda 12.8+ reads "sage int8 qk + fp8 pv, fp32+fp16 accum", sm86 reads "fp16 pv, fp32 accum" - name the sm86-only fp16-accum baseline for what it is --- cli/sdnq-attention-benchmark.py | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/cli/sdnq-attention-benchmark.py b/cli/sdnq-attention-benchmark.py index 673db8fdd..80faa457a 100755 --- a/cli/sdnq-attention-benchmark.py +++ b/cli/sdnq-attention-benchmark.py @@ -154,8 +154,8 @@ block_configs = [ # fp8 configs run only on gpus where the float8 probe passes bench_configs = [ ("base", "torch sdpa", None), - ("sage", "sageattention", None), - ("sagefp16", "sage fp16 accum", None), + ("sage", "sageattention", None), # label resolved to the dispatched kernel by sage_kernel_label + ("sagefp16", "sage int8 qk + fp16 pv, fp16 accum", None), # sm86 only ("amdflash", "triton flash (amd)", None), ("noquant", "sdnq, quantized matmul off", dict(do_quantize=False)), ("int8", "sdnq int8 qk", dict(matmul_dtype="auto", pv_matmul_dtype="auto")), @@ -393,6 +393,31 @@ def sage_attention(): return None +def sage_kernel_label(): + # "sage" is a different kernel per gpu: sageattention's dispatch (core.py sageattn) picks the + # pv dtype and accumulator by arch and cuda version, and modules/attention.py forces the cuda + # fp16-pv kernel on sm86. name what ran so reports from different gpus stay comparable + try: + capability = torch_device_module.get_device_capability(torch.device(torch_device)) + cuda_version = tuple(int(part) for part in (torch.version.cuda or "0.0").split(".")[:2]) + except Exception: + return "sageattention" + fp8_accum = "fp32+fp16" if cuda_version >= (12, 8) else "fp32+fp32" # sageattention2++ needs cuda 12.8 + if capability == (7, 5): + return "sage int8 qk + fp16 pv, triton" + if capability in {(8, 0), (8, 6), (8, 7)}: + return "sage int8 qk + fp16 pv, fp32 accum" + if capability == (9, 0): + return "sage int8 qk + fp8 pv, fp32+fp32 accum" + if capability in {(8, 9), (10, 0), (12, 0), (12, 1)}: + return f"sage int8 qk + fp8 pv, {fp8_accum} accum" + return "sageattention" + + +def config_label(config_id, label): + return sage_kernel_label() if config_id == "sage" else label + + def amd_triton_flash(): # sdnext's vendored flash attention for rocm/zluda (modules/flash_attn_triton_amd): the # relevant baseline on amd, where stock sdpa has no flash kernel and sage is unavailable @@ -1122,7 +1147,7 @@ def bench_shape(preset, iters, warmup, position=None, config_timeout=300, fp8_re continue if config_id == "fp8full" and not (fp8_result and fp8_result["qk"][0] and fp8_result["pv"][0]): continue - selected_configs.append((config_id, label, kwargs)) + selected_configs.append((config_id, config_label(config_id, label), kwargs)) def make_table(): shape_table = Table(box=box.SIMPLE_HEAVY) @@ -2469,7 +2494,7 @@ def build_recommendations(all_results, fp8_result, prep_status): emit("[dim]matmul type, pv matmul type, smooth k and hadamard only take effect when quantized matmul is enabled; their rows show what to pick if you enable it[/dim]") notes = [] - labels = {config_id: label for config_id, label, _kwargs in bench_configs} + labels = {config_id: config_label(config_id, label) for config_id, label, _kwargs in bench_configs} best_id = best_config(results) if base_ms and best_id is not None: best_ms = results[best_id]["ms"] From 47cb113b75201f33c9247cd936d5f0ec278c0b04 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Tue, 14 Jul 2026 20:55:47 +0300 Subject: [PATCH 09/64] cleanup sdnq --- modules/sdnq/kernel_wrappers.py | 14 ++++++++++---- modules/sdnq/kernels/triton_atten.py | 12 ++++++------ modules/sdnq/kernels/triton_scaled_mm.py | 11 +++-------- modules/sdnq/layers/linear/linear_int8.py | 2 +- modules/sdnq/layers/linear/linear_uint8.py | 2 +- 5 files changed, 21 insertions(+), 20 deletions(-) diff --git a/modules/sdnq/kernel_wrappers.py b/modules/sdnq/kernel_wrappers.py index f123632cb..9388fd0ae 100644 --- a/modules/sdnq/kernel_wrappers.py +++ b/modules/sdnq/kernel_wrappers.py @@ -82,6 +82,7 @@ int_scaled_mm_func = None fp_scaled_mm_func = None fp8_scaled_mm_func = None + if use_openvino_mm: try: from .kernels.openvino_mm import openvino_int_mm, openvino_fp_mm @@ -104,6 +105,7 @@ elif use_triton_mm: except Exception: use_triton_mm = False + if fp_mm_func is None and not is_alchemist_or_igpu and os.environ.get("SDNQ_USE_TRITON_MM", "1").lower() not in {"0", "false", "no"}: try: from .kernels.triton_mm import sdnq_triton_mm @@ -119,12 +121,14 @@ if int_mm_func is None: return torch._int_mm(a,b).to(dtype=out_dtype) int_mm_func = int_mm_torch + if fp_mm_func is None: if devices.backend == "cuda": fp_mm_func = fp_mm_torch_cuda else: fp_mm_func = fp_mm_torch + if fp8_mm_func is None: if is_fp8_mm_supported: def fp8_mm_torch(a: torch.Tensor, b: torch.Tensor, out_dtype: torch.dtype = torch.float32) -> torch.FloatTensor: @@ -138,19 +142,21 @@ if fp8_mm_func is None: if int_scaled_mm_func is None: def int_scaled_mm_torch(a: torch.Tensor, b: torch.Tensor, scale_a: torch.Tensor, scale_b: torch.Tensor, bias: torch.FloatTensor | None = None, out_dtype: torch.dtype = torch.float32) -> torch.FloatTensor: if bias is None: - return int_mm_func(a,b).to(dtype=scale_a.dtype).mul_(scale_a).mul_(scale_b).to(dtype=out_dtype) + return int_mm_func(a,b, out_dtype=scale_a.dtype).mul_(scale_a).mul_(scale_b).to(dtype=out_dtype) else: - return torch.addcmul(bias, int_mm_func(a,b).to(dtype=scale_a.dtype).mul_(scale_a), scale_b).to(dtype=out_dtype) + return torch.addcmul(bias, int_mm_func(a,b, out_dtype=scale_a.dtype).mul_(scale_a), scale_b).to(dtype=out_dtype) int_scaled_mm_func = int_scaled_mm_torch + if fp_scaled_mm_func is None: def fp_scaled_mm_torch(a: torch.Tensor, b: torch.Tensor, scale_a: torch.Tensor, scale_b: torch.Tensor, bias: torch.FloatTensor | None = None, out_dtype: torch.dtype = torch.float32) -> torch.FloatTensor: if bias is None: - return fp_mm_func(a,b).to(dtype=scale_a.dtype).mul_(scale_a).mul_(scale_b).to(dtype=out_dtype) + return fp_mm_func(a,b, out_dtype=scale_a.dtype).mul_(scale_a).mul_(scale_b).to(dtype=out_dtype) else: - return torch.addcmul(bias, fp_mm_func(a,b).to(dtype=scale_a.dtype).mul_(scale_a), scale_b).to(dtype=out_dtype) + return torch.addcmul(bias, fp_mm_func(a,b, out_dtype=scale_a.dtype).mul_(scale_a), scale_b).to(dtype=out_dtype) fp_scaled_mm_func = fp_scaled_mm_torch + if fp8_scaled_mm_func is None: if use_tensorwise_fp8_matmul or not is_fp8_mm_supported: def fp8_scaled_mm_torch(a: torch.Tensor, b: torch.Tensor, scale_a: torch.Tensor, scale_b: torch.Tensor, bias: torch.FloatTensor | None = None, out_dtype: torch.dtype = torch.float32) -> torch.FloatTensor: diff --git a/modules/sdnq/kernels/triton_atten.py b/modules/sdnq/kernels/triton_atten.py index 5fd7d9fd6..761fb7ce6 100644 --- a/modules/sdnq/kernels/triton_atten.py +++ b/modules/sdnq/kernels/triton_atten.py @@ -139,9 +139,9 @@ def sdnq_attn_kernel( if qk_is_quantized: k_scale = k_scale_desc.load([start_n])[None, :] if q.dtype == tl.int8: - qk = tl.dot(q, k, out_dtype=tl.int32).to(tl.float32) * q_scale * k_scale + qk = tl.mul(tl.mul(tl.dot(q, k, out_dtype=tl.int32).to(tl.float32), q_scale), k_scale) else: - qk = tl.dot(q, k, out_dtype=tl.float32) * q_scale * k_scale + qk = tl.mul(tl.mul(tl.dot(q, k, out_dtype=tl.float32), q_scale), k_scale) else: qk = tl.dot(q, k, out_dtype=tl.float32) @@ -171,14 +171,14 @@ def sdnq_attn_kernel( v_scale = v_scale_desc.load([start_n])[None, :] p *= v_scale if v.dtype == tl.int8: - p_scale = tl.max(p, 1)[:, None] * (1 / 127.0) + p_scale = tl.mul(tl.max(p, 1)[:, None], (1 / 127.0)) p_scale = tl.where(p_scale <= 2e-38, 1.0, p_scale) - p = tl.floor(p * (1 / p_scale) + 0.5).to(tl.int8) + p = tl.floor(tl.fma(p, (1 / p_scale), 0.5)).to(tl.int8) acc = tl.fma(tl.dot(p, v, out_dtype=tl.int32).to(tl.float32), p_scale, acc) else: - p_scale = tl.max(p, 1)[:, None] * (1 / (65504.0 if v.dtype == tl.float16 else 448.0)) + p_scale = tl.mul(tl.max(p, 1)[:, None], (1 / (65504.0 if v.dtype == tl.float16 else 448.0))) p_scale = tl.where(p_scale <= 2e-38, 1.0, p_scale) - p = (p * (1 / p_scale)).to(v.dtype) + p = tl.mul(p, (1 / p_scale)).to(v.dtype) acc = tl.fma(tl.dot(p, v, out_dtype=tl.float32), p_scale, acc) else: p = p.to(v.dtype) diff --git a/modules/sdnq/kernels/triton_scaled_mm.py b/modules/sdnq/kernels/triton_scaled_mm.py index 18779e74d..d222b2fba 100644 --- a/modules/sdnq/kernels/triton_scaled_mm.py +++ b/modules/sdnq/kernels/triton_scaled_mm.py @@ -1,8 +1,3 @@ -""" -W4A8 fallback with Triton. -This is intended as a template for future INT4 MM kernels as Triton has no support for INT4 hardware yet. -""" - import os import math import torch @@ -96,17 +91,17 @@ def sdnq_scaled_mm_kernel( scale_b = scale_b_desc.load([off_n])[None, :].to(tl.float32) if bias_ndim == 1: - accumulator = accumulator.to(tl.float32) * scale_a + accumulator = tl.mul(accumulator.to(tl.float32), scale_a) bias_desc = tl.make_tensor_descriptor(base=bias_ptr, shape=(N,), strides=(1,), block_shape=(BLOCK_SIZE_N,)) bias = bias_desc.load([off_n])[None, :].to(tl.float32) accumulator = tl.fma(accumulator, scale_b, bias) elif bias_ndim == 2: - accumulator = accumulator.to(tl.float32) * scale_a + accumulator = tl.mul(accumulator.to(tl.float32), scale_a) bias_desc = tl.make_tensor_descriptor(base=bias_ptr, shape=(M, N), strides=(N, 1), block_shape=(BLOCK_SIZE_M, BLOCK_SIZE_N)) bias = bias_desc.load([off_m, off_n]).to(tl.float32) accumulator = tl.fma(accumulator, scale_b, bias) else: - accumulator = accumulator.to(tl.float32) * scale_a * scale_b + accumulator = tl.mul(tl.mul(accumulator.to(tl.float32), scale_a), scale_b) accumulator = accumulator.to(c_ptr.type.element_ty) c_desc = tl.make_tensor_descriptor(base=c_ptr, shape=(M, N), strides=(N, 1), block_shape=(BLOCK_SIZE_M, BLOCK_SIZE_N)) diff --git a/modules/sdnq/layers/linear/linear_int8.py b/modules/sdnq/layers/linear/linear_int8.py index 9f39d624b..f6c3ee803 100644 --- a/modules/sdnq/layers/linear/linear_int8.py +++ b/modules/sdnq/layers/linear/linear_int8.py @@ -60,7 +60,7 @@ def int8_matmul( input, input_scale = quantize_int_mm_input(input, dtype=scale.dtype) if zero_point is not None: - zero_bias = torch.sum(input, dim=-1, keepdim=True, dtype=torch.int32).to(input_scale.dtype).mul_(input_scale).mul(zero_point) + zero_bias = torch.sum(input, dim=-1, keepdim=True, dtype=torch.int32).to(dtype=input_scale.dtype).mul_(input_scale).mul(zero_point) if bias is not None: zero_bias.add_(bias) bias = zero_bias diff --git a/modules/sdnq/layers/linear/linear_uint8.py b/modules/sdnq/layers/linear/linear_uint8.py index 7812a8759..74ebdc58b 100644 --- a/modules/sdnq/layers/linear/linear_uint8.py +++ b/modules/sdnq/layers/linear/linear_uint8.py @@ -63,7 +63,7 @@ def uint8_matmul( if zero_point is not None: zero_bias = torch.sum(input, dim=-1, keepdim=True, dtype=torch.int32).to(dtype=input_scale.dtype).mul_(input_scale).mul(zero_point) zero_bias.add_(torch.sum(weight, dim=0, keepdim=True, dtype=torch.int32).to(dtype=scale.dtype).mul_(scale).mul(input_zero_point)) - zero_bias.add_(torch.mul(input_zero_point.mul_(input.shape[-1]), zero_point)) + zero_bias.add_(torch.mul(input_zero_point, zero_point), alpha=input.shape[-1]) else: zero_bias = torch.sum(weight, dim=0, keepdim=True, dtype=torch.int32).to(dtype=scale.dtype).mul_(scale).mul(input_zero_point) if bias is not None: From 39d74cca183d3524412b91fe010acae7e859039d Mon Sep 17 00:00:00 2001 From: Disty0 Date: Tue, 14 Jul 2026 22:21:53 +0300 Subject: [PATCH 10/64] Enable Triton MM on all GPUs --- modules/sdnq/kernel_wrappers.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/modules/sdnq/kernel_wrappers.py b/modules/sdnq/kernel_wrappers.py index 9388fd0ae..d7d0d40fd 100644 --- a/modules/sdnq/kernel_wrappers.py +++ b/modules/sdnq/kernel_wrappers.py @@ -4,7 +4,7 @@ import os import sys import torch -from modules import devices +from modules import devices, shared if os.environ.get("SDNQ_ALLOW_FP8_MM", None) is None: @@ -43,7 +43,7 @@ else: use_openvino_mm = bool(os.environ.get("SDNQ_USE_OPENVINO_MM", "0").lower() not in {"0", "false", "no"}) if os.environ.get("SDNQ_USE_TRITON_MM", None) is None: - use_triton_mm = bool(not is_alchemist_or_igpu and (is_rdna2_and_older or devices.backend in {"zluda", "ipex", "xpu"})) + use_triton_mm = bool(not is_alchemist_or_igpu and (devices.backend in {"cuda", "rocm", "ipex", "xpu", "zluda"})) else: use_triton_mm = bool(os.environ.get("SDNQ_USE_TRITON_MM", "0").lower() not in {"0", "false", "no"}) @@ -102,11 +102,16 @@ elif use_triton_mm: fp8_mm_func = sdnq_triton_mm fp8_scaled_mm_func = sdnq_scaled_mm use_tensorwise_fp8_matmul = True - except Exception: + except Exception as e: use_triton_mm = False + shared.log.warning(f"SDNQ: Triton kernels are not available! Falling back to PyTorch Eager kernels. Error message: {e}") -if fp_mm_func is None and not is_alchemist_or_igpu and os.environ.get("SDNQ_USE_TRITON_MM", "1").lower() not in {"0", "false", "no"}: +if ( + fp_mm_func is None and not is_alchemist_or_igpu + and devices.backend in {"cuda", "rocm", "ipex", "xpu", "zluda"} + and os.environ.get("SDNQ_USE_TRITON_MM", "1").lower() not in {"0", "false", "no"} +): try: from .kernels.triton_mm import sdnq_triton_mm from .kernels.triton_scaled_mm import sdnq_scaled_mm From d03d0d7dd18a4d4dde1d9b5dfc0b40891ee0ca64 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Tue, 14 Jul 2026 23:48:55 +0300 Subject: [PATCH 11/64] reduce num_stages options in triton atten --- modules/sdnq/kernels/triton_atten.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/sdnq/kernels/triton_atten.py b/modules/sdnq/kernels/triton_atten.py index 761fb7ce6..13ca1ca0a 100644 --- a/modules/sdnq/kernels/triton_atten.py +++ b/modules/sdnq/kernels/triton_atten.py @@ -15,7 +15,7 @@ matmul_configs = [ for BM in [int(BM) for BM in os.environ.get("SDNQ_TRITON_ATTEN_BLOCK_SIZE_M_LIST", "64,128").replace(" ","").split(",")] for BN in [int(BN) for BN in os.environ.get("SDNQ_TRITON_ATTEN_BLOCK_SIZE_N_LIST", "32,64").replace(" ","").split(",")] for w in [int(w) for w in os.environ.get("SDNQ_TRITON_ATTEN_NUM_WARPS_LIST", "4,8").replace(" ","").split(",")] - for s in [int(s) for s in os.environ.get("SDNQ_TRITON_ATTEN_NUM_STAGES_LIST", "1,2,4").replace(" ","").split(",")] + for s in [int(s) for s in os.environ.get("SDNQ_TRITON_ATTEN_NUM_STAGES_LIST", "1,2" if (torch.cuda.is_available() and torch.version.hip) else "2,4").replace(" ","").split(",")] ] From 3a0094ef6218335e0bcdddc208c5f5a3d2d9b12a Mon Sep 17 00:00:00 2001 From: Disty0 Date: Wed, 15 Jul 2026 00:24:13 +0300 Subject: [PATCH 12/64] remove tl.constexpr use --- modules/sdnq/kernels/triton_atten.py | 2 +- modules/sdnq/kernels/triton_mm.py | 8 ++++---- modules/sdnq/kernels/triton_scaled_mm.py | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/sdnq/kernels/triton_atten.py b/modules/sdnq/kernels/triton_atten.py index 13ca1ca0a..eddaaba8f 100644 --- a/modules/sdnq/kernels/triton_atten.py +++ b/modules/sdnq/kernels/triton_atten.py @@ -91,7 +91,7 @@ def sdnq_attn_kernel( tl.assume(qk_is_quantized == 0 or qk_is_quantized == 1) # pylint: disable=consider-using-in tl.assume(pv_is_quantized == 0 or pv_is_quantized == 1) # pylint: disable=consider-using-in - do_k_mask: tl.constexpr = KN % BLOCK_SIZE_N != 0 + do_k_mask = KN % BLOCK_SIZE_N != 0 start_m_block = start_m * BLOCK_SIZE_M offs_m = start_m_block + tl.arange(0, BLOCK_SIZE_M) offs_n = tl.arange(0, BLOCK_SIZE_N) diff --git a/modules/sdnq/kernels/triton_mm.py b/modules/sdnq/kernels/triton_mm.py index ac35a410c..7dafac1f9 100644 --- a/modules/sdnq/kernels/triton_mm.py +++ b/modules/sdnq/kernels/triton_mm.py @@ -38,9 +38,9 @@ def sdnq_triton_mm_kernel( GROUP_SIZE_M: tl.constexpr, ) -> None: pid = tl.program_id(axis=0) - num_pid_m: tl.constexpr = tl.cdiv(M, BLOCK_SIZE_M) - num_pid_n: tl.constexpr = tl.cdiv(N, BLOCK_SIZE_N) - num_pid_in_group: tl.constexpr = GROUP_SIZE_M * num_pid_n + num_pid_m = tl.cdiv(M, BLOCK_SIZE_M) + num_pid_n = tl.cdiv(N, BLOCK_SIZE_N) + num_pid_in_group = GROUP_SIZE_M * num_pid_n group_id = pid // num_pid_in_group first_pid_m = group_id * GROUP_SIZE_M group_size_m = min(num_pid_m - first_pid_m, GROUP_SIZE_M) @@ -72,7 +72,7 @@ def sdnq_triton_mm_kernel( b_ptrs = b_ptr + (offs_k[:, None] + offs_bn[None, :] * K) off_k = 0 - accumulator_dtype: tl.constexpr = tl.int32 if a_ptr.type.element_ty == tl.int8 else tl.float32 + accumulator_dtype = tl.int32 if a_ptr.type.element_ty == tl.int8 else tl.float32 accumulator = tl.zeros((BLOCK_SIZE_M, BLOCK_SIZE_N), dtype=accumulator_dtype) for _ in tl.range(0, tl.cdiv(K, BLOCK_SIZE_K)): a = a_desc.load([off_m, off_k]) diff --git a/modules/sdnq/kernels/triton_scaled_mm.py b/modules/sdnq/kernels/triton_scaled_mm.py index d222b2fba..f46763d12 100644 --- a/modules/sdnq/kernels/triton_scaled_mm.py +++ b/modules/sdnq/kernels/triton_scaled_mm.py @@ -39,9 +39,9 @@ def sdnq_scaled_mm_kernel( GROUP_SIZE_M: tl.constexpr, ) -> None: pid = tl.program_id(axis=0) - num_pid_m: tl.constexpr = tl.cdiv(M, BLOCK_SIZE_M) - num_pid_n: tl.constexpr = tl.cdiv(N, BLOCK_SIZE_N) - num_pid_in_group: tl.constexpr = GROUP_SIZE_M * num_pid_n + num_pid_m = tl.cdiv(M, BLOCK_SIZE_M) + num_pid_n = tl.cdiv(N, BLOCK_SIZE_N) + num_pid_in_group = GROUP_SIZE_M * num_pid_n group_id = pid // num_pid_in_group first_pid_m = group_id * GROUP_SIZE_M group_size_m = min(num_pid_m - first_pid_m, GROUP_SIZE_M) @@ -73,7 +73,7 @@ def sdnq_scaled_mm_kernel( b_ptrs = b_ptr + (offs_k[:, None] + offs_bn[None, :] * K) off_k = 0 - accumulator_dtype: tl.constexpr = tl.int32 if a_ptr.type.element_ty == tl.int8 else tl.float32 + accumulator_dtype = tl.int32 if a_ptr.type.element_ty == tl.int8 else tl.float32 accumulator = tl.zeros((BLOCK_SIZE_M, BLOCK_SIZE_N), dtype=accumulator_dtype) for _ in tl.range(0, tl.cdiv(K, BLOCK_SIZE_K)): a = a_desc.load([off_m, off_k]) From 1cf2c9012d1d8d696e3c87bbd9d59a530656baf0 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Wed, 15 Jul 2026 03:20:43 +0300 Subject: [PATCH 13/64] add min block size check to sdnq atten --- modules/attention.py | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/attention.py b/modules/attention.py index 00456d871..f52973e6a 100644 --- a/modules/attention.py +++ b/modules/attention.py @@ -26,6 +26,7 @@ def set_sdnq_attention(): def sdpa_sdnq_atten(query: torch.FloatTensor, key: torch.FloatTensor, value: torch.FloatTensor, attn_mask: torch.Tensor | None = None, dropout_p: float = 0.0, is_causal: bool = False, scale: float | None = None, enable_gqa: bool = False, **kwargs) -> torch.FloatTensor: if ( query.device.type != "cpu" + and (query.shape[-2] >= 32 and key.shape[-2] >= 32 and value.shape[-2] >= 32) and (query.shape[-2] >= 512 or key.shape[-2] >= 512) # Skip TE and query.shape[-3] > 1 # Skip VAE ): From ccb339bf0f3040f9e6afc892a179ab9898c2f853 Mon Sep 17 00:00:00 2001 From: CalamitousFelicitousness Date: Mon, 13 Jul 2026 03:17:04 +0100 Subject: [PATCH 14/64] feat(caption): add toriigate 0.5 ToriiGate 0.5 is a Qwen3.5 vision fine-tune trained on a single system prompt and a single query structure, and it degrades on anything else. The shared qwen handler strips angle brackets and underscores from the question, which mangles the model's format templates, and the generic caption instructions are not what it was trained on. - hold the model's caption formats, system prompt and query builder in modules/caption/toriigate.py - build the system prompt and user query from those templates in the qwen handler - offer the native formats in the task dropdown and in the caption api prompt groups - drop Normal Caption for this model, which has no format between short and long --- modules/api/caption.py | 4 +- modules/caption/models_def.py | 5 +- modules/caption/toriigate.py | 208 ++++++++++++++++++++++++++++++++++ modules/caption/vqa.py | 25 ++-- 4 files changed, 232 insertions(+), 10 deletions(-) create mode 100644 modules/caption/toriigate.py diff --git a/modules/api/caption.py b/modules/api/caption.py index 4c133adfa..8352e7e9c 100644 --- a/modules/api/caption.py +++ b/modules/api/caption.py @@ -678,6 +678,7 @@ def get_vqa_prompts(model: str | None = None): - **promptgen**: Analyze, Generate Tags, Mixed Caption, Mixed Caption+ (MiaoshouAI PromptGen fine-tunes only) - **moondream**: Point at..., Detect all... (Moondream 2 and 3) - **moondream2_only**: Detect Gaze (Moondream 2 only) + - **toriigate**: Long Thoughts, Structured Markdown, JSON Caption, Comic Markdown, Chroma Style and other native caption formats (ToriiGate 0.5 only) """ from modules.caption import vqa if model: @@ -688,7 +689,8 @@ def get_vqa_prompts(model: str | None = None): "florence": vqa.vlm_prompts_florence, "promptgen": vqa.vlm_prompts_promptgen, "moondream": vqa.vlm_prompts_moondream, - "moondream2_only": vqa.vlm_prompts_moondream2 + "moondream2_only": vqa.vlm_prompts_moondream2, + "toriigate": vqa.vlm_prompts_toriigate } diff --git a/modules/caption/models_def.py b/modules/caption/models_def.py index f2d56c7cb..82d529616 100644 --- a/modules/caption/models_def.py +++ b/modules/caption/models_def.py @@ -1,4 +1,5 @@ from modules import ui_symbols +from modules.caption.toriigate import prompt_list as vlm_prompts_toriigate vlm_models = { @@ -17,6 +18,7 @@ vlm_models = { "Alibaba Qwen 3.5 4B": "Qwen/Qwen3.5-4B", "Alibaba Qwen 3.5 2B": "Qwen/Qwen3.5-2B", "Alibaba Qwen 3.5 0.8B": "Qwen/Qwen3.5-0.8B", + "ToriiGate 0.5": "Minthy/ToriiGate-0.5", "JoyTag": "fancyfeast/joytag", "JoyCaption Beta": "fancyfeast/llama-joycaption-beta-one-hf-llava", "JoyCaption Alpha": "fancyfeast/llama-joycaption-alpha-two-hf-llava", @@ -173,10 +175,11 @@ vlm_prompt_placeholders = { "Point at...": "Enter objects to locate, e.g., 'the red car' or 'all the eyes'", "Detect all...": "Enter object type to detect, e.g., 'cars' or 'faces'", "Detect Gaze": "No input needed - auto-detects face and gaze direction", + **{task: "No input needed - ToriiGate uses the selected caption format" for task in vlm_prompts_toriigate}, } # Legacy list for backwards compatibility -vlm_prompts = vlm_prompts_common + vlm_prompts_florence + vlm_prompts_promptgen + vlm_prompts_moondream + vlm_prompts_moondream2 +vlm_prompts = vlm_prompts_common + vlm_prompts_florence + vlm_prompts_promptgen + vlm_prompts_moondream + vlm_prompts_moondream2 + vlm_prompts_toriigate vlm_prefill = 'Answer: the image shows' diff --git a/modules/caption/toriigate.py b/modules/caption/toriigate.py new file mode 100644 index 000000000..52cd05d70 --- /dev/null +++ b/modules/caption/toriigate.py @@ -0,0 +1,208 @@ +# Prompt definitions for ToriiGate 0.5 (Minthy/ToriiGate-0.5) +# The model is a Qwen3.5 vision fine-tune trained on one exact query structure and one system prompt: +# system: captioning expert +# user: "# Captioning format:\n