From 893642643f4095451987c326a1449524d3c15496 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Sun, 11 Oct 2026 00:26:15 +0000 Subject: [PATCH 1/3] feat(qwenimage): add CUDA AdaLN modulation projection Add the Qwen-Image Phase A `adaln_mod_projection` operator (RFC #386): per-stream SiLU + Linear 3072->18432 with a fixed-order FP32 forward, compensated input gradients and ascending FP32 Neumaier parameter gradients, plus an independent CPU FP32 reference. Sources live under csrc/cuda/model_specific/qwenimage, rl_engine/backends/cuda/model_specific/qwenimage and rl_engine/reference/model_specific/qwenimage. Register the CUDA and CPU slots (other platforms fail closed), the native bindings, the WS1 operator spec/inputs and the build source, and add tests, evidence runners under benchmarks/models/qwenimage, and the operator page. --- benchmarks/models/qwenimage/__init__.py | 2 + benchmarks/models/qwenimage/adaln_evidence.py | 286 ++++++++ .../qwenimage/adaln_parameter_screen.py | 43 ++ .../models/qwenimage/adaln_prior_art.py | 111 +++ .../models/qwenimage/adaln_reuse_bi_audit.py | 439 ++++++++++++ .../models/qwenimage/adaln_reuse_candidate.py | 40 ++ .../models/qwenimage/plot_adaln_audit.py | 248 +++++++ .../models/qwenimage/plot_adaln_evidence.py | 49 ++ benchmarks/models/qwenimage/streams.py | 8 + .../models/qwenimage/validate_adaln_repair.py | 86 +++ build_tools/extensions.py | 5 + csrc/bindings/ops.cpp | 17 + .../model_specific/qwenimage/det_linear.cu | 663 ++++++++++++++++++ docs/.nav.yml | 1 + docs/operators/README.md | 1 + .../qwenimage-adaln-mod-projection.md | 74 ++ rl_engine/_C.pyi | 22 + .../backends/cuda/model_specific/__init__.py | 2 + .../cuda/model_specific/qwenimage/__init__.py | 2 + .../qwenimage/adaln_mod_projection.py | 116 +++ .../reference/model_specific/__init__.py | 2 + .../model_specific/qwenimage/__init__.py | 2 + .../qwenimage/adaln_mod_projection.py | 90 +++ rl_engine/runtime/registry.py | 18 + .../validation/operators/operator_inputs.py | 16 + .../validation/operators/operator_specs.py | 16 + tests/models/qwenimage/__init__.py | 1 + tests/models/qwenimage/test_adaln.py | 209 ++++++ .../qwenimage/test_parameter_reduction.py | 44 ++ tests/models/qwenimage/test_reference.py | 35 + 30 files changed, 2648 insertions(+) create mode 100644 benchmarks/models/qwenimage/__init__.py create mode 100644 benchmarks/models/qwenimage/adaln_evidence.py create mode 100644 benchmarks/models/qwenimage/adaln_parameter_screen.py create mode 100644 benchmarks/models/qwenimage/adaln_prior_art.py create mode 100644 benchmarks/models/qwenimage/adaln_reuse_bi_audit.py create mode 100644 benchmarks/models/qwenimage/adaln_reuse_candidate.py create mode 100644 benchmarks/models/qwenimage/plot_adaln_audit.py create mode 100644 benchmarks/models/qwenimage/plot_adaln_evidence.py create mode 100644 benchmarks/models/qwenimage/streams.py create mode 100644 benchmarks/models/qwenimage/validate_adaln_repair.py create mode 100644 csrc/cuda/model_specific/qwenimage/det_linear.cu create mode 100644 docs/operators/qwenimage-adaln-mod-projection.md create mode 100644 rl_engine/backends/cuda/model_specific/__init__.py create mode 100644 rl_engine/backends/cuda/model_specific/qwenimage/__init__.py create mode 100644 rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py create mode 100644 rl_engine/reference/model_specific/__init__.py create mode 100644 rl_engine/reference/model_specific/qwenimage/__init__.py create mode 100644 rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py create mode 100644 tests/models/qwenimage/__init__.py create mode 100644 tests/models/qwenimage/test_adaln.py create mode 100644 tests/models/qwenimage/test_parameter_reduction.py create mode 100644 tests/models/qwenimage/test_reference.py diff --git a/benchmarks/models/qwenimage/__init__.py b/benchmarks/models/qwenimage/__init__.py new file mode 100644 index 000000000..cdd927da2 --- /dev/null +++ b/benchmarks/models/qwenimage/__init__.py @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: Apache-2.0 +"""Model benchmark extension point.""" diff --git a/benchmarks/models/qwenimage/adaln_evidence.py b/benchmarks/models/qwenimage/adaln_evidence.py new file mode 100644 index 000000000..b1143363b --- /dev/null +++ b/benchmarks/models/qwenimage/adaln_evidence.py @@ -0,0 +1,286 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +"""Real-weight accuracy, deterministic replay, and alternating CUDA measurements. + +Run from the repository root with PYTHONPATH=. and a compiled local extension. +""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import statistics +import subprocess +from pathlib import Path + +import torch +from safetensors import safe_open + +from benchmarks.models.qwenimage.streams import STREAMS +from rl_engine.backends.cuda.model_specific.qwenimage.adaln_mod_projection import ( + QwenImageAdaLNModProjectionCudaOp, +) +from rl_engine.backends.extension import _C +from rl_engine.contracts.numerical import load_contract +from rl_engine.reference.model_specific.qwenimage.adaln_mod_projection import ( + QwenImageAdaLNModProjectionReference, + reference_projection, +) + +CHECKPOINT_REVISION = "75e0b4be04f60ec59a75f475837eced720f823b6" +DIFFUSERS_REVISION = "d961a388fd02e4db38d17350c8dd9b8abe642e05" + + +def equal_bytes(left, right): + return ( + left.dtype == right.dtype + and left.shape == right.shape + and torch.equal(left.contiguous().view(torch.uint8), right.contiguous().view(torch.uint8)) + ) + + +def tensor_hash(tensor): + return hashlib.sha256(tensor.contiguous().view(torch.uint8).numpy().tobytes()).hexdigest() + + +QWENIMAGE_SOURCE_ROOTS = ( + "csrc/cuda/model_specific/qwenimage", + "rl_engine/backends/cuda/model_specific/qwenimage", + "rl_engine/reference/model_specific/qwenimage", + "benchmarks/models/qwenimage", +) + + +def source_state(): + base = subprocess.check_output(["git", "rev-parse", "HEAD"], text=True).strip() + diff = subprocess.check_output(["git", "diff", "--binary", "HEAD"]) + untracked = subprocess.check_output( + ["git", "ls-files", "--others", "--exclude-standard", "-z"] + ).split(b"\0") + hashes = {} + for name in untracked: + if not name: + continue + path = Path(name.decode()) + if path.suffix in (".py", ".cu", ".cpp", ".h", ".pyi"): + hashes[str(path)] = hashlib.sha256(path.read_bytes()).hexdigest() + fingerprint = hashlib.sha256(diff + json.dumps(hashes, sort_keys=True).encode()).hexdigest() + status = subprocess.check_output(["git", "status", "--porcelain", "--untracked-files=all"]) + sources = { + str(path): hashlib.sha256(path.read_bytes()).hexdigest() + for root in QWENIMAGE_SOURCE_ROOTS + for path in sorted(Path(root).rglob("*")) + if path.suffix in (".py", ".cu") and "__pycache__" not in path.parts + } + return { + "base_sha": base, + "tracked_diff_sha256": hashlib.sha256(diff).hexdigest(), + "untracked_source_sha256": hashes, + "workspace_source_sha256": fingerprint, + "qwenimage_source_sha256": sources, + "extension_sha256": hashlib.sha256(Path(_C.__file__).read_bytes()).hexdigest(), + "clean_commit": not status.strip(), + } + + +def load_weights(model, stem): + index = json.loads( + (model / "transformer/diffusion_pytorch_model.safetensors.index.json").read_text() + ) + tensors, manifest = {}, {} + for suffix in ("weight", "bias"): + name = f"{stem}.{suffix}" + shard = index["weight_map"][name] + metadata = model / ".cache/huggingface/download/transformer" / (shard + ".metadata") + revision, etag, *_ = metadata.read_text().splitlines() + if revision != CHECKPOINT_REVISION: + raise ValueError(f"unverified local checkpoint revision: {revision}") + with safe_open(model / "transformer" / shard, framework="pt", device="cpu") as handle: + tensor = handle.get_tensor(name) + tensors[suffix] = tensor + manifest[name] = { + "shape": list(tensor.shape), + "dtype": str(tensor.dtype), + "sha256": tensor_hash(tensor), + "shard": shard, + "download_etag": etag, + } + return tensors, manifest + + +def compare(actual, expected, dtype, judgment): + spec = load_contract()["judgments"][judgment]["by_op_class"]["reduction"][ + str(dtype).split(".")[-1] + ] + a, b = actual.detach().float().cpu(), expected.detach().float().cpu() + error = (a - b).abs() + limit = spec["atol"] + spec["rtol"] * b.abs() + return { + "passed": bool( + torch.isfinite(a).all() and torch.isfinite(b).all() and (error <= limit).all() + ), + "max_abs": error.max().item(), + "max_tolerance_ratio": (error / limit).max().item(), + "violations": (error > limit).sum().item(), + "atol": spec["atol"], + "rtol": spec["rtol"], + } + + +def correctness(candidate, args, kind): + dtype = args["temb"].dtype + reference = reference_projection + cpu = {k: v.detach().cpu().float().requires_grad_() for k, v in args.items()} + y = candidate(**args) + gold = reference(**cpu, execution_dtype=dtype) + gen = torch.Generator(device=y.device).manual_seed(127) + grad = torch.randn(y.shape, device=y.device, dtype=y.dtype, generator=gen) + grads = torch.autograd.grad(y, tuple(args.values()), grad) + gold_grads = torch.autograd.grad(gold, tuple(cpu.values()), grad.float().cpu()) + metrics = { + "forward": compare(y, gold, dtype, "forward_accuracy"), + "gradients": { + k: compare(a, b, dtype, "gradient_accuracy") for k, a, b in zip(args, grads, gold_grads) + }, + } + again = candidate(**args) + repeat = torch.autograd.grad(again, tuple(args.values()), grad) + metrics["repeat_bitwise"] = bool( + equal_bytes(y, again) and all(equal_bytes(a, b) for a, b in zip(grads, repeat)) + ) + del gold, gold_grads, cpu + return metrics + + +def measure(function, args, mode): + values = tuple(args.values()) + if mode == "backward": + output = function(**args) + upstream = torch.ones_like(output) + torch.cuda.synchronize() + start, end = torch.cuda.Event(enable_timing=True), torch.cuda.Event(enable_timing=True) + start.record() + if mode == "forward": + with torch.no_grad(): + output = function(**args) + elif mode == "backward": + torch.autograd.grad(output, values, upstream) + else: + output = function(**args) + torch.autograd.grad(output, values, torch.ones_like(output)) + end.record() + end.synchronize() + return start.elapsed_time(end) + + +def benchmark(functions, args, repeats): + result = {} + for mode in ("forward", "backward", "forward_backward"): + for fn in functions.values(): + for _ in range(3): + measure(fn, args, mode) + samples = {name: [] for name in functions} + orders = [] + for iteration in range(repeats): + order = list(functions) + if iteration % 2: + order.reverse() + orders.append(order) + for name in order: + samples[name].append(measure(functions[name], args, mode)) + result[mode] = { + "samples_ms": samples, + "order": orders, + "median_ms": {k: statistics.median(v) for k, v in samples.items()}, + } + result["peak_increment_bytes"] = {} + for name, fn in functions.items(): + torch.cuda.synchronize() + torch.cuda.reset_peak_memory_stats() + before = torch.cuda.memory_allocated() + measure(fn, args, "forward_backward") + result["peak_increment_bytes"][name] = torch.cuda.max_memory_allocated() - before + return result + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--model", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + parser.add_argument("--repeats", type=int, default=10) + opts = parser.parse_args() + torch.set_num_threads(8) + torch.manual_seed(71) + report = { + "checkpoint": "Qwen/Qwen-Image", + "checkpoint_revision": CHECKPOINT_REVISION, + "diffusers_revision": DIFFUSERS_REVISION, + "diffusers_source_sha256": { + "transformer_qwenimage.py": ( + "0bad11901deae69f05aec01fd464e51e38582d455068f2851ee665036179321f" + ), + "normalization.py": "a3c40cee9308a0e339cca21c14bf51f394c61ae68e5b9a578e5636441f5eaa84", + }, + "source": source_state(), + "environment": { + "torch": torch.__version__, + "cuda": torch.version.cuda, + "driver": subprocess.check_output( + ["nvidia-smi", "--query-gpu=driver_version", "--format=csv,noheader"], text=True + ).splitlines()[0], + "gpu": torch.cuda.get_device_name(), + "tf32": torch.backends.cuda.matmul.allow_tf32, + }, + "weights": {}, + "cases": [], + } + for label, stem in STREAMS: + weights, manifest = load_weights(opts.model, stem) + report["weights"].update(manifest) + kind = "projection" + candidate = QwenImageAdaLNModProjectionCudaOp() + native = QwenImageAdaLNModProjectionReference() + for dtype in (torch.bfloat16, torch.float32): + for batch, seq in [(1, 1), (2, 1), (4, 1), (9, 1)]: + args = { + "temb": torch.randn(batch, 3072, device="cuda", dtype=dtype).requires_grad_(), + **{ + k: v.to(device="cuda", dtype=dtype).requires_grad_() + for k, v in weights.items() + }, + } + entry = { + "stream": label, + "dtype": str(dtype), + "batch": batch, + "seq": seq, + "readback": candidate.implementation_info(**args), + "correctness": correctness(candidate, args, kind), + "timing": benchmark( + {"candidate": candidate, "native": native}, args, opts.repeats + ), + } + report["cases"].append(entry) + opts.output.parent.mkdir(parents=True, exist_ok=True) + opts.output.write_text(json.dumps(report, indent=2) + "\n") + print(label, str(dtype), batch, seq, entry["correctness"], flush=True) + del args + report["passed"] = all( + c["correctness"]["forward"]["passed"] + and c["correctness"]["repeat_bitwise"] + and all(v["passed"] for v in c["correctness"]["gradients"].values()) + and all( + v["passed"] + for group in c["correctness"].get("fp64_diagnostic", {}).values() + for v in group.values() + ) + for c in report["cases"] + ) + opts.output.write_text(json.dumps(report, indent=2) + "\n") + if not report["passed"]: + raise SystemExit("accuracy gate failed; see report") + + +if __name__ == "__main__": + main() diff --git a/benchmarks/models/qwenimage/adaln_parameter_screen.py b/benchmarks/models/qwenimage/adaln_parameter_screen.py new file mode 100644 index 000000000..88d80add6 --- /dev/null +++ b/benchmarks/models/qwenimage/adaln_parameter_screen.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +"""Check the fixed parameter reducer on cancellation cases that defeat naive sums.""" +import argparse +import json +from pathlib import Path + +import torch + +from benchmarks.models.qwenimage.adaln_evidence import compare, source_state +from rl_engine.backends.extension import _C + +p = argparse.ArgumentParser() +p.add_argument("--output", type=Path, required=True) +a = p.parse_args() +report = dict( + source=source_state(), + torch=torch.__version__, + gpu=torch.cuda.get_device_name(), + construction="grad[B,2]=1; grad[0]=2**26; grad[-1]=-2**26; act[B,7]=1; act[:,1::2]=1.5", + cases=[], +) +for dtype in [torch.float32, torch.bfloat16]: + for batch in [255, 256, 257, 2048]: + g = torch.ones(batch, 2, device="cuda", dtype=torch.float32) + g[0] = 2**26 + g[-1] = -(2**26) + x = torch.ones(batch, 7, device="cuda", dtype=dtype) + x[:, 1::2] = 1.5 + golden = g.double().cpu().T @ x.double().cpu() + baseline = _C.qwenimage_det_linear_backward_weight(g, x, dtype, True)[0] + report["cases"].append( + dict( + dtype=str(dtype), + batch=batch, + fp64=golden.tolist(), + fixed_actual=baseline.float().cpu().tolist(), + fixed_contract=compare(baseline, golden, dtype, "gradient_accuracy"), + ) + ) +a.output.parent.mkdir(parents=True, exist_ok=True) +a.output.write_text(json.dumps(report, indent=2) + "\n") +print("fixed failures", sum(not c["fixed_contract"]["passed"] for c in report["cases"])) diff --git a/benchmarks/models/qwenimage/adaln_prior_art.py b/benchmarks/models/qwenimage/adaln_prior_art.py new file mode 100644 index 000000000..2f95934f4 --- /dev/null +++ b/benchmarks/models/qwenimage/adaln_prior_art.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +"""Compare native, reused fixed GEMV, and an optional existing QKV cuBLASLt build.""" + +import argparse +import hashlib +import importlib.util +import json +from pathlib import Path + +import torch +import torch.nn.functional as F + +from benchmarks.models.qwenimage.adaln_evidence import equal_bytes, load_weights, source_state +from benchmarks.models.qwenimage.streams import STREAMS +from rl_engine.backends.cuda.model_specific.qwenimage.adaln_mod_projection import projection_forward + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--model", type=Path, required=True) + parser.add_argument("--fast-extension", type=Path) + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + torch.set_num_threads(8) + torch.manual_seed(29) + fast = None + if args.fast_extension: + spec = importlib.util.spec_from_file_location("qwenimage_prior_art._C", args.fast_extension) + fast = importlib.util.module_from_spec(spec) + spec.loader.exec_module(fast) + report = {"source": source_state(), "cases": [], "tf32": torch.backends.cuda.matmul.allow_tf32} + if args.fast_extension: + report["existing_qkv_extension_sha256"] = hashlib.sha256( + args.fast_extension.read_bytes() + ).hexdigest() + report["environment"] = { + "torch": torch.__version__, + "cuda": torch.version.cuda, + "gpu": torch.cuda.get_device_name(), + } + for label, stem in STREAMS: + weights, _ = load_weights(args.model, stem) + for dtype in (torch.bfloat16, torch.float32): + w, b = [weights[k].to(device="cuda", dtype=dtype) for k in ("weight", "bias")] + t = torch.randn(64, 3072, device="cuda", dtype=dtype) + funcs = { + "native": lambda z: F.linear(F.silu(z), w, b), + "fixed_gemv": lambda z: projection_forward(z, w, b)[0], + } + if fast: + funcs["existing_qkv_cublaslt"] = lambda z: ( + fast.qwenimage_fast_gemm_fp32_cuda(F.silu(z).contiguous(), w) + b.float() + ).to(dtype) + timings = {name: [] for name in funcs} + orders = [] + for fn in funcs.values(): + for _ in range(4): + fn(t[:1]) + for iteration in range(15): + order = list(funcs) + if iteration % 2: + order.reverse() + orders.append(order) + for name in order: + start, end = torch.cuda.Event(enable_timing=True), torch.cuda.Event( + enable_timing=True + ) + start.record() + funcs[name](t[:1]) + end.record() + end.synchronize() + timings[name].append(start.elapsed_time(end)) + for name, fn in funcs.items(): + base = fn(t[:1]) + violations = [] + for batch in [1, 2, 3, 4, 7, 8, 9, 16, 33, 64]: + for pos in sorted(set([0, batch // 2, batch - 1])): + z = t[:batch].clone() + z[pos] = t[0] + y = fn(z)[pos : pos + 1] + if not equal_bytes(y, base): + violations.append( + { + "batch": batch, + "position": pos, + "differing_bytes": ( + y.contiguous().view(torch.uint8) + != base.contiguous().view(torch.uint8) + ) + .sum() + .item(), + } + ) + report["cases"].append( + { + "stream": label, + "dtype": str(dtype), + "implementation": name, + "batch_invariance_violations": violations, + "forward_b1_ms": timings[name], + "timing_order": orders, + } + ) + print(label, dtype, name, "violations", len(violations), flush=True) + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(json.dumps(report, indent=2) + "\n") + + +if __name__ == "__main__": + main() diff --git a/benchmarks/models/qwenimage/adaln_reuse_bi_audit.py b/benchmarks/models/qwenimage/adaln_reuse_bi_audit.py new file mode 100644 index 000000000..712e3772e --- /dev/null +++ b/benchmarks/models/qwenimage/adaln_reuse_bi_audit.py @@ -0,0 +1,439 @@ +#!/usr/bin/env python3 +# isort: skip_file +# SPDX-License-Identifier: Apache-2.0 +"""Full-op reuse screening, followed by bytewise sample-batch invariance. + +Run each mode in a fresh process. cublas_policy reproduces vLLM's two cuBLAS +workspace settings, not the complete vLLM integration. The vLLM, SGLang and +Megatron modes use each project's batch-invariant persistent matmul with the +same FP32 VJP adapter. No backend math flags are changed. FP64 comparisons use +the declared storage boundaries/STE. +""" +import argparse +import importlib.metadata +import json +import os +import subprocess +import sys +from pathlib import Path + +p = argparse.ArgumentParser(description=__doc__) +p.add_argument( + "--mode", + choices=[ + "native", + "cublas_policy", + "fixed", + "vllm_local", + "sglang_local", + "megatron_local", + ], + required=True, +) +p.add_argument( + "--phase", + choices=["reuse", "bi", "workload", "accuracy", "accuracy_large", "parameters"], + required=True, +) +p.add_argument("--model", type=Path, required=True) +p.add_argument("--output", type=Path, required=True) +p.add_argument("--seed", type=int, default=0) +p.add_argument("--capture-failures", action="store_true") +p.add_argument("--megatron-src", type=Path, help="Megatron-LM checkout for megatron_local") +a = p.parse_args() +if a.mode == "cublas_policy": + os.environ["CUBLAS_WORKSPACE_CONFIG"] = ":16:8" + os.environ["CUBLASLT_WORKSPACE_SIZE"] = "1" + +if a.mode in ("vllm_local", "sglang_local", "megatron_local"): + os.environ["TRITON_F32_DEFAULT"] = "ieee" +if a.mode == "megatron_local": + assert a.megatron_src, "--megatron-src is required for megatron_local" + sys.path.insert(0, str(a.megatron_src)) +if a.mode == "sglang_local": + os.environ["SGLANG_ENABLE_JIT_DEEPGEMM"] = "0" + os.environ["SGLANG_BATCH_INVARIANT_OPS_ENABLE_MM_DEEPGEMM"] = "0" + +# Imports follow explicit subprocess environment setup. +import torch # noqa: E402 +from benchmarks.models.qwenimage.streams import STREAMS # noqa: E402 +from benchmarks.models.qwenimage.adaln_evidence import ( # noqa: E402 + load_weights, + source_state, + benchmark, + equal_bytes, + compare, +) +from rl_engine.backends.cuda.model_specific.qwenimage.adaln_mod_projection import ( # noqa: E402 + QwenImageAdaLNModProjectionCudaOp, +) +from rl_engine.reference.model_specific.qwenimage.adaln_mod_projection import ( # noqa: E402 + QwenImageAdaLNModProjectionReference, + reference_projection, +) + +torch.set_num_threads(8) +assert not torch.backends.cuda.matmul.allow_tf32, "TF32 must already be disabled" +report = dict( + mode=a.mode, + phase=a.phase, + accuracy_seed=a.seed, + source=source_state(), + cases=[], + environment=dict( + torch=torch.__version__, + cuda=torch.version.cuda, + gpu=torch.cuda.get_device_name(), + workspace={ + k: os.environ.get(k) for k in ["CUBLAS_WORKSPACE_CONFIG", "CUBLASLT_WORKSPACE_SIZE"] + }, + tf32=torch.backends.cuda.matmul.allow_tf32, + ), + scope=("sample batch BI; " "shared parameter gradients: same ordered inputs, repeat only"), +) +report["packages"] = {} +for lib in [ + "torch", + "triton", + "diffusers", + "vllm", + "sglang", + "transformer_engine", + "megatron-core", +]: + try: + report["packages"][lib] = importlib.metadata.version(lib) + except importlib.metadata.PackageNotFoundError: + report["packages"][lib] = None +if a.mode == "megatron_local": + report["packages"]["megatron-lm-source"] = subprocess.check_output( + ["git", "-C", str(a.megatron_src), "rev-parse", "HEAD"], text=True + ).strip() + + +def save(): + a.output.parent.mkdir(parents=True, exist_ok=True) + a.output.write_text(json.dumps(report, indent=2) + "\n") + + +def run(fn, inp, upstream, parameters=False): + names = list(inp) if parameters else [k for k in inp if k not in ("weight", "bias")] + vals = {k: v.detach().requires_grad_(k in names) for k, v in inp.items()} + y = fn(**vals) + gs = torch.autograd.grad(y, tuple(vals[k] for k in names), upstream) + return {"output": y.detach(), **{k: g.detach() for k, g in zip(names, gs)}} + + +def sliced(inp, idx): + return {k: (v if k in ("weight", "bias") else v[idx]) for k, v in inp.items()} + + +def stats(left, right): + return { + k: int( + ( + v.contiguous().view(torch.uint8).reshape(v.shape[0], -1) + != right[k].contiguous().view(torch.uint8).reshape(v.shape[0], -1) + ) + .any(1) + .sum() + ) + for k, v in left.items() + } + + +def metric(x, y): + x = x.double().cpu() + y = y.double().cpu() + return float((x - y).abs().max() / y.abs().max().clamp_min(1e-30)) + + +for stream, stem in STREAMS: + weights, manifest = load_weights(a.model, stem) + fn = ( + QwenImageAdaLNModProjectionCudaOp() + if a.mode == "fixed" + else QwenImageAdaLNModProjectionReference() + ) + if a.mode in ("vllm_local", "sglang_local", "megatron_local"): + from benchmarks.models.qwenimage.adaln_reuse_candidate import Projection + + if a.mode == "sglang_local": + import benchmarks.models.qwenimage.adaln_reuse_candidate as adapter + from sglang.srt.batch_invariant_ops.batch_invariant_ops import ( + matmul_persistent, + ) + + adapter.matmul_persistent = matmul_persistent + if a.mode == "megatron_local": + import benchmarks.models.qwenimage.adaln_reuse_candidate as adapter + from megatron.core.transformer.custom_layers.batch_invariant_kernels import ( + matmul_persistent, + ) + + adapter.matmul_persistent = matmul_persistent + fn = Projection() + for dtype in [torch.bfloat16, torch.float32]: + w, b = [weights[k].cuda().to(dtype) for k in ("weight", "bias")] + case = dict(stream=stream, dtype=str(dtype), weights=manifest, checks=[]) + report["cases"].append(case) + + def inputs(batch, seq=3, seed=0): + gen = torch.Generator(device="cuda").manual_seed(seed) + inp = dict( + temb=torch.randn(batch, 3072, device="cuda", dtype=dtype, generator=gen), + weight=w, + bias=b, + ) + shape = (batch, w.shape[0]) + upstream = torch.randn(shape, device="cuda", dtype=dtype, generator=gen) + return inp, upstream + + if a.phase == "parameters": + for seed in [0, 127, 2026]: + for batch in [1, 255, 256, 257, 2048]: + inp, g = inputs(batch, seed=seed) + left = run(fn, inp, g, True) + right = run(fn, inp, g, True) + case["checks"].append( + dict( + kind="parameter_repeat", + batch=batch, + seed=seed, + all_equal={ + k: equal_bytes(left[k], right[k]) for k in ("weight", "bias") + }, + ) + ) + inp, g = inputs(257, seed=seed) + g[255:] = 0 + base = run(fn, sliced(inp, slice(0, 255)), g[:255], True) + for batch in [256, 257]: + padded = run(fn, sliced(inp, slice(0, batch)), g[:batch], True) + case["checks"].append( + dict( + kind="ordered_contributions_zero_padding", + batch=batch, + seed=seed, + all_equal={ + k: equal_bytes(base[k], padded[k]) for k in ("weight", "bias") + }, + ) + ) + save() + print(a.mode, stream, dtype, "parameters complete", flush=True) + elif a.phase in ("accuracy", "accuracy_large"): + shapes = [(256, 1), (2048, 1)] if a.phase == "accuracy_large" else [(1, 1), (3, 1)] + for batch, seq in shapes: + inp, g = inputs(batch, seq, a.seed) + out = run(fn, inp, g, True) + hi = {k: v.double().cpu().requires_grad_() for k, v in inp.items()} + gold = reference_projection(**hi, execution_dtype=dtype) + gg = torch.autograd.grad(gold, tuple(hi.values()), g.double().cpu()) + expected = {"output": gold.detach(), **dict(zip(hi, gg))} + case["checks"].append( + dict( + kind="fp64_contract", + batch=batch, + sequence=seq, + errors={k: metric(v, expected[k]) for k, v in out.items()}, + contract={ + k: compare( + v, + expected[k], + dtype, + ("forward_accuracy" if k == "output" else "gradient_accuracy"), + ) + for k, v in out.items() + }, + ) + ) + low = {k: v.float().cpu().requires_grad_() for k, v in inp.items()} + low_y = reference_projection(**low, execution_dtype=dtype) + low_g = torch.autograd.grad(low_y, tuple(low.values()), g.float().cpu()) + low_expected = {"output": low_y.detach(), **dict(zip(low, low_g))} + case["checks"][-1]["cpu_fp32_contract"] = { + k: compare( + v, + low_expected[k], + dtype, + "forward_accuracy" if k == "output" else "gradient_accuracy", + ) + for k, v in out.items() + } + case["checks"][-1]["cpu_fp32_vs_fp64"] = { + k: compare( + v, + expected[k], + dtype, + "forward_accuracy" if k == "output" else "gradient_accuracy", + ) + for k, v in low_expected.items() + } + del low, low_y, low_g, low_expected + if a.capture_failures: + details = {} + for name, value in out.items(): + check = case["checks"][-1]["contract"][name] + actual = value.detach().float().cpu() + expected_value = expected[name].detach().float().cpu() + limit = check["atol"] + check["rtol"] * expected_value.abs() + coords = ((actual - expected_value).abs() > limit).nonzero() + details[name] = [ + dict( + index=row.tolist(), + actual=actual[tuple(row)].item(), + fp64_reference=expected[name].detach().cpu()[tuple(row)].item(), + comparison_reference=expected_value[tuple(row)].item(), + tolerance=limit[tuple(row)].item(), + ) + for row in coords[:1000] + ] + case["checks"][-1]["failure_elements"] = details + save() + print(a.mode, stream, dtype, "accuracy complete", flush=True) + elif a.phase == "reuse": + inp, g = inputs(3) + out = run(fn, inp, g, True) + hi = {k: v.double().cpu().requires_grad_() for k, v in inp.items()} + gold = reference_projection(**hi, execution_dtype=dtype) + gg = torch.autograd.grad(gold, tuple(hi.values()), g.double().cpu()) + expected = {"output": gold.detach(), **dict(zip(hi, gg))} + case["fp64_relative_max_error"] = {k: metric(v, expected[k]) for k, v in out.items()} + case["repeat_all_gradients"] = { + k: equal_bytes(v, run(fn, inp, g, True)[k]) for k, v in out.items() + } + case["performance"] = [] + for batch, seq in [(1, 1), (3, 1), (256, 1), (2048, 1)]: + inp, g = inputs(batch, seq) + inp = {k: v.detach().requires_grad_() for k, v in inp.items()} + case["performance"].append( + dict( + batch=batch, + sequence=seq, + measurements=benchmark({a.mode: fn}, inp, 10), + ) + ) + save() + print(a.mode, stream, dtype, "reuse complete", flush=True) + elif a.phase == "workload": + for seed in [0, 127, 2026]: + inp, g = inputs(4096, seed=seed) + whole = run(fn, inp, g) + for chunk in [7, 64, 257, 1024, 2048]: + counts = {k: 0 for k in whole} + for start in range(0, 4096, chunk): + stop = min(start + chunk, 4096) + got = run(fn, sliced(inp, slice(start, stop)), g[start:stop]) + for k, n in stats( + got, {k: v[start:stop] for k, v in whole.items()} + ).items(): + counts[k] += n + case["checks"].append( + dict( + kind="workload_4096", + seed=seed, + batch=4096, + chunk=chunk, + rows=4096, + mismatched_rows=counts, + ) + ) + save() + print(a.mode, stream, dtype, "workload seed", seed, flush=True) + else: + sizes = sorted( + set(range(1, 10)) + | {2**k + d for k in range(4, 12) for d in [-1, 0, 1] if 2**k + d <= 2048} + ) + for seed in [0, 127, 2026]: + inp, g = inputs(2048, seed=seed) + # One singleton reference per row, reused across full-batch checks. + singles = {} + for i in range(2048): + one = run(fn, sliced(inp, slice(i, i + 1)), g[i : i + 1]) + for k, v in one.items(): + if k not in singles: + singles[k] = torch.empty( + (2048, *v.shape[1:]), device=v.device, dtype=v.dtype + ) + singles[k][i : i + 1] = v + for batch in [64, 257, 2048]: + got = run(fn, sliced(inp, slice(0, batch)), g[:batch]) + case["checks"].append( + dict( + kind="every_row_singleton", + seed=seed, + batch=batch, + rows=batch, + mismatched_rows=stats(got, {k: v[:batch] for k, v in singles.items()}), + ) + ) + # Every partition covers every row; compare per-sample gradients only. + whole = run(fn, inp, g) + for chunk in [1, 7, 64, 257, 1024]: + counts = {k: 0 for k in whole} + for start in range(0, 2048, chunk): + stop = min(start + chunk, 2048) + got = ( + {k: v[start:stop] for k, v in singles.items()} + if chunk == 1 + else run(fn, sliced(inp, slice(start, stop)), g[start:stop]) + ) + for k, n in stats( + got, {k: v[start:stop] for k, v in whole.items()} + ).items(): + counts[k] += n + case["checks"].append( + dict( + kind="full_partition", + seed=seed, + batch=2048, + chunk=chunk, + rows=2048, + mismatched_rows=counts, + ) + ) + # Front/middle/back target, then reverse entire batch; raw bytes. + for batch in sizes: + for pos in sorted({0, batch // 2, batch - 1}): + idx = torch.arange(batch, device="cuda") + idx[0], idx[pos] = idx[pos].clone(), idx[0].clone() + got = run(fn, sliced(inp, idx), g[idx]) + case["checks"].append( + dict( + kind="dense_position", + seed=seed, + batch=batch, + position=pos, + rows=1, + mismatched_rows=stats( + {k: v[pos : pos + 1] for k, v in got.items()}, + {k: v[:1] for k, v in singles.items()}, + ), + ) + ) + idx = torch.arange(batch - 1, -1, -1, device="cuda") + got = run(fn, sliced(inp, idx), g[idx]) + case["checks"].append( + dict( + kind="reverse", + seed=seed, + batch=batch, + rows=batch, + mismatched_rows=stats(got, {k: v[idx] for k, v in singles.items()}), + ) + ) + small, sg = inputs(9, seed=seed) + first = run(fn, small, sg, True) + again = run(fn, small, sg, True) + case["checks"].append( + dict( + kind="ordered_repeat", + seed=seed, + all_equal={k: equal_bytes(v, again[k]) for k, v in first.items()}, + ) + ) + save() + print(a.mode, stream, dtype, "seed", seed, "BI complete", flush=True) + save() diff --git a/benchmarks/models/qwenimage/adaln_reuse_candidate.py b/benchmarks/models/qwenimage/adaln_reuse_candidate.py new file mode 100644 index 000000000..6f249dd4f --- /dev/null +++ b/benchmarks/models/qwenimage/adaln_reuse_candidate.py @@ -0,0 +1,40 @@ +# SPDX-License-Identifier: Apache-2.0 +"""Audit-only composition of the repository's vendored vLLM persistent GEMM. + +This adapter supplies autograd; the upstream GEMM itself is forward-only. +No operator registration or global dispatch override is performed. FP32 +Triton products require TRITON_F32_DEFAULT=ieee in the audit subprocess. +""" +import os + +import torch +import torch.nn.functional as F + +from benchmarks.layers.vllm_batch_invariant_matmul import matmul_persistent + + +class _Linear(torch.autograd.Function): + @staticmethod + def forward(ctx, temb, weight, bias): + act = F.silu(temb).contiguous() + ctx.save_for_backward(temb, act, weight) + return matmul_persistent(act, weight.T, bias) + + @staticmethod + def backward(ctx, grad): + temb, act, weight = ctx.saved_tensors + # Match the fixed CUDA operator's declared FP32 VJP intermediates. + grad = grad.float().contiguous() + da = matmul_persistent(grad, weight.float()) + dw = matmul_persistent(grad.T, act.float()).to(weight.dtype) + db = grad.sum(0).to(weight.dtype) + z = temb.float() + sigmoid = torch.sigmoid(z) + dt = da * (sigmoid * (1 + z * (1 - sigmoid))) + return dt.to(temb.dtype), dw, db + + +class Projection: + def __call__(self, temb, weight, bias): + assert os.environ.get("TRITON_F32_DEFAULT") == "ieee" + return _Linear.apply(temb, weight, bias) diff --git a/benchmarks/models/qwenimage/plot_adaln_audit.py b/benchmarks/models/qwenimage/plot_adaln_audit.py new file mode 100644 index 000000000..58e7e40da --- /dev/null +++ b/benchmarks/models/qwenimage/plot_adaln_audit.py @@ -0,0 +1,248 @@ +#!/usr/bin/env python3 +# isort: skip_file +# SPDX-License-Identifier: Apache-2.0 +"""Export review figures and CSV from raw audit reports (no recomputation).""" +import argparse +import csv +import json +from pathlib import Path +import matplotlib + +matplotlib.use("Agg") +import matplotlib.pyplot as plt # noqa: E402 +import numpy as np # noqa: E402 + +from benchmarks.models.qwenimage.streams import STREAMS # noqa: E402 + +p = argparse.ArgumentParser() +p.add_argument("directory", type=Path) +a = p.parse_args() +modes = ["native", "cublas_policy", "fixed", "vllm_local", "sglang_local", "megatron_local"] +labels = [ + "Native", + "cuBLAS policy", + "Fixed CUDA", + "vLLM GEMM adapter", + "SGLang GEMM adapter", + "Megatron GEMM adapter", +] +keys = [(s, "torch." + d) for d in ["bfloat16", "float32"] for s, _ in STREAMS] +reports = {} +for mode in modes: + for phase in ["reuse", "bi", "accuracy", "workload"]: + path = a.directory / f"{mode}-{phase}.json" + if path.exists(): + reports[mode, phase] = { + (c["stream"], c["dtype"]): c for c in json.loads(path.read_text())["cases"] + } +rows = [] +fig, axes = plt.subplots(1, 2, figsize=(16, 5.5), layout="constrained") +for ax, component, title in zip( + axes, + ["output", "temb"], + ["Forward: singleton vs full batch", "d_temb: singleton vs full batch"], +): + data = np.full((6, len(modes)), np.nan) + annotations = {} + for j, mode in enumerate(modes): + for i, key in enumerate(keys): + case = reports.get((mode, "bi"), {}).get(key) + if case is None: + continue + checks = [c for c in case["checks"] if c["kind"] == "every_row_singleton"] + n = sum(c["rows"] for c in checks) + bad = sum(c["mismatched_rows"][component] for c in checks) + data[i, j] = bad / n if n else np.nan + annotations[i, j] = f"{bad:,}/{n:,}" + rows.append( + dict( + mode=mode, + stream=key[0], + dtype=key[1], + metric=component + "_BI_rows", + bad=bad, + total=n, + ) + ) + im = ax.imshow(data, vmin=0, vmax=1, cmap="RdYlGn_r", aspect="auto") + ax.set_xticks(range(len(modes)), labels, rotation=20, ha="right", fontsize=9) + ax.set_yticks(range(len(keys)), [f'{s} / {d.removeprefix("torch.")}' for s, d in keys]) + ax.set_title(title) + for i in range(len(keys)): + for j in range(len(modes)): + ax.text( + j, + i, + annotations.get((i, j), "not tested"), + ha="center", + va="center", + fontsize=8, + color=( + "white" + if np.isfinite(data[i, j]) and (data[i, j] < 0.1 or data[i, j] > 0.9) + else "black" + ), + ) +fig.suptitle( + "Qwen-Image / B200 — raw-byte BI mismatches (lower is better)\n" + "3 seeds; every row at B=64,257,2048. This panel alone is not the full BI verdict.", + fontsize=13, +) +fig.savefig(a.directory / "bi.png", dpi=180) +plt.close(fig) + +fig, axes = plt.subplots(2, 2, figsize=(16, 10), layout="constrained") +colors = [ + "#64748b", + "#eab308", + "#2563eb", + "#9333ea", + "#059669", + "#ea580c", + "#db2777", + "#0891b2", +] +width = 0.8 / len(modes) +for ax, batch, title in zip( + axes[0], + [1, 2048], + ["Small batch: full forward + backward", "Large batch: full forward + backward"], +): + for j, mode in enumerate(modes): + vals = [] + lows = [] + highs = [] + for key in keys: + case = reports.get((mode, "reuse"), {}).get(key) + match = ( + next((x for x in case["performance"] if x["batch"] == batch), None) + if case + else None + ) + samples = match["measurements"]["forward_backward"]["samples_ms"][mode] if match else [] + vals.append(np.median(samples) if samples else np.nan) + lows.append(np.percentile(samples, 10) if samples else np.nan) + highs.append(np.percentile(samples, 90) if samples else np.nan) + vals = np.array(vals) + x = np.arange(len(keys)) + (j - (len(modes) - 1) / 2) * width + ax.bar(x, vals, width=0.95 * width, label=labels[j], color=colors[j]) + ax.errorbar( + x, + vals, + yerr=np.array([vals - np.array(lows), np.array(highs) - vals]), + fmt="none", + ecolor="black", + linewidth=0.6, + ) + ax.set_yscale("log") + ax.set_ylabel("ms (median; whiskers p10–p90)") + ax.set_title(title) + ax.set_xticks( + range(len(keys)), [f'{s}\n{d.removeprefix("torch.")}' for s, d in keys], fontsize=9 + ) + ax.grid(axis="y", alpha=0.2) + ax.set_axisbelow(True) +axes[0, 0].legend(fontsize=8) +ax = axes[1, 0] +for j, mode in enumerate(modes): + vals = [] + for key in keys: + c = reports.get((mode, "reuse"), {}).get(key) + vals.append( + max(v for k, v in c["fp64_relative_max_error"].items() if k != "output") + if c + else np.nan + ) + ax.bar( + np.arange(len(keys)) + (j - (len(modes) - 1) / 2) * width, + vals, + width=0.95 * width, + color=colors[j], + ) +ax.set_yscale("log") +ax.set_ylabel("max |error| / max |FP64 reference|") +ax.set_title("Worst gradient normalized error at B=3, S=3") +ax.set_xticks(range(len(keys)), [f'{s}\n{d.removeprefix("torch.")}' for s, d in keys], fontsize=9) +ax.grid(axis="y", alpha=0.2) +ax.set_axisbelow(True) +ax = axes[1, 1] +ax.axis("off") +lines = ["Full-BI checks beyond the heatmap:"] +for mode, label in zip(modes, labels): + cs = list(reports.get((mode, "bi"), {}).values()) + n = sum(len(c["checks"]) for c in cs) + bad = sum( + any(x.get("mismatched_rows", {}).values()) or not all(x.get("all_equal", {}).values()) + for c in cs + for x in c["checks"] + ) + lines.append(f"{label}: {bad}/{n} check records fail") +lines += [ + "", + "Latency includes Python launch gaps; separate processes.", + "Raw samples include fwd, bwd, total and peak memory.", + "FP64 uses explicit storage casts and straight-through VJP.", + "Strict elementwise tolerance results: *-accuracy.json.", + "Source commit and file hashes are recorded in each report.", +] +ax.text(0, 1, "\n".join(lines), va="top", fontsize=11, linespacing=1.6) +fig.suptitle("Reuse audit: speed does not replace accuracy and BI acceptance", fontsize=15) +fig.savefig(a.directory / "reuse.png", dpi=180) +plt.close(fig) +with (a.directory / "bi-summary.csv").open("w") as f: + writer = csv.DictWriter(f, fieldnames=list(rows[0])) + writer.writeheader() + writer.writerows(rows) + +# Strict acceptance is deliberately separate from normalized error at small B. +fig, axes = plt.subplots(1, 2, figsize=(15, 6), layout="constrained") +for ax, dtype in zip(axes, ["torch.bfloat16", "torch.float32"]): + axis_keys = [(s, b) for s, _ in STREAMS for b in [256, 2048]] + for j, mode in enumerate(["fixed", "vllm_local"]): + path = a.directory / f"{mode}-accuracy_large.json" + if not path.exists(): + continue + cases = json.loads(path.read_text())["cases"] + vals, bads = [], [] + for stream, batch in axis_keys: + checks = [ + x + for c in cases + if c["stream"] == stream and c["dtype"] == dtype + for x in c["checks"] + if x["batch"] == batch + ] + vals.append( + max( + (v["max_tolerance_ratio"] for x in checks for v in x["contract"].values()), + default=np.nan, + ) + ) + bads.append(sum(v["violations"] for x in checks for v in x["contract"].values())) + xs = np.arange(len(axis_keys)) + (j - 0.5) * 0.35 + ax.bar( + xs, + vals, + 0.33, + label=["Fixed CUDA", "vLLM GEMM adapter"][j], + color=["#2563eb", "#9333ea"][j], + ) + for x, val, bad in zip(xs, vals, bads): + if np.isfinite(val): + ax.text( + x, + val + 0.025, + f"{val:.2f}\n{bad} fail", + ha="center", + fontsize=8, + color="#b91c1c" if bad else "#1f2937", + ) + ax.axhline(1, color="#b91c1c", linestyle="--", label="Acceptance limit") + ax.set_xticks(range(len(axis_keys)), [f"{s}\nB={b}" for s, b in axis_keys]) + ax.set_title(dtype.removeprefix("torch.")) + ax.set_ylabel("max error / (atol + rtol × |reference|)") + ax.set_ylim(top=max(1.25, ax.get_ylim()[1] * 1.2)) + ax.legend(fontsize=9) +fig.suptitle("Large-batch FP64 check: BI passes do not imply numerical acceptance", fontsize=14) +fig.savefig(a.directory / "accuracy.png", dpi=180) +plt.close(fig) diff --git a/benchmarks/models/qwenimage/plot_adaln_evidence.py b/benchmarks/models/qwenimage/plot_adaln_evidence.py new file mode 100644 index 000000000..d8f1d86be --- /dev/null +++ b/benchmarks/models/qwenimage/plot_adaln_evidence.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +"""Plot public-operator medians from an adaln_evidence JSON report.""" +import argparse +import json + +import matplotlib.pyplot as plt +import numpy as np + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("report") + parser.add_argument("output") + args = parser.parse_args() + plt.switch_backend("Agg") + with open(args.report) as handle: + report = json.load(handle) + cases = [ + c + for c in report["cases"] + if c["dtype"] == "torch.bfloat16" and c["batch"] == 1 and c["seq"] in (1, 6889) + ] + labels = [f'{c["stream"]}\nB={c["batch"]}, S={c["seq"]}' for c in cases] + fig, axes = plt.subplots(1, 3, figsize=(11, 3.7), layout="constrained") + positions = np.arange(len(cases)) + for axis, mode, title in zip( + axes, + ("forward", "backward", "forward_backward"), + ("Forward", "Backward only", "Forward + backward"), + ): + for offset, name, label in [ + (-0.18, "native", "Native PyTorch"), + (0.18, "candidate", "Strict CUDA"), + ]: + values = [c["timing"][mode]["median_ms"][name] for c in cases] + bars = axis.bar(positions + offset, values, width=0.36, label=label) + axis.bar_label(bars, fmt="%.3f", fontsize=8, padding=2) + axis.set_xticks(positions, labels) + axis.set_title(title) + axis.set_ylabel("Median latency (ms)") + axis.margins(y=0.25) + axes[0].legend(fontsize=8) + fig.suptitle("Qwen-Image AdaLN • B200 • BF16 • real checkpoint weights") + fig.savefig(args.output, dpi=180) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/models/qwenimage/streams.py b/benchmarks/models/qwenimage/streams.py new file mode 100644 index 000000000..4167ce8cb --- /dev/null +++ b/benchmarks/models/qwenimage/streams.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: Apache-2.0 +"""Checkpoint streams shared by the evidence runners, validator and plots.""" + +# Checkpoint tensors exercised per stream: block-0 image and text projections. +STREAMS = ( + ("image", "transformer_blocks.0.img_mod.1"), + ("text", "transformer_blocks.0.txt_mod.1"), +) diff --git a/benchmarks/models/qwenimage/validate_adaln_repair.py b/benchmarks/models/qwenimage/validate_adaln_repair.py new file mode 100644 index 000000000..c3309f5d3 --- /dev/null +++ b/benchmarks/models/qwenimage/validate_adaln_repair.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +"""Check completeness and acceptance without reinterpreting tolerance failures.""" +import argparse +import json +from pathlib import Path + +from benchmarks.models.qwenimage.streams import STREAMS + +# Checks per (stream, dtype) case. +CHECKS_PER_CASE = { + "accuracy": {"image": 2, "text": 2}, + "accuracy_large": {"image": 2, "text": 2}, + "bi": {"image": 402, "text": 402}, + "workload": {"image": 15, "text": 15}, + "parameters": {"image": 21, "text": 21}, +} + +p = argparse.ArgumentParser() +p.add_argument("directory", type=Path) +p.add_argument("--allow-fail", action="store_true") +p.add_argument("--allow-dirty", action="store_true", help="Accept reports from an uncommitted tree") +a = p.parse_args() +rows, failures, extensions, commits = [], [], set(), set() +streams = [stream for stream, _ in STREAMS] +for phase, seeds in [ + ("accuracy", [0, 127, 2026]), + ("accuracy_large", [0, 127, 2026]), + ("bi", [0]), + ("workload", [0]), + ("parameters", [0]), +]: + expected = 2 * sum(CHECKS_PER_CASE[phase][stream] for stream in streams) + for seed in seeds: + path = a.directory / f"{phase}-{seed}.json" + report = json.loads(path.read_text()) + assert a.allow_dirty or report["source"]["clean_commit"], (path, "dirty tree") + commits.add(report["source"]["base_sha"]) + extensions.add(report["source"]["extension_sha256"]) + assert [c["stream"] for c in report["cases"][::2]] == streams, path + checks = sum(len(c["checks"]) for c in report["cases"]) + assert checks == expected, (path, checks, expected) + bad = [] + for c in report["cases"]: + for check in c["checks"]: + for field in ["contract", "cpu_fp32_contract"]: + for tensor, result in check.get(field, {}).items(): + if not result["passed"]: + bad.append( + dict( + stream=c["stream"], + dtype=c["dtype"], + batch=check.get("batch"), + sequence=check.get("sequence"), + field=field, + tensor=tensor, + result=result, + ) + ) + if any(check.get("mismatched_rows", {}).values()) or not all( + check.get("all_equal", {}).values() + ): + bad.append(dict(stream=c["stream"], dtype=c["dtype"], check=check)) + rows.append(dict(file=path.name, checks=checks, failures=len(bad))) + failures.extend(dict(file=path.name, **b) for b in bad) +screen = json.loads((a.directory / "cancellation-screen.json").read_text()) +assert a.allow_dirty or screen["source"]["clean_commit"], "dirty tree" +commits.add(screen["source"]["base_sha"]) +extensions.add(screen["source"]["extension_sha256"]) +assert len(screen["cases"]) == 8 +bad = [c for c in screen["cases"] if not c["fixed_contract"]["passed"]] +rows.append(dict(file="cancellation-screen.json", checks=8, failures=len(bad))) +failures.extend(dict(file="cancellation-screen.json", check=c) for c in bad) +assert len(extensions) == 1, "Do not combine results from different extension builds" +assert len(commits) == 1, "Do not combine results from different commits" +result = dict( + qualified=not failures, + commit=next(iter(commits)), + extension_sha256=next(iter(extensions)), + reports=rows, + failures=failures, +) +(a.directory / "acceptance.json").write_text(json.dumps(result, indent=2) + "\n") +print(json.dumps(result, indent=2)) +if failures and not a.allow_fail: + raise SystemExit(1) diff --git a/build_tools/extensions.py b/build_tools/extensions.py index db079e828..bce062253 100644 --- a/build_tools/extensions.py +++ b/build_tools/extensions.py @@ -236,6 +236,11 @@ def get_extensions(): # CUDA IPC and the fixed-tree collective implementation are not # part of the ROCm extension. cuda_sources.append("csrc/cuda/collectives/deterministic_collective.cu") + cuda_sources.extend( + [ + "csrc/cuda/model_specific/qwenimage/det_linear.cu", + ] + ) # This source contains NVIDIA PTX (cp.async, ldmatrix, and mma.sync). # The ROCm dispatcher falls back to PyTorch SDPA for this operator. cuda_sources.append("csrc/cuda/attention/prefix_shared_attention.cu") diff --git a/csrc/bindings/ops.cpp b/csrc/bindings/ops.cpp index 0c7c3e7f4..f29fb5abb 100644 --- a/csrc/bindings/ops.cpp +++ b/csrc/bindings/ops.cpp @@ -4,6 +4,15 @@ #include #include + +#ifdef KERNEL_ALIGN_WITH_CUDA +bool qwenimage_strict_math_compiled(); +torch::Tensor qwenimage_det_linear_backward_bias(torch::Tensor, c10::ScalarType); +std::vector qwenimage_det_linear_forward(torch::Tensor, torch::Tensor, c10::optional, int64_t, bool); +torch::Tensor qwenimage_det_linear_backward_input(torch::Tensor, torch::Tensor, c10::ScalarType); +std::vector qwenimage_det_linear_backward_weight(torch::Tensor, torch::Tensor, c10::ScalarType, bool); +#endif + // Fused LogP Declarations torch::Tensor fused_logp_forward(torch::Tensor logits, torch::Tensor token_ids); #if !defined(USE_ROCM) && !defined(KERNEL_ALIGN_WITH_ROCM) @@ -502,6 +511,14 @@ at::Tensor prefix_shared_attention( // PyBind11 Module Registration PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { +#ifdef KERNEL_ALIGN_WITH_CUDA + m.def("qwenimage_det_linear_forward", &qwenimage_det_linear_forward); + m.def("qwenimage_det_linear_backward_input", &qwenimage_det_linear_backward_input); + m.def("qwenimage_det_linear_backward_weight", &qwenimage_det_linear_backward_weight); + m.def("qwenimage_strict_math_compiled", &qwenimage_strict_math_compiled); + m.def("qwenimage_det_linear_backward_bias", &qwenimage_det_linear_backward_bias); +#endif + m.doc() = "RL-Kernel High-Performance Operator Extension Library"; m.def("fused_logp", &fused_logp_forward, "Fused logp forward fallback"); diff --git a/csrc/cuda/model_specific/qwenimage/det_linear.cu b/csrc/cuda/model_specific/qwenimage/det_linear.cu new file mode 100644 index 000000000..4117e9ad6 --- /dev/null +++ b/csrc/cuda/model_specific/qwenimage/det_linear.cu @@ -0,0 +1,663 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright (c) 2026 RL-Kernel Contributors +// +// Deterministic, batch-invariant row-wise linear layers for the Qwen-Image +// conditioning path (RFC #386: modulation and final projections). +// +// These layers run on a handful of rows (one per distinct timestep) against +// large weights, so they are GEMVs bound by weight bandwidth. The reduction +// order is fixed and depends only on K (and N for the input gradient), never +// on the number of rows or their position. +// +// Reduction contract qwenimage-det-linear-v1 +// ----------------------------------- +// forward y[t, n] = act(bias[n] + dot(x[t, :], W[n, :])) +// * one warp per output column n; lane l owns the 16-byte K chunks +// c = l, l + 32, l + 64, ... (VEC = 16 / sizeof(w) elements each); +// * each lane accumulates its chunks in ascending order and the elements of +// a chunk in ascending order with fmaf into an FP32 accumulator from 0; +// * the 32 lane sums are combined with an xor butterfly (16, 8, 4, 2, 1), +// whose result is identical on every lane (FP add is commutative); +// * the bias is added once after the butterfly; the activation runs in FP32 +// (SiLU as v / (1 + expf(-v)), PyTorch's formula); one cast at the store. +// * this FP32 forward is used for FP32 weights; BF16 weights take the +// tensor-core forward of contract qwenimage-det-linear-bf16-mma-v1 below. +// d_input dx[t, k] = sum_n g[t, n] * W[n, k] +// * N is split into fixed chunks of 64 rows; each chunk uses ascending +// FP32 Neumaier summation with FMA product residuals; the chunk partials are then Kahan-folded in +// ascending chunk order and cast once. +// d_weight dW[n, k] = sum_t g[t, n] * x[t, k]; d_bias db[n] = sum_t g[t, n] +// * ascending-t Neumaier FP32 summation; dW includes FMA product residuals. +// One final cast. The logical row order determines the cross-row reduction. +// +// Reduction contract qwenimage-det-linear-bf16-mma-v1 (BF16 x and W, FP32 accumulate) +// ----------------------------------------------------------------------------- +// forward y[t, n] = act(bias[n] + dot(x[t, :], W[n, :])) +// * a warp owns 16 output columns (MMA rows) and 8 input rows (MMA columns; +// rows past T are zero), so every launch runs the same instruction +// sequence for every T <= 8, and an MMA column never sees another's data; +// * K is visited in groups of 16 in ascending order. Within a 32-wide step, +// quad q supplies k = 32s + 8q + {0..3} to the first mma.sync m16n8k16 and +// k = 32s + 8q + {4..7} to the second (the same k map for W and x); +// * every mma.sync starts from a zero accumulator, so the tensor core only +// sums 16 products; its FP32 result is added to the running FP32 sum with +// an IEEE add, group by group in ascending k; +// * then bias, FP32 activation and one cast, as above. + +#include +#include +#include +#include +#include + +#include +#include + +bool qwenimage_strict_math_compiled() { +#ifdef __FAST_MATH__ + return false; +#else + return true; +#endif +} + +namespace { + +#ifndef QWENIMAGE_FWD_F32_COLS +#define QWENIMAGE_FWD_F32_COLS 2 +#define QWENIMAGE_FWD_F32_AHEAD 6 +#endif +#ifndef QWENIMAGE_FWD_CONFIGS +#define QWENIMAGE_FWD_CONFIGS QWENIMAGE_FWD_CASE(QWENIMAGE_FWD_F32_COLS, QWENIMAGE_FWD_F32_AHEAD) +#endif + +constexpr int kWarp = 32; +constexpr int kWarpsPerBlock = 8; +constexpr int kRowTile = 4; +constexpr int kDInputChunk = 64; + +enum Activation : int64_t { kActNone = 0, kActSilu = 1 }; + +__device__ __forceinline__ float to_float(float v) { return v; } +__device__ __forceinline__ float to_float(__nv_bfloat16 v) { return __bfloat162float(v); } + +template +__device__ __forceinline__ T from_float(float v); +template <> +__device__ __forceinline__ float from_float(float v) { return v; } +template <> +__device__ __forceinline__ __nv_bfloat16 from_float<__nv_bfloat16>(float v) { + return __float2bfloat16(v); // round to nearest even, like at::BFloat16 +} + +// 16-byte vector load converted to FP32. +template +struct Vec16 { + static constexpr int kN = 16 / sizeof(T); + __device__ __forceinline__ static void load(const T* ptr, float (&out)[kN]) { + unpack(load_raw(ptr), out); + } + __device__ __forceinline__ static uint4 load_raw(const T* ptr) { + return *reinterpret_cast(ptr); + } + // Streaming weights are read once: bypass L1 allocation. + __device__ __forceinline__ static uint4 load_stream(const T* ptr) { + return __ldcs(reinterpret_cast(ptr)); + } + __device__ __forceinline__ static void unpack(const uint4& raw, float (&out)[kN]) { + const T* vals = reinterpret_cast(&raw); +#pragma unroll + for (int i = 0; i < kN; ++i) out[i] = to_float(vals[i]); + } +}; + +__device__ __forceinline__ float warp_butterfly_sum(float v) { +#pragma unroll + for (int offset = kWarp / 2; offset > 0; offset >>= 1) { + v += __shfl_xor_sync(0xffffffffu, v, offset); + } + return v; +} + +// Each warp owns kCols adjacent output columns so that kLoadAhead x kCols +// 16-byte weight loads are in flight per lane. Grouping columns and chunks +// changes only when loads are issued: every column still accumulates its own +// chunks in ascending order, exactly as a one-column-per-warp kernel would. +template +__global__ void __launch_bounds__(kWarpsPerBlock * kWarp) + det_linear_forward_kernel(const x_t* __restrict__ x, const w_t* __restrict__ w, + const w_t* __restrict__ bias, out_t* __restrict__ out, + float* __restrict__ pre_act, int64_t rows, int64_t n_out, + int64_t k_in, int64_t activation) { + using WV = Vec16; + using XV = Vec16; + constexpr int kVec = WV::kN; + static_assert(kCols * kRows <= kWarp, "one warp cannot store more than kWarp outputs per tile"); + static_assert(XV::kN == kVec, "x and weight share a dtype"); + constexpr int64_t kStride = static_cast(kWarp) * kVec; + + const int lane = threadIdx.x % kWarp; + const int64_t warp_global = + static_cast(blockIdx.x) * kWarpsPerBlock + threadIdx.x / kWarp; + const int64_t warp_stride = static_cast(gridDim.x) * kWarpsPerBlock; + + for (int64_t n0 = warp_global * kCols; n0 < n_out; n0 += warp_stride * kCols) { + for (int64_t t0 = 0; t0 < rows; t0 += kRows) { + float acc[kCols][kRows]; +#pragma unroll + for (int c = 0; c < kCols; ++c) { +#pragma unroll + for (int r = 0; r < kRows; ++r) acc[c][r] = 0.0f; + } + for (int64_t g0 = static_cast(lane) * kVec; g0 < k_in; + g0 += kStride * kLoadAhead) { + uint4 raw[kLoadAhead][kCols]; +#pragma unroll + for (int u = 0; u < kLoadAhead; ++u) { + const int64_t k0 = g0 + u * kStride; +#pragma unroll + for (int c = 0; c < kCols; ++c) { + if (k0 < k_in && n0 + c < n_out) raw[u][c] = WV::load_stream(w + (n0 + c) * k_in + k0); + } + } +#pragma unroll + for (int u = 0; u < kLoadAhead; ++u) { + const int64_t k0 = g0 + u * kStride; + if (k0 >= k_in) break; +#pragma unroll + for (int r = 0; r < kRows; ++r) { + if (t0 + r < rows) { + float xv[kVec]; + XV::load(x + (t0 + r) * k_in + k0, xv); +#pragma unroll + for (int c = 0; c < kCols; ++c) { + float wv[kVec]; + WV::unpack(raw[u][c], wv); +#pragma unroll + for (int j = 0; j < kVec; ++j) acc[c][r] = fmaf(xv[j], wv[j], acc[c][r]); + } + } + } + } + } +#pragma unroll + for (int c = 0; c < kCols; ++c) { + const int64_t n = n0 + c; +#pragma unroll + for (int r = 0; r < kRows; ++r) { + const int64_t t = t0 + r; + const float sum = warp_butterfly_sum(acc[c][r]); + if (lane == c * kRows + r && t < rows && n < n_out) { + float v = sum + (bias != nullptr ? to_float(bias[n]) : 0.0f); + if (pre_act != nullptr) pre_act[t * n_out + n] = v; + if (activation == kActSilu) v = v / (1.0f + expf(-v)); + out[t * n_out + n] = from_float(v); + } + } + } + } + } +} + +__device__ __forceinline__ void mma_m16n8k16_bf16(float (&c)[4], const uint32_t (&a)[4], + uint32_t b0, uint32_t b1) { +#if defined(__CUDA_ARCH__) && __CUDA_ARCH__ < 800 + // BF16 mma.sync needs SM80+; the host refuses to launch below that. + __trap(); +#else + asm volatile( + "mma.sync.aligned.m16n8k16.row.col.f32.bf16.bf16.f32 {%0,%1,%2,%3}, {%4,%5,%6,%7}, " + "{%8,%9}, {%0,%1,%2,%3};\n" + : "+f"(c[0]), "+f"(c[1]), "+f"(c[2]), "+f"(c[3]) + : "r"(a[0]), "r"(a[1]), "r"(a[2]), "r"(a[3]), "r"(b0), "r"(b1)); +#endif +} + +constexpr int kMmaCols = 16; // output columns per warp (MMA M) +constexpr int kMmaRows = 8; // input rows per pass (MMA N) +constexpr int kMmaAhead = 4; // 32-wide K steps loaded before use + +__device__ __forceinline__ void mma_group_accumulate(float (&acc)[4], const uint32_t (&a)[4], + uint32_t b0, uint32_t b1) { + float part[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + mma_m16n8k16_bf16(part, a, b0, b1); +#pragma unroll + for (int i = 0; i < 4; ++i) acc[i] += part[i]; +} + +// Contract qwenimage-det-linear-bf16-mma-v1. Lane = 4 * g + q: g picks the MMA row +// (output columns n0 + g and n0 + g + 8) and the MMA column (input row t0 + g). +__global__ void __launch_bounds__(kWarpsPerBlock * kWarp) + det_linear_forward_bf16_mma_kernel(const __nv_bfloat16* __restrict__ x, + const __nv_bfloat16* __restrict__ w, + const __nv_bfloat16* __restrict__ bias, + __nv_bfloat16* __restrict__ out, float* __restrict__ pre_act, + int64_t rows, int64_t n_out, int64_t k_in, + int64_t activation) { + const int lane = threadIdx.x % kWarp; + const int g = lane >> 2; + const int q = lane & 3; + const int64_t warp_global = + static_cast(blockIdx.x) * kWarpsPerBlock + threadIdx.x / kWarp; + const int64_t warp_stride = static_cast(gridDim.x) * kWarpsPerBlock; + const uint4 zero = make_uint4(0u, 0u, 0u, 0u); + + for (int64_t n0 = warp_global * kMmaCols; n0 < n_out; n0 += warp_stride * kMmaCols) { + const bool lo_ok = n0 + g < n_out; + const bool hi_ok = n0 + g + 8 < n_out; + const __nv_bfloat16* w_lo = w + (n0 + g) * k_in; + const __nv_bfloat16* w_hi = w + (n0 + g + 8) * k_in; + for (int64_t t0 = 0; t0 < rows; t0 += kMmaRows) { + const bool x_ok = t0 + g < rows; + const __nv_bfloat16* x_row = x + (t0 + g) * k_in; + float acc[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + for (int64_t kb = 0; kb < k_in; kb += 32 * kMmaAhead) { + uint4 a_lo[kMmaAhead], a_hi[kMmaAhead], bx[kMmaAhead]; +#pragma unroll + for (int u = 0; u < kMmaAhead; ++u) { + const int64_t k = kb + 32 * u + 8 * q; + const bool k_ok = k < k_in; + a_lo[u] = (k_ok && lo_ok) ? __ldcs(reinterpret_cast(w_lo + k)) : zero; + a_hi[u] = (k_ok && hi_ok) ? __ldcs(reinterpret_cast(w_hi + k)) : zero; + bx[u] = (k_ok && x_ok) ? *reinterpret_cast(x_row + k) : zero; + } +#pragma unroll + for (int u = 0; u < kMmaAhead; ++u) { + if (kb + 32 * u >= k_in) break; + const uint32_t first[4] = {a_lo[u].x, a_hi[u].x, a_lo[u].y, a_hi[u].y}; + const uint32_t second[4] = {a_lo[u].z, a_hi[u].z, a_lo[u].w, a_hi[u].w}; + mma_group_accumulate(acc, first, bx[u].x, bx[u].y); + mma_group_accumulate(acc, second, bx[u].z, bx[u].w); + } + } + // acc = {(n0+g, t0+2q), (n0+g, t0+2q+1), (n0+g+8, t0+2q), (n0+g+8, t0+2q+1)} +#pragma unroll + for (int i = 0; i < 4; ++i) { + const int64_t n = n0 + g + (i >= 2 ? 8 : 0); + const int64_t t = t0 + 2 * q + (i & 1); + if (n < n_out && t < rows) { + float v = acc[i] + (bias != nullptr ? __bfloat162float(bias[n]) : 0.0f); + if (pre_act != nullptr) pre_act[t * n_out + n] = v; + if (activation == kActSilu) v = v / (1.0f + expf(-v)); + out[t * n_out + n] = __float2bfloat16(v); + } + } + } + } +} + +// partial[c, t, k] = sum_{n in chunk c} g[t, n] * w[n, k] +template +__global__ void det_linear_dinput_partial_kernel(const g_t* __restrict__ grad, + const w_t* __restrict__ w, + float* __restrict__ partial, int64_t rows, + int64_t n_out, int64_t k_in) { + const int64_t k = static_cast(blockIdx.x) * blockDim.x + threadIdx.x; + const int64_t chunk = blockIdx.y; + if (k >= k_in) return; + const int64_t n_begin = chunk * kDInputChunk; + const int64_t n_end = min(n_begin + kDInputChunk, n_out); + for (int64_t t0 = 0; t0 < rows; t0 += kRowTile) { + float acc[kRowTile]; + float correction[kRowTile]; +#pragma unroll + for (int r = 0; r < kRowTile; ++r) { + acc[r] = 0.0f; + correction[r] = 0.0f; + } + for (int64_t n = n_begin; n < n_end; ++n) { + const float wv = to_float(w[n * k_in + k]); +#pragma unroll + for (int r = 0; r < kRowTile; ++r) { + const int64_t t = t0 + r; + if (t < rows) { + const float gv = to_float(grad[t * n_out + n]); + const float product = __fmul_rn(gv, wv); + const float product_error = __fmaf_rn(gv, wv, -product); + const float next = __fadd_rn(acc[r], product); + const float sum_error = fabsf(acc[r]) >= fabsf(product) + ? __fadd_rn(__fsub_rn(acc[r], next), product) + : __fadd_rn(__fsub_rn(product, next), acc[r]); + correction[r] = __fadd_rn(correction[r], __fadd_rn(sum_error, product_error)); + acc[r] = next; + } + } + } +#pragma unroll + for (int r = 0; r < kRowTile; ++r) { + const int64_t t = t0 + r; + if (t < rows) partial[(chunk * rows + t) * k_in + k] = __fadd_rn(acc[r], correction[r]); + } + } +} + +template +__global__ void det_fold_chunks_kernel(const float* __restrict__ partial, out_t* __restrict__ out, + int64_t chunks, int64_t elems) { + const int64_t i = static_cast(blockIdx.x) * blockDim.x + threadIdx.x; + if (i >= elems) return; + float acc = 0.0f; + float correction = 0.0f; + for (int64_t c = 0; c < chunks; ++c) { + const float value = __fsub_rn(partial[c * elems + i], correction); + const float next = __fadd_rn(acc, value); + correction = __fsub_rn(__fsub_rn(next, acc), value); + acc = next; + } + out[i] = from_float(acc); +} + +// dW[n, k]: ascending-t compensated FP32 dot, including product residuals. +template +__global__ void det_linear_dweight_kernel(const g_t* __restrict__ grad, const x_t* __restrict__ x, + w_t* __restrict__ dw, int64_t rows, int64_t n_out, + int64_t k_in) { + const int64_t total = n_out * k_in; + for (int64_t i = static_cast(blockIdx.x) * blockDim.x + threadIdx.x; i < total; + i += static_cast(gridDim.x) * blockDim.x) { + const int64_t n = i / k_in; + const int64_t k = i - n * k_in; + float acc = 0.0f; + float correction = 0.0f; + for (int64_t t = 0; t < rows; ++t) { + const float gv = to_float(grad[t * n_out + n]); + const float xv = to_float(x[t * k_in + k]); + const float product = __fmul_rn(gv, xv); + const float product_error = __fmaf_rn(gv, xv, -product); + const float next = __fadd_rn(acc, product); + const float sum_error = fabsf(acc) >= fabsf(product) + ? __fadd_rn(__fsub_rn(acc, next), product) + : __fadd_rn(__fsub_rn(product, next), acc); + correction = __fadd_rn(correction, __fadd_rn(sum_error, product_error)); + acc = next; + } + dw[i] = from_float(__fadd_rn(acc, correction)); + } +} + +template +__global__ void det_linear_dbias_kernel(const g_t* __restrict__ grad, w_t* __restrict__ db, + int64_t rows, int64_t n_out) { + const int64_t n = static_cast(blockIdx.x) * blockDim.x + threadIdx.x; + if (n >= n_out) return; + float acc = 0.0f; + float correction = 0.0f; + for (int64_t t = 0; t < rows; ++t) { + const float value = to_float(grad[t * n_out + n]); + const float next = __fadd_rn(acc, value); + const float error = fabsf(acc) >= fabsf(value) + ? __fadd_rn(__fsub_rn(acc, next), value) + : __fadd_rn(__fsub_rn(value, next), acc); + correction = __fadd_rn(correction, error); + acc = next; + } + db[n] = from_float(__fadd_rn(acc, correction)); +} + +template +struct CudaType { + using type = T; +}; +template <> +struct CudaType { + using type = __nv_bfloat16; +}; + +template +const typename CudaType::type* cptr(const torch::Tensor& t) { + return reinterpret_cast::type*>(t.data_ptr()); +} +template +typename CudaType::type* mptr(torch::Tensor& t) { + return reinterpret_cast::type*>(t.data_ptr()); +} + +void check_matrix(const torch::Tensor& t, const char* name) { + TORCH_CHECK(qwenimage_strict_math_compiled(), "Qwen-Image requires a build without fast math"); + TORCH_CHECK(t.is_cuda(), name, " must be a CUDA tensor"); + TORCH_CHECK(t.dim() == 2, name, " must be 2-D"); + TORCH_CHECK(t.is_contiguous(), name, " must be contiguous"); + TORCH_CHECK(t.scalar_type() == at::kFloat || t.scalar_type() == at::kBFloat16, name, + " must be float32 or bfloat16, got ", t.scalar_type()); + TORCH_CHECK(reinterpret_cast(t.data_ptr()) % 16 == 0, name, + " must be 16-byte aligned"); +} + +int64_t grid_for(int64_t work, int64_t per_block) { + const int64_t blocks = (work + per_block - 1) / per_block; + return std::max(1, std::min(blocks, 1 << 20)); +} + +// Launch shape only: the row tile, the columns per warp and the load depth +// change which loads are in flight, never a column's accumulation order. +struct ForwardConfig { + int rows; + int cols; + int ahead; +}; + +ForwardConfig pick_forward_config(int64_t rows) { + const int row_tile = rows <= 1 ? 1 : (rows <= 2 ? 2 : 4); + return {row_tile, QWENIMAGE_FWD_F32_COLS, QWENIMAGE_FWD_F32_AHEAD}; +} + +template +void launch_forward_impl(const T* x, const T* w, const T* bias, T* out, float* pre, + int64_t rows, int64_t n_out, int64_t k_in, int64_t activation, + cudaStream_t stream) { + const int64_t blocks = grid_for((n_out + kCols - 1) / kCols, kWarpsPerBlock); + det_linear_forward_kernel + <<(blocks), kWarpsPerBlock * kWarp, 0, stream>>>( + x, w, bias, out, pre, rows, n_out, k_in, activation); +} + +template +void launch_forward_rows(const ForwardConfig& cfg, const T* x, const T* w, const T* bias, T* out, + float* pre, int64_t rows, int64_t n_out, int64_t k_in, + int64_t activation, cudaStream_t stream) { +#define QWENIMAGE_FWD_CASE(C, A) \ + if (cfg.cols == C && cfg.ahead == A) { \ + launch_forward_impl(x, w, bias, out, pre, rows, n_out, k_in, activation, \ + stream); \ + return; \ + } + QWENIMAGE_FWD_CONFIGS +#undef QWENIMAGE_FWD_CASE + TORCH_CHECK(false, "unsupported det_linear forward config cols=", cfg.cols, + " ahead=", cfg.ahead); +} + +template +void launch_forward(const ForwardConfig& cfg, const T* x, const T* w, const T* bias, T* out, + float* pre, int64_t rows, int64_t n_out, int64_t k_in, int64_t activation, + cudaStream_t stream) { + if (cfg.rows == 1) { + launch_forward_rows(cfg, x, w, bias, out, pre, rows, n_out, k_in, activation, stream); + } else if (cfg.rows == 2) { + launch_forward_rows(cfg, x, w, bias, out, pre, rows, n_out, k_in, activation, stream); + } else { + launch_forward_rows(cfg, x, w, bias, out, pre, rows, n_out, k_in, activation, stream); + } +} + +} // namespace + +std::vector qwenimage_det_linear_forward(torch::Tensor x, torch::Tensor weight, + c10::optional bias, + int64_t activation, bool save_pre_activation) { + check_matrix(x, "x"); + check_matrix(weight, "weight"); + TORCH_CHECK(x.device() == weight.device(), "x and weight must be on the same device"); + TORCH_CHECK(x.scalar_type() == weight.scalar_type(), + "x and weight must share a dtype (cast at the declared boundary first), got ", + x.scalar_type(), " and ", weight.scalar_type()); + TORCH_CHECK(activation == kActNone || activation == kActSilu, "unknown activation ", + activation); + const int64_t rows = x.size(0); + const int64_t k_in = x.size(1); + const int64_t n_out = weight.size(0); + TORCH_CHECK(rows > 0, "x must have at least one row"); + TORCH_CHECK(weight.size(1) == k_in, "weight is [", n_out, ", ", weight.size(1), + "] but x has K=", k_in); + const int64_t vec = 16 / x.element_size(); + TORCH_CHECK(k_in % vec == 0, "K=", k_in, " must be a multiple of ", vec, + " for 16-byte vector loads"); + if (bias.has_value()) { + TORCH_CHECK(bias->is_cuda() && bias->dim() == 1 && bias->size(0) == n_out && + bias->is_contiguous() && bias->scalar_type() == weight.scalar_type(), + "bias must be a contiguous [N] CUDA tensor with the weight dtype"); + TORCH_CHECK(bias->device() == weight.device(), + "bias and weight must be on the same device"); + } + + const c10::cuda::CUDAGuard device_guard(x.device()); + auto out = torch::empty({rows, n_out}, x.options()); + torch::Tensor pre; + if (save_pre_activation) pre = torch::empty({rows, n_out}, x.options().dtype(at::kFloat)); + auto stream = at::cuda::getCurrentCUDAStream(); + if (x.scalar_type() == at::kFloat) { + const ForwardConfig cfg = pick_forward_config(rows); + launch_forward(cfg, cptr(x), cptr(weight), + bias.has_value() ? cptr(*bias) : nullptr, mptr(out), + save_pre_activation ? pre.data_ptr() : nullptr, rows, n_out, + k_in, activation, stream); + } else { + TORCH_CHECK(at::cuda::getCurrentDeviceProperties()->major >= 8, + "the BF16 Qwen-Image det_linear forward uses mma.sync and needs SM80 or newer"); + const int64_t blocks = grid_for((n_out + kMmaCols - 1) / kMmaCols, kWarpsPerBlock); + det_linear_forward_bf16_mma_kernel<<(blocks), kWarpsPerBlock * kWarp, + 0, stream>>>( + cptr(x), cptr(weight), + bias.has_value() ? cptr(*bias) : nullptr, mptr(out), + save_pre_activation ? pre.data_ptr() : nullptr, rows, n_out, k_in, activation); + } + C10_CUDA_KERNEL_LAUNCH_CHECK(); + if (save_pre_activation) return {out, pre}; + return {out}; +} + +// grad [T, N] (float32), weight [N, K] -> grad_input [T, K] in out_dtype. +torch::Tensor qwenimage_det_linear_backward_input(torch::Tensor grad, torch::Tensor weight, + c10::ScalarType out_dtype) { + TORCH_CHECK(grad.is_cuda() && grad.dim() == 2 && grad.is_contiguous() && + grad.scalar_type() == at::kFloat, + "grad must be a contiguous 2-D float32 CUDA tensor"); + check_matrix(weight, "weight"); + TORCH_CHECK(grad.device() == weight.device(), "grad and weight must be on the same device"); + TORCH_CHECK(grad.size(1) == weight.size(0), "grad N != weight N"); + TORCH_CHECK(out_dtype == at::kFloat || out_dtype == at::kBFloat16, + "out_dtype must be float32 or bfloat16"); + const int64_t rows = grad.size(0); + TORCH_CHECK(rows > 0, "grad must have at least one row"); + const int64_t n_out = weight.size(0); + const int64_t k_in = weight.size(1); + const c10::cuda::CUDAGuard device_guard(grad.device()); + auto out = torch::empty({rows, k_in}, grad.options().dtype(out_dtype)); + if (k_in == 0) return out; + if (n_out == 0) return out.zero_(); + const int64_t chunks = (n_out + kDInputChunk - 1) / kDInputChunk; + auto partial = torch::empty({chunks, rows, k_in}, grad.options()); + auto stream = at::cuda::getCurrentCUDAStream(); + const int threads = 256; + dim3 grid(static_cast((k_in + threads - 1) / threads), static_cast(chunks)); + if (weight.scalar_type() == at::kFloat) { + det_linear_dinput_partial_kernel<<>>( + grad.data_ptr(), cptr(weight), partial.data_ptr(), rows, n_out, + k_in); + } else { + det_linear_dinput_partial_kernel<<>>( + grad.data_ptr(), cptr(weight), partial.data_ptr(), rows, + n_out, k_in); + } + C10_CUDA_KERNEL_LAUNCH_CHECK(); + const int64_t elems = rows * k_in; + const unsigned fold_blocks = static_cast((elems + threads - 1) / threads); + if (out_dtype == at::kFloat) { + det_fold_chunks_kernel<<>>( + partial.data_ptr(), mptr(out), chunks, elems); + } else { + det_fold_chunks_kernel<__nv_bfloat16><<>>( + partial.data_ptr(), mptr(out), chunks, elems); + } + C10_CUDA_KERNEL_LAUNCH_CHECK(); + return out; +} + +// grad [T, N] float32, x [T, K] (float32 or bfloat16) -> (dW [N, K], dbias [N]) in w_dtype. +std::vector qwenimage_det_linear_backward_weight(torch::Tensor grad, torch::Tensor x, + c10::ScalarType w_dtype, + bool with_bias) { + TORCH_CHECK(grad.is_cuda() && grad.dim() == 2 && grad.is_contiguous() && + grad.scalar_type() == at::kFloat, + "grad must be a contiguous 2-D float32 CUDA tensor"); + check_matrix(x, "x"); + TORCH_CHECK(grad.device() == x.device(), "grad and x must be on the same device"); + TORCH_CHECK(grad.size(0) == x.size(0), "grad rows != x rows"); + TORCH_CHECK(w_dtype == at::kFloat || w_dtype == at::kBFloat16, + "w_dtype must be float32 or bfloat16"); + const int64_t rows = grad.size(0); + TORCH_CHECK(rows > 0, "grad must have at least one row"); + const int64_t n_out = grad.size(1); + const int64_t k_in = x.size(1); + const c10::cuda::CUDAGuard device_guard(grad.device()); + auto dw = torch::empty({n_out, k_in}, grad.options().dtype(w_dtype)); + if (n_out == 0) { + if (!with_bias) return {dw}; + return {dw, torch::empty({n_out}, grad.options().dtype(w_dtype))}; + } + auto stream = at::cuda::getCurrentCUDAStream(); + const int threads = 256; + const int64_t total = n_out * k_in; + const unsigned blocks = static_cast(grid_for(total, threads)); + const float* g = grad.data_ptr(); +#define QWENIMAGE_DW_LAUNCH(XT, XC, WT, WC) \ + det_linear_dweight_kernel<<>>( \ + g, cptr(x), mptr(dw), rows, n_out, k_in) + if (x.scalar_type() == at::kFloat && w_dtype == at::kFloat) { + QWENIMAGE_DW_LAUNCH(float, float, float, float); + } else if (x.scalar_type() == at::kFloat) { + QWENIMAGE_DW_LAUNCH(float, float, at::BFloat16, __nv_bfloat16); + } else if (w_dtype == at::kFloat) { + QWENIMAGE_DW_LAUNCH(at::BFloat16, __nv_bfloat16, float, float); + } else { + QWENIMAGE_DW_LAUNCH(at::BFloat16, __nv_bfloat16, at::BFloat16, __nv_bfloat16); + } +#undef QWENIMAGE_DW_LAUNCH + C10_CUDA_KERNEL_LAUNCH_CHECK(); + if (!with_bias) return {dw}; + auto db = torch::empty({n_out}, grad.options().dtype(w_dtype)); + const unsigned bias_blocks = static_cast((n_out + threads - 1) / threads); + if (w_dtype == at::kFloat) { + det_linear_dbias_kernel<<>>( + g, mptr(db), rows, n_out); + } else { + det_linear_dbias_kernel<<>>( + g, mptr(db), rows, n_out); + } + C10_CUDA_KERNEL_LAUNCH_CHECK(); + return {dw, db}; +} + +// Bias-only entrypoint for evaluating a different dW kernel without recomputing dW. +torch::Tensor qwenimage_det_linear_backward_bias(torch::Tensor grad, c10::ScalarType dtype) { + check_matrix(grad, "grad"); + TORCH_CHECK(grad.scalar_type() == at::kFloat && grad.size(0) > 0, + "grad must be nonempty float32 [B,N]"); + TORCH_CHECK(dtype == at::kFloat || dtype == at::kBFloat16, + "bias gradient dtype must be float32 or bfloat16"); + const c10::cuda::CUDAGuard guard(grad.device()); + auto db = torch::empty({grad.size(1)}, grad.options().dtype(dtype)); + if (grad.size(1) == 0) return db; + const int threads = 256; + const unsigned blocks = static_cast((grad.size(1) + threads - 1) / threads); + auto stream = at::cuda::getCurrentCUDAStream(); + if (dtype == at::kFloat) { + det_linear_dbias_kernel<<>>( + grad.data_ptr(), db.data_ptr(), grad.size(0), grad.size(1)); + } else { + det_linear_dbias_kernel<<>>( + grad.data_ptr(), mptr(db), grad.size(0), grad.size(1)); + } + C10_CUDA_KERNEL_LAUNCH_CHECK(); + return db; +} diff --git a/docs/.nav.yml b/docs/.nav.yml index 29b5ead37..2e2aa6e71 100644 --- a/docs/.nav.yml +++ b/docs/.nav.yml @@ -16,6 +16,7 @@ nav: - Hardware Profiling Guide: getting_started/hardware-profiling.md - Operators: - operators/README.md + - operators/qwenimage-adaln-mod-projection.md - operators/activation.md - operators/attention.md - operators/fused-logp.md diff --git a/docs/operators/README.md b/docs/operators/README.md index 00f4cbb45..c3de2fdb5 100644 --- a/docs/operators/README.md +++ b/docs/operators/README.md @@ -32,4 +32,5 @@ Every operator page should include: - [Matmul](matmul.md) - [Sampling](sampling.md) - [Token Embedding](embedding.md) +- [Qwen-Image AdaLN Modulation Projection](qwenimage-adaln-mod-projection.md) - [Operator Doc Template](../contributing/operator-doc-template.md) diff --git a/docs/operators/qwenimage-adaln-mod-projection.md b/docs/operators/qwenimage-adaln-mod-projection.md new file mode 100644 index 000000000..76cea7462 --- /dev/null +++ b/docs/operators/qwenimage-adaln-mod-projection.md @@ -0,0 +1,74 @@ +# Qwen-Image AdaLN modulation projection (CUDA) + +> Status: validated on B200 (SM100). Accuracy, batch-invariance, reuse-survey and timing evidence, with reproduction commands, is in [B200 evidence](../usage/evidence/qwenimage-adaln-mod-projection-b200/README.md). + +RFC #386 `adaln_mod_projection`, registered as `qwenimage_adaln_mod_projection` +to keep the H3 and Qwen-Image contracts separate. This is a Phase A single-GPU +operator, not the block's LayerNorm/modulation or gated residual. + +## Interface + +```python +from rl_engine.runtime.registry import KernelRegistry + +op = KernelRegistry().get_op("qwenimage_adaln_mod_projection", device=temb.device) +params = op(temb=temb, weight=weight, bias=bias) +shift_attn, scale_attn, gate_attn, shift_mlp, scale_mlp, gate_mlp = params.chunk(6, -1) +trace = op.implementation_info(temb=temb, weight=weight, bias=bias) +``` + +`temb` is `[B,3072]`, `weight` is `[18432,3072]`, `bias` is `[18432]` and +the output is `[B,18432]`. Run this interface separately for `img_mod.1` and +`txt_mod.1`; there is no shared weight assumption. All inputs share a device +and dtype (BF16 or FP32), and B must be positive. Noncontiguous views are copied +explicitly. Backward returns gradients for all three inputs. First-order +autograd only; gradient accumulation into leaves follows PyTorch's usual rules. + +The CUDA registry slot has no reference fallback. NVIDIA SM80+ is required for +the implementation; only B200/SM100 is validated here. A missing extension or +fast-math build fails closed. CPU reference classes are separate; no optimized +ROCm, Ascend, or MUSA slot is registered. + +## Arithmetic and reuse + +Contract `qwenimage-adaln-v2`, backward `qwenimage-parameter-grad-neumaier-v2`: + +1. Native CUDA SiLU, with a declared output store in the execution dtype. +2. Fixed-order projection with FP32 accumulation, one bias addition, and an + execution-dtype output store. FP32 uses one warp's fixed vector/FMA order and + XOR reduction. BF16 uses zero-initialized `mma.sync` K=16 partials summed in + a fixed order. Neither depends on B or logical batch position. +3. Backward keeps intermediates FP32. Input gradients use 64-column compensated dot + partials and an ascending compensated (Kahan) fold. Parameter gradients use + ascending FP32 Neumaier accumulation, including FMA product residuals for + `d_weight`; `d_bias` uses ascending Neumaier summation. Only the final + result is cast. SiLU's analytic VJP is evaluated in + FP32, and leaf gradients are cast to each input's dtype. + +The projection source is adapted from the H3 deterministic GEMV at +`af3311ab3cf22e0d77ddd523cd4283990a9f8377`, retaining the forward arithmetic and +using compensated FP32 summation for the input-gradient dot and final fold. There +is no dependency on H3 operators or their stacked branches. + +`adaln_prior_art.py` compares native `SiLU + F.linear`, this reused GEMV and, +optionally, the existing Qwen-Image QKV cuBLASLt extension. The native FP32 +projection changes bytes across batch sizes in the measured sweep. The QKV +forward is invariant in that sweep but is slower for these small conditioning +batches. Native BF16 forward passes the measured sweep; this does not establish +its backward or an all-dtype strict contract. The prior-art report makes only +a forward claim for the QKV extension. No process-wide cuBLAS/TF32 settings are +changed by this implementation. + +The independent reference uses CPU FP32 SiLU/linear algebra with explicit +storage rounding and straight-through derivatives at cast boundaries. Its +input-gradient dot is blocked into 128-column CPU BLAS operations and pairwise +FP32 addition: a single long CPU BLAS dot can itself miss the repository's +FP32 gradient tolerance. FP64 diagnostics check this reference independently. +This reference does not call the candidate CUDA kernel. + +## Validation and reproduction + +See the [B200 evidence and review notes](../usage/evidence/qwenimage-adaln-mod-projection-b200/README.md). +Reports use the existing `reduction` forward/gradient tolerance rows, without +private overrides. Strict replay and batch invariance are checked with +`torch.equal` on contiguous raw-byte views, separately from agreement with the CPU reference. diff --git a/rl_engine/_C.pyi b/rl_engine/_C.pyi index fb3c4379c..4fb9ab443 100644 --- a/rl_engine/_C.pyi +++ b/rl_engine/_C.pyi @@ -325,3 +325,25 @@ def deterministic_collective_rocm_ipc_all_gather_input( input: torch.Tensor, output: torch.Tensor, ) -> None: ... + +# Qwen-Image conditioning; NVIDIA CUDA only, strict math build. +def qwenimage_det_linear_forward( + x: torch.Tensor, + weight: torch.Tensor, + bias: torch.Tensor | None, + activation: int, + save_pre_activation: bool, +) -> list[torch.Tensor]: ... +def qwenimage_det_linear_backward_input( + grad: torch.Tensor, + weight: torch.Tensor, + out_dtype: torch.dtype, +) -> torch.Tensor: ... +def qwenimage_det_linear_backward_weight( + grad: torch.Tensor, + x: torch.Tensor, + out_dtype: torch.dtype, + with_bias: bool, +) -> list[torch.Tensor]: ... +def qwenimage_strict_math_compiled() -> bool: ... +def qwenimage_det_linear_backward_bias(grad: torch.Tensor, dtype: torch.dtype) -> torch.Tensor: ... diff --git a/rl_engine/backends/cuda/model_specific/__init__.py b/rl_engine/backends/cuda/model_specific/__init__.py new file mode 100644 index 000000000..854372bd1 --- /dev/null +++ b/rl_engine/backends/cuda/model_specific/__init__.py @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: Apache-2.0 +"""Model-specific CUDA implementations.""" diff --git a/rl_engine/backends/cuda/model_specific/qwenimage/__init__.py b/rl_engine/backends/cuda/model_specific/qwenimage/__init__.py new file mode 100644 index 000000000..1d9e4c538 --- /dev/null +++ b/rl_engine/backends/cuda/model_specific/qwenimage/__init__.py @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: Apache-2.0 +"""Qwen-Image Phase A conditioning operators.""" diff --git a/rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py b/rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py new file mode 100644 index 000000000..273fdc971 --- /dev/null +++ b/rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py @@ -0,0 +1,116 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors +"""Fixed-order CUDA Qwen-Image modulation projection, RFC #386.""" + +from __future__ import annotations + +import torch +import torch.nn.functional as F +from torch.autograd.function import once_differentiable + +from rl_engine.backends.extension import _C, _EXT_AVAILABLE +from rl_engine.reference.model_specific.qwenimage.adaln_mod_projection import validate_projection + +CONTRACT = "qwenimage-adaln-v2" +_SYMBOLS = ( + "qwenimage_det_linear_forward", + "qwenimage_det_linear_backward_input", + "qwenimage_det_linear_backward_weight", + # Introduced with v2; reject stale v1 extensions with uncompensated dW/db. + "qwenimage_det_linear_backward_bias", + "qwenimage_strict_math_compiled", +) + + +def require_extension(): + if not _EXT_AVAILABLE or not all(hasattr(_C, name) for name in _SYMBOLS): + raise RuntimeError("rebuild rl_engine._C with Qwen-Image strict CUDA kernels") + if not _C.qwenimage_strict_math_compiled(): + raise RuntimeError("Qwen-Image requires a build without fast math") + + +def require_device(tensor): + if tensor.device.type != "cuda" or torch.version.hip is not None: + raise ValueError("Qwen-Image CUDA requires NVIDIA CUDA tensors") + if torch.cuda.get_device_capability(tensor.device) < (8, 0): + raise RuntimeError("Qwen-Image CUDA requires SM80 or newer") + + +def projection_forward(temb, weight, bias): + act = F.silu(temb).contiguous() + table = _C.qwenimage_det_linear_forward(act, weight.contiguous(), bias.contiguous(), 0, False)[ + 0 + ] + return table, act + + +def parameter_gradients(grad, act, dtype): + return _C.qwenimage_det_linear_backward_weight(grad, act, dtype, True) + + +def projection_backward(grad, temb, act, weight): + grad = grad.float().contiguous() + dw, db = parameter_gradients(grad, act, weight.dtype) + da = _C.qwenimage_det_linear_backward_input(grad, weight.contiguous(), torch.float32) + z = temb.float() + sigmoid = torch.sigmoid(z) + dt = da * (sigmoid * (1 + z * (1 - sigmoid))) + return dt.to(temb.dtype), dw, db + + +def implementation_info(op, tensor): + require_extension() + require_device(tensor) + return { + "operator": op, + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": CONTRACT, + "fallback": False, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": ("mma_k16_ascending" if tensor.dtype == torch.bfloat16 else "warp_xor"), + "backward": ( + "compensated_64_column_partials_kahan_fold; " + "ascending_batch_neumaier_dW_product_residual_db" + ), + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": str(tensor.dtype), + "device": str(tensor.device), + "capability": list(torch.cuda.get_device_capability(tensor.device)), + } + + +class _Projection(torch.autograd.Function): + @staticmethod + def forward(ctx, temb, weight, bias): + table, act = projection_forward(temb, weight, bias) + ctx.save_for_backward(temb, act, weight) + return table + + @staticmethod + @once_differentiable + def backward(ctx, grad): + return projection_backward(grad, *ctx.saved_tensors) + + +class QwenImageAdaLNModProjectionCudaOp: + op_class = "reduction" + kernel_id = "aten.silu+rl_engine._C.qwenimage_det_linear_forward" + + def __init__(self): + require_extension() + + def forward(self, temb, weight, bias): + validate_projection(temb, weight, bias, 6) + require_device(temb) + return _Projection.apply(temb, weight, bias) + + __call__ = forward + + def implementation_info(self, temb, weight, bias): + validate_projection(temb, weight, bias, 6) + return implementation_info("qwenimage_adaln_mod_projection", temb) diff --git a/rl_engine/reference/model_specific/__init__.py b/rl_engine/reference/model_specific/__init__.py new file mode 100644 index 000000000..20aaa7470 --- /dev/null +++ b/rl_engine/reference/model_specific/__init__.py @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: Apache-2.0 +"""Model-specific mathematical references.""" diff --git a/rl_engine/reference/model_specific/qwenimage/__init__.py b/rl_engine/reference/model_specific/qwenimage/__init__.py new file mode 100644 index 000000000..1d9e4c538 --- /dev/null +++ b/rl_engine/reference/model_specific/qwenimage/__init__.py @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: Apache-2.0 +"""Qwen-Image Phase A conditioning operators.""" diff --git a/rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py b/rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py new file mode 100644 index 000000000..33fde0588 --- /dev/null +++ b/rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py @@ -0,0 +1,90 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors +"""Qwen-Image modulation projection and independent precision reference.""" + +from __future__ import annotations + +import torch +import torch.nn.functional as F + +HIDDEN = 3072 + + +def validate_projection(temb, weight, bias, multiplier): + if temb.ndim != 2 or temb.shape[0] < 1 or temb.shape[1] != HIDDEN: + raise ValueError("temb must be nonempty [B,3072]") + if tuple(weight.shape) != (multiplier * HIDDEN, HIDDEN): + raise ValueError(f"weight must be [{multiplier * HIDDEN},3072]") + if tuple(bias.shape) != (multiplier * HIDDEN,): + raise ValueError(f"bias must be [{multiplier * HIDDEN}]") + if temb.dtype not in (torch.bfloat16, torch.float32): + raise TypeError("only bfloat16 and float32 are supported") + if any(t.dtype != temb.dtype for t in (weight, bias)): + raise TypeError("temb, weight and bias must share a dtype") + if any(t.device != temb.device for t in (weight, bias)): + raise ValueError("all inputs must be on the same device") + + +class _RoundStraightThrough(torch.autograd.Function): + @staticmethod + def forward(ctx, x, dtype): + return x.to(dtype).to(x.dtype) + + @staticmethod + def backward(ctx, grad): + return grad, None + + +def round_boundary(x, dtype): + """Model a declared storage rounding while retaining an FP32/FP64 VJP.""" + return _RoundStraightThrough.apply(x, dtype) + + +class _ReferenceLinear(torch.autograd.Function): + """Independent FP32 reference with a balanced, blocked input-gradient sum. + + A single CPU BLAS dot over 6144/18432 terms can itself miss the gradient + tolerance under cancellation. The 128-output blocks are independent BLAS + calls, followed by pairwise FP32 addition; no CUDA kernel is used here. + """ + + @staticmethod + def forward(ctx, x, weight, bias): + ctx.save_for_backward(x, weight) + return F.linear(x, weight, bias) + + @staticmethod + def backward(ctx, grad): + x, weight = ctx.saved_tensors + parts = [ + grad[:, start : start + 128] @ weight[start : start + 128] + for start in range(0, weight.shape[0], 128) + ] + while len(parts) > 1: + combined = [parts[i] + parts[i + 1] for i in range(0, len(parts) - 1, 2)] + if len(parts) % 2: + combined.append(parts[-1]) + parts = combined + return parts[0], grad.T @ x, grad.sum(0) + + +def reference_projection(temb, weight, bias, execution_dtype): + act = round_boundary(F.silu(temb), execution_dtype) + return round_boundary(_ReferenceLinear.apply(act, weight, bias), execution_dtype) + + +class QwenImageAdaLNModProjectionReference: + """One stream: SiLU + Linear, returning two (shift, scale, gate) triples.""" + + op_class = "reduction" + kernel_id = "pytorch.qwenimage.adaln_mod_projection.reference" + + def forward(self, temb, weight, bias): + validate_projection(temb, weight, bias, 6) + return F.linear(F.silu(temb), weight, bias) + + __call__ = forward + + def forward_fp32(self, temb, weight, bias): + validate_projection(temb, weight, bias, 6) + return reference_projection(temb.float(), weight.float(), bias.float(), temb.dtype) diff --git a/rl_engine/runtime/registry.py b/rl_engine/runtime/registry.py index 7751d5901..d24902853 100644 --- a/rl_engine/runtime/registry.py +++ b/rl_engine/runtime/registry.py @@ -107,6 +107,15 @@ class OpBackend(Enum, metaclass=_KernelEnumMeta): # Variable-length packing (pack-and-pad), [B,S,...] -> [Total_Active,...] PYTORCH_PACK = "rl_engine.kernels.ops.pytorch.packing.pack.NativePackOp" + # Qwen-Image conditioning (RFC #386). + CUDA_QWENIMAGE_ADALN_MOD_PROJECTION = ( + "rl_engine.backends.cuda.model_specific.qwenimage." + "adaln_mod_projection.QwenImageAdaLNModProjectionCudaOp" + ) + PYTORCH_QWENIMAGE_ADALN_MOD_PROJECTION = ( + "rl_engine.reference.model_specific.qwenimage." + "adaln_mod_projection.QwenImageAdaLNModProjectionReference" + ) # Batch-invariant deterministic GEMM (WS1 #146) CUDA_DET_GEMM = "rl_engine.kernels.ops.cuda.matmul.det_gemm.DetGemmOp" TRITON_DET_GEMM = "rl_engine.kernels.ops.triton.matmul.det_gemm.TritonDetGemmOp" @@ -785,6 +794,15 @@ def __init__(self): self._priority_map["npu"]["det_gemm"] = [ OpBackend.ASCEND_DET_GEMM, ] + # CUDA strict operators deliberately have no reference fallback. + for platform in ("rocm", "npu", "musa"): + self._priority_map[platform]["qwenimage_adaln_mod_projection"] = [] + self._priority_map["cuda"]["qwenimage_adaln_mod_projection"] = [ + OpBackend.CUDA_QWENIMAGE_ADALN_MOD_PROJECTION + ] + self._priority_map["cpu"]["qwenimage_adaln_mod_projection"] = [ + OpBackend.PYTORCH_QWENIMAGE_ADALN_MOD_PROJECTION + ] logger.info(f"KernelRegistry initialized for {device_ctx.device_type}") self._adjust_priority_for_hardware() self._adjust_priority_from_env() diff --git a/rl_engine/validation/operators/operator_inputs.py b/rl_engine/validation/operators/operator_inputs.py index ca3b7c120..00a33b1bb 100644 --- a/rl_engine/validation/operators/operator_inputs.py +++ b/rl_engine/validation/operators/operator_inputs.py @@ -25,6 +25,7 @@ def make_operator_inputs( device: torch.device, ) -> dict[str, Any]: builders = { + "qwenimage_adaln_mod_projection": _make_qwenimage_projection_inputs, "rms_norm": _make_rms_norm_inputs, "qk_norm": _make_qk_norm_inputs, "pack": _make_pack_inputs, @@ -53,6 +54,7 @@ def operator_shape_name(op_name: str, args: argparse.Namespace) -> str: batch, seq = _batch_seq(args) vocab = _arg_int(args, "vocab", DEFAULT_VOCAB) names = { + "qwenimage_adaln_mod_projection": f"{batch}x3072x18432", "rms_norm": f"{batch}x{seq}x{_normalized_dim(args)}", "qk_norm": f"{batch}x{seq}x{_arg_int(args, 'n_heads', DEFAULT_N_HEADS)}x" f"{_arg_int(args, 'head_dim', DEFAULT_HEAD_DIM)}", @@ -395,3 +397,17 @@ def _arg_int(args: argparse.Namespace, name: str, default: int) -> int: def _arg_str(args: argparse.Namespace, name: str, default: str) -> str: return str(getattr(args, name, default)) + + +def _qwenimage_inputs(args, dtype, device, multiplier): + batch, _ = _batch_seq(args) + return { + "temb": _floating_tensor((batch, 3072), args, dtype, device, offset=0), + "weight": _floating_tensor((multiplier * 3072, 3072), args, dtype, device, offset=1) + / 3072**0.5, + "bias": _floating_tensor((multiplier * 3072,), args, dtype, device, offset=2) * 0.01, + } + + +def _make_qwenimage_projection_inputs(args, dtype, device): + return _qwenimage_inputs(args, dtype, device, 6) diff --git a/rl_engine/validation/operators/operator_specs.py b/rl_engine/validation/operators/operator_specs.py index 2323f4787..67a901784 100644 --- a/rl_engine/validation/operators/operator_specs.py +++ b/rl_engine/validation/operators/operator_specs.py @@ -32,6 +32,22 @@ def _load_object(path: str) -> Any: OP_SPECS = { + "qwenimage_adaln_mod_projection": OperatorSpec( + name="qwenimage_adaln_mod_projection", + op_class="reduction", + gold_path=( + "rl_engine.reference.model_specific.qwenimage." + "adaln_mod_projection.QwenImageAdaLNModProjectionReference" + ), + gold_method="forward_fp32", + candidate_paths={ + "cuda": ( + "rl_engine.backends.cuda.model_specific.qwenimage." + "adaln_mod_projection.QwenImageAdaLNModProjectionCudaOp" + ) + }, + grad_input_names=("temb", "weight", "bias"), + ), "rms_norm": OperatorSpec( name="rms_norm", op_class="reduction", diff --git a/tests/models/qwenimage/__init__.py b/tests/models/qwenimage/__init__.py new file mode 100644 index 000000000..e2891cf63 --- /dev/null +++ b/tests/models/qwenimage/__init__.py @@ -0,0 +1 @@ +"""tests.models.qwenimage package.""" diff --git a/tests/models/qwenimage/test_adaln.py b/tests/models/qwenimage/test_adaln.py new file mode 100644 index 000000000..fd832fcad --- /dev/null +++ b/tests/models/qwenimage/test_adaln.py @@ -0,0 +1,209 @@ +# SPDX-License-Identifier: Apache-2.0 +import pytest +import torch + +from rl_engine.backends.cuda.model_specific.qwenimage.adaln_mod_projection import ( + QwenImageAdaLNModProjectionCudaOp, +) +from rl_engine.contracts.numerical import load_contract +from rl_engine.reference.model_specific.qwenimage.adaln_mod_projection import reference_projection + +pytestmark = pytest.mark.skipif(not torch.cuda.is_available(), reason="CUDA required") +KINDS = ["projection"] + + +def equal_bytes(left, right): + return ( + left.dtype == right.dtype + and left.shape == right.shape + and torch.equal(left.contiguous().view(torch.uint8), right.contiguous().view(torch.uint8)) + ) + + +def inputs(kind, dtype, batch=2, seq=33, device="cuda:0", seed=19): + gen = torch.Generator(device=device).manual_seed(seed) + + def rand(shape, scale=1): + return ( + torch.randn(shape, generator=gen, device=device, dtype=dtype) * scale + ).requires_grad_() + + args = { + "temb": rand((batch, 3072)), + "weight": rand((6 * 3072, 3072), 0.02), + "bias": rand((6 * 3072,), 0.01), + } + return args + + +def operator(kind): + return QwenImageAdaLNModProjectionCudaOp() + + +def random_upstream(y, seed=127): + generator = torch.Generator(device=y.device).manual_seed(seed) + return torch.randn(y.shape, device=y.device, dtype=y.dtype, generator=generator) + + +def evaluate(fn, args, grad=None): + y = fn(**args) + if grad is None: + grad = random_upstream(y) + grads = torch.autograd.grad(y, tuple(args.values()), grad) + return y.detach(), dict(zip(args, grads)) + + +def assert_accurate(actual, expected, dtype, judgment): + spec = load_contract()["judgments"][judgment]["by_op_class"]["reduction"][ + str(dtype).split(".")[-1] + ] + torch.testing.assert_close( + actual.float().cpu(), expected.float().cpu(), atol=spec["atol"], rtol=spec["rtol"] + ) + + +@pytest.mark.parametrize("kind", KINDS) +@pytest.mark.parametrize("dtype", [torch.float32, torch.bfloat16]) +@pytest.mark.parametrize("seq", [33, 257]) +def test_cpu_reference_all_gradients(kind, dtype, seq): + args = inputs(kind, dtype, seq=seq) + gold = {k: v.detach().cpu().float().requires_grad_() for k, v in args.items()} + ref = reference_projection + y = operator(kind)(**args) + gy = ref(**gold, execution_dtype=dtype) + grad = random_upstream(y) + grads = torch.autograd.grad(y, tuple(args.values()), grad) + gold_grads = torch.autograd.grad(gy, tuple(gold.values()), grad.cpu().float()) + assert_accurate(y, gy, dtype, "forward_accuracy") + for a, b in zip(grads, gold_grads): + assert_accurate(a, b, dtype, "gradient_accuracy") + + +@pytest.mark.parametrize("kind", KINDS) +@pytest.mark.parametrize("dtype", [torch.float32, torch.bfloat16]) +def test_batch_position_and_repeat_bytes(kind, dtype): + args = inputs(kind, dtype, batch=9) + op = operator(kind) + grad = random_upstream(op(**args)) + y, grads = evaluate(op, args, grad) + y2, grads2 = evaluate(op, args, grad) + assert equal_bytes(y, y2) + for k in grads: + assert equal_bytes(grads[k], grads2[k]), k + for order in ([0], [4], [8], [8, 0], [8, 4, 0], list(reversed(range(9)))): + sub = { + k: v[order].detach().requires_grad_() if k in ("x", "temb") else v + for k, v in args.items() + } + sy, sg = evaluate(op, sub, grad[order]) + assert equal_bytes(sy, y[order]) + for k in ("x", "temb"): + if k in args: + assert equal_bytes(sg[k], grads[k][order]), (k, order) + + +@pytest.mark.parametrize("kind", KINDS) +def test_noncontiguous(kind): + args = inputs(kind, torch.bfloat16) + strided = { + k: torch.stack((v, v), -1)[..., 0].detach().requires_grad_() for k, v in args.items() + } + op = operator(kind) + grad = random_upstream(op(**args)) + a, ag = evaluate(op, args, grad) + b, bg = evaluate(op, strided, grad) + assert equal_bytes(a, b) + for k in ag: + assert equal_bytes(ag[k], bg[k]) + + +@pytest.mark.parametrize("kind", KINDS) +def test_validation_and_readback(kind): + args = inputs(kind, torch.float32) + op = operator(kind) + assert op.implementation_info(**args)["fallback"] is False + for name in args: + bad = dict(args) + bad[name] = args[name].cpu() + with pytest.raises(ValueError): + op(**bad) + bad = dict(args) + bad["temb"] = args["temb"][:0] + with pytest.raises(ValueError): + op(**bad) + bad = dict(args) + bad["weight"] = args["weight"][:-1] + with pytest.raises(ValueError): + op(**bad) + bad = {k: v.half() for k, v in args.items()} + with pytest.raises(TypeError): + op(**bad) + + +@pytest.mark.skipif(torch.cuda.device_count() < 2, reason="two CUDA devices required") +@pytest.mark.parametrize("kind", KINDS) +def test_device_one_under_device_zero(kind): + args = inputs(kind, torch.bfloat16, device="cuda:1") + op = operator(kind) + with torch.cuda.device(0): + y, grads = evaluate(op, args) + assert y.device.index == 1 + assert all(g.device.index == 1 for g in grads.values()) + args["bias"] = args["bias"].to("cuda:0") + with pytest.raises(ValueError): + op(**args) + + +@pytest.mark.parametrize("kind", KINDS) +def test_registry_and_gtest(kind): + from argparse import Namespace + + from rl_engine.runtime.registry import KernelRegistry + from rl_engine.validation.operators.op_checks import run_operator_suite + from rl_engine.validation.operators.operator_specs import make_candidate, make_operator_case + + name = "qwenimage_adaln_mod_projection" + registry = KernelRegistry() + op = registry.get_op(name, device="cuda:0") + assert isinstance(op, type(operator(kind))) + args = Namespace(op=name, candidate="cuda", arch_key="sm100", batch=1, seq=33, seed=7) + case = make_operator_case(args, torch.bfloat16, torch.device("cuda")) + report = run_operator_suite( + name, candidates=[make_candidate(args)], cases=[case], check_grad=True + ) + assert report.passed, report.to_dict() + + +@pytest.mark.parametrize("kind", KINDS) +def test_missing_extension_fails_closed(kind, monkeypatch): + import rl_engine.backends.cuda.model_specific.qwenimage.adaln_mod_projection as module + + monkeypatch.setattr(module, "_C", None) + with pytest.raises(RuntimeError, match="rebuild"): + operator(kind) + + +@pytest.mark.parametrize("kind", KINDS) +@pytest.mark.parametrize("dtype", [torch.float32, torch.bfloat16]) +def test_same_order_parameter_contributions(kind, dtype): + args = inputs(kind, dtype, batch=3) + op = operator(kind) + grad = random_upstream(op(**args)) + _, small_grads = evaluate(op, args, grad) + expanded = { + k: torch.cat([v, v[:2]], 0).detach().requires_grad_() if k in ("x", "temb") else v + for k, v in args.items() + } + padded_grad = torch.cat([grad, torch.zeros_like(grad[:2])], 0) + _, large_grads = evaluate(op, expanded, padded_grad) + for k in ("weight", "bias"): + assert equal_bytes(small_grads[k], large_grads[k]), k + + +def test_projection_chunk_order(): + args = inputs("projection", torch.float32, batch=1) + args["weight"] = torch.zeros_like(args["weight"]) + args["bias"] = torch.arange(6, device="cuda", dtype=torch.float32).repeat_interleave(3072) + out = operator("projection")(**args) + for i, chunk in enumerate(out.chunk(6, -1)): + assert equal_bytes(chunk, torch.full_like(chunk, i)) diff --git a/tests/models/qwenimage/test_parameter_reduction.py b/tests/models/qwenimage/test_parameter_reduction.py new file mode 100644 index 000000000..33e3f73d7 --- /dev/null +++ b/tests/models/qwenimage/test_parameter_reduction.py @@ -0,0 +1,44 @@ +# SPDX-License-Identifier: Apache-2.0 +"""Cancellation regressions for the shared parameter-gradient reduction.""" +import pytest +import torch + +from rl_engine.backends.cuda.model_specific.qwenimage.adaln_mod_projection import require_extension +from rl_engine.backends.extension import _C + +pytestmark = pytest.mark.skipif(not torch.cuda.is_available(), reason="CUDA required") + + +@pytest.mark.parametrize("dtype", [torch.float32, torch.bfloat16]) +@pytest.mark.parametrize("rows", [255, 256, 257, 2048]) +def test_parameter_sum_retains_small_contributions(dtype, rows): + require_extension() + # Ascending ordinary FP32 summation loses all the unit contributions. + grad = torch.ones(rows, 2, device="cuda", dtype=torch.float32) + grad[0] = 2**26 + grad[-1] = -(2**26) + act = torch.ones(rows, 7, device="cuda", dtype=dtype) + act[:, 1::2] = 1.5 + dw, db = _C.qwenimage_det_linear_backward_weight(grad, act, dtype, True) + golden = grad.double().cpu().T @ act.double().cpu() + golden_bias = grad.double().cpu().sum(0) + assert torch.equal(dw.cpu(), golden.to(dtype)) + assert torch.equal(db.cpu(), golden_bias.to(dtype)) + again = _C.qwenimage_det_linear_backward_weight(grad, act, dtype, True) + for left, right in zip((dw, db), again): + assert torch.equal(left.view(torch.uint8), right.view(torch.uint8)) + + +@pytest.mark.parametrize("dtype", [torch.float32, torch.bfloat16]) +def test_bias_only_entrypoint_matches_joint_reduction(dtype): + grad = torch.randn(257, 17, device="cuda", dtype=torch.float32) + act = torch.randn(257, 3, device="cuda", dtype=dtype) + _, expected = _C.qwenimage_det_linear_backward_weight(grad, act, dtype, True) + actual = _C.qwenimage_det_linear_backward_bias(grad, dtype) + assert torch.equal(actual.view(torch.uint8), expected.view(torch.uint8)) + + +def test_stale_v1_extension_is_rejected(monkeypatch): + monkeypatch.delattr(_C, "qwenimage_det_linear_backward_bias") + with pytest.raises(RuntimeError, match="rebuild"): + require_extension() diff --git a/tests/models/qwenimage/test_reference.py b/tests/models/qwenimage/test_reference.py new file mode 100644 index 000000000..35c5963c4 --- /dev/null +++ b/tests/models/qwenimage/test_reference.py @@ -0,0 +1,35 @@ +# SPDX-License-Identifier: Apache-2.0 +"""CPU-only checks for the independent reference and strict dispatch gates.""" +from types import SimpleNamespace + +import pytest +import torch + +from rl_engine.reference.model_specific.qwenimage.adaln_mod_projection import _ReferenceLinear + + +def test_reference_linear_backward_against_fp64_autograd(): + gen = torch.Generator().manual_seed(2026) + x = torch.randn(2, 7, generator=gen, dtype=torch.float64, requires_grad=True) + weight = torch.randn(385, 7, generator=gen, dtype=torch.float64, requires_grad=True) + bias = torch.randn(385, generator=gen, dtype=torch.float64, requires_grad=True) + assert torch.autograd.gradcheck(_ReferenceLinear.apply, (x, weight, bias), fast_mode=True) + + +def test_fast_math_build_refused(monkeypatch): + from rl_engine.backends.cuda.model_specific.qwenimage import adaln_mod_projection as module + + extension = SimpleNamespace(**{name: lambda: None for name in module._SYMBOLS}) + extension.qwenimage_strict_math_compiled = lambda: False + monkeypatch.setattr(module, "_C", extension) + monkeypatch.setattr(module, "_EXT_AVAILABLE", True) + with pytest.raises(RuntimeError, match="without fast math"): + module.QwenImageAdaLNModProjectionCudaOp() + + +def test_other_platform_slots_fail_closed(): + from rl_engine.runtime.registry import KernelRegistry + + registry = KernelRegistry() + for platform in ("rocm", "npu", "musa"): + assert registry._priority_map[platform]["qwenimage_adaln_mod_projection"] == [] From 55f83d2b9043f41dca84440d9002ca30f5d3fac4 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Sun, 11 Oct 2026 00:28:55 +0000 Subject: [PATCH 2/3] feat(qwenimage): add CUDA final AdaLN output Add the Qwen-Image Phase A `final_adaln_out` operator (RFC #386): image-stream final modulation, LayerNorm(eps 1e-6) with SiLU + Linear 3072->6144 `(scale, shift)`, reusing the fixed-order projection from `adaln_mod_projection` and adding a fixed-tree FP32 token reduction for the modulation parameter gradients. Register the CUDA and CPU slots (other platforms fail closed), the token-sum binding, the WS1 operator spec/inputs and the build source, and extend the tests, evidence runners and documentation to the final stream. --- benchmarks/models/qwenimage/adaln_evidence.py | 52 +++++++-- .../models/qwenimage/adaln_reuse_bi_audit.py | 100 +++++++++++++++--- .../models/qwenimage/adaln_reuse_candidate.py | 48 +++++++++ .../models/qwenimage/plot_adaln_audit.py | 14 ++- benchmarks/models/qwenimage/streams.py | 3 +- .../models/qwenimage/validate_adaln_repair.py | 12 +-- build_tools/extensions.py | 1 + csrc/bindings/ops.cpp | 2 + .../model_specific/qwenimage/token_sum.cu | 56 ++++++++++ docs/.nav.yml | 1 + docs/operators/README.md | 1 + docs/operators/qwenimage-final-adaln-out.md | 64 +++++++++++ rl_engine/_C.pyi | 1 + .../qwenimage/adaln_mod_projection.py | 1 + .../qwenimage/final_adaln_out.py | 72 +++++++++++++ .../qwenimage/final_adaln_out.py | 79 ++++++++++++++ rl_engine/runtime/registry.py | 15 +++ .../validation/operators/operator_inputs.py | 9 ++ .../validation/operators/operator_specs.py | 16 +++ tests/models/qwenimage/test_adaln.py | 52 +++++++-- tests/models/qwenimage/test_reference.py | 27 ++++- 21 files changed, 589 insertions(+), 37 deletions(-) create mode 100644 csrc/cuda/model_specific/qwenimage/token_sum.cu create mode 100644 docs/operators/qwenimage-final-adaln-out.md create mode 100644 rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py create mode 100644 rl_engine/reference/model_specific/qwenimage/final_adaln_out.py diff --git a/benchmarks/models/qwenimage/adaln_evidence.py b/benchmarks/models/qwenimage/adaln_evidence.py index b1143363b..cf045809a 100644 --- a/benchmarks/models/qwenimage/adaln_evidence.py +++ b/benchmarks/models/qwenimage/adaln_evidence.py @@ -21,12 +21,19 @@ from rl_engine.backends.cuda.model_specific.qwenimage.adaln_mod_projection import ( QwenImageAdaLNModProjectionCudaOp, ) +from rl_engine.backends.cuda.model_specific.qwenimage.final_adaln_out import ( + QwenImageFinalAdaLNOutCudaOp, +) from rl_engine.backends.extension import _C from rl_engine.contracts.numerical import load_contract from rl_engine.reference.model_specific.qwenimage.adaln_mod_projection import ( QwenImageAdaLNModProjectionReference, reference_projection, ) +from rl_engine.reference.model_specific.qwenimage.final_adaln_out import ( + QwenImageFinalAdaLNOutReference, + reference_final, +) CHECKPOINT_REVISION = "75e0b4be04f60ec59a75f475837eced720f823b6" DIFFUSERS_REVISION = "d961a388fd02e4db38d17350c8dd9b8abe642e05" @@ -128,9 +135,9 @@ def compare(actual, expected, dtype, judgment): } -def correctness(candidate, args, kind): +def correctness(candidate, args, kind, fp64_check=False): dtype = args["temb"].dtype - reference = reference_projection + reference = reference_projection if kind == "projection" else reference_final cpu = {k: v.detach().cpu().float().requires_grad_() for k, v in args.items()} y = candidate(**args) gold = reference(**cpu, execution_dtype=dtype) @@ -149,6 +156,20 @@ def correctness(candidate, args, kind): metrics["repeat_bitwise"] = bool( equal_bytes(y, again) and all(equal_bytes(a, b) for a, b in zip(grads, repeat)) ) + if fp64_check and kind == "final" and dtype == torch.float32: + high = {k: v.detach().cpu().double().requires_grad_() for k, v in args.items()} + high_output = reference(**high, execution_dtype=dtype) + high_grads = torch.autograd.grad(high_output, tuple(high.values()), grad.cpu().double()) + metrics["fp64_diagnostic"] = { + "candidate_gradients": { + k: compare(a, b, dtype, "gradient_accuracy") + for k, a, b in zip(args, grads, high_grads) + }, + "cpu_fp32_gradients": { + k: compare(a, b, dtype, "gradient_accuracy") + for k, a, b in zip(args, gold_grads, high_grads) + }, + } del gold, gold_grads, cpu return metrics @@ -209,6 +230,7 @@ def main(): parser.add_argument("--model", type=Path, required=True) parser.add_argument("--output", type=Path, required=True) parser.add_argument("--repeats", type=int, default=10) + parser.add_argument("--fp64-check", action="store_true") opts = parser.parse_args() torch.set_num_threads(8) torch.manual_seed(71) @@ -238,11 +260,23 @@ def main(): for label, stem in STREAMS: weights, manifest = load_weights(opts.model, stem) report["weights"].update(manifest) - kind = "projection" - candidate = QwenImageAdaLNModProjectionCudaOp() - native = QwenImageAdaLNModProjectionReference() + kind = "final" if label == "final" else "projection" + candidate = ( + QwenImageFinalAdaLNOutCudaOp() + if kind == "final" + else QwenImageAdaLNModProjectionCudaOp() + ) + native = ( + QwenImageFinalAdaLNOutReference() + if kind == "final" + else QwenImageAdaLNModProjectionReference() + ) for dtype in (torch.bfloat16, torch.float32): - for batch, seq in [(1, 1), (2, 1), (4, 1), (9, 1)]: + for batch, seq in ( + [(1, 33), (2, 4096), (1, 6889), (1, 6032)] + if kind == "final" + else [(1, 1), (2, 1), (4, 1), (9, 1)] + ): args = { "temb": torch.randn(batch, 3072, device="cuda", dtype=dtype).requires_grad_(), **{ @@ -250,13 +284,17 @@ def main(): for k, v in weights.items() }, } + if kind == "final": + args["x"] = torch.randn( + batch, seq, 3072, device="cuda", dtype=dtype + ).requires_grad_() entry = { "stream": label, "dtype": str(dtype), "batch": batch, "seq": seq, "readback": candidate.implementation_info(**args), - "correctness": correctness(candidate, args, kind), + "correctness": correctness(candidate, args, kind, opts.fp64_check), "timing": benchmark( {"candidate": candidate, "native": native}, args, opts.repeats ), diff --git a/benchmarks/models/qwenimage/adaln_reuse_bi_audit.py b/benchmarks/models/qwenimage/adaln_reuse_bi_audit.py index 712e3772e..db72c2823 100644 --- a/benchmarks/models/qwenimage/adaln_reuse_bi_audit.py +++ b/benchmarks/models/qwenimage/adaln_reuse_bi_audit.py @@ -6,8 +6,9 @@ Run each mode in a fresh process. cublas_policy reproduces vLLM's two cuBLAS workspace settings, not the complete vLLM integration. The vLLM, SGLang and Megatron modes use each project's batch-invariant persistent matmul with the -same FP32 VJP adapter. No backend math flags are changed. FP64 comparisons use -the declared storage boundaries/STE. +same FP32 VJP adapter; vllm_liger and vllm_flashattn also replace the final +LayerNorm with Liger's or flash-attention's Triton LayerNorm. No backend math +flags are changed. FP64 comparisons use the declared storage boundaries/STE. """ import argparse import importlib.metadata @@ -25,6 +26,8 @@ "cublas_policy", "fixed", "vllm_local", + "vllm_liger", + "vllm_flashattn", "sglang_local", "megatron_local", ], @@ -40,12 +43,13 @@ p.add_argument("--seed", type=int, default=0) p.add_argument("--capture-failures", action="store_true") p.add_argument("--megatron-src", type=Path, help="Megatron-LM checkout for megatron_local") +p.add_argument("--flash-attn-src", type=Path, help="flash-attention checkout for vllm_flashattn") a = p.parse_args() if a.mode == "cublas_policy": os.environ["CUBLAS_WORKSPACE_CONFIG"] = ":16:8" os.environ["CUBLASLT_WORKSPACE_SIZE"] = "1" -if a.mode in ("vllm_local", "sglang_local", "megatron_local"): +if a.mode in ("vllm_local", "vllm_liger", "vllm_flashattn", "sglang_local", "megatron_local"): os.environ["TRITON_F32_DEFAULT"] = "ieee" if a.mode == "megatron_local": assert a.megatron_src, "--megatron-src is required for megatron_local" @@ -67,10 +71,17 @@ from rl_engine.backends.cuda.model_specific.qwenimage.adaln_mod_projection import ( # noqa: E402 QwenImageAdaLNModProjectionCudaOp, ) +from rl_engine.backends.cuda.model_specific.qwenimage.final_adaln_out import ( # noqa: E402 + QwenImageFinalAdaLNOutCudaOp, +) from rl_engine.reference.model_specific.qwenimage.adaln_mod_projection import ( # noqa: E402 QwenImageAdaLNModProjectionReference, reference_projection, ) +from rl_engine.reference.model_specific.qwenimage.final_adaln_out import ( # noqa: E402 + QwenImageFinalAdaLNOutReference, + reference_final, +) torch.set_num_threads(8) assert not torch.backends.cuda.matmul.allow_tf32, "TF32 must already be disabled" @@ -89,7 +100,10 @@ }, tf32=torch.backends.cuda.matmul.allow_tf32, ), - scope=("sample batch BI; " "shared parameter gradients: same ordered inputs, repeat only"), + scope=( + "sample batch BI; final uses S=3 for large B, long S tested separately; " + "shared parameter gradients: same ordered inputs, repeat only" + ), ) report["packages"] = {} for lib in [ @@ -98,6 +112,7 @@ "diffusers", "vllm", "sglang", + "liger-kernel", "transformer_engine", "megatron-core", ]: @@ -105,6 +120,11 @@ report["packages"][lib] = importlib.metadata.version(lib) except importlib.metadata.PackageNotFoundError: report["packages"][lib] = None +if a.mode == "vllm_flashattn": + assert a.flash_attn_src, "--flash-attn-src is required for vllm_flashattn" + report["packages"]["flash-attention-source"] = subprocess.check_output( + ["git", "-C", str(a.flash_attn_src), "rev-parse", "HEAD"], text=True + ).strip() if a.mode == "megatron_local": report["packages"]["megatron-lm-source"] = subprocess.check_output( ["git", "-C", str(a.megatron_src), "rev-parse", "HEAD"], text=True @@ -149,14 +169,19 @@ def metric(x, y): for stream, stem in STREAMS: + if a.mode in ("vllm_liger", "vllm_flashattn") and stream != "final": + continue weights, manifest = load_weights(a.model, stem) + final = stream == "final" fn = ( - QwenImageAdaLNModProjectionCudaOp() + (QwenImageFinalAdaLNOutCudaOp() if final else QwenImageAdaLNModProjectionCudaOp()) if a.mode == "fixed" - else QwenImageAdaLNModProjectionReference() + else ( + QwenImageFinalAdaLNOutReference() if final else QwenImageAdaLNModProjectionReference() + ) ) - if a.mode in ("vllm_local", "sglang_local", "megatron_local"): - from benchmarks.models.qwenimage.adaln_reuse_candidate import Projection + if a.mode in ("vllm_local", "vllm_liger", "vllm_flashattn", "sglang_local", "megatron_local"): + from benchmarks.models.qwenimage.adaln_reuse_candidate import Final, Projection if a.mode == "sglang_local": import benchmarks.models.qwenimage.adaln_reuse_candidate as adapter @@ -172,7 +197,15 @@ def metric(x, y): ) adapter.matmul_persistent = matmul_persistent - fn = Projection() + fn = Final() if final else Projection() + if a.mode == "vllm_liger": + from benchmarks.models.qwenimage.adaln_reuse_candidate import FinalLiger + + fn = FinalLiger() + if a.mode == "vllm_flashattn": + from benchmarks.models.qwenimage.adaln_reuse_candidate import FinalFlashAttn + + fn = FinalFlashAttn(a.flash_attn_src) for dtype in [torch.bfloat16, torch.float32]: w, b = [weights[k].cuda().to(dtype) for k in ("weight", "bias")] case = dict(stream=stream, dtype=str(dtype), weights=manifest, checks=[]) @@ -185,7 +218,12 @@ def inputs(batch, seq=3, seed=0): weight=w, bias=b, ) - shape = (batch, w.shape[0]) + if final: + inp = { + "x": torch.randn(batch, seq, 3072, device="cuda", dtype=dtype, generator=gen), + **inp, + } + shape = (batch, seq, 3072) if final else (batch, w.shape[0]) upstream = torch.randn(shape, device="cuda", dtype=dtype, generator=gen) return inp, upstream @@ -223,12 +261,20 @@ def inputs(batch, seq=3, seed=0): save() print(a.mode, stream, dtype, "parameters complete", flush=True) elif a.phase in ("accuracy", "accuracy_large"): - shapes = [(256, 1), (2048, 1)] if a.phase == "accuracy_large" else [(1, 1), (3, 1)] + shapes = ( + [(256, 3 if final else 1), (2048, 3 if final else 1)] + if a.phase == "accuracy_large" + else ( + [(1, 3), (3, 3), (1, 4096), (1, 6889), (1, 6032)] if final else [(1, 1), (3, 1)] + ) + ) for batch, seq in shapes: inp, g = inputs(batch, seq, a.seed) out = run(fn, inp, g, True) hi = {k: v.double().cpu().requires_grad_() for k, v in inp.items()} - gold = reference_projection(**hi, execution_dtype=dtype) + gold = (reference_final if final else reference_projection)( + **hi, execution_dtype=dtype + ) gg = torch.autograd.grad(gold, tuple(hi.values()), g.double().cpu()) expected = {"output": gold.detach(), **dict(zip(hi, gg))} case["checks"].append( @@ -249,7 +295,9 @@ def inputs(batch, seq=3, seed=0): ) ) low = {k: v.float().cpu().requires_grad_() for k, v in inp.items()} - low_y = reference_projection(**low, execution_dtype=dtype) + low_y = (reference_final if final else reference_projection)( + **low, execution_dtype=dtype + ) low_g = torch.autograd.grad(low_y, tuple(low.values()), g.float().cpu()) low_expected = {"output": low_y.detach(), **dict(zip(low, low_g))} case["checks"][-1]["cpu_fp32_contract"] = { @@ -296,7 +344,7 @@ def inputs(batch, seq=3, seed=0): inp, g = inputs(3) out = run(fn, inp, g, True) hi = {k: v.double().cpu().requires_grad_() for k, v in inp.items()} - gold = reference_projection(**hi, execution_dtype=dtype) + gold = (reference_final if final else reference_projection)(**hi, execution_dtype=dtype) gg = torch.autograd.grad(gold, tuple(hi.values()), g.double().cpu()) expected = {"output": gold.detach(), **dict(zip(hi, gg))} case["fp64_relative_max_error"] = {k: metric(v, expected[k]) for k, v in out.items()} @@ -304,7 +352,11 @@ def inputs(batch, seq=3, seed=0): k: equal_bytes(v, run(fn, inp, g, True)[k]) for k, v in out.items() } case["performance"] = [] - for batch, seq in [(1, 1), (3, 1), (256, 1), (2048, 1)]: + for batch, seq in ( + [(1, 33), (2, 4096), (1, 6889), (1, 6032), (256, 3), (2048, 3)] + if final + else [(1, 1), (3, 1), (256, 1), (2048, 1)] + ): inp, g = inputs(batch, seq) inp = {k: v.detach().requires_grad_() for k, v in inp.items()} case["performance"].append( @@ -436,4 +488,22 @@ def inputs(batch, seq=3, seed=0): ) save() print(a.mode, stream, dtype, "seed", seed, "BI complete", flush=True) + if final: + for seq in [31, 32, 33, 4096, 6889, 6032]: + inp, g = inputs(2, seq, 127) + whole = run(fn, inp, g) + singles = [ + run(fn, sliced(inp, slice(i, i + 1)), g[i : i + 1]) for i in range(2) + ] + case["checks"].append( + dict( + kind="long_sequence", + sequence=seq, + rows=2, + mismatched_rows=stats( + whole, + {k: torch.cat([s[k] for s in singles]) for k in whole}, + ), + ) + ) save() diff --git a/benchmarks/models/qwenimage/adaln_reuse_candidate.py b/benchmarks/models/qwenimage/adaln_reuse_candidate.py index 6f249dd4f..785740fbb 100644 --- a/benchmarks/models/qwenimage/adaln_reuse_candidate.py +++ b/benchmarks/models/qwenimage/adaln_reuse_candidate.py @@ -5,7 +5,10 @@ No operator registration or global dispatch override is performed. FP32 Triton products require TRITON_F32_DEFAULT=ieee in the audit subprocess. """ +import importlib import os +import sys +import types import torch import torch.nn.functional as F @@ -38,3 +41,48 @@ class Projection: def __call__(self, temb, weight, bias): assert os.environ.get("TRITON_F32_DEFAULT") == "ieee" return _Linear.apply(temb, weight, bias) + + +class Final: + def __call__(self, x, temb, weight, bias): + scale, shift = Projection()(temb, weight, bias).chunk(2, -1) + # Native modulation autograd: explicitly a candidate, not a certified + # replacement for the existing fixed FP32 token-reduction backward. + norm = F.layer_norm(x.float(), (3072,), eps=1e-6).to(x.dtype) + return norm * (1 + scale)[:, None, :] + shift[:, None, :] + + +class FinalLiger: + def __call__(self, x, temb, weight, bias): + from liger_kernel.ops.layer_norm import LigerLayerNormFunction + + scale, shift = Projection()(temb, weight, bias).chunk(2, -1) + gain = torch.ones(3072, device=x.device, dtype=torch.float32) + offset = torch.zeros_like(gain) + norm = LigerLayerNormFunction.apply(x.float(), gain, offset, 1e-6).to(x.dtype) + return norm * (1 + scale)[:, None, :] + shift[:, None, :] + + +class FinalFlashAttn: + """Final modulation with flash-attention's Triton LayerNorm (forward and backward). + + Only ``flash_attn.ops.triton.layer_norm`` is loaded from the checkout; the + package ``__init__`` (which needs the compiled attention extension) is skipped. + """ + + def __init__(self, source): + if "flash_attn" not in sys.modules: + package = types.ModuleType("flash_attn") + package.__path__ = [str(source / "flash_attn")] + sys.modules["flash_attn"] = package + self.layer_norm_fn = importlib.import_module( + "flash_attn.ops.triton.layer_norm" + ).layer_norm_fn + + def __call__(self, x, temb, weight, bias): + scale, shift = Projection()(temb, weight, bias).chunk(2, -1) + # Parameter-free LayerNorm: constant unit gain and zero offset, as for Liger. + gain = torch.ones(3072, device=x.device, dtype=torch.float32) + offset = torch.zeros_like(gain) + norm = self.layer_norm_fn(x.float(), gain, offset, eps=1e-6).to(x.dtype) + return norm * (1 + scale)[:, None, :] + shift[:, None, :] diff --git a/benchmarks/models/qwenimage/plot_adaln_audit.py b/benchmarks/models/qwenimage/plot_adaln_audit.py index 58e7e40da..ed7157e29 100644 --- a/benchmarks/models/qwenimage/plot_adaln_audit.py +++ b/benchmarks/models/qwenimage/plot_adaln_audit.py @@ -17,7 +17,16 @@ p = argparse.ArgumentParser() p.add_argument("directory", type=Path) a = p.parse_args() -modes = ["native", "cublas_policy", "fixed", "vllm_local", "sglang_local", "megatron_local"] +modes = [ + "native", + "cublas_policy", + "fixed", + "vllm_local", + "sglang_local", + "megatron_local", + "vllm_liger", + "vllm_flashattn", +] labels = [ "Native", "cuBLAS policy", @@ -25,6 +34,8 @@ "vLLM GEMM adapter", "SGLang GEMM adapter", "Megatron GEMM adapter", + "vLLM + Liger adapter", + "vLLM + flash-attn LN adapter", ] keys = [(s, "torch." + d) for d in ["bfloat16", "float32"] for s, _ in STREAMS] reports = {} @@ -180,6 +191,7 @@ lines += [ "", "Latency includes Python launch gaps; separate processes.", + "Small-batch final: S=33; large-batch final: S=3.", "Raw samples include fwd, bwd, total and peak memory.", "FP64 uses explicit storage casts and straight-through VJP.", "Strict elementwise tolerance results: *-accuracy.json.", diff --git a/benchmarks/models/qwenimage/streams.py b/benchmarks/models/qwenimage/streams.py index 4167ce8cb..7a1b147d8 100644 --- a/benchmarks/models/qwenimage/streams.py +++ b/benchmarks/models/qwenimage/streams.py @@ -1,8 +1,9 @@ # SPDX-License-Identifier: Apache-2.0 """Checkpoint streams shared by the evidence runners, validator and plots.""" -# Checkpoint tensors exercised per stream: block-0 image and text projections. +# Checkpoint tensors exercised per stream: block-0 projections and final modulation. STREAMS = ( ("image", "transformer_blocks.0.img_mod.1"), ("text", "transformer_blocks.0.txt_mod.1"), + ("final", "norm_out.linear"), ) diff --git a/benchmarks/models/qwenimage/validate_adaln_repair.py b/benchmarks/models/qwenimage/validate_adaln_repair.py index c3309f5d3..2d23b1b91 100644 --- a/benchmarks/models/qwenimage/validate_adaln_repair.py +++ b/benchmarks/models/qwenimage/validate_adaln_repair.py @@ -7,13 +7,13 @@ from benchmarks.models.qwenimage.streams import STREAMS -# Checks per (stream, dtype) case. +# Checks per (stream, dtype) case; final modulation adds long-sequence cases. CHECKS_PER_CASE = { - "accuracy": {"image": 2, "text": 2}, - "accuracy_large": {"image": 2, "text": 2}, - "bi": {"image": 402, "text": 402}, - "workload": {"image": 15, "text": 15}, - "parameters": {"image": 21, "text": 21}, + "accuracy": {"image": 2, "text": 2, "final": 5}, + "accuracy_large": {"image": 2, "text": 2, "final": 2}, + "bi": {"image": 402, "text": 402, "final": 408}, + "workload": {"image": 15, "text": 15, "final": 15}, + "parameters": {"image": 21, "text": 21, "final": 21}, } p = argparse.ArgumentParser() diff --git a/build_tools/extensions.py b/build_tools/extensions.py index bce062253..56b56b163 100644 --- a/build_tools/extensions.py +++ b/build_tools/extensions.py @@ -239,6 +239,7 @@ def get_extensions(): cuda_sources.extend( [ "csrc/cuda/model_specific/qwenimage/det_linear.cu", + "csrc/cuda/model_specific/qwenimage/token_sum.cu", ] ) # This source contains NVIDIA PTX (cp.async, ldmatrix, and mma.sync). diff --git a/csrc/bindings/ops.cpp b/csrc/bindings/ops.cpp index f29fb5abb..a8b30db38 100644 --- a/csrc/bindings/ops.cpp +++ b/csrc/bindings/ops.cpp @@ -11,6 +11,7 @@ torch::Tensor qwenimage_det_linear_backward_bias(torch::Tensor, c10::ScalarType) std::vector qwenimage_det_linear_forward(torch::Tensor, torch::Tensor, c10::optional, int64_t, bool); torch::Tensor qwenimage_det_linear_backward_input(torch::Tensor, torch::Tensor, c10::ScalarType); std::vector qwenimage_det_linear_backward_weight(torch::Tensor, torch::Tensor, c10::ScalarType, bool); +torch::Tensor qwenimage_token_sum(torch::Tensor); #endif // Fused LogP Declarations @@ -515,6 +516,7 @@ PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { m.def("qwenimage_det_linear_forward", &qwenimage_det_linear_forward); m.def("qwenimage_det_linear_backward_input", &qwenimage_det_linear_backward_input); m.def("qwenimage_det_linear_backward_weight", &qwenimage_det_linear_backward_weight); + m.def("qwenimage_token_sum", &qwenimage_token_sum); m.def("qwenimage_strict_math_compiled", &qwenimage_strict_math_compiled); m.def("qwenimage_det_linear_backward_bias", &qwenimage_det_linear_backward_bias); #endif diff --git a/csrc/cuda/model_specific/qwenimage/token_sum.cu b/csrc/cuda/model_specific/qwenimage/token_sum.cu new file mode 100644 index 000000000..8311aedfd --- /dev/null +++ b/csrc/cuda/model_specific/qwenimage/token_sum.cu @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright (c) 2026 RL-Kernel Contributors +#include +#include +#include +#include + +namespace { +// Recursive fixed 32-token balanced trees. Each +// sample/channel has its own sequence; batching never changes the tree. +__global__ void token_partials(const float* x, float* p, int64_t seq, int64_t hidden, + int64_t tiles) { + const int64_t h = blockIdx.x * blockDim.x + threadIdx.x; + const int64_t tile = blockIdx.y; + const int64_t batch = blockIdx.z; + if (h >= hidden) return; + float v[32]; +#pragma unroll + for (int i = 0; i < 32; ++i) { + int64_t row = tile * 32 + i; + v[i] = row < seq ? x[(batch * seq + row) * hidden + h] : 0.0f; + } +#pragma unroll + for (int stride = 1; stride < 32; stride *= 2) { +#pragma unroll + for (int i = 0; i < 32; i += 2 * stride) v[i] = __fadd_rn(v[i], v[i + stride]); + } + p[(batch * tiles + tile) * hidden + h] = v[0]; +} + +} + +torch::Tensor qwenimage_token_sum(torch::Tensor x) { +#ifdef __FAST_MATH__ + TORCH_CHECK(false, "Qwen-Image requires a build without fast math"); +#endif + TORCH_CHECK(x.is_cuda() && x.scalar_type() == at::kFloat && x.dim() == 3 && x.is_contiguous(), + "token_sum requires contiguous CUDA float32 [B,S,H]"); + const auto b = x.size(0), s = x.size(1), h = x.size(2); + TORCH_CHECK(b > 0 && b <= 65535 && s > 0 && s <= 32 * 65535 && h > 0, + "token_sum geometry out of bounds"); + const c10::cuda::CUDAGuard guard(x.device()); + auto current = x; + auto stream = at::cuda::getCurrentCUDAStream(); + int64_t rows = s; + while (rows > 1) { + const auto tiles = (rows + 31) / 32; + auto partials = torch::empty({b, tiles, h}, x.options()); + token_partials<<>>( + current.data_ptr(), partials.data_ptr(), rows, h, tiles); + C10_CUDA_KERNEL_LAUNCH_CHECK(); + current = partials; + rows = tiles; + } + return current.view({b, h}); +} diff --git a/docs/.nav.yml b/docs/.nav.yml index 2e2aa6e71..aa184cdb5 100644 --- a/docs/.nav.yml +++ b/docs/.nav.yml @@ -17,6 +17,7 @@ nav: - Operators: - operators/README.md - operators/qwenimage-adaln-mod-projection.md + - operators/qwenimage-final-adaln-out.md - operators/activation.md - operators/attention.md - operators/fused-logp.md diff --git a/docs/operators/README.md b/docs/operators/README.md index c3de2fdb5..0dadfb4b2 100644 --- a/docs/operators/README.md +++ b/docs/operators/README.md @@ -33,4 +33,5 @@ Every operator page should include: - [Sampling](sampling.md) - [Token Embedding](embedding.md) - [Qwen-Image AdaLN Modulation Projection](qwenimage-adaln-mod-projection.md) +- [Qwen-Image Final AdaLN Output](qwenimage-final-adaln-out.md) - [Operator Doc Template](../contributing/operator-doc-template.md) diff --git a/docs/operators/qwenimage-final-adaln-out.md b/docs/operators/qwenimage-final-adaln-out.md new file mode 100644 index 000000000..47f80c0dc --- /dev/null +++ b/docs/operators/qwenimage-final-adaln-out.md @@ -0,0 +1,64 @@ +# Qwen-Image final AdaLN output (CUDA) + +> Status: validated on B200 (SM100). Accuracy, batch-invariance, reuse-survey and timing evidence, with reproduction commands, is in [B200 evidence](../usage/evidence/qwenimage-final-adaln-out-b200/README.md). + +RFC #386 `final_adaln_out`, registered as `qwenimage_final_adaln_out`. This covers +`norm_out` only; the subsequent 3072→64 `proj_out` belongs to `latent_proj_gemm`. + +## Interface and formula + +```python +from rl_engine.runtime.registry import KernelRegistry + +op = KernelRegistry().get_op("qwenimage_final_adaln_out", device=x.device) +y = op(x=x, temb=temb, weight=weight, bias=bias) +trace = op.implementation_info(x=x, temb=temb, weight=weight, bias=bias) +``` + +- `x`: `[B,S,3072]`; `temb`: `[B,3072]`. +- `weight`: `[6144,3072]`; `bias`: `[6144]`. +- Output: `[B,S,3072]`. B and S must be positive. +- All inputs share a CUDA device and BF16/FP32 dtype. Gradients are provided for + all four inputs. First-order autograd only. + +The formula is `LayerNorm(x) * (1 + scale) + shift`, with `scale, shift` from +`Linear(SiLU(temb)).chunk(2)`. LayerNorm uses eps=1e-6 and **no learned affine**; +H3's RMSNorm and `(shift, scale)` order are not interchangeable with this op. + +## Rounding and deterministic gradients + +Projection uses the [shared conditioning implementation](qwenimage-adaln-mod-projection.md). +The final operator is deliberately unfused: native CUDA LayerNorm computes in +FP32, then stores the normalized values in the execution dtype. Separate +execution-dtype stores occur after `1 + scale`, multiplication, and addition. +Those BF16 stores are part of the forward contract, and the reference models +each one. This is not a claim of bitwise equality to arbitrary Diffusers/cuBLAS +versions; strict training and rollout must both bind this same operator. + +Backward uses FP32 intermediates and straight-through derivatives at storage +rounding boundaries. Native LayerNorm backward computes `dx`; scale/shift +contributions reduce over S with recursively balanced 32-token FP32 trees. +The independent CPU reference uses sequential Neumaier summation over tokens +in FP32 (or FP64 for diagnostics). This also retains small contributions under +cancellation, independently of the unchanged CUDA token tree. There are no atomics +or collective reductions. The projection receives FP32 +table gradients before the final casts to leaf dtypes. Batch size/position does +not alter a sample's token reduction tree. + +Readback identifies the native LayerNorm and elementwise stages, CUDA projection +kernel, recursive token-sum tree, dtype, device, and lack of fallback. No fused +kernel or speedup over the native composition is claimed. + +## Supported scope and evidence + +Standard Phase A image stream only; no edit `modulate_index`, additional +conditioning, distributed execution, or output projection. NVIDIA SM80+ code, +with measured validation limited to B200/SM100. Missing/fast-math builds and +unsupported inputs fail explicitly. + +Tests cover token counts 4096, 6889 and 6032, short cases, tile boundaries, +noncontiguous inputs, forward/backward accuracy, sample batching, repeatability, +parameter contribution ordering, and device isolation. Reports retain existing +tolerances and include FP64 diagnostics of the CPU FP32 reference. + +See [B200 evidence and reproduction](../usage/evidence/qwenimage-final-adaln-out-b200/README.md). diff --git a/rl_engine/_C.pyi b/rl_engine/_C.pyi index 4fb9ab443..f3e3589c4 100644 --- a/rl_engine/_C.pyi +++ b/rl_engine/_C.pyi @@ -345,5 +345,6 @@ def qwenimage_det_linear_backward_weight( out_dtype: torch.dtype, with_bias: bool, ) -> list[torch.Tensor]: ... +def qwenimage_token_sum(x: torch.Tensor) -> torch.Tensor: ... def qwenimage_strict_math_compiled() -> bool: ... def qwenimage_det_linear_backward_bias(grad: torch.Tensor, dtype: torch.dtype) -> torch.Tensor: ... diff --git a/rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py b/rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py index 273fdc971..57a902cbe 100644 --- a/rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py +++ b/rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py @@ -18,6 +18,7 @@ "qwenimage_det_linear_backward_weight", # Introduced with v2; reject stale v1 extensions with uncompensated dW/db. "qwenimage_det_linear_backward_bias", + "qwenimage_token_sum", "qwenimage_strict_math_compiled", ) diff --git a/rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py b/rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py new file mode 100644 index 000000000..8507cb323 --- /dev/null +++ b/rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py @@ -0,0 +1,72 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors +"""Unfused strict final modulation using native CUDA LayerNorm and fixed sums.""" + +import torch +from torch.autograd.function import once_differentiable + +from rl_engine.backends.extension import _C +from rl_engine.reference.model_specific.qwenimage.final_adaln_out import EPS, HIDDEN, validate_final + +from .adaln_mod_projection import ( + implementation_info, + projection_backward, + projection_forward, + require_device, + require_extension, +) + + +class _Final(torch.autograd.Function): + @staticmethod + def forward(ctx, x, temb, weight, bias): + table, act = projection_forward(temb, weight, bias) + scale, shift = table.chunk(2, -1) + xf = x.float().contiguous() + norm, mean, rstd = torch.native_layer_norm(xf, (HIDDEN,), None, None, EPS) + norm = norm.to(x.dtype) + gain = 1 + scale + out = norm * gain[:, None, :] + shift[:, None, :] + ctx.save_for_backward(xf, mean, rstd, norm, gain, temb, act, weight) + ctx.dtype = x.dtype + return out + + @staticmethod + @once_differentiable + def backward(ctx, grad): + xf, mean, rstd, norm, gain, temb, act, weight = ctx.saved_tensors + gf = grad.float().contiguous() + dn = (gf * gain.float()[:, None, :]).contiguous() + dx = torch.ops.aten.native_layer_norm_backward( + dn, xf, (HIDDEN,), mean, rstd, None, None, (True, False, False) + )[0] + ds = _C.qwenimage_token_sum((gf * norm.float()).contiguous()) + db = _C.qwenimage_token_sum(gf) + dt, dw, dbias = projection_backward(torch.cat((ds, db), -1), temb, act, weight) + return dx.to(ctx.dtype), dt, dw, dbias + + +class QwenImageFinalAdaLNOutCudaOp: + op_class = "reduction" + kernel_id = "qwenimage_det_linear+aten.native_layer_norm+aten.mul+aten.add" + + def __init__(self): + require_extension() + + def forward(self, x, temb, weight, bias): + validate_final(x, temb, weight, bias) + require_device(x) + return _Final.apply(x, temb, weight, bias) + + __call__ = forward + + def implementation_info(self, x, temb, weight, bias): + validate_final(x, temb, weight, bias) + info = implementation_info("qwenimage_final_adaln_out", x) + info.update( + norm="aten.native_layer_norm[fp32,eps=1e-6]", + token_gradient_tree="recursive_32_token_balanced", + cast_boundaries="silu,projection,norm,1+scale,product,output", + fused=False, + ) + return info diff --git a/rl_engine/reference/model_specific/qwenimage/final_adaln_out.py b/rl_engine/reference/model_specific/qwenimage/final_adaln_out.py new file mode 100644 index 000000000..45a399877 --- /dev/null +++ b/rl_engine/reference/model_specific/qwenimage/final_adaln_out.py @@ -0,0 +1,79 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors +"""Qwen-Image final LayerNorm modulation; excludes the output projection.""" + +import torch +import torch.nn.functional as F + +from .adaln_mod_projection import HIDDEN, reference_projection, round_boundary, validate_projection + +EPS = 1e-6 + + +def validate_final(x, temb, weight, bias): + validate_projection(temb, weight, bias, 2) + if x.ndim != 3 or x.shape[0] != temb.shape[0] or x.shape[1] < 1 or x.shape[2] != HIDDEN: + raise ValueError("x must be [B,S,3072], S > 0, with the temb batch size") + if x.dtype != temb.dtype: + raise TypeError("x and temb must share a dtype") + if x.device != temb.device: + raise ValueError("all inputs must be on the same device") + + +def _reference_token_sum(values): + # Independent sequential Neumaier sum, not the CUDA 32-token tree. + # Keep the requested FP32/FP64 arithmetic; long cancellation-heavy sums + # otherwise make the reference itself an unreliable tolerance oracle. + total = torch.zeros_like(values[:, 0]) + correction = torch.zeros_like(total) + for value in values.unbind(1): + next_total = total + value + error = torch.where( + total.abs() >= value.abs(), + (total - next_total) + value, + (value - next_total) + total, + ) + correction = correction + error + total = next_total + return total + correction + + +class _ReferenceModulate(torch.autograd.Function): + @staticmethod + def forward(ctx, norm, scale, shift, dtype): + gain = round_boundary(1 + scale, dtype) + ctx.save_for_backward(norm, gain) + product = round_boundary(norm * gain[:, None, :], dtype) + return round_boundary(product + shift[:, None, :], dtype) + + @staticmethod + def backward(ctx, grad): + norm, gain = ctx.saved_tensors + return ( + grad * gain[:, None, :], + _reference_token_sum(grad * norm), + _reference_token_sum(grad), + None, + ) + + +def reference_final(x, temb, weight, bias, execution_dtype): + scale, shift = reference_projection(temb, weight, bias, execution_dtype).chunk(2, -1) + norm = round_boundary(F.layer_norm(x, (HIDDEN,), eps=EPS), execution_dtype) + return _ReferenceModulate.apply(norm, scale, shift, execution_dtype) + + +class QwenImageFinalAdaLNOutReference: + op_class = "reduction" + kernel_id = "pytorch.qwenimage.final_adaln_out.reference" + + def forward(self, x, temb, weight, bias): + validate_final(x, temb, weight, bias) + scale, shift = F.linear(F.silu(temb), weight, bias).chunk(2, -1) + return F.layer_norm(x, (HIDDEN,), eps=EPS) * (1 + scale)[:, None, :] + shift[:, None, :] + + __call__ = forward + + def forward_fp32(self, x, temb, weight, bias): + validate_final(x, temb, weight, bias) + return reference_final(x.float(), temb.float(), weight.float(), bias.float(), x.dtype) diff --git a/rl_engine/runtime/registry.py b/rl_engine/runtime/registry.py index d24902853..db1815db6 100644 --- a/rl_engine/runtime/registry.py +++ b/rl_engine/runtime/registry.py @@ -112,10 +112,18 @@ class OpBackend(Enum, metaclass=_KernelEnumMeta): "rl_engine.backends.cuda.model_specific.qwenimage." "adaln_mod_projection.QwenImageAdaLNModProjectionCudaOp" ) + CUDA_QWENIMAGE_FINAL_ADALN_OUT = ( + "rl_engine.backends.cuda.model_specific.qwenimage." + "final_adaln_out.QwenImageFinalAdaLNOutCudaOp" + ) PYTORCH_QWENIMAGE_ADALN_MOD_PROJECTION = ( "rl_engine.reference.model_specific.qwenimage." "adaln_mod_projection.QwenImageAdaLNModProjectionReference" ) + PYTORCH_QWENIMAGE_FINAL_ADALN_OUT = ( + "rl_engine.reference.model_specific.qwenimage." + "final_adaln_out.QwenImageFinalAdaLNOutReference" + ) # Batch-invariant deterministic GEMM (WS1 #146) CUDA_DET_GEMM = "rl_engine.kernels.ops.cuda.matmul.det_gemm.DetGemmOp" TRITON_DET_GEMM = "rl_engine.kernels.ops.triton.matmul.det_gemm.TritonDetGemmOp" @@ -797,12 +805,19 @@ def __init__(self): # CUDA strict operators deliberately have no reference fallback. for platform in ("rocm", "npu", "musa"): self._priority_map[platform]["qwenimage_adaln_mod_projection"] = [] + self._priority_map[platform]["qwenimage_final_adaln_out"] = [] self._priority_map["cuda"]["qwenimage_adaln_mod_projection"] = [ OpBackend.CUDA_QWENIMAGE_ADALN_MOD_PROJECTION ] + self._priority_map["cuda"]["qwenimage_final_adaln_out"] = [ + OpBackend.CUDA_QWENIMAGE_FINAL_ADALN_OUT + ] self._priority_map["cpu"]["qwenimage_adaln_mod_projection"] = [ OpBackend.PYTORCH_QWENIMAGE_ADALN_MOD_PROJECTION ] + self._priority_map["cpu"]["qwenimage_final_adaln_out"] = [ + OpBackend.PYTORCH_QWENIMAGE_FINAL_ADALN_OUT + ] logger.info(f"KernelRegistry initialized for {device_ctx.device_type}") self._adjust_priority_for_hardware() self._adjust_priority_from_env() diff --git a/rl_engine/validation/operators/operator_inputs.py b/rl_engine/validation/operators/operator_inputs.py index 00a33b1bb..fe93717e2 100644 --- a/rl_engine/validation/operators/operator_inputs.py +++ b/rl_engine/validation/operators/operator_inputs.py @@ -26,6 +26,7 @@ def make_operator_inputs( ) -> dict[str, Any]: builders = { "qwenimage_adaln_mod_projection": _make_qwenimage_projection_inputs, + "qwenimage_final_adaln_out": _make_qwenimage_final_inputs, "rms_norm": _make_rms_norm_inputs, "qk_norm": _make_qk_norm_inputs, "pack": _make_pack_inputs, @@ -55,6 +56,7 @@ def operator_shape_name(op_name: str, args: argparse.Namespace) -> str: vocab = _arg_int(args, "vocab", DEFAULT_VOCAB) names = { "qwenimage_adaln_mod_projection": f"{batch}x3072x18432", + "qwenimage_final_adaln_out": f"{batch}x{seq}x3072", "rms_norm": f"{batch}x{seq}x{_normalized_dim(args)}", "qk_norm": f"{batch}x{seq}x{_arg_int(args, 'n_heads', DEFAULT_N_HEADS)}x" f"{_arg_int(args, 'head_dim', DEFAULT_HEAD_DIM)}", @@ -411,3 +413,10 @@ def _qwenimage_inputs(args, dtype, device, multiplier): def _make_qwenimage_projection_inputs(args, dtype, device): return _qwenimage_inputs(args, dtype, device, 6) + + +def _make_qwenimage_final_inputs(args, dtype, device): + inputs = _qwenimage_inputs(args, dtype, device, 2) + batch, seq = _batch_seq(args) + inputs["x"] = _floating_tensor((batch, seq, 3072), args, dtype, device, offset=3) + return inputs diff --git a/rl_engine/validation/operators/operator_specs.py b/rl_engine/validation/operators/operator_specs.py index 67a901784..f4b93428d 100644 --- a/rl_engine/validation/operators/operator_specs.py +++ b/rl_engine/validation/operators/operator_specs.py @@ -48,6 +48,22 @@ def _load_object(path: str) -> Any: }, grad_input_names=("temb", "weight", "bias"), ), + "qwenimage_final_adaln_out": OperatorSpec( + name="qwenimage_final_adaln_out", + op_class="reduction", + gold_path=( + "rl_engine.reference.model_specific.qwenimage." + "final_adaln_out.QwenImageFinalAdaLNOutReference" + ), + gold_method="forward_fp32", + candidate_paths={ + "cuda": ( + "rl_engine.backends.cuda.model_specific.qwenimage." + "final_adaln_out.QwenImageFinalAdaLNOutCudaOp" + ) + }, + grad_input_names=("x", "temb", "weight", "bias"), + ), "rms_norm": OperatorSpec( name="rms_norm", op_class="reduction", diff --git a/tests/models/qwenimage/test_adaln.py b/tests/models/qwenimage/test_adaln.py index fd832fcad..8066a901d 100644 --- a/tests/models/qwenimage/test_adaln.py +++ b/tests/models/qwenimage/test_adaln.py @@ -5,11 +5,15 @@ from rl_engine.backends.cuda.model_specific.qwenimage.adaln_mod_projection import ( QwenImageAdaLNModProjectionCudaOp, ) +from rl_engine.backends.cuda.model_specific.qwenimage.final_adaln_out import ( + QwenImageFinalAdaLNOutCudaOp, +) from rl_engine.contracts.numerical import load_contract from rl_engine.reference.model_specific.qwenimage.adaln_mod_projection import reference_projection +from rl_engine.reference.model_specific.qwenimage.final_adaln_out import reference_final pytestmark = pytest.mark.skipif(not torch.cuda.is_available(), reason="CUDA required") -KINDS = ["projection"] +KINDS = ["projection", "final"] def equal_bytes(left, right): @@ -30,14 +34,20 @@ def rand(shape, scale=1): args = { "temb": rand((batch, 3072)), - "weight": rand((6 * 3072, 3072), 0.02), - "bias": rand((6 * 3072,), 0.01), + "weight": rand(((6 if kind == "projection" else 2) * 3072, 3072), 0.02), + "bias": rand(((6 if kind == "projection" else 2) * 3072,), 0.01), } + if kind == "final": + args["x"] = rand((batch, seq, 3072)) return args def operator(kind): - return QwenImageAdaLNModProjectionCudaOp() + return ( + QwenImageAdaLNModProjectionCudaOp() + if kind == "projection" + else QwenImageFinalAdaLNOutCudaOp() + ) def random_upstream(y, seed=127): @@ -68,7 +78,7 @@ def assert_accurate(actual, expected, dtype, judgment): def test_cpu_reference_all_gradients(kind, dtype, seq): args = inputs(kind, dtype, seq=seq) gold = {k: v.detach().cpu().float().requires_grad_() for k, v in args.items()} - ref = reference_projection + ref = reference_projection if kind == "projection" else reference_final y = operator(kind)(**args) gy = ref(**gold, execution_dtype=dtype) grad = random_upstream(y) @@ -102,6 +112,25 @@ def test_batch_position_and_repeat_bytes(kind, dtype): assert equal_bytes(sg[k], grads[k][order]), (k, order) +@pytest.mark.parametrize("seq", [4096, 6889, 6032]) +@pytest.mark.parametrize("dtype", [torch.float32, torch.bfloat16]) +@pytest.mark.parametrize("seed", [0, 127, 2026]) +def test_long_sequence_gradients(seq, dtype, seed): + args = inputs("final", dtype, batch=1, seq=seq) + gold = {k: v.detach().cpu().float().requires_grad_() for k, v in args.items()} + y = operator("final")(**args) + gy = reference_final(**gold, execution_dtype=dtype) + grad = random_upstream(y, seed) + a = torch.autograd.grad(y, tuple(args.values()), grad) + b = torch.autograd.grad(gy, tuple(gold.values()), grad.float().cpu()) + assert_accurate(y, gy, dtype, "forward_accuracy") + for k, av, bv in zip(args, a, b): + try: + assert_accurate(av, bv, dtype, "gradient_accuracy") + except AssertionError as exc: + raise AssertionError(k) from exc + + @pytest.mark.parametrize("kind", KINDS) def test_noncontiguous(kind): args = inputs(kind, torch.bfloat16) @@ -162,7 +191,7 @@ def test_registry_and_gtest(kind): from rl_engine.validation.operators.op_checks import run_operator_suite from rl_engine.validation.operators.operator_specs import make_candidate, make_operator_case - name = "qwenimage_adaln_mod_projection" + name = "qwenimage_adaln_mod_projection" if kind == "projection" else "qwenimage_final_adaln_out" registry = KernelRegistry() op = registry.get_op(name, device="cuda:0") assert isinstance(op, type(operator(kind))) @@ -207,3 +236,14 @@ def test_projection_chunk_order(): out = operator("projection")(**args) for i, chunk in enumerate(out.chunk(6, -1)): assert equal_bytes(chunk, torch.full_like(chunk, i)) + + +def test_final_scale_then_shift_and_layernorm(): + args = inputs("final", torch.float32, batch=1) + args["weight"] = torch.zeros_like(args["weight"]) + args["bias"] = torch.cat( + [torch.full((3072,), 2.0, device="cuda"), torch.full((3072,), 7.0, device="cuda")] + ) + args["x"] = torch.full_like(args["x"], 13.0) + out = operator("final")(**args) + assert equal_bytes(out, torch.full_like(out, 7.0)) diff --git a/tests/models/qwenimage/test_reference.py b/tests/models/qwenimage/test_reference.py index 35c5963c4..151b33f24 100644 --- a/tests/models/qwenimage/test_reference.py +++ b/tests/models/qwenimage/test_reference.py @@ -32,4 +32,29 @@ def test_other_platform_slots_fail_closed(): registry = KernelRegistry() for platform in ("rocm", "npu", "musa"): - assert registry._priority_map[platform]["qwenimage_adaln_mod_projection"] == [] + for op in ("qwenimage_adaln_mod_projection", "qwenimage_final_adaln_out"): + assert registry._priority_map[platform][op] == [] + + +def test_reference_modulation_backward_against_fp64_autograd(): + from rl_engine.reference.model_specific.qwenimage.final_adaln_out import _ReferenceModulate + + gen = torch.Generator().manual_seed(2026) + norm = torch.randn(2, 257, 7, generator=gen, dtype=torch.float64, requires_grad=True) + scale = torch.randn(2, 7, generator=gen, dtype=torch.float64, requires_grad=True) + shift = torch.randn(2, 7, generator=gen, dtype=torch.float64, requires_grad=True) + assert torch.autograd.gradcheck( + lambda n, s, b: _ReferenceModulate.apply(n, s, b, torch.float64), + (norm, scale, shift), + fast_mode=True, + ) + + +def test_fp32_reference_retains_small_token_contributions(): + from rl_engine.reference.model_specific.qwenimage.final_adaln_out import _reference_token_sum + + values = torch.ones(1, 6032, 3, dtype=torch.float32) + values[:, 0] = 2**26 + values[:, -1] = -(2**26) + golden = values.double().sum(1).float() + assert torch.equal(_reference_token_sum(values), golden) From efeb3b9d57668371a2bb394ae3d49a5c3e794af3 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Sun, 11 Oct 2026 01:15:30 +0000 Subject: [PATCH 3/3] docs(qwenimage): add final AdaLN output B200 evidence Accuracy, batch-invariance, workload, parameter-gradient, reuse survey (vLLM, SGLang, Megatron, Liger and flash-attention compositions), timing and regression evidence from a clean checkout of 55f83d2b. --- .../qwenimage-final-adaln-out-b200/README.md | 165 + .../audit/accuracy.png | Bin 0 -> 145626 bytes .../audit/bi-summary.csv | 81 + .../audit/bi.png | Bin 0 -> 292745 bytes .../audit/cublas_policy-reuse.json | 4836 +++++++++++ .../audit/fixed-accuracy.json | 2502 ++++++ .../audit/fixed-accuracy_large.json | 1674 ++++ .../audit/fixed-reuse.json | 4836 +++++++++++ .../audit/fixed-workload.json | 1238 +++ .../audit/megatron_local-accuracy.json | 2503 ++++++ .../audit/megatron_local-accuracy_large.json | 1675 ++++ .../audit/megatron_local-reuse.json | 4837 +++++++++++ .../audit/megatron_local-workload.json | 1239 +++ .../audit/native-reuse.json | 4836 +++++++++++ .../audit/reuse.png | Bin 0 -> 370229 bytes .../audit/sglang_local-accuracy.json | 2502 ++++++ .../audit/sglang_local-accuracy_large.json | 1674 ++++ .../audit/sglang_local-reuse.json | 4836 +++++++++++ .../audit/sglang_local-workload.json | 1238 +++ .../audit/vllm_flashattn-accuracy.json | 1491 ++++ .../audit/vllm_flashattn-accuracy_large.json | 663 ++ .../audit/vllm_flashattn-reuse.json | 2085 +++++ .../audit/vllm_flashattn-workload.json | 471 ++ .../audit/vllm_liger-accuracy.json | 1490 ++++ .../audit/vllm_liger-accuracy_large.json | 662 ++ .../audit/vllm_liger-reuse.json | 2084 +++++ .../audit/vllm_liger-workload.json | 470 ++ .../audit/vllm_local-accuracy.json | 2502 ++++++ .../audit/vllm_local-accuracy_large.json | 1674 ++++ .../audit/vllm_local-reuse.json | 4836 +++++++++++ .../audit/vllm_local-workload.json | 1238 +++ .../qwenimage-final-adaln-out-b200/figure.png | Bin 0 -> 130243 bytes .../fixed/acceptance.json | 58 + .../fixed/accuracy-0.json | 2502 ++++++ .../fixed/accuracy-127.json | 2502 ++++++ .../fixed/accuracy-2026.json | 2502 ++++++ .../fixed/accuracy_large-0.json | 1674 ++++ .../fixed/accuracy_large-127.json | 1674 ++++ .../fixed/accuracy_large-2026.json | 1674 ++++ .../fixed/cancellation-screen.json | 451 + .../fixed/parameters-0.json | 1352 +++ .../fixed/workload-0.json | 1238 +++ .../prior-art.json | 1451 ++++ .../report.json | 7490 +++++++++++++++++ .../qwenimage-final-adaln-out-b200/tests.txt | 3 + 45 files changed, 84909 insertions(+) create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/README.md create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/accuracy.png create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/bi-summary.csv create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/bi.png create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/cublas_policy-reuse.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/fixed-accuracy.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/fixed-accuracy_large.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/fixed-reuse.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/fixed-workload.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/megatron_local-accuracy.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/megatron_local-accuracy_large.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/megatron_local-reuse.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/megatron_local-workload.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/native-reuse.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/reuse.png create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/sglang_local-accuracy.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/sglang_local-accuracy_large.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/sglang_local-reuse.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/sglang_local-workload.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/vllm_flashattn-accuracy.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/vllm_flashattn-accuracy_large.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/vllm_flashattn-reuse.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/vllm_flashattn-workload.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/vllm_liger-accuracy.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/vllm_liger-accuracy_large.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/vllm_liger-reuse.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/vllm_liger-workload.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/vllm_local-accuracy.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/vllm_local-accuracy_large.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/vllm_local-reuse.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/vllm_local-workload.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/figure.png create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/acceptance.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy-0.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy-127.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy-2026.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy_large-0.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy_large-127.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy_large-2026.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/cancellation-screen.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/parameters-0.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/workload-0.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/prior-art.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/report.json create mode 100644 docs/usage/evidence/qwenimage-final-adaln-out-b200/tests.txt diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/README.md b/docs/usage/evidence/qwenimage-final-adaln-out-b200/README.md new file mode 100644 index 000000000..5cb03a913 --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/README.md @@ -0,0 +1,165 @@ +# Qwen-Image final AdaLN output — B200 evidence + +Evidence for `qwenimage_final_adaln_out`. Every file here was produced from a +clean checkout of commit `55f83d2b9043f41dca84440d9002ca30f5d3fac4` (source tree +`911345cfc841f7bf86a66e66e72a39d9d80acbf3`) with one extension build (SHA256 +`5d1054db8bba…`). Each report records the commit, `clean_commit: true`, +per-file hashes of the Qwen-Image sources and the extension hash; the validator +rejects reports from different commits or builds. + +The runners at this commit cover all three conditioning streams, so the +projection streams (image/text, from `adaln_mod_projection`) are included and +re-validated here. The projection's reuse decision is documented in +[its evidence](../qwenimage-adaln-mod-projection-b200/README.md); this page +focuses on the final stream. + +## 1. Operator results + +[fixed/acceptance.json](fixed/acceptance.json) is **qualified, with zero failures**: + +| Gate | All streams | Final stream | +|---|---:|---:| +| Real-weight accuracy, seeds 0/127/2026, BF16/FP32 | 90/90 | 42/42 | +| Batch-invariance check records (raw bytes, signed zero included) | 2424/2424 | 816/816 | +| Full 4096-sample workload in chunks 7/64/257/1024/2048 | 90/90 | 30/30 | +| Shared-parameter repeat and ordered zero-padding (B=1/255/256/257/2048) | 126/126 | 42/42 | +| Parameter-gradient cancellation screen | 8/8 | — | +| Qwen-Image, registry/gtest, tolerance, build and layout tests | [135 passed](tests.txt), no skips | | + +- Final accuracy covers B=1/3 at S=3, B=1 at S=4096/6889/6032, and B=256/2048 + at S=3. Every output and gradient (`x`, `temb`, `weight`, `bias`) is checked + against independent CPU FP32 and FP64 references at the unchanged repository + `reduction` tolerances. +- [report.json](report.json) adds an FP64 diagnostic for FP32 final cases: both + the CUDA gradients and the CPU FP32 reference pass against FP64 (4/4). +- Batch invariance compares a singleton with every row of B=64/257/2048, dense + and power-of-two-boundary batch sweeps, row position and reversal, and B=2 + versus B=1 at S=31/32/33/4096/6889/6032. +- The CPU reference sums tokens with sequential Neumaier summation; a 128-token + blocked sum previously lost small contributions under cancellation + (`tests/models/qwenimage/test_reference.py::test_fp32_reference_retains_small_token_contributions`). +- The regression run used two GPUs, so device-isolation tests executed. + +### Unfused cost versus native PyTorch (BF16, B=1) + +Strict operator / native PyTorch composition, median ms; peak is the allocator +increment above live inputs (MiB). 3 warmups and 10 alternating samples. +Sub-millisecond intervals include host launch gaps and vary between runs. + +| Workload | Forward | Backward | Forward + backward | Peak MiB | +|---|---:|---:|---:|---:| +| final, S=6889 | 0.258 / 0.158 | 0.782 / 0.645 | 0.979 / 0.802 | 605.5 / 350.4 | + +![B200 timing comparison](figure.png) + +The operator keeps FP32 normalization state and explicit intermediates, so it +uses more memory than the native composition. No speedup is claimed. + +## 2. Reuse survey (final stream) + +Each candidate composes an existing batch-invariant projection with an existing +LayerNorm; modulation uses native autograd. Raw reports are in [audit/](audit/); +per-row BI counts are in [bi-summary.csv](audit/bi-summary.csv). + +| Candidate | Failed BI records / 816 | Singleton d_temb rows | BF16 d_weight violations, S=6889 | FP32 B=2048 d_weight violations | +|---|---:|---:|---:|---:| +| PyTorch `F.linear` + `F.layer_norm` | 581 | 14008 / 14214 | — | — | +| PyTorch with cuBLAS workspace policy | 761 | 14199 / 14214 | — | — | +| vLLM persistent GEMM + `F.layer_norm` | 4 | 0 / 14214 | 40,442 | 74 | +| SGLang 0.5.21 persistent GEMM + `F.layer_norm` | 4 | 0 / 14214 | 40,442 | 74 | +| Megatron-LM `52fbcbc` persistent GEMM + `F.layer_norm` | 4 | 0 / 14214 | 40,442 | 74 | +| vLLM GEMM + Liger 0.8.4 LayerNorm | 5 | 0 / 14214 | 40,459 | 75 | +| vLLM GEMM + flash-attention `94e22c9` Triton LayerNorm | 5 | 0 / 14214 | 40,442 | 70 | +| **Fixed Qwen-Image CUDA** | **0** | **0 / 14214** | **0** | **0** | + +The persistent-GEMM compositions remove the per-row `temb` batch dependence; +every remaining BI failure is a long-sequence record (B=2 versus B=1 at +S=4096/6889/6032). All five compositions also exceed the BF16 tolerance for +`d_weight`/`d_bias` at S=4096/6889/6032 (24,000–40,000 elements) and at +B=256/2048. In these compositions the modulation backward, including its token +sums, runs through native autograd; the fixed operator accumulates those sums in +a fixed FP32 tree. Native and cuBLAS-policy compositions are batch-variant, so +their accuracy was not measured. + +Final stream, full forward + backward median ms: + +| Candidate | BF16 B=1, S=6889 | BF16 B=2048, S=3 | FP32 B=2048, S=3 | +|---|---:|---:|---:| +| PyTorch | 0.814 | 0.780 | 4.485 | +| vLLM / SGLang / Megatron GEMM | 1.481 / 1.475 / 1.487 | 4.003 / 4.030 / 4.004 | 8.013 / 7.984 / 8.008 | +| vLLM GEMM + Liger / flash-attention LayerNorm | 1.596 / 1.908 | 4.167 / 4.451 | 8.063 / 8.018 | +| Fixed CUDA | 0.968 | 61.918 | 68.591 | + +At B=1 the fixed operator is slower than native PyTorch but faster than every +reuse candidate; at large conditioning batches it is the slowest. No reuse +candidate passes accuracy. + +![Reuse timing and accuracy](audit/reuse.png) +![BI raw-byte mismatches](audit/bi.png) +![Strict FP64 acceptance](audit/accuracy.png) + +Libraries with no applicable implementation, checked by source: + +- FlashInfer `34bb66e`: `flashinfer/norm/__init__.py` + `fused_dit_residual_layernorm_scale_shift` (and the gated variants) fuse + LayerNorm with scale/shift, but are BF16 forward-only with no backward, so + they cannot serve training. +- CUTLASS `0b55a2f`, verl `1d367a4`, Miles `05bd9cb`, Vime `b9ecdf5`: + `git grep -iE 'img_mod|txt_mod|AdaLayerNormContinuous|adaln'` finds no AdaLN or + modulation operator. verl, Miles and Vime use vLLM/SGLang for rollout and + Megatron/FSDP for training; those paths are measured above. + +## Pins and environment + +- Checkpoint `Qwen/Qwen-Image@75e0b4be04f60ec59a75f475837eced720f823b6` + (`norm_out.linear` and both block-0 modulation tensors; SHA256 values in + `report.json`); Diffusers `d961a388fd02e4db38d17350c8dd9b8abe642e05`. +- PyTorch 2.13.0+cu130, CUDA 13.0, driver 580.126.20, B200 (SM100); TF32 off. +- SGLang 0.5.21 and Liger 0.8.4 installed into a separate `--target` + directory on `PYTHONPATH`. Megatron-LM and flash-attention are loaded from + source checkouts (`--megatron-src`, `--flash-attn-src`); reports record their + commits. + +## Reproduction + +From a clean checkout, writing outputs outside the tree: + +```bash +export PYTHONPATH=. MODEL= OUT= +KERNEL_ALIGN_USE_FAST_MATH=0 TORCH_CUDA_ARCH_LIST=10.0 python setup.py build_ext --inplace +python -m pytest tests/models/qwenimage tests/runtime/test_kernel_registry.py \ + tests/contracts/test_tolerance_contract.py tests/build/test_build_platform_collectives.py \ + tests/validation/operators/test_ws1_gtest_gpu.py tests/runtime/test_layout_compatibility.py -q +python benchmarks/models/qwenimage/adaln_evidence.py --model "$MODEL" \ + --output "$OUT/report.json" --repeats 10 --fp64-check +python benchmarks/models/qwenimage/adaln_prior_art.py --model "$MODEL" --output "$OUT/prior-art.json" +for seed in 0 127 2026; do for phase in accuracy accuracy_large; do + python benchmarks/models/qwenimage/adaln_reuse_bi_audit.py --mode fixed \ + --phase "$phase" --seed "$seed" --model "$MODEL" --output "$OUT/fixed/$phase-$seed.json" +done; done +for phase in bi workload parameters; do + python benchmarks/models/qwenimage/adaln_reuse_bi_audit.py --mode fixed \ + --phase "$phase" --model "$MODEL" --output "$OUT/fixed/$phase-0.json" +done +python benchmarks/models/qwenimage/adaln_parameter_screen.py --output "$OUT/fixed/cancellation-screen.json" +python benchmarks/models/qwenimage/validate_adaln_repair.py "$OUT/fixed" +# Reuse survey; modes: native cublas_policy fixed vllm_local sglang_local megatron_local +# vllm_liger vllm_flashattn; phases: reuse bi workload accuracy accuracy_large +python benchmarks/models/qwenimage/adaln_reuse_bi_audit.py --mode --phase \ + --model "$MODEL" --megatron-src --flash-attn-src \ + --output "$OUT/audit/-.json" +# Plots (needs matplotlib): +python benchmarks/models/qwenimage/plot_adaln_evidence.py "$OUT/report.json" "$OUT/figure.png" +python benchmarks/models/qwenimage/plot_adaln_audit.py "$OUT/audit" +``` + +Raw per-row BI dumps (about 0.6 MB per run) are not checked in; their totals +are in `fixed/acceptance.json` and `audit/bi-summary.csv`. + +## Scope + +Isolated Phase A operator with first-order autograd, single-GPU CUDA on B200. +It covers `norm_out` only; the later 3072→64 `proj_out` belongs to +`latent_proj_gemm`. Long token lengths and large batches are covered +separately, not every B×S combination. No full-model, LoRA, distributed, +other-architecture or ROCm claim is made. diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/accuracy.png b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/accuracy.png new file mode 100644 index 0000000000000000000000000000000000000000..62ee7927771cbf09d1205ea5ddb123dd053c3294 GIT binary patch literal 145626 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 Hzr6NukBPFu literal 0 HcmV?d00001 diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/bi-summary.csv b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/bi-summary.csv new file mode 100644 index 000000000..effe150c9 --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/bi-summary.csv @@ -0,0 +1,81 @@ +mode,stream,dtype,metric,bad,total +native,image,torch.bfloat16,output_BI_rows,0,7107 +native,text,torch.bfloat16,output_BI_rows,0,7107 +native,final,torch.bfloat16,output_BI_rows,0,7107 +native,image,torch.float32,output_BI_rows,7107,7107 +native,text,torch.float32,output_BI_rows,7107,7107 +native,final,torch.float32,output_BI_rows,7107,7107 +cublas_policy,image,torch.bfloat16,output_BI_rows,0,7107 +cublas_policy,text,torch.bfloat16,output_BI_rows,0,7107 +cublas_policy,final,torch.bfloat16,output_BI_rows,0,7107 +cublas_policy,image,torch.float32,output_BI_rows,7107,7107 +cublas_policy,text,torch.float32,output_BI_rows,7107,7107 +cublas_policy,final,torch.float32,output_BI_rows,7107,7107 +fixed,image,torch.bfloat16,output_BI_rows,0,7107 +fixed,text,torch.bfloat16,output_BI_rows,0,7107 +fixed,final,torch.bfloat16,output_BI_rows,0,7107 +fixed,image,torch.float32,output_BI_rows,0,7107 +fixed,text,torch.float32,output_BI_rows,0,7107 +fixed,final,torch.float32,output_BI_rows,0,7107 +vllm_local,image,torch.bfloat16,output_BI_rows,0,7107 +vllm_local,text,torch.bfloat16,output_BI_rows,0,7107 +vllm_local,final,torch.bfloat16,output_BI_rows,0,7107 +vllm_local,image,torch.float32,output_BI_rows,0,7107 +vllm_local,text,torch.float32,output_BI_rows,0,7107 +vllm_local,final,torch.float32,output_BI_rows,0,7107 +sglang_local,image,torch.bfloat16,output_BI_rows,0,7107 +sglang_local,text,torch.bfloat16,output_BI_rows,0,7107 +sglang_local,final,torch.bfloat16,output_BI_rows,0,7107 +sglang_local,image,torch.float32,output_BI_rows,0,7107 +sglang_local,text,torch.float32,output_BI_rows,0,7107 +sglang_local,final,torch.float32,output_BI_rows,0,7107 +megatron_local,image,torch.bfloat16,output_BI_rows,0,7107 +megatron_local,text,torch.bfloat16,output_BI_rows,0,7107 +megatron_local,final,torch.bfloat16,output_BI_rows,0,7107 +megatron_local,image,torch.float32,output_BI_rows,0,7107 +megatron_local,text,torch.float32,output_BI_rows,0,7107 +megatron_local,final,torch.float32,output_BI_rows,0,7107 +vllm_liger,final,torch.bfloat16,output_BI_rows,0,7107 +vllm_liger,final,torch.float32,output_BI_rows,0,7107 +vllm_flashattn,final,torch.bfloat16,output_BI_rows,0,7107 +vllm_flashattn,final,torch.float32,output_BI_rows,0,7107 +native,image,torch.bfloat16,temb_BI_rows,6144,7107 +native,text,torch.bfloat16,temb_BI_rows,6144,7107 +native,final,torch.bfloat16,temb_BI_rows,6901,7107 +native,image,torch.float32,temb_BI_rows,7107,7107 +native,text,torch.float32,temb_BI_rows,7107,7107 +native,final,torch.float32,temb_BI_rows,7107,7107 +cublas_policy,image,torch.bfloat16,temb_BI_rows,7107,7107 +cublas_policy,text,torch.bfloat16,temb_BI_rows,7107,7107 +cublas_policy,final,torch.bfloat16,temb_BI_rows,7092,7107 +cublas_policy,image,torch.float32,temb_BI_rows,7107,7107 +cublas_policy,text,torch.float32,temb_BI_rows,7107,7107 +cublas_policy,final,torch.float32,temb_BI_rows,7107,7107 +fixed,image,torch.bfloat16,temb_BI_rows,0,7107 +fixed,text,torch.bfloat16,temb_BI_rows,0,7107 +fixed,final,torch.bfloat16,temb_BI_rows,0,7107 +fixed,image,torch.float32,temb_BI_rows,0,7107 +fixed,text,torch.float32,temb_BI_rows,0,7107 +fixed,final,torch.float32,temb_BI_rows,0,7107 +vllm_local,image,torch.bfloat16,temb_BI_rows,0,7107 +vllm_local,text,torch.bfloat16,temb_BI_rows,0,7107 +vllm_local,final,torch.bfloat16,temb_BI_rows,0,7107 +vllm_local,image,torch.float32,temb_BI_rows,0,7107 +vllm_local,text,torch.float32,temb_BI_rows,0,7107 +vllm_local,final,torch.float32,temb_BI_rows,0,7107 +sglang_local,image,torch.bfloat16,temb_BI_rows,0,7107 +sglang_local,text,torch.bfloat16,temb_BI_rows,0,7107 +sglang_local,final,torch.bfloat16,temb_BI_rows,0,7107 +sglang_local,image,torch.float32,temb_BI_rows,0,7107 +sglang_local,text,torch.float32,temb_BI_rows,0,7107 +sglang_local,final,torch.float32,temb_BI_rows,0,7107 +megatron_local,image,torch.bfloat16,temb_BI_rows,0,7107 +megatron_local,text,torch.bfloat16,temb_BI_rows,0,7107 +megatron_local,final,torch.bfloat16,temb_BI_rows,0,7107 +megatron_local,image,torch.float32,temb_BI_rows,0,7107 +megatron_local,text,torch.float32,temb_BI_rows,0,7107 +megatron_local,final,torch.float32,temb_BI_rows,0,7107 +vllm_liger,final,torch.bfloat16,temb_BI_rows,0,7107 +vllm_liger,final,torch.float32,temb_BI_rows,0,7107 +vllm_flashattn,final,torch.bfloat16,temb_BI_rows,0,7107 +vllm_flashattn,final,torch.float32,temb_BI_rows,0,7107 diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/bi.png b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/bi.png new file mode 100644 index 0000000000000000000000000000000000000000..12c01e0cac07d8d6cd2ab3908ea4d29fb49152d8 GIT binary patch literal 292745 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

-EHAsds<;-V>$ef!ohGBQ#g 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⩔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%0DapSJtyLTUb`VOj% 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 literal 0 HcmV?d00001 diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/acceptance.json b/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/acceptance.json new file mode 100644 index 000000000..a32c32c3c --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/acceptance.json @@ -0,0 +1,58 @@ +{ + "qualified": true, + "commit": "55f83d2b9043f41dca84440d9002ca30f5d3fac4", + "extension_sha256": "5d1054db8bba2eaedbd391d0c23b6683acea9ed04fcd64d6f369faed75aa9e0f", + "reports": [ + { + "file": "accuracy-0.json", + "checks": 18, + "failures": 0 + }, + { + "file": "accuracy-127.json", + "checks": 18, + "failures": 0 + }, + { + "file": "accuracy-2026.json", + "checks": 18, + "failures": 0 + }, + { + "file": "accuracy_large-0.json", + "checks": 12, + "failures": 0 + }, + { + "file": "accuracy_large-127.json", + "checks": 12, + "failures": 0 + }, + { + "file": "accuracy_large-2026.json", + "checks": 12, + "failures": 0 + }, + { + "file": "bi-0.json", + "checks": 2424, + "failures": 0 + }, + { + "file": "workload-0.json", + "checks": 90, + "failures": 0 + }, + { + "file": "parameters-0.json", + "checks": 126, + "failures": 0 + }, + { + "file": "cancellation-screen.json", + "checks": 8, + "failures": 0 + } + ], + "failures": [] +} diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy-0.json b/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy-0.json new file mode 100644 index 000000000..f625b5c97 --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy-0.json @@ -0,0 +1,2502 @@ +{ + "mode": "fixed", + "phase": "accuracy", + "accuracy_seed": 0, + "source": { + "base_sha": "55f83d2b9043f41dca84440d9002ca30f5d3fac4", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked_source_sha256": {}, + "workspace_source_sha256": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "qwenimage_source_sha256": { + "csrc/cuda/model_specific/qwenimage/det_linear.cu": "859da456b0c776f3492b3197c252866e33d9a7088508b701b7c4a179ee709afb", + "csrc/cuda/model_specific/qwenimage/token_sum.cu": "1aace24523ff95520ab5d482e2e0f17d09a2efcf93efc8de865c7bcc157cf3ba", + "rl_engine/backends/cuda/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py": "710df5416a2adf5b2576468ff63584b6699e6bdecd59906370049bf09f1b3286", + "rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py": "f6afe4b7568e2026c4b046a4fd0a02589f817d815198af33173d2dba61773f19", + "rl_engine/reference/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py": "1ebc740ddff575055ee66ed714a8c7cc5c6cee2701d582a665289e9ad1a4fe3d", + "rl_engine/reference/model_specific/qwenimage/final_adaln_out.py": "60441610c04d04d0fb1cd7320be8584e76772c110a3cfed77ddf826dbde9b53c", + "benchmarks/models/qwenimage/__init__.py": "a63ebc79ed10d9ed98484565a353438bd13f5801a8f51d7505d0921bf6942742", + "benchmarks/models/qwenimage/adaln_evidence.py": "9dc9f3da0069d36c602baef07d687fb1aeba8fda0163d17fc446e0a543fe1f3e", + "benchmarks/models/qwenimage/adaln_parameter_screen.py": "05562ef30d09296c2ccd1cdeb44085568b8c877d01f5fb1df4b983e84945ec03", + "benchmarks/models/qwenimage/adaln_prior_art.py": "647aa9fc81e02bf3c7806ed6c2a3e578fb3e1a0b000b4388a12367ef86de3139", + "benchmarks/models/qwenimage/adaln_reuse_bi_audit.py": "88dd3d390e647bbc883b76622309fad54dac3618630dcca0785e555db329a671", + "benchmarks/models/qwenimage/adaln_reuse_candidate.py": "4598f6db94462ac30f3bdd3defae16f0ce7a34ac59eb1996d18e86f498c029b6", + "benchmarks/models/qwenimage/plot_adaln_audit.py": "6151e6abccca8f647c2fbeadf92f12e43ed1c07954db9f2db2f035284cbd407c", + "benchmarks/models/qwenimage/plot_adaln_evidence.py": "16d6bed0ee5b808814c5f7157145a730750d0b1aaf94762e6f72a256e942c1e2", + "benchmarks/models/qwenimage/streams.py": "bd27383eee59404df295f724f6c7d620db3d3d7074c19dd94d51a711b38acf02", + "benchmarks/models/qwenimage/validate_adaln_repair.py": "8b663191323b455470a2313cdfefd837657441b300ffd0e0767453f9f407db03" + }, + "extension_sha256": "5d1054db8bba2eaedbd391d0c23b6683acea9ed04fcd64d6f369faed75aa9e0f", + "clean_commit": true + }, + "cases": [ + { + "stream": "image", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 1, + "errors": { + "output": 8.87784090909091e-05, + "temb": 0.002728983407362896, + "weight": 0.0024390243902439024, + "bias": 0.0 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.00390625, + "max_tolerance_ratio": 0.06242197006940842, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.06221199035644531, + "max_tolerance_ratio": 0.1368875354528427, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11635208129882812, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.00390625, + "max_tolerance_ratio": 0.06242197006940842, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0622100830078125, + "max_tolerance_ratio": 0.1368919014930725, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11635208129882812, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0009765625, + "max_tolerance_ratio": 0.01830160990357399, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 1.4685560017824173e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 1, + "errors": { + "output": 0.0003551136363636364, + "temb": 0.0013375396742077623, + "weight": 0.0031093047650859887, + "bias": 0.002188183807439825 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.17182131111621857, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0716552734375, + "max_tolerance_ratio": 0.14068613946437836, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0524444580078125, + "max_tolerance_ratio": 0.12155365198850632, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.0863557830452919, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.17182131111621857, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0716552734375, + "max_tolerance_ratio": 0.14069046080112457, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0524444580078125, + "max_tolerance_ratio": 0.12155365198850632, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.0863557830452919, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.00390625, + "max_tolerance_ratio": 0.057537395507097244, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 2.205422060796991e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 3.6503697629086673e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "image", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 1, + "errors": { + "output": 1.3014166961871354e-07, + "temb": 1.153164147293586e-07, + "weight": 1.1117015265884846e-07, + "bias": 0.0 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.016213035210967064, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 2.86102294921875e-06, + "max_tolerance_ratio": 0.0038795864675194025, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0017226141644641757, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.02731161192059517, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.019086167216300964, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0019029012182727456, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.022652268409729004, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.019896306097507477, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0017226141644641757, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 1, + "errors": { + "output": 1.3014166961871354e-07, + "temb": 4.9077917160244473e-08, + "weight": 1.2994655174549205e-07, + "bias": 3.3382900820853816e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.019917147234082222, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 2.86102294921875e-06, + "max_tolerance_ratio": 0.005751802586019039, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.005020510870963335, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.026717884466052055, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 8.58306884765625e-06, + "max_tolerance_ratio": 0.02837822213768959, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.006130983587354422, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 0.001235149335116148, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.023276854306459427, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 6.67572021484375e-06, + "max_tolerance_ratio": 0.03042229451239109, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.0069028763100504875, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 0.0012351492187008262, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 1, + "errors": { + "output": 0.000244140625, + "temb": 0.0025955522001601225, + "weight": 0.0024390243902439024, + "bias": 0.0 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.00390625, + "max_tolerance_ratio": 0.05624296888709068, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.061344146728515625, + "max_tolerance_ratio": 0.14143496751785278, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11635208129882812, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.00390625, + "max_tolerance_ratio": 0.05624296888709068, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.061344146728515625, + "max_tolerance_ratio": 0.14143496751785278, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11635208129882812, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.000244140625, + "max_tolerance_ratio": 0.004815564025193453, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 1.347583020105958e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 1, + "errors": { + "output": 0.00048828125, + "temb": 0.0019412816630083021, + "weight": 0.0031093047650859887, + "bias": 0.002188183807439825 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0078125, + "max_tolerance_ratio": 0.0914076715707779, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.06172370910644531, + "max_tolerance_ratio": 0.14143496751785278, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0524444580078125, + "max_tolerance_ratio": 0.12155365198850632, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.0863557830452919, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0078125, + "max_tolerance_ratio": 0.0914076715707779, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.06172370910644531, + "max_tolerance_ratio": 0.14143496751785278, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0524444580078125, + "max_tolerance_ratio": 0.12155365198850632, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.0863557830452919, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0009765625, + "max_tolerance_ratio": 0.018109379336237907, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 1.999356572923716e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 3.6503697629086673e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 1, + "errors": { + "output": 1.1891091396474316e-07, + "temb": 1.7003774219796067e-07, + "weight": 1.1117015265884846e-07, + "bias": 0.0 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.012777293100953102, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.0044348593801259995, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0017226141644641757, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.02376280352473259, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.027591371908783913, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0019029012182727456, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.021753035485744476, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 4.291534423828125e-06, + "max_tolerance_ratio": 0.025202572345733643, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0017226141644641757, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 1, + "errors": { + "output": 1.4863864245592894e-07, + "temb": 1.2646690406307395e-07, + "weight": 1.2994655174549205e-07, + "bias": 3.3382900820853816e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 2.384185791015625e-06, + "max_tolerance_ratio": 0.013556979596614838, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.006371223833411932, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.005020510870963335, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 3.2186508178710938e-06, + "max_tolerance_ratio": 0.02507016435265541, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 6.854534149169922e-06, + "max_tolerance_ratio": 0.04201856255531311, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.006130983587354422, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 0.001235149335116148, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 3.337860107421875e-06, + "max_tolerance_ratio": 0.022754820063710213, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 6.318092346191406e-06, + "max_tolerance_ratio": 0.03872999921441078, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.0069028763100504875, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 0.0012351492187008262, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 3, + "errors": { + "output": 0.0, + "x": 0.003379820097165924, + "temb": 0.0015368590992453142, + "weight": 0.0021521047494834234, + "bias": 0.003313623961515694 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.11869430541992188, + "max_tolerance_ratio": 0.14792892336845398, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.015459537506103516, + "max_tolerance_ratio": 0.08149861544370651, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.06183624267578125, + "max_tolerance_ratio": 0.14296706020832062, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.02972412109375, + "max_tolerance_ratio": 0.10770400613546371, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.11869430541992188, + "max_tolerance_ratio": 0.14792892336845398, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.015460014343261719, + "max_tolerance_ratio": 0.08150112628936768, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.06183624267578125, + "max_tolerance_ratio": 0.14296706020832062, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.02972412109375, + "max_tolerance_ratio": 0.10770400613546371, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 4.782179075846216e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 2.0120800400036387e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 4.4731414163834415e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 3, + "errors": { + "output": 0.0, + "x": 0.003379820097165924, + "temb": 0.002547106122521999, + "weight": 0.0027365798274600374, + "bias": 0.002239271121623488 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.11869430541992188, + "max_tolerance_ratio": 0.14792892336845398, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.025691986083984375, + "max_tolerance_ratio": 0.09676326811313629, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.1135711669921875, + "max_tolerance_ratio": 0.14814089238643646, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11876484751701355, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.11869430541992188, + "max_tolerance_ratio": 0.14792892336845398, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.025689125061035156, + "max_tolerance_ratio": 0.09675250947475433, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.1135711669921875, + "max_tolerance_ratio": 0.14814089238643646, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11876484751701355, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 4.782179075846216e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 2.9025261028436944e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 8.686409273650497e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 2.5911340344464406e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 4096, + "errors": { + "output": 0.0017006802721088435, + "x": 0.0030042075430387638, + "temb": 0.0021778555709870977, + "weight": 0.002575078377987739, + "bias": 0.0020581742025330982 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.2732240557670593, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.113616943359375, + "max_tolerance_ratio": 0.15306638181209564, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.964630126953125, + "max_tolerance_ratio": 0.1786586195230484, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.9852294921875, + "max_tolerance_ratio": 0.1907987743616104, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.4953765869140625, + "max_tolerance_ratio": 0.18161630630493164, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.3378378450870514, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.11361312866210938, + "max_tolerance_ratio": 0.15306125581264496, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.97003173828125, + "max_tolerance_ratio": 0.17965546250343323, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.9852294921875, + "max_tolerance_ratio": 0.1907987743616104, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.4953765869140625, + "max_tolerance_ratio": 0.18161630630493164, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.33557045459747314, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 1.0898160326178186e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0093231201171875, + "max_tolerance_ratio": 0.017987243831157684, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.07623291015625, + "max_tolerance_ratio": 0.07275641709566116, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0238037109375, + "max_tolerance_ratio": 0.043760742992162704, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 6889, + "errors": { + "output": 0.0016025641025641025, + "x": 0.002862032649958757, + "temb": 0.002264131115984061, + "weight": 0.0021627835134687442, + "bias": 0.003091684806700706 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.4166666865348816, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.122161865234375, + "max_tolerance_ratio": 0.1645151972770691, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 1.2017822265625, + "max_tolerance_ratio": 0.17906485497951508, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.99896240234375, + "max_tolerance_ratio": 0.19069354236125946, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.89208984375, + "max_tolerance_ratio": 0.18137826025485992, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.3378378450870514, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.12215805053710938, + "max_tolerance_ratio": 0.16451002657413483, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 1.19232177734375, + "max_tolerance_ratio": 0.17964541912078857, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.99896240234375, + "max_tolerance_ratio": 0.20765124261379242, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.89208984375, + "max_tolerance_ratio": 0.1837727129459381, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.4166666865348816, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 1.2333959602983668e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0142822265625, + "max_tolerance_ratio": 0.030629962682724, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.09305572509765625, + "max_tolerance_ratio": 0.1353081315755844, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.029052734375, + "max_tolerance_ratio": 0.07012274116277695, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 6032, + "errors": { + "output": 0.0016025641025641025, + "x": 0.0030914496352805717, + "temb": 0.0011800007469461404, + "weight": 0.002010986949117169, + "bias": 0.0029184732302849205 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.4166666865348816, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.12346649169921875, + "max_tolerance_ratio": 0.1662917137145996, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 1.45367431640625, + "max_tolerance_ratio": 0.18178261816501617, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.99615478515625, + "max_tolerance_ratio": 0.35692256689071655, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.9044189453125, + "max_tolerance_ratio": 0.18396203219890594, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.3378378450870514, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.12346649169921875, + "max_tolerance_ratio": 0.1662917137145996, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 1.45843505859375, + "max_tolerance_ratio": 0.1816277801990509, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.99615478515625, + "max_tolerance_ratio": 0.35692206025123596, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.9044189453125, + "max_tolerance_ratio": 0.18396203219890594, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.4166666865348816, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 1.0904316695814487e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.00726318359375, + "max_tolerance_ratio": 0.025921989232301712, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.09305953979492188, + "max_tolerance_ratio": 0.1028057336807251, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.029052734375, + "max_tolerance_ratio": 0.08268208056688309, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.float32", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 3, + "errors": { + "output": 1.8758709199713696e-07, + "x": 1.9712212946362973e-07, + "temb": 2.1871940956928353e-07, + "weight": 1.573244705925568e-07, + "bias": 9.062440719379816e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.004946949891746044, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.006536814384162426, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 2.384185791015625e-06, + "max_tolerance_ratio": 0.004848584532737732, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.008276660926640034, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.002739404793828726, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.008114404045045376, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.007908289320766926, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.01115299854427576, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.009138970635831356, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.430511474609375e-06, + "max_tolerance_ratio": 0.003541923826560378, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.008913637138903141, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.01000254787504673, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.6689300537109375e-06, + "max_tolerance_ratio": 0.012632080353796482, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.008276660926640034, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.430511474609375e-06, + "max_tolerance_ratio": 0.003381598275154829, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 3, + "errors": { + "output": 1.8758709199713696e-07, + "x": 1.9712212946362973e-07, + "temb": 2.183113118583169e-07, + "weight": 1.611449087501953e-07, + "bias": 8.098239180311436e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.0374017208814621, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.019900353625416756, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 2.384185791015625e-06, + "max_tolerance_ratio": 0.007614366244524717, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.022623050957918167, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.1324882507324219e-06, + "max_tolerance_ratio": 0.007297326810657978, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.020886709913611412, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.01948723755776882, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.02856154553592205, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.020053662359714508, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.430511474609375e-06, + "max_tolerance_ratio": 0.007229685317724943, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.01651504635810852, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.020023591816425323, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 4.5299530029296875e-06, + "max_tolerance_ratio": 0.03066845051944256, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.019367719069123268, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.010526997968554497, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 4096, + "errors": { + "output": 2.586346470076747e-07, + "x": 2.5353023475503127e-07, + "temb": 1.1988686288465126e-07, + "weight": 1.427930579588083e-07, + "bias": 1.0939646127220351e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.014880506321787834, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.014401393011212349, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 6.103515625e-05, + "max_tolerance_ratio": 0.23296727240085602, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.2789449989795685, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.11863362044095993, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.02018040232360363, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.020122215151786804, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.0001373291015625, + "max_tolerance_ratio": 0.3758883774280548, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.3350406587123871, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.12053177505731583, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.022597676143050194, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.02198362536728382, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.000152587890625, + "max_tolerance_ratio": 0.1429157555103302, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.21178868412971497, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.0741499587893486, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 6889, + "errors": { + "output": 2.444127728941933e-07, + "x": 2.293326922861262e-07, + "temb": 1.0843094261933183e-07, + "weight": 2.1649047974921416e-07, + "bias": 1.4702248660482713e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.014880506321787834, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.01567506045103073, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 6.103515625e-05, + "max_tolerance_ratio": 0.16676533222198486, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.5084660053253174, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.16391006112098694, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.02018040232360363, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.02245977334678173, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.29317495226860046, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.2818421721458435, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.814697265625e-05, + "max_tolerance_ratio": 0.14079761505126953, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.024555373936891556, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.021878523752093315, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.3590463399887085, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.4027182459831238, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 2.288818359375e-05, + "max_tolerance_ratio": 0.13646109402179718, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 6032, + "errors": { + "output": 2.444127728941933e-07, + "x": 2.715452632906025e-07, + "temb": 8.750923870237165e-08, + "weight": 2.017937926925124e-07, + "bias": 1.3969603016598244e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.014880506321787834, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.015311132185161114, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.0915708988904953, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.6872739791870117, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.24952450394630432, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.02018040232360363, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.02084014192223549, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.09533216059207916, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.7847014665603638, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.2850022315979004, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.024555373936891556, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.021719543263316154, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.11637149006128311, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.24204149842262268, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 2.288818359375e-05, + "max_tolerance_ratio": 0.08607399463653564, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + } + ], + "environment": { + "torch": "2.13.0+cu130", + "cuda": "13.0", + "gpu": "NVIDIA B200", + "workspace": { + "CUBLAS_WORKSPACE_CONFIG": null, + "CUBLASLT_WORKSPACE_SIZE": null + }, + "tf32": false + }, + "scope": "sample batch BI; final uses S=3 for large B, long S tested separately; shared parameter gradients: same ordered inputs, repeat only", + "packages": { + "torch": "2.13.0", + "triton": "3.7.1", + "diffusers": null, + "vllm": "0.30.0", + "sglang": "0.5.21", + "liger-kernel": "0.8.4", + "transformer_engine": null, + "megatron-core": null + } +} diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy-127.json b/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy-127.json new file mode 100644 index 000000000..45c2474cb --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy-127.json @@ -0,0 +1,2502 @@ +{ + "mode": "fixed", + "phase": "accuracy", + "accuracy_seed": 127, + "source": { + "base_sha": "55f83d2b9043f41dca84440d9002ca30f5d3fac4", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked_source_sha256": {}, + "workspace_source_sha256": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "qwenimage_source_sha256": { + "csrc/cuda/model_specific/qwenimage/det_linear.cu": "859da456b0c776f3492b3197c252866e33d9a7088508b701b7c4a179ee709afb", + "csrc/cuda/model_specific/qwenimage/token_sum.cu": "1aace24523ff95520ab5d482e2e0f17d09a2efcf93efc8de865c7bcc157cf3ba", + "rl_engine/backends/cuda/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py": "710df5416a2adf5b2576468ff63584b6699e6bdecd59906370049bf09f1b3286", + "rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py": "f6afe4b7568e2026c4b046a4fd0a02589f817d815198af33173d2dba61773f19", + "rl_engine/reference/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py": "1ebc740ddff575055ee66ed714a8c7cc5c6cee2701d582a665289e9ad1a4fe3d", + "rl_engine/reference/model_specific/qwenimage/final_adaln_out.py": "60441610c04d04d0fb1cd7320be8584e76772c110a3cfed77ddf826dbde9b53c", + "benchmarks/models/qwenimage/__init__.py": "a63ebc79ed10d9ed98484565a353438bd13f5801a8f51d7505d0921bf6942742", + "benchmarks/models/qwenimage/adaln_evidence.py": "9dc9f3da0069d36c602baef07d687fb1aeba8fda0163d17fc446e0a543fe1f3e", + "benchmarks/models/qwenimage/adaln_parameter_screen.py": "05562ef30d09296c2ccd1cdeb44085568b8c877d01f5fb1df4b983e84945ec03", + "benchmarks/models/qwenimage/adaln_prior_art.py": "647aa9fc81e02bf3c7806ed6c2a3e578fb3e1a0b000b4388a12367ef86de3139", + "benchmarks/models/qwenimage/adaln_reuse_bi_audit.py": "88dd3d390e647bbc883b76622309fad54dac3618630dcca0785e555db329a671", + "benchmarks/models/qwenimage/adaln_reuse_candidate.py": "4598f6db94462ac30f3bdd3defae16f0ce7a34ac59eb1996d18e86f498c029b6", + "benchmarks/models/qwenimage/plot_adaln_audit.py": "6151e6abccca8f647c2fbeadf92f12e43ed1c07954db9f2db2f035284cbd407c", + "benchmarks/models/qwenimage/plot_adaln_evidence.py": "16d6bed0ee5b808814c5f7157145a730750d0b1aaf94762e6f72a256e942c1e2", + "benchmarks/models/qwenimage/streams.py": "bd27383eee59404df295f724f6c7d620db3d3d7074c19dd94d51a711b38acf02", + "benchmarks/models/qwenimage/validate_adaln_repair.py": "8b663191323b455470a2313cdfefd837657441b300ffd0e0767453f9f407db03" + }, + "extension_sha256": "5d1054db8bba2eaedbd391d0c23b6683acea9ed04fcd64d6f369faed75aa9e0f", + "clean_commit": true + }, + "cases": [ + { + "stream": "image", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 1, + "errors": { + "output": 0.00010212418300653595, + "temb": 0.0012629464657776478, + "weight": 0.0029750635581760154, + "bias": 0.0 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.001953125, + "max_tolerance_ratio": 0.03427004814147949, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.05644798278808594, + "max_tolerance_ratio": 0.1230149194598198, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0537109375, + "max_tolerance_ratio": 0.11876484751701355, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.001953125, + "max_tolerance_ratio": 0.03427004814147949, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.05644989013671875, + "max_tolerance_ratio": 0.12301909178495407, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0537109375, + "max_tolerance_ratio": 0.11876484751701355, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.001953125, + "max_tolerance_ratio": 0.03282994031906128, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 1.621053525013849e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 1, + "errors": { + "output": 0.00013297872340425532, + "temb": 0.00265913545172504, + "weight": 0.00212348708024846, + "bias": 0.0022522522522522522 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.00390625, + "max_tolerance_ratio": 0.061804696917533875, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.11885452270507812, + "max_tolerance_ratio": 0.12411411851644516, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.037506103515625, + "max_tolerance_ratio": 0.11955364048480988, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.08665511012077332, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.001953125, + "max_tolerance_ratio": 0.03448275849223137, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.11884689331054688, + "max_tolerance_ratio": 0.12410613149404526, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.037506103515625, + "max_tolerance_ratio": 0.11955364048480988, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.08665511012077332, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.00390625, + "max_tolerance_ratio": 0.061804696917533875, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 1.971389792743139e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 3.6639826248574536e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "image", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 1, + "errors": { + "output": 2.5000925034226265e-07, + "temb": 7.153681971157795e-08, + "weight": 7.721277105873651e-08, + "bias": 0.0 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.012762296944856644, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.0039715212769806385, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0018689982825890183, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 8.58306884765625e-06, + "max_tolerance_ratio": 0.030562685802578926, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 4.0531158447265625e-06, + "max_tolerance_ratio": 0.028036657720804214, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.002507084747776389, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 6.67572021484375e-06, + "max_tolerance_ratio": 0.03088262304663658, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.026920227333903313, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0018689982825890183, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 1, + "errors": { + "output": 1.9433382171581996e-07, + "temb": 7.153681971157795e-08, + "weight": 8.463429168364021e-08, + "bias": 3.4417995820829274e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.018450917676091194, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.005840782541781664, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.006484277546405792, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.03133980929851532, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 7.152557373046875e-06, + "max_tolerance_ratio": 0.045161668211221695, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 2.86102294921875e-06, + "max_tolerance_ratio": 0.008770876564085484, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 0.0011501959525048733, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.031402040272951126, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 7.152557373046875e-06, + "max_tolerance_ratio": 0.04833897948265076, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.006122968625277281, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 0.001150196068920195, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 1, + "errors": { + "output": 0.0003787878787878788, + "temb": 0.002272008454602605, + "weight": 0.0029750635581760154, + "bias": 0.0 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.00390625, + "max_tolerance_ratio": 0.05800464004278183, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.059566497802734375, + "max_tolerance_ratio": 0.13709330558776855, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0537109375, + "max_tolerance_ratio": 0.11876484751701355, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.16233766078948975, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.05956840515136719, + "max_tolerance_ratio": 0.13709330558776855, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0537109375, + "max_tolerance_ratio": 0.11876484751701355, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.16181229054927826, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 1.8021310097537935e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 1, + "errors": { + "output": 0.0003324468085106383, + "temb": 0.0021262388503343254, + "weight": 0.00212348708024846, + "bias": 0.0022522522522522522 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.00390625, + "max_tolerance_ratio": 0.05800464004278183, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.062480926513671875, + "max_tolerance_ratio": 0.13769890367984772, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.037506103515625, + "max_tolerance_ratio": 0.11955364048480988, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.08665511012077332, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.16233766078948975, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.062480926513671875, + "max_tolerance_ratio": 0.13769890367984772, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.037506103515625, + "max_tolerance_ratio": 0.11955364048480988, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.08665511012077332, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.16181229054927826, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 2.039399987552315e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 3.6639826248574536e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 1, + "errors": { + "output": 1.7373682901099267e-07, + "temb": 1.256071300815232e-07, + "weight": 7.721277105873651e-08, + "bias": 0.0 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 1.7881393432617188e-06, + "max_tolerance_ratio": 0.01215351652354002, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.00530293257907033, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0018689982825890183, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 2.9802322387695312e-06, + "max_tolerance_ratio": 0.020753581076860428, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.029592594131827354, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.002507084747776389, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 2.86102294921875e-06, + "max_tolerance_ratio": 0.0184613186866045, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.027584798634052277, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0018689982825890183, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 1, + "errors": { + "output": 1.8247475177959514e-07, + "temb": 1.1396055844017845e-07, + "weight": 8.463429168364021e-08, + "bias": 3.4417995820829274e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 2.1457672119140625e-06, + "max_tolerance_ratio": 0.01566220633685589, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.00530293257907033, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.006484277546405792, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 3.337860107421875e-06, + "max_tolerance_ratio": 0.022235983982682228, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 7.152557373046875e-06, + "max_tolerance_ratio": 0.036533404141664505, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 2.86102294921875e-06, + "max_tolerance_ratio": 0.008770876564085484, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 0.0011501959525048733, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 3.2186508178710938e-06, + "max_tolerance_ratio": 0.02195672132074833, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 7.152557373046875e-06, + "max_tolerance_ratio": 0.0379667766392231, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.006122968625277281, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 0.001150196068920195, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 3, + "errors": { + "output": 0.000496031746031746, + "x": 0.002199058051741856, + "temb": 0.0021099817336697213, + "weight": 0.0028074332058796126, + "bias": 0.0018907762799899922 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0078125, + "max_tolerance_ratio": 0.10989010334014893, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.030731201171875, + "max_tolerance_ratio": 0.1051677018404007, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.023390769958496094, + "max_tolerance_ratio": 0.07270586490631104, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.09642410278320312, + "max_tolerance_ratio": 0.14532645046710968, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.08576016128063202, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0078125, + "max_tolerance_ratio": 0.10989010334014893, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.030730247497558594, + "max_tolerance_ratio": 0.1051677018404007, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.023397445678710938, + "max_tolerance_ratio": 0.07272657752037048, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.09642410278320312, + "max_tolerance_ratio": 0.14532645046710968, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.08576016128063202, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 7.27890437701717e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 6.67572021484375e-06, + "max_tolerance_ratio": 2.075023621728178e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 4.366513621789636e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 3, + "errors": { + "output": 0.0004664179104477612, + "x": 0.001693982554746457, + "temb": 0.0012157857982677467, + "weight": 0.0029273765909961715, + "bias": 0.002464464272337742 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0078125, + "max_tolerance_ratio": 0.10989010334014893, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.030731201171875, + "max_tolerance_ratio": 0.11245794594287872, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.023390769958496094, + "max_tolerance_ratio": 0.07270586490631104, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.10053253173828125, + "max_tolerance_ratio": 0.14709486067295074, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11734600365161896, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0078125, + "max_tolerance_ratio": 0.10989010334014893, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.030730247497558594, + "max_tolerance_ratio": 0.11245794594287872, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.02339458465576172, + "max_tolerance_ratio": 0.07271769642829895, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.10053253173828125, + "max_tolerance_ratio": 0.14709486067295074, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11734600365161896, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 7.27890437701717e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 4.291534423828125e-06, + "max_tolerance_ratio": 2.0000175936729647e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 7.071168511174619e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 2.776953124339343e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 4096, + "errors": { + "output": 0.0008620689655172414, + "x": 0.0019700904271517748, + "temb": 0.0025997528801697365, + "weight": 0.0020625971384595873, + "bias": 0.0021432327059319914 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2610965967178345, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.06295013427734375, + "max_tolerance_ratio": 0.21990622580051422, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.974853515625, + "max_tolerance_ratio": 0.18622194230556488, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.99810791015625, + "max_tolerance_ratio": 0.26984500885009766, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.499542236328125, + "max_tolerance_ratio": 0.17593611776828766, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.4166666865348816, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.06295108795166016, + "max_tolerance_ratio": 0.21990953385829926, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.973114013671875, + "max_tolerance_ratio": 0.18629077076911926, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.99810791015625, + "max_tolerance_ratio": 0.26984500885009766, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.499542236328125, + "max_tolerance_ratio": 0.17593611776828766, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.42016810178756714, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 9.064448022400029e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.00673675537109375, + "max_tolerance_ratio": 0.01900986023247242, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.1004638671875, + "max_tolerance_ratio": 0.11163272708654404, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.024169921875, + "max_tolerance_ratio": 0.04618116840720177, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 6889, + "errors": { + "output": 0.0007861635220125787, + "x": 0.0030659691634772925, + "temb": 0.0013798969474197024, + "weight": 0.0029975299085633236, + "bias": 0.0034632179346090653 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.28409090638160706, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.10747528076171875, + "max_tolerance_ratio": 0.18417096138000488, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.49737548828125, + "max_tolerance_ratio": 0.17265309393405914, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 3.552001953125, + "max_tolerance_ratio": 0.1919335275888443, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.987396240234375, + "max_tolerance_ratio": 0.1844324767589569, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.4166666865348816, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.10747528076171875, + "max_tolerance_ratio": 0.18417315185070038, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.49676513671875, + "max_tolerance_ratio": 0.17340509593486786, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 3.552001953125, + "max_tolerance_ratio": 0.21679477393627167, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.987396240234375, + "max_tolerance_ratio": 0.1844324767589569, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.42016810178756714, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 1.0114458746102173e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.01373291015625, + "max_tolerance_ratio": 0.031194206327199936, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.1212615966796875, + "max_tolerance_ratio": 0.09453864395618439, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0291748046875, + "max_tolerance_ratio": 0.0633571594953537, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 6032, + "errors": { + "output": 0.0008620689655172414, + "x": 0.002206903277409883, + "temb": 0.002668525553386839, + "weight": 0.0034295755709601214, + "bias": 0.003586862967145749 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.28409090638160706, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.07989501953125, + "max_tolerance_ratio": 0.1796255111694336, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 1.91259765625, + "max_tolerance_ratio": 0.18743273615837097, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 3.8983154296875, + "max_tolerance_ratio": 0.21401755511760712, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.98095703125, + "max_tolerance_ratio": 0.1854325532913208, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.4166666865348816, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.07989883422851562, + "max_tolerance_ratio": 0.17962804436683655, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 1.91046142578125, + "max_tolerance_ratio": 0.18752418458461761, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 3.8983154296875, + "max_tolerance_ratio": 0.21401245892047882, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.98095703125, + "max_tolerance_ratio": 0.1854325532913208, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.42016810178756714, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 9.072345164895523e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.00341796875, + "max_tolerance_ratio": 0.009570451453328133, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0806884765625, + "max_tolerance_ratio": 0.12455323338508606, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0194091796875, + "max_tolerance_ratio": 0.05911623314023018, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.float32", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 3, + "errors": { + "output": 2.4111135456660385e-07, + "x": 2.2007718887408158e-07, + "temb": 9.935593298664908e-08, + "weight": 1.206395067442529e-07, + "bias": 1.0066168552904504e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.006475791335105896, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 2.86102294921875e-06, + "max_tolerance_ratio": 0.006711037829518318, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0034965018276125193, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.013960428535938263, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.004705933388322592, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.016299717128276825, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.014370650984346867, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 2.86102294921875e-06, + "max_tolerance_ratio": 0.0212006364017725, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.011319294571876526, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.430511474609375e-06, + "max_tolerance_ratio": 0.0037908940576016903, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.01740475371479988, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 2.9802322387695312e-06, + "max_tolerance_ratio": 0.013306140899658203, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 2.86102294921875e-06, + "max_tolerance_ratio": 0.01892019622027874, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 3.993511199951172e-06, + "max_tolerance_ratio": 0.02527969516813755, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 9.685754776000977e-07, + "max_tolerance_ratio": 0.008496824651956558, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 3, + "errors": { + "output": 2.2786455366346958e-07, + "x": 2.0128556655043982e-07, + "temb": 7.136207934187209e-08, + "weight": 1.704858954214529e-07, + "bias": 1.1402649645530584e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.019909905269742012, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.012313690967857838, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.005719592794775963, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.02071652002632618, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.430511474609375e-06, + "max_tolerance_ratio": 0.006979386322200298, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.029517272487282753, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.020897604525089264, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.014994777739048004, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.013930975459516048, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.0064689163118600845, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.019338613376021385, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.015766620635986328, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 4.0531158447265625e-06, + "max_tolerance_ratio": 0.015777138993144035, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.025874726474285126, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.1920928955078125e-06, + "max_tolerance_ratio": 0.006308813579380512, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 4096, + "errors": { + "output": 2.6352149892715125e-07, + "x": 3.31159272825776e-07, + "temb": 1.2544146509408692e-07, + "weight": 1.1860149812089856e-07, + "bias": 1.1313467294695588e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.020410649478435516, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.01925850100815296, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.14704059064388275, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.500838577747345, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.16384367644786835, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.03355640172958374, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.030153604224324226, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 9.1552734375e-05, + "max_tolerance_ratio": 0.20725961029529572, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.000152587890625, + "max_tolerance_ratio": 0.500838577747345, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.16384367644786835, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 9.059906005859375e-06, + "max_tolerance_ratio": 0.03358623757958412, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 9.059906005859375e-06, + "max_tolerance_ratio": 0.029500238597393036, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 6.103515625e-05, + "max_tolerance_ratio": 0.24170871078968048, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.20120659470558167, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.07252637296915054, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 6889, + "errors": { + "output": 2.867357750859873e-07, + "x": 3.1097377647291154e-07, + "temb": 4.987320996296972e-07, + "weight": 1.611848592940335e-07, + "bias": 1.4144397533014996e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.020410649478435516, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.021628830581903458, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.00017547607421875, + "max_tolerance_ratio": 0.3319971561431885, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.4235624372959137, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.17926640808582306, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.03355640172958374, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.03185949847102165, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.0001678466796875, + "max_tolerance_ratio": 0.9557905793190002, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.000244140625, + "max_tolerance_ratio": 0.5156419277191162, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.20355328917503357, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 9.059906005859375e-06, + "max_tolerance_ratio": 0.035067975521087646, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 8.821487426757812e-06, + "max_tolerance_ratio": 0.02961006388068199, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.6238530874252319, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.4585089683532715, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.14289963245391846, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 6032, + "errors": { + "output": 2.6352149892715125e-07, + "x": 3.193581366075239e-07, + "temb": 1.5150473906301908e-07, + "weight": 1.9597683492386078e-07, + "bias": 1.525621407340771e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.020410649478435516, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.017535196617245674, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.21475635468959808, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.000244140625, + "max_tolerance_ratio": 0.519486129283905, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.4809112548828125e-05, + "max_tolerance_ratio": 0.139124795794487, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.03355640172958374, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.031383853405714035, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.10615162551403046, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.000244140625, + "max_tolerance_ratio": 0.4405430555343628, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.4332275390625e-05, + "max_tolerance_ratio": 0.15544429421424866, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 9.059906005859375e-06, + "max_tolerance_ratio": 0.035067975521087646, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 8.58306884765625e-06, + "max_tolerance_ratio": 0.029560720548033714, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.11358816176652908, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.2149263173341751, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.08045484125614166, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + } + ], + "environment": { + "torch": "2.13.0+cu130", + "cuda": "13.0", + "gpu": "NVIDIA B200", + "workspace": { + "CUBLAS_WORKSPACE_CONFIG": null, + "CUBLASLT_WORKSPACE_SIZE": null + }, + "tf32": false + }, + "scope": "sample batch BI; final uses S=3 for large B, long S tested separately; shared parameter gradients: same ordered inputs, repeat only", + "packages": { + "torch": "2.13.0", + "triton": "3.7.1", + "diffusers": null, + "vllm": "0.30.0", + "sglang": "0.5.21", + "liger-kernel": "0.8.4", + "transformer_engine": null, + "megatron-core": null + } +} diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy-2026.json b/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy-2026.json new file mode 100644 index 000000000..68d00d426 --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy-2026.json @@ -0,0 +1,2502 @@ +{ + "mode": "fixed", + "phase": "accuracy", + "accuracy_seed": 2026, + "source": { + "base_sha": "55f83d2b9043f41dca84440d9002ca30f5d3fac4", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked_source_sha256": {}, + "workspace_source_sha256": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "qwenimage_source_sha256": { + "csrc/cuda/model_specific/qwenimage/det_linear.cu": "859da456b0c776f3492b3197c252866e33d9a7088508b701b7c4a179ee709afb", + "csrc/cuda/model_specific/qwenimage/token_sum.cu": "1aace24523ff95520ab5d482e2e0f17d09a2efcf93efc8de865c7bcc157cf3ba", + "rl_engine/backends/cuda/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py": "710df5416a2adf5b2576468ff63584b6699e6bdecd59906370049bf09f1b3286", + "rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py": "f6afe4b7568e2026c4b046a4fd0a02589f817d815198af33173d2dba61773f19", + "rl_engine/reference/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py": "1ebc740ddff575055ee66ed714a8c7cc5c6cee2701d582a665289e9ad1a4fe3d", + "rl_engine/reference/model_specific/qwenimage/final_adaln_out.py": "60441610c04d04d0fb1cd7320be8584e76772c110a3cfed77ddf826dbde9b53c", + "benchmarks/models/qwenimage/__init__.py": "a63ebc79ed10d9ed98484565a353438bd13f5801a8f51d7505d0921bf6942742", + "benchmarks/models/qwenimage/adaln_evidence.py": "9dc9f3da0069d36c602baef07d687fb1aeba8fda0163d17fc446e0a543fe1f3e", + "benchmarks/models/qwenimage/adaln_parameter_screen.py": "05562ef30d09296c2ccd1cdeb44085568b8c877d01f5fb1df4b983e84945ec03", + "benchmarks/models/qwenimage/adaln_prior_art.py": "647aa9fc81e02bf3c7806ed6c2a3e578fb3e1a0b000b4388a12367ef86de3139", + "benchmarks/models/qwenimage/adaln_reuse_bi_audit.py": "88dd3d390e647bbc883b76622309fad54dac3618630dcca0785e555db329a671", + "benchmarks/models/qwenimage/adaln_reuse_candidate.py": "4598f6db94462ac30f3bdd3defae16f0ce7a34ac59eb1996d18e86f498c029b6", + "benchmarks/models/qwenimage/plot_adaln_audit.py": "6151e6abccca8f647c2fbeadf92f12e43ed1c07954db9f2db2f035284cbd407c", + "benchmarks/models/qwenimage/plot_adaln_evidence.py": "16d6bed0ee5b808814c5f7157145a730750d0b1aaf94762e6f72a256e942c1e2", + "benchmarks/models/qwenimage/streams.py": "bd27383eee59404df295f724f6c7d620db3d3d7074c19dd94d51a711b38acf02", + "benchmarks/models/qwenimage/validate_adaln_repair.py": "8b663191323b455470a2313cdfefd837657441b300ffd0e0767453f9f407db03" + }, + "extension_sha256": "5d1054db8bba2eaedbd391d0c23b6683acea9ed04fcd64d6f369faed75aa9e0f", + "clean_commit": true + }, + "cases": [ + { + "stream": "image", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 1, + "errors": { + "output": 2.244971264367816e-05, + "temb": 0.002371631046179143, + "weight": 0.00251562438583389, + "bias": 0.0 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0009765625, + "max_tolerance_ratio": 0.018122507259249687, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.05740547180175781, + "max_tolerance_ratio": 0.12825241684913635, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11747156828641891, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0009765625, + "max_tolerance_ratio": 0.018122507259249687, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.057403564453125, + "max_tolerance_ratio": 0.12825241684913635, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11747156828641891, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.0003048724611289799, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 2.520442103559617e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 1, + "errors": { + "output": 2.0667989417989417e-05, + "temb": 0.0019821978474994016, + "weight": 0.0020568547597406834, + "bias": 0.002285714285714286 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0009765625, + "max_tolerance_ratio": 0.018168604001402855, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.061367034912109375, + "max_tolerance_ratio": 0.13725320994853973, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11966932564973831, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.08665511012077332, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0009765625, + "max_tolerance_ratio": 0.018168604001402855, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.061367034912109375, + "max_tolerance_ratio": 0.13725320994853973, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11966932564973831, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.08665511012077332, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 6.103515625e-05, + "max_tolerance_ratio": 0.001214565010741353, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 2.520442103559617e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 3.6669009659817675e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "image", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 1, + "errors": { + "output": 1.3123433062092386e-07, + "temb": 1.5385326443611582e-07, + "weight": 1.0808519461802377e-07, + "bias": 0.0 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.013629354536533356, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.004754088819026947, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.001809387467801571, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.024498622864484787, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 4.9173831939697266e-06, + "max_tolerance_ratio": 0.0336298942565918, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0019007029477506876, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.019750267267227173, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 4.26173210144043e-06, + "max_tolerance_ratio": 0.029145991429686546, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.001809387467801571, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 1, + "errors": { + "output": 1.2085859882341736e-07, + "temb": 1.2033948586248875e-07, + "weight": 1.0305427870559897e-07, + "bias": 3.49110510059183e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.016978632658720016, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.005246808286756277, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.007542377337813377, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.02481098845601082, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.0013580322265625e-05, + "max_tolerance_ratio": 0.06363558769226074, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.430511474609375e-06, + "max_tolerance_ratio": 0.006690017879009247, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 0.0012944150948897004, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.026189304888248444, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.0192394256591797e-05, + "max_tolerance_ratio": 0.06477151811122894, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.007932986132800579, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 0.0012944149784743786, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 1, + "errors": { + "output": 2.9238398203592816e-06, + "temb": 0.0025855892841688335, + "weight": 0.00251562438583389, + "bias": 0.0 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 6.103515625e-05, + "max_tolerance_ratio": 0.0012157168239355087, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.061279296875, + "max_tolerance_ratio": 0.14460358023643494, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11747156828641891, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 6.103515625e-05, + "max_tolerance_ratio": 0.0012157168239355087, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.061279296875, + "max_tolerance_ratio": 0.14460358023643494, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11747156828641891, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.0006091098766773939, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 1.9698305550264195e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 1, + "errors": { + "output": 0.0006906077348066298, + "temb": 0.002196223742267545, + "weight": 0.0020568547597406834, + "bias": 0.002285714285714286 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.12406948953866959, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.061313629150390625, + "max_tolerance_ratio": 0.14460358023643494, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11966932564973831, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.08665511012077332, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.001953125, + "max_tolerance_ratio": 0.03378378227353096, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.06131172180175781, + "max_tolerance_ratio": 0.14460358023643494, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11966932564973831, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.08665511012077332, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.12406948953866959, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 4.351139068603516e-06, + "max_tolerance_ratio": 3.730764365172945e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 3.6669009659817675e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 1, + "errors": { + "output": 9.139544762931177e-08, + "temb": 1.2266082786688824e-07, + "weight": 1.0808519461802377e-07, + "bias": 0.0 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.012426713481545448, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.004656618926674128, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.001809387467801571, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 4.0531158447265625e-06, + "max_tolerance_ratio": 0.021908355876803398, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.022282417863607407, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0019007029477506876, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.01947440393269062, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 4.5299530029296875e-06, + "max_tolerance_ratio": 0.018787100911140442, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.001809387467801571, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 1, + "errors": { + "output": 8.972471696813046e-08, + "temb": 1.0411847041844906e-07, + "weight": 1.0305427870559897e-07, + "bias": 3.49110510059183e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 2.0265579223632812e-06, + "max_tolerance_ratio": 0.015549457632005215, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.004941259045153856, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.007542377337813377, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.02140364795923233, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 6.67572021484375e-06, + "max_tolerance_ratio": 0.041691649705171585, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.430511474609375e-06, + "max_tolerance_ratio": 0.006690017879009247, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 0.0012944150948897004, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.023502478376030922, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.03980783000588417, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.007932986132800579, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 0.0012944149784743786, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 3, + "errors": { + "output": 0.0, + "x": 0.002944527956344018, + "temb": 0.0026573106162723066, + "weight": 0.0022376221223072133, + "bias": 0.0031179521107541634 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.06070137023925781, + "max_tolerance_ratio": 0.13378773629665375, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.03006267547607422, + "max_tolerance_ratio": 0.10759774595499039, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.062458038330078125, + "max_tolerance_ratio": 0.14738832414150238, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.02703857421875, + "max_tolerance_ratio": 0.10176001489162445, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.060699462890625, + "max_tolerance_ratio": 0.13378353416919708, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.030060768127441406, + "max_tolerance_ratio": 0.10759091377258301, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.062458038330078125, + "max_tolerance_ratio": 0.14738832414150238, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.02703857421875, + "max_tolerance_ratio": 0.10176001489162445, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 6.6370266722515225e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 2.86102294921875e-06, + "max_tolerance_ratio": 1.2674748177232686e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 4.483425072976388e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 3, + "errors": { + "output": 0.0012755102040816326, + "x": 0.002025787688856754, + "temb": 0.0016964272539246833, + "weight": 0.002799521447580048, + "bias": 0.0019237056060808612 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.22421523928642273, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.06070137023925781, + "max_tolerance_ratio": 0.13857226073741913, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.03006267547607422, + "max_tolerance_ratio": 0.10759774595499039, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.11788558959960938, + "max_tolerance_ratio": 0.1509428322315216, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0306854248046875, + "max_tolerance_ratio": 0.11546272039413452, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0078125, + "max_tolerance_ratio": 0.10395010560750961, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.060699462890625, + "max_tolerance_ratio": 0.13378353416919708, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.03006458282470703, + "max_tolerance_ratio": 0.10760458558797836, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.11788558959960938, + "max_tolerance_ratio": 0.1509428322315216, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0306854248046875, + "max_tolerance_ratio": 0.11546272039413452, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.22421523928642273, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.01702094078063965, + "max_tolerance_ratio": 0.10267685353755951, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 5.0166458095191047e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 7.486346021323698e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 3.2876482691790443e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 4096, + "errors": { + "output": 0.0013440860215053765, + "x": 0.0029171700320253786, + "temb": 0.001157296909605254, + "weight": 0.002680715209593179, + "bias": 0.0021537376948421857 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.3144654333591461, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.10940170288085938, + "max_tolerance_ratio": 0.1479864865541458, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.557769775390625, + "max_tolerance_ratio": 0.17978638410568237, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.99908447265625, + "max_tolerance_ratio": 0.19479972124099731, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.4989776611328125, + "max_tolerance_ratio": 0.18231867253780365, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.3105590045452118, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.10940170288085938, + "max_tolerance_ratio": 0.1479864865541458, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.5592041015625, + "max_tolerance_ratio": 0.17995105683803558, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.99908447265625, + "max_tolerance_ratio": 0.23135264217853546, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.4989776611328125, + "max_tolerance_ratio": 0.18231867253780365, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.3144654333591461, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 1.0438299796078354e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.004877328872680664, + "max_tolerance_ratio": 0.031032854691147804, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.056182861328125, + "max_tolerance_ratio": 0.13579203188419342, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0174560546875, + "max_tolerance_ratio": 0.0849195346236229, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 6889, + "errors": { + "output": 0.0013440860215053765, + "x": 0.0029824112711797925, + "temb": 0.001697534369465647, + "weight": 0.001951574412037436, + "bias": 0.0029672357096824737 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.3144654333591461, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.11499786376953125, + "max_tolerance_ratio": 0.15483756363391876, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 2.62548828125, + "max_tolerance_ratio": 0.18814533948898315, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.99847412109375, + "max_tolerance_ratio": 0.2160704880952835, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.944000244140625, + "max_tolerance_ratio": 0.18201026320457458, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.3105590045452118, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.11500167846679688, + "max_tolerance_ratio": 0.15484270453453064, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 2.622314453125, + "max_tolerance_ratio": 0.18831059336662292, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.99847412109375, + "max_tolerance_ratio": 0.1916806846857071, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.944000244140625, + "max_tolerance_ratio": 0.18201026320457458, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.3144654333591461, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 1.143573535955511e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.008453369140625, + "max_tolerance_ratio": 0.010332549922168255, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.089202880859375, + "max_tolerance_ratio": 0.14381708204746246, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0277099609375, + "max_tolerance_ratio": 0.05480322241783142, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 6032, + "errors": { + "output": 0.0013440860215053765, + "x": 0.0026557590174753724, + "temb": 0.0018996883872535095, + "weight": 0.0020658245130838852, + "bias": 0.0028803109460675013 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.3144654333591461, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.09983062744140625, + "max_tolerance_ratio": 0.1480591595172882, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.771881103515625, + "max_tolerance_ratio": 0.17373549938201904, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.99993896484375, + "max_tolerance_ratio": 0.20018112659454346, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.8663330078125, + "max_tolerance_ratio": 0.18344718217849731, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.3105590045452118, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.09983062744140625, + "max_tolerance_ratio": 0.1480591595172882, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.76873779296875, + "max_tolerance_ratio": 0.1731552928686142, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.99993896484375, + "max_tolerance_ratio": 0.19251884520053864, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.8663330078125, + "max_tolerance_ratio": 0.18344718217849731, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.3144654333591461, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 1.0791104614327196e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0050811767578125, + "max_tolerance_ratio": 0.021494554355740547, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0746612548828125, + "max_tolerance_ratio": 0.14156918227672577, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.023193359375, + "max_tolerance_ratio": 0.05119243636727333, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.float32", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 3, + "errors": { + "output": 1.6772869682014904e-07, + "x": 2.922462002780819e-07, + "temb": 1.0333139478131599e-07, + "weight": 1.3405495558281035e-07, + "bias": 9.811123902188825e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.011125163175165653, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.013506765477359295, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.004102057311683893, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.009868944995105267, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.003569649998098612, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.009976753033697605, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.019146177917718887, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 2.1457672119140625e-06, + "max_tolerance_ratio": 0.00893421284854412, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.0032710067462176085, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.001172802527435124, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.012154442258179188, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.01014888659119606, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.009550043381750584, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.009868944995105267, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.003569649998098612, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 3, + "errors": { + "output": 1.5553137215531177e-07, + "x": 2.390054565865867e-07, + "temb": 1.366334468653818e-07, + "weight": 1.8887083772261563e-07, + "bias": 8.94316581936257e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.011125163175165653, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.013506765477359295, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.004102057311683893, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.016516877338290215, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.1920928955078125e-06, + "max_tolerance_ratio": 0.007052713073790073, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.022879255935549736, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.019285421818494797, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 8.58306884765625e-06, + "max_tolerance_ratio": 0.015840768814086914, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.01465868391096592, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.430511474609375e-06, + "max_tolerance_ratio": 0.005926522891968489, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.018760954961180687, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 6.67572021484375e-06, + "max_tolerance_ratio": 0.009912658482789993, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.017808664590120316, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.02108752168715, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.430511474609375e-06, + "max_tolerance_ratio": 0.006138188298791647, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 4096, + "errors": { + "output": 1.6383662113838108e-07, + "x": 2.1389164624227552e-07, + "temb": 1.365990205286038e-07, + "weight": 2.0644946340193088e-07, + "bias": 1.3485262728580707e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.028235893696546555, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.0291290320456028, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 6.103515625e-05, + "max_tolerance_ratio": 0.09505032747983932, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.2644484043121338, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.147125244140625e-05, + "max_tolerance_ratio": 0.10466355085372925, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.020988568663597107, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.025144297629594803, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.0001239776611328125, + "max_tolerance_ratio": 0.23685729503631592, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.2929733097553253, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.147125244140625e-05, + "max_tolerance_ratio": 0.12083189934492111, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.0264158695936203, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.022366248071193695, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 9.1552734375e-05, + "max_tolerance_ratio": 0.24649076163768768, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.21066269278526306, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.07220239192247391, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 6889, + "errors": { + "output": 1.6383662113838108e-07, + "x": 2.0760714582056988e-07, + "temb": 8.154580316104657e-08, + "weight": 1.7012256941348087e-07, + "bias": 1.19624449223015e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.028235893696546555, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.032680004835128784, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.05806845426559448, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.48603400588035583, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.814697265625e-05, + "max_tolerance_ratio": 0.16208408772945404, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.021109450608491898, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.031179090961813927, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.11484155058860779, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.3963247239589691, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.814697265625e-05, + "max_tolerance_ratio": 0.1385502964258194, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.0264158695936203, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.020611578598618507, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.05714809522032738, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.1849287748336792, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.0718614012002945, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 6032, + "errors": { + "output": 1.6383662113838108e-07, + "x": 2.2161587388122407e-07, + "temb": 2.260957143985765e-07, + "weight": 2.2631096510593523e-07, + "bias": 1.3971444331359727e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.028235893696546555, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.029315516352653503, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 9.1552734375e-05, + "max_tolerance_ratio": 0.17454794049263, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.000244140625, + "max_tolerance_ratio": 0.2699238657951355, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.11454979330301285, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.021109450608491898, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.02875695191323757, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.00011539459228515625, + "max_tolerance_ratio": 0.22344987094402313, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.24980875849723816, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.11527033895254135, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.0264158695936203, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.020603220909833908, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.00016117095947265625, + "max_tolerance_ratio": 0.24577546119689941, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.1459459662437439, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.0746273621916771, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + } + ], + "environment": { + "torch": "2.13.0+cu130", + "cuda": "13.0", + "gpu": "NVIDIA B200", + "workspace": { + "CUBLAS_WORKSPACE_CONFIG": null, + "CUBLASLT_WORKSPACE_SIZE": null + }, + "tf32": false + }, + "scope": "sample batch BI; final uses S=3 for large B, long S tested separately; shared parameter gradients: same ordered inputs, repeat only", + "packages": { + "torch": "2.13.0", + "triton": "3.7.1", + "diffusers": null, + "vllm": "0.30.0", + "sglang": "0.5.21", + "liger-kernel": "0.8.4", + "transformer_engine": null, + "megatron-core": null + } +} diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy_large-0.json b/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy_large-0.json new file mode 100644 index 000000000..288ed9347 --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy_large-0.json @@ -0,0 +1,1674 @@ +{ + "mode": "fixed", + "phase": "accuracy_large", + "accuracy_seed": 0, + "source": { + "base_sha": "55f83d2b9043f41dca84440d9002ca30f5d3fac4", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked_source_sha256": {}, + "workspace_source_sha256": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "qwenimage_source_sha256": { + "csrc/cuda/model_specific/qwenimage/det_linear.cu": "859da456b0c776f3492b3197c252866e33d9a7088508b701b7c4a179ee709afb", + "csrc/cuda/model_specific/qwenimage/token_sum.cu": "1aace24523ff95520ab5d482e2e0f17d09a2efcf93efc8de865c7bcc157cf3ba", + "rl_engine/backends/cuda/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py": "710df5416a2adf5b2576468ff63584b6699e6bdecd59906370049bf09f1b3286", + "rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py": "f6afe4b7568e2026c4b046a4fd0a02589f817d815198af33173d2dba61773f19", + "rl_engine/reference/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py": "1ebc740ddff575055ee66ed714a8c7cc5c6cee2701d582a665289e9ad1a4fe3d", + "rl_engine/reference/model_specific/qwenimage/final_adaln_out.py": "60441610c04d04d0fb1cd7320be8584e76772c110a3cfed77ddf826dbde9b53c", + "benchmarks/models/qwenimage/__init__.py": "a63ebc79ed10d9ed98484565a353438bd13f5801a8f51d7505d0921bf6942742", + "benchmarks/models/qwenimage/adaln_evidence.py": "9dc9f3da0069d36c602baef07d687fb1aeba8fda0163d17fc446e0a543fe1f3e", + "benchmarks/models/qwenimage/adaln_parameter_screen.py": "05562ef30d09296c2ccd1cdeb44085568b8c877d01f5fb1df4b983e84945ec03", + "benchmarks/models/qwenimage/adaln_prior_art.py": "647aa9fc81e02bf3c7806ed6c2a3e578fb3e1a0b000b4388a12367ef86de3139", + "benchmarks/models/qwenimage/adaln_reuse_bi_audit.py": "88dd3d390e647bbc883b76622309fad54dac3618630dcca0785e555db329a671", + "benchmarks/models/qwenimage/adaln_reuse_candidate.py": "4598f6db94462ac30f3bdd3defae16f0ce7a34ac59eb1996d18e86f498c029b6", + "benchmarks/models/qwenimage/plot_adaln_audit.py": "6151e6abccca8f647c2fbeadf92f12e43ed1c07954db9f2db2f035284cbd407c", + "benchmarks/models/qwenimage/plot_adaln_evidence.py": "16d6bed0ee5b808814c5f7157145a730750d0b1aaf94762e6f72a256e942c1e2", + "benchmarks/models/qwenimage/streams.py": "bd27383eee59404df295f724f6c7d620db3d3d7074c19dd94d51a711b38acf02", + "benchmarks/models/qwenimage/validate_adaln_repair.py": "8b663191323b455470a2313cdfefd837657441b300ffd0e0767453f9f407db03" + }, + "extension_sha256": "5d1054db8bba2eaedbd391d0c23b6683acea9ed04fcd64d6f369faed75aa9e0f", + "clean_commit": true + }, + "cases": [ + { + "stream": "image", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 1, + "errors": { + "output": 0.0005102040816326531, + "temb": 0.0030144900592607993, + "weight": 0.002084629645128771, + "bias": 0.002484959114058055 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2369668334722519, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.2178955078125, + "max_tolerance_ratio": 0.16408038139343262, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.16831408441066742, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.174072265625, + "max_tolerance_ratio": 0.16830919682979584, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2369668334722519, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.21788787841796875, + "max_tolerance_ratio": 0.1640855073928833, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.12499618530273438, + "max_tolerance_ratio": 0.1683192402124405, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.174072265625, + "max_tolerance_ratio": 0.16830919682979584, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2283104956150055, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 6.939894228707999e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 2.6702880859375e-05, + "max_tolerance_ratio": 9.075890557141975e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 7.648543032701127e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 1, + "errors": { + "output": 0.004, + "temb": 0.002455035302989417, + "weight": 0.003418323784760821, + "bias": 0.0027655102951030354 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.25, + "max_tolerance_ratio": 0.2976190447807312, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.23834991455078125, + "max_tolerance_ratio": 0.16529890894889832, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.4989471435546875, + "max_tolerance_ratio": 0.18687306344509125, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.49908447265625, + "max_tolerance_ratio": 0.17882999777793884, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.25, + "max_tolerance_ratio": 0.2976190447807312, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.23833465576171875, + "max_tolerance_ratio": 0.16529890894889832, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.4989471435546875, + "max_tolerance_ratio": 0.18687306344509125, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.49908447265625, + "max_tolerance_ratio": 0.17882999777793884, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.23923446238040924, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 6.192495493451133e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 5.340576171875e-05, + "max_tolerance_ratio": 0.0003392235084902495, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 2.6462814275873825e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "image", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 1, + "errors": { + "output": 1.245275657644084e-07, + "temb": 1.0707711737096834e-07, + "weight": 7.060367690260571e-08, + "bias": 3.252543074689927e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.039437174797058105, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.01834806241095066, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.02439945563673973, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 2.288818359375e-05, + "max_tolerance_ratio": 0.07196041196584702, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.71661376953125e-05, + "max_tolerance_ratio": 0.08106574416160583, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.1423105001449585, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06444977223873138, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.07006721198558807, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.07333238422870636, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.14777518808841705, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06444935500621796, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 1, + "errors": { + "output": 1.8342561272103093e-07, + "temb": 7.074919141906837e-08, + "weight": 7.325777228972214e-08, + "bias": 4.150006878791282e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.039437174797058105, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.012831219471991062, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06128671020269394, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 2.288818359375e-05, + "max_tolerance_ratio": 0.07632873952388763, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.0944325178861618, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.1552734375e-05, + "max_tolerance_ratio": 0.5643313527107239, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.09616547077894211, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.0719609186053276, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 2.002716064453125e-05, + "max_tolerance_ratio": 0.09429927170276642, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.1552734375e-05, + "max_tolerance_ratio": 0.5631505846977234, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.09616640210151672, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 1, + "errors": { + "output": 0.001004016064257028, + "temb": 0.0030494313860528134, + "weight": 0.002084629645128771, + "bias": 0.002484959114058055 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2380952537059784, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.1246795654296875, + "max_tolerance_ratio": 0.16245029866695404, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.16831408441066742, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.174072265625, + "max_tolerance_ratio": 0.16830919682979584, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2380952537059784, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.1246795654296875, + "max_tolerance_ratio": 0.16245029866695404, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.12499618530273438, + "max_tolerance_ratio": 0.1683192402124405, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.174072265625, + "max_tolerance_ratio": 0.16830919682979584, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2092050313949585, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 3.4575481549836695e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 2.6702880859375e-05, + "max_tolerance_ratio": 9.075890557141975e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 7.648543032701127e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 1, + "errors": { + "output": 0.002008032128514056, + "temb": 0.0026498776250635605, + "weight": 0.003418323784760821, + "bias": 0.0027655102951030354 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.29411765933036804, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.12428665161132812, + "max_tolerance_ratio": 0.16516810655593872, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.4989471435546875, + "max_tolerance_ratio": 0.18687306344509125, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.49908447265625, + "max_tolerance_ratio": 0.17882999777793884, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.29411765933036804, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.12428665161132812, + "max_tolerance_ratio": 0.16516810655593872, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.4989471435546875, + "max_tolerance_ratio": 0.18687306344509125, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.49908447265625, + "max_tolerance_ratio": 0.17882999777793884, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2380952537059784, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 3.5094042686978355e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 5.340576171875e-05, + "max_tolerance_ratio": 0.0003392235084902495, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 2.6462814275873825e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 1, + "errors": { + "output": 1.2277101548203892e-07, + "temb": 1.1239149542301216e-07, + "weight": 7.060367690260571e-08, + "bias": 3.252543074689927e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.02048138901591301, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.009054863825440407, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.02439945563673973, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.05691283196210861, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.058902546763420105, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.1423105001449585, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06444977223873138, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.04434660077095032, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.05778145045042038, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.14777518808841705, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06444935500621796, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 1, + "errors": { + "output": 1.5346376935254862e-07, + "temb": 1.1779985556284367e-07, + "weight": 7.325777228972214e-08, + "bias": 4.150006878791282e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.02460440993309021, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.011150117963552475, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06128671020269394, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.0574447326362133, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.0637616440653801, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.1552734375e-05, + "max_tolerance_ratio": 0.5643313527107239, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.09616547077894211, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.048017870634794235, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.0013580322265625e-05, + "max_tolerance_ratio": 0.0638367310166359, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.1552734375e-05, + "max_tolerance_ratio": 0.5631505846977234, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.09616640210151672, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 3, + "errors": { + "output": 0.001293103448275862, + "x": 0.00224023169115234, + "temb": 0.0021749584473585402, + "weight": 0.0023790572682175454, + "bias": 0.002566674043905333 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.046875, + "max_tolerance_ratio": 0.35885170102119446, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.11793136596679688, + "max_tolerance_ratio": 0.21630512177944183, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.11898040771484375, + "max_tolerance_ratio": 0.15011020004749298, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.24993896484375, + "max_tolerance_ratio": 0.18175160884857178, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.24823760986328125, + "max_tolerance_ratio": 0.16857624053955078, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2557544708251953, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.11793136596679688, + "max_tolerance_ratio": 0.21630099415779114, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.11897659301757812, + "max_tolerance_ratio": 0.15010537207126617, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.24993896484375, + "max_tolerance_ratio": 0.3495287299156189, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.24823760986328125, + "max_tolerance_ratio": 0.1685815304517746, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.046875, + "max_tolerance_ratio": 0.35885170102119446, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.02467513084411621, + "max_tolerance_ratio": 0.1445486843585968, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0019903182983398438, + "max_tolerance_ratio": 0.013218452222645283, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.039097607135772705, + "max_tolerance_ratio": 0.3584054112434387, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.01055908203125, + "max_tolerance_ratio": 0.06674929708242416, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 3, + "errors": { + "output": 0.002142857142857143, + "x": 0.0026156480804779203, + "temb": 0.0019597123820803484, + "weight": 0.0034886615875011962, + "bias": 0.0031253425106817674 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.09375, + "max_tolerance_ratio": 0.4934210479259491, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.10931777954101562, + "max_tolerance_ratio": 0.2788471579551697, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.12445831298828125, + "max_tolerance_ratio": 0.16353631019592285, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.952239990234375, + "max_tolerance_ratio": 0.808866024017334, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.944976806640625, + "max_tolerance_ratio": 0.17805184423923492, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.09375, + "max_tolerance_ratio": 0.4934210479259491, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.10931396484375, + "max_tolerance_ratio": 0.2788471579551697, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.1244659423828125, + "max_tolerance_ratio": 0.16354139149188995, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.952239990234375, + "max_tolerance_ratio": 0.39588311314582825, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.944976806640625, + "max_tolerance_ratio": 0.1780628263950348, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.4464285671710968, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.04151296615600586, + "max_tolerance_ratio": 0.20947077870368958, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0064525604248046875, + "max_tolerance_ratio": 0.03526727855205536, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.11563682556152344, + "max_tolerance_ratio": 0.8075345158576965, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.03491020202636719, + "max_tolerance_ratio": 0.06267767399549484, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.float32", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 3, + "errors": { + "output": 2.1173904560107368e-07, + "x": 1.681428993038427e-07, + "temb": 8.882524538357731e-08, + "weight": 1.0640369369332095e-07, + "bias": 1.0569990891133054e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.0374017208814621, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.027549369260668755, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.019444484263658524, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.0814719945192337, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.052783019840717316, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.07313017547130585, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06461039185523987, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.049041748046875e-05, + "max_tolerance_ratio": 0.06373167037963867, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 7.62939453125e-05, + "max_tolerance_ratio": 0.24153167009353638, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.07257679849863052, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.049872979521751404, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.06246780604124069, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.049041748046875e-05, + "max_tolerance_ratio": 0.05931292846798897, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 7.62939453125e-05, + "max_tolerance_ratio": 0.26246994733810425, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.05028747767210007, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 3, + "errors": { + "output": 3.47125918885698e-07, + "x": 2.013979997727794e-07, + "temb": 1.220869426235198e-07, + "weight": 9.397203794891893e-08, + "bias": 8.08508887100396e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.030651601031422615, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.02696477435529232, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.030515439808368683, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.16196882724761963, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.09040731191635132, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.0675085112452507, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06093991920351982, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.08007202297449112, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.000152587890625, + "max_tolerance_ratio": 0.921640157699585, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.1973448395729065, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06190630421042442, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.71661376953125e-05, + "max_tolerance_ratio": 0.06629282981157303, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.08148636668920517, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.000152587890625, + "max_tolerance_ratio": 0.9329220652580261, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.16017752885818481, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + } + ], + "environment": { + "torch": "2.13.0+cu130", + "cuda": "13.0", + "gpu": "NVIDIA B200", + "workspace": { + "CUBLAS_WORKSPACE_CONFIG": null, + "CUBLASLT_WORKSPACE_SIZE": null + }, + "tf32": false + }, + "scope": "sample batch BI; final uses S=3 for large B, long S tested separately; shared parameter gradients: same ordered inputs, repeat only", + "packages": { + "torch": "2.13.0", + "triton": "3.7.1", + "diffusers": null, + "vllm": "0.30.0", + "sglang": "0.5.21", + "liger-kernel": "0.8.4", + "transformer_engine": null, + "megatron-core": null + } +} diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy_large-127.json b/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy_large-127.json new file mode 100644 index 000000000..fee7097e6 --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy_large-127.json @@ -0,0 +1,1674 @@ +{ + "mode": "fixed", + "phase": "accuracy_large", + "accuracy_seed": 127, + "source": { + "base_sha": "55f83d2b9043f41dca84440d9002ca30f5d3fac4", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked_source_sha256": {}, + "workspace_source_sha256": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "qwenimage_source_sha256": { + "csrc/cuda/model_specific/qwenimage/det_linear.cu": "859da456b0c776f3492b3197c252866e33d9a7088508b701b7c4a179ee709afb", + "csrc/cuda/model_specific/qwenimage/token_sum.cu": "1aace24523ff95520ab5d482e2e0f17d09a2efcf93efc8de865c7bcc157cf3ba", + "rl_engine/backends/cuda/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py": "710df5416a2adf5b2576468ff63584b6699e6bdecd59906370049bf09f1b3286", + "rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py": "f6afe4b7568e2026c4b046a4fd0a02589f817d815198af33173d2dba61773f19", + "rl_engine/reference/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py": "1ebc740ddff575055ee66ed714a8c7cc5c6cee2701d582a665289e9ad1a4fe3d", + "rl_engine/reference/model_specific/qwenimage/final_adaln_out.py": "60441610c04d04d0fb1cd7320be8584e76772c110a3cfed77ddf826dbde9b53c", + "benchmarks/models/qwenimage/__init__.py": "a63ebc79ed10d9ed98484565a353438bd13f5801a8f51d7505d0921bf6942742", + "benchmarks/models/qwenimage/adaln_evidence.py": "9dc9f3da0069d36c602baef07d687fb1aeba8fda0163d17fc446e0a543fe1f3e", + "benchmarks/models/qwenimage/adaln_parameter_screen.py": "05562ef30d09296c2ccd1cdeb44085568b8c877d01f5fb1df4b983e84945ec03", + "benchmarks/models/qwenimage/adaln_prior_art.py": "647aa9fc81e02bf3c7806ed6c2a3e578fb3e1a0b000b4388a12367ef86de3139", + "benchmarks/models/qwenimage/adaln_reuse_bi_audit.py": "88dd3d390e647bbc883b76622309fad54dac3618630dcca0785e555db329a671", + "benchmarks/models/qwenimage/adaln_reuse_candidate.py": "4598f6db94462ac30f3bdd3defae16f0ce7a34ac59eb1996d18e86f498c029b6", + "benchmarks/models/qwenimage/plot_adaln_audit.py": "6151e6abccca8f647c2fbeadf92f12e43ed1c07954db9f2db2f035284cbd407c", + "benchmarks/models/qwenimage/plot_adaln_evidence.py": "16d6bed0ee5b808814c5f7157145a730750d0b1aaf94762e6f72a256e942c1e2", + "benchmarks/models/qwenimage/streams.py": "bd27383eee59404df295f724f6c7d620db3d3d7074c19dd94d51a711b38acf02", + "benchmarks/models/qwenimage/validate_adaln_repair.py": "8b663191323b455470a2313cdfefd837657441b300ffd0e0767453f9f407db03" + }, + "extension_sha256": "5d1054db8bba2eaedbd391d0c23b6683acea9ed04fcd64d6f369faed75aa9e0f", + "clean_commit": true + }, + "cases": [ + { + "stream": "image", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 1, + "errors": { + "output": 0.001, + "temb": 0.002570927436780307, + "weight": 0.002266410170583034, + "bias": 0.0031821529669627566 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.25773197412490845, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.19158172607421875, + "max_tolerance_ratio": 0.1610577404499054, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.12499618530273438, + "max_tolerance_ratio": 0.16834504902362823, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.2188720703125, + "max_tolerance_ratio": 0.16501650214195251, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.25773197412490845, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.19158172607421875, + "max_tolerance_ratio": 0.16106285154819489, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.12500381469726562, + "max_tolerance_ratio": 0.1683552861213684, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.2188720703125, + "max_tolerance_ratio": 0.16501650214195251, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.21834062039852142, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 4.2131738155148923e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 2.6702880859375e-05, + "max_tolerance_ratio": 9.083370969165117e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 9.023100574268028e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 1, + "errors": { + "output": 0.0035971223021582736, + "temb": 0.0031355555431887613, + "weight": 0.003008460440639708, + "bias": 0.0027979415637741827 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.25, + "max_tolerance_ratio": 0.32258063554763794, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.23981475830078125, + "max_tolerance_ratio": 0.17071141302585602, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.497955322265625, + "max_tolerance_ratio": 0.18320351839065552, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.4958648681640625, + "max_tolerance_ratio": 0.18068185448646545, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.25, + "max_tolerance_ratio": 0.34246575832366943, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.23980712890625, + "max_tolerance_ratio": 0.17070600390434265, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.497955322265625, + "max_tolerance_ratio": 0.18320351839065552, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.4958648681640625, + "max_tolerance_ratio": 0.18068185448646545, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.25, + "max_tolerance_ratio": 0.3401360511779785, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 7.461257337126881e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.0002906797453761101, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 3.130131517536938e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "image", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 1, + "errors": { + "output": 1.8344863997599025e-07, + "temb": 9.273490285511055e-08, + "weight": 7.099722300189181e-08, + "bias": 2.7706756547381565e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.027290459722280502, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.013421783223748207, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.024667181074619293, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.05490561202168465, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.06388657540082932, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.1961669921875e-05, + "max_tolerance_ratio": 0.14643311500549316, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.052625179290771484, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.71661376953125e-05, + "max_tolerance_ratio": 0.05564471706748009, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.06084009259939194, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.1961669921875e-05, + "max_tolerance_ratio": 0.15211275219917297, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.0526248998939991, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 1, + "errors": { + "output": 1.6492596473443072e-07, + "temb": 1.4226083945128942e-07, + "weight": 5.608729641053903e-08, + "bias": 4.2966091046150135e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.04658137261867523, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.015391962602734566, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.0592985600233078, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 2.288818359375e-05, + "max_tolerance_ratio": 0.10501909255981445, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.9311904907226562e-05, + "max_tolerance_ratio": 0.09592200815677643, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 8.392333984375e-05, + "max_tolerance_ratio": 0.6849638819694519, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.13025619089603424, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.08165013045072556, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 2.288818359375e-05, + "max_tolerance_ratio": 0.09498480707406998, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 8.392333984375e-05, + "max_tolerance_ratio": 0.715789794921875, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.13025449216365814, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 1, + "errors": { + "output": 0.0009541984732824427, + "temb": 0.0031927409268893646, + "weight": 0.002266410170583034, + "bias": 0.0031821529669627566 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2118644118309021, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.12478256225585938, + "max_tolerance_ratio": 0.15574432909488678, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.12499618530273438, + "max_tolerance_ratio": 0.16834504902362823, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.2188720703125, + "max_tolerance_ratio": 0.16501650214195251, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.22727271914482117, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.12478256225585938, + "max_tolerance_ratio": 0.15574941039085388, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.12500381469726562, + "max_tolerance_ratio": 0.1683552861213684, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.2188720703125, + "max_tolerance_ratio": 0.16501650214195251, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2283104956150055, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 3.938312147511169e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 2.6702880859375e-05, + "max_tolerance_ratio": 9.083370969165117e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 9.023100574268028e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 1, + "errors": { + "output": 0.0017985611510791368, + "temb": 0.003231405633539381, + "weight": 0.003008460440639708, + "bias": 0.0027979415637741827 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.2732240557670593, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.12498092651367188, + "max_tolerance_ratio": 0.1643940955400467, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.497955322265625, + "max_tolerance_ratio": 0.18320351839065552, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.4958648681640625, + "max_tolerance_ratio": 0.18068185448646545, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.2732240557670593, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.12498092651367188, + "max_tolerance_ratio": 0.16439911723136902, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.497955322265625, + "max_tolerance_ratio": 0.18320351839065552, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.4958648681640625, + "max_tolerance_ratio": 0.18068185448646545, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2369668334722519, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 3.5852914152201265e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.0002906797453761101, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 3.130131517536938e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 1, + "errors": { + "output": 1.7421173834047291e-07, + "temb": 1.3522958402919037e-07, + "weight": 7.099722300189181e-08, + "bias": 2.7706756547381565e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.021124523133039474, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.009825375862419605, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.024667181074619293, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.04237225279211998, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.0967254638671875e-05, + "max_tolerance_ratio": 0.07264716178178787, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.1961669921875e-05, + "max_tolerance_ratio": 0.14643311500549316, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.052625179290771484, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.04040846601128578, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.0967254638671875e-05, + "max_tolerance_ratio": 0.07406149804592133, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.1961669921875e-05, + "max_tolerance_ratio": 0.15211275219917297, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.0526248998939991, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 1, + "errors": { + "output": 1.6512315049687207e-07, + "temb": 1.7417705373612679e-07, + "weight": 5.608729641053903e-08, + "bias": 4.2966091046150135e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.021954214200377464, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.010542030446231365, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.0592985600233078, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.05178914964199066, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.239776611328125e-05, + "max_tolerance_ratio": 0.07096598297357559, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 8.392333984375e-05, + "max_tolerance_ratio": 0.6849638819694519, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.13025619089603424, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.05151664838194847, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.239776611328125e-05, + "max_tolerance_ratio": 0.06953904777765274, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 8.392333984375e-05, + "max_tolerance_ratio": 0.715789794921875, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.13025449216365814, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 3, + "errors": { + "output": 0.0017241379310344827, + "x": 0.0022918355757017427, + "temb": 0.002521676640187697, + "weight": 0.0024402686194578515, + "bias": 0.00209598984816264 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.3086419701576233, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.08460235595703125, + "max_tolerance_ratio": 0.21133986115455627, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.11783218383789062, + "max_tolerance_ratio": 0.1445082277059555, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.24991607666015625, + "max_tolerance_ratio": 0.5201137661933899, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.24755859375, + "max_tolerance_ratio": 0.16694806516170502, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.3086419701576233, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.08459854125976562, + "max_tolerance_ratio": 0.21134361624717712, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.11783218383789062, + "max_tolerance_ratio": 0.14451268315315247, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.2499237060546875, + "max_tolerance_ratio": 0.5201033353805542, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.24755859375, + "max_tolerance_ratio": 0.16694806516170502, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.23364487290382385, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.01902914047241211, + "max_tolerance_ratio": 0.10890155285596848, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 8.693337440490723e-05, + "max_tolerance_ratio": 0.0008197963470593095, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.00511932373046875, + "max_tolerance_ratio": 0.04312054067850113, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0014972686767578125, + "max_tolerance_ratio": 0.005636186338961124, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 3, + "errors": { + "output": 0.0011160714285714285, + "x": 0.0027435503526224325, + "temb": 0.0020779654460454993, + "weight": 0.002028744251497338, + "bias": 0.003136392389107693 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.42553192377090454, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.12425994873046875, + "max_tolerance_ratio": 0.2609896659851074, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.1249237060546875, + "max_tolerance_ratio": 0.16084516048431396, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.5174713134765625, + "max_tolerance_ratio": 0.5843759179115295, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.980377197265625, + "max_tolerance_ratio": 0.18381240963935852, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.42553192377090454, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.12426376342773438, + "max_tolerance_ratio": 0.2503797113895416, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.12492752075195312, + "max_tolerance_ratio": 0.16085025668144226, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.517425537109375, + "max_tolerance_ratio": 0.33197513222694397, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.98040771484375, + "max_tolerance_ratio": 0.183818057179451, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.3378378450870514, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.03814983367919922, + "max_tolerance_ratio": 0.19276545941829681, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.012371063232421875, + "max_tolerance_ratio": 0.03805878013372421, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.08378005027770996, + "max_tolerance_ratio": 0.5888704657554626, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.021964550018310547, + "max_tolerance_ratio": 0.12238036841154099, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.float32", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 3, + "errors": { + "output": 2.1088835559910166e-07, + "x": 1.8153686920948035e-07, + "temb": 1.212697388074594e-07, + "weight": 1.1677714283464705e-07, + "bias": 9.015349874897301e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.04142328351736069, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.02394861914217472, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.025816135108470917, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.07561232149600983, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.04017052799463272, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.043273936957120895, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.057678818702697754, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.0013580322265625e-05, + "max_tolerance_ratio": 0.05602032691240311, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 6.866455078125e-05, + "max_tolerance_ratio": 0.2806696891784668, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.05742284655570984, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.047959454357624054, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.06123972684144974, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.06616637855768204, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 6.866455078125e-05, + "max_tolerance_ratio": 0.2679134011268616, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 2.1457672119140625e-05, + "max_tolerance_ratio": 0.07230695337057114, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 3, + "errors": { + "output": 1.6939559583647307e-07, + "x": 2.361649892319254e-07, + "temb": 1.3906561887338155e-07, + "weight": 9.597127923179213e-08, + "bias": 7.918849018760612e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.04620377719402313, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.03641020506620407, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.030731232836842537, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.16269461810588837, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 2.47955322265625e-05, + "max_tolerance_ratio": 0.06964776664972305, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.71661376953125e-05, + "max_tolerance_ratio": 0.058972813189029694, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 2.09808349609375e-05, + "max_tolerance_ratio": 0.08129753172397614, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 2.6702880859375e-05, + "max_tolerance_ratio": 0.08334607630968094, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.000141143798828125, + "max_tolerance_ratio": 0.7947723865509033, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.9591064453125e-05, + "max_tolerance_ratio": 0.2699914276599884, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.054777055978775024, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.71661376953125e-05, + "max_tolerance_ratio": 0.06895238161087036, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.08252301812171936, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.00014495849609375, + "max_tolerance_ratio": 0.7938678860664368, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.9591064453125e-05, + "max_tolerance_ratio": 0.31561943888664246, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + } + ], + "environment": { + "torch": "2.13.0+cu130", + "cuda": "13.0", + "gpu": "NVIDIA B200", + "workspace": { + "CUBLAS_WORKSPACE_CONFIG": null, + "CUBLASLT_WORKSPACE_SIZE": null + }, + "tf32": false + }, + "scope": "sample batch BI; final uses S=3 for large B, long S tested separately; shared parameter gradients: same ordered inputs, repeat only", + "packages": { + "torch": "2.13.0", + "triton": "3.7.1", + "diffusers": null, + "vllm": "0.30.0", + "sglang": "0.5.21", + "liger-kernel": "0.8.4", + "transformer_engine": null, + "megatron-core": null + } +} diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy_large-2026.json b/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy_large-2026.json new file mode 100644 index 000000000..a29705ad6 --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/accuracy_large-2026.json @@ -0,0 +1,1674 @@ +{ + "mode": "fixed", + "phase": "accuracy_large", + "accuracy_seed": 2026, + "source": { + "base_sha": "55f83d2b9043f41dca84440d9002ca30f5d3fac4", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked_source_sha256": {}, + "workspace_source_sha256": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "qwenimage_source_sha256": { + "csrc/cuda/model_specific/qwenimage/det_linear.cu": "859da456b0c776f3492b3197c252866e33d9a7088508b701b7c4a179ee709afb", + "csrc/cuda/model_specific/qwenimage/token_sum.cu": "1aace24523ff95520ab5d482e2e0f17d09a2efcf93efc8de865c7bcc157cf3ba", + "rl_engine/backends/cuda/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py": "710df5416a2adf5b2576468ff63584b6699e6bdecd59906370049bf09f1b3286", + "rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py": "f6afe4b7568e2026c4b046a4fd0a02589f817d815198af33173d2dba61773f19", + "rl_engine/reference/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py": "1ebc740ddff575055ee66ed714a8c7cc5c6cee2701d582a665289e9ad1a4fe3d", + "rl_engine/reference/model_specific/qwenimage/final_adaln_out.py": "60441610c04d04d0fb1cd7320be8584e76772c110a3cfed77ddf826dbde9b53c", + "benchmarks/models/qwenimage/__init__.py": "a63ebc79ed10d9ed98484565a353438bd13f5801a8f51d7505d0921bf6942742", + "benchmarks/models/qwenimage/adaln_evidence.py": "9dc9f3da0069d36c602baef07d687fb1aeba8fda0163d17fc446e0a543fe1f3e", + "benchmarks/models/qwenimage/adaln_parameter_screen.py": "05562ef30d09296c2ccd1cdeb44085568b8c877d01f5fb1df4b983e84945ec03", + "benchmarks/models/qwenimage/adaln_prior_art.py": "647aa9fc81e02bf3c7806ed6c2a3e578fb3e1a0b000b4388a12367ef86de3139", + "benchmarks/models/qwenimage/adaln_reuse_bi_audit.py": "88dd3d390e647bbc883b76622309fad54dac3618630dcca0785e555db329a671", + "benchmarks/models/qwenimage/adaln_reuse_candidate.py": "4598f6db94462ac30f3bdd3defae16f0ce7a34ac59eb1996d18e86f498c029b6", + "benchmarks/models/qwenimage/plot_adaln_audit.py": "6151e6abccca8f647c2fbeadf92f12e43ed1c07954db9f2db2f035284cbd407c", + "benchmarks/models/qwenimage/plot_adaln_evidence.py": "16d6bed0ee5b808814c5f7157145a730750d0b1aaf94762e6f72a256e942c1e2", + "benchmarks/models/qwenimage/streams.py": "bd27383eee59404df295f724f6c7d620db3d3d7074c19dd94d51a711b38acf02", + "benchmarks/models/qwenimage/validate_adaln_repair.py": "8b663191323b455470a2313cdfefd837657441b300ffd0e0767453f9f407db03" + }, + "extension_sha256": "5d1054db8bba2eaedbd391d0c23b6683acea9ed04fcd64d6f369faed75aa9e0f", + "clean_commit": true + }, + "cases": [ + { + "stream": "image", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 1, + "errors": { + "output": 0.0023584905660377358, + "temb": 0.00261340535879483, + "weight": 0.0020998450437328922, + "bias": 0.0020716162713644935 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.27624309062957764, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.17424774169921875, + "max_tolerance_ratio": 0.1525510847568512, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.12499618530273438, + "max_tolerance_ratio": 0.16833993792533875, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.12469482421875, + "max_tolerance_ratio": 0.16756662726402283, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.28409090638160706, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.17425537109375, + "max_tolerance_ratio": 0.1525510847568512, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.16833993792533875, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.12469482421875, + "max_tolerance_ratio": 0.16756662726402283, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.2857142984867096, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 5.073198917671107e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 2.288818359375e-05, + "max_tolerance_ratio": 7.339855073951185e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 8.907672054192517e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 1, + "errors": { + "output": 0.0017857142857142857, + "temb": 0.003125518570902016, + "weight": 0.003295711987688179, + "bias": 0.0026975460980533496 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.3205128014087677, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.2473602294921875, + "max_tolerance_ratio": 0.17859263718128204, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.496551513671875, + "max_tolerance_ratio": 0.18459637463092804, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.4876251220703125, + "max_tolerance_ratio": 0.18264807760715485, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.3205128014087677, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.2473602294921875, + "max_tolerance_ratio": 0.17859263718128204, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.496551513671875, + "max_tolerance_ratio": 0.18459637463092804, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.487640380859375, + "max_tolerance_ratio": 0.1826537698507309, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.2958579957485199, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 6.329829193418846e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 4.839897155761719e-05, + "max_tolerance_ratio": 0.00035886524710804224, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 3.245815241825767e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "image", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 1, + "errors": { + "output": 1.4420397710242728e-07, + "temb": 8.677175378508863e-08, + "weight": 6.95652214676644e-08, + "bias": 3.171373534061065e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.02819170616567135, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.013890962116420269, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.02412281185388565, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 2.09808349609375e-05, + "max_tolerance_ratio": 0.07207854092121124, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.71661376953125e-05, + "max_tolerance_ratio": 0.06598015129566193, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.15300360321998596, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.04505244642496109, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 2.09808349609375e-05, + "max_tolerance_ratio": 0.07156941294670105, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.71661376953125e-05, + "max_tolerance_ratio": 0.06477151811122894, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.15670418739318848, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.045052651315927505, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 1, + "errors": { + "output": 1.639069471850293e-07, + "temb": 1.2158060809680527e-07, + "weight": 6.582087594680898e-08, + "bias": 4.203769029490488e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.033938050270080566, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.021050184965133667, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06238137558102608, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.09187678247690201, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.10587100684642792, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-05, + "max_tolerance_ratio": 0.5512104034423828, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.11578557640314102, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.07916979491710663, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.10136222839355469, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-05, + "max_tolerance_ratio": 0.5504291653633118, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.11578691750764847, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 1, + "errors": { + "output": 0.001059322033898305, + "temb": 0.003019873775928964, + "weight": 0.0020998450437328922, + "bias": 0.0020716162713644935 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2369668334722519, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.10980224609375, + "max_tolerance_ratio": 0.14722126722335815, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.12499618530273438, + "max_tolerance_ratio": 0.16833993792533875, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.12469482421875, + "max_tolerance_ratio": 0.16756662726402283, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2369668334722519, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.10980606079101562, + "max_tolerance_ratio": 0.14722126722335815, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.16833993792533875, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.12469482421875, + "max_tolerance_ratio": 0.16756662726402283, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2304147332906723, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 3.730764365172945e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 2.288818359375e-05, + "max_tolerance_ratio": 7.339855073951185e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 8.907672054192517e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 1, + "errors": { + "output": 0.0019230769230769232, + "temb": 0.002997920517217817, + "weight": 0.003295711987688179, + "bias": 0.0026975460980533496 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.24038462340831757, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.12469100952148438, + "max_tolerance_ratio": 0.16312187910079956, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.496551513671875, + "max_tolerance_ratio": 0.18459637463092804, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.4876251220703125, + "max_tolerance_ratio": 0.18264807760715485, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.292397677898407, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.12469100952148438, + "max_tolerance_ratio": 0.16311681270599365, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.496551513671875, + "max_tolerance_ratio": 0.18459637463092804, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.487640380859375, + "max_tolerance_ratio": 0.1826537698507309, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.29069769382476807, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 3.96124305552803e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 4.839897155761719e-05, + "max_tolerance_ratio": 0.00035886524710804224, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 3.245815241825767e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 1, + "errors": { + "output": 1.2954905012045472e-07, + "temb": 1.336506450985679e-07, + "weight": 6.95652214676644e-08, + "bias": 3.171373534061065e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.02412950061261654, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.009749803692102432, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.02412281185388565, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.05484478920698166, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.06159532070159912, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.15300360321998596, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.04505244642496109, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.05199723690748215, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.0654190331697464, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.15670418739318848, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.045052651315927505, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 1, + "errors": { + "output": 1.469374531930743e-07, + "temb": 1.4012802035044169e-07, + "weight": 6.582087594680898e-08, + "bias": 4.203769029490488e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.02412950061261654, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.012383597902953625, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06238137558102608, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.05749858543276787, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.06846285611391068, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-05, + "max_tolerance_ratio": 0.5512104034423828, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.11578557640314102, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.05465100333094597, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.06880563497543335, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-05, + "max_tolerance_ratio": 0.5504291653633118, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.11578691750764847, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 3, + "errors": { + "output": 0.0016666666666666668, + "x": 0.0019131980124732387, + "temb": 0.002749815649972173, + "weight": 0.0023720630632083277, + "bias": 0.002080711082775745 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.30674847960472107, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.06469345092773438, + "max_tolerance_ratio": 0.2843155860900879, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.11835861206054688, + "max_tolerance_ratio": 0.15755289793014526, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.24993896484375, + "max_tolerance_ratio": 0.31556078791618347, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.24524688720703125, + "max_tolerance_ratio": 0.1740235835313797, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.30674847960472107, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.064697265625, + "max_tolerance_ratio": 0.2843155860900879, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.1183624267578125, + "max_tolerance_ratio": 0.1575632095336914, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.24993896484375, + "max_tolerance_ratio": 0.3155638873577118, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.2452392578125, + "max_tolerance_ratio": 0.1740235835313797, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2923976480960846, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.04298591613769531, + "max_tolerance_ratio": 0.18417157232761383, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0013270378112792969, + "max_tolerance_ratio": 0.008505583740770817, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.015589714050292969, + "max_tolerance_ratio": 0.09610966593027115, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.00433349609375, + "max_tolerance_ratio": 0.029359297826886177, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 3, + "errors": { + "output": 0.002777777777777778, + "x": 0.0028252918750957578, + "temb": 0.0022393463346164406, + "weight": 0.00199641107921979, + "bias": 0.00267379315697853 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.4464285671710968, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.1197357177734375, + "max_tolerance_ratio": 0.33310744166374207, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.12374496459960938, + "max_tolerance_ratio": 0.16553954780101776, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.514556884765625, + "max_tolerance_ratio": 0.4112074077129364, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.841827392578125, + "max_tolerance_ratio": 0.1854807734489441, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.42016810178756714, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.1730365753173828, + "max_tolerance_ratio": 0.3963826298713684, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.123748779296875, + "max_tolerance_ratio": 0.16554465889930725, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.5145721435546875, + "max_tolerance_ratio": 0.8174415826797485, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.841827392578125, + "max_tolerance_ratio": 0.1999203860759735, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.4464285671710968, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.12171745300292969, + "max_tolerance_ratio": 0.2772773802280426, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.005641937255859375, + "max_tolerance_ratio": 0.02122604474425316, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.12781715393066406, + "max_tolerance_ratio": 0.8058422207832336, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.03735160827636719, + "max_tolerance_ratio": 0.2235129177570343, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.float32", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 3, + "errors": { + "output": 2.0347119829580663e-07, + "x": 2.1813962575678138e-07, + "temb": 1.4302988112313746e-07, + "weight": 1.287221107118685e-07, + "bias": 7.034454255026817e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.03371239826083183, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.023446030914783478, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.019034814089536667, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.06889224797487259, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.05441160127520561, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06988703459501266, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.05271189659833908, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.05464011803269386, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 7.62939453125e-05, + "max_tolerance_ratio": 0.21845215559005737, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 2.288818359375e-05, + "max_tolerance_ratio": 0.0931718647480011, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.05692443996667862, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.038497064262628555, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.05389425531029701, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 7.62939453125e-05, + "max_tolerance_ratio": 0.21504192054271698, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 2.288818359375e-05, + "max_tolerance_ratio": 0.08586305379867554, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 3, + "errors": { + "output": 2.5473317591389136e-07, + "x": 1.9285096232162053e-07, + "temb": 1.236084885183638e-07, + "weight": 1.0016417103288899e-07, + "bias": 7.850600725640875e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.03435913100838661, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.047096606343984604, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.029701784253120422, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.16391108930110931, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.09704241901636124, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06579266488552094, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.71661376953125e-05, + "max_tolerance_ratio": 0.14516928791999817, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06517864018678665, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.000152587890625, + "max_tolerance_ratio": 0.8579254746437073, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.17678789794445038, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.0673169195652008, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.09807410836219788, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06673099845647812, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.000152587890625, + "max_tolerance_ratio": 0.8758082985877991, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.1909382939338684, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + } + ], + "environment": { + "torch": "2.13.0+cu130", + "cuda": "13.0", + "gpu": "NVIDIA B200", + "workspace": { + "CUBLAS_WORKSPACE_CONFIG": null, + "CUBLASLT_WORKSPACE_SIZE": null + }, + "tf32": false + }, + "scope": "sample batch BI; final uses S=3 for large B, long S tested separately; shared parameter gradients: same ordered inputs, repeat only", + "packages": { + "torch": "2.13.0", + "triton": "3.7.1", + "diffusers": null, + "vllm": "0.30.0", + "sglang": "0.5.21", + "liger-kernel": "0.8.4", + "transformer_engine": null, + "megatron-core": null + } +} diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/cancellation-screen.json b/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/cancellation-screen.json new file mode 100644 index 000000000..d0183f164 --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/cancellation-screen.json @@ -0,0 +1,451 @@ +{ + "source": { + "base_sha": "55f83d2b9043f41dca84440d9002ca30f5d3fac4", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked_source_sha256": {}, + "workspace_source_sha256": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "qwenimage_source_sha256": { + "csrc/cuda/model_specific/qwenimage/det_linear.cu": "859da456b0c776f3492b3197c252866e33d9a7088508b701b7c4a179ee709afb", + "csrc/cuda/model_specific/qwenimage/token_sum.cu": "1aace24523ff95520ab5d482e2e0f17d09a2efcf93efc8de865c7bcc157cf3ba", + "rl_engine/backends/cuda/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py": "710df5416a2adf5b2576468ff63584b6699e6bdecd59906370049bf09f1b3286", + "rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py": "f6afe4b7568e2026c4b046a4fd0a02589f817d815198af33173d2dba61773f19", + "rl_engine/reference/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py": "1ebc740ddff575055ee66ed714a8c7cc5c6cee2701d582a665289e9ad1a4fe3d", + "rl_engine/reference/model_specific/qwenimage/final_adaln_out.py": "60441610c04d04d0fb1cd7320be8584e76772c110a3cfed77ddf826dbde9b53c", + "benchmarks/models/qwenimage/__init__.py": "a63ebc79ed10d9ed98484565a353438bd13f5801a8f51d7505d0921bf6942742", + "benchmarks/models/qwenimage/adaln_evidence.py": "9dc9f3da0069d36c602baef07d687fb1aeba8fda0163d17fc446e0a543fe1f3e", + "benchmarks/models/qwenimage/adaln_parameter_screen.py": "05562ef30d09296c2ccd1cdeb44085568b8c877d01f5fb1df4b983e84945ec03", + "benchmarks/models/qwenimage/adaln_prior_art.py": "647aa9fc81e02bf3c7806ed6c2a3e578fb3e1a0b000b4388a12367ef86de3139", + "benchmarks/models/qwenimage/adaln_reuse_bi_audit.py": "88dd3d390e647bbc883b76622309fad54dac3618630dcca0785e555db329a671", + "benchmarks/models/qwenimage/adaln_reuse_candidate.py": "4598f6db94462ac30f3bdd3defae16f0ce7a34ac59eb1996d18e86f498c029b6", + "benchmarks/models/qwenimage/plot_adaln_audit.py": "6151e6abccca8f647c2fbeadf92f12e43ed1c07954db9f2db2f035284cbd407c", + "benchmarks/models/qwenimage/plot_adaln_evidence.py": "16d6bed0ee5b808814c5f7157145a730750d0b1aaf94762e6f72a256e942c1e2", + "benchmarks/models/qwenimage/streams.py": "bd27383eee59404df295f724f6c7d620db3d3d7074c19dd94d51a711b38acf02", + "benchmarks/models/qwenimage/validate_adaln_repair.py": "8b663191323b455470a2313cdfefd837657441b300ffd0e0767453f9f407db03" + }, + "extension_sha256": "5d1054db8bba2eaedbd391d0c23b6683acea9ed04fcd64d6f369faed75aa9e0f", + "clean_commit": true + }, + "torch": "2.13.0+cu130", + "gpu": "NVIDIA B200", + "construction": "grad[B,2]=1; grad[0]=2**26; grad[-1]=-2**26; act[B,7]=1; act[:,1::2]=1.5", + "cases": [ + { + "dtype": "torch.float32", + "batch": 255, + "fp64": [ + [ + 253.0, + 379.5, + 253.0, + 379.5, + 253.0, + 379.5, + 253.0 + ], + [ + 253.0, + 379.5, + 253.0, + 379.5, + 253.0, + 379.5, + 253.0 + ] + ], + "fixed_actual": [ + [ + 253.0, + 379.5, + 253.0, + 379.5, + 253.0, + 379.5, + 253.0 + ], + [ + 253.0, + 379.5, + 253.0, + 379.5, + 253.0, + 379.5, + 253.0 + ] + ], + "fixed_contract": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + { + "dtype": "torch.float32", + "batch": 256, + "fp64": [ + [ + 254.0, + 381.0, + 254.0, + 381.0, + 254.0, + 381.0, + 254.0 + ], + [ + 254.0, + 381.0, + 254.0, + 381.0, + 254.0, + 381.0, + 254.0 + ] + ], + "fixed_actual": [ + [ + 254.0, + 381.0, + 254.0, + 381.0, + 254.0, + 381.0, + 254.0 + ], + [ + 254.0, + 381.0, + 254.0, + 381.0, + 254.0, + 381.0, + 254.0 + ] + ], + "fixed_contract": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + { + "dtype": "torch.float32", + "batch": 257, + "fp64": [ + [ + 255.0, + 382.5, + 255.0, + 382.5, + 255.0, + 382.5, + 255.0 + ], + [ + 255.0, + 382.5, + 255.0, + 382.5, + 255.0, + 382.5, + 255.0 + ] + ], + "fixed_actual": [ + [ + 255.0, + 382.5, + 255.0, + 382.5, + 255.0, + 382.5, + 255.0 + ], + [ + 255.0, + 382.5, + 255.0, + 382.5, + 255.0, + 382.5, + 255.0 + ] + ], + "fixed_contract": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + { + "dtype": "torch.float32", + "batch": 2048, + "fp64": [ + [ + 2046.0, + 3069.0, + 2046.0, + 3069.0, + 2046.0, + 3069.0, + 2046.0 + ], + [ + 2046.0, + 3069.0, + 2046.0, + 3069.0, + 2046.0, + 3069.0, + 2046.0 + ] + ], + "fixed_actual": [ + [ + 2046.0, + 3069.0, + 2046.0, + 3069.0, + 2046.0, + 3069.0, + 2046.0 + ], + [ + 2046.0, + 3069.0, + 2046.0, + 3069.0, + 2046.0, + 3069.0, + 2046.0 + ] + ], + "fixed_contract": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + { + "dtype": "torch.bfloat16", + "batch": 255, + "fp64": [ + [ + 253.0, + 379.5, + 253.0, + 379.5, + 253.0, + 379.5, + 253.0 + ], + [ + 253.0, + 379.5, + 253.0, + 379.5, + 253.0, + 379.5, + 253.0 + ] + ], + "fixed_actual": [ + [ + 253.0, + 380.0, + 253.0, + 380.0, + 253.0, + 380.0, + 253.0 + ], + [ + 253.0, + 380.0, + 253.0, + 380.0, + 253.0, + 380.0, + 253.0 + ] + ], + "fixed_contract": { + "passed": true, + "max_abs": 0.5, + "max_tolerance_ratio": 0.06501951068639755, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + { + "dtype": "torch.bfloat16", + "batch": 256, + "fp64": [ + [ + 254.0, + 381.0, + 254.0, + 381.0, + 254.0, + 381.0, + 254.0 + ], + [ + 254.0, + 381.0, + 254.0, + 381.0, + 254.0, + 381.0, + 254.0 + ] + ], + "fixed_actual": [ + [ + 254.0, + 380.0, + 254.0, + 380.0, + 254.0, + 380.0, + 254.0 + ], + [ + 254.0, + 380.0, + 254.0, + 380.0, + 254.0, + 380.0, + 254.0 + ] + ], + "fixed_contract": { + "passed": true, + "max_abs": 1.0, + "max_tolerance_ratio": 0.12953367829322815, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + { + "dtype": "torch.bfloat16", + "batch": 257, + "fp64": [ + [ + 255.0, + 382.5, + 255.0, + 382.5, + 255.0, + 382.5, + 255.0 + ], + [ + 255.0, + 382.5, + 255.0, + 382.5, + 255.0, + 382.5, + 255.0 + ] + ], + "fixed_actual": [ + [ + 255.0, + 382.0, + 255.0, + 382.0, + 255.0, + 382.0, + 255.0 + ], + [ + 255.0, + 382.0, + 255.0, + 382.0, + 255.0, + 382.0, + 255.0 + ] + ], + "fixed_contract": { + "passed": true, + "max_abs": 0.5, + "max_tolerance_ratio": 0.06451613456010818, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + { + "dtype": "torch.bfloat16", + "batch": 2048, + "fp64": [ + [ + 2046.0, + 3069.0, + 2046.0, + 3069.0, + 2046.0, + 3069.0, + 2046.0 + ], + [ + 2046.0, + 3069.0, + 2046.0, + 3069.0, + 2046.0, + 3069.0, + 2046.0 + ] + ], + "fixed_actual": [ + [ + 2048.0, + 3072.0, + 2048.0, + 3072.0, + 2048.0, + 3072.0, + 2048.0 + ], + [ + 2048.0, + 3072.0, + 2048.0, + 3072.0, + 2048.0, + 3072.0, + 2048.0 + ] + ], + "fixed_contract": { + "passed": true, + "max_abs": 3.0, + "max_tolerance_ratio": 0.048796359449625015, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + ] +} diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/parameters-0.json b/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/parameters-0.json new file mode 100644 index 000000000..8be64a2e3 --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/parameters-0.json @@ -0,0 +1,1352 @@ +{ + "mode": "fixed", + "phase": "parameters", + "accuracy_seed": 0, + "source": { + "base_sha": "55f83d2b9043f41dca84440d9002ca30f5d3fac4", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked_source_sha256": {}, + "workspace_source_sha256": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "qwenimage_source_sha256": { + "csrc/cuda/model_specific/qwenimage/det_linear.cu": "859da456b0c776f3492b3197c252866e33d9a7088508b701b7c4a179ee709afb", + "csrc/cuda/model_specific/qwenimage/token_sum.cu": "1aace24523ff95520ab5d482e2e0f17d09a2efcf93efc8de865c7bcc157cf3ba", + "rl_engine/backends/cuda/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py": "710df5416a2adf5b2576468ff63584b6699e6bdecd59906370049bf09f1b3286", + "rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py": "f6afe4b7568e2026c4b046a4fd0a02589f817d815198af33173d2dba61773f19", + "rl_engine/reference/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py": "1ebc740ddff575055ee66ed714a8c7cc5c6cee2701d582a665289e9ad1a4fe3d", + "rl_engine/reference/model_specific/qwenimage/final_adaln_out.py": "60441610c04d04d0fb1cd7320be8584e76772c110a3cfed77ddf826dbde9b53c", + "benchmarks/models/qwenimage/__init__.py": "a63ebc79ed10d9ed98484565a353438bd13f5801a8f51d7505d0921bf6942742", + "benchmarks/models/qwenimage/adaln_evidence.py": "9dc9f3da0069d36c602baef07d687fb1aeba8fda0163d17fc446e0a543fe1f3e", + "benchmarks/models/qwenimage/adaln_parameter_screen.py": "05562ef30d09296c2ccd1cdeb44085568b8c877d01f5fb1df4b983e84945ec03", + "benchmarks/models/qwenimage/adaln_prior_art.py": "647aa9fc81e02bf3c7806ed6c2a3e578fb3e1a0b000b4388a12367ef86de3139", + "benchmarks/models/qwenimage/adaln_reuse_bi_audit.py": "88dd3d390e647bbc883b76622309fad54dac3618630dcca0785e555db329a671", + "benchmarks/models/qwenimage/adaln_reuse_candidate.py": "4598f6db94462ac30f3bdd3defae16f0ce7a34ac59eb1996d18e86f498c029b6", + "benchmarks/models/qwenimage/plot_adaln_audit.py": "6151e6abccca8f647c2fbeadf92f12e43ed1c07954db9f2db2f035284cbd407c", + "benchmarks/models/qwenimage/plot_adaln_evidence.py": "16d6bed0ee5b808814c5f7157145a730750d0b1aaf94762e6f72a256e942c1e2", + "benchmarks/models/qwenimage/streams.py": "bd27383eee59404df295f724f6c7d620db3d3d7074c19dd94d51a711b38acf02", + "benchmarks/models/qwenimage/validate_adaln_repair.py": "8b663191323b455470a2313cdfefd837657441b300ffd0e0767453f9f407db03" + }, + "extension_sha256": "5d1054db8bba2eaedbd391d0c23b6683acea9ed04fcd64d6f369faed75aa9e0f", + "clean_commit": true + }, + "cases": [ + { + "stream": "image", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "parameter_repeat", + "batch": 1, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 255, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 256, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 257, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 2048, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 256, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 257, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 1, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 255, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 256, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 257, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 2048, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 256, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 257, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 1, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 255, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 256, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 257, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 2048, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 256, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 257, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + } + ] + }, + { + "stream": "image", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "parameter_repeat", + "batch": 1, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 255, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 256, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 257, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 2048, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 256, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 257, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 1, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 255, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 256, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 257, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 2048, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 256, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 257, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 1, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 255, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 256, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 257, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 2048, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 256, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 257, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "parameter_repeat", + "batch": 1, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 255, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 256, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 257, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 2048, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 256, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 257, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 1, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 255, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 256, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 257, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 2048, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 256, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 257, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 1, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 255, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 256, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 257, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 2048, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 256, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 257, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "parameter_repeat", + "batch": 1, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 255, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 256, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 257, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 2048, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 256, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 257, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 1, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 255, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 256, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 257, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 2048, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 256, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 257, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 1, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 255, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 256, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 257, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 2048, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 256, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 257, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "parameter_repeat", + "batch": 1, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 255, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 256, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 257, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 2048, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 256, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 257, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 1, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 255, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 256, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 257, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 2048, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 256, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 257, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 1, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 255, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 256, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 257, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 2048, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 256, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 257, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.float32", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "parameter_repeat", + "batch": 1, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 255, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 256, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 257, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 2048, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 256, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 257, + "seed": 0, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 1, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 255, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 256, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 257, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 2048, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 256, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 257, + "seed": 127, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 1, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 255, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 256, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 257, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "parameter_repeat", + "batch": 2048, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 256, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + }, + { + "kind": "ordered_contributions_zero_padding", + "batch": 257, + "seed": 2026, + "all_equal": { + "weight": true, + "bias": true + } + } + ] + } + ], + "environment": { + "torch": "2.13.0+cu130", + "cuda": "13.0", + "gpu": "NVIDIA B200", + "workspace": { + "CUBLAS_WORKSPACE_CONFIG": null, + "CUBLASLT_WORKSPACE_SIZE": null + }, + "tf32": false + }, + "scope": "sample batch BI; final uses S=3 for large B, long S tested separately; shared parameter gradients: same ordered inputs, repeat only", + "packages": { + "torch": "2.13.0", + "triton": "3.7.1", + "diffusers": null, + "vllm": "0.30.0", + "sglang": "0.5.21", + "liger-kernel": "0.8.4", + "transformer_engine": null, + "megatron-core": null + } +} diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/workload-0.json b/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/workload-0.json new file mode 100644 index 000000000..348be1a5a --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/fixed/workload-0.json @@ -0,0 +1,1238 @@ +{ + "mode": "fixed", + "phase": "workload", + "accuracy_seed": 0, + "source": { + "base_sha": "55f83d2b9043f41dca84440d9002ca30f5d3fac4", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked_source_sha256": {}, + "workspace_source_sha256": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "qwenimage_source_sha256": { + "csrc/cuda/model_specific/qwenimage/det_linear.cu": "859da456b0c776f3492b3197c252866e33d9a7088508b701b7c4a179ee709afb", + "csrc/cuda/model_specific/qwenimage/token_sum.cu": "1aace24523ff95520ab5d482e2e0f17d09a2efcf93efc8de865c7bcc157cf3ba", + "rl_engine/backends/cuda/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py": "710df5416a2adf5b2576468ff63584b6699e6bdecd59906370049bf09f1b3286", + "rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py": "f6afe4b7568e2026c4b046a4fd0a02589f817d815198af33173d2dba61773f19", + "rl_engine/reference/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py": "1ebc740ddff575055ee66ed714a8c7cc5c6cee2701d582a665289e9ad1a4fe3d", + "rl_engine/reference/model_specific/qwenimage/final_adaln_out.py": "60441610c04d04d0fb1cd7320be8584e76772c110a3cfed77ddf826dbde9b53c", + "benchmarks/models/qwenimage/__init__.py": "a63ebc79ed10d9ed98484565a353438bd13f5801a8f51d7505d0921bf6942742", + "benchmarks/models/qwenimage/adaln_evidence.py": "9dc9f3da0069d36c602baef07d687fb1aeba8fda0163d17fc446e0a543fe1f3e", + "benchmarks/models/qwenimage/adaln_parameter_screen.py": "05562ef30d09296c2ccd1cdeb44085568b8c877d01f5fb1df4b983e84945ec03", + "benchmarks/models/qwenimage/adaln_prior_art.py": "647aa9fc81e02bf3c7806ed6c2a3e578fb3e1a0b000b4388a12367ef86de3139", + "benchmarks/models/qwenimage/adaln_reuse_bi_audit.py": "88dd3d390e647bbc883b76622309fad54dac3618630dcca0785e555db329a671", + "benchmarks/models/qwenimage/adaln_reuse_candidate.py": "4598f6db94462ac30f3bdd3defae16f0ce7a34ac59eb1996d18e86f498c029b6", + "benchmarks/models/qwenimage/plot_adaln_audit.py": "6151e6abccca8f647c2fbeadf92f12e43ed1c07954db9f2db2f035284cbd407c", + "benchmarks/models/qwenimage/plot_adaln_evidence.py": "16d6bed0ee5b808814c5f7157145a730750d0b1aaf94762e6f72a256e942c1e2", + "benchmarks/models/qwenimage/streams.py": "bd27383eee59404df295f724f6c7d620db3d3d7074c19dd94d51a711b38acf02", + "benchmarks/models/qwenimage/validate_adaln_repair.py": "8b663191323b455470a2313cdfefd837657441b300ffd0e0767453f9f407db03" + }, + "extension_sha256": "5d1054db8bba2eaedbd391d0c23b6683acea9ed04fcd64d6f369faed75aa9e0f", + "clean_commit": true + }, + "cases": [ + { + "stream": "image", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + } + ] + }, + { + "stream": "image", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.float32", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + } + ] + } + ], + "environment": { + "torch": "2.13.0+cu130", + "cuda": "13.0", + "gpu": "NVIDIA B200", + "workspace": { + "CUBLAS_WORKSPACE_CONFIG": null, + "CUBLASLT_WORKSPACE_SIZE": null + }, + "tf32": false + }, + "scope": "sample batch BI; final uses S=3 for large B, long S tested separately; shared parameter gradients: same ordered inputs, repeat only", + "packages": { + "torch": "2.13.0", + "triton": "3.7.1", + "diffusers": null, + "vllm": "0.30.0", + "sglang": "0.5.21", + "liger-kernel": "0.8.4", + "transformer_engine": null, + "megatron-core": null + } +} diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/prior-art.json b/docs/usage/evidence/qwenimage-final-adaln-out-b200/prior-art.json new file mode 100644 index 000000000..693b1cb27 --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/prior-art.json @@ -0,0 +1,1451 @@ +{ + "source": { + "base_sha": "55f83d2b9043f41dca84440d9002ca30f5d3fac4", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked_source_sha256": {}, + "workspace_source_sha256": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "qwenimage_source_sha256": { + "csrc/cuda/model_specific/qwenimage/det_linear.cu": "859da456b0c776f3492b3197c252866e33d9a7088508b701b7c4a179ee709afb", + "csrc/cuda/model_specific/qwenimage/token_sum.cu": "1aace24523ff95520ab5d482e2e0f17d09a2efcf93efc8de865c7bcc157cf3ba", + "rl_engine/backends/cuda/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py": "710df5416a2adf5b2576468ff63584b6699e6bdecd59906370049bf09f1b3286", + "rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py": "f6afe4b7568e2026c4b046a4fd0a02589f817d815198af33173d2dba61773f19", + "rl_engine/reference/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py": "1ebc740ddff575055ee66ed714a8c7cc5c6cee2701d582a665289e9ad1a4fe3d", + "rl_engine/reference/model_specific/qwenimage/final_adaln_out.py": "60441610c04d04d0fb1cd7320be8584e76772c110a3cfed77ddf826dbde9b53c", + "benchmarks/models/qwenimage/__init__.py": "a63ebc79ed10d9ed98484565a353438bd13f5801a8f51d7505d0921bf6942742", + "benchmarks/models/qwenimage/adaln_evidence.py": "9dc9f3da0069d36c602baef07d687fb1aeba8fda0163d17fc446e0a543fe1f3e", + "benchmarks/models/qwenimage/adaln_parameter_screen.py": "05562ef30d09296c2ccd1cdeb44085568b8c877d01f5fb1df4b983e84945ec03", + "benchmarks/models/qwenimage/adaln_prior_art.py": "647aa9fc81e02bf3c7806ed6c2a3e578fb3e1a0b000b4388a12367ef86de3139", + "benchmarks/models/qwenimage/adaln_reuse_bi_audit.py": "88dd3d390e647bbc883b76622309fad54dac3618630dcca0785e555db329a671", + "benchmarks/models/qwenimage/adaln_reuse_candidate.py": "4598f6db94462ac30f3bdd3defae16f0ce7a34ac59eb1996d18e86f498c029b6", + "benchmarks/models/qwenimage/plot_adaln_audit.py": "6151e6abccca8f647c2fbeadf92f12e43ed1c07954db9f2db2f035284cbd407c", + "benchmarks/models/qwenimage/plot_adaln_evidence.py": "16d6bed0ee5b808814c5f7157145a730750d0b1aaf94762e6f72a256e942c1e2", + "benchmarks/models/qwenimage/streams.py": "bd27383eee59404df295f724f6c7d620db3d3d7074c19dd94d51a711b38acf02", + "benchmarks/models/qwenimage/validate_adaln_repair.py": "8b663191323b455470a2313cdfefd837657441b300ffd0e0767453f9f407db03" + }, + "extension_sha256": "5d1054db8bba2eaedbd391d0c23b6683acea9ed04fcd64d6f369faed75aa9e0f", + "clean_commit": true + }, + "cases": [ + { + "stream": "image", + "dtype": "torch.bfloat16", + "implementation": "native", + "batch_invariance_violations": [], + "forward_b1_ms": [ + 0.06595200300216675, + 0.0379519984126091, + 0.03683200106024742, + 0.036159999668598175, + 0.036288000643253326, + 0.0352960005402565, + 0.03641600161790848, + 0.03497600182890892, + 0.03580800071358681, + 0.033824000507593155, + 0.035711999982595444, + 0.03440000116825104, + 0.03596799820661545, + 0.03436800092458725, + 0.03494400158524513 + ], + "timing_order": [ + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ] + ] + }, + { + "stream": "image", + "dtype": "torch.bfloat16", + "implementation": "fixed_gemv", + "batch_invariance_violations": [], + "forward_b1_ms": [ + 0.0390079990029335, + 0.04303999990224838, + 0.03606399893760681, + 0.04137599840760231, + 0.03500799834728241, + 0.04032000154256821, + 0.03680000081658363, + 0.04064000025391579, + 0.03455999866127968, + 0.04108799993991852, + 0.03500799834728241, + 0.040832001715898514, + 0.0350399985909462, + 0.04047999903559685, + 0.03465599939227104 + ], + "timing_order": [ + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ] + ] + }, + { + "stream": "image", + "dtype": "torch.float32", + "implementation": "native", + "batch_invariance_violations": [ + { + "batch": 2, + "position": 0, + "differing_bytes": 14866 + }, + { + "batch": 2, + "position": 1, + "differing_bytes": 14866 + }, + { + "batch": 3, + "position": 0, + "differing_bytes": 14866 + }, + { + "batch": 3, + "position": 1, + "differing_bytes": 14866 + }, + { + "batch": 3, + "position": 2, + "differing_bytes": 14866 + }, + { + "batch": 4, + "position": 0, + "differing_bytes": 19310 + }, + { + "batch": 4, + "position": 2, + "differing_bytes": 19310 + }, + { + "batch": 4, + "position": 3, + "differing_bytes": 19310 + }, + { + "batch": 7, + "position": 0, + "differing_bytes": 19310 + }, + { + "batch": 7, + "position": 3, + "differing_bytes": 19310 + }, + { + "batch": 7, + "position": 6, + "differing_bytes": 19310 + }, + { + "batch": 8, + "position": 0, + "differing_bytes": 19310 + }, + { + "batch": 8, + "position": 4, + "differing_bytes": 19310 + }, + { + "batch": 8, + "position": 7, + "differing_bytes": 19310 + }, + { + "batch": 9, + "position": 0, + "differing_bytes": 19310 + }, + { + "batch": 9, + "position": 4, + "differing_bytes": 19310 + }, + { + "batch": 9, + "position": 8, + "differing_bytes": 19310 + }, + { + "batch": 16, + "position": 0, + "differing_bytes": 19310 + }, + { + "batch": 16, + "position": 8, + "differing_bytes": 19310 + }, + { + "batch": 16, + "position": 15, + "differing_bytes": 19310 + }, + { + "batch": 33, + "position": 0, + "differing_bytes": 19310 + }, + { + "batch": 33, + "position": 16, + "differing_bytes": 19310 + }, + { + "batch": 33, + "position": 32, + "differing_bytes": 19310 + }, + { + "batch": 64, + "position": 0, + "differing_bytes": 19310 + }, + { + "batch": 64, + "position": 32, + "differing_bytes": 19310 + }, + { + "batch": 64, + "position": 63, + "differing_bytes": 19310 + } + ], + "forward_b1_ms": [ + 0.048128001391887665, + 0.055615998804569244, + 0.05475199967622757, + 0.05603199824690819, + 0.05423999950289726, + 0.0551999993622303, + 0.05398400127887726, + 0.05478399991989136, + 0.0544000007212162, + 0.052799999713897705, + 0.05209600180387497, + 0.05251200124621391, + 0.052000001072883606, + 0.05446400120854378, + 0.05225599929690361 + ], + "timing_order": [ + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ] + ] + }, + { + "stream": "image", + "dtype": "torch.float32", + "implementation": "fixed_gemv", + "batch_invariance_violations": [], + "forward_b1_ms": [ + 0.047359999269247055, + 0.051552001386880875, + 0.04742399975657463, + 0.04950400069355965, + 0.04758400097489357, + 0.05097600072622299, + 0.04668800160288811, + 0.049375999718904495, + 0.04569600149989128, + 0.051231998950242996, + 0.046560000628232956, + 0.050624001771211624, + 0.046720001846551895, + 0.05020799860358238, + 0.04774399846792221 + ], + "timing_order": [ + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ] + ] + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "implementation": "native", + "batch_invariance_violations": [], + "forward_b1_ms": [ + 0.039903998374938965, + 0.035679999738931656, + 0.034752000123262405, + 0.03494400158524513, + 0.035392001271247864, + 0.03510399907827377, + 0.03481600061058998, + 0.035071998834609985, + 0.034623999148607254, + 0.0344959981739521, + 0.03376000002026558, + 0.03404799848794937, + 0.03407999873161316, + 0.03446400165557861, + 0.03440000116825104 + ], + "timing_order": [ + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ] + ] + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "implementation": "fixed_gemv", + "batch_invariance_violations": [], + "forward_b1_ms": [ + 0.03711999952793121, + 0.039903998374938965, + 0.03577600046992302, + 0.040608000010252, + 0.03545600175857544, + 0.04064000025391579, + 0.035071998834609985, + 0.04508800059556961, + 0.03545600175857544, + 0.04022400081157684, + 0.034752000123262405, + 0.03840000182390213, + 0.03455999866127968, + 0.04028800129890442, + 0.036607999354600906 + ], + "timing_order": [ + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ] + ] + }, + { + "stream": "text", + "dtype": "torch.float32", + "implementation": "native", + "batch_invariance_violations": [ + { + "batch": 2, + "position": 0, + "differing_bytes": 15082 + }, + { + "batch": 2, + "position": 1, + "differing_bytes": 15082 + }, + { + "batch": 3, + "position": 0, + "differing_bytes": 15082 + }, + { + "batch": 3, + "position": 1, + "differing_bytes": 15082 + }, + { + "batch": 3, + "position": 2, + "differing_bytes": 15082 + }, + { + "batch": 4, + "position": 0, + "differing_bytes": 19376 + }, + { + "batch": 4, + "position": 2, + "differing_bytes": 19376 + }, + { + "batch": 4, + "position": 3, + "differing_bytes": 19376 + }, + { + "batch": 7, + "position": 0, + "differing_bytes": 19376 + }, + { + "batch": 7, + "position": 3, + "differing_bytes": 19376 + }, + { + "batch": 7, + "position": 6, + "differing_bytes": 19376 + }, + { + "batch": 8, + "position": 0, + "differing_bytes": 19376 + }, + { + "batch": 8, + "position": 4, + "differing_bytes": 19376 + }, + { + "batch": 8, + "position": 7, + "differing_bytes": 19376 + }, + { + "batch": 9, + "position": 0, + "differing_bytes": 19376 + }, + { + "batch": 9, + "position": 4, + "differing_bytes": 19376 + }, + { + "batch": 9, + "position": 8, + "differing_bytes": 19376 + }, + { + "batch": 16, + "position": 0, + "differing_bytes": 19376 + }, + { + "batch": 16, + "position": 8, + "differing_bytes": 19376 + }, + { + "batch": 16, + "position": 15, + "differing_bytes": 19376 + }, + { + "batch": 33, + "position": 0, + "differing_bytes": 19376 + }, + { + "batch": 33, + "position": 16, + "differing_bytes": 19376 + }, + { + "batch": 33, + "position": 32, + "differing_bytes": 19376 + }, + { + "batch": 64, + "position": 0, + "differing_bytes": 19376 + }, + { + "batch": 64, + "position": 32, + "differing_bytes": 19376 + }, + { + "batch": 64, + "position": 63, + "differing_bytes": 19376 + } + ], + "forward_b1_ms": [ + 0.04630399867892265, + 0.05532800033688545, + 0.05350400134921074, + 0.0541439987719059, + 0.053599998354911804, + 0.05459199845790863, + 0.05180799961090088, + 0.05241600051522255, + 0.05455999821424484, + 0.05766399949789047, + 0.05369599908590317, + 0.05238400027155876, + 0.054336000233888626, + 0.053119998425245285, + 0.05305600166320801 + ], + "timing_order": [ + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ] + ] + }, + { + "stream": "text", + "dtype": "torch.float32", + "implementation": "fixed_gemv", + "batch_invariance_violations": [], + "forward_b1_ms": [ + 0.04527999833226204, + 0.04831999912858009, + 0.044863998889923096, + 0.04668800160288811, + 0.04476799815893173, + 0.048608001321554184, + 0.04505600035190582, + 0.04665600135922432, + 0.0451200008392334, + 0.04761600121855736, + 0.044544000178575516, + 0.04739199951291084, + 0.044704001396894455, + 0.04620800167322159, + 0.04479999840259552 + ], + "timing_order": [ + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ] + ] + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "implementation": "native", + "batch_invariance_violations": [], + "forward_b1_ms": [ + 0.03267199918627739, + 0.027264000847935677, + 0.02521600015461445, + 0.025407999753952026, + 0.026016000658273697, + 0.030112000182271004, + 0.025855999439954758, + 0.024831999093294144, + 0.02537599951028824, + 0.028704000636935234, + 0.024320000782608986, + 0.025472000241279602, + 0.024320000782608986, + 0.024607999250292778, + 0.02489599958062172 + ], + "timing_order": [ + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ] + ] + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "implementation": "fixed_gemv", + "batch_invariance_violations": [], + "forward_b1_ms": [ + 0.03407999873161316, + 0.03190400078892708, + 0.03411199897527695, + 0.03299200162291527, + 0.032896000891923904, + 0.033055998384952545, + 0.03340800106525421, + 0.032896000891923904, + 0.03299200162291527, + 0.03311999887228012, + 0.033344000577926636, + 0.032127998769283295, + 0.03244800120592117, + 0.0318400003015995, + 0.03315199911594391 + ], + "timing_order": [ + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ] + ] + }, + { + "stream": "final", + "dtype": "torch.float32", + "implementation": "native", + "batch_invariance_violations": [ + { + "batch": 2, + "position": 0, + "differing_bytes": 4851 + }, + { + "batch": 2, + "position": 1, + "differing_bytes": 4851 + }, + { + "batch": 3, + "position": 0, + "differing_bytes": 5532 + }, + { + "batch": 3, + "position": 1, + "differing_bytes": 5532 + }, + { + "batch": 3, + "position": 2, + "differing_bytes": 5532 + }, + { + "batch": 4, + "position": 0, + "differing_bytes": 5532 + }, + { + "batch": 4, + "position": 2, + "differing_bytes": 5532 + }, + { + "batch": 4, + "position": 3, + "differing_bytes": 5532 + }, + { + "batch": 7, + "position": 0, + "differing_bytes": 5469 + }, + { + "batch": 7, + "position": 3, + "differing_bytes": 5469 + }, + { + "batch": 7, + "position": 6, + "differing_bytes": 5469 + }, + { + "batch": 8, + "position": 0, + "differing_bytes": 5469 + }, + { + "batch": 8, + "position": 4, + "differing_bytes": 5469 + }, + { + "batch": 8, + "position": 7, + "differing_bytes": 5469 + }, + { + "batch": 9, + "position": 0, + "differing_bytes": 5826 + }, + { + "batch": 9, + "position": 4, + "differing_bytes": 5826 + }, + { + "batch": 9, + "position": 8, + "differing_bytes": 5826 + }, + { + "batch": 16, + "position": 0, + "differing_bytes": 5469 + }, + { + "batch": 16, + "position": 8, + "differing_bytes": 5469 + }, + { + "batch": 16, + "position": 15, + "differing_bytes": 5469 + }, + { + "batch": 33, + "position": 0, + "differing_bytes": 6280 + }, + { + "batch": 33, + "position": 16, + "differing_bytes": 6280 + }, + { + "batch": 33, + "position": 32, + "differing_bytes": 6280 + }, + { + "batch": 64, + "position": 0, + "differing_bytes": 6280 + }, + { + "batch": 64, + "position": 32, + "differing_bytes": 6280 + }, + { + "batch": 64, + "position": 63, + "differing_bytes": 6280 + } + ], + "forward_b1_ms": [ + 0.03587200120091438, + 0.03203200176358223, + 0.03222399950027466, + 0.03097599931061268, + 0.03139200061559677, + 0.03126399964094162, + 0.03292800113558769, + 0.03232000023126602, + 0.030848000198602676, + 0.031168000772595406, + 0.030688000842928886, + 0.031168000772595406, + 0.03187200054526329, + 0.03081599995493889, + 0.030688000842928886 + ], + "timing_order": [ + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ] + ] + }, + { + "stream": "final", + "dtype": "torch.float32", + "implementation": "fixed_gemv", + "batch_invariance_violations": [], + "forward_b1_ms": [ + 0.03200000151991844, + 0.026944000273942947, + 0.02723200060427189, + 0.026079999282956123, + 0.027264000847935677, + 0.026335999369621277, + 0.027135999873280525, + 0.025312000885605812, + 0.02659199945628643, + 0.025887999683618546, + 0.02630399912595749, + 0.030432000756263733, + 0.02672000043094158, + 0.025919999927282333, + 0.026079999282956123 + ], + "timing_order": [ + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ], + [ + "fixed_gemv", + "native" + ], + [ + "native", + "fixed_gemv" + ] + ] + } + ], + "tf32": false, + "environment": { + "torch": "2.13.0+cu130", + "cuda": "13.0", + "gpu": "NVIDIA B200" + } +} diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/report.json b/docs/usage/evidence/qwenimage-final-adaln-out-b200/report.json new file mode 100644 index 000000000..ac679e93c --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/report.json @@ -0,0 +1,7490 @@ +{ + "checkpoint": "Qwen/Qwen-Image", + "checkpoint_revision": "75e0b4be04f60ec59a75f475837eced720f823b6", + "diffusers_revision": "d961a388fd02e4db38d17350c8dd9b8abe642e05", + "diffusers_source_sha256": { + "transformer_qwenimage.py": "0bad11901deae69f05aec01fd464e51e38582d455068f2851ee665036179321f", + "normalization.py": "a3c40cee9308a0e339cca21c14bf51f394c61ae68e5b9a578e5636441f5eaa84" + }, + "source": { + "base_sha": "55f83d2b9043f41dca84440d9002ca30f5d3fac4", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked_source_sha256": {}, + "workspace_source_sha256": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "qwenimage_source_sha256": { + "csrc/cuda/model_specific/qwenimage/det_linear.cu": "859da456b0c776f3492b3197c252866e33d9a7088508b701b7c4a179ee709afb", + "csrc/cuda/model_specific/qwenimage/token_sum.cu": "1aace24523ff95520ab5d482e2e0f17d09a2efcf93efc8de865c7bcc157cf3ba", + "rl_engine/backends/cuda/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py": "710df5416a2adf5b2576468ff63584b6699e6bdecd59906370049bf09f1b3286", + "rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py": "f6afe4b7568e2026c4b046a4fd0a02589f817d815198af33173d2dba61773f19", + "rl_engine/reference/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py": "1ebc740ddff575055ee66ed714a8c7cc5c6cee2701d582a665289e9ad1a4fe3d", + "rl_engine/reference/model_specific/qwenimage/final_adaln_out.py": "60441610c04d04d0fb1cd7320be8584e76772c110a3cfed77ddf826dbde9b53c", + "benchmarks/models/qwenimage/__init__.py": "a63ebc79ed10d9ed98484565a353438bd13f5801a8f51d7505d0921bf6942742", + "benchmarks/models/qwenimage/adaln_evidence.py": "9dc9f3da0069d36c602baef07d687fb1aeba8fda0163d17fc446e0a543fe1f3e", + "benchmarks/models/qwenimage/adaln_parameter_screen.py": "05562ef30d09296c2ccd1cdeb44085568b8c877d01f5fb1df4b983e84945ec03", + "benchmarks/models/qwenimage/adaln_prior_art.py": "647aa9fc81e02bf3c7806ed6c2a3e578fb3e1a0b000b4388a12367ef86de3139", + "benchmarks/models/qwenimage/adaln_reuse_bi_audit.py": "88dd3d390e647bbc883b76622309fad54dac3618630dcca0785e555db329a671", + "benchmarks/models/qwenimage/adaln_reuse_candidate.py": "4598f6db94462ac30f3bdd3defae16f0ce7a34ac59eb1996d18e86f498c029b6", + "benchmarks/models/qwenimage/plot_adaln_audit.py": "6151e6abccca8f647c2fbeadf92f12e43ed1c07954db9f2db2f035284cbd407c", + "benchmarks/models/qwenimage/plot_adaln_evidence.py": "16d6bed0ee5b808814c5f7157145a730750d0b1aaf94762e6f72a256e942c1e2", + "benchmarks/models/qwenimage/streams.py": "bd27383eee59404df295f724f6c7d620db3d3d7074c19dd94d51a711b38acf02", + "benchmarks/models/qwenimage/validate_adaln_repair.py": "8b663191323b455470a2313cdfefd837657441b300ffd0e0767453f9f407db03" + }, + "extension_sha256": "5d1054db8bba2eaedbd391d0c23b6683acea9ed04fcd64d6f369faed75aa9e0f", + "clean_commit": true + }, + "environment": { + "torch": "2.13.0+cu130", + "cuda": "13.0", + "driver": "580.126.20", + "gpu": "NVIDIA B200", + "tf32": false + }, + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "cases": [ + { + "stream": "image", + "dtype": "torch.bfloat16", + "batch": 1, + "seq": 1, + "readback": { + "operator": "qwenimage_adaln_mod_projection", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "mma_k16_ascending", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.bfloat16", + "device": "cuda:0", + "capability": [ + 10, + 0 + ] + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 0.000244140625, + "max_tolerance_ratio": 0.004818348214030266, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 0.06244468688964844, + "max_tolerance_ratio": 0.14133451879024506, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.1193317398428917, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "repeat_bitwise": true + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.11894399672746658, + 0.05382400006055832, + 0.05488000065088272, + 0.04950400069355965, + 0.054207999259233475, + 0.04739199951291084, + 0.0530879981815815, + 0.046720001846551895, + 0.05193600058555603, + 0.050016000866889954 + ], + "native": [ + 0.04396799951791763, + 0.04399999976158142, + 0.04137599840760231, + 0.04032000154256821, + 0.04134399816393852, + 0.038816001266241074, + 0.04064000025391579, + 0.0379519984126091, + 0.04118400067090988, + 0.04064000025391579 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.052511999383568764, + "native": 0.040912000462412834 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 0.7426239848136902, + 0.7091519832611084, + 0.7268800139427185, + 0.6714879870414734, + 0.6606400012969971, + 0.7086079716682434, + 0.6640959978103638, + 0.6513599753379822, + 0.6412799954414368, + 0.7129279971122742 + ], + "native": [ + 0.5834559798240662, + 0.6268159747123718, + 0.20870399475097656, + 0.4032000005245209, + 0.5907520055770874, + 0.5937920212745667, + 0.38441601395606995, + 0.3426879942417145, + 0.5886399745941162, + 0.4026240110397339 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.6900479793548584, + "native": 0.4933279901742935 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 0.7824000120162964, + 0.800000011920929, + 0.7971839904785156, + 0.8327999711036682, + 0.5332480072975159, + 0.6097279787063599, + 0.8139520287513733, + 0.8149440288543701, + 0.7909119725227356, + 0.7866880297660828 + ], + "native": [ + 0.6872320175170898, + 0.6615999937057495, + 0.6986879706382751, + 0.6227520108222961, + 0.45392000675201416, + 0.5347840189933777, + 0.6865280270576477, + 0.6818559765815735, + 0.7185279726982117, + 0.7010560035705566 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.7940479815006256, + "native": 0.6841920018196106 + } + }, + "peak_increment_bytes": { + "candidate": 116987904, + "native": 113369088 + } + } + }, + { + "stream": "image", + "dtype": "torch.bfloat16", + "batch": 2, + "seq": 1, + "readback": { + "operator": "qwenimage_adaln_mod_projection", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "mma_k16_ascending", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.bfloat16", + "device": "cuda:0", + "capability": [ + 10, + 0 + ] + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 0.0009765625, + "max_tolerance_ratio": 0.018375596031546593, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 0.06172943115234375, + "max_tolerance_ratio": 0.14111459255218506, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11955195665359497, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.08665511012077332, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "repeat_bitwise": true + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.056223999708890915, + 0.05023999884724617, + 0.05209600180387497, + 0.04816000163555145, + 0.05049600079655647, + 0.04630399867892265, + 0.050783999264240265, + 0.04585599899291992, + 0.0504320003092289, + 0.04755200073122978 + ], + "native": [ + 0.04185599833726883, + 0.04476799815893173, + 0.03923200070858002, + 0.03948799893260002, + 0.0395519994199276, + 0.03811199963092804, + 0.03888000175356865, + 0.038176000118255615, + 0.039135999977588654, + 0.03791999816894531 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.050335999578237534, + "native": 0.039184000343084335 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 0.7198079824447632, + 0.5396159887313843, + 0.8083840012550354, + 0.7584319710731506, + 0.705407977104187, + 0.7455679774284363, + 0.5320000052452087, + 0.7183679938316345, + 0.7355520129203796, + 0.7103040218353271 + ], + "native": [ + 0.46115198731422424, + 0.40143999457359314, + 0.5212159752845764, + 0.5763199925422668, + 0.678816020488739, + 0.5823360085487366, + 0.3929600119590759, + 0.5661439895629883, + 0.6234560012817383, + 0.6232320070266724 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.7190879881381989, + "native": 0.5712319910526276 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 0.8922560214996338, + 0.8948799967765808, + 0.7466880083084106, + 0.8548480272293091, + 0.5616959929466248, + 0.8249599933624268, + 0.8762239813804626, + 0.8144320249557495, + 0.8695999979972839, + 0.8146880269050598 + ], + "native": [ + 0.6981440186500549, + 0.6995199918746948, + 0.6079679727554321, + 0.7023360133171082, + 0.7343999743461609, + 0.7331839799880981, + 0.4461440145969391, + 0.5635520219802856, + 0.4334079921245575, + 0.5640320181846619 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.8399040102958679, + "native": 0.6530559957027435 + } + }, + "peak_increment_bytes": { + "candidate": 120692736, + "native": 113455104 + } + } + }, + { + "stream": "image", + "dtype": "torch.bfloat16", + "batch": 4, + "seq": 1, + "readback": { + "operator": "qwenimage_adaln_mod_projection", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "mma_k16_ascending", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.bfloat16", + "device": "cuda:0", + "capability": [ + 10, + 0 + ] + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 0.00390625, + "max_tolerance_ratio": 0.06410256028175354, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 0.11873626708984375, + "max_tolerance_ratio": 0.15473048388957977, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.05146026611328125, + "max_tolerance_ratio": 0.12209687381982803, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.08665511012077332, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "repeat_bitwise": true + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.054496001452207565, + 0.0490880012512207, + 0.05180799961090088, + 0.04739199951291084, + 0.05161599814891815, + 0.04758400097489357, + 0.05020799860358238, + 0.04560000076889992, + 0.05920000001788139, + 0.04566400125622749 + ], + "native": [ + 0.04076800122857094, + 0.041120000183582306, + 0.04009599983692169, + 0.0395519994199276, + 0.03984000161290169, + 0.03836800158023834, + 0.03859199956059456, + 0.038943998515605927, + 0.03868800029158592, + 0.03846399858593941 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.04964799992740154, + "native": 0.03924799896776676 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 0.8133119940757751, + 0.8863999843597412, + 0.8498240113258362, + 0.8475199937820435, + 0.8731840252876282, + 0.886847972869873, + 0.8219519853591919, + 0.8166080117225647, + 0.6407039761543274, + 0.8958079814910889 + ], + "native": [ + 0.36377599835395813, + 0.38892799615859985, + 0.5591359734535217, + 0.5103039741516113, + 0.5857920050621033, + 0.6494719982147217, + 0.6838719844818115, + 0.38355201482772827, + 0.5272319912910461, + 0.5923200249671936 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.8486720025539398, + "native": 0.5431839823722839 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 0.9046720266342163, + 0.9410240054130554, + 0.9776960015296936, + 0.9446719884872437, + 0.9845759868621826, + 0.9429439902305603, + 0.9369919896125793, + 0.9637759923934937, + 0.927295982837677, + 0.9403520226478577 + ], + "native": [ + 0.6126400232315063, + 0.7136319875717163, + 0.7063680291175842, + 0.7443839907646179, + 0.5364480018615723, + 0.5602880120277405, + 0.6530560255050659, + 0.7023680210113525, + 0.6612160205841064, + 0.5600000023841858 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.9419839978218079, + "native": 0.6571360230445862 + } + }, + "peak_increment_bytes": { + "candidate": 128102400, + "native": 113627136 + } + } + }, + { + "stream": "image", + "dtype": "torch.bfloat16", + "batch": 9, + "seq": 1, + "readback": { + "operator": "qwenimage_adaln_mod_projection", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "mma_k16_ascending", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.bfloat16", + "device": "cuda:0", + "capability": [ + 10, + 0 + ] + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.1501501500606537, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 0.06239509582519531, + "max_tolerance_ratio": 0.14691027998924255, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.06133842468261719, + "max_tolerance_ratio": 0.14474351704120636, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.1193317398428917, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "repeat_bitwise": true + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.10963200032711029, + 0.07507199794054031, + 0.07638400048017502, + 0.07295999675989151, + 0.07660800218582153, + 0.07039999961853027, + 0.07423999905586243, + 0.07155200093984604, + 0.07958400249481201, + 0.07052800059318542 + ], + "native": [ + 0.044895999133586884, + 0.04012800008058548, + 0.041152000427246094, + 0.038816001266241074, + 0.039712000638246536, + 0.03891199827194214, + 0.03872000053524971, + 0.0390079990029335, + 0.04032000154256821, + 0.039264000952243805 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.07465599849820137, + "native": 0.03948800079524517 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 1.323456048965454, + 1.3341120481491089, + 1.3265279531478882, + 1.3223680257797241, + 1.324671983718872, + 1.3317439556121826, + 1.34825599193573, + 1.3224960565567017, + 1.352031946182251, + 1.3618559837341309 + ], + "native": [ + 0.5832319855690002, + 0.4082239866256714, + 0.6175360083580017, + 0.5630080103874207, + 0.5731520056724548, + 0.563040018081665, + 0.34147199988365173, + 0.6895999908447266, + 0.6074560284614563, + 0.42233601212501526 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 1.3291359543800354, + "native": 0.5680960118770599 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 1.4405759572982788, + 1.4679679870605469, + 1.4483840465545654, + 1.445631980895996, + 1.4192320108413696, + 1.3780800104141235, + 1.4304640293121338, + 1.4878400564193726, + 1.4639999866485596, + 1.4589760303497314 + ], + "native": [ + 0.7952960133552551, + 0.7438079714775085, + 0.7483519911766052, + 0.6728960275650024, + 0.7380800247192383, + 0.5135359764099121, + 0.6907839775085449, + 0.7031679749488831, + 0.6935039758682251, + 0.6709759831428528 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 1.4470080137252808, + "native": 0.6983359754085541 + } + }, + "peak_increment_bytes": { + "candidate": 146626560, + "native": 114057216 + } + } + }, + { + "stream": "image", + "dtype": "torch.float32", + "batch": 1, + "seq": 1, + "readback": { + "operator": "qwenimage_adaln_mod_projection", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "warp_xor", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.float32", + "device": "cuda:0", + "capability": [ + 10, + 0 + ] + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.02884618379175663, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.019407829269766808, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.430511474609375e-06, + "max_tolerance_ratio": 0.0019961625803261995, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "repeat_bitwise": true + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.1005759984254837, + 0.05967999994754791, + 0.06067200005054474, + 0.056352000683546066, + 0.06441599875688553, + 0.057920001447200775, + 0.05999999865889549, + 0.05718399956822395, + 0.058400001376867294, + 0.055904000997543335 + ], + "native": [ + 0.062111999839544296, + 0.06188800185918808, + 0.05993599817156792, + 0.057312000542879105, + 0.05910399928689003, + 0.05663999915122986, + 0.05907199904322624, + 0.056223999708890915, + 0.05663999915122986, + 0.056671999394893646 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.0590400006622076, + "native": 0.05819199979305267 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 0.6574400067329407, + 0.49692800641059875, + 0.6384320259094238, + 0.7163199782371521, + 0.6589440107345581, + 0.6981440186500549, + 0.6520640254020691, + 0.5072320103645325, + 0.48044800758361816, + 0.7006080150604248 + ], + "native": [ + 0.3989120125770569, + 0.33961600065231323, + 0.5586879849433899, + 0.577023983001709, + 0.5015680193901062, + 0.5067200064659119, + 0.5434560179710388, + 0.37935999035835266, + 0.5350720286369324, + 0.5492159724235535 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.6547520160675049, + "native": 0.5208960175514221 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 0.7237120270729065, + 0.7268800139427185, + 0.7063360214233398, + 0.7033600211143494, + 0.6937919855117798, + 0.7839999794960022, + 0.7495999932289124, + 0.7275840044021606, + 0.6049280166625977, + 0.8165119886398315 + ], + "native": [ + 0.3826240003108978, + 0.4139519929885864, + 0.4949119985103607, + 0.38841599225997925, + 0.642911970615387, + 0.6792640089988708, + 0.6064959764480591, + 0.6068159937858582, + 0.33823999762535095, + 0.4253759980201721 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.7252960205078125, + "native": 0.4601439982652664 + } + }, + "peak_increment_bytes": { + "candidate": 230277120, + "native": 226738176 + } + } + }, + { + "stream": "image", + "dtype": "torch.float32", + "batch": 2, + "seq": 1, + "readback": { + "operator": "qwenimage_adaln_mod_projection", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "warp_xor", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.float32", + "device": "cuda:0", + "capability": [ + 10, + 0 + ] + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.022900909185409546, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 9.059906005859375e-06, + "max_tolerance_ratio": 0.03493667393922806, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.430511474609375e-06, + "max_tolerance_ratio": 0.005262251943349838, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "repeat_bitwise": true + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.09017600119113922, + 0.06239999830722809, + 0.06796800345182419, + 0.06060799956321716, + 0.06400000303983688, + 0.060447998344898224, + 0.06464000046253204, + 0.06028800085186958, + 0.06508799642324448, + 0.060736000537872314 + ], + "native": [ + 0.06623999774456024, + 0.06345599889755249, + 0.06384000182151794, + 0.06335999816656113, + 0.0642239972949028, + 0.06297600269317627, + 0.06563200056552887, + 0.06265600025653839, + 0.06543999910354614, + 0.06319999694824219 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.06320000067353249, + "native": 0.06364800035953522 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 0.6622080206871033, + 0.6703680157661438, + 0.7169280052185059, + 0.6962559819221497, + 0.7392640113830566, + 0.7528319954872131, + 0.7025279998779297, + 0.6576319932937622, + 0.7421119809150696, + 0.6556800007820129 + ], + "native": [ + 0.4642240107059479, + 0.6419519782066345, + 0.6211199760437012, + 0.5511360168457031, + 0.46854400634765625, + 0.5808640122413635, + 0.563808023929596, + 0.4954560101032257, + 0.4755840003490448, + 0.5149440169334412 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.6993919909000397, + "native": 0.5330400168895721 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 0.7972480058670044, + 0.8435519933700562, + 0.8438400030136108, + 0.8075519800186157, + 0.7830079793930054, + 0.8426880240440369, + 0.8453440070152283, + 0.5902079939842224, + 0.6322559714317322, + 0.8206080198287964 + ], + "native": [ + 0.6239359974861145, + 0.7366719841957092, + 0.647167980670929, + 0.6118080019950867, + 0.6792320013046265, + 0.6783999800682068, + 0.6372159719467163, + 0.5951359868049622, + 0.6619200110435486, + 0.6525440216064453 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.814079999923706, + "native": 0.6498560011386871 + } + }, + "peak_increment_bytes": { + "candidate": 233988096, + "native": 226910208 + } + } + }, + { + "stream": "image", + "dtype": "torch.float32", + "batch": 4, + "seq": 1, + "readback": { + "operator": "qwenimage_adaln_mod_projection", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "warp_xor", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.float32", + "device": "cuda:0", + "capability": [ + 10, + 0 + ] + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.026766398921608925, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.030614053830504417, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.006406767293810844, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 0.0016246031736955047, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "repeat_bitwise": true + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.10204800218343735, + 0.07148800045251846, + 0.07132799923419952, + 0.07011199742555618, + 0.07180800288915634, + 0.06639999896287918, + 0.07385600358247757, + 0.06943999975919724, + 0.0708480030298233, + 0.06905599683523178 + ], + "native": [ + 0.13433599472045898, + 0.1302720010280609, + 0.13180799782276154, + 0.13120000064373016, + 0.13152000308036804, + 0.12880000472068787, + 0.1313920021057129, + 0.13040000200271606, + 0.13100799918174744, + 0.12835200130939484 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.07108800113201141, + "native": 0.1311039999127388 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 0.7772480249404907, + 0.7739840149879456, + 0.769216001033783, + 0.7730879783630371, + 0.7616639733314514, + 0.8255360126495361, + 0.8442879915237427, + 0.791487991809845, + 0.8053119778633118, + 0.7752959728240967 + ], + "native": [ + 0.46191999316215515, + 0.4618239998817444, + 0.48447999358177185, + 0.4838080108165741, + 0.46432000398635864, + 0.4737919867038727, + 0.5659840106964111, + 0.5848960280418396, + 0.4739519953727722, + 0.4875519871711731 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.7762719988822937, + "native": 0.47888000309467316 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 0.7693439722061157, + 0.7613120079040527, + 0.7401279807090759, + 0.8715839982032776, + 0.8961279988288879, + 0.9098880290985107, + 0.9943680167198181, + 0.7032639980316162, + 0.7371839880943298, + 0.904416024684906 + ], + "native": [ + 0.5346559882164001, + 0.5820479989051819, + 0.6061760187149048, + 0.5532159805297852, + 0.6681600213050842, + 0.6197440028190613, + 0.6737279891967773, + 0.47040000557899475, + 0.5141119956970215, + 0.6869760155677795 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.8204639852046967, + "native": 0.5941120088100433 + } + }, + "peak_increment_bytes": { + "candidate": 241410048, + "native": 227254272 + } + } + }, + { + "stream": "image", + "dtype": "torch.float32", + "batch": 9, + "seq": 1, + "readback": { + "operator": "qwenimage_adaln_mod_projection", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "warp_xor", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.float32", + "device": "cuda:0", + "capability": [ + 10, + 0 + ] + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.028410425409674644, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.03972553834319115, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 2.86102294921875e-06, + "max_tolerance_ratio": 0.014658763073384762, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.004605521447956562, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "repeat_bitwise": true + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.14281600713729858, + 0.14287999272346497, + 0.13417600095272064, + 0.13769599795341492, + 0.13491199910640717, + 0.13673600554466248, + 0.13315199315547943, + 0.13740800321102142, + 0.13366399705410004, + 0.139615997672081 + ], + "native": [ + 0.13228799402713776, + 0.13062399625778198, + 0.1313599944114685, + 0.1284160017967224, + 0.1308159977197647, + 0.12889599800109863, + 0.1303360015153885, + 0.12912000715732574, + 0.1305599957704544, + 0.12934400141239166 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.13707200437784195, + "native": 0.13044799864292145 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 1.2895359992980957, + 1.3017280101776123, + 1.3653440475463867, + 1.3089599609375, + 1.3243839740753174, + 1.2908159494400024, + 1.2868160009384155, + 1.338047981262207, + 1.2931519746780396, + 1.3018879890441895 + ], + "native": [ + 0.5623360276222229, + 0.5103039741516113, + 0.5177599787712097, + 0.4593600034713745, + 0.4318079948425293, + 0.4647360146045685, + 0.45235198736190796, + 0.5184000134468079, + 0.5139840245246887, + 0.5020480155944824 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 1.3018079996109009, + "native": 0.5061759948730469 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 1.4072959423065186, + 1.3366400003433228, + 1.3914239406585693, + 1.40556800365448, + 1.410048007965088, + 1.4092479944229126, + 1.3231040239334106, + 1.450111985206604, + 1.3977919816970825, + 1.4200639724731445 + ], + "native": [ + 0.6313279867172241, + 0.5686079859733582, + 0.70169597864151, + 0.6120960116386414, + 0.6206719875335693, + 0.6755200028419495, + 0.5429760217666626, + 0.6201279759407043, + 0.6683840155601501, + 0.6734399795532227 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 1.4064319729804993, + "native": 0.6259999871253967 + } + }, + "peak_increment_bytes": { + "candidate": 259964928, + "native": 228114432 + } + } + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "batch": 1, + "seq": 1, + "readback": { + "operator": "qwenimage_adaln_mod_projection", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "mma_k16_ascending", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.bfloat16", + "device": "cuda:0", + "capability": [ + 10, + 0 + ] + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 0.000244140625, + "max_tolerance_ratio": 0.004781486000865698, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 0.060848236083984375, + "max_tolerance_ratio": 0.14358346164226532, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.1193317398428917, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "repeat_bitwise": true + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.052928000688552856, + 0.04899200052022934, + 0.052319999784231186, + 0.046911999583244324, + 0.05321599915623665, + 0.04623999819159508, + 0.04940799996256828, + 0.05225599929690361, + 0.05385600030422211, + 0.045343998819589615 + ], + "native": [ + 0.04025600105524063, + 0.04012800008058548, + 0.042688000947237015, + 0.038656000047922134, + 0.04022400081157684, + 0.03923200070858002, + 0.04073600098490715, + 0.040063999593257904, + 0.03920000046491623, + 0.038047999143600464 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.05083199962973595, + "native": 0.04009599983692169 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 0.6864640116691589, + 0.7146559953689575, + 0.7084479928016663, + 0.7302719950675964, + 0.7163519859313965, + 0.6709439754486084, + 0.7175999879837036, + 0.6749759912490845, + 0.6627839803695679, + 0.5260480046272278 + ], + "native": [ + 0.5657920241355896, + 0.5419840216636658, + 0.578112006187439, + 0.5538240075111389, + 0.20403200387954712, + 0.5349760055541992, + 0.5399360060691833, + 0.5119040012359619, + 0.5207679867744446, + 0.5216320157051086 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.6974560022354126, + "native": 0.5374560058116913 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 0.7818880081176758, + 0.6422079801559448, + 0.5230720043182373, + 0.8072959780693054, + 0.7692480087280273, + 0.7765120267868042, + 0.772383987903595, + 0.7141439914703369, + 0.8192319869995117, + 0.7900159955024719 + ], + "native": [ + 0.697983980178833, + 0.7036799788475037, + 0.6388800144195557, + 0.6313279867172241, + 0.6180160045623779, + 0.6311039924621582, + 0.4890879988670349, + 0.19219200313091278, + 0.6213120222091675, + 0.6155200004577637 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.7744480073451996, + "native": 0.6262080073356628 + } + }, + "peak_increment_bytes": { + "candidate": 116987904, + "native": 113369088 + } + } + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "batch": 2, + "seq": 1, + "readback": { + "operator": "qwenimage_adaln_mod_projection", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "mma_k16_ascending", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.bfloat16", + "device": "cuda:0", + "capability": [ + 10, + 0 + ] + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 0.0078125, + "max_tolerance_ratio": 0.10309278219938278, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 0.06243133544921875, + "max_tolerance_ratio": 0.13985764980316162, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.1193317398428917, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.08665511012077332, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "repeat_bitwise": true + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.059776000678539276, + 0.05023999884724617, + 0.050655998289585114, + 0.04710400104522705, + 0.04992000013589859, + 0.04560000076889992, + 0.04992000013589859, + 0.04566400125622749, + 0.047839999198913574, + 0.04451199993491173 + ], + "native": [ + 0.04201599955558777, + 0.045791998505592346, + 0.04022400081157684, + 0.040063999593257904, + 0.04092799872159958, + 0.039423998445272446, + 0.040192000567913055, + 0.03872000053524971, + 0.03872000053524971, + 0.0390079990029335 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.04887999966740608, + "native": 0.04012800008058548 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 0.6884480118751526, + 0.6926720142364502, + 0.717631995677948, + 0.7055360078811646, + 0.7466560006141663, + 0.6828479766845703, + 0.726144015789032, + 0.7327679991722107, + 0.6760960221290588, + 0.6857920289039612 + ], + "native": [ + 0.3330880105495453, + 0.3306879997253418, + 0.33184000849723816, + 0.3619840145111084, + 0.34668800234794617, + 0.3277440071105957, + 0.33113598823547363, + 0.3799999952316284, + 0.3405439853668213, + 0.3662720024585724 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.6991040110588074, + "native": 0.3368159979581833 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 0.8215039968490601, + 0.7591040134429932, + 0.7617279887199402, + 0.8326719999313354, + 0.7881600260734558, + 0.7535039782524109, + 0.810368001461029, + 0.8736000061035156, + 0.7351679801940918, + 0.8140479922294617 + ], + "native": [ + 0.6232960224151611, + 0.5373439788818359, + 0.5001919865608215, + 0.5438079833984375, + 0.6431040167808533, + 0.49590399861335754, + 0.6344959735870361, + 0.6217280030250549, + 0.6837120056152344, + 0.4848319888114929 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.7992640137672424, + "native": 0.5827679932117462 + } + }, + "peak_increment_bytes": { + "candidate": 120692736, + "native": 113455104 + } + } + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "batch": 4, + "seq": 1, + "readback": { + "operator": "qwenimage_adaln_mod_projection", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "mma_k16_ascending", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.bfloat16", + "device": "cuda:0", + "capability": [ + 10, + 0 + ] + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.15060241520404816, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 0.06201744079589844, + "max_tolerance_ratio": 0.14428503811359406, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.04979705810546875, + "max_tolerance_ratio": 0.1194368228316307, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.08665511012077332, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "repeat_bitwise": true + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.05164799839258194, + 0.04774399846792221, + 0.05087999999523163, + 0.0451200008392334, + 0.052000001072883606, + 0.05385600030422211, + 0.05206400156021118, + 0.04726399853825569, + 0.05100800096988678, + 0.04588799923658371 + ], + "native": [ + 0.041280001401901245, + 0.04131200164556503, + 0.04121600091457367, + 0.038816001266241074, + 0.039423998445272446, + 0.039744000881910324, + 0.040991999208927155, + 0.03916800022125244, + 0.03929600119590759, + 0.039712000638246536 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.050944000482559204, + "native": 0.03972800076007843 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 0.7960320115089417, + 0.7989439964294434, + 0.8127359747886658, + 0.8193600177764893, + 0.8173120021820068, + 0.8603519797325134, + 0.8000640273094177, + 0.8337600231170654, + 0.8109440207481384, + 0.8688960075378418 + ], + "native": [ + 0.32902398705482483, + 0.35766398906707764, + 0.545087993144989, + 0.5518079996109009, + 0.37932801246643066, + 0.33670398592948914, + 0.33318400382995605, + 0.3492479920387268, + 0.574720025062561, + 0.544160008430481 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.8150239884853363, + "native": 0.36849600076675415 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 0.9255040287971497, + 0.9244480133056641, + 0.9200959801673889, + 0.9083520174026489, + 0.9601920247077942, + 0.9231039881706238, + 0.956991970539093, + 0.9864000082015991, + 0.8973439931869507, + 0.9247040152549744 + ], + "native": [ + 0.7265920042991638, + 0.6205440163612366, + 0.5371840000152588, + 0.39212799072265625, + 0.6242240071296692, + 0.6302080154418945, + 0.6830719709396362, + 0.6727359890937805, + 0.5427200198173523, + 0.6215360164642334 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.9245760142803192, + "native": 0.6228800117969513 + } + }, + "peak_increment_bytes": { + "candidate": 128102400, + "native": 113627136 + } + } + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "batch": 9, + "seq": 1, + "readback": { + "operator": "qwenimage_adaln_mod_projection", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "mma_k16_ascending", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.bfloat16", + "device": "cuda:0", + "capability": [ + 10, + 0 + ] + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.16129033267498016, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 0.110931396484375, + "max_tolerance_ratio": 0.14530818164348602, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.060230255126953125, + "max_tolerance_ratio": 0.13687846064567566, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.1193317398428917, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "repeat_bitwise": true + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.07651200145483017, + 0.07161600142717361, + 0.08102399855852127, + 0.07132799923419952, + 0.07433599978685379, + 0.0689919963479042, + 0.0759039968252182, + 0.07056000083684921, + 0.07612799853086472, + 0.07126399874687195 + ], + "native": [ + 0.0424639992415905, + 0.0395519994199276, + 0.04118400067090988, + 0.04032000154256821, + 0.04121600091457367, + 0.0390079990029335, + 0.040832001715898514, + 0.03951999917626381, + 0.04028800129890442, + 0.040352001786231995 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.0729760006070137, + "native": 0.0403360016644001 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 1.3693759441375732, + 1.3218239545822144, + 1.3062080144882202, + 1.2889599800109863, + 1.311295986175537, + 1.3738240003585815, + 1.3192960023880005, + 1.3023040294647217, + 1.3047679662704468, + 1.3402559757232666 + ], + "native": [ + 0.5580480098724365, + 0.5660160183906555, + 0.3787840008735657, + 0.40003201365470886, + 0.5635200142860413, + 0.5421119928359985, + 0.4046719968318939, + 0.34937599301338196, + 0.520576000213623, + 0.5759360194206238 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 1.3152959942817688, + "native": 0.5313439965248108 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 1.4266560077667236, + 1.435968041419983, + 1.3948160409927368, + 1.4228160381317139, + 1.4754559993743896, + 1.585312008857727, + 1.4228160381317139, + 1.4272960424423218, + 1.4612159729003906, + 1.4797760248184204 + ], + "native": [ + 0.4912959933280945, + 0.5961920022964478, + 0.4485760033130646, + 0.548255980014801, + 0.7066879868507385, + 0.6289920210838318, + 0.6330879926681519, + 0.6817920207977295, + 0.6318079829216003, + 0.6140480041503906 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 1.4316320419311523, + "native": 0.6215200126171112 + } + }, + "peak_increment_bytes": { + "candidate": 146626560, + "native": 114057216 + } + } + }, + { + "stream": "text", + "dtype": "torch.float32", + "batch": 1, + "seq": 1, + "readback": { + "operator": "qwenimage_adaln_mod_projection", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "warp_xor", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.float32", + "device": "cuda:0", + "capability": [ + 10, + 0 + ] + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 3.084540367126465e-06, + "max_tolerance_ratio": 0.03035988099873066, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.0219003614038229, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.001900327275507152, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "repeat_bitwise": true + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.05999999865889549, + 0.05753599852323532, + 0.06070400029420853, + 0.05558399856090546, + 0.061344001442193985, + 0.05584000051021576, + 0.0586559996008873, + 0.05379199981689453, + 0.05833600088953972, + 0.05491200089454651 + ], + "native": [ + 0.05846399813890457, + 0.057151999324560165, + 0.05846399813890457, + 0.0560000017285347, + 0.05878400057554245, + 0.055743999779224396, + 0.05548800155520439, + 0.05676800012588501, + 0.05782400071620941, + 0.05593600124120712 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.05793599970638752, + "native": 0.05695999972522259 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 0.622655987739563, + 0.6535360217094421, + 0.7026240229606628, + 0.692031979560852, + 0.6866239905357361, + 0.4910080134868622, + 0.6805440187454224, + 0.6496959924697876, + 0.6468160152435303, + 0.5154240131378174 + ], + "native": [ + 0.5237439870834351, + 0.6102399826049805, + 0.49487999081611633, + 0.5195199847221375, + 0.39846399426460266, + 0.4447999894618988, + 0.5560960173606873, + 0.5369600057601929, + 0.5281919836997986, + 0.5064640045166016 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.6516160070896149, + "native": 0.5216319859027863 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 0.756447970867157, + 0.7537919878959656, + 0.7506880164146423, + 0.8141760230064392, + 0.7930240035057068, + 0.6680960059165955, + 0.753600001335144, + 0.7636479735374451, + 0.7517120242118835, + 0.7327679991722107 + ], + "native": [ + 0.5538240075111389, + 0.6630399823188782, + 0.7194240093231201, + 0.6628159880638123, + 0.4342080056667328, + 0.21827200055122375, + 0.599295973777771, + 0.6955519914627075, + 0.6642559766769409, + 0.4992319941520691 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.7536959946155548, + "native": 0.6310559809207916 + } + }, + "peak_increment_bytes": { + "candidate": 230277120, + "native": 226738176 + } + } + }, + { + "stream": "text", + "dtype": "torch.float32", + "batch": 2, + "seq": 1, + "readback": { + "operator": "qwenimage_adaln_mod_projection", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "warp_xor", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.float32", + "device": "cuda:0", + "capability": [ + 10, + 0 + ] + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 3.337860107421875e-06, + "max_tolerance_ratio": 0.018662450835108757, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.03779896721243858, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.430511474609375e-06, + "max_tolerance_ratio": 0.004774248693138361, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "repeat_bitwise": true + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.06224000081419945, + 0.060256000608205795, + 0.06796800345182419, + 0.05753599852323532, + 0.06191999837756157, + 0.058240000158548355, + 0.06348799914121628, + 0.05929600074887276, + 0.06480000168085098, + 0.06015999987721443 + ], + "native": [ + 0.06550399959087372, + 0.06281600147485733, + 0.07036799937486649, + 0.0634239986538887, + 0.0629120022058487, + 0.0628800019621849, + 0.06361600011587143, + 0.06207999959588051, + 0.06224000081419945, + 0.0629120022058487 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.06108799949288368, + "native": 0.0629120022058487 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 0.6768959760665894, + 0.5123839974403381, + 0.49084800481796265, + 0.6739519834518433, + 0.6427199840545654, + 0.6795520186424255, + 0.6704000234603882, + 0.6632320284843445, + 0.4912000000476837, + 0.6748800277709961 + ], + "native": [ + 0.4991999864578247, + 0.45689600706100464, + 0.4596160054206848, + 0.4617919921875, + 0.5472319722175598, + 0.5623040199279785, + 0.5119040012359619, + 0.5363519787788391, + 0.5065919756889343, + 0.5700160264968872 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.6668160259723663, + "native": 0.5092479884624481 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 0.7749119997024536, + 0.792415976524353, + 0.7937279939651489, + 0.8262079954147339, + 0.7971199750900269, + 0.7200000286102295, + 0.684544026851654, + 0.7179840207099915, + 0.6975359916687012, + 0.5504000186920166 + ], + "native": [ + 0.505728006362915, + 0.5323200225830078, + 0.5140799880027771, + 0.6113920211791992, + 0.6521279811859131, + 0.5934079885482788, + 0.5944960117340088, + 0.5429440140724182, + 0.49692800641059875, + 0.34191998839378357 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.7474560141563416, + "native": 0.537632018327713 + } + }, + "peak_increment_bytes": { + "candidate": 233988096, + "native": 226910208 + } + } + }, + { + "stream": "text", + "dtype": "torch.float32", + "batch": 4, + "seq": 1, + "readback": { + "operator": "qwenimage_adaln_mod_projection", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "warp_xor", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.float32", + "device": "cuda:0", + "capability": [ + 10, + 0 + ] + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 4.291534423828125e-06, + "max_tolerance_ratio": 0.024691591039299965, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.04250035807490349, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.008562184870243073, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 0.0016246031736955047, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "repeat_bitwise": true + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.07430399954319, + 0.07283200323581696, + 0.07004799693822861, + 0.07177600264549255, + 0.07126399874687195, + 0.07004799693822861, + 0.07241600006818771, + 0.0671359971165657, + 0.07123199850320816, + 0.06694400310516357 + ], + "native": [ + 0.13184000551700592, + 0.12992000579833984, + 0.13104000687599182, + 0.12943999469280243, + 0.13007999956607819, + 0.12848000228405, + 0.13100799918174744, + 0.12982399761676788, + 0.1316159963607788, + 0.1292160004377365 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.07124799862504005, + "native": 0.13000000268220901 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 0.7700160145759583, + 0.8242560029029846, + 0.7920960187911987, + 0.8033279776573181, + 0.7887359857559204, + 0.7622079849243164, + 0.8599680066108704, + 0.7884799838066101, + 0.7807999849319458, + 0.7618880271911621 + ], + "native": [ + 0.46665599942207336, + 0.5099200010299683, + 0.5804479718208313, + 0.6056320071220398, + 0.47577598690986633, + 0.4612480103969574, + 0.5507839918136597, + 0.5663679838180542, + 0.5263360142707825, + 0.4975680112838745 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.7886079847812653, + "native": 0.5181280076503754 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 0.898751974105835, + 0.9388480186462402, + 0.8601920008659363, + 0.9082880020141602, + 0.9027199745178223, + 0.9068160057067871, + 0.8949440121650696, + 0.8356800079345703, + 0.7922239899635315, + 0.9127359986305237 + ], + "native": [ + 0.65174400806427, + 0.6722880005836487, + 0.42585599422454834, + 0.5282559990882874, + 0.6899840235710144, + 0.6922879815101624, + 0.6283519864082336, + 0.5284479856491089, + 0.628607988357544, + 0.6134719848632812 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.9007359743118286, + "native": 0.6284799873828888 + } + }, + "peak_increment_bytes": { + "candidate": 241410048, + "native": 227254272 + } + } + }, + { + "stream": "text", + "dtype": "torch.float32", + "batch": 9, + "seq": 1, + "readback": { + "operator": "qwenimage_adaln_mod_projection", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "warp_xor", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.float32", + "device": "cuda:0", + "capability": [ + 10, + 0 + ] + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 4.5299530029296875e-06, + "max_tolerance_ratio": 0.023840103298425674, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.05722330883145332, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 2.86102294921875e-06, + "max_tolerance_ratio": 0.011162595823407173, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.004605521447956562, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "repeat_bitwise": true + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.14422400295734406, + 0.14508800208568573, + 0.13551999628543854, + 0.13894400000572205, + 0.13414399325847626, + 0.13817599415779114, + 0.13676799833774567, + 0.13753600418567657, + 0.13583999872207642, + 0.1377599984407425 + ], + "native": [ + 0.13283200562000275, + 0.13120000064373016, + 0.13235199451446533, + 0.13238400220870972, + 0.13043199479579926, + 0.12860800325870514, + 0.13087999820709229, + 0.1292800009250641, + 0.13097600638866425, + 0.12857599556446075 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.13764800131320953, + "native": 0.13092800229787827 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 1.325760006904602, + 1.3118079900741577, + 1.2684799432754517, + 1.2979199886322021, + 1.285823941230774, + 1.2832640409469604, + 1.3047679662704468, + 1.290560007095337, + 1.28547203540802, + 1.3119679689407349 + ], + "native": [ + 0.5219839811325073, + 0.46086400747299194, + 0.5189440250396729, + 0.5351679921150208, + 0.416159987449646, + 0.2865599989891052, + 0.5013120174407959, + 0.58924800157547, + 0.5188480019569397, + 0.5024639964103699 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 1.2942399978637695, + "native": 0.5106559991836548 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 1.4108799695968628, + 1.2622720003128052, + 1.3911999464035034, + 1.4124159812927246, + 1.3998719453811646, + 1.4061440229415894, + 1.3732479810714722, + 1.3963199853897095, + 1.402400016784668, + 1.2890559434890747 + ], + "native": [ + 0.6892480254173279, + 0.43462398648262024, + 0.679423987865448, + 0.6101120114326477, + 0.6206719875335693, + 0.6818240284919739, + 0.5139520168304443, + 0.5453439950942993, + 0.596992015838623, + 0.6298239827156067 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 1.398095965385437, + "native": 0.6153919994831085 + } + }, + "peak_increment_bytes": { + "candidate": 259964928, + "native": 228114432 + } + } + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "batch": 1, + "seq": 33, + "readback": { + "operator": "qwenimage_final_adaln_out", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "mma_k16_ascending", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.bfloat16", + "device": "cuda:0", + "capability": [ + 10, + 0 + ], + "norm": "aten.native_layer_norm[fp32,eps=1e-6]", + "token_gradient_tree": "recursive_32_token_balanced", + "cast_boundaries": "silu,projection,norm,1+scale,product,output", + "fused": false + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.17761988937854767, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 0.09519195556640625, + "max_tolerance_ratio": 0.13051095604896545, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.2138824462890625, + "max_tolerance_ratio": 0.2115422934293747, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.05760002136230469, + "max_tolerance_ratio": 0.1263447403907776, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.04504585266113281, + "max_tolerance_ratio": 0.11876877397298813, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "repeat_bitwise": true + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.14870400726795197, + 0.10339199751615524, + 0.09593600034713745, + 0.09647999703884125, + 0.09084799885749817, + 0.0907519981265068, + 0.09328000247478485, + 0.09478399902582169, + 0.08668799698352814, + 0.09465599805116653 + ], + "native": [ + 0.08144000172615051, + 0.07081600278615952, + 0.07983999699354172, + 0.06627199798822403, + 0.07184000313282013, + 0.06409599632024765, + 0.07475200295448303, + 0.06515199691057205, + 0.07337599992752075, + 0.06585600227117538 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.09471999853849411, + "native": 0.07132800295948982 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 0.5415999889373779, + 0.5315200090408325, + 0.5276479721069336, + 0.5472959876060486, + 0.5212799906730652, + 0.3698880076408386, + 0.3142719864845276, + 0.5237759947776794, + 0.5274879932403564, + 0.5847039818763733 + ], + "native": [ + 0.2560639977455139, + 0.18745599687099457, + 0.4327999949455261, + 0.47974398732185364, + 0.46057599782943726, + 0.4498240053653717, + 0.42399999499320984, + 0.48089599609375, + 0.4256640076637268, + 0.42268800735473633 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.527567982673645, + "native": 0.42923200130462646 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 0.6514880061149597, + 0.9069439768791199, + 0.896992027759552, + 0.8871679902076721, + 0.9319679737091064, + 0.5321919918060303, + 0.4331839978694916, + 0.6481919884681702, + 0.9297279715538025, + 0.8975679874420166 + ], + "native": [ + 0.5146880149841309, + 0.6572800278663635, + 0.8171520233154297, + 0.8532480001449585, + 0.8806719779968262, + 0.6693120002746582, + 0.49798399209976196, + 0.6201279759407043, + 0.9157760143280029, + 0.7916799783706665 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.8920800089836121, + "native": 0.7304959893226624 + } + }, + "peak_increment_bytes": { + "candidate": 41245696, + "native": 38393856 + } + } + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "batch": 2, + "seq": 4096, + "readback": { + "operator": "qwenimage_final_adaln_out", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "mma_k16_ascending", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.bfloat16", + "device": "cuda:0", + "capability": [ + 10, + 0 + ], + "norm": "aten.native_layer_norm[fp32,eps=1e-6]", + "token_gradient_tree": "recursive_32_token_balanced", + "cast_boundaries": "silu,projection,norm,1+scale,product,output", + "fused": false + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.38314178586006165, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 0.906829833984375, + "max_tolerance_ratio": 0.18153879046440125, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.9998779296875, + "max_tolerance_ratio": 0.5126774311065674, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.9644775390625, + "max_tolerance_ratio": 0.1837276816368103, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.10920333862304688, + "max_tolerance_ratio": 0.1483679562807083, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "repeat_bitwise": true + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.33481600880622864, + 0.32870399951934814, + 0.3261120021343231, + 0.3270080089569092, + 0.3246079981327057, + 0.32287999987602234, + 0.3245120048522949, + 0.32387199997901917, + 0.3229120075702667, + 0.32438400387763977 + ], + "native": [ + 0.20688000321388245, + 0.1982399970293045, + 0.20611199736595154, + 0.19833600521087646, + 0.20556800067424774, + 0.1984959989786148, + 0.20470400154590607, + 0.19840000569820404, + 0.20287999510765076, + 0.19894400238990784 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.3245600014925003, + "native": 0.2009119987487793 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 0.6856319904327393, + 0.8386880159378052, + 0.67084801197052, + 0.6738240122795105, + 0.8714240193367004, + 0.6693440079689026, + 0.667136013507843, + 0.663424015045166, + 0.823743999004364, + 0.8311359882354736 + ], + "native": [ + 0.41785600781440735, + 0.4096960127353668, + 0.4471360146999359, + 0.4012480080127716, + 0.5147519707679749, + 0.4310399889945984, + 0.3696640133857727, + 0.4012799859046936, + 0.6476799845695496, + 0.6855999827384949 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.6797280013561249, + "native": 0.42444799840450287 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 1.0485759973526, + 1.0417280197143555, + 1.0469119548797607, + 1.063904047012329, + 0.9998720288276672, + 1.0814080238342285, + 1.081984043121338, + 1.062399983406067, + 0.9562240242958069, + 1.0503679513931274 + ], + "native": [ + 0.8263360261917114, + 0.8434879779815674, + 0.8699520230293274, + 0.8233919739723206, + 0.8267199993133545, + 0.8032000064849854, + 0.8165119886398315, + 0.8343679904937744, + 0.492576003074646, + 0.548192024230957 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 1.0494719743728638, + "native": 0.824864000082016 + } + }, + "peak_increment_bytes": { + "candidate": 755064832, + "native": 409059840 + } + } + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "batch": 1, + "seq": 6889, + "readback": { + "operator": "qwenimage_final_adaln_out", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "mma_k16_ascending", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.bfloat16", + "device": "cuda:0", + "capability": [ + 10, + 0 + ], + "norm": "aten.native_layer_norm[fp32,eps=1e-6]", + "token_gradient_tree": "recursive_32_token_balanced", + "cast_boundaries": "silu,projection,norm,1+scale,product,output", + "fused": false + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.35971224308013916, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 0.994384765625, + "max_tolerance_ratio": 0.17549553513526917, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.9990234375, + "max_tolerance_ratio": 0.19553765654563904, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.966796875, + "max_tolerance_ratio": 0.18376141786575317, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.0884552001953125, + "max_tolerance_ratio": 0.14824989438056946, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "repeat_bitwise": true + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.2629440128803253, + 0.2638719975948334, + 0.2605760097503662, + 0.264384001493454, + 0.2588160037994385, + 0.25814399123191833, + 0.25468799471855164, + 0.25811201333999634, + 0.2571839988231659, + 0.2576639950275421 + ], + "native": [ + 0.16223999857902527, + 0.15455999970436096, + 0.16467200219631195, + 0.15398399531841278, + 0.15942400693893433, + 0.15238399803638458, + 0.1581439971923828, + 0.15398399531841278, + 0.16169600188732147, + 0.15750400722026825 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.2584799975156784, + "native": 0.15782400220632553 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 0.7698559761047363, + 0.8223040103912354, + 0.7556480169296265, + 0.794048011302948, + 0.75382399559021, + 0.5957120060920715, + 0.7978240251541138, + 0.8095359802246094, + 0.7524160146713257, + 0.8334400057792664 + ], + "native": [ + 0.4320639967918396, + 0.6589440107345581, + 0.6342719793319702, + 0.6011199951171875, + 0.6564480066299438, + 0.27670401334762573, + 0.6627200245857239, + 0.6739839911460876, + 0.6131200194358826, + 0.6732159852981567 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.7819519937038422, + "native": 0.645359992980957 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 0.9774079918861389, + 0.9797120094299316, + 0.9761279821395874, + 0.8122239708900452, + 0.8578240275382996, + 0.982367992401123, + 0.9819520115852356, + 1.0351040363311768, + 0.8599680066108704, + 1.0273280143737793 + ], + "native": [ + 0.8755519986152649, + 0.8006719946861267, + 0.6992959976196289, + 0.41791999340057373, + 0.6119679808616638, + 0.6125760078430176, + 0.8045759797096252, + 0.8119040131568909, + 0.8665279746055603, + 0.8029760122299194 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.9785600006580353, + "native": 0.8018240034580231 + } + }, + "peak_increment_bytes": { + "candidate": 634957824, + "native": 367424000 + } + } + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "batch": 1, + "seq": 6032, + "readback": { + "operator": "qwenimage_final_adaln_out", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "mma_k16_ascending", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.bfloat16", + "device": "cuda:0", + "capability": [ + 10, + 0 + ], + "norm": "aten.native_layer_norm[fp32,eps=1e-6]", + "token_gradient_tree": "recursive_32_token_balanced", + "cast_boundaries": "silu,projection,norm,1+scale,product,output", + "fused": false + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.3225806653499603, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 0.486297607421875, + "max_tolerance_ratio": 0.17485594749450684, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 3.8330078125, + "max_tolerance_ratio": 0.19878168404102325, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.892578125, + "max_tolerance_ratio": 0.1812429577112198, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.062381744384765625, + "max_tolerance_ratio": 0.1478593498468399, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "repeat_bitwise": true + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.23798400163650513, + 0.23308800160884857, + 0.23561599850654602, + 0.23574399948120117, + 0.23059199750423431, + 0.23286400735378265, + 0.23228800296783447, + 0.23024000227451324, + 0.2290560007095337, + 0.23081600666046143 + ], + "native": [ + 0.15161600708961487, + 0.14000000059604645, + 0.14585599303245544, + 0.13872000575065613, + 0.1441279947757721, + 0.1382399946451187, + 0.14339199662208557, + 0.1414719969034195, + 0.14617599546909332, + 0.13743999600410461 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.23257600516080856, + "native": 0.14243199676275253 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 0.7498559951782227, + 0.7033920288085938, + 0.5352960228919983, + 0.7103040218353271, + 0.7503679990768433, + 0.7146559953689575, + 0.7168639898300171, + 0.7336959838867188, + 0.5317440032958984, + 0.6920959949493408 + ], + "native": [ + 0.4477759897708893, + 0.4962559938430786, + 0.2662079930305481, + 0.4644159972667694, + 0.6606720089912415, + 0.6177279949188232, + 0.6120960116386414, + 0.6599360108375549, + 0.4896000027656555, + 0.43878400325775146 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.7124800086021423, + "native": 0.49292799830436707 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 0.8464639782905579, + 0.9360640048980713, + 0.9301120042800903, + 0.9456639885902405, + 0.9292479753494263, + 1.022976040840149, + 0.942080020904541, + 0.936959981918335, + 0.9591040015220642, + 0.9452800154685974 + ], + "native": [ + 0.7326080203056335, + 0.8025280237197876, + 0.8447679877281189, + 0.986847996711731, + 0.6837440133094788, + 0.6342399716377258, + 0.8248000144958496, + 0.8128319978713989, + 0.8369280099868774, + 0.8429759740829468 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.939520001411438, + "native": 0.8188160061836243 + } + }, + "peak_increment_bytes": { + "candidate": 555970560, + "native": 334799360 + } + } + }, + { + "stream": "final", + "dtype": "torch.float32", + "batch": 1, + "seq": 33, + "readback": { + "operator": "qwenimage_final_adaln_out", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "warp_xor", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.float32", + "device": "cuda:0", + "capability": [ + 10, + 0 + ], + "norm": "aten.native_layer_norm[fp32,eps=1e-6]", + "token_gradient_tree": "recursive_32_token_balanced", + "cast_boundaries": "silu,projection,norm,1+scale,product,output", + "fused": false + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.017286429181694984, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.01827293448150158, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.03529878333210945, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.012535769492387772, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.020218271762132645, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "repeat_bitwise": true, + "fp64_diagnostic": { + "candidate_gradients": { + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.010897786356508732, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.034720279276371, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.01114759873598814, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.01996554434299469, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_gradients": { + "temb": { + "passed": true, + "max_abs": 2.288818359375e-05, + "max_tolerance_ratio": 0.016935920342803, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.03677426651120186, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.011342125944793224, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.015217049978673458, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.09808000177145004, + 0.07919999957084656, + 0.07548800110816956, + 0.07587199658155441, + 0.07814399898052216, + 0.07327999919652939, + 0.07625599950551987, + 0.07603199779987335, + 0.07081600278615952, + 0.07379200309515 + ], + "native": [ + 0.06812799721956253, + 0.06176000088453293, + 0.06710399687290192, + 0.06095999851822853, + 0.0708480030298233, + 0.06185600161552429, + 0.0655359998345375, + 0.060896001756191254, + 0.06486400216817856, + 0.05961599946022034 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.07595199719071388, + "native": 0.06336000189185143 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 0.4981119930744171, + 0.29820799827575684, + 0.27584001421928406, + 0.503167986869812, + 0.5121279954910278, + 0.3245759904384613, + 0.28224000334739685, + 0.28012800216674805, + 0.26767998933792114, + 0.48796799778938293 + ], + "native": [ + 0.24614399671554565, + 0.19446399807929993, + 0.19407999515533447, + 0.4110719859600067, + 0.41043201088905334, + 0.19948799908161163, + 0.2048639953136444, + 0.18223999440670013, + 0.18111999332904816, + 0.424127995967865 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.31139199435710907, + "native": 0.20217599719762802 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 0.41756799817085266, + 0.3851200044155121, + 0.5763199925422668, + 0.6276479959487915, + 0.589024007320404, + 0.6232320070266724, + 0.37932801246643066, + 0.5772160291671753, + 0.5741119980812073, + 0.6350719928741455 + ], + "native": [ + 0.2916480004787445, + 0.2670400142669678, + 0.523904025554657, + 0.5579519867897034, + 0.5243200063705444, + 0.5437120199203491, + 0.3288640081882477, + 0.27267199754714966, + 0.5060480237007141, + 0.49795201420783997 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.5767680108547211, + "native": 0.502000018954277 + } + }, + "peak_increment_bytes": { + "candidate": 78816256, + "native": 76787712 + } + } + }, + { + "stream": "final", + "dtype": "torch.float32", + "batch": 2, + "seq": 4096, + "readback": { + "operator": "qwenimage_final_adaln_out", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "warp_xor", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.float32", + "device": "cuda:0", + "capability": [ + 10, + 0 + ], + "norm": "aten.native_layer_norm[fp32,eps=1e-6]", + "token_gradient_tree": "recursive_32_token_balanced", + "cast_boundaries": "silu,projection,norm,1+scale,product,output", + "fused": false + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.04024302959442139, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 0.00032806396484375, + "max_tolerance_ratio": 0.21826304495334625, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.5950486660003662, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.1805621236562729, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.03756224736571312, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "repeat_bitwise": true, + "fp64_diagnostic": { + "candidate_gradients": { + "temb": { + "passed": true, + "max_abs": 0.000244140625, + "max_tolerance_ratio": 0.15392455458641052, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.000152587890625, + "max_tolerance_ratio": 0.5889167189598083, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.23832927644252777, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.027307752519845963, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_gradients": { + "temb": { + "passed": true, + "max_abs": 0.000274658203125, + "max_tolerance_ratio": 0.15735489130020142, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.3064102530479431, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.08819914609193802, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.02082691714167595, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.2486400008201599, + 0.24694399535655975, + 0.24092799425125122, + 0.2430720031261444, + 0.24825599789619446, + 0.2406720072031021, + 0.23875199258327484, + 0.24140800535678864, + 0.24083200097084045, + 0.24143999814987183 + ], + "native": [ + 0.254720002412796, + 0.2539519965648651, + 0.25334399938583374, + 0.25299200415611267, + 0.2508479952812195, + 0.25328001379966736, + 0.2536959946155548, + 0.25148800015449524, + 0.25251200795173645, + 0.2520639896392822 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.24142400175333023, + "native": 0.25313600897789 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 0.6513599753379822, + 0.7162879705429077, + 0.7293440103530884, + 0.6776959896087646, + 0.49823999404907227, + 0.67084801197052, + 0.6685119867324829, + 0.6838080286979675, + 0.6633599996566772, + 0.5021759867668152 + ], + "native": [ + 0.3964479863643646, + 0.3885760009288788, + 0.6090880036354065, + 0.6031039953231812, + 0.4588800072669983, + 0.6142719984054565, + 0.6091840267181396, + 0.6037120223045349, + 0.633791983127594, + 0.5603839755058289 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.6696799993515015, + "native": 0.603408008813858 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 0.8657600283622742, + 0.8964160084724426, + 0.9567040205001831, + 0.7500799894332886, + 0.7064319849014282, + 0.9101759791374207, + 0.8581439852714539, + 0.8966400027275085, + 0.9366080164909363, + 0.7075520157814026 + ], + "native": [ + 0.7949119806289673, + 0.8541439771652222, + 0.8792639970779419, + 0.8345280289649963, + 0.6721600294113159, + 0.8133760094642639, + 0.8534079790115356, + 0.804032027721405, + 0.8171839714050293, + 0.7713919878005981 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.8810880184173584, + "native": 0.8152799904346466 + } + }, + "peak_increment_bytes": { + "candidate": 607338496, + "native": 660767232 + } + } + }, + { + "stream": "final", + "dtype": "torch.float32", + "batch": 1, + "seq": 6889, + "readback": { + "operator": "qwenimage_final_adaln_out", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "warp_xor", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.float32", + "device": "cuda:0", + "capability": [ + 10, + 0 + ], + "norm": "aten.native_layer_norm[fp32,eps=1e-6]", + "token_gradient_tree": "recursive_32_token_balanced", + "cast_boundaries": "silu,projection,norm,1+scale,product,output", + "fused": false + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 8.58306884765625e-06, + "max_tolerance_ratio": 0.056851211935281754, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 0.000213623046875, + "max_tolerance_ratio": 0.20303122699260712, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.42530110478401184, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.814697265625e-05, + "max_tolerance_ratio": 0.137156143784523, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 9.059906005859375e-06, + "max_tolerance_ratio": 0.062267329543828964, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "repeat_bitwise": true, + "fp64_diagnostic": { + "candidate_gradients": { + "temb": { + "passed": true, + "max_abs": 0.000152587890625, + "max_tolerance_ratio": 0.16136014461517334, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.31273558735847473, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.814697265625e-05, + "max_tolerance_ratio": 0.13966499269008636, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.02667628601193428, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_gradients": { + "temb": { + "passed": true, + "max_abs": 0.000152587890625, + "max_tolerance_ratio": 0.16015242040157318, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.31234022974967957, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.1111769899725914, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 6.9141387939453125e-06, + "max_tolerance_ratio": 0.06230327486991882, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.20768000185489655, + 0.2025279998779297, + 0.20239999890327454, + 0.2024639993906021, + 0.20867200195789337, + 0.20083199441432953, + 0.1976960003376007, + 0.2008640021085739, + 0.19881600141525269, + 0.2003840059041977 + ], + "native": [ + 0.20492799580097198, + 0.2019840031862259, + 0.2054399996995926, + 0.20425599813461304, + 0.20739200711250305, + 0.20416000485420227, + 0.20444799959659576, + 0.20233599841594696, + 0.20496000349521637, + 0.20371200144290924 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.20163200050592422, + "native": 0.2043519988656044 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 0.6663359999656677, + 0.7033920288085938, + 0.6484799981117249, + 0.7002879977226257, + 0.6599360108375549, + 0.7626879811286926, + 0.6531839966773987, + 0.7648320198059082, + 0.6789439916610718, + 0.4784959852695465 + ], + "native": [ + 0.5605440139770508, + 0.5845119953155518, + 0.6655679941177368, + 0.6401280164718628, + 0.4888960123062134, + 0.6350719928741455, + 0.626911997795105, + 0.599295973777771, + 0.5053120255470276, + 0.3717440068721771 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.6726399958133698, + "native": 0.5919039845466614 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 0.9015679955482483, + 0.6134080290794373, + 0.6672000288963318, + 0.9269760251045227, + 0.8955519795417786, + 0.8659520149230957, + 0.8354880213737488, + 0.7765439748764038, + 0.8956800103187561, + 0.8540800213813782 + ], + "native": [ + 0.7008000016212463, + 0.5196160078048706, + 0.9331520199775696, + 0.8441600203514099, + 0.8278399705886841, + 0.8227519989013672, + 0.7297599911689758, + 0.5203199982643127, + 0.7871360182762146, + 0.7820479869842529 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.8600160181522369, + "native": 0.7845920026302338 + } + }, + "peak_increment_bytes": { + "candidate": 510732288, + "native": 579078656 + } + } + }, + { + "stream": "final", + "dtype": "torch.float32", + "batch": 1, + "seq": 6032, + "readback": { + "operator": "qwenimage_final_adaln_out", + "requested_backend": "cuda", + "actual_backend": "cuda", + "contract": "qwenimage-adaln-v2", + "fallback": false, + "accumulation_dtype": "float32", + "projection_kernel": "rl_engine._C.qwenimage_det_linear_forward", + "projection_tree": "warp_xor", + "backward": "compensated_64_column_partials_kahan_fold; ascending_batch_neumaier_dW_product_residual_db", + "parameter_gradient_kernel": "rl_engine._C.qwenimage_det_linear_backward_weight", + "parameter_gradient_backend": "cuda_compensated", + "backward_contract": "qwenimage-parameter-grad-neumaier-v2", + "activation": "aten.silu; fp32 analytic VJP", + "execution_dtype": "torch.float32", + "device": "cuda:0", + "capability": [ + 10, + 0 + ], + "norm": "aten.native_layer_norm[fp32,eps=1e-6]", + "token_gradient_tree": "recursive_32_token_balanced", + "cast_boundaries": "silu,projection,norm,1+scale,product,output", + "fused": false + }, + "correctness": { + "forward": { + "passed": true, + "max_abs": 1.71661376953125e-05, + "max_tolerance_ratio": 0.02496703527867794, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "gradients": { + "temb": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.06953641772270203, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.5045391917228699, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.14554359018802643, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 2.288818359375e-05, + "max_tolerance_ratio": 0.024077266454696655, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "repeat_bitwise": true, + "fp64_diagnostic": { + "candidate_gradients": { + "temb": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.042575497180223465, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.3655945658683777, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.11526236683130264, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.014260451309382915, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_gradients": { + "temb": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.07013123482465744, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.2477286159992218, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.0891907587647438, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.0283614881336689, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + }, + "timing": { + "forward": { + "samples_ms": { + "candidate": [ + 0.1939840018749237, + 0.1860480010509491, + 0.18454399704933167, + 0.1841920018196106, + 0.18300800025463104, + 0.18479999899864197, + 0.18137599527835846, + 0.1833599954843521, + 0.18166400492191315, + 0.18323199450969696 + ], + "native": [ + 0.1924159973859787, + 0.18828800320625305, + 0.19033600389957428, + 0.18860800564289093, + 0.18953600525856018, + 0.1876160055398941, + 0.18979200720787048, + 0.18697600066661835, + 0.18886399269104004, + 0.18860800564289093 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.18377599865198135, + "native": 0.18873599916696548 + } + }, + "backward": { + "samples_ms": { + "candidate": [ + 0.4537599980831146, + 0.6425920128822327, + 0.7072640061378479, + 0.7165120244026184, + 0.6991040110588074, + 0.456928014755249, + 0.40227198600769043, + 0.6737599968910217, + 0.7166399955749512, + 0.7048640251159668 + ], + "native": [ + 0.44604799151420593, + 0.3972800076007843, + 0.6276159882545471, + 0.664031982421875, + 0.6071360111236572, + 0.7465919852256775, + 0.39532798528671265, + 0.7452800273895264, + 0.6387519836425781, + 0.6419839859008789 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.6864320039749146, + "native": 0.6331839859485626 + } + }, + "forward_backward": { + "samples_ms": { + "candidate": [ + 0.8804159760475159, + 0.9048640131950378, + 0.8851519823074341, + 0.656544029712677, + 0.5734720230102539, + 0.9564480185508728, + 0.8755519986152649, + 0.8640959858894348, + 0.858240008354187, + 0.8535360097885132 + ], + "native": [ + 0.787775993347168, + 0.8320639729499817, + 0.8391039967536926, + 0.9171839952468872, + 0.6292480230331421, + 0.5909439921379089, + 0.796288013458252, + 0.8442239761352539, + 0.618943989276886, + 0.8115519881248474 + ] + }, + "order": [ + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ], + [ + "candidate", + "native" + ], + [ + "native", + "candidate" + ] + ], + "median_ms": { + "candidate": 0.8698239922523499, + "native": 0.8039200007915497 + } + }, + "peak_increment_bytes": { + "candidate": 447442944, + "native": 520126976 + } + } + } + ], + "passed": true +} diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/tests.txt b/docs/usage/evidence/qwenimage-final-adaln-out-b200/tests.txt new file mode 100644 index 000000000..724d3e115 --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/tests.txt @@ -0,0 +1,3 @@ +........................................................................ [ 53%] +............................................................... [100%] +135 passed in 93.85s (0:01:33)

MNBv};*4=yn9t?Q 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/Vp4?QD1mg zxm~;Xmm7J|1R~6uOuaGXd250kf^ML~#!i?R8;4-Ub&Y4ta3?oib=k~;xuhsge6QW~ z^N-c4y@^_W%ZzkG z1PoqYJzc6Z=8Qd|f6**js6_%>;xAPv$#(DhV4#e2wQsN1&{9e`JmveF<4y>zzr{=( z4{Dq_$o1Qbt6yVu6;Hhi()9o5Bx8b5W}~EZQ;7qWOy-GehF~|FmB;uqnDGJbfAU+h|=vAMyq-CGxejjaMs(J~MF}8idY5 zU~-U4wI^w|;A)WS>3M-o6gxes)4z*Nn;2;LPmqoUJ-edht?g(j*_EBEnd}gVQja zyGd+lNri6OS)wTJEqP$-b6)Cukw<5&&4zGD@}#88a4C{c6LJS*W8*iKl{&|kwv)OJ z{@31p*mi?id=3;w;Cjpw@iZ|A#+!u6$<}R~Rv>Y0Hu;H?ZeernRUawDn|f zi9lKWN>ZZ?)CVBu`QYGbK%+8snyb2Nj2~ZdyW!J~b+SLsRYM~wg?CU;ELVEegbCXR zU*$?FwFN<2b#JVRvYBsWCJwXzF4xH zFo|Fc<%`I7?^X*)=9rtG_wZUa=1Ze>32gi_)-J@vaAf7wtfZv*Q(Ln;N!mPV`{&bC zf+I-3%N-LN0udID`0KBq%x^iF&@q(%Q2pZzB*)W4&^BD)Eff0J-y76?8szTsx))oI zZqO{S440GSL)N;ry`+~ylM6>tzvZFZ4@<_@e2fR)B34FHWEg&&KS(m@*Ktytb5M&% z>f!y~zRNeaG!*Y2Osknb((H6EB@W&e;fy0Z*t#!R=|^M3%m C(-R^9 literal 0 HcmV?d00001 diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/cublas_policy-reuse.json b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/cublas_policy-reuse.json new file mode 100644 index 000000000..cad5b7d14 --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/cublas_policy-reuse.json @@ -0,0 +1,4836 @@ +{ + "mode": "cublas_policy", + "phase": "reuse", + "accuracy_seed": 0, + "source": { + "base_sha": "55f83d2b9043f41dca84440d9002ca30f5d3fac4", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked_source_sha256": {}, + "workspace_source_sha256": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "qwenimage_source_sha256": { + "csrc/cuda/model_specific/qwenimage/det_linear.cu": "859da456b0c776f3492b3197c252866e33d9a7088508b701b7c4a179ee709afb", + "csrc/cuda/model_specific/qwenimage/token_sum.cu": "1aace24523ff95520ab5d482e2e0f17d09a2efcf93efc8de865c7bcc157cf3ba", + "rl_engine/backends/cuda/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py": "710df5416a2adf5b2576468ff63584b6699e6bdecd59906370049bf09f1b3286", + "rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py": "f6afe4b7568e2026c4b046a4fd0a02589f817d815198af33173d2dba61773f19", + "rl_engine/reference/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py": "1ebc740ddff575055ee66ed714a8c7cc5c6cee2701d582a665289e9ad1a4fe3d", + "rl_engine/reference/model_specific/qwenimage/final_adaln_out.py": "60441610c04d04d0fb1cd7320be8584e76772c110a3cfed77ddf826dbde9b53c", + "benchmarks/models/qwenimage/__init__.py": "a63ebc79ed10d9ed98484565a353438bd13f5801a8f51d7505d0921bf6942742", + "benchmarks/models/qwenimage/adaln_evidence.py": "9dc9f3da0069d36c602baef07d687fb1aeba8fda0163d17fc446e0a543fe1f3e", + "benchmarks/models/qwenimage/adaln_parameter_screen.py": "05562ef30d09296c2ccd1cdeb44085568b8c877d01f5fb1df4b983e84945ec03", + "benchmarks/models/qwenimage/adaln_prior_art.py": "647aa9fc81e02bf3c7806ed6c2a3e578fb3e1a0b000b4388a12367ef86de3139", + "benchmarks/models/qwenimage/adaln_reuse_bi_audit.py": "88dd3d390e647bbc883b76622309fad54dac3618630dcca0785e555db329a671", + "benchmarks/models/qwenimage/adaln_reuse_candidate.py": "4598f6db94462ac30f3bdd3defae16f0ce7a34ac59eb1996d18e86f498c029b6", + "benchmarks/models/qwenimage/plot_adaln_audit.py": "6151e6abccca8f647c2fbeadf92f12e43ed1c07954db9f2db2f035284cbd407c", + "benchmarks/models/qwenimage/plot_adaln_evidence.py": "16d6bed0ee5b808814c5f7157145a730750d0b1aaf94762e6f72a256e942c1e2", + "benchmarks/models/qwenimage/streams.py": "bd27383eee59404df295f724f6c7d620db3d3d7074c19dd94d51a711b38acf02", + "benchmarks/models/qwenimage/validate_adaln_repair.py": "8b663191323b455470a2313cdfefd837657441b300ffd0e0767453f9f407db03" + }, + "extension_sha256": "5d1054db8bba2eaedbd391d0c23b6683acea9ed04fcd64d6f369faed75aa9e0f", + "clean_commit": true + }, + "cases": [ + { + "stream": "image", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 0.0007102272727272727, + "temb": 0.0021352098780145655, + "weight": 0.0031093047650859887, + "bias": 0.002188183807439825 + }, + "repeat_all_gradients": { + "output": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.04390399903059006, + 0.04310400038957596, + 0.04022400081157684, + 0.040991999208927155, + 0.04131200164556503, + 0.04108799993991852, + 0.04016000032424927, + 0.039872001856565475, + 0.040192000567913055, + 0.04022400081157684 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.040608000010252 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.6089919805526733, + 0.5169919729232788, + 0.5060480237007141, + 0.5973439812660217, + 0.17580799758434296, + 0.3620480000972748, + 0.33292800188064575, + 0.5202239751815796, + 0.5717759728431702, + 0.5688319802284241 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.5186079740524292 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.6189759969711304, + 0.6918399930000305, + 0.5114880204200745, + 0.4169920086860657, + 0.5048959851264954, + 0.4872959852218628, + 0.6818879842758179, + 0.6612480282783508, + 0.6711360216140747, + 0.6315199732780457 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.625247985124588 + } + }, + "peak_increment_bytes": { + "cublas_policy": 113369088 + } + } + }, + { + "batch": 3, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.04095999896526337, + 0.03888000175356865, + 0.03852799907326698, + 0.039712000638246536, + 0.03948799893260002, + 0.03840000182390213, + 0.03798399865627289, + 0.039135999977588654, + 0.038816001266241074, + 0.038943998515605927 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.03891200013458729 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.5602560043334961, + 0.5097600221633911, + 0.5095040202140808, + 0.3781439960002899, + 0.1287039965391159, + 0.48793599009513855, + 0.5028799772262573, + 0.5097280144691467, + 0.5708159804344177, + 0.5698879957199097 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.5096160173416138 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.5084480047225952, + 0.17708800733089447, + 0.5961920022964478, + 0.6268159747123718, + 0.615776002407074, + 0.6619840264320374, + 0.6298559904098511, + 0.6618559956550598, + 0.6242240071296692, + 0.6495360136032104 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.6255199909210205 + } + }, + "peak_increment_bytes": { + "cublas_policy": 113541120 + } + } + }, + { + "batch": 256, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.05052800104022026, + 0.04793599992990494, + 0.04665600135922432, + 0.04710400104522705, + 0.04505600035190582, + 0.04543999955058098, + 0.04700800031423569, + 0.04531199857592583, + 0.04483199864625931, + 0.04681599885225296 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.04673600010573864 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.5626879930496216, + 0.5239999890327454, + 0.5639359951019287, + 0.5092480182647705, + 0.1573760062456131, + 0.3739520013332367, + 0.4984639883041382, + 0.5019199848175049, + 0.5035840272903442, + 0.4928640127182007 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.5027520060539246 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.4343680143356323, + 0.6727359890937805, + 0.6206719875335693, + 0.630079984664917, + 0.6208320260047913, + 0.6406400203704834, + 0.485727995634079, + 0.6415359973907471, + 0.515392005443573, + 0.6319680213928223 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.6254560053348541 + } + }, + "peak_increment_bytes": { + "cublas_policy": 135303168 + } + } + }, + { + "batch": 2048, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.15225599706172943, + 0.14947199821472168, + 0.14847999811172485, + 0.1478080004453659, + 0.14800000190734863, + 0.14662399888038635, + 0.14534400403499603, + 0.14588800072669983, + 0.14467200636863708, + 0.14511999487876892 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.14721599966287613 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.3555839955806732, + 0.3547840118408203, + 0.39798399806022644, + 0.357695996761322, + 0.3547520041465759, + 0.3270080089569092, + 0.5217599868774414, + 0.5658239722251892, + 0.5643839836120605, + 0.5597119927406311 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.37783999741077423 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.5307520031929016, + 0.6869120001792908, + 0.6802240014076233, + 0.6326720118522644, + 0.6351040005683899, + 0.5408639907836914, + 0.6333439946174622, + 0.6431040167808533, + 0.6409279704093933, + 0.4792959988117218 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.634223997592926 + } + }, + "peak_increment_bytes": { + "cublas_policy": 449876992 + } + } + } + ] + }, + { + "stream": "image", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 8.676111307914236e-08, + "temb": 3.322163921758796e-07, + "weight": 1.2601489105323987e-07, + "bias": 5.007435123128072e-08 + }, + "repeat_all_gradients": { + "output": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.05673599988222122, + 0.0560000017285347, + 0.05696000158786774, + 0.05603199824690819, + 0.05455999821424484, + 0.057023998349905014, + 0.05462399870157242, + 0.054207999259233475, + 0.05375999957323074, + 0.05612799897789955 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.05601599998772144 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.5192639827728271, + 0.5013120174407959, + 0.5279359817504883, + 0.33267199993133545, + 0.38998401165008545, + 0.5298560261726379, + 0.4963200092315674, + 0.5711680054664612, + 0.5348160266876221, + 0.5141119956970215 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.5166879892349243 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.49004799127578735, + 0.5851200222969055, + 0.5906559824943542, + 0.6002879738807678, + 0.625823974609375, + 0.5343040227890015, + 0.6120319962501526, + 0.6307200193405151, + 0.5194879770278931, + 0.4005439877510071 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.5878880023956299 + } + }, + "peak_increment_bytes": { + "cublas_policy": 226738176 + } + } + }, + { + "batch": 3, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.11190400272607803, + 0.1120000034570694, + 0.10969600081443787, + 0.11372800171375275, + 0.1111999973654747, + 0.11052799969911575, + 0.10979200154542923, + 0.1098880022764206, + 0.11100800335407257, + 0.11091200262308121 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.11096000298857689 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.5098879933357239, + 0.4962559938430786, + 0.5013759732246399, + 0.4986239969730377, + 0.4970879852771759, + 0.29951998591423035, + 0.4691520035266876, + 0.5547199845314026, + 0.531711995601654, + 0.5527039766311646 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.4999999850988388 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.6280320286750793, + 0.4381760060787201, + 0.3949759900569916, + 0.5019199848175049, + 0.6623679995536804, + 0.6004160046577454, + 0.6815999746322632, + 0.6627839803695679, + 0.6789759993553162, + 0.6054080128669739 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.6167200207710266 + } + }, + "peak_increment_bytes": { + "cublas_policy": 227082240 + } + } + }, + { + "batch": 256, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.4986560046672821, + 0.49744001030921936, + 0.4925119876861572, + 0.4922559857368469, + 0.4917120039463043, + 0.4904319941997528, + 0.4893760085105896, + 0.49062401056289673, + 0.49212801456451416, + 0.4904640018939972 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.49192000925540924 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 1.4163199663162231, + 1.4279359579086304, + 1.4000639915466309, + 1.3760639429092407, + 1.418496012687683, + 1.4340800046920776, + 1.399232029914856, + 1.3844159841537476, + 1.4126720428466797, + 1.4164479970932007 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 1.4144960045814514 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 1.761023998260498, + 1.757472038269043, + 1.707327961921692, + 1.693984031677246, + 1.763808012008667, + 1.7613120079040527, + 1.7657279968261719, + 1.7701760530471802, + 1.763551950454712, + 1.761504054069519 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 1.7614080309867859 + } + }, + "peak_increment_bytes": { + "cublas_policy": 270606336 + } + } + }, + { + "batch": 2048, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 3.7695999145507812, + 3.7693119049072266, + 3.7707200050354004, + 3.7705600261688232, + 3.7705600261688232, + 3.7704319953918457, + 3.7703359127044678, + 3.7707839012145996, + 3.7694079875946045, + 3.7714240550994873 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 3.7704960107803345 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 7.993375778198242, + 7.988704204559326, + 7.98956823348999, + 7.981823921203613, + 8.03264045715332, + 8.00879955291748, + 7.975423812866211, + 8.038399696350098, + 7.985472202301025, + 8.00057601928711 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 7.991472005844116 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 11.565695762634277, + 11.61945629119873, + 11.626720428466797, + 11.564191818237305, + 11.62054443359375, + 11.618975639343262, + 11.611167907714844, + 11.61849594116211, + 11.561887741088867, + 11.554335594177246 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 11.614831924438477 + } + }, + "peak_increment_bytes": { + "cublas_policy": 739320832 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 0.0009765625, + "temb": 0.0037906331728412125, + "weight": 0.0031093047650859887, + "bias": 0.002188183807439825 + }, + "repeat_all_gradients": { + "output": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.04016000032424927, + 0.04064000025391579, + 0.040863998234272, + 0.039872001856565475, + 0.040031999349594116, + 0.03999999910593033, + 0.0395519994199276, + 0.03939199820160866, + 0.03923200070858002, + 0.03852799907326698 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.0399360004812479 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.36403200030326843, + 0.13167999684810638, + 0.1281919926404953, + 0.12758399546146393, + 0.12643200159072876, + 0.1271039992570877, + 0.12643200159072876, + 0.12646399438381195, + 0.12406399846076965, + 0.12643200159072876 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.12678399682044983 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.1600639969110489, + 0.16099199652671814, + 0.16022400557994843, + 0.16041600704193115, + 0.15936000645160675, + 0.16252799332141876, + 0.15398399531841278, + 0.1584320068359375, + 0.15587200224399567, + 0.15887999534606934 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.15971200168132782 + } + }, + "peak_increment_bytes": { + "cublas_policy": 113369088 + } + } + }, + { + "batch": 3, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.04224000126123428, + 0.03999999910593033, + 0.038656000047922134, + 0.040383998304605484, + 0.04041599854826927, + 0.03836800158023834, + 0.03888000175356865, + 0.039135999977588654, + 0.03782400116324425, + 0.038656000047922134 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.03900800086557865 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.5803200006484985, + 0.5143679976463318, + 0.5035200119018555, + 0.5114880204200745, + 0.5597119927406311, + 0.3866879940032959, + 0.3384000062942505, + 0.3345920145511627, + 0.4750080108642578, + 0.5069440007209778 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.5052320063114166 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.5391039848327637, + 0.7426559925079346, + 0.4901759922504425, + 0.6727359890937805, + 0.6330879926681519, + 0.6201279759407043, + 0.6138560175895691, + 0.6716480255126953, + 0.6257920265197754, + 0.5337920188903809 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.6229600012302399 + } + }, + "peak_increment_bytes": { + "cublas_policy": 113541120 + } + } + }, + { + "batch": 256, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.047200001776218414, + 0.04620800167322159, + 0.0459199994802475, + 0.04787199944257736, + 0.045343998819589615, + 0.045791998505592346, + 0.04527999833226204, + 0.04419200122356415, + 0.04479999840259552, + 0.044895999133586884 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.04556799866259098 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.32447999715805054, + 0.4978559911251068, + 0.5024960041046143, + 0.5527679920196533, + 0.5452160239219666, + 0.5637120008468628, + 0.5012159943580627, + 0.35705599188804626, + 0.33721598982810974, + 0.5251839756965637 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.5018559992313385 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.6175040006637573, + 0.7461119890213013, + 0.6738880276679993, + 0.6151360273361206, + 0.4912639856338501, + 0.18771199882030487, + 0.44460800290107727, + 0.6715520024299622, + 0.6733440160751343, + 0.6728960275650024 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.6445280015468597 + } + }, + "peak_increment_bytes": { + "cublas_policy": 135303168 + } + } + }, + { + "batch": 2048, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.1509760022163391, + 0.14921599626541138, + 0.14815999567508698, + 0.14697599411010742, + 0.1467200070619583, + 0.1451839953660965, + 0.144896000623703, + 0.14537599682807922, + 0.14560000598430634, + 0.14511999487876892 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.14616000652313232 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.5509120225906372, + 0.49875199794769287, + 0.5789120197296143, + 0.5333759784698486, + 0.528768002986908, + 0.3777279853820801, + 0.5296000242233276, + 0.5693119764328003, + 0.5831999778747559, + 0.5231999754905701 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.5314880013465881 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.5754879713058472, + 0.6586880087852478, + 0.6631039977073669, + 0.5335040092468262, + 0.5363519787788391, + 0.6334720253944397, + 0.6581760048866272, + 0.6353279948234558, + 0.6342719793319702, + 0.6746559739112854 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.634799987077713 + } + }, + "peak_increment_bytes": { + "cublas_policy": 449876992 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 1.1891091396474316e-07, + "temb": 6.236398211248578e-07, + "weight": 1.2601489105323987e-07, + "bias": 5.007435123128072e-08 + }, + "repeat_all_gradients": { + "output": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.05734400078654289, + 0.05728000029921532, + 0.054976001381874084, + 0.05612799897789955, + 0.05558399856090546, + 0.05555199831724167, + 0.05644800141453743, + 0.0562559999525547, + 0.05603199824690819, + 0.05423999950289726 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.05607999861240387 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.3413439989089966, + 0.34627199172973633, + 0.41200000047683716, + 0.3421120047569275, + 0.1812800019979477, + 0.18137599527835846, + 0.3421120047569275, + 0.38598400354385376, + 0.34624001383781433, + 0.47577598690986633 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.3441760092973709 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.5983359813690186, + 0.48262399435043335, + 0.4329279959201813, + 0.43187201023101807, + 0.6105920076370239, + 0.6613439917564392, + 0.620352029800415, + 0.642848014831543, + 0.5152000188827515, + 0.39392000436782837 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.556768000125885 + } + }, + "peak_increment_bytes": { + "cublas_policy": 226738176 + } + } + }, + { + "batch": 3, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.11209599673748016, + 0.11203200370073318, + 0.10915199667215347, + 0.11072000116109848, + 0.11084800213575363, + 0.11055999994277954, + 0.11030399799346924, + 0.10873600095510483, + 0.11212799698114395, + 0.11068800091743469 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.11070400103926659 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.4875839948654175, + 0.4742079973220825, + 0.5070400238037109, + 0.46246400475502014, + 0.305759996175766, + 0.2885439991950989, + 0.47171199321746826, + 0.563647985458374, + 0.5001599788665771, + 0.49849599599838257 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.48089599609375 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.5346879959106445, + 0.6709439754486084, + 0.6415359973907471, + 0.6537280082702637, + 0.6509760022163391, + 0.5999040007591248, + 0.6042559742927551, + 0.6211839914321899, + 0.5838080048561096, + 0.39561599493026733 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.6127199828624725 + } + }, + "peak_increment_bytes": { + "cublas_policy": 227082240 + } + } + }, + { + "batch": 256, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.49353599548339844, + 0.49273601174354553, + 0.48998400568962097, + 0.48998400568962097, + 0.4922879934310913, + 0.49059200286865234, + 0.4891200065612793, + 0.49033600091934204, + 0.49136000871658325, + 0.4915199875831604 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.4909760057926178 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 1.412992000579834, + 1.4876799583435059, + 1.4528640508651733, + 1.4177279472351074, + 1.3876479864120483, + 1.4153920412063599, + 1.4228800535202026, + 1.4669760465621948, + 1.4155199527740479, + 1.4699840545654297 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 1.420304000377655 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 1.70905601978302, + 1.693824052810669, + 1.694815993309021, + 1.7615679502487183, + 1.763808012008667, + 1.7568639516830444, + 1.7645119428634644, + 1.7627840042114258, + 1.76528000831604, + 1.7634559869766235 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 1.762175977230072 + } + }, + "peak_increment_bytes": { + "cublas_policy": 270606336 + } + } + }, + { + "batch": 2048, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 3.7706239223480225, + 3.7703359127044678, + 3.7713279724121094, + 3.768671989440918, + 3.770400047302246, + 3.769984006881714, + 3.7700159549713135, + 3.76963210105896, + 3.7718400955200195, + 3.7717440128326416 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 3.770367980003357 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 8.04736042022705, + 7.994592189788818, + 8.029472351074219, + 7.987840175628662, + 7.955967903137207, + 8.026816368103027, + 7.985695838928223, + 7.986752033233643, + 7.9964799880981445, + 7.992544174194336 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 7.993568181991577 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 11.564672470092773, + 11.613120079040527, + 11.617919921875, + 11.613951683044434, + 11.611328125, + 11.616703987121582, + 11.615072250366211, + 11.616640090942383, + 11.6146240234375, + 11.573087692260742 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 11.614287853240967 + } + }, + "peak_increment_bytes": { + "cublas_policy": 739320832 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 0.0003078817733990148, + "x": 0.003379820097165924, + "temb": 0.005905976490849045, + "weight": 0.00517754451340496, + "bias": 0.0040532119374307955 + }, + "repeat_all_gradients": { + "output": true, + "x": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 33, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.06806399673223495, + 0.06617599725723267, + 0.06707199662923813, + 0.06911999732255936, + 0.06419199705123901, + 0.06451199948787689, + 0.06377600133419037, + 0.06390400230884552, + 0.06380800157785416, + 0.060896001756191254 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.06435199826955795 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.5966399908065796, + 0.6201279759407043, + 0.4647040069103241, + 0.4392639994621277, + 0.6097279787063599, + 0.630079984664917, + 0.5934399962425232, + 0.5920959711074829, + 0.6452479958534241, + 0.6624320149421692 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.6031839847564697 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.45286399126052856, + 0.3166399896144867, + 0.7391359806060791, + 0.793503999710083, + 0.8452159762382507, + 0.843936026096344, + 0.8011839985847473, + 0.8238080143928528, + 0.8001599907875061, + 0.8340479731559753 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.8006719946861267 + } + }, + "peak_increment_bytes": { + "cublas_policy": 38393856 + } + } + }, + { + "batch": 2, + "sequence": 4096, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.20310400426387787, + 0.20150400698184967, + 0.20236800611019135, + 0.1993280053138733, + 0.19808000326156616, + 0.19935999810695648, + 0.20147199928760529, + 0.2014400064945221, + 0.1982080042362213, + 0.20022399723529816 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.20083200186491013 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.6058239936828613, + 0.6561279892921448, + 0.6081920266151428, + 0.601248025894165, + 0.48256000876426697, + 0.5088000297546387, + 0.4671359956264496, + 0.5969280004501343, + 0.6392639875411987, + 0.6768320202827454 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.6035360097885132 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.6962239742279053, + 0.6243199706077576, + 0.7172799706459045, + 0.8961279988288879, + 0.8385599851608276, + 0.8474239706993103, + 0.8655359745025635, + 0.8472959995269775, + 0.8547199964523315, + 0.8807359933853149 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.8473599851131439 + } + }, + "peak_increment_bytes": { + "cublas_policy": 409059840 + } + } + }, + { + "batch": 1, + "sequence": 6889, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.15299199521541595, + 0.15705600380897522, + 0.15238399803638458, + 0.1507200002670288, + 0.1539520025253296, + 0.15196800231933594, + 0.1520320028066635, + 0.14873600006103516, + 0.150176003575325, + 0.15161600708961487 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.15200000256299973 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.609279990196228, + 0.6164479851722717, + 0.6045439839363098, + 0.49481600522994995, + 0.2572160065174103, + 0.4442560076713562, + 0.48924800753593445, + 0.6005439758300781, + 0.6640639901161194, + 0.63264000415802 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.602543979883194 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.7852799892425537, + 0.7319039702415466, + 0.7546560168266296, + 0.9239040017127991, + 0.8826559782028198, + 0.8431680202484131, + 0.820576012134552, + 0.8140159845352173, + 0.8423680067062378, + 0.8214079737663269 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.8209919929504395 + } + }, + "peak_increment_bytes": { + "cublas_policy": 367424000 + } + } + }, + { + "batch": 1, + "sequence": 6032, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.14076800644397736, + 0.1417279988527298, + 0.1401280015707016, + 0.1398719996213913, + 0.13702400028705597, + 0.14035199582576752, + 0.14057600498199463, + 0.13868799805641174, + 0.13811199367046356, + 0.13737599551677704 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.14000000059604645 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.6042559742927551, + 0.6045439839363098, + 0.6796159744262695, + 0.26025599241256714, + 0.46028798818588257, + 0.5733439922332764, + 0.5983679890632629, + 0.6042240262031555, + 0.6193600296974182, + 0.676800012588501 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.6042400002479553 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.7059839963912964, + 0.48291200399398804, + 0.5799999833106995, + 0.8235840201377869, + 0.8736000061035156, + 0.8901119828224182, + 0.8060799837112427, + 0.8050879836082458, + 0.8319360017776489, + 0.8326079845428467 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.8148320019245148 + } + }, + "peak_increment_bytes": { + "cublas_policy": 334799360 + } + } + }, + { + "batch": 256, + "sequence": 3, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.07036799937486649, + 0.06623999774456024, + 0.06614399701356888, + 0.06719999760389328, + 0.06403200328350067, + 0.06748799979686737, + 0.06592000275850296, + 0.0655359998345375, + 0.0655680000782013, + 0.0642239972949028 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.06603199988603592 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.6231039762496948, + 0.6096320152282715, + 0.3954879939556122, + 0.6573439836502075, + 0.6474559903144836, + 0.5950400233268738, + 0.6453120112419128, + 0.5999040007591248, + 0.6686720252037048, + 0.6461759805679321 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.6342079937458038 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.540287971496582, + 0.6837120056152344, + 0.8403840065002441, + 0.8597440123558044, + 0.8028479814529419, + 0.8739839792251587, + 0.8523839712142944, + 0.6797119975090027, + 0.5600000023841858, + 0.5503039956092834 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.7432799935340881 + } + }, + "peak_increment_bytes": { + "cublas_policy": 58208256 + } + } + }, + { + "batch": 2048, + "sequence": 3, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.22675199806690216, + 0.2247679978609085, + 0.2242240011692047, + 0.2210880070924759, + 0.22179199755191803, + 0.2210880070924759, + 0.2207999974489212, + 0.2207999974489212, + 0.22015999257564545, + 0.220768004655838 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.2210880070924759 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.6224960088729858, + 0.6555200219154358, + 0.6257280111312866, + 0.6154879927635193, + 0.5373439788818359, + 0.3550400137901306, + 0.39529600739479065, + 0.39190399646759033, + 0.6063680052757263, + 0.6346560120582581 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.6109279990196228 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.7912319898605347, + 0.8029760122299194, + 0.769536018371582, + 0.5674560070037842, + 0.554527997970581, + 0.5508480072021484, + 0.6124799847602844, + 0.7895680069923401, + 0.895904004573822, + 0.883840024471283 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.7795520126819611 + } + }, + "peak_increment_bytes": { + "cublas_policy": 302002688 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.float32", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 1.5006967359770956e-07, + "x": 1.1013294010721937e-07, + "temb": 9.310621970443409e-07, + "weight": 1.611449087501953e-07, + "bias": 1.037766860497995e-07 + }, + "repeat_all_gradients": { + "output": true, + "x": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 33, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.07001599669456482, + 0.06960000097751617, + 0.060095999389886856, + 0.06137600168585777, + 0.06035200133919716, + 0.05875200033187866, + 0.05993599817156792, + 0.059039998799562454, + 0.0594559982419014, + 0.0597120001912117 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.060015998780727386 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.19753600656986237, + 0.18643200397491455, + 0.1791680008172989, + 0.17660799622535706, + 0.18012799322605133, + 0.17235200107097626, + 0.324864000082016, + 0.1825920045375824, + 0.1759359985589981, + 0.17689600586891174 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.1796479970216751 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.6110399961471558, + 0.8126400113105774, + 0.8840640187263489, + 0.7647039890289307, + 0.7567039728164673, + 0.8343039751052856, + 0.8318719863891602, + 0.7608000040054321, + 0.7928320169448853, + 0.42179200053215027 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.778768002986908 + } + }, + "peak_increment_bytes": { + "cublas_policy": 76787712 + } + } + }, + { + "batch": 2, + "sequence": 4096, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.25804799795150757, + 0.25222399830818176, + 0.25116801261901855, + 0.2508479952812195, + 0.2516160011291504, + 0.25036799907684326, + 0.2500480115413666, + 0.2503040134906769, + 0.2492160052061081, + 0.2510400116443634 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.25094400346279144 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.7807999849319458, + 0.8588160276412964, + 0.8268799781799316, + 0.7958719730377197, + 0.7726719975471497, + 0.6111680269241333, + 0.6001279950141907, + 0.7490559816360474, + 0.782912015914917, + 0.8347839713096619 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.7818560004234314 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.9624959826469421, + 0.9866880178451538, + 0.9618239998817444, + 1.0168319940567017, + 0.9622719883918762, + 0.9753919839859009, + 0.8792960047721863, + 0.8838719725608826, + 0.8831040263175964, + 0.9542400240898132 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.9620479941368103 + } + }, + "peak_increment_bytes": { + "cublas_policy": 660767232 + } + } + }, + { + "batch": 1, + "sequence": 6889, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.2006080001592636, + 0.1998399943113327, + 0.1960960030555725, + 0.1971839964389801, + 0.19728000462055206, + 0.19753600656986237, + 0.19968000054359436, + 0.19545599818229675, + 0.1971520036458969, + 0.1945600062608719 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.19723200052976608 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.6232640147209167, + 0.6138560175895691, + 0.6081920266151428, + 0.3474240005016327, + 0.3203839957714081, + 0.5690879821777344, + 0.6560959815979004, + 0.5947200059890747, + 0.5871359705924988, + 0.5944640040397644 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.5945920050144196 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.5076159834861755, + 0.49564799666404724, + 0.5130559802055359, + 0.5672000050544739, + 0.7758399844169617, + 0.8540800213813782, + 0.7734079957008362, + 0.8555840253829956, + 0.5668799877166748, + 0.7724159955978394 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.6698080003261566 + } + }, + "peak_increment_bytes": { + "cublas_policy": 579078656 + } + } + }, + { + "batch": 1, + "sequence": 6032, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.1828480064868927, + 0.18108800053596497, + 0.1812800019979477, + 0.18367999792099, + 0.18108800053596497, + 0.17900800704956055, + 0.1793919950723648, + 0.17945599555969238, + 0.18041600286960602, + 0.17830400168895721 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.1807520017027855 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.6333760023117065, + 0.6213759779930115, + 0.3667199909687042, + 0.6521279811859131, + 0.4039680063724518, + 0.6073279976844788, + 0.6798400282859802, + 0.6195840239524841, + 0.6084160208702087, + 0.6084799766540527 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.6140320003032684 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.5301759839057922, + 0.46537598967552185, + 0.45283201336860657, + 0.6087999939918518, + 0.8418560028076172, + 0.8505600094795227, + 0.8203520178794861, + 0.7689279913902283, + 0.813696026802063, + 0.7937920093536377 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.781360000371933 + } + }, + "peak_increment_bytes": { + "cublas_policy": 520126976 + } + } + }, + { + "batch": 256, + "sequence": 3, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 0.2762880027294159, + 0.2725760042667389, + 0.270687997341156, + 0.26976001262664795, + 0.2683520019054413, + 0.2677760124206543, + 0.26790401339530945, + 0.2677440047264099, + 0.26815998554229736, + 0.26822400093078613 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.2682880014181137 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 0.8483840227127075, + 0.7889279723167419, + 0.7961599826812744, + 0.8049280047416687, + 0.5611199736595154, + 0.5693439841270447, + 0.6911680102348328, + 0.5690879821777344, + 0.5681920051574707, + 0.7976639866828918 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.7400479912757874 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 0.8474559783935547, + 0.839680016040802, + 0.838591992855072, + 0.994271993637085, + 1.0295039415359497, + 1.0388480424880981, + 1.0145599842071533, + 0.9971200227737427, + 0.9980159997940063, + 0.8405759930610657 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 0.9956960082054138 + } + }, + "peak_increment_bytes": { + "cublas_policy": 116416512 + } + } + }, + { + "batch": 2048, + "sequence": 3, + "measurements": { + "forward": { + "samples_ms": { + "cublas_policy": [ + 1.5779199600219727, + 1.576640009880066, + 1.579327940940857, + 1.5779520273208618, + 1.5768959522247314, + 1.5752320289611816, + 1.578879952430725, + 1.5750399827957153, + 1.5788480043411255, + 1.5785280466079712 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 1.5779359936714172 + } + }, + "backward": { + "samples_ms": { + "cublas_policy": [ + 3.0517120361328125, + 3.1234560012817383, + 3.0968639850616455, + 3.068608045578003, + 3.0337278842926025, + 3.058624029159546, + 3.052288055419922, + 3.069535970687866, + 3.058624029159546, + 3.055488109588623 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 3.058624029159546 + } + }, + "forward_backward": { + "samples_ms": { + "cublas_policy": [ + 4.4383039474487305, + 4.439519882202148, + 4.499199867248535, + 4.495327949523926, + 4.495999813079834, + 4.495071887969971, + 4.4991679191589355, + 4.495423793792725, + 4.4449920654296875, + 4.431935787200928 + ] + }, + "order": [ + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ], + [ + "cublas_policy" + ] + ], + "median_ms": { + "cublas_policy": 4.495199918746948 + } + }, + "peak_increment_bytes": { + "cublas_policy": 503341568 + } + } + } + ] + } + ], + "environment": { + "torch": "2.13.0+cu130", + "cuda": "13.0", + "gpu": "NVIDIA B200", + "workspace": { + "CUBLAS_WORKSPACE_CONFIG": ":16:8", + "CUBLASLT_WORKSPACE_SIZE": "1" + }, + "tf32": false + }, + "scope": "sample batch BI; final uses S=3 for large B, long S tested separately; shared parameter gradients: same ordered inputs, repeat only", + "packages": { + "torch": "2.13.0", + "triton": "3.7.1", + "diffusers": null, + "vllm": "0.30.0", + "sglang": "0.5.21", + "liger-kernel": "0.8.4", + "transformer_engine": null, + "megatron-core": null + } +} diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/fixed-accuracy.json b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/fixed-accuracy.json new file mode 100644 index 000000000..f625b5c97 --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/fixed-accuracy.json @@ -0,0 +1,2502 @@ +{ + "mode": "fixed", + "phase": "accuracy", + "accuracy_seed": 0, + "source": { + "base_sha": "55f83d2b9043f41dca84440d9002ca30f5d3fac4", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked_source_sha256": {}, + "workspace_source_sha256": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "qwenimage_source_sha256": { + "csrc/cuda/model_specific/qwenimage/det_linear.cu": "859da456b0c776f3492b3197c252866e33d9a7088508b701b7c4a179ee709afb", + "csrc/cuda/model_specific/qwenimage/token_sum.cu": "1aace24523ff95520ab5d482e2e0f17d09a2efcf93efc8de865c7bcc157cf3ba", + "rl_engine/backends/cuda/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py": "710df5416a2adf5b2576468ff63584b6699e6bdecd59906370049bf09f1b3286", + "rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py": "f6afe4b7568e2026c4b046a4fd0a02589f817d815198af33173d2dba61773f19", + "rl_engine/reference/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py": "1ebc740ddff575055ee66ed714a8c7cc5c6cee2701d582a665289e9ad1a4fe3d", + "rl_engine/reference/model_specific/qwenimage/final_adaln_out.py": "60441610c04d04d0fb1cd7320be8584e76772c110a3cfed77ddf826dbde9b53c", + "benchmarks/models/qwenimage/__init__.py": "a63ebc79ed10d9ed98484565a353438bd13f5801a8f51d7505d0921bf6942742", + "benchmarks/models/qwenimage/adaln_evidence.py": "9dc9f3da0069d36c602baef07d687fb1aeba8fda0163d17fc446e0a543fe1f3e", + "benchmarks/models/qwenimage/adaln_parameter_screen.py": "05562ef30d09296c2ccd1cdeb44085568b8c877d01f5fb1df4b983e84945ec03", + "benchmarks/models/qwenimage/adaln_prior_art.py": "647aa9fc81e02bf3c7806ed6c2a3e578fb3e1a0b000b4388a12367ef86de3139", + "benchmarks/models/qwenimage/adaln_reuse_bi_audit.py": "88dd3d390e647bbc883b76622309fad54dac3618630dcca0785e555db329a671", + "benchmarks/models/qwenimage/adaln_reuse_candidate.py": "4598f6db94462ac30f3bdd3defae16f0ce7a34ac59eb1996d18e86f498c029b6", + "benchmarks/models/qwenimage/plot_adaln_audit.py": "6151e6abccca8f647c2fbeadf92f12e43ed1c07954db9f2db2f035284cbd407c", + "benchmarks/models/qwenimage/plot_adaln_evidence.py": "16d6bed0ee5b808814c5f7157145a730750d0b1aaf94762e6f72a256e942c1e2", + "benchmarks/models/qwenimage/streams.py": "bd27383eee59404df295f724f6c7d620db3d3d7074c19dd94d51a711b38acf02", + "benchmarks/models/qwenimage/validate_adaln_repair.py": "8b663191323b455470a2313cdfefd837657441b300ffd0e0767453f9f407db03" + }, + "extension_sha256": "5d1054db8bba2eaedbd391d0c23b6683acea9ed04fcd64d6f369faed75aa9e0f", + "clean_commit": true + }, + "cases": [ + { + "stream": "image", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 1, + "errors": { + "output": 8.87784090909091e-05, + "temb": 0.002728983407362896, + "weight": 0.0024390243902439024, + "bias": 0.0 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.00390625, + "max_tolerance_ratio": 0.06242197006940842, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.06221199035644531, + "max_tolerance_ratio": 0.1368875354528427, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11635208129882812, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.00390625, + "max_tolerance_ratio": 0.06242197006940842, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0622100830078125, + "max_tolerance_ratio": 0.1368919014930725, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11635208129882812, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0009765625, + "max_tolerance_ratio": 0.01830160990357399, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 1.4685560017824173e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 1, + "errors": { + "output": 0.0003551136363636364, + "temb": 0.0013375396742077623, + "weight": 0.0031093047650859887, + "bias": 0.002188183807439825 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.17182131111621857, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0716552734375, + "max_tolerance_ratio": 0.14068613946437836, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0524444580078125, + "max_tolerance_ratio": 0.12155365198850632, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.0863557830452919, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.17182131111621857, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0716552734375, + "max_tolerance_ratio": 0.14069046080112457, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0524444580078125, + "max_tolerance_ratio": 0.12155365198850632, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.0863557830452919, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.00390625, + "max_tolerance_ratio": 0.057537395507097244, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 2.205422060796991e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 3.6503697629086673e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "image", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 1, + "errors": { + "output": 1.3014166961871354e-07, + "temb": 1.153164147293586e-07, + "weight": 1.1117015265884846e-07, + "bias": 0.0 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.016213035210967064, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 2.86102294921875e-06, + "max_tolerance_ratio": 0.0038795864675194025, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0017226141644641757, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.02731161192059517, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.019086167216300964, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0019029012182727456, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.022652268409729004, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.019896306097507477, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0017226141644641757, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 1, + "errors": { + "output": 1.3014166961871354e-07, + "temb": 4.9077917160244473e-08, + "weight": 1.2994655174549205e-07, + "bias": 3.3382900820853816e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.019917147234082222, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 2.86102294921875e-06, + "max_tolerance_ratio": 0.005751802586019039, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.005020510870963335, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.026717884466052055, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 8.58306884765625e-06, + "max_tolerance_ratio": 0.02837822213768959, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.006130983587354422, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 0.001235149335116148, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.023276854306459427, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 6.67572021484375e-06, + "max_tolerance_ratio": 0.03042229451239109, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.0069028763100504875, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 0.0012351492187008262, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 1, + "errors": { + "output": 0.000244140625, + "temb": 0.0025955522001601225, + "weight": 0.0024390243902439024, + "bias": 0.0 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.00390625, + "max_tolerance_ratio": 0.05624296888709068, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.061344146728515625, + "max_tolerance_ratio": 0.14143496751785278, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11635208129882812, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.00390625, + "max_tolerance_ratio": 0.05624296888709068, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.061344146728515625, + "max_tolerance_ratio": 0.14143496751785278, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11635208129882812, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.000244140625, + "max_tolerance_ratio": 0.004815564025193453, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 1.347583020105958e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 1, + "errors": { + "output": 0.00048828125, + "temb": 0.0019412816630083021, + "weight": 0.0031093047650859887, + "bias": 0.002188183807439825 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0078125, + "max_tolerance_ratio": 0.0914076715707779, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.06172370910644531, + "max_tolerance_ratio": 0.14143496751785278, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0524444580078125, + "max_tolerance_ratio": 0.12155365198850632, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.0863557830452919, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0078125, + "max_tolerance_ratio": 0.0914076715707779, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.06172370910644531, + "max_tolerance_ratio": 0.14143496751785278, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0524444580078125, + "max_tolerance_ratio": 0.12155365198850632, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.0863557830452919, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0009765625, + "max_tolerance_ratio": 0.018109379336237907, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 1.999356572923716e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 3.6503697629086673e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 1, + "errors": { + "output": 1.1891091396474316e-07, + "temb": 1.7003774219796067e-07, + "weight": 1.1117015265884846e-07, + "bias": 0.0 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.012777293100953102, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.0044348593801259995, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0017226141644641757, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.02376280352473259, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.027591371908783913, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0019029012182727456, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.021753035485744476, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 4.291534423828125e-06, + "max_tolerance_ratio": 0.025202572345733643, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0017226141644641757, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 1, + "errors": { + "output": 1.4863864245592894e-07, + "temb": 1.2646690406307395e-07, + "weight": 1.2994655174549205e-07, + "bias": 3.3382900820853816e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 2.384185791015625e-06, + "max_tolerance_ratio": 0.013556979596614838, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.006371223833411932, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.005020510870963335, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 3.2186508178710938e-06, + "max_tolerance_ratio": 0.02507016435265541, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 6.854534149169922e-06, + "max_tolerance_ratio": 0.04201856255531311, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.006130983587354422, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 0.001235149335116148, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 3.337860107421875e-06, + "max_tolerance_ratio": 0.022754820063710213, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 6.318092346191406e-06, + "max_tolerance_ratio": 0.03872999921441078, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.0069028763100504875, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 0.0012351492187008262, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 3, + "errors": { + "output": 0.0, + "x": 0.003379820097165924, + "temb": 0.0015368590992453142, + "weight": 0.0021521047494834234, + "bias": 0.003313623961515694 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.11869430541992188, + "max_tolerance_ratio": 0.14792892336845398, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.015459537506103516, + "max_tolerance_ratio": 0.08149861544370651, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.06183624267578125, + "max_tolerance_ratio": 0.14296706020832062, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.02972412109375, + "max_tolerance_ratio": 0.10770400613546371, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.11869430541992188, + "max_tolerance_ratio": 0.14792892336845398, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.015460014343261719, + "max_tolerance_ratio": 0.08150112628936768, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.06183624267578125, + "max_tolerance_ratio": 0.14296706020832062, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.02972412109375, + "max_tolerance_ratio": 0.10770400613546371, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 4.782179075846216e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 2.0120800400036387e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 4.4731414163834415e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 3, + "errors": { + "output": 0.0, + "x": 0.003379820097165924, + "temb": 0.002547106122521999, + "weight": 0.0027365798274600374, + "bias": 0.002239271121623488 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.11869430541992188, + "max_tolerance_ratio": 0.14792892336845398, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.025691986083984375, + "max_tolerance_ratio": 0.09676326811313629, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.1135711669921875, + "max_tolerance_ratio": 0.14814089238643646, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11876484751701355, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.11869430541992188, + "max_tolerance_ratio": 0.14792892336845398, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.025689125061035156, + "max_tolerance_ratio": 0.09675250947475433, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.1135711669921875, + "max_tolerance_ratio": 0.14814089238643646, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11876484751701355, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 4.782179075846216e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 2.9025261028436944e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 8.686409273650497e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 2.5911340344464406e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 4096, + "errors": { + "output": 0.0017006802721088435, + "x": 0.0030042075430387638, + "temb": 0.0021778555709870977, + "weight": 0.002575078377987739, + "bias": 0.0020581742025330982 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.2732240557670593, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.113616943359375, + "max_tolerance_ratio": 0.15306638181209564, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.964630126953125, + "max_tolerance_ratio": 0.1786586195230484, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.9852294921875, + "max_tolerance_ratio": 0.1907987743616104, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.4953765869140625, + "max_tolerance_ratio": 0.18161630630493164, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.3378378450870514, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.11361312866210938, + "max_tolerance_ratio": 0.15306125581264496, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.97003173828125, + "max_tolerance_ratio": 0.17965546250343323, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.9852294921875, + "max_tolerance_ratio": 0.1907987743616104, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.4953765869140625, + "max_tolerance_ratio": 0.18161630630493164, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.33557045459747314, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 1.0898160326178186e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0093231201171875, + "max_tolerance_ratio": 0.017987243831157684, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.07623291015625, + "max_tolerance_ratio": 0.07275641709566116, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0238037109375, + "max_tolerance_ratio": 0.043760742992162704, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 6889, + "errors": { + "output": 0.0016025641025641025, + "x": 0.002862032649958757, + "temb": 0.002264131115984061, + "weight": 0.0021627835134687442, + "bias": 0.003091684806700706 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.4166666865348816, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.122161865234375, + "max_tolerance_ratio": 0.1645151972770691, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 1.2017822265625, + "max_tolerance_ratio": 0.17906485497951508, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.99896240234375, + "max_tolerance_ratio": 0.19069354236125946, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.89208984375, + "max_tolerance_ratio": 0.18137826025485992, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.3378378450870514, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.12215805053710938, + "max_tolerance_ratio": 0.16451002657413483, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 1.19232177734375, + "max_tolerance_ratio": 0.17964541912078857, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.99896240234375, + "max_tolerance_ratio": 0.20765124261379242, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.89208984375, + "max_tolerance_ratio": 0.1837727129459381, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.4166666865348816, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 1.2333959602983668e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0142822265625, + "max_tolerance_ratio": 0.030629962682724, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.09305572509765625, + "max_tolerance_ratio": 0.1353081315755844, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.029052734375, + "max_tolerance_ratio": 0.07012274116277695, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 6032, + "errors": { + "output": 0.0016025641025641025, + "x": 0.0030914496352805717, + "temb": 0.0011800007469461404, + "weight": 0.002010986949117169, + "bias": 0.0029184732302849205 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.4166666865348816, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.12346649169921875, + "max_tolerance_ratio": 0.1662917137145996, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 1.45367431640625, + "max_tolerance_ratio": 0.18178261816501617, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.99615478515625, + "max_tolerance_ratio": 0.35692256689071655, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.9044189453125, + "max_tolerance_ratio": 0.18396203219890594, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.3378378450870514, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.12346649169921875, + "max_tolerance_ratio": 0.1662917137145996, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 1.45843505859375, + "max_tolerance_ratio": 0.1816277801990509, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.99615478515625, + "max_tolerance_ratio": 0.35692206025123596, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.9044189453125, + "max_tolerance_ratio": 0.18396203219890594, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.4166666865348816, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 1.0904316695814487e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.00726318359375, + "max_tolerance_ratio": 0.025921989232301712, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.09305953979492188, + "max_tolerance_ratio": 0.1028057336807251, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.029052734375, + "max_tolerance_ratio": 0.08268208056688309, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.float32", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 3, + "errors": { + "output": 1.8758709199713696e-07, + "x": 1.9712212946362973e-07, + "temb": 2.1871940956928353e-07, + "weight": 1.573244705925568e-07, + "bias": 9.062440719379816e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.004946949891746044, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.006536814384162426, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 2.384185791015625e-06, + "max_tolerance_ratio": 0.004848584532737732, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.008276660926640034, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.002739404793828726, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.008114404045045376, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.007908289320766926, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.01115299854427576, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.009138970635831356, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.430511474609375e-06, + "max_tolerance_ratio": 0.003541923826560378, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.008913637138903141, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.01000254787504673, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.6689300537109375e-06, + "max_tolerance_ratio": 0.012632080353796482, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.008276660926640034, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.430511474609375e-06, + "max_tolerance_ratio": 0.003381598275154829, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 3, + "errors": { + "output": 1.8758709199713696e-07, + "x": 1.9712212946362973e-07, + "temb": 2.183113118583169e-07, + "weight": 1.611449087501953e-07, + "bias": 8.098239180311436e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.0374017208814621, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.019900353625416756, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 2.384185791015625e-06, + "max_tolerance_ratio": 0.007614366244524717, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.022623050957918167, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.1324882507324219e-06, + "max_tolerance_ratio": 0.007297326810657978, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.020886709913611412, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.01948723755776882, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.02856154553592205, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.020053662359714508, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.430511474609375e-06, + "max_tolerance_ratio": 0.007229685317724943, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.01651504635810852, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.020023591816425323, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 4.5299530029296875e-06, + "max_tolerance_ratio": 0.03066845051944256, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.019367719069123268, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.010526997968554497, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 4096, + "errors": { + "output": 2.586346470076747e-07, + "x": 2.5353023475503127e-07, + "temb": 1.1988686288465126e-07, + "weight": 1.427930579588083e-07, + "bias": 1.0939646127220351e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.014880506321787834, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.014401393011212349, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 6.103515625e-05, + "max_tolerance_ratio": 0.23296727240085602, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.2789449989795685, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.11863362044095993, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.02018040232360363, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.020122215151786804, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.0001373291015625, + "max_tolerance_ratio": 0.3758883774280548, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.3350406587123871, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.12053177505731583, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.022597676143050194, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.02198362536728382, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.000152587890625, + "max_tolerance_ratio": 0.1429157555103302, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.21178868412971497, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.0741499587893486, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 6889, + "errors": { + "output": 2.444127728941933e-07, + "x": 2.293326922861262e-07, + "temb": 1.0843094261933183e-07, + "weight": 2.1649047974921416e-07, + "bias": 1.4702248660482713e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.014880506321787834, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.01567506045103073, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 6.103515625e-05, + "max_tolerance_ratio": 0.16676533222198486, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.5084660053253174, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.16391006112098694, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.02018040232360363, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.02245977334678173, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.29317495226860046, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.2818421721458435, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.814697265625e-05, + "max_tolerance_ratio": 0.14079761505126953, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.024555373936891556, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.021878523752093315, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.3590463399887085, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.4027182459831238, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 2.288818359375e-05, + "max_tolerance_ratio": 0.13646109402179718, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 6032, + "errors": { + "output": 2.444127728941933e-07, + "x": 2.715452632906025e-07, + "temb": 8.750923870237165e-08, + "weight": 2.017937926925124e-07, + "bias": 1.3969603016598244e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.014880506321787834, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.015311132185161114, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.0915708988904953, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.6872739791870117, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.24952450394630432, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.02018040232360363, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.02084014192223549, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.09533216059207916, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.7847014665603638, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.2850022315979004, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.024555373936891556, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.021719543263316154, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.11637149006128311, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.24204149842262268, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 2.288818359375e-05, + "max_tolerance_ratio": 0.08607399463653564, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + } + ], + "environment": { + "torch": "2.13.0+cu130", + "cuda": "13.0", + "gpu": "NVIDIA B200", + "workspace": { + "CUBLAS_WORKSPACE_CONFIG": null, + "CUBLASLT_WORKSPACE_SIZE": null + }, + "tf32": false + }, + "scope": "sample batch BI; final uses S=3 for large B, long S tested separately; shared parameter gradients: same ordered inputs, repeat only", + "packages": { + "torch": "2.13.0", + "triton": "3.7.1", + "diffusers": null, + "vllm": "0.30.0", + "sglang": "0.5.21", + "liger-kernel": "0.8.4", + "transformer_engine": null, + "megatron-core": null + } +} diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/fixed-accuracy_large.json b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/fixed-accuracy_large.json new file mode 100644 index 000000000..288ed9347 --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/fixed-accuracy_large.json @@ -0,0 +1,1674 @@ +{ + "mode": "fixed", + "phase": "accuracy_large", + "accuracy_seed": 0, + "source": { + "base_sha": "55f83d2b9043f41dca84440d9002ca30f5d3fac4", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked_source_sha256": {}, + "workspace_source_sha256": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "qwenimage_source_sha256": { + "csrc/cuda/model_specific/qwenimage/det_linear.cu": "859da456b0c776f3492b3197c252866e33d9a7088508b701b7c4a179ee709afb", + "csrc/cuda/model_specific/qwenimage/token_sum.cu": "1aace24523ff95520ab5d482e2e0f17d09a2efcf93efc8de865c7bcc157cf3ba", + "rl_engine/backends/cuda/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py": "710df5416a2adf5b2576468ff63584b6699e6bdecd59906370049bf09f1b3286", + "rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py": "f6afe4b7568e2026c4b046a4fd0a02589f817d815198af33173d2dba61773f19", + "rl_engine/reference/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py": "1ebc740ddff575055ee66ed714a8c7cc5c6cee2701d582a665289e9ad1a4fe3d", + "rl_engine/reference/model_specific/qwenimage/final_adaln_out.py": "60441610c04d04d0fb1cd7320be8584e76772c110a3cfed77ddf826dbde9b53c", + "benchmarks/models/qwenimage/__init__.py": "a63ebc79ed10d9ed98484565a353438bd13f5801a8f51d7505d0921bf6942742", + "benchmarks/models/qwenimage/adaln_evidence.py": "9dc9f3da0069d36c602baef07d687fb1aeba8fda0163d17fc446e0a543fe1f3e", + "benchmarks/models/qwenimage/adaln_parameter_screen.py": "05562ef30d09296c2ccd1cdeb44085568b8c877d01f5fb1df4b983e84945ec03", + "benchmarks/models/qwenimage/adaln_prior_art.py": "647aa9fc81e02bf3c7806ed6c2a3e578fb3e1a0b000b4388a12367ef86de3139", + "benchmarks/models/qwenimage/adaln_reuse_bi_audit.py": "88dd3d390e647bbc883b76622309fad54dac3618630dcca0785e555db329a671", + "benchmarks/models/qwenimage/adaln_reuse_candidate.py": "4598f6db94462ac30f3bdd3defae16f0ce7a34ac59eb1996d18e86f498c029b6", + "benchmarks/models/qwenimage/plot_adaln_audit.py": "6151e6abccca8f647c2fbeadf92f12e43ed1c07954db9f2db2f035284cbd407c", + "benchmarks/models/qwenimage/plot_adaln_evidence.py": "16d6bed0ee5b808814c5f7157145a730750d0b1aaf94762e6f72a256e942c1e2", + "benchmarks/models/qwenimage/streams.py": "bd27383eee59404df295f724f6c7d620db3d3d7074c19dd94d51a711b38acf02", + "benchmarks/models/qwenimage/validate_adaln_repair.py": "8b663191323b455470a2313cdfefd837657441b300ffd0e0767453f9f407db03" + }, + "extension_sha256": "5d1054db8bba2eaedbd391d0c23b6683acea9ed04fcd64d6f369faed75aa9e0f", + "clean_commit": true + }, + "cases": [ + { + "stream": "image", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 1, + "errors": { + "output": 0.0005102040816326531, + "temb": 0.0030144900592607993, + "weight": 0.002084629645128771, + "bias": 0.002484959114058055 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2369668334722519, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.2178955078125, + "max_tolerance_ratio": 0.16408038139343262, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.16831408441066742, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.174072265625, + "max_tolerance_ratio": 0.16830919682979584, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2369668334722519, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.21788787841796875, + "max_tolerance_ratio": 0.1640855073928833, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.12499618530273438, + "max_tolerance_ratio": 0.1683192402124405, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.174072265625, + "max_tolerance_ratio": 0.16830919682979584, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2283104956150055, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 6.939894228707999e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 2.6702880859375e-05, + "max_tolerance_ratio": 9.075890557141975e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 7.648543032701127e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 1, + "errors": { + "output": 0.004, + "temb": 0.002455035302989417, + "weight": 0.003418323784760821, + "bias": 0.0027655102951030354 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.25, + "max_tolerance_ratio": 0.2976190447807312, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.23834991455078125, + "max_tolerance_ratio": 0.16529890894889832, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.4989471435546875, + "max_tolerance_ratio": 0.18687306344509125, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.49908447265625, + "max_tolerance_ratio": 0.17882999777793884, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.25, + "max_tolerance_ratio": 0.2976190447807312, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.23833465576171875, + "max_tolerance_ratio": 0.16529890894889832, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.4989471435546875, + "max_tolerance_ratio": 0.18687306344509125, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.49908447265625, + "max_tolerance_ratio": 0.17882999777793884, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.23923446238040924, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 6.192495493451133e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 5.340576171875e-05, + "max_tolerance_ratio": 0.0003392235084902495, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 2.6462814275873825e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "image", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 1, + "errors": { + "output": 1.245275657644084e-07, + "temb": 1.0707711737096834e-07, + "weight": 7.060367690260571e-08, + "bias": 3.252543074689927e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.039437174797058105, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.01834806241095066, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.02439945563673973, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 2.288818359375e-05, + "max_tolerance_ratio": 0.07196041196584702, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.71661376953125e-05, + "max_tolerance_ratio": 0.08106574416160583, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.1423105001449585, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06444977223873138, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.07006721198558807, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.07333238422870636, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.14777518808841705, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06444935500621796, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 1, + "errors": { + "output": 1.8342561272103093e-07, + "temb": 7.074919141906837e-08, + "weight": 7.325777228972214e-08, + "bias": 4.150006878791282e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.039437174797058105, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.012831219471991062, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06128671020269394, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 2.288818359375e-05, + "max_tolerance_ratio": 0.07632873952388763, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.0944325178861618, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.1552734375e-05, + "max_tolerance_ratio": 0.5643313527107239, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.09616547077894211, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.0719609186053276, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 2.002716064453125e-05, + "max_tolerance_ratio": 0.09429927170276642, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.1552734375e-05, + "max_tolerance_ratio": 0.5631505846977234, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.09616640210151672, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 1, + "errors": { + "output": 0.001004016064257028, + "temb": 0.0030494313860528134, + "weight": 0.002084629645128771, + "bias": 0.002484959114058055 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2380952537059784, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.1246795654296875, + "max_tolerance_ratio": 0.16245029866695404, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.16831408441066742, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.174072265625, + "max_tolerance_ratio": 0.16830919682979584, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2380952537059784, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.1246795654296875, + "max_tolerance_ratio": 0.16245029866695404, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.12499618530273438, + "max_tolerance_ratio": 0.1683192402124405, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.174072265625, + "max_tolerance_ratio": 0.16830919682979584, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2092050313949585, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 3.4575481549836695e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 2.6702880859375e-05, + "max_tolerance_ratio": 9.075890557141975e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 7.648543032701127e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 1, + "errors": { + "output": 0.002008032128514056, + "temb": 0.0026498776250635605, + "weight": 0.003418323784760821, + "bias": 0.0027655102951030354 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.29411765933036804, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.12428665161132812, + "max_tolerance_ratio": 0.16516810655593872, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.4989471435546875, + "max_tolerance_ratio": 0.18687306344509125, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.49908447265625, + "max_tolerance_ratio": 0.17882999777793884, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.29411765933036804, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.12428665161132812, + "max_tolerance_ratio": 0.16516810655593872, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.4989471435546875, + "max_tolerance_ratio": 0.18687306344509125, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.49908447265625, + "max_tolerance_ratio": 0.17882999777793884, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2380952537059784, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 3.5094042686978355e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 5.340576171875e-05, + "max_tolerance_ratio": 0.0003392235084902495, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 2.6462814275873825e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 1, + "errors": { + "output": 1.2277101548203892e-07, + "temb": 1.1239149542301216e-07, + "weight": 7.060367690260571e-08, + "bias": 3.252543074689927e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.02048138901591301, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.009054863825440407, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.02439945563673973, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.05691283196210861, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.058902546763420105, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.1423105001449585, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06444977223873138, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.04434660077095032, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.05778145045042038, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.14777518808841705, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06444935500621796, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 1, + "errors": { + "output": 1.5346376935254862e-07, + "temb": 1.1779985556284367e-07, + "weight": 7.325777228972214e-08, + "bias": 4.150006878791282e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.02460440993309021, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.011150117963552475, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06128671020269394, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.0574447326362133, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.0637616440653801, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.1552734375e-05, + "max_tolerance_ratio": 0.5643313527107239, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.09616547077894211, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.048017870634794235, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.0013580322265625e-05, + "max_tolerance_ratio": 0.0638367310166359, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.1552734375e-05, + "max_tolerance_ratio": 0.5631505846977234, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.09616640210151672, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 3, + "errors": { + "output": 0.001293103448275862, + "x": 0.00224023169115234, + "temb": 0.0021749584473585402, + "weight": 0.0023790572682175454, + "bias": 0.002566674043905333 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.046875, + "max_tolerance_ratio": 0.35885170102119446, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.11793136596679688, + "max_tolerance_ratio": 0.21630512177944183, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.11898040771484375, + "max_tolerance_ratio": 0.15011020004749298, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.24993896484375, + "max_tolerance_ratio": 0.18175160884857178, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.24823760986328125, + "max_tolerance_ratio": 0.16857624053955078, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2557544708251953, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.11793136596679688, + "max_tolerance_ratio": 0.21630099415779114, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.11897659301757812, + "max_tolerance_ratio": 0.15010537207126617, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.24993896484375, + "max_tolerance_ratio": 0.3495287299156189, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.24823760986328125, + "max_tolerance_ratio": 0.1685815304517746, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.046875, + "max_tolerance_ratio": 0.35885170102119446, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.02467513084411621, + "max_tolerance_ratio": 0.1445486843585968, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0019903182983398438, + "max_tolerance_ratio": 0.013218452222645283, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.039097607135772705, + "max_tolerance_ratio": 0.3584054112434387, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.01055908203125, + "max_tolerance_ratio": 0.06674929708242416, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 3, + "errors": { + "output": 0.002142857142857143, + "x": 0.0026156480804779203, + "temb": 0.0019597123820803484, + "weight": 0.0034886615875011962, + "bias": 0.0031253425106817674 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.09375, + "max_tolerance_ratio": 0.4934210479259491, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.10931777954101562, + "max_tolerance_ratio": 0.2788471579551697, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.12445831298828125, + "max_tolerance_ratio": 0.16353631019592285, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.952239990234375, + "max_tolerance_ratio": 0.808866024017334, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.944976806640625, + "max_tolerance_ratio": 0.17805184423923492, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.09375, + "max_tolerance_ratio": 0.4934210479259491, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.10931396484375, + "max_tolerance_ratio": 0.2788471579551697, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.1244659423828125, + "max_tolerance_ratio": 0.16354139149188995, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.952239990234375, + "max_tolerance_ratio": 0.39588311314582825, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.944976806640625, + "max_tolerance_ratio": 0.1780628263950348, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.4464285671710968, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.04151296615600586, + "max_tolerance_ratio": 0.20947077870368958, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0064525604248046875, + "max_tolerance_ratio": 0.03526727855205536, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.11563682556152344, + "max_tolerance_ratio": 0.8075345158576965, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.03491020202636719, + "max_tolerance_ratio": 0.06267767399549484, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.float32", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 3, + "errors": { + "output": 2.1173904560107368e-07, + "x": 1.681428993038427e-07, + "temb": 8.882524538357731e-08, + "weight": 1.0640369369332095e-07, + "bias": 1.0569990891133054e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.0374017208814621, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.027549369260668755, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.019444484263658524, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.0814719945192337, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.052783019840717316, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.07313017547130585, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06461039185523987, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.049041748046875e-05, + "max_tolerance_ratio": 0.06373167037963867, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 7.62939453125e-05, + "max_tolerance_ratio": 0.24153167009353638, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.07257679849863052, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.049872979521751404, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.06246780604124069, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.049041748046875e-05, + "max_tolerance_ratio": 0.05931292846798897, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 7.62939453125e-05, + "max_tolerance_ratio": 0.26246994733810425, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.05028747767210007, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 3, + "errors": { + "output": 3.47125918885698e-07, + "x": 2.013979997727794e-07, + "temb": 1.220869426235198e-07, + "weight": 9.397203794891893e-08, + "bias": 8.08508887100396e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.030651601031422615, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.02696477435529232, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.030515439808368683, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.16196882724761963, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.09040731191635132, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.0675085112452507, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06093991920351982, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.08007202297449112, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.000152587890625, + "max_tolerance_ratio": 0.921640157699585, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.1973448395729065, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06190630421042442, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.71661376953125e-05, + "max_tolerance_ratio": 0.06629282981157303, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.08148636668920517, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.000152587890625, + "max_tolerance_ratio": 0.9329220652580261, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.16017752885818481, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + } + ], + "environment": { + "torch": "2.13.0+cu130", + "cuda": "13.0", + "gpu": "NVIDIA B200", + "workspace": { + "CUBLAS_WORKSPACE_CONFIG": null, + "CUBLASLT_WORKSPACE_SIZE": null + }, + "tf32": false + }, + "scope": "sample batch BI; final uses S=3 for large B, long S tested separately; shared parameter gradients: same ordered inputs, repeat only", + "packages": { + "torch": "2.13.0", + "triton": "3.7.1", + "diffusers": null, + "vllm": "0.30.0", + "sglang": "0.5.21", + "liger-kernel": "0.8.4", + "transformer_engine": null, + "megatron-core": null + } +} diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/fixed-reuse.json b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/fixed-reuse.json new file mode 100644 index 000000000..2a74f0ee5 --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/fixed-reuse.json @@ -0,0 +1,4836 @@ +{ + "mode": "fixed", + "phase": "reuse", + "accuracy_seed": 0, + "source": { + "base_sha": "55f83d2b9043f41dca84440d9002ca30f5d3fac4", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked_source_sha256": {}, + "workspace_source_sha256": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "qwenimage_source_sha256": { + "csrc/cuda/model_specific/qwenimage/det_linear.cu": "859da456b0c776f3492b3197c252866e33d9a7088508b701b7c4a179ee709afb", + "csrc/cuda/model_specific/qwenimage/token_sum.cu": "1aace24523ff95520ab5d482e2e0f17d09a2efcf93efc8de865c7bcc157cf3ba", + "rl_engine/backends/cuda/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py": "710df5416a2adf5b2576468ff63584b6699e6bdecd59906370049bf09f1b3286", + "rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py": "f6afe4b7568e2026c4b046a4fd0a02589f817d815198af33173d2dba61773f19", + "rl_engine/reference/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py": "1ebc740ddff575055ee66ed714a8c7cc5c6cee2701d582a665289e9ad1a4fe3d", + "rl_engine/reference/model_specific/qwenimage/final_adaln_out.py": "60441610c04d04d0fb1cd7320be8584e76772c110a3cfed77ddf826dbde9b53c", + "benchmarks/models/qwenimage/__init__.py": "a63ebc79ed10d9ed98484565a353438bd13f5801a8f51d7505d0921bf6942742", + "benchmarks/models/qwenimage/adaln_evidence.py": "9dc9f3da0069d36c602baef07d687fb1aeba8fda0163d17fc446e0a543fe1f3e", + "benchmarks/models/qwenimage/adaln_parameter_screen.py": "05562ef30d09296c2ccd1cdeb44085568b8c877d01f5fb1df4b983e84945ec03", + "benchmarks/models/qwenimage/adaln_prior_art.py": "647aa9fc81e02bf3c7806ed6c2a3e578fb3e1a0b000b4388a12367ef86de3139", + "benchmarks/models/qwenimage/adaln_reuse_bi_audit.py": "88dd3d390e647bbc883b76622309fad54dac3618630dcca0785e555db329a671", + "benchmarks/models/qwenimage/adaln_reuse_candidate.py": "4598f6db94462ac30f3bdd3defae16f0ce7a34ac59eb1996d18e86f498c029b6", + "benchmarks/models/qwenimage/plot_adaln_audit.py": "6151e6abccca8f647c2fbeadf92f12e43ed1c07954db9f2db2f035284cbd407c", + "benchmarks/models/qwenimage/plot_adaln_evidence.py": "16d6bed0ee5b808814c5f7157145a730750d0b1aaf94762e6f72a256e942c1e2", + "benchmarks/models/qwenimage/streams.py": "bd27383eee59404df295f724f6c7d620db3d3d7074c19dd94d51a711b38acf02", + "benchmarks/models/qwenimage/validate_adaln_repair.py": "8b663191323b455470a2313cdfefd837657441b300ffd0e0767453f9f407db03" + }, + "extension_sha256": "5d1054db8bba2eaedbd391d0c23b6683acea9ed04fcd64d6f369faed75aa9e0f", + "clean_commit": true + }, + "cases": [ + { + "stream": "image", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 0.0003551136363636364, + "temb": 0.0013375396742077623, + "weight": 0.0031093047650859887, + "bias": 0.002188183807439825 + }, + "repeat_all_gradients": { + "output": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 0.05289600044488907, + 0.053727999329566956, + 0.05398400127887726, + 0.054687999188899994, + 0.053279999643564224, + 0.053408000618219376, + 0.05075199902057648, + 0.050624001771211624, + 0.05238400027155876, + 0.05119999870657921 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.053088000044226646 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 0.7050880193710327, + 0.6648960113525391, + 0.493120014667511, + 0.6593599915504456, + 0.7210559844970703, + 0.670527994632721, + 0.6691200137138367, + 0.6701120138168335, + 0.7259839773178101, + 0.6604160070419312 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.6696160137653351 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 0.5131840109825134, + 0.5962240099906921, + 0.832863986492157, + 0.7762240171432495, + 0.7769920229911804, + 0.7757120132446289, + 0.8353599905967712, + 0.604416012763977, + 0.5902400016784668, + 0.8218560218811035 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.7759680151939392 + } + }, + "peak_increment_bytes": { + "fixed": 116987904 + } + } + }, + { + "batch": 3, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 0.05183999985456467, + 0.05222399905323982, + 0.05052800104022026, + 0.05027199909090996, + 0.05113599821925163, + 0.0488319993019104, + 0.05071999877691269, + 0.05008000135421753, + 0.049984000623226166, + 0.05119999870657921 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.050623999908566475 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 0.7668160200119019, + 0.7864000201225281, + 0.7968639731407166, + 0.7896320223808289, + 0.7759039998054504, + 0.5883520245552063, + 0.5840960144996643, + 0.7741119861602783, + 0.7754560112953186, + 0.7741760015487671 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.7748160064220428 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 0.6921600103378296, + 0.6906880140304565, + 0.9411839842796326, + 0.9076799750328064, + 0.9384639859199524, + 0.8704959750175476, + 0.9123200178146362, + 0.8950080275535583, + 0.8751040101051331, + 0.8690879940986633 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.8850560188293457 + } + }, + "peak_increment_bytes": { + "fixed": 124397568 + } + } + }, + { + "batch": 256, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 0.8088319897651672, + 0.8080319762229919, + 0.8110079765319824, + 0.8064960241317749, + 0.8068479895591736, + 0.8067200183868408, + 0.8056960105895996, + 0.8048319816589355, + 0.8060799837112427, + 0.8048639893531799 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.8066080212593079 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 20.414783477783203, + 20.391679763793945, + 20.383935928344727, + 20.400192260742188, + 20.41539192199707, + 20.375167846679688, + 20.33670425415039, + 20.411775588989258, + 20.39472007751465, + 20.392799377441406 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 20.393759727478027 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 21.033727645874023, + 20.985151290893555, + 20.927839279174805, + 21.0031681060791, + 21.027551651000977, + 20.964767456054688, + 20.94268798828125, + 20.92643165588379, + 20.955007553100586, + 20.97609519958496 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 20.970431327819824 + } + }, + "peak_increment_bytes": { + "fixed": 1061720064 + } + } + }, + { + "batch": 2048, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 6.407199859619141, + 6.407519817352295, + 6.403007984161377, + 6.402304172515869, + 6.4022722244262695, + 6.3994879722595215, + 6.403711795806885, + 6.404736042022705, + 6.399903774261475, + 6.403168201446533 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 6.403088092803955 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 168.3712921142578, + 168.48300170898438, + 168.61756896972656, + 168.7786865234375, + 168.80592346191406, + 168.60092163085938, + 168.6625213623047, + 168.3910675048828, + 168.52589416503906, + 168.58505249023438 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 168.59298706054688 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 174.6879425048828, + 174.51046752929688, + 174.8942413330078, + 174.9152374267578, + 174.89715576171875, + 174.97482299804688, + 174.8507843017578, + 174.6290283203125, + 174.7159423828125, + 174.9167938232422 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 174.8725128173828 + } + }, + "peak_increment_bytes": { + "fixed": 7700779008 + } + } + } + ] + }, + { + "stream": "image", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 1.3014166961871354e-07, + "temb": 4.9077917160244473e-08, + "weight": 1.2994655174549205e-07, + "bias": 3.3382900820853816e-08 + }, + "repeat_all_gradients": { + "output": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 0.06172800064086914, + 0.06489600241184235, + 0.06230400130152702, + 0.06377600133419037, + 0.07180800288915634, + 0.05967999994754791, + 0.06140799820423126, + 0.061664000153541565, + 0.061344001442193985, + 0.060416001826524734 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.06169600039720535 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 0.6504639983177185, + 0.643392026424408, + 0.48655998706817627, + 0.6430400013923645, + 0.6535680294036865, + 0.6863359808921814, + 0.48214399814605713, + 0.6394559741020203, + 0.6567040085792542, + 0.6505600214004517 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.6469280123710632 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 0.6590080261230469, + 0.4943999946117401, + 0.493120014667511, + 0.6451519727706909, + 0.6686720252037048, + 0.7551680207252502, + 0.780128002166748, + 0.7553279995918274, + 0.7946879863739014, + 0.7443519830703735 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.7065120041370392 + } + }, + "peak_increment_bytes": { + "fixed": 230277120 + } + } + }, + { + "batch": 3, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 0.07039999961853027, + 0.06697600334882736, + 0.06486400216817856, + 0.06592000275850296, + 0.06678400188684464, + 0.06576000154018402, + 0.06543999910354614, + 0.06732799857854843, + 0.06752000004053116, + 0.06617599725723267 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.06647999957203865 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 0.7140480279922485, + 0.7142080068588257, + 0.7641599774360657, + 0.7319039702415466, + 0.585856020450592, + 0.5759680271148682, + 0.792415976524353, + 0.7359039783477783, + 0.7358080148696899, + 0.748416006565094 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.7338559925556183 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 0.8627200126647949, + 0.8045120239257812, + 0.7479360103607178, + 0.8396480083465576, + 0.8959360122680664, + 0.8458240032196045, + 0.6880639791488647, + 0.8416320085525513, + 0.8526080250740051, + 0.8452799916267395 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.8434560000896454 + } + }, + "peak_increment_bytes": { + "fixed": 237699072 + } + } + }, + { + "batch": 256, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 2.5239360332489014, + 2.491487979888916, + 2.4785919189453125, + 2.469088077545166, + 2.46230411529541, + 2.467103958129883, + 2.4715840816497803, + 2.4567999839782715, + 2.4623360633850098, + 2.4725120067596436 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 2.470336079597473 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 20.711135864257812, + 20.6364803314209, + 20.667743682861328, + 20.6496639251709, + 20.692703247070312, + 20.6395206451416, + 20.583711624145508, + 20.66636848449707, + 20.695903778076172, + 20.64156723022461 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 20.658016204833984 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 23.37651252746582, + 23.326688766479492, + 23.391136169433594, + 23.411935806274414, + 23.362720489501953, + 23.39027214050293, + 23.400896072387695, + 23.401248931884766, + 23.40127944946289, + 23.42723274230957 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 23.396016120910645 + } + }, + "peak_increment_bytes": { + "fixed": 1176576000 + } + } + }, + { + "batch": 2048, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 29.965599060058594, + 29.998016357421875, + 30.016767501831055, + 29.9880313873291, + 29.980607986450195, + 29.94144058227539, + 29.974720001220703, + 30.017248153686523, + 30.001279830932617, + 29.957183837890625 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 29.98431968688965 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 167.54464721679688, + 167.49801635742188, + 167.61984252929688, + 167.27561950683594, + 167.52767944335938, + 167.39479064941406, + 167.60739135742188, + 167.523681640625, + 167.49705505371094, + 167.49122619628906 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 167.51084899902344 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 197.24847412109375, + 196.96470642089844, + 197.36524963378906, + 197.11180114746094, + 197.37139892578125, + 197.52447509765625, + 197.0894012451172, + 197.29481506347656, + 197.23741149902344, + 197.22752380371094 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 197.2429428100586 + } + }, + "peak_increment_bytes": { + "fixed": 7826644992 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 0.00048828125, + "temb": 0.0019412816630083021, + "weight": 0.0031093047650859887, + "bias": 0.002188183807439825 + }, + "repeat_all_gradients": { + "output": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 0.05177599936723709, + 0.04912000149488449, + 0.05382400006055832, + 0.04873599857091904, + 0.04899200052022934, + 0.04915200173854828, + 0.049855999648571014, + 0.049536000937223434, + 0.04838399961590767, + 0.05132799968123436 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.04934400133788586 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 0.6637439727783203, + 0.4936639964580536, + 0.7340480089187622, + 0.7173439860343933, + 0.6678079962730408, + 0.684544026851654, + 0.6687359809875488, + 0.669152021408081, + 0.6810879707336426, + 0.7075520157814026 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.6751199960708618 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 0.8355839848518372, + 0.7761279940605164, + 0.8146560192108154, + 0.7773119807243347, + 0.7747520208358765, + 0.7783039808273315, + 0.5991359949111938, + 0.5922560095787048, + 0.7735360264778137, + 0.7759360074996948 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.7760320007801056 + } + }, + "peak_increment_bytes": { + "fixed": 116987904 + } + } + }, + { + "batch": 3, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 0.05289600044488907, + 0.04975999891757965, + 0.05008000135421753, + 0.0496320016682148, + 0.054207999259233475, + 0.0504320003092289, + 0.050016000866889954, + 0.04918399825692177, + 0.050944000482559204, + 0.05056000128388405 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.05025600083172321 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 0.7862399816513062, + 0.5911359786987305, + 0.7608320116996765, + 0.7585600018501282, + 0.7663360238075256, + 0.7649919986724854, + 0.8182079792022705, + 0.7710400223731995, + 0.7585920095443726, + 0.7711679935455322 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.7656640112400055 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 0.8695679903030396, + 0.8671039938926697, + 0.8696320056915283, + 0.8703359961509705, + 0.9048640131950378, + 0.913919985294342, + 0.619871973991394, + 0.7812479734420776, + 0.8649920225143433, + 0.8696960210800171 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.8695999979972839 + } + }, + "peak_increment_bytes": { + "fixed": 124397568 + } + } + }, + { + "batch": 256, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 0.8077120184898376, + 0.8067520260810852, + 0.806879997253418, + 0.809503972530365, + 0.8056640028953552, + 0.8061439990997314, + 0.807424008846283, + 0.8079040050506592, + 0.8049280047416687, + 0.8054400086402893 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.8068160116672516 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 20.4017276763916, + 20.4085750579834, + 20.4617919921875, + 20.37731170654297, + 20.431936264038086, + 20.366304397583008, + 20.358591079711914, + 20.35308837890625, + 20.37593650817871, + 20.384000778198242 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 20.380656242370605 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 21.032224655151367, + 20.97644805908203, + 20.9638729095459, + 21.046367645263672, + 21.02284812927246, + 21.010879516601562, + 21.04761505126953, + 21.047136306762695, + 21.0482234954834, + 21.04684829711914 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 21.03929615020752 + } + }, + "peak_increment_bytes": { + "fixed": 1061720064 + } + } + }, + { + "batch": 2048, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 6.425151824951172, + 6.41158390045166, + 6.421247959136963, + 6.417664051055908, + 6.414752006530762, + 6.407904148101807, + 6.416607856750488, + 6.417151927947998, + 6.420383930206299, + 6.4205121994018555 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 6.417407989501953 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 168.635009765625, + 168.75135803222656, + 168.6534423828125, + 168.61827087402344, + 168.73178100585938, + 168.67584228515625, + 168.57760620117188, + 168.695556640625, + 168.88006591796875, + 168.57986450195312 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 168.66464233398438 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 174.9578857421875, + 174.7124481201172, + 174.6045379638672, + 174.8091583251953, + 175.00559997558594, + 174.6149444580078, + 174.73878479003906, + 174.73744201660156, + 174.623291015625, + 174.61500549316406 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 174.72494506835938 + } + }, + "peak_increment_bytes": { + "fixed": 7700779008 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 1.4863864245592894e-07, + "temb": 1.2646690406307395e-07, + "weight": 1.2994655174549205e-07, + "bias": 3.3382900820853816e-08 + }, + "repeat_all_gradients": { + "output": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 0.06627199798822403, + 0.06201599910855293, + 0.060447998344898224, + 0.06019200012087822, + 0.06035200133919716, + 0.06003199890255928, + 0.05993599817156792, + 0.06060799956321716, + 0.06022400036454201, + 0.058400001376867294 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.06028800085186958 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 0.6256319880485535, + 0.6340799927711487, + 0.7525439858436584, + 0.6239039897918701, + 0.6744639873504639, + 0.6403840184211731, + 0.695904016494751, + 0.6487039923667908, + 0.6511039733886719, + 0.6556800007820129 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.6499039828777313 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 0.7528319954872131, + 0.7564799785614014, + 0.8106560111045837, + 0.7753279805183411, + 0.8093439936637878, + 0.8126400113105774, + 0.7451840043067932, + 0.757311999797821, + 0.5184000134468079, + 0.4933759868144989 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.7568959891796112 + } + }, + "peak_increment_bytes": { + "fixed": 230277120 + } + } + }, + { + "batch": 3, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 0.07321599870920181, + 0.07552000135183334, + 0.07212799787521362, + 0.06960000097751617, + 0.06889600306749344, + 0.07123199850320816, + 0.06880000233650208, + 0.06595200300216675, + 0.06860800087451935, + 0.07062400132417679 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.07011200115084648 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 0.7157760262489319, + 0.7242239713668823, + 0.742143988609314, + 0.7531200051307678, + 0.557856023311615, + 0.5470399856567383, + 0.7491520047187805, + 0.7106239795684814, + 0.772704005241394, + 0.7718080282211304 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.7331839799880981 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 0.8444479703903198, + 0.8407999873161316, + 0.9248319864273071, + 0.8531200289726257, + 0.8628479838371277, + 0.891327977180481, + 0.8587200045585632, + 0.9120960235595703, + 0.7710719704627991, + 0.6846399903297424 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.8559200167655945 + } + }, + "peak_increment_bytes": { + "fixed": 237699072 + } + } + }, + { + "batch": 256, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 2.521343946456909, + 2.5031681060791016, + 2.497983932495117, + 2.504767894744873, + 2.490367889404297, + 2.480959892272949, + 2.484384059906006, + 2.479775905609131, + 2.478208065032959, + 2.471712112426758 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 2.4873759746551514 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 20.677087783813477, + 20.692703247070312, + 20.631391525268555, + 20.669055938720703, + 20.643648147583008, + 20.635135650634766, + 20.660415649414062, + 20.636415481567383, + 20.644351959228516, + 20.644287109375 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 20.644319534301758 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 23.36390495300293, + 23.379776000976562, + 23.440671920776367, + 23.413631439208984, + 23.39254379272461, + 23.427072525024414, + 23.356735229492188, + 23.45689582824707, + 23.463743209838867, + 23.41606330871582 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 23.414847373962402 + } + }, + "peak_increment_bytes": { + "fixed": 1176576000 + } + } + }, + { + "batch": 2048, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 29.840639114379883, + 29.929344177246094, + 29.95644760131836, + 29.956159591674805, + 29.964128494262695, + 29.93769645690918, + 29.979904174804688, + 29.998943328857422, + 29.943552017211914, + 29.902912139892578 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 29.94985580444336 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 167.52630615234375, + 167.6051788330078, + 167.4568634033203, + 167.45254516601562, + 167.26803588867188, + 167.6546630859375, + 167.47613525390625, + 167.63778686523438, + 167.5338592529297, + 167.55381774902344 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 167.53008270263672 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 197.17181396484375, + 197.06166076660156, + 197.13973999023438, + 197.15724182128906, + 197.18896484375, + 197.2869110107422, + 197.2426300048828, + 197.27801513671875, + 197.2527618408203, + 197.15353393554688 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 197.18038940429688 + } + }, + "peak_increment_bytes": { + "fixed": 7826644992 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 0.0, + "x": 0.003379820097165924, + "temb": 0.002547106122521999, + "weight": 0.0027365798274600374, + "bias": 0.002239271121623488 + }, + "repeat_all_gradients": { + "output": true, + "x": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 33, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 0.08710400015115738, + 0.08867199718952179, + 0.0867839977145195, + 0.08569599688053131, + 0.08636800199747086, + 0.08326400071382523, + 0.08089599758386612, + 0.08640000224113464, + 0.08374399691820145, + 0.08297599852085114 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.08603199943900108 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 0.31433600187301636, + 0.2991040050983429, + 0.2948479950428009, + 0.6648640036582947, + 0.6760320067405701, + 0.6786559820175171, + 0.6789119839668274, + 0.6821439862251282, + 0.6119679808616638, + 0.7596480250358582 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.6704480051994324 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 1.0393279790878296, + 0.9379519820213318, + 0.9389439821243286, + 0.9789440035820007, + 0.928384006023407, + 0.780672013759613, + 0.7174400091171265, + 0.7786239981651306, + 0.9165760278701782, + 0.9171839952468872 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.9227840006351471 + } + }, + "peak_increment_bytes": { + "fixed": 41245696 + } + } + }, + { + "batch": 2, + "sequence": 4096, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 0.32310399413108826, + 0.32313600182533264, + 0.31884801387786865, + 0.31753599643707275, + 0.3173440098762512, + 0.3182719945907593, + 0.3161279857158661, + 0.31862398982048035, + 0.3210879862308502, + 0.3203200101852417 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.3187360018491745 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 0.8909760117530823, + 0.8533120155334473, + 0.8266879916191101, + 0.86735999584198, + 0.6646720170974731, + 0.6596800088882446, + 0.8274880051612854, + 0.8381119966506958, + 0.8267199993133545, + 0.8285120129585266 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.828000009059906 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 0.9459519982337952, + 0.9635199904441833, + 1.0824960470199585, + 1.0455360412597656, + 0.9869440197944641, + 1.0671679973602295, + 1.0413440465927124, + 1.039072036743164, + 1.0399680137634277, + 0.9945279955863953 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 1.039520025253296 + } + }, + "peak_increment_bytes": { + "fixed": 755064832 + } + } + }, + { + "batch": 1, + "sequence": 6889, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 0.25782400369644165, + 0.26105600595474243, + 0.25571200251579285, + 0.25625601410865784, + 0.2587200105190277, + 0.25699201226234436, + 0.2574079930782318, + 0.2580159902572632, + 0.25603199005126953, + 0.2584959864616394 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.25761599838733673 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 0.5991039872169495, + 0.7665280103683472, + 0.5904960036277771, + 0.8133760094642639, + 0.6006399989128113, + 0.5886719822883606, + 0.591871976852417, + 0.5917760133743286, + 0.5923839807510376, + 0.5671039819717407 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.5921279788017273 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 1.0156160593032837, + 0.9692479968070984, + 0.9681280255317688, + 1.000991940498352, + 0.9676799774169922, + 0.9709759950637817, + 0.9684159755706787, + 0.8735039830207825, + 0.8575360178947449, + 0.8521280288696289 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.9682720005512238 + } + }, + "peak_increment_bytes": { + "fixed": 634957824 + } + } + }, + { + "batch": 1, + "sequence": 6032, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 0.23615999519824982, + 0.2309119999408722, + 0.2309119999408722, + 0.2301120012998581, + 0.23683199286460876, + 0.23043200373649597, + 0.2279359996318817, + 0.22652800381183624, + 0.2290239930152893, + 0.22739200294017792 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.23027200251817703 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 0.7350080013275146, + 0.7158719897270203, + 0.7552639842033386, + 0.7132800221443176, + 0.7521920204162598, + 0.7047359943389893, + 0.7780799865722656, + 0.7628800272941589, + 0.707584023475647, + 0.7457280158996582 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.7403680086135864 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 0.7833279967308044, + 0.9661759734153748, + 0.9402559995651245, + 0.926751971244812, + 0.9718080163002014, + 0.9581440091133118, + 0.9295679926872253, + 0.7895680069923401, + 0.7936959862709045, + 0.9436799883842468 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.9349119961261749 + } + }, + "peak_increment_bytes": { + "fixed": 555970560 + } + } + }, + { + "batch": 256, + "sequence": 3, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 0.7964479923248291, + 0.7910079956054688, + 0.7879999876022339, + 0.7897279858589172, + 0.7914239764213562, + 0.7917119860649109, + 0.7878400087356567, + 0.7878720164299011, + 0.7892159819602966, + 0.7865279912948608 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.7894719839096069 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 7.092959880828857, + 7.109983921051025, + 7.056352138519287, + 7.103487968444824, + 7.059552192687988, + 7.064256191253662, + 7.061855792999268, + 7.075071811676025, + 7.070687770843506, + 7.073823928833008 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 7.072255849838257 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 7.645503997802734, + 7.639200210571289, + 7.650720119476318, + 7.6045122146606445, + 7.639743804931641, + 7.6405439376831055, + 7.638495922088623, + 7.653408050537109, + 7.6457600593566895, + 7.6465277671813965 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 7.64302396774292 + } + }, + "peak_increment_bytes": { + "fixed": 410535936 + } + } + }, + { + "batch": 2048, + "sequence": 3, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 6.055840015411377, + 6.053215980529785, + 6.058784008026123, + 6.056640148162842, + 6.063648223876953, + 6.059232234954834, + 6.051551818847656, + 6.052127838134766, + 6.047872066497803, + 6.055776119232178 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 6.055808067321777 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 55.8941764831543, + 55.77888107299805, + 56.01136016845703, + 55.97792053222656, + 55.99827194213867, + 55.89299011230469, + 56.11747360229492, + 55.97593688964844, + 55.83977508544922, + 55.84022521972656 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 55.93505668640137 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 61.86000061035156, + 61.92563247680664, + 61.99388885498047, + 61.96758270263672, + 61.918399810791016, + 61.94937515258789, + 61.9167366027832, + 61.750911712646484, + 61.69084930419922, + 61.90790557861328 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 61.91756820678711 + } + }, + "peak_increment_bytes": { + "fixed": 3019960320 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.float32", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 1.8758709199713696e-07, + "x": 1.9712212946362973e-07, + "temb": 2.183113118583169e-07, + "weight": 1.611449087501953e-07, + "bias": 8.098239180311436e-08 + }, + "repeat_all_gradients": { + "output": true, + "x": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 33, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 0.07603199779987335, + 0.07747200131416321, + 0.07068800181150436, + 0.06982400268316269, + 0.0767040029168129, + 0.0761599987745285, + 0.07433599978685379, + 0.07177600264549255, + 0.07267200201749802, + 0.07500799745321274 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.07467199862003326 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 0.6451200246810913, + 0.6772480010986328, + 0.7588480114936829, + 0.6771199703216553, + 0.5326079726219177, + 0.420960009098053, + 0.28543999791145325, + 0.6105279922485352, + 0.7102720141410828, + 0.7049919962882996 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.6611199975013733 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 0.8988800048828125, + 0.856224000453949, + 0.8246399760246277, + 0.9065600037574768, + 0.8638719916343689, + 0.8706240057945251, + 0.8271679878234863, + 0.8452799916267395, + 0.9639679789543152, + 0.5109120011329651 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.8600479960441589 + } + }, + "peak_increment_bytes": { + "fixed": 78816256 + } + } + }, + { + "batch": 2, + "sequence": 4096, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 0.2441280037164688, + 0.2401919960975647, + 0.24048000574111938, + 0.23827199637889862, + 0.235167995095253, + 0.24031999707221985, + 0.23731200397014618, + 0.23974399268627167, + 0.24028800427913666, + 0.24028800427913666 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.24024000018835068 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 0.6823999881744385, + 0.6859520077705383, + 0.7461119890213013, + 0.6649600267410278, + 0.6666880249977112, + 0.5043839812278748, + 0.7145280241966248, + 0.6486719846725464, + 0.700160026550293, + 0.7012159824371338 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.6841759979724884 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 0.8604480028152466, + 0.7496320009231567, + 0.8621439933776855, + 0.903007984161377, + 0.8580800294876099, + 0.8695999979972839, + 0.7765120267868042, + 0.8027840256690979, + 0.8893759846687317, + 0.891040027141571 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.8612959980964661 + } + }, + "peak_increment_bytes": { + "fixed": 607338496 + } + } + }, + { + "batch": 1, + "sequence": 6889, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 0.20448000729084015, + 0.20393599569797516, + 0.2017280012369156, + 0.2014400064945221, + 0.2006399929523468, + 0.2019840031862259, + 0.20041599869728088, + 0.19779199361801147, + 0.20441600680351257, + 0.20278400182724 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.20185600221157074 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 0.6473600268363953, + 0.6969280242919922, + 0.6303679943084717, + 0.6687679886817932, + 0.6370239853858948, + 0.6324800252914429, + 0.6098560094833374, + 0.7004479765892029, + 0.6337599754333496, + 0.6579200029373169 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.642192006111145 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 0.6735039949417114, + 0.8720639944076538, + 0.8380159735679626, + 0.7614719867706299, + 0.7083520293235779, + 0.7174080014228821, + 0.7018880248069763, + 0.8300480246543884, + 0.9075199961662292, + 0.836575984954834 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.7957600057125092 + } + }, + "peak_increment_bytes": { + "fixed": 510732288 + } + } + }, + { + "batch": 1, + "sequence": 6032, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 0.18512000143527985, + 0.18361599743366241, + 0.1844799965620041, + 0.18307200074195862, + 0.18169599771499634, + 0.18345600366592407, + 0.1820479929447174, + 0.1852799952030182, + 0.18188799917697906, + 0.1849599927663803 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.18353600054979324 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 0.577888011932373, + 0.6281920075416565, + 0.6417919993400574, + 0.662880003452301, + 0.6880000233650208, + 0.646016001701355, + 0.6395519971847534, + 0.6413760185241699, + 0.6395840048789978, + 0.6610559821128845 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.6415840089321136 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 0.875648021697998, + 0.8771520256996155, + 0.8572480082511902, + 0.875935971736908, + 0.826367974281311, + 0.8276479840278625, + 0.8485119938850403, + 0.5661439895629883, + 0.5534080266952515, + 0.5541759729385376 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 0.8380799889564514 + } + }, + "peak_increment_bytes": { + "fixed": 447442944 + } + } + }, + { + "batch": 256, + "sequence": 3, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 1.4128639698028564, + 1.4012479782104492, + 1.4131519794464111, + 1.394592046737671, + 1.408959984779358, + 1.4078079462051392, + 1.413599967956543, + 1.414944052696228, + 1.4163520336151123, + 1.4014079570770264 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 1.4109119772911072 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 6.86243200302124, + 6.870272159576416, + 6.85971212387085, + 6.8621439933776855, + 6.885727882385254, + 6.851200103759766, + 6.842080116271973, + 6.864255905151367, + 6.892352104187012, + 6.868063926696777 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 6.863343954086304 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 8.081503868103027, + 8.075615882873535, + 8.042752265930176, + 8.035231590270996, + 8.074463844299316, + 8.035200119018555, + 8.078880310058594, + 8.065695762634277, + 8.07795238494873, + 8.079487800598145 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 8.075039863586426 + } + }, + "peak_increment_bytes": { + "fixed": 446724096 + } + } + }, + { + "batch": 2048, + "sequence": 3, + "measurements": { + "forward": { + "samples_ms": { + "fixed": [ + 11.967007637023926, + 11.9868803024292, + 12.01097583770752, + 12.022080421447754, + 11.961952209472656, + 11.956864356994629, + 11.957183837890625, + 11.988096237182617, + 11.958784103393555, + 11.966912269592285 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 11.966959953308105 + } + }, + "backward": { + "samples_ms": { + "fixed": [ + 56.808990478515625, + 56.71356964111328, + 56.86076736450195, + 56.85424041748047, + 56.88547134399414, + 56.65776062011719, + 56.61123275756836, + 56.5522575378418, + 56.85279846191406, + 56.915679931640625 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 56.830894470214844 + } + }, + "forward_backward": { + "samples_ms": { + "fixed": [ + 68.63263702392578, + 68.5672607421875, + 68.35971069335938, + 68.63561248779297, + 68.34249877929688, + 68.73235321044922, + 68.61427307128906, + 68.18745422363281, + 68.54093170166016, + 68.6734390258789 + ] + }, + "order": [ + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ], + [ + "fixed" + ] + ], + "median_ms": { + "fixed": 68.59076690673828 + } + }, + "peak_increment_bytes": { + "fixed": 3045138432 + } + } + } + ] + } + ], + "environment": { + "torch": "2.13.0+cu130", + "cuda": "13.0", + "gpu": "NVIDIA B200", + "workspace": { + "CUBLAS_WORKSPACE_CONFIG": null, + "CUBLASLT_WORKSPACE_SIZE": null + }, + "tf32": false + }, + "scope": "sample batch BI; final uses S=3 for large B, long S tested separately; shared parameter gradients: same ordered inputs, repeat only", + "packages": { + "torch": "2.13.0", + "triton": "3.7.1", + "diffusers": null, + "vllm": "0.30.0", + "sglang": "0.5.21", + "liger-kernel": "0.8.4", + "transformer_engine": null, + "megatron-core": null + } +} diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/fixed-workload.json b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/fixed-workload.json new file mode 100644 index 000000000..348be1a5a --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/fixed-workload.json @@ -0,0 +1,1238 @@ +{ + "mode": "fixed", + "phase": "workload", + "accuracy_seed": 0, + "source": { + "base_sha": "55f83d2b9043f41dca84440d9002ca30f5d3fac4", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked_source_sha256": {}, + "workspace_source_sha256": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "qwenimage_source_sha256": { + "csrc/cuda/model_specific/qwenimage/det_linear.cu": "859da456b0c776f3492b3197c252866e33d9a7088508b701b7c4a179ee709afb", + "csrc/cuda/model_specific/qwenimage/token_sum.cu": "1aace24523ff95520ab5d482e2e0f17d09a2efcf93efc8de865c7bcc157cf3ba", + "rl_engine/backends/cuda/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py": "710df5416a2adf5b2576468ff63584b6699e6bdecd59906370049bf09f1b3286", + "rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py": "f6afe4b7568e2026c4b046a4fd0a02589f817d815198af33173d2dba61773f19", + "rl_engine/reference/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py": "1ebc740ddff575055ee66ed714a8c7cc5c6cee2701d582a665289e9ad1a4fe3d", + "rl_engine/reference/model_specific/qwenimage/final_adaln_out.py": "60441610c04d04d0fb1cd7320be8584e76772c110a3cfed77ddf826dbde9b53c", + "benchmarks/models/qwenimage/__init__.py": "a63ebc79ed10d9ed98484565a353438bd13f5801a8f51d7505d0921bf6942742", + "benchmarks/models/qwenimage/adaln_evidence.py": "9dc9f3da0069d36c602baef07d687fb1aeba8fda0163d17fc446e0a543fe1f3e", + "benchmarks/models/qwenimage/adaln_parameter_screen.py": "05562ef30d09296c2ccd1cdeb44085568b8c877d01f5fb1df4b983e84945ec03", + "benchmarks/models/qwenimage/adaln_prior_art.py": "647aa9fc81e02bf3c7806ed6c2a3e578fb3e1a0b000b4388a12367ef86de3139", + "benchmarks/models/qwenimage/adaln_reuse_bi_audit.py": "88dd3d390e647bbc883b76622309fad54dac3618630dcca0785e555db329a671", + "benchmarks/models/qwenimage/adaln_reuse_candidate.py": "4598f6db94462ac30f3bdd3defae16f0ce7a34ac59eb1996d18e86f498c029b6", + "benchmarks/models/qwenimage/plot_adaln_audit.py": "6151e6abccca8f647c2fbeadf92f12e43ed1c07954db9f2db2f035284cbd407c", + "benchmarks/models/qwenimage/plot_adaln_evidence.py": "16d6bed0ee5b808814c5f7157145a730750d0b1aaf94762e6f72a256e942c1e2", + "benchmarks/models/qwenimage/streams.py": "bd27383eee59404df295f724f6c7d620db3d3d7074c19dd94d51a711b38acf02", + "benchmarks/models/qwenimage/validate_adaln_repair.py": "8b663191323b455470a2313cdfefd837657441b300ffd0e0767453f9f407db03" + }, + "extension_sha256": "5d1054db8bba2eaedbd391d0c23b6683acea9ed04fcd64d6f369faed75aa9e0f", + "clean_commit": true + }, + "cases": [ + { + "stream": "image", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + } + ] + }, + { + "stream": "image", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.float32", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + } + ] + } + ], + "environment": { + "torch": "2.13.0+cu130", + "cuda": "13.0", + "gpu": "NVIDIA B200", + "workspace": { + "CUBLAS_WORKSPACE_CONFIG": null, + "CUBLASLT_WORKSPACE_SIZE": null + }, + "tf32": false + }, + "scope": "sample batch BI; final uses S=3 for large B, long S tested separately; shared parameter gradients: same ordered inputs, repeat only", + "packages": { + "torch": "2.13.0", + "triton": "3.7.1", + "diffusers": null, + "vllm": "0.30.0", + "sglang": "0.5.21", + "liger-kernel": "0.8.4", + "transformer_engine": null, + "megatron-core": null + } +} diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/megatron_local-accuracy.json b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/megatron_local-accuracy.json new file mode 100644 index 000000000..274a0a688 --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/megatron_local-accuracy.json @@ -0,0 +1,2503 @@ +{ + "mode": "megatron_local", + "phase": "accuracy", + "accuracy_seed": 0, + "source": { + "base_sha": "55f83d2b9043f41dca84440d9002ca30f5d3fac4", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked_source_sha256": {}, + "workspace_source_sha256": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "qwenimage_source_sha256": { + "csrc/cuda/model_specific/qwenimage/det_linear.cu": "859da456b0c776f3492b3197c252866e33d9a7088508b701b7c4a179ee709afb", + "csrc/cuda/model_specific/qwenimage/token_sum.cu": "1aace24523ff95520ab5d482e2e0f17d09a2efcf93efc8de865c7bcc157cf3ba", + "rl_engine/backends/cuda/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py": "710df5416a2adf5b2576468ff63584b6699e6bdecd59906370049bf09f1b3286", + "rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py": "f6afe4b7568e2026c4b046a4fd0a02589f817d815198af33173d2dba61773f19", + "rl_engine/reference/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py": "1ebc740ddff575055ee66ed714a8c7cc5c6cee2701d582a665289e9ad1a4fe3d", + "rl_engine/reference/model_specific/qwenimage/final_adaln_out.py": "60441610c04d04d0fb1cd7320be8584e76772c110a3cfed77ddf826dbde9b53c", + "benchmarks/models/qwenimage/__init__.py": "a63ebc79ed10d9ed98484565a353438bd13f5801a8f51d7505d0921bf6942742", + "benchmarks/models/qwenimage/adaln_evidence.py": "9dc9f3da0069d36c602baef07d687fb1aeba8fda0163d17fc446e0a543fe1f3e", + "benchmarks/models/qwenimage/adaln_parameter_screen.py": "05562ef30d09296c2ccd1cdeb44085568b8c877d01f5fb1df4b983e84945ec03", + "benchmarks/models/qwenimage/adaln_prior_art.py": "647aa9fc81e02bf3c7806ed6c2a3e578fb3e1a0b000b4388a12367ef86de3139", + "benchmarks/models/qwenimage/adaln_reuse_bi_audit.py": "88dd3d390e647bbc883b76622309fad54dac3618630dcca0785e555db329a671", + "benchmarks/models/qwenimage/adaln_reuse_candidate.py": "4598f6db94462ac30f3bdd3defae16f0ce7a34ac59eb1996d18e86f498c029b6", + "benchmarks/models/qwenimage/plot_adaln_audit.py": "6151e6abccca8f647c2fbeadf92f12e43ed1c07954db9f2db2f035284cbd407c", + "benchmarks/models/qwenimage/plot_adaln_evidence.py": "16d6bed0ee5b808814c5f7157145a730750d0b1aaf94762e6f72a256e942c1e2", + "benchmarks/models/qwenimage/streams.py": "bd27383eee59404df295f724f6c7d620db3d3d7074c19dd94d51a711b38acf02", + "benchmarks/models/qwenimage/validate_adaln_repair.py": "8b663191323b455470a2313cdfefd837657441b300ffd0e0767453f9f407db03" + }, + "extension_sha256": "5d1054db8bba2eaedbd391d0c23b6683acea9ed04fcd64d6f369faed75aa9e0f", + "clean_commit": true + }, + "cases": [ + { + "stream": "image", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 1, + "errors": { + "output": 0.0003551136363636364, + "temb": 0.002728983407362896, + "weight": 0.0024390243902439024, + "bias": 0.0 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.14749263226985931, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.06221199035644531, + "max_tolerance_ratio": 0.1368875354528427, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11635208129882812, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.14749263226985931, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0622100830078125, + "max_tolerance_ratio": 0.1368919014930725, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11635208129882812, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0009765625, + "max_tolerance_ratio": 0.01830160990357399, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 1.4685560017824173e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 1, + "errors": { + "output": 0.0007102272727272727, + "temb": 0.0013375396742077623, + "weight": 0.0031093047650859887, + "bias": 0.002188183807439825 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.23923446238040924, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0716552734375, + "max_tolerance_ratio": 0.14068613946437836, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0524444580078125, + "max_tolerance_ratio": 0.12155365198850632, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.0863557830452919, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.23923446238040924, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0716552734375, + "max_tolerance_ratio": 0.14069046080112457, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0524444580078125, + "max_tolerance_ratio": 0.12155365198850632, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.0863557830452919, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.00390625, + "max_tolerance_ratio": 0.057537395507097244, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 2.205422060796991e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 3.6503697629086673e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "image", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 1, + "errors": { + "output": 1.5183194788849913e-06, + "temb": 4.306306281895437e-06, + "weight": 1.1117015265884846e-07, + "bias": 0.0 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 6.67572021484375e-05, + "max_tolerance_ratio": 0.06020082160830498, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 9.822845458984375e-05, + "max_tolerance_ratio": 0.2776884436607361, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0017226141644641757, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 7.05718994140625e-05, + "max_tolerance_ratio": 0.06535883992910385, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 9.918212890625e-05, + "max_tolerance_ratio": 0.27928176522254944, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0019029012182727456, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.022652268409729004, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.019896306097507477, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0017226141644641757, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 1, + "errors": { + "output": 1.5183194788849913e-06, + "temb": 1.8327359852933242e-06, + "weight": 1.2601489105323987e-07, + "bias": 5.007435123128072e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 6.67572021484375e-05, + "max_tolerance_ratio": 0.0722874104976654, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 9.822845458984375e-05, + "max_tolerance_ratio": 0.38759270310401917, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.0069028763100504875, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 0.0012351492187008262, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 6.866455078125e-05, + "max_tolerance_ratio": 0.0722874104976654, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 9.72747802734375e-05, + "max_tolerance_ratio": 0.39050161838531494, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.430511474609375e-06, + "max_tolerance_ratio": 0.00684388866648078, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.023276854306459427, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 6.67572021484375e-06, + "max_tolerance_ratio": 0.03042229451239109, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.0069028763100504875, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 0.0012351492187008262, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 1, + "errors": { + "output": 0.0009765625, + "temb": 0.0025955522001601225, + "weight": 0.0024390243902439024, + "bias": 0.0 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.16233766078948975, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.061344146728515625, + "max_tolerance_ratio": 0.14143496751785278, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11635208129882812, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.16233766078948975, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.061344146728515625, + "max_tolerance_ratio": 0.14143496751785278, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.11635208129882812, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.000244140625, + "max_tolerance_ratio": 0.004815564025193453, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 1.347583020105958e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 1, + "errors": { + "output": 0.0009765625, + "temb": 0.0019412816630083021, + "weight": 0.0031093047650859887, + "bias": 0.002188183807439825 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.1706484705209732, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.06172370910644531, + "max_tolerance_ratio": 0.14143496751785278, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0524444580078125, + "max_tolerance_ratio": 0.12155365198850632, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.0863557830452919, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.1706484705209732, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.06172370910644531, + "max_tolerance_ratio": 0.14143496751785278, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.0524444580078125, + "max_tolerance_ratio": 0.12155365198850632, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.015625, + "max_tolerance_ratio": 0.0863557830452919, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0009765625, + "max_tolerance_ratio": 0.018109379336237907, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 1.999356572923716e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 3.6503697629086673e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 1, + "errors": { + "output": 1.0107427687003167e-06, + "temb": 3.525869169002881e-06, + "weight": 1.1117015265884846e-07, + "bias": 0.0 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 1.621246337890625e-05, + "max_tolerance_ratio": 0.07684352993965149, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 8.296966552734375e-05, + "max_tolerance_ratio": 0.1939660757780075, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0017226141644641757, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.621246337890625e-05, + "max_tolerance_ratio": 0.06825204193592072, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 8.392333984375e-05, + "max_tolerance_ratio": 0.19687551259994507, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0019029012182727456, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.021753035485744476, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 4.291534423828125e-06, + "max_tolerance_ratio": 0.025202572345733643, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.0017226141644641757, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 1, + "errors": { + "output": 1.2188368681386174e-06, + "temb": 4.465900779879222e-06, + "weight": 1.2601489105323987e-07, + "bias": 5.007435123128072e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 1.9550323486328125e-05, + "max_tolerance_ratio": 0.07684352993965149, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.000141143798828125, + "max_tolerance_ratio": 0.25643959641456604, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.0069028763100504875, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 0.0012351492187008262, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 1.9550323486328125e-05, + "max_tolerance_ratio": 0.06965624541044235, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.000141143798828125, + "max_tolerance_ratio": 0.24927429854869843, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.430511474609375e-06, + "max_tolerance_ratio": 0.00684388866648078, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 3.337860107421875e-06, + "max_tolerance_ratio": 0.022754820063710213, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 6.318092346191406e-06, + "max_tolerance_ratio": 0.03872999921441078, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.0069028763100504875, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 0.0012351492187008262, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 3, + "errors": { + "output": 0.0003078817733990148, + "x": 0.003379820097165924, + "temb": 0.0031119333783771533, + "weight": 0.004945028228119784, + "bias": 0.003313623961515694 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0078125, + "max_tolerance_ratio": 0.0938086286187172, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.11869430541992188, + "max_tolerance_ratio": 0.21695566177368164, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.03130388259887695, + "max_tolerance_ratio": 0.15603098273277283, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.14208602905273438, + "max_tolerance_ratio": 0.3078462779521942, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.02972412109375, + "max_tolerance_ratio": 0.13267186284065247, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0078125, + "max_tolerance_ratio": 0.0938086286187172, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.11869430541992188, + "max_tolerance_ratio": 0.2169511765241623, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.03130149841308594, + "max_tolerance_ratio": 0.15601912140846252, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.14208602905273438, + "max_tolerance_ratio": 0.3078462779521942, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.02972412109375, + "max_tolerance_ratio": 0.13267186284065247, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 4.782179075846216e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 2.0120800400036387e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 4.4731414163834415e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 3, + "errors": { + "output": 0.0003078817733990148, + "x": 0.003379820097165924, + "temb": 0.005712340593293303, + "weight": 0.00517754451340496, + "bias": 0.0040532119374307955 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0078125, + "max_tolerance_ratio": 0.10309278219938278, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.11869430541992188, + "max_tolerance_ratio": 0.21695566177368164, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.057618021965026855, + "max_tolerance_ratio": 0.5451936721801758, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.2148761749267578, + "max_tolerance_ratio": 0.7240067720413208, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0565643310546875, + "max_tolerance_ratio": 0.30348730087280273, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0078125, + "max_tolerance_ratio": 0.10309278219938278, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.11869430541992188, + "max_tolerance_ratio": 0.2169511765241623, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.057617783546447754, + "max_tolerance_ratio": 0.5451914668083191, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.2148761749267578, + "max_tolerance_ratio": 0.7240067720413208, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0565643310546875, + "max_tolerance_ratio": 0.3034861981868744, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0, + "max_tolerance_ratio": 0.0, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 4.782179075846216e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 2.9025261028436944e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 8.686409273650497e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 4.76837158203125e-07, + "max_tolerance_ratio": 2.5911340344464406e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 4096, + "errors": { + "output": 0.0017006802721088435, + "x": 0.006260733717029794, + "temb": 0.0021778555709870977, + "weight": 0.0044316872049487656, + "bias": 0.003015581812429844 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.2732240557670593, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.23677444458007812, + "max_tolerance_ratio": 0.3116537630558014, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": false, + "max_abs": 0.964630126953125, + "max_tolerance_ratio": 5.900656700134277, + "violations": 10, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": false, + "max_abs": 3.41656494140625, + "max_tolerance_ratio": 6.920680046081543, + "violations": 24062, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": false, + "max_abs": 0.725799560546875, + "max_tolerance_ratio": 2.6839804649353027, + "violations": 35, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.3378378450870514, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.2367706298828125, + "max_tolerance_ratio": 0.31164881587028503, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": false, + "max_abs": 0.97003173828125, + "max_tolerance_ratio": 5.908267974853516, + "violations": 10, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": false, + "max_abs": 3.4315185546875, + "max_tolerance_ratio": 6.920680046081543, + "violations": 23995, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": false, + "max_abs": 0.725799560546875, + "max_tolerance_ratio": 2.6839804649353027, + "violations": 35, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.33557045459747314, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 1.0898160326178186e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0093231201171875, + "max_tolerance_ratio": 0.017987243831157684, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.07623291015625, + "max_tolerance_ratio": 0.07275641709566116, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.0238037109375, + "max_tolerance_ratio": 0.043760742992162704, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 6889, + "errors": { + "output": 0.0016025641025641025, + "x": 0.004671057561104168, + "temb": 0.00546224339576699, + "weight": 0.004538599895926961, + "bias": 0.003287193264642199 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.4166666865348816, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.19937896728515625, + "max_tolerance_ratio": 0.2922609746456146, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": false, + "max_abs": 2.8993453979492188, + "max_tolerance_ratio": 3.226449966430664, + "violations": 43, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": false, + "max_abs": 4.19482421875, + "max_tolerance_ratio": 11.211472511291504, + "violations": 40442, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": false, + "max_abs": 0.948516845703125, + "max_tolerance_ratio": 3.7081263065338135, + "violations": 61, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.3378378450870514, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.19938278198242188, + "max_tolerance_ratio": 0.2922518253326416, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": false, + "max_abs": 2.9097061157226562, + "max_tolerance_ratio": 3.1977789402008057, + "violations": 43, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": false, + "max_abs": 4.19482421875, + "max_tolerance_ratio": 11.21147346496582, + "violations": 40501, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": false, + "max_abs": 0.948516845703125, + "max_tolerance_ratio": 3.7081263065338135, + "violations": 61, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.4166666865348816, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 1.2333959602983668e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0142822265625, + "max_tolerance_ratio": 0.030629962682724, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.09305572509765625, + "max_tolerance_ratio": 0.1353081315755844, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.029052734375, + "max_tolerance_ratio": 0.07012274116277695, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 6032, + "errors": { + "output": 0.0016025641025641025, + "x": 0.004653886320707443, + "temb": 0.0020670024087700947, + "weight": 0.005260730797890888, + "bias": 0.0035607123065396385 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.4166666865348816, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.18586349487304688, + "max_tolerance_ratio": 0.28755882382392883, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": false, + "max_abs": 2.54632568359375, + "max_tolerance_ratio": 1.8473057746887207, + "violations": 18, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": false, + "max_abs": 5.22198486328125, + "max_tolerance_ratio": 6.068663120269775, + "violations": 30248, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": false, + "max_abs": 1.10345458984375, + "max_tolerance_ratio": 2.4669528007507324, + "violations": 45, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.3378378450870514, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.1858673095703125, + "max_tolerance_ratio": 0.28755882382392883, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": false, + "max_abs": 2.54156494140625, + "max_tolerance_ratio": 1.848049283027649, + "violations": 17, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": false, + "max_abs": 5.22198486328125, + "max_tolerance_ratio": 6.068663120269775, + "violations": 30239, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": false, + "max_abs": 1.10345458984375, + "max_tolerance_ratio": 2.4669528007507324, + "violations": 45, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.4166666865348816, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 1.0904316695814487e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.00726318359375, + "max_tolerance_ratio": 0.025921989232301712, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.09305953979492188, + "max_tolerance_ratio": 0.1028057336807251, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.029052734375, + "max_tolerance_ratio": 0.08268208056688309, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.float32", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 3, + "errors": { + "output": 1.050487715183967e-06, + "x": 9.988318586171006e-07, + "temb": 1.389143611052937e-06, + "weight": 1.573244705925568e-07, + "bias": 9.062440719379816e-08 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 2.6702880859375e-05, + "max_tolerance_ratio": 0.03890873119235039, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 3.528594970703125e-05, + "max_tolerance_ratio": 0.04014911502599716, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.3828277587890625e-05, + "max_tolerance_ratio": 0.0886097401380539, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 0.008276660926640034, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 9.5367431640625e-07, + "max_tolerance_ratio": 0.002739404793828726, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 2.86102294921875e-05, + "max_tolerance_ratio": 0.047822412103414536, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 3.4332275390625e-05, + "max_tolerance_ratio": 0.05015161260962486, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.3053417205810547e-05, + "max_tolerance_ratio": 0.08675654232501984, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.76837158203125e-06, + "max_tolerance_ratio": 0.009138970635831356, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.430511474609375e-06, + "max_tolerance_ratio": 0.003541923826560378, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.008913637138903141, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.01000254787504673, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.6689300537109375e-06, + "max_tolerance_ratio": 0.012632080353796482, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.008276660926640034, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.430511474609375e-06, + "max_tolerance_ratio": 0.003381598275154829, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 3, + "sequence": 3, + "errors": { + "output": 1.050487715183967e-06, + "x": 9.988318586171006e-07, + "temb": 2.535181130127741e-06, + "weight": 1.611449087501953e-07, + "bias": 1.037766860497995e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 2.6702880859375e-05, + "max_tolerance_ratio": 0.04817585647106171, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 3.528594970703125e-05, + "max_tolerance_ratio": 0.05509623885154724, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 2.574920654296875e-05, + "max_tolerance_ratio": 0.0886097401380539, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.024698883295059204, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.007193312514573336, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 2.6702880859375e-05, + "max_tolerance_ratio": 0.04777771234512329, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 3.4332275390625e-05, + "max_tolerance_ratio": 0.05509623885154724, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 2.288818359375e-05, + "max_tolerance_ratio": 0.09204159677028656, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.01830209419131279, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.007229685317724943, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-06, + "max_tolerance_ratio": 0.01651504635810852, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.020023591816425323, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 4.5299530029296875e-06, + "max_tolerance_ratio": 0.03066845051944256, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.019367719069123268, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.9073486328125e-06, + "max_tolerance_ratio": 0.010526997968554497, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 4096, + "errors": { + "output": 2.1208041054629328e-06, + "x": 1.8391342487413572e-06, + "temb": 1.7519359479440379e-06, + "weight": 1.8796345849048493e-07, + "bias": 1.4637192237707338e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 7.82012939453125e-05, + "max_tolerance_ratio": 0.11349449306726456, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 6.866455078125e-05, + "max_tolerance_ratio": 0.10154536366462708, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": false, + "max_abs": 0.0007781982421875, + "max_tolerance_ratio": 3.215604543685913, + "violations": 2, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.000152587890625, + "max_tolerance_ratio": 0.2919485569000244, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.10803652554750443, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 7.43865966796875e-05, + "max_tolerance_ratio": 0.11877626925706863, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 6.866455078125e-05, + "max_tolerance_ratio": 0.1114070937037468, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": false, + "max_abs": 0.0008544921875, + "max_tolerance_ratio": 3.3585681915283203, + "violations": 2, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.3650115430355072, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.11548647284507751, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.022597676143050194, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.02198362536728382, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.000152587890625, + "max_tolerance_ratio": 0.1429157555103302, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.21178868412971497, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.0741499587893486, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 6889, + "errors": { + "output": 2.004184737732385e-06, + "x": 1.8188701474868484e-06, + "temb": 2.2290540638326074e-06, + "weight": 2.1931747584937714e-07, + "bias": 2.2961578510839462e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 7.82012939453125e-05, + "max_tolerance_ratio": 0.11764916777610779, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.82012939453125e-05, + "max_tolerance_ratio": 0.10106968879699707, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.00115966796875, + "max_tolerance_ratio": 0.9986936450004578, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001983642578125, + "max_tolerance_ratio": 0.6640048027038574, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 6.866455078125e-05, + "max_tolerance_ratio": 0.22449085116386414, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 7.43865966796875e-05, + "max_tolerance_ratio": 0.12779615819454193, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.82012939453125e-05, + "max_tolerance_ratio": 0.11351066082715988, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.001220703125, + "max_tolerance_ratio": 0.9391632080078125, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001983642578125, + "max_tolerance_ratio": 0.7114931344985962, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 6.103515625e-05, + "max_tolerance_ratio": 0.24111200869083405, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.024555373936891556, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.021878523752093315, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.3590463399887085, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.4027182459831238, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 2.288818359375e-05, + "max_tolerance_ratio": 0.13646109402179718, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 1, + "sequence": 6032, + "errors": { + "output": 2.004184737732385e-06, + "x": 1.9565668352262113e-06, + "temb": 2.938426298318477e-06, + "weight": 1.788765234025632e-07, + "bias": 1.625134831291187e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 7.82012939453125e-05, + "max_tolerance_ratio": 0.11349449306726456, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.82012939453125e-05, + "max_tolerance_ratio": 0.10496282577514648, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.003662109375, + "max_tolerance_ratio": 0.6157899498939514, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.3762318193912506, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.9591064453125e-05, + "max_tolerance_ratio": 0.15080343186855316, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 7.43865966796875e-05, + "max_tolerance_ratio": 0.12779615819454193, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 7.62939453125e-05, + "max_tolerance_ratio": 0.11213604360818863, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.003662109375, + "max_tolerance_ratio": 0.5777469277381897, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.000152587890625, + "max_tolerance_ratio": 0.37643441557884216, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.15080343186855316, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.024555373936891556, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.021719543263316154, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.11637149006128311, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.0001220703125, + "max_tolerance_ratio": 0.24204149842262268, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 2.288818359375e-05, + "max_tolerance_ratio": 0.08607399463653564, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + } + ], + "environment": { + "torch": "2.13.0+cu130", + "cuda": "13.0", + "gpu": "NVIDIA B200", + "workspace": { + "CUBLAS_WORKSPACE_CONFIG": null, + "CUBLASLT_WORKSPACE_SIZE": null + }, + "tf32": false + }, + "scope": "sample batch BI; final uses S=3 for large B, long S tested separately; shared parameter gradients: same ordered inputs, repeat only", + "packages": { + "torch": "2.13.0", + "triton": "3.7.1", + "diffusers": null, + "vllm": "0.30.0", + "sglang": "0.5.21", + "liger-kernel": "0.8.4", + "transformer_engine": null, + "megatron-core": null, + "megatron-lm-source": "52fbcbc18c2992db1747a4558f430e0519604ad0" + } +} diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/megatron_local-accuracy_large.json b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/megatron_local-accuracy_large.json new file mode 100644 index 000000000..624f4bcf2 --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/megatron_local-accuracy_large.json @@ -0,0 +1,1675 @@ +{ + "mode": "megatron_local", + "phase": "accuracy_large", + "accuracy_seed": 0, + "source": { + "base_sha": "55f83d2b9043f41dca84440d9002ca30f5d3fac4", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked_source_sha256": {}, + "workspace_source_sha256": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "qwenimage_source_sha256": { + "csrc/cuda/model_specific/qwenimage/det_linear.cu": "859da456b0c776f3492b3197c252866e33d9a7088508b701b7c4a179ee709afb", + "csrc/cuda/model_specific/qwenimage/token_sum.cu": "1aace24523ff95520ab5d482e2e0f17d09a2efcf93efc8de865c7bcc157cf3ba", + "rl_engine/backends/cuda/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py": "710df5416a2adf5b2576468ff63584b6699e6bdecd59906370049bf09f1b3286", + "rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py": "f6afe4b7568e2026c4b046a4fd0a02589f817d815198af33173d2dba61773f19", + "rl_engine/reference/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py": "1ebc740ddff575055ee66ed714a8c7cc5c6cee2701d582a665289e9ad1a4fe3d", + "rl_engine/reference/model_specific/qwenimage/final_adaln_out.py": "60441610c04d04d0fb1cd7320be8584e76772c110a3cfed77ddf826dbde9b53c", + "benchmarks/models/qwenimage/__init__.py": "a63ebc79ed10d9ed98484565a353438bd13f5801a8f51d7505d0921bf6942742", + "benchmarks/models/qwenimage/adaln_evidence.py": "9dc9f3da0069d36c602baef07d687fb1aeba8fda0163d17fc446e0a543fe1f3e", + "benchmarks/models/qwenimage/adaln_parameter_screen.py": "05562ef30d09296c2ccd1cdeb44085568b8c877d01f5fb1df4b983e84945ec03", + "benchmarks/models/qwenimage/adaln_prior_art.py": "647aa9fc81e02bf3c7806ed6c2a3e578fb3e1a0b000b4388a12367ef86de3139", + "benchmarks/models/qwenimage/adaln_reuse_bi_audit.py": "88dd3d390e647bbc883b76622309fad54dac3618630dcca0785e555db329a671", + "benchmarks/models/qwenimage/adaln_reuse_candidate.py": "4598f6db94462ac30f3bdd3defae16f0ce7a34ac59eb1996d18e86f498c029b6", + "benchmarks/models/qwenimage/plot_adaln_audit.py": "6151e6abccca8f647c2fbeadf92f12e43ed1c07954db9f2db2f035284cbd407c", + "benchmarks/models/qwenimage/plot_adaln_evidence.py": "16d6bed0ee5b808814c5f7157145a730750d0b1aaf94762e6f72a256e942c1e2", + "benchmarks/models/qwenimage/streams.py": "bd27383eee59404df295f724f6c7d620db3d3d7074c19dd94d51a711b38acf02", + "benchmarks/models/qwenimage/validate_adaln_repair.py": "8b663191323b455470a2313cdfefd837657441b300ffd0e0767453f9f407db03" + }, + "extension_sha256": "5d1054db8bba2eaedbd391d0c23b6683acea9ed04fcd64d6f369faed75aa9e0f", + "clean_commit": true + }, + "cases": [ + { + "stream": "image", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 1, + "errors": { + "output": 0.0020408163265306124, + "temb": 0.0030144900592607993, + "weight": 0.002084629645128771, + "bias": 0.002484959114058055 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.32894736528396606, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.2178955078125, + "max_tolerance_ratio": 0.16408038139343262, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.16831408441066742, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.174072265625, + "max_tolerance_ratio": 0.16830919682979584, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.32894736528396606, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.21788787841796875, + "max_tolerance_ratio": 0.1640855073928833, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.12499618530273438, + "max_tolerance_ratio": 0.1683192402124405, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.174072265625, + "max_tolerance_ratio": 0.16830919682979584, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2283104956150055, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 6.939894228707999e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 2.6702880859375e-05, + "max_tolerance_ratio": 9.075890557141975e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 7.648543032701127e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 1, + "errors": { + "output": 0.004, + "temb": 0.002455035302989417, + "weight": 0.003418323784760821, + "bias": 0.0027655102951030354 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.25, + "max_tolerance_ratio": 0.33557045459747314, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.23834991455078125, + "max_tolerance_ratio": 0.16529890894889832, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.4989471435546875, + "max_tolerance_ratio": 0.18687306344509125, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.49908447265625, + "max_tolerance_ratio": 0.17882999777793884, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.25, + "max_tolerance_ratio": 0.33557045459747314, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.23833465576171875, + "max_tolerance_ratio": 0.16529890894889832, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.4989471435546875, + "max_tolerance_ratio": 0.18687306344509125, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.49908447265625, + "max_tolerance_ratio": 0.17882999777793884, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.23923446238040924, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 6.192495493451133e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 5.340576171875e-05, + "max_tolerance_ratio": 0.0003392235084902495, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 2.6462814275873825e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "image", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 1, + "errors": { + "output": 1.7433859207017177e-06, + "temb": 2.373163366626705e-06, + "weight": 7.716234830528243e-07, + "bias": 1.0683127989394472e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0001068115234375, + "max_tolerance_ratio": 0.13346177339553833, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.000171661376953125, + "max_tolerance_ratio": 0.6455947756767273, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.14788229763507843, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.039090897887945175, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.000102996826171875, + "max_tolerance_ratio": 0.1459970623254776, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.000179290771484375, + "max_tolerance_ratio": 0.6558732390403748, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.04511386156082153, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.0540260411798954, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.07006721198558807, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.07333238422870636, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.14777518808841705, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06444935500621796, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 1, + "errors": { + "output": 1.7119723853962886e-06, + "temb": 2.427850273845466e-06, + "weight": 2.1320238063111557e-06, + "bias": 1.2116294466573155e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0001068115234375, + "max_tolerance_ratio": 0.22729724645614624, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.00023651123046875, + "max_tolerance_ratio": 0.8108323812484741, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": false, + "max_abs": 0.00031280517578125, + "max_tolerance_ratio": 1.1334569454193115, + "violations": 2, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 2.288818359375e-05, + "max_tolerance_ratio": 0.09812485426664352, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0001068115234375, + "max_tolerance_ratio": 0.23516611754894257, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.000240325927734375, + "max_tolerance_ratio": 0.8361965417861938, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": false, + "max_abs": 0.00034332275390625, + "max_tolerance_ratio": 1.1698048114776611, + "violations": 5, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.1281770020723343, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.9073486328125e-05, + "max_tolerance_ratio": 0.0719609186053276, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 2.002716064453125e-05, + "max_tolerance_ratio": 0.09429927170276642, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.1552734375e-05, + "max_tolerance_ratio": 0.5631505846977234, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.09616640210151672, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 1, + "errors": { + "output": 0.001004016064257028, + "temb": 0.0030494313860528134, + "weight": 0.002084629645128771, + "bias": 0.002484959114058055 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.23923446238040924, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.1246795654296875, + "max_tolerance_ratio": 0.16245029866695404, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.16831408441066742, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.174072265625, + "max_tolerance_ratio": 0.16830919682979584, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.23923446238040924, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.1246795654296875, + "max_tolerance_ratio": 0.16245029866695404, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.12499618530273438, + "max_tolerance_ratio": 0.1683192402124405, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.174072265625, + "max_tolerance_ratio": 0.16830919682979584, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2092050313949585, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 3.4575481549836695e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 2.6702880859375e-05, + "max_tolerance_ratio": 9.075890557141975e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 3.814697265625e-06, + "max_tolerance_ratio": 7.648543032701127e-06, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 1, + "errors": { + "output": 0.002008032128514056, + "temb": 0.0026498776250635605, + "weight": 0.003418323784760821, + "bias": 0.0027655102951030354 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.29411765933036804, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.12428665161132812, + "max_tolerance_ratio": 0.16516810655593872, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.4989471435546875, + "max_tolerance_ratio": 0.18687306344509125, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.49908447265625, + "max_tolerance_ratio": 0.17882999777793884, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.29411765933036804, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.12428665161132812, + "max_tolerance_ratio": 0.16516810655593872, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.4989471435546875, + "max_tolerance_ratio": 0.18687306344509125, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.49908447265625, + "max_tolerance_ratio": 0.17882999777793884, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.03125, + "max_tolerance_ratio": 0.2380952537059784, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 3.5094042686978355e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 5.340576171875e-05, + "max_tolerance_ratio": 0.0003392235084902495, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 2.6462814275873825e-05, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 1, + "errors": { + "output": 1.7801797244895641e-06, + "temb": 4.483625634738944e-06, + "weight": 7.716234830528243e-07, + "bias": 1.0683127989394472e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 5.53131103515625e-05, + "max_tolerance_ratio": 0.09786360710859299, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.00018310546875, + "max_tolerance_ratio": 0.6263680458068848, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.14788229763507843, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.039090897887945175, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 5.340576171875e-05, + "max_tolerance_ratio": 0.10181712359189987, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.0001850128173828125, + "max_tolerance_ratio": 0.6196376085281372, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.04511386156082153, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.0540260411798954, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 7.62939453125e-06, + "max_tolerance_ratio": 0.04434660077095032, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.05778145045042038, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.14777518808841705, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06444935500621796, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 1, + "errors": { + "output": 1.7801797244895641e-06, + "temb": 4.732304247409034e-06, + "weight": 2.1320238063111557e-06, + "bias": 1.2116294466573155e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 5.53131103515625e-05, + "max_tolerance_ratio": 0.13089163601398468, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.00022125244140625, + "max_tolerance_ratio": 0.9405631422996521, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": false, + "max_abs": 0.00031280517578125, + "max_tolerance_ratio": 1.1334569454193115, + "violations": 2, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 2.288818359375e-05, + "max_tolerance_ratio": 0.09812485426664352, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 5.340576171875e-05, + "max_tolerance_ratio": 0.132511168718338, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.0002193450927734375, + "max_tolerance_ratio": 0.9109076857566833, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": false, + "max_abs": 0.00034332275390625, + "max_tolerance_ratio": 1.1698048114776611, + "violations": 5, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.1281770020723343, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 9.5367431640625e-06, + "max_tolerance_ratio": 0.048017870634794235, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.0013580322265625e-05, + "max_tolerance_ratio": 0.0638367310166359, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 9.1552734375e-05, + "max_tolerance_ratio": 0.5631505846977234, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.0517578125e-05, + "max_tolerance_ratio": 0.09616640210151672, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 3, + "errors": { + "output": 0.0034482758620689655, + "x": 0.003175538764588289, + "temb": 0.002322527203970102, + "weight": 0.003478722574532345, + "bias": 0.0031893884767108024 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.5494505763053894, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.16716766357421875, + "max_tolerance_ratio": 0.3857440948486328, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.12705421447753906, + "max_tolerance_ratio": 0.8321456909179688, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": false, + "max_abs": 0.36547088623046875, + "max_tolerance_ratio": 2.3721272945404053, + "violations": 3785, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": false, + "max_abs": 0.30846405029296875, + "max_tolerance_ratio": 1.9083781242370605, + "violations": 12, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.125, + "max_tolerance_ratio": 0.5494505763053894, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.16716766357421875, + "max_tolerance_ratio": 0.38574206829071045, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.1270599365234375, + "max_tolerance_ratio": 0.8321682214736938, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": false, + "max_abs": 0.36545562744140625, + "max_tolerance_ratio": 2.3721537590026855, + "violations": 3789, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": false, + "max_abs": 0.30846405029296875, + "max_tolerance_ratio": 1.9083715677261353, + "violations": 12, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.046875, + "max_tolerance_ratio": 0.35885170102119446, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.02467513084411621, + "max_tolerance_ratio": 0.1445486843585968, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0019903182983398438, + "max_tolerance_ratio": 0.013218452222645283, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.039097607135772705, + "max_tolerance_ratio": 0.3584054112434387, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.01055908203125, + "max_tolerance_ratio": 0.06674929708242416, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 3, + "errors": { + "output": 0.005714285714285714, + "x": 0.004936807385317507, + "temb": 0.003013781108370626, + "weight": 0.0038386276655318833, + "bias": 0.0034893130655960806 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 0.25, + "max_tolerance_ratio": 0.5617977380752563, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.20632553100585938, + "max_tolerance_ratio": 0.396081805229187, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.19140243530273438, + "max_tolerance_ratio": 0.8844922780990601, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": false, + "max_abs": 1.047760009765625, + "max_tolerance_ratio": 5.178889274597168, + "violations": 239266, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": false, + "max_abs": 1.055023193359375, + "max_tolerance_ratio": 3.2858805656433105, + "violations": 149, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 0.25, + "max_tolerance_ratio": 0.5617977380752563, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.206329345703125, + "max_tolerance_ratio": 0.396081805229187, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.19140243530273438, + "max_tolerance_ratio": 0.8845169544219971, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": false, + "max_abs": 1.047760009765625, + "max_tolerance_ratio": 5.178803443908691, + "violations": 239261, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": false, + "max_abs": 1.055023193359375, + "max_tolerance_ratio": 3.2858681678771973, + "violations": 149, + "atol": 0.1, + "rtol": 0.02 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 0.0625, + "max_tolerance_ratio": 0.4464285671710968, + "violations": 0, + "atol": 0.05, + "rtol": 0.02 + }, + "x": { + "passed": true, + "max_abs": 0.04151296615600586, + "max_tolerance_ratio": 0.20947077870368958, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "temb": { + "passed": true, + "max_abs": 0.0064525604248046875, + "max_tolerance_ratio": 0.03526727855205536, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "weight": { + "passed": true, + "max_abs": 0.11563682556152344, + "max_tolerance_ratio": 0.8075345158576965, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + }, + "bias": { + "passed": true, + "max_abs": 0.03491020202636719, + "max_tolerance_ratio": 0.06267767399549484, + "violations": 0, + "atol": 0.1, + "rtol": 0.02 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.float32", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "fp64_contract", + "batch": 256, + "sequence": 3, + "errors": { + "output": 1.5880428420080526e-06, + "x": 1.1440051785140945e-06, + "temb": 3.37056068666406e-06, + "weight": 7.413321522701539e-07, + "bias": 1.3726660998391063e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 5.7220458984375e-05, + "max_tolerance_ratio": 0.09363626688718796, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 6.103515625e-05, + "max_tolerance_ratio": 0.08116114884614944, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.0001850128173828125, + "max_tolerance_ratio": 0.24350279569625854, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 7.62939453125e-05, + "max_tolerance_ratio": 0.2647613286972046, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.07366245239973068, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 5.91278076171875e-05, + "max_tolerance_ratio": 0.09396830946207047, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 6.4849853515625e-05, + "max_tolerance_ratio": 0.0886664092540741, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.0001888275146484375, + "max_tolerance_ratio": 0.22788125276565552, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 2.288818359375e-05, + "max_tolerance_ratio": 0.125393345952034, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.71661376953125e-05, + "max_tolerance_ratio": 0.09363525360822678, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.049872979521751404, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.1444091796875e-05, + "max_tolerance_ratio": 0.06246780604124069, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.049041748046875e-05, + "max_tolerance_ratio": 0.05931292846798897, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 7.62939453125e-05, + "max_tolerance_ratio": 0.26246994733810425, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.05028747767210007, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + }, + { + "kind": "fp64_contract", + "batch": 2048, + "sequence": 3, + "errors": { + "output": 1.6488481147070657e-06, + "x": 2.253635387577805e-06, + "temb": 2.8211446304977114e-06, + "weight": 1.9155831471206017e-06, + "bias": 1.1103593665178002e-07 + }, + "contract": { + "output": { + "passed": true, + "max_abs": 7.2479248046875e-05, + "max_tolerance_ratio": 0.18087902665138245, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 9.5367431640625e-05, + "max_tolerance_ratio": 0.14887939393520355, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.000179290771484375, + "max_tolerance_ratio": 0.28255540132522583, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": false, + "max_abs": 0.000518798828125, + "max_tolerance_ratio": 1.8245004415512085, + "violations": 74, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 3.4332275390625e-05, + "max_tolerance_ratio": 0.20052193105220795, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_contract": { + "output": { + "passed": true, + "max_abs": 7.43865966796875e-05, + "max_tolerance_ratio": 0.18567319214344025, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 0.000102996826171875, + "max_tolerance_ratio": 0.12929995357990265, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 0.00017547607421875, + "max_tolerance_ratio": 0.29468032717704773, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": false, + "max_abs": 0.00054931640625, + "max_tolerance_ratio": 1.508561611175537, + "violations": 101, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.30077826976776123, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + }, + "cpu_fp32_vs_fp64": { + "output": { + "passed": true, + "max_abs": 1.52587890625e-05, + "max_tolerance_ratio": 0.06190630421042442, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "x": { + "passed": true, + "max_abs": 1.71661376953125e-05, + "max_tolerance_ratio": 0.06629282981157303, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "temb": { + "passed": true, + "max_abs": 1.33514404296875e-05, + "max_tolerance_ratio": 0.08148636668920517, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "weight": { + "passed": true, + "max_abs": 0.000152587890625, + "max_tolerance_ratio": 0.9329220652580261, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + }, + "bias": { + "passed": true, + "max_abs": 4.57763671875e-05, + "max_tolerance_ratio": 0.16017752885818481, + "violations": 0, + "atol": 0.0001, + "rtol": 0.0001 + } + } + } + ] + } + ], + "environment": { + "torch": "2.13.0+cu130", + "cuda": "13.0", + "gpu": "NVIDIA B200", + "workspace": { + "CUBLAS_WORKSPACE_CONFIG": null, + "CUBLASLT_WORKSPACE_SIZE": null + }, + "tf32": false + }, + "scope": "sample batch BI; final uses S=3 for large B, long S tested separately; shared parameter gradients: same ordered inputs, repeat only", + "packages": { + "torch": "2.13.0", + "triton": "3.7.1", + "diffusers": null, + "vllm": "0.30.0", + "sglang": "0.5.21", + "liger-kernel": "0.8.4", + "transformer_engine": null, + "megatron-core": null, + "megatron-lm-source": "52fbcbc18c2992db1747a4558f430e0519604ad0" + } +} diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/megatron_local-reuse.json b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/megatron_local-reuse.json new file mode 100644 index 000000000..cd332ec71 --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/megatron_local-reuse.json @@ -0,0 +1,4837 @@ +{ + "mode": "megatron_local", + "phase": "reuse", + "accuracy_seed": 0, + "source": { + "base_sha": "55f83d2b9043f41dca84440d9002ca30f5d3fac4", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked_source_sha256": {}, + "workspace_source_sha256": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "qwenimage_source_sha256": { + "csrc/cuda/model_specific/qwenimage/det_linear.cu": "859da456b0c776f3492b3197c252866e33d9a7088508b701b7c4a179ee709afb", + "csrc/cuda/model_specific/qwenimage/token_sum.cu": "1aace24523ff95520ab5d482e2e0f17d09a2efcf93efc8de865c7bcc157cf3ba", + "rl_engine/backends/cuda/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py": "710df5416a2adf5b2576468ff63584b6699e6bdecd59906370049bf09f1b3286", + "rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py": "f6afe4b7568e2026c4b046a4fd0a02589f817d815198af33173d2dba61773f19", + "rl_engine/reference/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py": "1ebc740ddff575055ee66ed714a8c7cc5c6cee2701d582a665289e9ad1a4fe3d", + "rl_engine/reference/model_specific/qwenimage/final_adaln_out.py": "60441610c04d04d0fb1cd7320be8584e76772c110a3cfed77ddf826dbde9b53c", + "benchmarks/models/qwenimage/__init__.py": "a63ebc79ed10d9ed98484565a353438bd13f5801a8f51d7505d0921bf6942742", + "benchmarks/models/qwenimage/adaln_evidence.py": "9dc9f3da0069d36c602baef07d687fb1aeba8fda0163d17fc446e0a543fe1f3e", + "benchmarks/models/qwenimage/adaln_parameter_screen.py": "05562ef30d09296c2ccd1cdeb44085568b8c877d01f5fb1df4b983e84945ec03", + "benchmarks/models/qwenimage/adaln_prior_art.py": "647aa9fc81e02bf3c7806ed6c2a3e578fb3e1a0b000b4388a12367ef86de3139", + "benchmarks/models/qwenimage/adaln_reuse_bi_audit.py": "88dd3d390e647bbc883b76622309fad54dac3618630dcca0785e555db329a671", + "benchmarks/models/qwenimage/adaln_reuse_candidate.py": "4598f6db94462ac30f3bdd3defae16f0ce7a34ac59eb1996d18e86f498c029b6", + "benchmarks/models/qwenimage/plot_adaln_audit.py": "6151e6abccca8f647c2fbeadf92f12e43ed1c07954db9f2db2f035284cbd407c", + "benchmarks/models/qwenimage/plot_adaln_evidence.py": "16d6bed0ee5b808814c5f7157145a730750d0b1aaf94762e6f72a256e942c1e2", + "benchmarks/models/qwenimage/streams.py": "bd27383eee59404df295f724f6c7d620db3d3d7074c19dd94d51a711b38acf02", + "benchmarks/models/qwenimage/validate_adaln_repair.py": "8b663191323b455470a2313cdfefd837657441b300ffd0e0767453f9f407db03" + }, + "extension_sha256": "5d1054db8bba2eaedbd391d0c23b6683acea9ed04fcd64d6f369faed75aa9e0f", + "clean_commit": true + }, + "cases": [ + { + "stream": "image", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 0.0007102272727272727, + "temb": 0.0013375396742077623, + "weight": 0.0031093047650859887, + "bias": 0.002188183807439825 + }, + "repeat_all_gradients": { + "output": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.15196800231933594, + 0.14239999651908875, + 0.1382399946451187, + 0.13894400000572205, + 0.13993600010871887, + 0.1422400027513504, + 0.1367039978504181, + 0.1382720023393631, + 0.14502400159835815, + 0.14163200557231903 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.14078400284051895 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 2.1932480335235596, + 2.249023914337158, + 2.2003519535064697, + 2.202303886413574, + 2.1856319904327393, + 2.22377610206604, + 2.1875200271606445, + 2.2412478923797607, + 2.1847360134124756, + 2.1724801063537598 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 2.1967999935150146 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 2.3642239570617676, + 2.3901119232177734, + 2.3608319759368896, + 2.424031972885132, + 2.385632038116455, + 2.2799038887023926, + 2.3678719997406006, + 2.420383930206299, + 2.3939199447631836, + 2.4099199771881104 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 2.3878719806671143 + } + }, + "peak_increment_bytes": { + "megatron_local": 339904512 + } + } + }, + { + "batch": 3, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.13814400136470795, + 0.13699199259281158, + 0.1329919993877411, + 0.13302400708198547, + 0.1327040046453476, + 0.1351040005683899, + 0.1340160071849823, + 0.1321599930524826, + 0.13609600067138672, + 0.13289600610733032 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.1335200071334839 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 2.2233920097351074, + 2.1636478900909424, + 2.1962239742279053, + 2.199007987976074, + 2.1625919342041016, + 2.162623882293701, + 2.1910719871520996, + 2.1634559631347656, + 2.1786880493164062, + 2.1640000343322754 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 2.171344041824341 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 2.3384320735931396, + 2.3875839710235596, + 2.3011839389801025, + 2.2432000637054443, + 2.217344045639038, + 2.369856119155884, + 2.345439910888672, + 2.3457279205322266, + 2.339008092880249, + 2.356287956237793 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 2.3422240018844604 + } + }, + "peak_increment_bytes": { + "megatron_local": 340236288 + } + } + }, + { + "batch": 256, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.11558400094509125, + 0.10976000130176544, + 0.10627199709415436, + 0.10473600029945374, + 0.10630399733781815, + 0.10384000092744827, + 0.10329599678516388, + 0.10502400249242783, + 0.10422399640083313, + 0.10441599786281586 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.10488000139594078 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 2.6800639629364014, + 2.6541759967803955, + 2.7142720222473145, + 2.6452479362487793, + 2.6578879356384277, + 2.691648006439209, + 2.6322240829467773, + 2.619296073913574, + 2.6460800170898438, + 2.63919997215271 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 2.6501280069351196 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 2.850399971008301, + 2.820352077484131, + 2.837376117706299, + 2.7407679557800293, + 2.864255905151367, + 2.8208959102630615, + 2.8230719566345215, + 2.830591917037964, + 2.816351890563965, + 2.8126399517059326 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 2.8219839334487915 + } + }, + "peak_increment_bytes": { + "megatron_local": 382205952 + } + } + }, + { + "batch": 2048, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.4423680007457733, + 0.43910399079322815, + 0.43750399351119995, + 0.43667200207710266, + 0.4368320107460022, + 0.43404799699783325, + 0.4344640076160431, + 0.43324801325798035, + 0.4307839870452881, + 0.434143990278244 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.4355680048465729 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 9.609600067138672, + 9.61023998260498, + 9.609408378601074, + 9.605504035949707, + 9.62451171875, + 9.597439765930176, + 9.591232299804688, + 9.624896049499512, + 9.677311897277832, + 9.609408378601074 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 9.609504222869873 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 9.947999954223633, + 9.949503898620605, + 9.944479942321777, + 9.891807556152344, + 9.861920356750488, + 9.944160461425781, + 9.940799713134766, + 9.943743705749512, + 9.942784309387207, + 9.946271896362305 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 9.943952083587646 + } + }, + "peak_increment_bytes": { + "megatron_local": 679477248 + } + } + } + ] + }, + { + "stream": "image", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 1.5183194788849913e-06, + "temb": 1.8327359852933242e-06, + "weight": 1.2601489105323987e-07, + "bias": 5.007435123128072e-08 + }, + "repeat_all_gradients": { + "output": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.794975996017456, + 0.7889599800109863, + 0.7904319763183594, + 0.7931200265884399, + 0.7924799919128418, + 0.7843199968338013, + 0.7842879891395569, + 0.7845119833946228, + 0.7838079929351807, + 0.781823992729187 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.7867359817028046 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 2.0563199520111084, + 2.0558719635009766, + 2.086944103240967, + 2.035583972930908, + 2.0583040714263916, + 2.0854079723358154, + 2.107743978500366, + 2.108736038208008, + 2.119231939315796, + 2.1291840076446533 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 2.086176037788391 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 2.6429760456085205, + 2.6456639766693115, + 2.6443839073181152, + 2.640511989593506, + 2.645695924758911, + 2.573535919189453, + 2.561055898666382, + 2.5514559745788574, + 2.644479990005493, + 2.640608072280884 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 2.641792058944702 + } + }, + "peak_increment_bytes": { + "megatron_local": 226775040 + } + } + }, + { + "batch": 3, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.8006399869918823, + 0.7973759770393372, + 0.7947199940681458, + 0.7968000173568726, + 0.7953600287437439, + 0.7955840229988098, + 0.7936639785766602, + 0.7982400059700012, + 0.7968320250511169, + 0.800000011920929 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.7968160212039948 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 2.019871950149536, + 2.041696071624756, + 2.0963199138641357, + 2.01580810546875, + 2.033951997756958, + 2.024991989135742, + 2.021728038787842, + 2.047327995300293, + 2.0582399368286133, + 2.111743927001953 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 2.037824034690857 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 2.633471965789795, + 2.627392053604126, + 2.62662410736084, + 2.640223979949951, + 2.62556791305542, + 2.562527894973755, + 2.550719976425171, + 2.5429439544677734, + 2.638751983642578, + 2.6308159828186035 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 2.627008080482483 + } + }, + "peak_increment_bytes": { + "megatron_local": 227192832 + } + } + }, + { + "batch": 256, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 1.534783959388733, + 1.5287679433822632, + 1.528607964515686, + 1.5295360088348389, + 1.523743987083435, + 1.5284479856491089, + 1.5247679948806763, + 1.5243840217590332, + 1.5257600545883179, + 1.5269440412521362 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 1.5276960134506226 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 2.5078399181365967, + 2.4992001056671143, + 2.5581440925598145, + 2.489664077758789, + 2.583199977874756, + 2.5511679649353027, + 2.4797439575195312, + 2.4990079402923584, + 2.5533440113067627, + 2.5327680110931396 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 2.520303964614868 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 3.8252480030059814, + 3.8259520530700684, + 3.76364803314209, + 3.746943950653076, + 3.737663984298706, + 3.827807903289795, + 3.826335906982422, + 3.824831962585449, + 3.825984001159668, + 3.8273279666900635 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 3.825600028038025 + } + }, + "peak_increment_bytes": { + "megatron_local": 280043520 + } + } + }, + { + "batch": 2048, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 11.858176231384277, + 11.854911804199219, + 11.858880043029785, + 11.855936050415039, + 11.858048439025879, + 11.85654354095459, + 11.852800369262695, + 11.85097599029541, + 11.847807884216309, + 11.85478401184082 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 11.855423927307129 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 9.3722562789917, + 9.410880088806152, + 9.43945598602295, + 9.372159957885742, + 9.374943733215332, + 9.400863647460938, + 9.389280319213867, + 9.348832130432129, + 9.370559692382812, + 9.37827205657959 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 9.376607894897461 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 21.044160842895508, + 21.04140853881836, + 21.038816452026367, + 20.975263595581055, + 20.965152740478516, + 21.034624099731445, + 21.047712326049805, + 21.046016693115234, + 21.037887573242188, + 20.980192184448242 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 21.038352012634277 + } + }, + "peak_increment_bytes": { + "megatron_local": 739320832 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 0.0009765625, + "temb": 0.0019412816630083021, + "weight": 0.0031093047650859887, + "bias": 0.002188183807439825 + }, + "repeat_all_gradients": { + "output": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.13849599659442902, + 0.1420159935951233, + 0.13308799266815186, + 0.13331200182437897, + 0.1340160071849823, + 0.13417600095272064, + 0.13155199587345123, + 0.13235199451446533, + 0.13315199315547943, + 0.13206399977207184 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.1332319974899292 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 2.1935040950775146, + 2.2079999446868896, + 2.2017600536346436, + 2.168191909790039, + 2.185663938522339, + 2.225759983062744, + 2.2596800327301025, + 2.2215359210968018, + 2.188607931137085, + 2.21014404296875 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 2.2048799991607666 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 2.257280111312866, + 2.4184958934783936, + 2.409152030944824, + 2.4005439281463623, + 2.4325759410858154, + 2.3768320083618164, + 2.4203200340270996, + 2.3745601177215576, + 2.3800320625305176, + 2.388000011444092 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 2.394271969795227 + } + }, + "peak_increment_bytes": { + "megatron_local": 339904512 + } + } + }, + { + "batch": 3, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.13920000195503235, + 0.1364160031080246, + 0.1342719942331314, + 0.13462400436401367, + 0.13155199587345123, + 0.13449600338935852, + 0.1329919993877411, + 0.13235199451446533, + 0.13500800728797913, + 0.14057600498199463 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.1345600038766861 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 2.171488046646118, + 2.1819839477539062, + 2.163935899734497, + 2.2007360458374023, + 2.1701760292053223, + 2.1485440731048584, + 2.171168088912964, + 2.17193603515625, + 2.1600639820098877, + 2.19267201423645 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 2.171328067779541 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 2.35152006149292, + 2.269792079925537, + 2.2277441024780273, + 2.2136640548706055, + 2.370784044265747, + 2.4137918949127197, + 2.3494720458984375, + 2.3356480598449707, + 2.356895923614502, + 2.256351947784424 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 2.342560052871704 + } + }, + "peak_increment_bytes": { + "megatron_local": 340236288 + } + } + }, + { + "batch": 256, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.10937599837779999, + 0.11168000102043152, + 0.10454399883747101, + 0.10416000336408615, + 0.10339199751615524, + 0.10371199995279312, + 0.10300800204277039, + 0.10540799796581268, + 0.10438399761915207, + 0.10400000214576721 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.10427200049161911 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 2.7143359184265137, + 2.649343967437744, + 2.652479887008667, + 2.630784034729004, + 2.694432020187378, + 2.6885440349578857, + 2.6164159774780273, + 2.707456111907959, + 2.64467191696167, + 2.6874239444732666 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 2.669951915740967 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 2.8187520503997803, + 2.8814079761505127, + 2.8186559677124023, + 2.848479986190796, + 2.823967933654785, + 2.8859519958496094, + 2.731231927871704, + 2.701184034347534, + 2.8230719566345215, + 2.865600109100342 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 2.8235199451446533 + } + }, + "peak_increment_bytes": { + "megatron_local": 382205952 + } + } + }, + { + "batch": 2048, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.44064000248908997, + 0.4373759925365448, + 0.43772798776626587, + 0.43641600012779236, + 0.43433600664138794, + 0.43507200479507446, + 0.43356800079345703, + 0.43696001172065735, + 0.4343999922275543, + 0.4330559968948364 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.4357440024614334 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 9.623167991638184, + 9.649951934814453, + 9.616448402404785, + 9.63379192352295, + 9.617152214050293, + 9.644479751586914, + 9.589247703552246, + 9.623968124389648, + 9.610943794250488, + 9.607775688171387 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 9.620160102844238 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 9.951935768127441, + 9.947839736938477, + 9.953472137451172, + 9.948351860046387, + 9.950912475585938, + 9.950719833374023, + 9.948415756225586, + 9.950592041015625, + 9.956671714782715, + 9.890591621398926 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 9.950655937194824 + } + }, + "peak_increment_bytes": { + "megatron_local": 679477248 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 1.2188368681386174e-06, + "temb": 4.465900779879222e-06, + "weight": 1.2601489105323987e-07, + "bias": 5.007435123128072e-08 + }, + "repeat_all_gradients": { + "output": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.7870079874992371, + 0.7898880243301392, + 0.7861440181732178, + 0.7848640084266663, + 0.7859519720077515, + 0.784991979598999, + 0.7845759987831116, + 0.7815999984741211, + 0.7845439910888672, + 0.7803840041160583 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.7849279940128326 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 2.0491199493408203, + 2.097599983215332, + 2.0456318855285645, + 2.0497920513153076, + 2.074944019317627, + 2.02892804145813, + 2.0506880283355713, + 2.046463966369629, + 2.045759916305542, + 2.110111951828003 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 2.049456000328064 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 2.6392319202423096, + 2.573728084564209, + 2.564608097076416, + 2.642143964767456, + 2.6476480960845947, + 2.6458559036254883, + 2.639008045196533, + 2.642688035964966, + 2.643199920654297, + 2.645375967025757 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 2.642416000366211 + } + }, + "peak_increment_bytes": { + "megatron_local": 226775040 + } + } + }, + { + "batch": 3, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.8029760122299194, + 0.8000320196151733, + 0.7957760095596313, + 0.7947520017623901, + 0.7940160036087036, + 0.7948799729347229, + 0.7943680286407471, + 0.796671986579895, + 0.7938240170478821, + 0.7958080172538757 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.7953279912471771 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 2.023519992828369, + 2.0191359519958496, + 2.025599956512451, + 2.0513598918914795, + 1.995519995689392, + 2.0213119983673096, + 2.0866880416870117, + 2.0672640800476074, + 2.0215680599212646, + 2.023871898651123 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 2.023695945739746 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 2.56496000289917, + 2.546175956726074, + 2.538975954055786, + 2.628704071044922, + 2.6283199787139893, + 2.628959894180298, + 2.6277120113372803, + 2.628511905670166, + 2.56329607963562, + 2.6333439350128174 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 2.6280159950256348 + } + }, + "peak_increment_bytes": { + "megatron_local": 227192832 + } + } + }, + { + "batch": 256, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 1.530784010887146, + 1.5263359546661377, + 1.5248960256576538, + 1.526528000831604, + 1.524672031402588, + 1.523967981338501, + 1.525696039199829, + 1.5251519680023193, + 1.5266879796981812, + 1.5242559909820557 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 1.5254240036010742 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 2.501408100128174, + 2.5283520221710205, + 2.494431972503662, + 2.56713604927063, + 2.5595200061798096, + 2.512511968612671, + 2.4872961044311523, + 2.547168016433716, + 2.487679958343506, + 2.546207904815674 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 2.5204319953918457 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 3.824863910675049, + 3.758784055709839, + 3.744704008102417, + 3.827008008956909, + 3.8231680393218994, + 3.8267199993133545, + 3.8299520015716553, + 3.8226239681243896, + 3.8278400897979736, + 3.8263680934906006 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 3.8256160020828247 + } + }, + "peak_increment_bytes": { + "megatron_local": 280043520 + } + } + }, + { + "batch": 2048, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 11.86518383026123, + 11.860320091247559, + 11.855936050415039, + 11.853919982910156, + 11.857343673706055, + 11.854880332946777, + 11.857312202453613, + 11.851648330688477, + 11.850560188293457, + 11.85580825805664 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 11.85587215423584 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 9.37007999420166, + 9.370559692382812, + 9.411423683166504, + 9.375007629394531, + 9.403008460998535, + 9.444128036499023, + 9.376992225646973, + 9.341376304626465, + 9.373696327209473, + 9.364480018615723 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 9.374351978302002 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 20.98633575439453, + 20.960832595825195, + 20.95465660095215, + 21.0435848236084, + 21.036575317382812, + 21.038463592529297, + 21.039968490600586, + 21.030719757080078, + 21.037792205810547, + 20.982656478881836 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 21.033647537231445 + } + }, + "peak_increment_bytes": { + "megatron_local": 739320832 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 0.0003078817733990148, + "x": 0.003379820097165924, + "temb": 0.005712340593293303, + "weight": 0.00517754451340496, + "bias": 0.0040532119374307955 + }, + "repeat_all_gradients": { + "output": true, + "x": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 33, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.14211200177669525, + 0.13660800457000732, + 0.13699199259281158, + 0.13286399841308594, + 0.12863999605178833, + 0.13519999384880066, + 0.1369280070066452, + 0.13155199587345123, + 0.13120000064373016, + 0.1276479959487915 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.1340319961309433 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 1.137503981590271, + 1.1026240587234497, + 1.1484800577163696, + 1.1651519536972046, + 1.0951999425888062, + 1.0996160507202148, + 1.0980160236358643, + 1.0915839672088623, + 1.1339199542999268, + 1.0973759889602661 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 1.1011200547218323 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 1.3984960317611694, + 1.4059840440750122, + 1.4165120124816895, + 1.436576008796692, + 1.3961600065231323, + 1.441856026649475, + 1.4093760251998901, + 1.2391680479049683, + 1.3231359720230103, + 1.3040319681167603 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 1.4022400379180908 + } + }, + "peak_increment_bytes": { + "megatron_local": 113909760 + } + } + }, + { + "batch": 2, + "sequence": 4096, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.38707199692726135, + 0.38019201159477234, + 0.37881600856781006, + 0.37379199266433716, + 0.380511999130249, + 0.3834879994392395, + 0.3763839900493622, + 0.3782399892807007, + 0.37376001477241516, + 0.374783992767334 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.37852799892425537 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 1.2345279455184937, + 1.2112640142440796, + 1.2142399549484253, + 1.2212799787521362, + 1.235327959060669, + 1.1198400259017944, + 1.2151039838790894, + 1.2221759557724, + 1.2119359970092773, + 1.2157119512557983 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 1.2154079675674438 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 1.4164799451828003, + 1.4142400026321411, + 1.5497599840164185, + 1.4865920543670654, + 1.511296033859253, + 1.5774400234222412, + 1.5040960311889648, + 1.5274879932403564, + 1.5281599760055542, + 1.508255958557129 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 1.509775996208191 + } + }, + "peak_increment_bytes": { + "megatron_local": 509723136 + } + } + }, + { + "batch": 1, + "sequence": 6889, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.31811198592185974, + 0.32422399520874023, + 0.3155519962310791, + 0.31753599643707275, + 0.31747201085090637, + 0.31299200654029846, + 0.31731200218200684, + 0.3128640055656433, + 0.31808000802993774, + 0.31382399797439575 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.3173920065164566 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 1.244928002357483, + 1.178272008895874, + 1.2359039783477783, + 1.1965759992599487, + 1.1738239526748657, + 1.1761599779129028, + 1.2244800329208374, + 1.2379839420318604, + 1.1944960355758667, + 1.177791953086853 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 1.1955360174179077 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 1.4250240325927734, + 1.4268800020217896, + 1.3439040184020996, + 1.490880012512207, + 1.4839040040969849, + 1.515552043914795, + 1.4807039499282837, + 1.493056058883667, + 1.4894720315933228, + 1.499616026878357 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 1.4866880178451538 + } + }, + "peak_increment_bytes": { + "megatron_local": 452076032 + } + } + }, + { + "batch": 1, + "sequence": 6032, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.29395198822021484, + 0.2884800136089325, + 0.286655992269516, + 0.28467199206352234, + 0.2882879972457886, + 0.2922239899635315, + 0.28601598739624023, + 0.28838399052619934, + 0.2852480113506317, + 0.2852480113506317 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.2874719947576523 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 1.1480640172958374, + 1.15721595287323, + 1.1559679508209229, + 1.0003199577331543, + 1.2019840478897095, + 1.1836479902267456, + 1.153056025505066, + 1.147744059562683, + 1.1450879573822021, + 1.1489280462265015 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 1.1509920358657837 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 1.4526079893112183, + 1.453376054763794, + 1.4442239999771118, + 1.458016037940979, + 1.4534399509429932, + 1.5258879661560059, + 1.4434560537338257, + 1.465824007987976, + 1.3315839767456055, + 1.6161600351333618 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 1.4534080028533936 + } + }, + "peak_increment_bytes": { + "megatron_local": 408920576 + } + } + }, + { + "batch": 256, + "sequence": 3, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.17132799327373505, + 0.1273919939994812, + 0.12303999811410904, + 0.12240000069141388, + 0.11952000111341476, + 0.12019199877977371, + 0.12831999361515045, + 0.11952000111341476, + 0.1189119964838028, + 0.1196800023317337 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.1212959997355938 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 1.317952036857605, + 1.2605760097503662, + 1.3144639730453491, + 1.3067200183868408, + 1.2945280075073242, + 1.2567039728164673, + 1.3262079954147339, + 1.3373759984970093, + 1.2691199779510498, + 1.3539199829101562 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 1.310591995716095 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 1.5748480558395386, + 1.6016000509262085, + 1.4994239807128906, + 1.422592043876648, + 1.5614399909973145, + 1.587231993675232, + 1.5635839700698853, + 1.5574719905853271, + 1.6168320178985596, + 1.3474559783935547 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 1.5625119805335999 + } + }, + "peak_increment_bytes": { + "megatron_local": 141557760 + } + } + }, + { + "batch": 2048, + "sequence": 3, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.4070720076560974, + 0.41100800037384033, + 0.40169599652290344, + 0.4023039937019348, + 0.40761598944664, + 0.40067198872566223, + 0.4015679955482483, + 0.4060159921646118, + 0.4044159948825836, + 0.39881598949432373 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.4033599942922592 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 3.7034881114959717, + 3.7162880897521973, + 3.709280014038086, + 3.732480049133301, + 3.6970880031585693, + 3.693887948989868, + 3.729151964187622, + 3.7197439670562744, + 3.7120320796966553, + 3.749567985534668 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 3.7141600847244263 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 3.9988479614257812, + 4.014527797698975, + 4.005760192871094, + 4.0568318367004395, + 4.00275182723999, + 3.998784065246582, + 4.006271839141846, + 4.000959873199463, + 4.011295795440674, + 3.9463999271392822 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 4.004256010055542 + } + }, + "peak_increment_bytes": { + "megatron_local": 364929536 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.float32", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 1.050487715183967e-06, + "x": 9.988318586171006e-07, + "temb": 2.535181130127741e-06, + "weight": 1.611449087501953e-07, + "bias": 1.037766860497995e-07 + }, + "repeat_all_gradients": { + "output": true, + "x": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 33, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.7878720164299011, + 0.7839040160179138, + 0.7810559868812561, + 0.7804800271987915, + 0.7818880081176758, + 0.7833600044250488, + 0.7825919985771179, + 0.781440019607544, + 0.7785919904708862, + 0.7811200022697449 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.7816640138626099 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 1.0773760080337524, + 1.0430400371551514, + 1.0448640584945679, + 1.097983956336975, + 1.054144024848938, + 1.1066559553146362, + 1.048799991607666, + 1.0528000593185425, + 1.0479999780654907, + 1.0823999643325806 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 1.0534720420837402 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 1.5145920515060425, + 1.5312319993972778, + 1.5200639963150024, + 1.5216959714889526, + 1.5414719581604004, + 1.5200320482254028, + 1.527232050895691, + 1.5234559774398804, + 1.5155839920043945, + 1.5206079483032227 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 1.5211519598960876 + } + }, + "peak_increment_bytes": { + "megatron_local": 76824576 + } + } + }, + { + "batch": 2, + "sequence": 4096, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.989408016204834, + 0.9835839867591858, + 0.9828479886054993, + 0.9822720289230347, + 0.9810879826545715, + 0.982047975063324, + 0.9824640154838562, + 0.97980797290802, + 0.9815679788589478, + 0.9769920110702515 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.9821600019931793 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 1.1196800470352173, + 1.0643839836120605, + 1.1159679889678955, + 1.0860799551010132, + 1.0767680406570435, + 1.0512319803237915, + 1.0704959630966187, + 1.0831680297851562, + 1.0721919536590576, + 1.072864055633545 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 1.0748160481452942 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 1.9340159893035889, + 1.9264960289001465, + 1.9268800020217896, + 1.9348160028457642, + 1.8766080141067505, + 1.9272639751434326, + 1.9309760332107544, + 1.928223967552185, + 1.9296319484710693, + 1.9279680252075195 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 1.9280959963798523 + } + }, + "peak_increment_bytes": { + "megatron_local": 660767232 + } + } + }, + { + "batch": 1, + "sequence": 6889, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.9196799993515015, + 0.9193599820137024, + 0.9165440201759338, + 0.9158719778060913, + 0.9194880127906799, + 0.9172160029411316, + 0.916159987449646, + 0.9186879992485046, + 0.9160320162773132, + 0.9175040125846863 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.9173600077629089 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 1.074463963508606, + 1.062880039215088, + 1.0536320209503174, + 1.1097919940948486, + 1.094912052154541, + 1.0438079833984375, + 1.0985280275344849, + 1.1105600595474243, + 1.0604480504989624, + 1.114527940750122 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 1.0846880078315735 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 1.8428800106048584, + 1.8478399515151978, + 1.8445760011672974, + 1.8475199937820435, + 1.8430399894714355, + 1.860640048980713, + 1.8440320491790771, + 1.8447999954223633, + 1.8485759496688843, + 1.8452160358428955 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 1.8450080156326294 + } + }, + "peak_increment_bytes": { + "megatron_local": 579078656 + } + } + }, + { + "batch": 1, + "sequence": 6032, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.9099839925765991, + 0.9049599766731262, + 0.8991039991378784, + 0.9041600227355957, + 0.9009600281715393, + 0.9008640050888062, + 0.8991039991378784, + 0.90665602684021, + 0.9019200205802917, + 0.9013760089874268 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.9016480147838593 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 1.0533440113067627, + 1.057055950164795, + 1.0536320209503174, + 1.096511960029602, + 1.1428159475326538, + 1.133471965789795, + 1.0354559421539307, + 1.0756800174713135, + 1.0941439867019653, + 1.0601279735565186 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 1.067903995513916 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 1.7417919635772705, + 1.8024959564208984, + 1.8042240142822266, + 1.806399941444397, + 1.8006080389022827, + 1.8011200428009033, + 1.8057600259780884, + 1.8023040294647217, + 1.8009599447250366, + 1.8008639812469482 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 1.8017120361328125 + } + }, + "peak_increment_bytes": { + "megatron_local": 520126976 + } + } + }, + { + "batch": 256, + "sequence": 3, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 0.8206080198287964, + 0.818015992641449, + 0.8166400194168091, + 0.8139839768409729, + 0.8129919767379761, + 0.8121280074119568, + 0.8149120211601257, + 0.8190079927444458, + 0.8135679960250854, + 0.8143680095672607 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 0.8146400153636932 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 1.2613760232925415, + 1.1993600130081177, + 1.1975040435791016, + 1.25273597240448, + 1.2440639734268188, + 1.2580159902572632, + 1.2672959566116333, + 1.1811200380325317, + 1.2237119674682617, + 1.2107199430465698 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 1.2338879704475403 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 1.7233920097351074, + 1.665727972984314, + 1.7194880247116089, + 1.7213759422302246, + 1.7237440347671509, + 1.7230080366134644, + 1.728063941001892, + 1.7204480171203613, + 1.72160005569458, + 1.6654720306396484 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 1.7214879989624023 + } + }, + "peak_increment_bytes": { + "megatron_local": 125853696 + } + } + }, + { + "batch": 2048, + "sequence": 3, + "measurements": { + "forward": { + "samples_ms": { + "megatron_local": [ + 4.604864120483398, + 4.606175899505615, + 4.604000091552734, + 4.601056098937988, + 4.604351997375488, + 4.606688022613525, + 4.596735954284668, + 4.596640110015869, + 4.597856044769287, + 4.598720073699951 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 4.602528095245361 + } + }, + "backward": { + "samples_ms": { + "megatron_local": [ + 3.584991931915283, + 3.534463882446289, + 3.5620479583740234, + 3.5643839836120605, + 3.588671922683716, + 3.570784091949463, + 3.5248639583587646, + 3.5889599323272705, + 3.523263931274414, + 3.5474560260772705 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 3.563215970993042 + } + }, + "forward_backward": { + "samples_ms": { + "megatron_local": [ + 8.00819206237793, + 7.963840007781982, + 8.012800216674805, + 8.008735656738281, + 8.008447647094727, + 8.01740837097168, + 8.009056091308594, + 7.998688220977783, + 7.953887939453125, + 8.006143569946289 + ] + }, + "order": [ + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ], + [ + "megatron_local" + ] + ], + "median_ms": { + "megatron_local": 8.008319854736328 + } + }, + "peak_increment_bytes": { + "megatron_local": 503341568 + } + } + } + ] + } + ], + "environment": { + "torch": "2.13.0+cu130", + "cuda": "13.0", + "gpu": "NVIDIA B200", + "workspace": { + "CUBLAS_WORKSPACE_CONFIG": null, + "CUBLASLT_WORKSPACE_SIZE": null + }, + "tf32": false + }, + "scope": "sample batch BI; final uses S=3 for large B, long S tested separately; shared parameter gradients: same ordered inputs, repeat only", + "packages": { + "torch": "2.13.0", + "triton": "3.7.1", + "diffusers": null, + "vllm": "0.30.0", + "sglang": "0.5.21", + "liger-kernel": "0.8.4", + "transformer_engine": null, + "megatron-core": null, + "megatron-lm-source": "52fbcbc18c2992db1747a4558f430e0519604ad0" + } +} diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/megatron_local-workload.json b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/megatron_local-workload.json new file mode 100644 index 000000000..d4aed8434 --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/megatron_local-workload.json @@ -0,0 +1,1239 @@ +{ + "mode": "megatron_local", + "phase": "workload", + "accuracy_seed": 0, + "source": { + "base_sha": "55f83d2b9043f41dca84440d9002ca30f5d3fac4", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked_source_sha256": {}, + "workspace_source_sha256": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "qwenimage_source_sha256": { + "csrc/cuda/model_specific/qwenimage/det_linear.cu": "859da456b0c776f3492b3197c252866e33d9a7088508b701b7c4a179ee709afb", + "csrc/cuda/model_specific/qwenimage/token_sum.cu": "1aace24523ff95520ab5d482e2e0f17d09a2efcf93efc8de865c7bcc157cf3ba", + "rl_engine/backends/cuda/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py": "710df5416a2adf5b2576468ff63584b6699e6bdecd59906370049bf09f1b3286", + "rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py": "f6afe4b7568e2026c4b046a4fd0a02589f817d815198af33173d2dba61773f19", + "rl_engine/reference/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py": "1ebc740ddff575055ee66ed714a8c7cc5c6cee2701d582a665289e9ad1a4fe3d", + "rl_engine/reference/model_specific/qwenimage/final_adaln_out.py": "60441610c04d04d0fb1cd7320be8584e76772c110a3cfed77ddf826dbde9b53c", + "benchmarks/models/qwenimage/__init__.py": "a63ebc79ed10d9ed98484565a353438bd13f5801a8f51d7505d0921bf6942742", + "benchmarks/models/qwenimage/adaln_evidence.py": "9dc9f3da0069d36c602baef07d687fb1aeba8fda0163d17fc446e0a543fe1f3e", + "benchmarks/models/qwenimage/adaln_parameter_screen.py": "05562ef30d09296c2ccd1cdeb44085568b8c877d01f5fb1df4b983e84945ec03", + "benchmarks/models/qwenimage/adaln_prior_art.py": "647aa9fc81e02bf3c7806ed6c2a3e578fb3e1a0b000b4388a12367ef86de3139", + "benchmarks/models/qwenimage/adaln_reuse_bi_audit.py": "88dd3d390e647bbc883b76622309fad54dac3618630dcca0785e555db329a671", + "benchmarks/models/qwenimage/adaln_reuse_candidate.py": "4598f6db94462ac30f3bdd3defae16f0ce7a34ac59eb1996d18e86f498c029b6", + "benchmarks/models/qwenimage/plot_adaln_audit.py": "6151e6abccca8f647c2fbeadf92f12e43ed1c07954db9f2db2f035284cbd407c", + "benchmarks/models/qwenimage/plot_adaln_evidence.py": "16d6bed0ee5b808814c5f7157145a730750d0b1aaf94762e6f72a256e942c1e2", + "benchmarks/models/qwenimage/streams.py": "bd27383eee59404df295f724f6c7d620db3d3d7074c19dd94d51a711b38acf02", + "benchmarks/models/qwenimage/validate_adaln_repair.py": "8b663191323b455470a2313cdfefd837657441b300ffd0e0767453f9f407db03" + }, + "extension_sha256": "5d1054db8bba2eaedbd391d0c23b6683acea9ed04fcd64d6f369faed75aa9e0f", + "clean_commit": true + }, + "cases": [ + { + "stream": "image", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + } + ] + }, + { + "stream": "image", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [ + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "temb": 0 + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.float32", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [ + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 0, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 127, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 7, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 64, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 257, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 1024, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + }, + { + "kind": "workload_4096", + "seed": 2026, + "batch": 4096, + "chunk": 2048, + "rows": 4096, + "mismatched_rows": { + "output": 0, + "x": 0, + "temb": 0 + } + } + ] + } + ], + "environment": { + "torch": "2.13.0+cu130", + "cuda": "13.0", + "gpu": "NVIDIA B200", + "workspace": { + "CUBLAS_WORKSPACE_CONFIG": null, + "CUBLASLT_WORKSPACE_SIZE": null + }, + "tf32": false + }, + "scope": "sample batch BI; final uses S=3 for large B, long S tested separately; shared parameter gradients: same ordered inputs, repeat only", + "packages": { + "torch": "2.13.0", + "triton": "3.7.1", + "diffusers": null, + "vllm": "0.30.0", + "sglang": "0.5.21", + "liger-kernel": "0.8.4", + "transformer_engine": null, + "megatron-core": null, + "megatron-lm-source": "52fbcbc18c2992db1747a4558f430e0519604ad0" + } +} diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/native-reuse.json b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/native-reuse.json new file mode 100644 index 000000000..06c85f332 --- /dev/null +++ b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/native-reuse.json @@ -0,0 +1,4836 @@ +{ + "mode": "native", + "phase": "reuse", + "accuracy_seed": 0, + "source": { + "base_sha": "55f83d2b9043f41dca84440d9002ca30f5d3fac4", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked_source_sha256": {}, + "workspace_source_sha256": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "qwenimage_source_sha256": { + "csrc/cuda/model_specific/qwenimage/det_linear.cu": "859da456b0c776f3492b3197c252866e33d9a7088508b701b7c4a179ee709afb", + "csrc/cuda/model_specific/qwenimage/token_sum.cu": "1aace24523ff95520ab5d482e2e0f17d09a2efcf93efc8de865c7bcc157cf3ba", + "rl_engine/backends/cuda/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/backends/cuda/model_specific/qwenimage/adaln_mod_projection.py": "710df5416a2adf5b2576468ff63584b6699e6bdecd59906370049bf09f1b3286", + "rl_engine/backends/cuda/model_specific/qwenimage/final_adaln_out.py": "f6afe4b7568e2026c4b046a4fd0a02589f817d815198af33173d2dba61773f19", + "rl_engine/reference/model_specific/qwenimage/__init__.py": "95c46d40c4aed2d4c26a65bc0cc64331e42b237673293ea5ed45b79ebc11d4b4", + "rl_engine/reference/model_specific/qwenimage/adaln_mod_projection.py": "1ebc740ddff575055ee66ed714a8c7cc5c6cee2701d582a665289e9ad1a4fe3d", + "rl_engine/reference/model_specific/qwenimage/final_adaln_out.py": "60441610c04d04d0fb1cd7320be8584e76772c110a3cfed77ddf826dbde9b53c", + "benchmarks/models/qwenimage/__init__.py": "a63ebc79ed10d9ed98484565a353438bd13f5801a8f51d7505d0921bf6942742", + "benchmarks/models/qwenimage/adaln_evidence.py": "9dc9f3da0069d36c602baef07d687fb1aeba8fda0163d17fc446e0a543fe1f3e", + "benchmarks/models/qwenimage/adaln_parameter_screen.py": "05562ef30d09296c2ccd1cdeb44085568b8c877d01f5fb1df4b983e84945ec03", + "benchmarks/models/qwenimage/adaln_prior_art.py": "647aa9fc81e02bf3c7806ed6c2a3e578fb3e1a0b000b4388a12367ef86de3139", + "benchmarks/models/qwenimage/adaln_reuse_bi_audit.py": "88dd3d390e647bbc883b76622309fad54dac3618630dcca0785e555db329a671", + "benchmarks/models/qwenimage/adaln_reuse_candidate.py": "4598f6db94462ac30f3bdd3defae16f0ce7a34ac59eb1996d18e86f498c029b6", + "benchmarks/models/qwenimage/plot_adaln_audit.py": "6151e6abccca8f647c2fbeadf92f12e43ed1c07954db9f2db2f035284cbd407c", + "benchmarks/models/qwenimage/plot_adaln_evidence.py": "16d6bed0ee5b808814c5f7157145a730750d0b1aaf94762e6f72a256e942c1e2", + "benchmarks/models/qwenimage/streams.py": "bd27383eee59404df295f724f6c7d620db3d3d7074c19dd94d51a711b38acf02", + "benchmarks/models/qwenimage/validate_adaln_repair.py": "8b663191323b455470a2313cdfefd837657441b300ffd0e0767453f9f407db03" + }, + "extension_sha256": "5d1054db8bba2eaedbd391d0c23b6683acea9ed04fcd64d6f369faed75aa9e0f", + "clean_commit": true + }, + "cases": [ + { + "stream": "image", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 0.0007102272727272727, + "temb": 0.0021352098780145655, + "weight": 0.0031093047650859887, + "bias": 0.002188183807439825 + }, + "repeat_all_gradients": { + "output": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.04198399931192398, + 0.04710400104522705, + 0.04153599962592125, + 0.04262400045990944, + 0.041600000113248825, + 0.04054399952292442, + 0.040192000567913055, + 0.04022400081157684, + 0.04064000025391579, + 0.04182400181889534 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.04156799986958504 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.5046079754829407, + 0.5570880174636841, + 0.3739199936389923, + 0.5084159970283508, + 0.3671039938926697, + 0.37939199805259705, + 0.33907198905944824, + 0.5483840107917786, + 0.5601919889450073, + 0.37049600481987 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.44199998676776886 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.26953598856925964, + 0.59552001953125, + 0.6128640174865723, + 0.6707199811935425, + 0.6569280028343201, + 0.615231990814209, + 0.6075199842453003, + 0.6327679753303528, + 0.4211840033531189, + 0.49750399589538574 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.6101920008659363 + } + }, + "peak_increment_bytes": { + "native": 113369088 + } + } + }, + { + "batch": 3, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.040192000567913055, + 0.039103999733924866, + 0.03929600119590759, + 0.0379519984126091, + 0.03852799907326698, + 0.038656000047922134, + 0.039423998445272446, + 0.03936000168323517, + 0.03776000067591667, + 0.039583999663591385 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.03920000046491623 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.59443199634552, + 0.5743680000305176, + 0.5046079754829407, + 0.3666880130767822, + 0.13145600259304047, + 0.3572799861431122, + 0.5148159861564636, + 0.5980160236358643, + 0.5357120037078857, + 0.5062080025672913 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.5105119943618774 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.48364800214767456, + 0.17721599340438843, + 0.5477120280265808, + 0.673088014125824, + 0.6116480231285095, + 0.6823359727859497, + 0.6620799899101257, + 0.6796159744262695, + 0.623520016670227, + 0.6719679832458496 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.6428000032901764 + } + }, + "peak_increment_bytes": { + "native": 113541120 + } + } + }, + { + "batch": 256, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.04800000041723251, + 0.04662400111556053, + 0.046720001846551895, + 0.04531199857592583, + 0.04598399996757507, + 0.04483199864625931, + 0.0453759990632534, + 0.04614400118589401, + 0.0453759990632534, + 0.04636799916625023 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.04606400057673454 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.49859198927879333, + 0.5481600165367126, + 0.5039680004119873, + 0.5424000024795532, + 0.37196800112724304, + 0.34307199716567993, + 0.3383679986000061, + 0.5492799878120422, + 0.3699840009212494, + 0.4880000054836273 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.4932959973812103 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.4811519980430603, + 0.4278079867362976, + 0.5460799932479858, + 0.7042880058288574, + 0.6521919965744019, + 0.6120319962501526, + 0.734175980091095, + 0.6835520267486572, + 0.6169919967651367, + 0.6154239773750305 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.6162079870700836 + } + }, + "peak_increment_bytes": { + "native": 135303168 + } + } + }, + { + "batch": 2048, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.15193599462509155, + 0.14959999918937683, + 0.14870400726795197, + 0.1483519971370697, + 0.14655999839305878, + 0.1459839940071106, + 0.14499199390411377, + 0.14585599303245544, + 0.14368000626564026, + 0.14287999272346497 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.1462719962000847 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.3600960075855255, + 0.4121919870376587, + 0.3513599932193756, + 0.3803200125694275, + 0.40300801396369934, + 0.353983998298645, + 0.35839998722076416, + 0.3945600092411041, + 0.426144003868103, + 0.3765760064125061 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.3784480094909668 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.6350719928741455, + 0.6425279974937439, + 0.5650560259819031, + 0.6804800033569336, + 0.637503981590271, + 0.6310719847679138, + 0.529312014579773, + 0.54339200258255, + 0.5241280198097229, + 0.6278079748153687 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.6294399797916412 + } + }, + "peak_increment_bytes": { + "native": 449876992 + } + } + } + ] + }, + { + "stream": "image", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.img_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "22ef33e6865806f3e1d2bc137bd1a41510cf0619ed0c85fba35a626cd7bad018", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.img_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "f4d2241820fa1a1895d7136bd5653ae0984a50bf0a0961a312b45e0e393d8218", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 8.676111307914236e-08, + "temb": 3.322163921758796e-07, + "weight": 1.2601489105323987e-07, + "bias": 5.007435123128072e-08 + }, + "repeat_all_gradients": { + "output": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.05753599852323532, + 0.05596800148487091, + 0.05593600124120712, + 0.0560000017285347, + 0.05552000179886818, + 0.05475199967622757, + 0.05644800141453743, + 0.05555199831724167, + 0.05564799904823303, + 0.05510399863123894 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.05579200014472008 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.5093439817428589, + 0.5532159805297852, + 0.5142080187797546, + 0.3336640000343323, + 0.7036479711532593, + 0.38844799995422363, + 0.5634559988975525, + 0.6133440136909485, + 0.5343679785728455, + 0.5026559829711914 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.5242879986763 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.4004479944705963, + 0.6321920156478882, + 0.6094080209732056, + 0.6224640011787415, + 0.5277439951896667, + 0.6019200086593628, + 0.6610879898071289, + 0.6535040140151978, + 0.4763840138912201, + 0.23017600178718567 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.6056640148162842 + } + }, + "peak_increment_bytes": { + "native": 226738176 + } + } + }, + { + "batch": 3, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.11849600076675415, + 0.11062400043010712, + 0.11110399663448334, + 0.10931199789047241, + 0.11126399785280228, + 0.10995200276374817, + 0.10902400314807892, + 0.10947199910879135, + 0.1120000034570694, + 0.10940799862146378 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.11028800159692764 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.5164160132408142, + 0.46505600214004517, + 0.46003198623657227, + 0.4673280119895935, + 0.4633600115776062, + 0.4601280093193054, + 0.5063679814338684, + 0.4891200065612793, + 0.45871999859809875, + 0.2988480031490326 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.4642080068588257 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.4923200011253357, + 0.48745599389076233, + 0.5070080161094666, + 0.49612799286842346, + 0.49427199363708496, + 0.5209919810295105, + 0.3850559890270233, + 0.49375998973846436, + 0.4912639856338501, + 0.5303679704666138 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.49401599168777466 + } + }, + "peak_increment_bytes": { + "native": 227082240 + } + } + }, + { + "batch": 256, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.49907198548316956, + 0.4949440062046051, + 0.49270400404930115, + 0.4941760003566742, + 0.4920960068702698, + 0.4919680058956146, + 0.4934079945087433, + 0.4898880124092102, + 0.4923839867115021, + 0.4923200011253357 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.4925439953804016 + } + }, + "backward": { + "samples_ms": { + "native": [ + 1.416767954826355, + 1.394976019859314, + 1.4375360012054443, + 1.438048005104065, + 1.4488320350646973, + 1.3752959966659546, + 1.4264639616012573, + 1.3794560432434082, + 1.3954880237579346, + 1.4466880559921265 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 1.4216159582138062 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 1.736799955368042, + 1.6776319742202759, + 1.6821759939193726, + 1.734879970550537, + 1.7365119457244873, + 1.7346240282058716, + 1.7418880462646484, + 1.7341439723968506, + 1.732192039489746, + 1.732159972190857 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 1.734384000301361 + } + }, + "peak_increment_bytes": { + "native": 270606336 + } + } + }, + { + "batch": 2048, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 3.7700159549713135, + 3.7693119049072266, + 3.770591974258423, + 3.7720000743865967, + 3.7688961029052734, + 3.771519899368286, + 3.7698240280151367, + 3.7677760124206543, + 3.7712960243225098, + 3.7713279724121094 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 3.770303964614868 + } + }, + "backward": { + "samples_ms": { + "native": [ + 8.053888320922852, + 7.995391845703125, + 7.991903781890869, + 7.99619197845459, + 7.997407913208008, + 7.989952087402344, + 7.994527816772461, + 7.991551876068115, + 7.981664180755615, + 7.989247798919678 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 7.993215799331665 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 11.588128089904785, + 11.612447738647461, + 11.614784240722656, + 11.612288475036621, + 11.612640380859375, + 11.609919548034668, + 11.61251163482666, + 11.610783576965332, + 11.61257553100586, + 11.563167572021484 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 11.612368106842041 + } + }, + "peak_increment_bytes": { + "native": 739320832 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.bfloat16", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 0.0009765625, + "temb": 0.0037906331728412125, + "weight": 0.0031093047650859887, + "bias": 0.002188183807439825 + }, + "repeat_all_gradients": { + "output": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.04064000025391579, + 0.03961599990725517, + 0.040383998304605484, + 0.038336001336574554, + 0.0390079990029335, + 0.03807999938726425, + 0.03836800158023834, + 0.0379519984126091, + 0.037728000432252884, + 0.03811199963092804 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.03835200145840645 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.3524479866027832, + 0.1332480013370514, + 0.12755200266838074, + 0.12518399953842163, + 0.12652799487113953, + 0.12559999525547028, + 0.1287039965391159, + 0.12675200402736664, + 0.12556800246238708, + 0.12675200402736664 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.12675200402736664 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.1578879952430725, + 0.15727999806404114, + 0.15721599757671356, + 0.1590079963207245, + 0.4177600145339966, + 0.4901759922504425, + 0.4729920029640198, + 0.663424015045166, + 0.6105599999427795, + 0.6144000291824341 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.4453760087490082 + } + }, + "peak_increment_bytes": { + "native": 113369088 + } + } + }, + { + "batch": 3, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.04108799993991852, + 0.03977600112557411, + 0.03852799907326698, + 0.03872000053524971, + 0.03920000046491623, + 0.038336001336574554, + 0.037856001406908035, + 0.03824000060558319, + 0.03836800158023834, + 0.039712000638246536 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.03862399980425835 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.4020160138607025, + 0.34092798829078674, + 0.3612479865550995, + 0.32732799649238586, + 0.39161598682403564, + 0.5788159966468811, + 0.5577279925346375, + 0.5173760056495667, + 0.5752639770507812, + 0.36742401123046875 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.3968160003423691 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.555616021156311, + 0.6162880063056946, + 0.6213759779930115, + 0.6295999884605408, + 0.6539199948310852, + 0.6843519806861877, + 0.4954560101032257, + 0.39452800154685974, + 0.3367359936237335, + 0.8245760202407837 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.618831992149353 + } + }, + "peak_increment_bytes": { + "native": 113541120 + } + } + }, + { + "batch": 256, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.047040000557899475, + 0.04739199951291084, + 0.046911999583244324, + 0.045471999794244766, + 0.04438399896025658, + 0.04479999840259552, + 0.0451200008392334, + 0.04652800038456917, + 0.04473600164055824, + 0.046592000871896744 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.04600000008940697 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.5640320181846619, + 0.5774080157279968, + 0.5792959928512573, + 0.5068479776382446, + 0.3670080006122589, + 0.3367680013179779, + 0.3670719861984253, + 0.3471679985523224, + 0.33952000737190247, + 0.33263999223709106 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.3670399934053421 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.5124160051345825, + 0.6222720146179199, + 0.6111680269241333, + 0.6546880006790161, + 0.6116480231285095, + 0.6255679726600647, + 0.4419200122356415, + 0.43935999274253845, + 0.6080319881439209, + 0.6532480120658875 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.6114080250263214 + } + }, + "peak_increment_bytes": { + "native": 135303168 + } + } + }, + { + "batch": 2048, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.15068799257278442, + 0.14793600142002106, + 0.14847999811172485, + 0.14748799800872803, + 0.1457280069589615, + 0.14604799449443817, + 0.1454080045223236, + 0.14560000598430634, + 0.1451839953660965, + 0.1438080072402954 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.14588800072669983 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.5246719717979431, + 0.5296639800071716, + 0.5169600248336792, + 0.5245760083198547, + 0.41948801279067993, + 0.3755199909210205, + 0.5742719769477844, + 0.6116480231285095, + 0.5276479721069336, + 0.5478079915046692 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.5261599719524384 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.6544640064239502, + 0.5291839838027954, + 0.5973439812660217, + 0.5291200280189514, + 0.6318719983100891, + 0.5818880200386047, + 0.6874560117721558, + 0.6334400177001953, + 0.6407359838485718, + 0.5294079780578613 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.6146079897880554 + } + }, + "peak_increment_bytes": { + "native": 449876992 + } + } + } + ] + }, + { + "stream": "text", + "dtype": "torch.float32", + "weights": { + "transformer_blocks.0.txt_mod.1.weight": { + "shape": [ + 18432, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "7fc5615cea51f21640ae26b29e4595fe96295113b1fd31b117664c1b85d360c2", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + }, + "transformer_blocks.0.txt_mod.1.bias": { + "shape": [ + 18432 + ], + "dtype": "torch.bfloat16", + "sha256": "537d4e06e6fe7428a331637871fcf8c9c4899b296b5419e12abb3a3972adfc72", + "shard": "diffusion_pytorch_model-00001-of-00009.safetensors", + "download_etag": "9f33a59093af3abcc2836d4cf4b7bd122c238ca70a26c70f34fdde64646b3bcd" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 1.1891091396474316e-07, + "temb": 6.236398211248578e-07, + "weight": 1.2601489105323987e-07, + "bias": 5.007435123128072e-08 + }, + "repeat_all_gradients": { + "output": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.05817599967122078, + 0.054976001381874084, + 0.05619199946522713, + 0.060095999389886856, + 0.056352000683546066, + 0.0560000017285347, + 0.05558399856090546, + 0.054976001381874084, + 0.05558399856090546, + 0.05526399984955788 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.05579200014472008 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.5370879769325256, + 0.5019199848175049, + 0.3883199989795685, + 0.47017601132392883, + 0.4903999865055084, + 0.5016319751739502, + 0.4918400049209595, + 0.3675520122051239, + 0.5251520276069641, + 0.4923200011253357 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.4920800030231476 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.6302719712257385, + 0.4676159918308258, + 0.5559679865837097, + 0.5907840132713318, + 0.5909439921379089, + 0.6354560256004333, + 0.6024960279464722, + 0.604640007019043, + 0.4398080110549927, + 0.48956799507141113 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.5908640027046204 + } + }, + "peak_increment_bytes": { + "native": 226738176 + } + } + }, + { + "batch": 3, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.11215999722480774, + 0.11161600053310394, + 0.11043199896812439, + 0.11110399663448334, + 0.11116799712181091, + 0.11315199732780457, + 0.11023999750614166, + 0.11030399799346924, + 0.10927999764680862, + 0.11139199882745743 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.11113599687814713 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.5010240077972412, + 0.4675840139389038, + 0.4996800124645233, + 0.297760009765625, + 0.293503999710083, + 0.29414400458335876, + 0.48156800866127014, + 0.4639360010623932, + 0.5203840136528015, + 0.5053120255470276 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.474576011300087 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.5993919968605042, + 0.5920000076293945, + 0.5278400182723999, + 0.6670399904251099, + 0.5961920022964478, + 0.6552960276603699, + 0.66348797082901, + 0.6606720089912415, + 0.49935999512672424, + 0.6182079911231995 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.6087999939918518 + } + }, + "peak_increment_bytes": { + "native": 227082240 + } + } + }, + { + "batch": 256, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.49433600902557373, + 0.4934079945087433, + 0.4930880069732666, + 0.49027198553085327, + 0.48972800374031067, + 0.4904960095882416, + 0.4896639883518219, + 0.4896000027656555, + 0.49027198553085327, + 0.4935680031776428 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.4903839975595474 + } + }, + "backward": { + "samples_ms": { + "native": [ + 1.3891199827194214, + 1.38099205493927, + 1.3952959775924683, + 1.393183946609497, + 1.3969919681549072, + 1.3592959642410278, + 1.3615039587020874, + 1.4209280014038086, + 1.4237120151519775, + 1.403615951538086 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 1.3942399621009827 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 1.730720043182373, + 1.6758079528808594, + 1.6657919883728027, + 1.7348480224609375, + 1.7432639598846436, + 1.686527967453003, + 1.736448049545288, + 1.7151039838790894, + 1.72160005569458, + 1.689471960067749 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 1.7183520197868347 + } + }, + "peak_increment_bytes": { + "native": 270606336 + } + } + }, + { + "batch": 2048, + "sequence": 1, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 3.7695679664611816, + 3.7696640491485596, + 3.7702720165252686, + 3.770495891571045, + 3.770303964614868, + 3.7704639434814453, + 3.7709760665893555, + 3.7685439586639404, + 3.770495891571045, + 3.76908802986145 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 3.7702879905700684 + } + }, + "backward": { + "samples_ms": { + "native": [ + 7.99183988571167, + 8.088704109191895, + 7.978528022766113, + 8.052543640136719, + 8.07481575012207, + 8.015487670898438, + 7.994815826416016, + 7.9923200607299805, + 8.024352073669434, + 8.04371166229248 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 8.019919872283936 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 11.619744300842285, + 11.638751983642578, + 11.613759994506836, + 11.608575820922852, + 11.613280296325684, + 11.616415977478027, + 11.563743591308594, + 11.555423736572266, + 11.548064231872559, + 11.617376327514648 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 11.61352014541626 + } + }, + "peak_increment_bytes": { + "native": 739320832 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.bfloat16", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 0.0003078817733990148, + "x": 0.003379820097165924, + "temb": 0.005905976490849045, + "weight": 0.00517754451340496, + "bias": 0.0040532119374307955 + }, + "repeat_all_gradients": { + "output": true, + "x": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 33, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.0697920024394989, + 0.06812799721956253, + 0.06739199906587601, + 0.06588800251483917, + 0.06451199948787689, + 0.062272001057863235, + 0.06300800293684006, + 0.06249599903821945, + 0.06464000046253204, + 0.061792001128196716 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.06457599997520447 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.20790399610996246, + 0.18636800348758698, + 0.18028800189495087, + 0.46886399388313293, + 0.35628798604011536, + 0.3954879939556122, + 0.5935360193252563, + 0.642848014831543, + 0.609503984451294, + 0.5896959900856018 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.43217599391937256 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.8512319922447205, + 0.8445119857788086, + 0.8587520122528076, + 0.7779840230941772, + 0.8442879915237427, + 0.8240000009536743, + 0.8265920281410217, + 0.8544960021972656, + 0.4398399889469147, + 0.3144640028476715 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.8354400098323822 + } + }, + "peak_increment_bytes": { + "native": 38393856 + } + } + }, + { + "batch": 2, + "sequence": 4096, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.20492799580097198, + 0.20313599705696106, + 0.201664000749588, + 0.20281599462032318, + 0.20057600736618042, + 0.19846400618553162, + 0.19871999323368073, + 0.19859200716018677, + 0.20028799772262573, + 0.19996799528598785 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.20043200254440308 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.5951039791107178, + 0.616703987121582, + 0.6268479824066162, + 0.6695680022239685, + 0.4758400022983551, + 0.26979199051856995, + 0.2687999904155731, + 0.6105599999427795, + 0.6159359812736511, + 0.6371520161628723 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.6132479906082153 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.8745279908180237, + 0.6890239715576172, + 0.47760000824928284, + 0.46000000834465027, + 0.4546560049057007, + 0.6015040278434753, + 0.8150399923324585, + 0.7946239709854126, + 0.8465920090675354, + 0.5984960198402405 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.6452639997005463 + } + }, + "peak_increment_bytes": { + "native": 409059840 + } + } + }, + { + "batch": 1, + "sequence": 6889, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.1589439958333969, + 0.1613440066576004, + 0.15769599378108978, + 0.15219199657440186, + 0.15433600544929504, + 0.1509760022163391, + 0.15334400534629822, + 0.15251199901103973, + 0.15727999806404114, + 0.15078400075435638 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.15384000539779663 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.655456006526947, + 0.6653439998626709, + 0.6470080018043518, + 0.28307199478149414, + 0.5834239721298218, + 0.4763840138912201, + 0.5958399772644043, + 0.6738880276679993, + 0.6165440082550049, + 0.6855999827384949 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.6317760050296783 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.6934720277786255, + 0.7939519882202148, + 0.8138880133628845, + 0.7981759905815125, + 0.7991039752960205, + 0.8240640163421631, + 0.8131200075149536, + 0.864512026309967, + 0.8568639755249023, + 0.9195200204849243 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.8135040104389191 + } + }, + "peak_increment_bytes": { + "native": 367424000 + } + } + }, + { + "batch": 1, + "sequence": 6032, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.14236800372600555, + 0.13763199746608734, + 0.14003199338912964, + 0.1401280015707016, + 0.13705599308013916, + 0.1364160031080246, + 0.13699199259281158, + 0.13600000739097595, + 0.1372479945421219, + 0.13648000359535217 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.13715199381113052 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.6765760183334351, + 0.6668480038642883, + 0.5938559770584106, + 0.47628799080848694, + 0.583296000957489, + 0.6234560012817383, + 0.5867519974708557, + 0.598688006401062, + 0.6045759916305542, + 0.6155200004577637 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.6016319990158081 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.3797760009765625, + 0.36320000886917114, + 0.6598079800605774, + 0.8129919767379761, + 0.8540800213813782, + 0.7931519746780396, + 0.8393599987030029, + 0.9102720022201538, + 0.8149759769439697, + 0.7451840043067932 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.8030719757080078 + } + }, + "peak_increment_bytes": { + "native": 334799360 + } + } + }, + { + "batch": 256, + "sequence": 3, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.0708480030298233, + 0.07382400333881378, + 0.0655680000782013, + 0.06691200286149979, + 0.0663679987192154, + 0.06444799900054932, + 0.06464000046253204, + 0.06531199812889099, + 0.06623999774456024, + 0.06524799764156342 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.06590399891138077 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.3630400002002716, + 0.6403840184211731, + 0.6593599915504456, + 0.620959997177124, + 0.39004799723625183, + 0.5922880172729492, + 0.5936319828033447, + 0.6093119978904724, + 0.6713280081748962, + 0.6509119868278503 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.6151359975337982 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.670527994632721, + 0.7145599722862244, + 0.855135977268219, + 0.8852159976959229, + 0.8127359747886658, + 0.8059840202331543, + 0.8575680255889893, + 0.7927039861679077, + 0.7867199778556824, + 0.6725760102272034 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.799344003200531 + } + }, + "peak_increment_bytes": { + "native": 58208256 + } + } + }, + { + "batch": 2048, + "sequence": 3, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.2269439995288849, + 0.22444799542427063, + 0.22291199862957, + 0.22252799570560455, + 0.22339199483394623, + 0.22012799978256226, + 0.22217600047588348, + 0.22086399793624878, + 0.22022399306297302, + 0.21935999393463135 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.22235199809074402 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.610912024974823, + 0.6024640202522278, + 0.6016960144042969, + 0.6225280165672302, + 0.6119999885559082, + 0.35308799147605896, + 0.3479999899864197, + 0.4127359986305237, + 0.6046720147132874, + 0.6130239963531494 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.6035680174827576 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.8578879833221436, + 0.7951040267944336, + 0.7648959755897522, + 0.5670080184936523, + 0.5590400099754333, + 0.5549119710922241, + 0.8175680041313171, + 0.9151679873466492, + 0.8471999764442444, + 0.6121919751167297 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.7800000011920929 + } + }, + "peak_increment_bytes": { + "native": 302002688 + } + } + } + ] + }, + { + "stream": "final", + "dtype": "torch.float32", + "weights": { + "norm_out.linear.weight": { + "shape": [ + 6144, + 3072 + ], + "dtype": "torch.bfloat16", + "sha256": "613ffb1bfa5aeedcf38208f87ca420212706c6f4c6f527de1a6bab58e36c2afb", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + }, + "norm_out.linear.bias": { + "shape": [ + 6144 + ], + "dtype": "torch.bfloat16", + "sha256": "06ef4a795107a9dd4bcb5ab387a63291fd934ea8e31ecb2a87c98fb0628c13fd", + "shard": "diffusion_pytorch_model-00009-of-00009.safetensors", + "download_etag": "ae0fef149890f61d54572baa1e806de97156c7ec5b7bbbbbbf27a2d87f33af61" + } + }, + "checks": [], + "fp64_relative_max_error": { + "output": 1.8758709199713696e-07, + "x": 1.9721238386445903e-07, + "temb": 5.966017103545143e-07, + "weight": 1.611449087501953e-07, + "bias": 1.037766860497995e-07 + }, + "repeat_all_gradients": { + "output": true, + "x": true, + "temb": true, + "weight": true, + "bias": true + }, + "performance": [ + { + "batch": 1, + "sequence": 33, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.06406400352716446, + 0.06220800057053566, + 0.06038400158286095, + 0.060095999389886856, + 0.05878400057554245, + 0.05920000001788139, + 0.05894400179386139, + 0.06614399701356888, + 0.059039998799562454, + 0.05910399928689003 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.059647999703884125 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.20070399343967438, + 0.1860480010509491, + 0.17868800461292267, + 0.5140799880027771, + 0.19340799748897552, + 0.18531200289726257, + 0.3777279853820801, + 0.42851200699806213, + 0.4142720103263855, + 0.4456639885902405 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.28921598941087723 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.8213440179824829, + 0.7824640274047852, + 0.8021759986877441, + 0.7923200130462646, + 0.8128319978713989, + 0.7810559868812561, + 0.7827200293540955, + 0.8122879862785339, + 0.7006400227546692, + 0.5930240154266357 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.78752002120018 + } + }, + "peak_increment_bytes": { + "native": 76787712 + } + } + }, + { + "batch": 2, + "sequence": 4096, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.25283199548721313, + 0.25299200415611267, + 0.2517760097980499, + 0.2529279887676239, + 0.25091201066970825, + 0.2511039972305298, + 0.2521919906139374, + 0.2502399981021881, + 0.24966399371623993, + 0.25068798661231995 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.25144000351428986 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.635424017906189, + 0.6772480010986328, + 0.6769279837608337, + 0.6834239959716797, + 0.5605120062828064, + 0.38579198718070984, + 0.6123200058937073, + 0.6308479905128479, + 0.6206719875335693, + 0.6666560173034668 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.6331360042095184 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.8401600122451782, + 0.6725119948387146, + 0.9625279903411865, + 0.8326719999313354, + 0.8553599715232849, + 0.7927039861679077, + 0.8041920065879822, + 0.824288010597229, + 0.865119993686676, + 0.8947839736938477 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.8364160060882568 + } + }, + "peak_increment_bytes": { + "native": 660767232 + } + } + }, + { + "batch": 1, + "sequence": 6889, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.20531199872493744, + 0.20336000621318817, + 0.20127999782562256, + 0.20313599705696106, + 0.2032639980316162, + 0.2019840031862259, + 0.2030079960823059, + 0.20099200308322906, + 0.2024639993906021, + 0.23849600553512573 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.20307199656963348 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.601472020149231, + 0.6022719740867615, + 0.6593919992446899, + 0.5531200170516968, + 0.3851200044155121, + 0.3969919979572296, + 0.4503360092639923, + 0.614080011844635, + 0.6707839965820312, + 0.6114879846572876 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.6018719971179962 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.8120319843292236, + 0.7058240175247192, + 0.5161920189857483, + 0.5046719908714294, + 0.5037440061569214, + 0.6096640229225159, + 0.7834879755973816, + 0.8446400165557861, + 0.7747840285301208, + 0.8163520097732544 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.74030402302742 + } + }, + "peak_increment_bytes": { + "native": 579078656 + } + } + }, + { + "batch": 1, + "sequence": 6032, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.18886399269104004, + 0.18831999599933624, + 0.18774400651454926, + 0.1876160055398941, + 0.18636800348758698, + 0.18592000007629395, + 0.1876479983329773, + 0.18652799725532532, + 0.18783999979496002, + 0.1860799938440323 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.1876320019364357 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.4009920060634613, + 0.5954880118370056, + 0.5928000211715698, + 0.7049599885940552, + 0.3776639997959137, + 0.733951985836029, + 0.5867840051651001, + 0.6504639983177185, + 0.6998400092124939, + 0.6268479824066162 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.6111679971218109 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.6665599942207336, + 0.601248025894165, + 0.7151359915733337, + 0.7735679745674133, + 0.7891520261764526, + 0.7753279805183411, + 0.8151360154151917, + 0.8439040184020996, + 0.7931839823722839, + 0.7956799864768982 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.7822400033473969 + } + }, + "peak_increment_bytes": { + "native": 520126976 + } + } + }, + { + "batch": 256, + "sequence": 3, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 0.2741119861602783, + 0.2715199887752533, + 0.2709119915962219, + 0.2696000039577484, + 0.2699519991874695, + 0.2680639922618866, + 0.26982399821281433, + 0.2687999904155731, + 0.2682560086250305, + 0.26793599128723145 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.26971200108528137 + } + }, + "backward": { + "samples_ms": { + "native": [ + 0.7725759744644165, + 0.7499520182609558, + 0.5602560043334961, + 0.7750399708747864, + 0.554527997970581, + 0.5429120063781738, + 0.7290880084037781, + 0.7685120105743408, + 0.8246719837188721, + 0.7691839933395386 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.7592320144176483 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 0.8441280126571655, + 0.9881600141525269, + 0.9618239998817444, + 1.015104055404663, + 0.9913600087165833, + 0.9615359902381897, + 0.9667519927024841, + 0.9570239782333374, + 0.8058559894561768, + 0.8009600043296814 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 0.961679995059967 + } + }, + "peak_increment_bytes": { + "native": 116416512 + } + } + }, + { + "batch": 2048, + "sequence": 3, + "measurements": { + "forward": { + "samples_ms": { + "native": [ + 1.5828160047531128, + 1.5822399854660034, + 1.583583950996399, + 1.586400032043457, + 1.5847359895706177, + 1.5823359489440918, + 1.5822720527648926, + 1.5826560258865356, + 1.5827200412750244, + 1.583359956741333 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 1.5827680230140686 + } + }, + "backward": { + "samples_ms": { + "native": [ + 3.109247922897339, + 3.0388801097869873, + 3.080575942993164, + 3.1449599266052246, + 3.0649919509887695, + 3.0799999237060547, + 3.024127960205078, + 3.0496320724487305, + 3.053920030593872, + 3.0472640991210938 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 3.059455990791321 + } + }, + "forward_backward": { + "samples_ms": { + "native": [ + 4.490111827850342, + 4.440832138061523, + 4.4896321296691895, + 4.485824108123779, + 4.486752033233643, + 4.4839677810668945, + 4.48367977142334, + 4.43836784362793, + 4.484288215637207, + 4.490560054779053 + ] + }, + "order": [ + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ], + [ + "native" + ] + ], + "median_ms": { + "native": 4.485056161880493 + } + }, + "peak_increment_bytes": { + "native": 503341568 + } + } + } + ] + } + ], + "environment": { + "torch": "2.13.0+cu130", + "cuda": "13.0", + "gpu": "NVIDIA B200", + "workspace": { + "CUBLAS_WORKSPACE_CONFIG": null, + "CUBLASLT_WORKSPACE_SIZE": null + }, + "tf32": false + }, + "scope": "sample batch BI; final uses S=3 for large B, long S tested separately; shared parameter gradients: same ordered inputs, repeat only", + "packages": { + "torch": "2.13.0", + "triton": "3.7.1", + "diffusers": null, + "vllm": "0.30.0", + "sglang": "0.5.21", + "liger-kernel": "0.8.4", + "transformer_engine": null, + "megatron-core": null + } +} diff --git a/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/reuse.png b/docs/usage/evidence/qwenimage-final-adaln-out-b200/audit/reuse.png new file mode 100644 index 0000000000000000000000000000000000000000..f87b5ca2f8b40ddee8b2fcaaa6517078f4df59bf GIT binary patch literal 370229 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