From 16bf70a8c26515e4ea37cb6e17e74ea5cca20d32 Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 04:33:44 -0700 Subject: [PATCH 001/101] feat(image): flux2 klein fingerprint row and config synthesis --- gmlx/image/families/flux2_klein/__init__.py | 1 + gmlx/image/families/flux2_klein/family.py | 260 +++++++++++++++ gmlx/image/families/flux3_klein/family.py | 37 +-- licenses/flux2-LICENSE | 216 +++++++++++++ .../flux2_klein_4b_transformer_config.json | 24 ++ ...lux2_klein_base_4b_transformer_config.json | 24 ++ tests/fixtures/image/manifest.json | 14 + tests/image/test_image_fingerprint.py | 8 +- tests/image/test_image_flux2_family.py | 303 ++++++++++++++++++ tests/image/test_image_flux3_family.py | 49 +-- tests/test_license_files.py | 53 ++- 11 files changed, 928 insertions(+), 61 deletions(-) create mode 100644 gmlx/image/families/flux2_klein/__init__.py create mode 100644 gmlx/image/families/flux2_klein/family.py create mode 100644 licenses/flux2-LICENSE create mode 100644 tests/fixtures/image/flux2_klein_4b_transformer_config.json create mode 100644 tests/fixtures/image/flux2_klein_base_4b_transformer_config.json create mode 100644 tests/image/test_image_flux2_family.py diff --git a/gmlx/image/families/flux2_klein/__init__.py b/gmlx/image/families/flux2_klein/__init__.py new file mode 100644 index 000000000..0aac03e5f --- /dev/null +++ b/gmlx/image/families/flux2_klein/__init__.py @@ -0,0 +1 @@ +"""FLUX.2 klein: double-stream blocks, then single-stream blocks.""" diff --git a/gmlx/image/families/flux2_klein/family.py b/gmlx/image/families/flux2_klein/family.py new file mode 100644 index 000000000..f9d5dca2d --- /dev/null +++ b/gmlx/image/families/flux2_klein/family.py @@ -0,0 +1,260 @@ +# SPDX-License-Identifier: Apache-2.0 AND MIT +# SPDX-FileCopyrightText: Copyright 2025 Black Forest Labs, Inc. +# Ported from BFL's FLUX.2 reference at commit 50fe516: the constants of +# Klein4BParams, Klein9BParams and Flux2Params in src/flux2/model.py and +# the defaults of FLUX2_MODEL_INFO in src/flux2/util.py, and the tensor +# names and shapes of Flux2 in src/flux2/model.py, and modified for gmlx +# (Apache-2.0; see licenses/flux2-LICENSE). +"""FLUX.2 klein fingerprint, constants, config synthesis and the hooks of +its registry row. + +Shapes are GGUF order, input dim first. The GGUF tensor names are the +state dict keys of the reference DiT. Converters label the file ``flux``, +as they label FLUX.1 and FLUX.3 files, so the names and shapes decide, +and the label alone names no family. The 4B and 9B sizes differ in their +widths and block counts. The distilled and Base checkpoints of a size +share every name and shape, so the variant comes from the identity hash. +A FLUX.1 or FLUX.2 dev file is refused with the name of its model. +""" + +from __future__ import annotations + +import re + +from gmlx.image.fingerprint import HeaderView, Match, Refusal +from gmlx.image.registry import (ConstantsRow, Family, SamplingRow, + VariantRow) + +TITLE = "FLUX.2 klein" +# What a refusal of another FLUX model names as the ones gmlx image runs. +RUNS = "FLUX.2 klein and FLUX.3 klein are the FLUX models it runs" + +# The block names of BFL's flux and flux2 code, and the modulations that +# tell them apart. +FLUX_DOUBLE = "double_blocks.0.img_attn.proj.weight" +_FLUX2_MOD = "double_stream_modulation_img.lin.weight" +_FLUX1_MOD = "double_blocks.0.img_mod.lin.weight" +IMG_IN = "img_in.weight" +TXT_IN = "txt_in.weight" +_Q_NORM = "double_blocks.0.img_attn.norm.query_norm.scale" + +# hidden_size, depth, depth_single_blocks and context_in_dim of +# Klein4BParams and Klein9BParams. The text width is that of three +# stacked layers of the Qwen3 encoder of each size. +SIZES = {"4B": (3072, 5, 20, 7680), "9B": (4096, 8, 24, 12288)} +_HEAD, _LATENT, _T, _MLP_RATIO = 128, 128, 256, 3 +# (img_in, txt_in) of FLUX.2 dev (Flux2Params) and of FLUX.1. +_FLUX2_DEV = ((128, 6144), (15360, 6144)) +_FLUX1 = ((64, 3072), (4096, 3072)) +_GROUP = re.compile(r"(double_blocks|single_blocks)\.(\d+)\.") + +CONSTANTS = ConstantsRow( + values={ + "axes_dims_rope": [32, 32, 32, 32], + "rope_theta": 2000, + # The eps of every norm: the LayerNorm of the modulation and the + # RMSNorm of q and k. + "eps": 1e-06, + # A latent pixel is one 128-channel token: the VAE's 8x and its + # 2x2 patchify. The DiT takes the tokens with no patch of its own. + "patch_size": 1, + }, + repo="black-forest-labs/FLUX.2-klein-4B", + revision="e7b7dc27f91deacad38e78976d1f2b499d76a294", +) + +# The defaults of FLUX2_MODEL_INFO in src/flux2/util.py: the distilled +# checkpoints at 4 steps and no guidance, Base at 50 steps with guidance +# 4.0, which is gmlx's cfg, as the reference guides by u + guidance * +# (c - u). The schedule is the family's own, from the image's token count +# and the steps, so the shift field is unused. +_BFL = ("github.com/black-forest-labs/flux2", + "50fe5162777813d869182b139e83b10743caef15") +SAMPLING = { + "distilled": SamplingRow(4, 1.0, 1.0, *_BFL), + "base": SamplingRow(50, 4.0, 1.0, *_BFL), +} + +# The variants of a size share every shape, so the variant comes from the +# hash of the image input projection, which the distillation changed. +# Every GGUF of the unsloth repos keeps it BF16. +IDENTITY_TENSORS = (IMG_IN,) +_QUANTS = ("BF16", "F16", "Q2_K", "Q3_K_M", "Q3_K_S", "Q4_0", "Q4_1", + "Q4_K_M", "Q4_K_S", "Q5_0", "Q5_1", "Q5_K_M", "Q5_K_S", "Q6_K", + "Q8_0") +_DISTILLED_4B = VariantRow( + "distilled", "unsloth/FLUX.2-klein-4B-GGUF", + "0084d1df98e2e2137fe776d55170bc4792ec1d66", + tuple(f"flux-2-klein-4b-{q}.gguf" for q in _QUANTS)) +_BASE_4B = VariantRow( + "base", "unsloth/FLUX.2-klein-base-4B-GGUF", + "5fd6513800b1f13016fab83600b392a35f29d56d", + tuple(f"flux-2-klein-base-4b-{q}.gguf" for q in _QUANTS)) +VARIANTS = { + "591c63d49ea6d7cb55c1d349febb8736613013aef145462659f19816ed3639a9": + _DISTILLED_4B, + "2a60e24acf60f890172dfdf3a887d7f9dc51675c515a566126bb24ddab3d2fce": + _BASE_4B, +} + + +def size_of(view: HeaderView) -> str | None: + """The klein size whose input widths the file has, or None.""" + shapes = (view.shape(IMG_IN), view.shape(TXT_IN)) + for size, (hidden, _, _, text) in SIZES.items(): + if shapes == ((_LATENT, hidden), (text, hidden)): + return size + return None + + +def flux_model(view: HeaderView) -> str | None: + """The FLUX model of a file in the block names of BFL's flux and flux2 + code: FLUX.1, FLUX.2 dev, FLUX.2 klein 4B or 9B, or FLUX.2 for another + FLUX.2 model. None for any other file, such as another model in the + FLUX.1 block names, which the generic FLUX row of the fingerprint + refuses.""" + if not view.has(FLUX_DOUBLE): + return None + shapes = (view.shape(IMG_IN), view.shape(TXT_IN)) + if view.has(_FLUX2_MOD): + size = size_of(view) + if size is not None: + return f"{TITLE} {size}" + return "FLUX.2 dev" if shapes == _FLUX2_DEV else "FLUX.2" + if view.has(_FLUX1_MOD) and shapes == _FLUX1: + return "FLUX.1" + return None + + +def older_refusal(name: str) -> Refusal: + """The refusal of a FLUX model gmlx image does not run, by name.""" + return Refusal(f"this is a {name} GGUF, which gmlx image does not " + f"support; {RUNS}") + + +def expected(size: str) -> dict: + """Every tensor name of a file of ``size`` and its shape.""" + hidden, depth, single, text = SIZES[size] + mlp = _MLP_RATIO * hidden + norms = {"norm.query_norm.scale": (_HEAD,), + "norm.key_norm.scale": (_HEAD,)} + stream = {"attn.qkv.weight": (hidden, 3 * hidden), + "attn.proj.weight": (hidden, hidden), + **{f"attn.{n}": s for n, s in norms.items()}, + "mlp.0.weight": (hidden, 2 * mlp), + "mlp.2.weight": (mlp, hidden)} + out = {IMG_IN: (_LATENT, hidden), + TXT_IN: (text, hidden), + "time_in.in_layer.weight": (_T, hidden), + "time_in.out_layer.weight": (hidden, hidden), + "double_stream_modulation_img.lin.weight": (hidden, 6 * hidden), + "double_stream_modulation_txt.lin.weight": (hidden, 6 * hidden), + "single_stream_modulation.lin.weight": (hidden, 3 * hidden), + "final_layer.adaLN_modulation.1.weight": (hidden, 2 * hidden), + "final_layer.linear.weight": (hidden, _LATENT)} + for i in range(depth): + for kind in ("img", "txt"): + out.update({f"double_blocks.{i}.{kind}_{n}": s + for n, s in stream.items()}) + for i in range(single): + out.update({f"single_blocks.{i}.linear1.weight": + (hidden, 3 * hidden + 2 * mlp), + f"single_blocks.{i}.linear2.weight": + (hidden + mlp, hidden), + **{f"single_blocks.{i}.{n}": s + for n, s in norms.items()}}) + return out + + +def _counts(size: str) -> tuple: + _, depth, single, _ = SIZES[size] + return (("double_blocks", depth), ("single_blocks", single)) + + +def _past_count(name: str, view: HeaderView, size: str) -> bool: + """Whether a block tensor sits in a block the counts already name: + past the file's count of its group, or past the model's.""" + m = _GROUP.match(name) + if m is None: + return False + want = dict(_counts(size))[m[1]] + return int(m[2]) >= min(want, view.count(m[1])) + + +def fingerprint(view: HeaderView) -> Match | Refusal | None: + name = flux_model(view) + if name is None: + return None + size = size_of(view) if view.has(_FLUX2_MOD) else None + if size is None: + return older_refusal(name) + want = expected(size) + title = f"{TITLE} {size}" + diffs = [f"{g} has {view.count(g)} blocks, {title} has {c}" + for g, c in _counts(size) if view.count(g) != c] + diffs += [f"{n} is {view.shape(n)}, {title} has {s}" + for n, s in want.items() + if view.has(n) and view.shape(n) != s] + diffs += [f"{n} is missing" for n in want + if not view.has(n) and not _past_count(n, view, size)] + extra = [n for n in view.tensors + if n not in want and not _past_count(n, view, size)] + if any(n.endswith(".bias") for n in extra): + diffs.append("it has bias tensors") + diffs += [f"{n} is not a {TITLE} tensor" for n in extra + if not n.endswith(".bias")] + if diffs: + shown = ", ".join(diffs[:8]) + more = f" (+{len(diffs) - 8} more)" if len(diffs) > 8 else "" + return Refusal(f"a {TITLE} relative that gmlx image does not " + f"support: {shown}{more}") + return Match() + + +def synth_config(view: HeaderView) -> dict: + """The keys of the official transformer/config.json, from shapes and + constants.""" + c = CONSTANTS.values + s = view.dims + in_ch, hidden = s(IMG_IN) + head_dim = s(_Q_NORM)[0] + out_ch = s("final_layer.linear.weight")[1] + return { + "attention_head_dim": head_dim, + "axes_dims_rope": list(c["axes_dims_rope"]), + "eps": c["eps"], + # Neither size embeds a guidance: the fingerprint takes no + # guidance_in. + "guidance_embeds": False, + "in_channels": in_ch, + "joint_attention_dim": s(TXT_IN)[0], + "mlp_ratio": s("double_blocks.0.img_mlp.2.weight")[0] / hidden, + "num_attention_heads": hidden // head_dim, + "num_layers": view.count("double_blocks"), + "num_single_layers": view.count("single_blocks"), + # The official config says null for the input width. + "out_channels": None if out_ch == in_ch else out_ch, + "patch_size": c["patch_size"], + "rope_theta": c["rope_theta"], + "timestep_guidance_channels": s("time_in.in_layer.weight")[0], + } + + +FAMILY = Family( + name="flux2_klein", + title=TITLE, + # Before FLUX.3 klein, so a FLUX.2 klein file and the other FLUX models + # meet this row first. + order=25, + # Every FLUX GGUF carries the label flux, so it names no family alone. + arch_strings=frozenset({None}), + shared_arch_strings=frozenset({"flux"}), + strip_prefixes=("model.diffusion_model.", "diffusion_model."), + fingerprint=fingerprint, + synth_config=synth_config, + constants=CONSTANTS, + build=None, + identity_tensors=IDENTITY_TENSORS, + variants=VARIANTS, + sampling=SAMPLING, +) diff --git a/gmlx/image/families/flux3_klein/family.py b/gmlx/image/families/flux3_klein/family.py index 63be61954..c22e2f4ad 100644 --- a/gmlx/image/families/flux3_klein/family.py +++ b/gmlx/image/families/flux3_klein/family.py @@ -13,8 +13,8 @@ as they label FLUX.1 and FLUX.2 files, so the names and shapes decide, and the label alone names no family. The distilled checkpoint, a flow map, has the ``ref_time_in`` embedder of the target time and Base has -none, so the tensors name the variant. A FLUX.1 or FLUX.2 file is -refused with the name of its family. +none, so the tensors name the variant. A FLUX.1 or FLUX.2 file given as +FLUX.3 klein is refused with the name of its model. """ from __future__ import annotations @@ -154,31 +154,18 @@ "black-forest-labs/flux-3-image-klein text_encoder at " "8454017f9ebaada30c998fccd9f67a80c7580f68") -# FLUX.1 and FLUX.2 files under the same label, by the block names of -# BFL's flux and flux2 code. FLUX.2 klein takes its text width from the -# stacked layers of its Qwen3 encoder. -_FLUX_DOUBLE = "double_blocks.0.img_attn.proj.weight" -_FLUX2_MOD = "double_stream_modulation_img.lin.weight" -_FLUX1_MOD = "double_blocks.0.img_mod.lin.weight" -_FLUX2_KLEIN = {((128, 3072), (7680, 3072)): "FLUX.2 klein 4B", - ((128, 4096), (12288, 4096)): "FLUX.2 klein 9B"} - - def _older_flux(view: HeaderView) -> Refusal | None: - """The refusal of a FLUX.1 or FLUX.2 file, by name, or None.""" - if not view.has(_FLUX_DOUBLE): - return None - shapes = (view.shape("img_in.weight"), view.shape(TXT_IN)) - if view.has(_FLUX2_MOD): - name = _FLUX2_KLEIN.get(shapes, "FLUX.2") - elif view.has(_FLUX1_MOD) and shapes == ((64, 3072), (4096, 3072)): - name = "FLUX.1" - else: - # Another model in the FLUX.1 block names, which the generic - # FLUX row of the fingerprint refuses. + """The refusal of a FLUX.1 or FLUX.2 file, by name, or None. The + FLUX.2 klein row meets these files first; this one names them when + the family is given as FLUX.3 klein.""" + from gmlx.image.families.flux2_klein import family as flux2 + + name = flux2.flux_model(view) + if name is None: return None - return Refusal(f"this is a {name} GGUF, which gmlx image does not " - f"support; {TITLE} is the FLUX model it runs") + if name.startswith(flux2.TITLE): + return Refusal(f"this is a {name} GGUF, not a {TITLE} one") + return flux2.older_refusal(name) def expected(flow_map: bool) -> dict: diff --git a/licenses/flux2-LICENSE b/licenses/flux2-LICENSE new file mode 100644 index 000000000..ede3f2a34 --- /dev/null +++ b/licenses/flux2-LICENSE @@ -0,0 +1,216 @@ +flux2 - https://github.com/black-forest-labs/flux2 + +gmlx ports code from BFL's FLUX.2 reference at commit +50fe5162777813d869182b139e83b10743caef15, modified for gmlx and MLX. Each +ported file carries the Apache-2.0 header and the copyright line of its +source. + +- gmlx/image/families/flux2_klein/family.py: the constants of + Klein4BParams, Klein9BParams and Flux2Params in src/flux2/model.py, the + defaults of FLUX2_MODEL_INFO in src/flux2/util.py, and the tensor names + and shapes of Flux2 in src/flux2/model.py. + +flux2 is distributed under the Apache License 2.0: + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/tests/fixtures/image/flux2_klein_4b_transformer_config.json b/tests/fixtures/image/flux2_klein_4b_transformer_config.json new file mode 100644 index 000000000..f21592ae2 --- /dev/null +++ b/tests/fixtures/image/flux2_klein_4b_transformer_config.json @@ -0,0 +1,24 @@ +{ + "_class_name": "Flux2Transformer2DModel", + "_diffusers_version": "0.37.0.dev0", + "_name_or_path": "/raid/yiyi/klein-4b-distilled-diffusers/transformer", + "attention_head_dim": 128, + "axes_dims_rope": [ + 32, + 32, + 32, + 32 + ], + "eps": 1e-06, + "guidance_embeds": false, + "in_channels": 128, + "joint_attention_dim": 7680, + "mlp_ratio": 3.0, + "num_attention_heads": 24, + "num_layers": 5, + "num_single_layers": 20, + "out_channels": null, + "patch_size": 1, + "rope_theta": 2000, + "timestep_guidance_channels": 256 +} diff --git a/tests/fixtures/image/flux2_klein_base_4b_transformer_config.json b/tests/fixtures/image/flux2_klein_base_4b_transformer_config.json new file mode 100644 index 000000000..bc01657cf --- /dev/null +++ b/tests/fixtures/image/flux2_klein_base_4b_transformer_config.json @@ -0,0 +1,24 @@ +{ + "_class_name": "Flux2Transformer2DModel", + "_diffusers_version": "0.37.0.dev0", + "_name_or_path": "/raid/yiyi/klein-4b-diffusers/transformer", + "attention_head_dim": 128, + "axes_dims_rope": [ + 32, + 32, + 32, + 32 + ], + "eps": 1e-06, + "guidance_embeds": false, + "in_channels": 128, + "joint_attention_dim": 7680, + "mlp_ratio": 3.0, + "num_attention_heads": 24, + "num_layers": 5, + "num_single_layers": 20, + "out_channels": null, + "patch_size": 1, + "rope_theta": 2000, + "timestep_guidance_channels": 256 +} diff --git a/tests/fixtures/image/manifest.json b/tests/fixtures/image/manifest.json index b16fd193c..10b5f30f8 100644 --- a/tests/fixtures/image/manifest.json +++ b/tests/fixtures/image/manifest.json @@ -127,6 +127,20 @@ "sha256": "5489463ed96056b0bb5472abb5d1bba7055e48d574e37877acb43b407465e26f", "kv_kept": "general.architecture" }, + "flux2_klein_4b_transformer_config.json": { + "repo": "black-forest-labs/FLUX.2-klein-4B", + "revision": "e7b7dc27f91deacad38e78976d1f2b499d76a294", + "file": "transformer/config.json", + "size": 541, + "sha256": "09733c74a3da6d17dd0a0472a091a8950c7c6935889c32c16cc800ede05029de" + }, + "flux2_klein_base_4b_transformer_config.json": { + "repo": "black-forest-labs/FLUX.2-klein-base-4B", + "revision": "a3b4f4849157f664bdbc776fd7453c2783562f4d", + "file": "transformer/config.json", + "size": 531, + "sha256": "c8a88c1433f24e52c01f46766c9f519e76d91d1c00bfb43fe0db2e4ed3c84d70" + }, "flux3_klein_config.json": { "repo": "black-forest-labs/flux-3-image-klein", "revision": "8454017f9ebaada30c998fccd9f67a80c7580f68", diff --git a/tests/image/test_image_fingerprint.py b/tests/image/test_image_fingerprint.py index f098123e9..7217f9c59 100644 --- a/tests/image/test_image_fingerprint.py +++ b/tests/image/test_image_fingerprint.py @@ -26,10 +26,11 @@ def _refused(view, **kw) -> str: def test_families_sort_by_order_and_name(): assert [f.name for f in families()] == ["z_image", "krea2", - "qwen_image21", "flux3_klein"] + "qwen_image21", "flux2_klein", + "flux3_klein"] assert get_family("z_image").title == "Z-Image" with pytest.raises(ValueError, match="known: z_image, krea2, qwen_image21, " - "flux3_klein"): + "flux2_klein, flux3_klein"): get_family("flux") assert is_image_arch("lumina2") and is_image_arch("qwen_image") assert is_image_arch("krea2") @@ -284,9 +285,10 @@ def _bfl(txt_in: tuple, img_in: tuple, *extra: str) -> fp.HeaderView: "a FLUX.1 GGUF"), # The FLUX.1 block names with no modulation of the FLUX.1 layout. "FLUX, unknown": (lambda: _bfl((4096, 3072), (64, 3072)), "a FLUX GGUF"), + # The widths of FLUX.2 klein 4B with most of its tensors missing. "FLUX.2 klein": (lambda: _bfl( (7680, 3072), (128, 3072), "double_stream_modulation_img.lin.weight", - "single_stream_modulation.lin.weight"), "a FLUX.2 klein 4B GGUF"), + "single_stream_modulation.lin.weight"), "a FLUX.2 klein relative"), # LongCat-Image as ComfyUI stores it: the FLUX.1 block names, with the # text width of Qwen2.5-VL-7B. "LongCat-Image": (lambda: _bfl((3584, 3072), (64, 3072)), "a FLUX GGUF"), diff --git a/tests/image/test_image_flux2_family.py b/tests/image/test_image_flux2_family.py new file mode 100644 index 000000000..572002761 --- /dev/null +++ b/tests/image/test_image_flux2_family.py @@ -0,0 +1,303 @@ +"""The FLUX.2 klein registry row: the 4B and 9B files, the config against +the official transformer/config.json of both 4B checkpoints (check 1), +the variant from the identity hash, relatives refused with the reason, +and the line between FLUX.2 klein and the other FLUX models. CPU-only. +Header fixtures hold names, shapes and codecs, no weights. The rows on +the real files read their headers and the identity tensor, and skip +without them.""" +from __future__ import annotations + +import hashlib + +import numpy as np +import pytest + +from image_fixtures import (FIXTURES, Q_HEADER, Z_HEADER, bf16_bits, + fixture_view, load_json, official_config, + write_gguf) + +from gmlx.image import fingerprint as fp +from gmlx.image.families.flux2_klein import family as f2 +from gmlx.image.registry import get_family + +KLEIN_4B = "flux2_klein_4b_q4_k_m.header.json" +KLEIN_9B = "flux2_klein_9b_q4_k_m.header.json" +CONFIG_4B = "flux2_klein_4b_transformer_config.json" +CONFIG_BASE_4B = "flux2_klein_base_4b_transformer_config.json" +FLUX3 = "flux3_klein_q4_k_m.header.json" +KREA2 = "krea2_turbo_q4_k_m.header.json" +DISTILLED_HASH = ("591c63d49ea6d7cb55c1d349febb8736613013aef145462659f19816" + "ed3639a9") +BASE_HASH = "2a60e24acf60f890172dfdf3a887d7f9dc51675c515a566126bb24ddab3d2fce" + + +def _refused(view, **kw) -> str: + with pytest.raises(fp.ImageModelError) as ei: + fp.identify(view, **kw) + return str(ei.value) + + +@pytest.mark.parametrize("config", [CONFIG_4B, CONFIG_BASE_4B]) +@pytest.mark.parametrize("arch", ["flux", None]) +def test_the_4b_file_gives_the_official_config_of_both_checkpoints(config, + arch): + """Check 1: the distilled and Base 4B files share the header, and the + config synthesized from it is each official transformer config.""" + view = fixture_view(KLEIN_4B, kv={"general.architecture": arch} if arch + else {}) + got = fp.identify(view) + assert got.family.name == "flux2_klein" + assert (got.prefix, got.layout) == ("", "default") + # A fixture view has no file bytes, so no identity hash. + assert (got.variant, got.identity_hash) == ("unknown", None) + assert got.config == official_config(config) + + +def test_the_9b_file_is_flux2_klein_9b(): + """The 9B widths and depths of Klein9BParams. The official 9B config + is gated, so check 1 at 9B waits for it.""" + got = fp.identify(fixture_view(KLEIN_9B)) + assert got.family.name == "flux2_klein" + want = dict(official_config(CONFIG_4B), joint_attention_dim=12288, + num_attention_heads=32, num_layers=8, num_single_layers=24) + assert got.config == want + + +def test_the_config_fixtures_are_the_official_files_in_bytes(): + manifest = load_json("manifest.json") + for name in (CONFIG_4B, CONFIG_BASE_4B): + data = (FIXTURES / name).read_bytes() + assert hashlib.sha256(data).hexdigest() == manifest[name]["sha256"] + assert len(data) == manifest[name]["size"] + assert manifest[name]["file"] == "transformer/config.json" + row = get_family("flux2_klein").constants + assert (row.repo, row.revision) == (manifest[CONFIG_4B]["repo"], + manifest[CONFIG_4B]["revision"]) + # The checkpoints differ in the path they were saved from alone. + a, b = load_json(CONFIG_4B), load_json(CONFIG_BASE_4B) + assert a["_name_or_path"] != b["_name_or_path"] + assert official_config(CONFIG_4B) == official_config(CONFIG_BASE_4B) + + +def test_the_header_fixtures_are_pinned(): + manifest = load_json("manifest.json") + for name, n in ((KLEIN_4B, 149), (KLEIN_9B, 201)): + d = load_json(name) + assert d["n_tensors"] == len(d["tensors"]) == n + assert d["kv"] == {"general.architecture": "flux"} + assert len(manifest[name]["revision"]) == 40 + assert len(manifest[name]["sha256"]) == 64 + + +@pytest.mark.parametrize("name,size", [(KLEIN_4B, "4B"), (KLEIN_9B, "9B")]) +def test_the_header_holds_exactly_the_expected_tensors(name, size): + view = fixture_view(name) + assert {n: t.shape for n, t in view.tensors.items()} == f2.expected(size) + + +def test_the_identity_table_names_both_4b_variants_with_their_sampling(): + fam = get_family("flux2_klein") + assert fam.identity_tensors == ("img_in.weight",) + assert fam.variant_names() == ("base", "distilled") + rows = {v.name: v for v in fam.variants.values()} + assert fam.variants[DISTILLED_HASH] is rows["distilled"] + assert fam.variants[BASE_HASH] is rows["base"] + assert "flux-2-klein-4b-Q4_K_M.gguf" in rows["distilled"].files + assert "flux-2-klein-base-4b-Q4_K_M.gguf" in rows["base"].files + assert rows["distilled"].repo == "unsloth/FLUX.2-klein-4B-GGUF" + assert rows["base"].repo == "unsloth/FLUX.2-klein-base-4B-GGUF" + distilled, base = fam.sampling["distilled"], fam.sampling["base"] + assert (distilled.steps, distilled.cfg) == (4, 1.0) + assert (base.steps, base.cfg) == (50, 4.0) + assert distilled.revision == base.revision == ( + "50fe5162777813d869182b139e83b10743caef15") + # A file whose identity matches no row samples without defaults. + assert fam.unknown_variant is None and not fam.needs_variant + + +@pytest.mark.parametrize("digest,variant", [(DISTILLED_HASH, "distilled"), + (BASE_HASH, "base"), + ("0" * 64, "unknown")]) +def test_the_identity_names_the_variant(monkeypatch, digest, variant): + monkeypatch.setattr(fp, "weight_identity", lambda view, names: digest) + got = fp.identify(fixture_view(KLEIN_4B)) + assert (got.variant, got.identity_hash) == (variant, digest) + + +def test_a_variant_given_by_name_must_match_the_weights(monkeypatch): + monkeypatch.setattr(fp, "weight_identity", + lambda view, names: DISTILLED_HASH) + view = fixture_view(KLEIN_4B) + assert fp.identify(view, variant="distilled").variant == "distilled" + assert _refused(view, variant="base") == ( + "variant='base' contradicts the weights, which match FLUX.2 klein " + "distilled") + + +def _identity_file(tmp_path, codec: str, seed: int): + from gmlx.load.headerscan import scan_gguf + + rng = np.random.default_rng(seed) + bits = bf16_bits(rng.standard_normal((16, 8)).astype(np.float32)) + stored = ((bits, "BF16") if codec == "BF16" else + ((bits.astype(np.uint32) << 16).view(np.float32), codec)) + p = write_gguf(tmp_path / f"id-{codec}-{seed}.gguf", + {"img_in.weight": stored}, "flux") + return fp.view_from_scans([scan_gguf(p)]) + + +def test_the_identity_is_the_same_for_every_storage(tmp_path): + names = get_family("flux2_klein").identity_tensors + hashes = {fp.weight_identity(_identity_file(tmp_path, c, 0), names) + for c in ("F32", "BF16")} + assert len(hashes) == 1 and None not in hashes + assert fp.weight_identity(_identity_file(tmp_path, "F32", 1), + names) not in hashes + + +@pytest.mark.parametrize("name,change,reason", [ + (KLEIN_4B, {"drop": ("single_blocks.19.",)}, + "single_blocks has 19 blocks, FLUX.2 klein 4B has 20"), + (KLEIN_4B, {"add": {"single_blocks.20.linear2.weight": + ((12288, 3072), "Q4_K")}}, + "single_blocks has 21 blocks, FLUX.2 klein 4B has 20"), + (KLEIN_9B, {"drop": ("double_blocks.7.",)}, + "double_blocks has 7 blocks, FLUX.2 klein 9B has 8"), + (KLEIN_4B, {"drop": ("double_blocks.2.txt_mlp.0.",)}, + "double_blocks.2.txt_mlp.0.weight is missing"), + (KLEIN_4B, {"add": {"single_blocks.0.linear1.weight": + ((3072, 21504), "Q4_K")}}, + "single_blocks.0.linear1.weight is (3072, 21504), FLUX.2 klein 4B has " + "(3072, 27648)"), + (KLEIN_4B, {"add": {"double_blocks.0.img_attn.qkv.bias": + ((9216,), "F32")}}, + "it has bias tensors"), + (KLEIN_4B, {"add": {"guidance_in.in_layer.weight": + ((256, 3072), "BF16")}}, + "guidance_in.in_layer.weight is not a FLUX.2 klein tensor"), +], ids=["single", "single extra", "9b double", "missing", "shape", "bias", + "guidance"]) +def test_a_relative_is_refused_with_the_reason(name, change, reason): + msg = _refused(fixture_view(name, **change)) + assert "a FLUX.2 klein relative that gmlx image does not support" in msg + assert reason in msg + + +def test_a_long_refusal_counts_what_it_does_not_show(): + msg = _refused(fixture_view(KLEIN_4B, drop=("single_blocks.0.", + "single_blocks.1."))) + assert "single_blocks has 18 blocks" in msg + assert msg.endswith("more)") + + +@pytest.mark.parametrize("prefix", ["model.diffusion_model.", + "diffusion_model."]) +def test_a_prefixed_file_loads_under_its_prefix(prefix): + view = fixture_view(KLEIN_4B) + view = fp.HeaderView(kv=view.kv, tensors={ + prefix + n: t for n, t in view.tensors.items()}) + got = fp.identify(view) + assert (got.family.name, got.prefix) == ("flux2_klein", prefix) + + +def test_a_label_of_another_layout_is_refused(): + view = fixture_view(KLEIN_4B, kv={"general.architecture": "lumina2"}) + assert _refused(view) == ( + "arch 'lumina2' contradicts the tensor layout, which is FLUX.2 klein " + "(arch 'flux' or none)") + + +def _bfl(txt_in: tuple, img_in: tuple, *extra: str) -> fp.HeaderView: + """A file in the FLUX block names of BFL's flux and flux2 code.""" + tensors = {f2.FLUX_DOUBLE: (txt_in[1:] * 2, "Q4_K"), + f2.TXT_IN: (txt_in, "Q4_K"), + f2.IMG_IN: (img_in, "BF16")} + tensors.update({n: ((txt_in[1], 9216), "BF16") for n in extra}) + return fp.HeaderView(kv={"general.architecture": "flux"}, tensors={ + n: fp.Tensor(s, c) for n, (s, c) in tensors.items()}) + + +_MOD2 = "double_stream_modulation_img.lin.weight" + + +@pytest.mark.parametrize("view,name", [ + (_bfl((4096, 3072), (64, 3072), "double_blocks.0.img_mod.lin.weight"), + "FLUX.1"), + (_bfl((15360, 6144), (128, 6144), _MOD2), "FLUX.2 dev"), + (_bfl((5120, 5120), (128, 5120), _MOD2), "FLUX.2"), +], ids=["flux1", "flux2 dev", "flux2 other"]) +def test_the_other_flux_models_are_refused_by_name(view, name): + assert f2.flux_model(view) == name + want = (f"this is a {name} GGUF, which gmlx image does not support; " + "FLUX.2 klein and FLUX.3 klein are the FLUX models it runs") + assert f2.fingerprint(view) == fp.Refusal(want) + assert _refused(view) == want + + +def test_another_model_in_the_flux1_names_keeps_the_generic_refusal(): + """LongCat-Image as ComfyUI stores it: the FLUX.1 block names with the + text width of its own encoder.""" + view = _bfl((3584, 3072), (64, 3072), "double_blocks.0.img_mod.lin.weight") + assert f2.flux_model(view) is None and f2.fingerprint(view) is None + assert _refused(view) == ("this is a FLUX GGUF, which gmlx image does " + "not support") + + +@pytest.mark.parametrize("name", [KLEIN_4B, KLEIN_9B]) +def test_no_family_before_it_takes_a_flux2_file(name): + view = fixture_view(name) + for other in ("z_image", "krea2", "qwen_image21"): + fam = get_family(other) + assert fam.order < f2.FAMILY.order + assert fam.fingerprint(fp.strip_prefix(view, fam.strip_prefixes)) \ + is None, other + assert f2.FAMILY.order < get_family("flux3_klein").order + + +@pytest.mark.parametrize("name", [Z_HEADER, Q_HEADER, KREA2, FLUX3]) +def test_flux2_takes_no_file_of_another_family(name): + view = fp.strip_prefix(fixture_view(name), f2.FAMILY.strip_prefixes) + assert f2.fingerprint(view) is None + + +def test_a_flux3_file_given_as_flux2_is_refused(): + assert _refused(fixture_view(FLUX3), family="flux2_klein").startswith( + "not a FLUX.2 klein file. unrecognized image GGUF") + + +def _klein_files(root) -> list: + files = sorted(p for p in root.rglob("flux-2-klein-*.gguf") + if p.is_file()) + if not files: + pytest.skip("no FLUX.2 klein GGUF under KQUANT_TEST_GGUF_DIR") + return files + + +def test_each_real_file_has_the_header_of_its_size(gguf_dir): + """Distilled and Base files of a size hold the same names, shapes and + codecs, those of the size's fixture. Headers only.""" + from gmlx.load.headerscan import scan_gguf + + for p in _klein_files(gguf_dir): + fixture = KLEIN_9B if "-9b-" in p.name else KLEIN_4B + want = [list(t) for t in load_json(fixture)["tensors"]] + scan = scan_gguf(str(p)) + got = [[t.name, list(t.shape), t.type_name] for t in scan.tensors] + assert got == want, p.name + + +def test_each_real_4b_file_is_named_by_its_identity(gguf_dir): + """The identity of a 4B file names the variant of its repo. The 9B + rows wait for the 9B configs, so a 9B file's tensors are not read.""" + from gmlx.load.headerscan import scan_gguf + + fam = get_family("flux2_klein") + rows = {f: v for v in fam.variants.values() for f in v.files} + files = [p for p in _klein_files(gguf_dir) if p.name in rows] + if not files: + pytest.skip("no FLUX.2 klein 4B GGUF under KQUANT_TEST_GGUF_DIR") + for p in files: + got = fp.identify(fp.view_from_scans([scan_gguf(str(p))])) + assert got.family.name == "flux2_klein" + assert got.variant == rows[p.name].name, p.name + assert fam.variants[got.identity_hash] is rows[p.name] diff --git a/tests/image/test_image_flux3_family.py b/tests/image/test_image_flux3_family.py index dbe83beab..d21429f8c 100644 --- a/tests/image/test_image_flux3_family.py +++ b/tests/image/test_image_flux3_family.py @@ -1,7 +1,8 @@ """The FLUX.3 klein registry row: both publishers' files, Base, the config against the official config.json and transformer/config.json (check 1), -relatives refused with the reason, and the FLUX.1 and FLUX.2 files that -share the flux label refused by name. CPU-only. Header fixtures hold +relatives refused with the reason, the FLUX.1 and FLUX.2 dev files that +share the flux label refused by name, and the FLUX.2 klein files left to +their own row. CPU-only. Header fixtures hold names, shapes and codecs, no weights.""" from __future__ import annotations @@ -92,8 +93,7 @@ def test_the_config_fixtures_are_the_official_files_in_bytes(): def test_the_header_fixtures_are_pinned(): manifest = load_json("manifest.json") - for name, n in ((DISTILLED, 359), (ABIRAY, 359), (BASE, 357), - (FLUX2_4B, 149), (FLUX2_9B, 201)): + for name, n in ((DISTILLED, 359), (ABIRAY, 359), (BASE, 357)): d = load_json(name) assert d["n_tensors"] == len(d["tensors"]) == n assert len(manifest[name]["revision"]) == 40 @@ -113,13 +113,12 @@ def test_the_encoder_constants_follow_the_reference_code(): @pytest.mark.parametrize("name,title", [(FLUX2_4B, "FLUX.2 klein 4B"), (FLUX2_9B, "FLUX.2 klein 9B")]) @pytest.mark.parametrize("arch", ["flux", None]) -def test_flux2_klein_is_refused_by_name(name, title, arch): +def test_flux2_klein_given_as_flux3_is_refused_by_name(name, title, arch): view = fixture_view(name, kv={"general.architecture": arch} if arch else {}) - want = (f"this is a {title} GGUF, which gmlx image does not support; " - "FLUX.3 klein is the FLUX model it runs") - assert _refused(view) == want - assert _refused(view, family="flux3_klein") == want + assert fp.identify(view).family.name == "flux2_klein" + assert _refused(view, family="flux3_klein") == ( + f"this is a {title} GGUF, not a FLUX.3 klein one") def _bfl(txt_in: tuple, img_in: tuple, *extra: str) -> fp.HeaderView: @@ -136,12 +135,15 @@ def _bfl(txt_in: tuple, img_in: tuple, *extra: str) -> fp.HeaderView: (_bfl((4096, 3072), (64, 3072), "double_blocks.0.img_mod.lin.weight"), "FLUX.1"), (_bfl((15360, 6144), (128, 6144), "double_stream_modulation_img.lin.weight"), + "FLUX.2 dev"), + (_bfl((5120, 5120), (128, 5120), "double_stream_modulation_img.lin.weight"), "FLUX.2"), -], ids=["flux1", "flux2 dev"]) +], ids=["flux1", "flux2 dev", "flux2 other"]) def test_the_older_flux_models_are_refused_by_name(view, name): - assert _refused(view) == ( - f"this is a {name} GGUF, which gmlx image does not support; " - "FLUX.3 klein is the FLUX model it runs") + want = (f"this is a {name} GGUF, which gmlx image does not support; " + "FLUX.2 klein and FLUX.3 klein are the FLUX models it runs") + assert _refused(view) == want + assert _refused(view, family="flux3_klein") == want def test_another_model_in_the_flux1_names_keeps_the_generic_refusal(): @@ -212,7 +214,7 @@ def test_a_label_of_another_layout_is_refused(): @pytest.mark.parametrize("name", [DISTILLED, BASE]) def test_no_other_family_takes_a_flux3_file(name): view = fixture_view(name) - for other in ("z_image", "krea2", "qwen_image21"): + for other in ("z_image", "krea2", "qwen_image21", "flux2_klein"): fam = get_family(other) assert fam.fingerprint(fp.strip_prefix(view, fam.strip_prefixes)) \ is None, other @@ -225,17 +227,19 @@ def test_flux3_takes_no_file_of_another_family(name): def _scan(name, arch): - """A shard scan of a header fixture as the header-only read gives it.""" + """A shard scan of a header fixture, or of a view, as the header-only + read gives it.""" from types import SimpleNamespace + view = fixture_view(name) if isinstance(name, str) else name return SimpleNamespace( path="x.gguf", data_offset=0, kv={"general.architecture": arch}, tensors=[SimpleNamespace(name=n, shape=t.shape, type_name=t.codec, offset=0, nbytes=0) - for n, t in fixture_view(name).tensors.items()]) + for n, t in view.tensors.items()]) -def test_pull_names_a_flux3_file_by_its_tensors_and_refuses_flux2(): +def test_pull_names_each_flux_file_by_its_tensors_and_refuses_flux1(): from gmlx.commands import manage from gmlx.load import remote @@ -243,12 +247,15 @@ def test_pull_names_a_flux3_file_by_its_tensors_and_refuses_flux2(): assert manage._image_role(report, None) == (None, None) assert manage._image_role(report, [_scan(DISTILLED, "flux")]) == ( "dit", "flux3_klein") - scan = _scan(FLUX2_4B, "flux") + assert manage._image_role(report, [_scan(FLUX2_4B, "flux")]) == ( + "dit", "flux2_klein") + scan = _scan(_bfl((4096, 3072), (64, 3072), + "double_blocks.0.img_mod.lin.weight"), "flux") assert manage._image_role(report, [scan]) == (None, None) v = manage._verdict(remote.parse_ref("hf:o/r/m.gguf"), report, size_bytes=1 << 30, scans=[scan]) assert v["image"] is None and not v["usable"] assert v["arch_error"] == ( - "an image GGUF gmlx does not load: this is a FLUX.2 klein 4B GGUF, " - "which gmlx image does not support; FLUX.3 klein is the FLUX model " - "it runs") + "an image GGUF gmlx does not load: this is a FLUX.1 GGUF, which gmlx " + "image does not support; FLUX.2 klein and FLUX.3 klein are the FLUX " + "models it runs") diff --git a/tests/test_license_files.py b/tests/test_license_files.py index 9f2835dcd..4e814b95d 100644 --- a/tests/test_license_files.py +++ b/tests/test_license_files.py @@ -7,26 +7,55 @@ _ROOT = Path(__file__).resolve().parent.parent -# Copyright holder -> the license file that lists the files ported from it. -_SOURCES = {"Black Forest Labs, Inc.": "licenses/flux-3-image-klein-LICENSE"} +# Copyright holder -> the license files that list the files ported from +# its sources. A ported file's header names the ones it follows. +_SOURCES = {"Black Forest Labs, Inc.": ("licenses/flux-3-image-klein-LICENSE", + "licenses/flux2-LICENSE")} + + +def _head(path: Path) -> list[str]: + with open(path, encoding="utf-8", errors="replace") as f: + return [next(f, "") for _ in range(20)] def test_each_ported_file_is_named_in_the_license_file_of_its_source(): missing = [] for path in sorted((_ROOT / "gmlx").rglob("*.py")): - with open(path, encoding="utf-8", errors="replace") as f: - head = [next(f, "") for _ in range(20)] + head = _head(path) rel = path.relative_to(_ROOT).as_posix() - for holder, lic in _SOURCES.items(): - if any(line.startswith("# SPDX-FileCopyrightText:") - and holder in line for line in head) \ - and f"- {rel}:" not in (_ROOT / lic).read_text(): - missing.append(f"{rel} is not named in {lic}") + for holder, lics in _SOURCES.items(): + if not any(line.startswith("# SPDX-FileCopyrightText:") + and holder in line for line in head): + continue + named = [lic for lic in lics if any(lic in line for line in head)] + if not named: + missing.append(f"{rel} names none of {', '.join(lics)}") + missing += [f"{rel} is not named in {lic}" for lic in named + if f"- {rel}:" not in (_ROOT / lic).read_text()] assert not missing, missing +def test_each_file_a_license_file_names_exists(): + """The ported files a license file lists are files of gmlx.""" + gone = [] + for lics in _SOURCES.values(): + for lic in lics: + for line in (_ROOT / lic).read_text().splitlines(): + if line.startswith("- gmlx/") and ":" in line: + rel = line[2:line.index(":")] + if not (_ROOT / rel).is_file(): + gone.append(f"{lic} names {rel}") + assert not gone, gone + + def test_the_check_finds_the_ported_files(): - """The FLUX.3 klein files carry the line the check reads.""" - with open(_ROOT / "gmlx/image/families/flux3_klein/edit.py") as f: + """The FLUX.3 klein and FLUX.2 klein files carry the line the check + reads, and name their license files.""" + for rel, lic in (("gmlx/image/families/flux3_klein/edit.py", + "licenses/flux-3-image-klein-LICENSE"), + ("gmlx/image/families/flux2_klein/family.py", + "licenses/flux2-LICENSE")): + head = _head(_ROOT / rel) assert any(line.startswith("# SPDX-FileCopyrightText:") - and "Black Forest Labs, Inc." in line for line in f) + and "Black Forest Labs, Inc." in line for line in head) + assert any(lic in line for line in head) From 2fe3869ec23f7737a97565f5c9fa0ff7eecaf9af Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 04:57:28 -0700 Subject: [PATCH 002/101] feat(image): flux2 klein dit forward and the check 3 oracle, tiny model against the reference --- gmlx/image/families/flux2_klein/family.py | 11 +- gmlx/image/families/flux2_klein/model.py | 528 +++++++++++++++ licenses/flux2-LICENSE | 5 + scripts/image_oracle/check3_flux2_klein.py | 573 ++++++++++++++++ .../selftest_flux2_klein_rope.manifest.json | 94 +++ .../oracle/selftest_flux2_klein_rope.npz | Bin 0 -> 41536 bytes .../selftest_flux2_klein_tiny.manifest.json | 488 ++++++++++++++ .../oracle/selftest_flux2_klein_tiny.npz | Bin 0 -> 91178 bytes ...test_flux2_klein_tiny_norefs.manifest.json | 468 +++++++++++++ .../selftest_flux2_klein_tiny_norefs.npz | Bin 0 -> 74850 bytes ...est_flux2_klein_tiny_weights.manifest.json | 418 ++++++++++++ .../selftest_flux2_klein_tiny_weights.npz | Bin 0 -> 1661766 bytes tests/image/flux2_gates.py | 628 ++++++++++++++++++ tests/image/test_image_flux2_model.py | 349 ++++++++++ 14 files changed, 3561 insertions(+), 1 deletion(-) create mode 100644 gmlx/image/families/flux2_klein/model.py create mode 100644 scripts/image_oracle/check3_flux2_klein.py create mode 100644 tests/fixtures/image/oracle/selftest_flux2_klein_rope.manifest.json create mode 100644 tests/fixtures/image/oracle/selftest_flux2_klein_rope.npz create mode 100644 tests/fixtures/image/oracle/selftest_flux2_klein_tiny.manifest.json create mode 100644 tests/fixtures/image/oracle/selftest_flux2_klein_tiny.npz create mode 100644 tests/fixtures/image/oracle/selftest_flux2_klein_tiny_norefs.manifest.json create mode 100644 tests/fixtures/image/oracle/selftest_flux2_klein_tiny_norefs.npz create mode 100644 tests/fixtures/image/oracle/selftest_flux2_klein_tiny_weights.manifest.json create mode 100644 tests/fixtures/image/oracle/selftest_flux2_klein_tiny_weights.npz create mode 100644 tests/image/flux2_gates.py create mode 100644 tests/image/test_image_flux2_model.py diff --git a/gmlx/image/families/flux2_klein/family.py b/gmlx/image/families/flux2_klein/family.py index f9d5dca2d..6153cdc42 100644 --- a/gmlx/image/families/flux2_klein/family.py +++ b/gmlx/image/families/flux2_klein/family.py @@ -211,6 +211,12 @@ def fingerprint(view: HeaderView) -> Match | Refusal | None: return Match() +def build(config: dict): + from .model import Flux2KleinDiT + + return Flux2KleinDiT(config) + + def synth_config(view: HeaderView) -> dict: """The keys of the official transformer/config.json, from shapes and constants.""" @@ -253,7 +259,10 @@ def synth_config(view: HeaderView) -> dict: fingerprint=fingerprint, synth_config=synth_config, constants=CONSTANTS, - build=None, + build=build, + # The q and k norm scales, F32 in the file, stay fp32: the norm then + # runs in fp32 and rounds once with the rotation. + fp32_keep=("norm.query_norm.scale", "norm.key_norm.scale"), identity_tensors=IDENTITY_TENSORS, variants=VARIANTS, sampling=SAMPLING, diff --git a/gmlx/image/families/flux2_klein/model.py b/gmlx/image/families/flux2_klein/model.py new file mode 100644 index 000000000..66b6a95c6 --- /dev/null +++ b/gmlx/image/families/flux2_klein/model.py @@ -0,0 +1,528 @@ +# SPDX-License-Identifier: Apache-2.0 AND MIT +# SPDX-FileCopyrightText: Copyright 2025 Black Forest Labs, Inc. +# Ported from BFL's FLUX.2 reference at commit 50fe516: the Flux2 forward, +# DoubleStreamBlock, SingleStreamBlock, SelfAttention, SiLUActivation, +# Modulation, LastLayer, MLPEmbedder, QKNorm, timestep_embedding and rope +# of src/flux2/model.py, and the token ids of prc_img, prc_txt and +# encode_image_refs in src/flux2/sampling.py, and modified for gmlx +# (Apache-2.0; see licenses/flux2-LICENSE). +"""FLUX.2 klein DiT module tree and forward. + +Attribute paths equal the GGUF tensor names, so numbered elements are +plain lists. + +A sample holds the image latents, the latents of any reference images and +the text. The image stream carries the image tokens, then the reference +tokens, all through ``img_in``. The text stream carries the text through +``txt_in``. Each double block runs both streams with weights of their own +and one attention over the text, then the image stream. The two streams +then join, text first, and run the single blocks. The velocity is the +final layer on the image tokens. + +One time vector, from the step's time, drives every modulation: one for +the image stream of every double block, one for its text stream, one for +every single block and one for the final layer. The reference tokens take +the image's. Every norm is a LayerNorm without affine parameters, and the +modulated input is ``(1 + scale) * norm(x) + shift``. A double block adds +the attention and then the feed-forward of each stream, each through its +own norm and gate. A single block feeds one modulated norm to one fused +product, of q, k, v and the feed-forward's gate and up halves, and adds +the gated product of the attention rows and the feed-forward rows. + +The time embedding follows the reference pipeline, which holds the time +in bf16: the embedder multiplies by 1000 in bf16 and returns the embedding +in bf16, in every activation dtype. The time vector and the modulations +then run in fp32 and round once. + +RoPE has four axes of 32 dims at theta 2000. An image token sits at (0, +row, column, 0), a token of reference image i at (10 + 10 i, row, column, +0), and a text token at (0, 0, 0, position). The tables follow the +reference's fp32 arithmetic. +""" + +from __future__ import annotations + +from dataclasses import dataclass + +import mlx.core as mx +import mlx.nn as nn +import numpy as np + +from gmlx.image import ops, pacing +from gmlx.image.dtypes import ImageDtypeError +from gmlx.image.ops.products import own, precise + +# The time axis of reference image i is REF_T * (1 + i). +REF_T = 10 + + +@dataclass(frozen=True) +class Flux2Config: + dim: int + heads: int + head_dim: int + depth: int + depth_single: int + mlp_dim: int + in_channels: int + out_channels: int + text_dim: int + t_dim: int + axes_dims: tuple + theta: float + eps: float + + @classmethod + def from_dict(cls, c: dict) -> "Flux2Config": + head_dim = int(c["attention_head_dim"]) + heads = int(c["num_attention_heads"]) + axes = tuple(int(a) for a in c["axes_dims_rope"]) + if sum(axes) != head_dim or any(a % 2 for a in axes): + raise ValueError(f"RoPE axes {axes} must be even dims that sum " + f"to the head dim {head_dim}") + if c.get("guidance_embeds"): + raise ValueError("a FLUX.2 DiT that embeds a guidance is not " + "FLUX.2 klein") + if int(c.get("patch_size", 1)) != 1: + raise ValueError("FLUX.2 klein takes one latent pixel per token") + dim = heads * head_dim + in_ch = int(c["in_channels"]) + out_ch = c.get("out_channels") + return cls( + dim=dim, heads=heads, head_dim=head_dim, + depth=int(c["num_layers"]), + depth_single=int(c["num_single_layers"]), + mlp_dim=int(dim * float(c["mlp_ratio"])), + in_channels=in_ch, + out_channels=in_ch if out_ch is None else int(out_ch), + text_dim=int(c["joint_attention_dim"]), + t_dim=int(c["timestep_guidance_channels"]), axes_dims=axes, + theta=float(c["rope_theta"]), eps=float(c["eps"])) + + +def _bf16(a: np.ndarray) -> np.ndarray: + """float32 values rounded to bfloat16, to nearest even.""" + return np.array(mx.array(np.asarray(a, np.float32)).astype( + mx.bfloat16).astype(mx.float32)) + + +def time_embedding(t, dim: int) -> mx.array: + """The embedding (B, dim) of times ``t`` as the reference forms it + from its bf16 time: 1000 times the time rounded to bf16, the cosines + and sines in fp32, and the embedding rounded to bf16. Returned as the + bf16 values in float32.""" + t1000 = _bf16(np.float32(1000) * _bf16(np.reshape(t, (-1,)))) + emb = ops.timestep_embedding(t1000, dim) + return emb.astype(mx.bfloat16).astype(mx.float32) + + +def rope_tables(ids: np.ndarray, axes_dims, theta: float) -> tuple: + """cos and sin tables (L, sum(axes_dims) // 2) for integer position + ids (L, n_axes). The reference forms each frequency as 1 / theta ** + (2 i / d) and each angle as position times frequency in fp32; the + cosines and sines here are those of the fp32 angle, rounded once.""" + cos, sin = [], [] + theta32 = np.float32(theta) + for axis, d in enumerate(axes_dims): + expo = (np.arange(0, d, 2) / d).astype(np.float32) + freqs = np.float32(1) / np.power(theta32, expo) + ang = np.asarray(ids[:, axis], np.float32)[:, None] * freqs[None] + ang = ang.astype(np.float64) + cos.append(np.cos(ang).astype(np.float32)) + sin.append(np.sin(ang).astype(np.float32)) + return (mx.array(np.concatenate(cos, axis=1)), + mx.array(np.concatenate(sin, axis=1))) + + +def image_ids(h: int, w: int, index: int | None = None) -> np.ndarray: + """Position ids (h * w, 4) of a latent grid in row-major order: (0, + row, column, 0) for the image, and the first axis at REF_T * (1 + + ``index``) for reference image ``index``.""" + rows, cols = np.meshgrid(np.arange(h), np.arange(w), indexing="ij") + ids = np.zeros((h * w, 4), np.float32) + ids[:, 1] = rows.reshape(-1) + ids[:, 2] = cols.reshape(-1) + if index is not None: + ids[:, 0] = REF_T * (1 + index) + return ids + + +def text_ids(n: int) -> np.ndarray: + ids = np.zeros((n, 4), np.float32) + ids[:, 3] = np.arange(n) + return ids + + +def tokens(latents: mx.array) -> mx.array: + """Latents (B, C, h, w) as tokens (B, h * w, C), row-major.""" + b, c, h, w = latents.shape + return latents.reshape(b, c, h * w).transpose(0, 2, 1) + + +class RMSNorm(nn.Module): + """The reference's q and k norm: its scale is the weight itself, and + it runs in fp32 inside ``ops.qk_norm_rope``.""" + + def __init__(self, dims: int): + super().__init__() + self.scale = mx.ones((dims,)) + + +class QKNorm(nn.Module): + def __init__(self, head_dim: int): + super().__init__() + self.query_norm = RMSNorm(head_dim) + self.key_norm = RMSNorm(head_dim) + + +def adaln(x: mx.array, shift: mx.array, scale: mx.array, eps: float, + dtype) -> mx.array: + """``(1 + scale) * LayerNorm(x) + shift`` in fp32 with ``1 + scale`` + in the dtype of ``scale``, rounded once to ``dtype``.""" + y = ops.layer_norm(x.astype(mx.float32), eps) + return (ops.modulate(y, scale) + shift).astype(dtype) + + +def heads(attn_qkv: mx.array, n_heads: int, head_dim: int) -> tuple: + """q, k and v (B, L, H, D) of a fused qkv product (B, L, 3 H D).""" + b, n, _ = attn_qkv.shape + qkv = attn_qkv.reshape(b, n, 3, n_heads, head_dim) + return qkv[:, :, 0], qkv[:, :, 1], qkv[:, :, 2] + + +def qk(norm: QKNorm, q: mx.array, k: mx.array, cos: mx.array, + sin: mx.array, eps: float) -> tuple: + return ops.qk_norm_rope(q, k, norm.query_norm.scale, + norm.key_norm.scale, cos, sin, eps) + + +def gated_out(lin, x: mx.array, gate: mx.array, rows: mx.array) -> mx.array: + """``x + gate * lin(rows)``, on mlx-kquant's residual epilogue when its + route takes the leaf.""" + leaf = ops.resid_leaf(lin, rows, x, gate) + if leaf is not None: + return ops.resid_fused(rows, leaf, x, gate) + return ops.gated_residual(x, gate, lin(rows)) + + +class SelfAttention(nn.Module): + def __init__(self, dim: int, head_dim: int): + super().__init__() + self.qkv = nn.Linear(dim, 3 * dim, bias=False) + self.norm = QKNorm(head_dim) + self.proj = nn.Linear(dim, dim, bias=False) + + +class SiLUGate(nn.Module): + """``silu(a) * b`` of the halves a, b of its input: the reference's + SiLUActivation, which holds no weight.""" + + def __call__(self, x: mx.array) -> mx.array: + a, b = mx.split(x, 2, axis=-1) + return ops.swiglu(a, b) + + +def feed_forward(dim: int, mlp_dim: int) -> list: + return [nn.Linear(dim, 2 * mlp_dim, bias=False), SiLUGate(), + nn.Linear(mlp_dim, dim, bias=False)] + + +class DoubleBlock(nn.Module): + """One block of both streams: per stream a modulated norm, its q, k + and v, one attention over the text then the image tokens, the gated + projection, then a modulated norm and the gated feed-forward.""" + + def __init__(self, cfg: Flux2Config): + super().__init__() + d = cfg.dim + self.img_attn = SelfAttention(d, cfg.head_dim) + self.img_mlp = feed_forward(d, cfg.mlp_dim) + self.txt_attn = SelfAttention(d, cfg.head_dim) + self.txt_mlp = feed_forward(d, cfg.mlp_dim) + self.heads = cfg.heads + self.head_dim = cfg.head_dim + self.eps = cfg.eps + + def adaln(self, x: mx.array, shift: mx.array, + scale: mx.array) -> mx.array: + return adaln(x, shift, scale, self.eps, x.dtype) + + def qkv(self, attn: SelfAttention, h: mx.array, cos: mx.array, + sin: mx.array) -> tuple: + """q and k normed and rotated, and v, each (B, H, L, D).""" + q, k, v = heads(attn.qkv(h), self.heads, self.head_dim) + q, k = qk(attn.norm, q, k, cos, sin, self.eps) + return q, k, v.transpose(0, 2, 1, 3) + + def hidden(self, mlp: list, h: mx.array) -> mx.array: + """``silu(a) * b`` of the halves a, b of ``mlp[0](h)``: the rows + that ``mlp[2]`` takes.""" + pair = ops.glu_halves(mlp[0], h) + if pair is not None: + return ops.swiglu_fused(h, *pair) + return mlp[1](mlp[0](h)) + + def out(self, lin, x: mx.array, gate: mx.array, + rows: mx.array) -> mx.array: + return gated_out(lin, x, gate, rows) + + def __call__(self, img: mx.array, txt: mx.array, mod_img: tuple, + mod_txt: tuple, rope_img: tuple, rope_txt: tuple) -> tuple: + (i_shift, i_scale, i_gate), (i_shift2, i_scale2, i_gate2) = mod_img + (t_shift, t_scale, t_gate), (t_shift2, t_scale2, t_gate2) = mod_txt + qi, ki, vi = self.qkv(self.img_attn, + self.adaln(img, i_shift, i_scale), *rope_img) + qt, kt, vt = self.qkv(self.txt_attn, + self.adaln(txt, t_shift, t_scale), *rope_txt) + o = ops.sdpa(mx.concatenate([qt, qi], axis=2), + mx.concatenate([kt, ki], axis=2), + mx.concatenate([vt, vi], axis=2)) + b, n_txt = txt.shape[0], txt.shape[1] + o = o.transpose(0, 2, 1, 3).reshape(b, o.shape[2], -1) + img = self.out(self.img_attn.proj, img, i_gate, o[:, n_txt:]) + txt = self.out(self.txt_attn.proj, txt, t_gate, o[:, :n_txt]) + img = self.out(self.img_mlp[2], img, i_gate2, self.hidden( + self.img_mlp, self.adaln(img, i_shift2, i_scale2))) + txt = self.out(self.txt_mlp[2], txt, t_gate2, self.hidden( + self.txt_mlp, self.adaln(txt, t_shift2, t_scale2))) + return img, txt + + +class SingleBlock(nn.Module): + """One block of the joint tokens: a modulated norm feeds one product of + q, k, v and the feed-forward halves, and one gated product of the + attention and feed-forward rows adds to the residual.""" + + def __init__(self, cfg: Flux2Config): + super().__init__() + d = cfg.dim + self.linear1 = nn.Linear(d, 3 * d + 2 * cfg.mlp_dim, bias=False) + self.linear2 = nn.Linear(d + cfg.mlp_dim, d, bias=False) + self.norm = QKNorm(cfg.head_dim) + self.dim = d + self.heads = cfg.heads + self.head_dim = cfg.head_dim + self.eps = cfg.eps + + def adaln(self, x: mx.array, shift: mx.array, + scale: mx.array) -> mx.array: + return adaln(x, shift, scale, self.eps, x.dtype) + + def out(self, x: mx.array, gate: mx.array, rows: mx.array, + hid: mx.array) -> mx.array: + """``x + gate * linear2([rows, hid])``.""" + return gated_out(self.linear2, x, gate, + mx.concatenate([rows, hid], axis=-1)) + + def __call__(self, x: mx.array, mod: tuple, cos: mx.array, + sin: mx.array) -> mx.array: + shift, scale, gate = mod + y = self.linear1(self.adaln(x, shift, scale)) + d3 = 3 * self.dim + q, k, v = heads(y[..., :d3], self.heads, self.head_dim) + q, k = qk(self.norm, q, k, cos, sin, self.eps) + o = ops.sdpa(q, k, v.transpose(0, 2, 1, 3)) + b, n = x.shape[0], x.shape[1] + rows = o.transpose(0, 2, 1, 3).reshape(b, n, -1) + a, g = mx.split(y[..., d3:], 2, axis=-1) + return self.out(x, gate, rows, ops.swiglu(a, g)) + + +class MLPEmbedder(nn.Module): + def __init__(self, in_dim: int, dim: int): + super().__init__() + self.in_layer = nn.Linear(in_dim, dim, bias=False) + self.out_layer = nn.Linear(dim, dim, bias=False) + + +class Modulation(nn.Module): + """shift, scale and gate of every block of a kind, twice over for a + double block, from the time vector.""" + + def __init__(self, dim: int, n: int): + super().__init__() + self.lin = nn.Linear(dim, n * dim, bias=False) + + +class LastLayer(nn.Module): + def __init__(self, dim: int, out: int, eps: float): + super().__init__() + self.linear = nn.Linear(dim, out, bias=False) + self.adaLN_modulation = [nn.SiLU(), nn.Linear(dim, 2 * dim, + bias=False)] + self.eps = eps + + def __call__(self, x: mx.array, shift: mx.array, + scale: mx.array) -> mx.array: + return self.linear(adaln(x, shift, scale, self.eps, x.dtype)) + + +@dataclass(frozen=True) +class StepModulation: + """What one step derives from its time: the two (shift, scale, gate) + triples of the image and of the text stream of the double blocks, the + triple of the single blocks and the final layer's shift and scale, + each (B, 1, dim) in the activation dtype.""" + img: tuple + txt: tuple + single: tuple + final: tuple + + def arrays(self) -> list: + return [*self.img[0], *self.img[1], *self.txt[0], *self.txt[1], + *self.single, *self.final] + + +@dataclass(frozen=True) +class Caption: + """What one step derives from the conditioning: the text tokens after + ``txt_in``, (B, L, dim). The double blocks read the step's time + vector, so they run in the step.""" + rows: mx.array + + def arrays(self) -> list: + return [self.rows] + + +@dataclass(frozen=True) +class References: + """The latents of the reference images as tokens (B, L, channels), in + the order of their images, with their position ids (L, 4).""" + tokens: mx.array + ids: np.ndarray + + @classmethod + def of(cls, latents: list) -> "References": + """Each reference latent (B, C, h, w) as tokens, with the ids of + its index in the list.""" + toks = [tokens(lat) for lat in latents] + ids = [image_ids(lat.shape[2], lat.shape[3], i) + for i, lat in enumerate(latents)] + return cls(mx.concatenate(toks, axis=1), np.concatenate(ids)) + + +class Flux2KleinDiT(nn.Module): + def __init__(self, config: dict): + super().__init__() + cfg = Flux2Config.from_dict(config) + self.cfg = cfg + self.act_dtype = mx.bfloat16 + d = cfg.dim + self.img_in = nn.Linear(cfg.in_channels, d, bias=False) + self.txt_in = nn.Linear(cfg.text_dim, d, bias=False) + self.time_in = MLPEmbedder(cfg.t_dim, d) + self.double_stream_modulation_img = Modulation(d, 6) + self.double_stream_modulation_txt = Modulation(d, 6) + self.single_stream_modulation = Modulation(d, 3) + self.double_blocks = [DoubleBlock(cfg) for _ in range(cfg.depth)] + self.single_blocks = [SingleBlock(cfg) + for _ in range(cfg.depth_single)] + self.final_layer = LastLayer(d, cfg.out_channels, cfg.eps) + + @property + def act_dtype(self) -> mx.Dtype: + return self._act_dtype + + @act_dtype.setter + def act_dtype(self, dtype: mx.Dtype) -> None: + if dtype == mx.float16: + raise ImageDtypeError("FLUX.2 klein never runs in float16") + self._act_dtype = dtype + + def _lin(self): + return precise if self.act_dtype != mx.float32 else own + + def vector(self, sigma, batch: int) -> mx.array: + """The time vector (B, dim) fp32 of ``sigma``.""" + lin = self._lin() + e = time_embedding(np.broadcast_to(np.asarray(sigma, np.float32), + (batch,)), self.cfg.t_dim) + return lin(self.time_in.out_layer, + nn.silu(lin(self.time_in.in_layer, e))) + + def modulation(self, sigma, batch: int) -> StepModulation: + lin = self._lin() + act = self.act_dtype + v = nn.silu(self.vector(sigma, batch)) + + def chunks(mod, n): + y = lin(mod, v).astype(act)[:, None, :] + return tuple(mx.split(y, n, axis=-1)) + + img = chunks(self.double_stream_modulation_img.lin, 6) + txt = chunks(self.double_stream_modulation_txt.lin, 6) + return StepModulation( + img=(img[:3], img[3:]), txt=(txt[:3], txt[3:]), + single=chunks(self.single_stream_modulation.lin, 3), + final=chunks(self.final_layer.adaLN_modulation[1], 2)) + + def references(self, latents) -> References: + """The reference latents (B, C, h, w), in the order of their + images, as the tokens and ids the DiT takes.""" + return References.of(list(latents)) + + def caption(self, feats: mx.array, taps: dict | None = None) -> Caption: + """The text tokens of features (B, L, text dim) after txt_in.""" + x = self.txt_in(feats.astype(self.act_dtype)) + if taps is not None: + taps["txt_in"] = x + return Caption(x) + + def __call__(self, latents: mx.array, sigma, feats: mx.array | None, + taps: dict | None = None, *, + refs: References | None = None, + mod: StepModulation | None = None, + caption: Caption | None = None) -> mx.array: + """Velocity (B, C, h, w) fp32 for latents (B, C, h, w) at + ``sigma``, with text features (B, L, text dim) and the tokens of + any reference images. ``mod`` and ``caption``, from + ``modulation`` and ``caption``, stand in for the work they hold. + ``taps`` collects the output of every block by module path, a + double block's as ``.img`` and ``.txt``.""" + b, _, h, w = latents.shape + cfg = self.cfg + act = self.act_dtype + if mod is None: + mod = self.modulation(sigma, b) + if caption is None: + if feats is None: + raise ValueError("pass text features or their caption") + caption = self.caption(feats, taps) + txt = caption.rows + if txt.shape[0] != b: + txt = mx.broadcast_to(txt, (b, *txt.shape[1:])) + x = tokens(latents) + ids = image_ids(h, w) + n_img = x.shape[1] + if refs is not None: + cond = refs.tokens + if cond.shape[0] != b: + cond = mx.broadcast_to(cond, (b, *cond.shape[1:])) + x = mx.concatenate([x, cond.astype(x.dtype)], axis=1) + ids = np.concatenate([ids, np.asarray(refs.ids, np.float32)]) + img = self.img_in(x.astype(act)) + if taps is not None: + taps["img_in"] = img + t_ids = text_ids(txt.shape[1]) + rope_img = rope_tables(ids, cfg.axes_dims, cfg.theta) + rope_txt = rope_tables(t_ids, cfg.axes_dims, cfg.theta) + for i, blk in enumerate(self.double_blocks): + img, txt = blk(img, txt, mod.img, mod.txt, rope_img, rope_txt) + pacing.point(img, txt) + if taps is not None: + taps[f"double_blocks.{i}.img"] = img + taps[f"double_blocks.{i}.txt"] = txt + n_txt = txt.shape[1] + joint = mx.concatenate([txt, img], axis=1) + cos, sin = rope_tables(np.concatenate([t_ids, ids]), cfg.axes_dims, + cfg.theta) + for i, blk in enumerate(self.single_blocks): + joint = blk(joint, mod.single, cos, sin) + pacing.point(joint) + if taps is not None: + taps[f"single_blocks.{i}"] = joint + out = self.final_layer(joint[:, n_txt:n_txt + n_img], *mod.final) + if taps is not None: + taps["final_layer"] = out + c = out.shape[-1] + return out.transpose(0, 2, 1).reshape(b, c, h, w).astype(mx.float32) diff --git a/licenses/flux2-LICENSE b/licenses/flux2-LICENSE index ede3f2a34..47b8a6ea5 100644 --- a/licenses/flux2-LICENSE +++ b/licenses/flux2-LICENSE @@ -9,6 +9,11 @@ source. Klein4BParams, Klein9BParams and Flux2Params in src/flux2/model.py, the defaults of FLUX2_MODEL_INFO in src/flux2/util.py, and the tensor names and shapes of Flux2 in src/flux2/model.py. +- gmlx/image/families/flux2_klein/model.py: the Flux2 forward, + DoubleStreamBlock, SingleStreamBlock, SelfAttention, SiLUActivation, + Modulation, LastLayer, MLPEmbedder, QKNorm, timestep_embedding and rope + of src/flux2/model.py, and the token ids of prc_img, prc_txt and + encode_image_refs in src/flux2/sampling.py. flux2 is distributed under the Apache License 2.0: diff --git a/scripts/image_oracle/check3_flux2_klein.py b/scripts/image_oracle/check3_flux2_klein.py new file mode 100644 index 000000000..0d82797ed --- /dev/null +++ b/scripts/image_oracle/check3_flux2_klein.py @@ -0,0 +1,573 @@ +#!/usr/bin/env python3 +"""Check 3 oracle for FLUX.2 klein: one denoise step of BFL's reference +DiT, block by block, on the weights of a DiT GGUF. + +The reference is BFL's flux2 repository, read from --reference (its src +directory), at the commit --reference-commit names, which the manifest +records. Its Flux2 class has no GGUF loader, and the GGUF tensor names are +its state dict keys, so the script builds the class on the meta device, +puts each quantized and BF16 matrix in a diffusers GGUFLinear over the +file's own bytes, and sets the F32 and F16 tensors in the mode's dtype. +Each GGUFLinear dequantizes its weight on every call in float32 +arithmetic (oracle ``dequant="exact"``), which is ggml's. + +One step is one call as the reference's denoise makes it for one sample: +the image tokens of batched_prc_img, then the tokens of the reference +images, if any, at the time offsets of encode_image_refs, the text tokens +of batched_prc_txt, and the step's time in bf16, as denoise fills it in +the dtype of the bf16 latents. The reference casts the model to bf16. +Here the fp32 model runs every op in float32 and the bf16 model every op +in bfloat16, products as one float32 GEMM over the bf16 operands with one +rounding (oracle.emulate_bf16_matmul). The time embedding is the +reference's own on the bf16 time, which it returns in bf16, in both modes; +a pre-hook casts it to the fp32 model's dtype. + +The latents are seeded normal rounded to bf16, as the reference's noise +is, at the time of --step in get_schedule(--steps, image tokens), which is +1 at the first step, or at --sigma. The text features are seeded normal +with --feature-std, rounded to bf16, in --text-len rows, which the +reference's encoder always pads to 512. With --refs N, N reference images +of --ref-size pixels each give seeded normal tokens, bf16. + +Every fixture holds the reference's time embedding as time_in takes it. +For a size in --rows the fixture holds, in float32: the inputs, the time +vector, the modulations, the token embeddings, the image and text output +of every double block, the output of every single block, the input of the +first single block and of the final layer, the final layer and the +velocity. The bf16 model runs the same call, and each of its blocks and +its final layer also run teacher-forced on the fp32 model's input to them, +with the fp32 model's modulations. The manifest sets each row's tolerance +to twice its bf16 against fp32 gap: teacher-forced for the blocks and the +final layer, free running for the rest and for the velocity. For the +other sizes the fixture holds the inputs and the velocities. + + python scripts/image_oracle/run.py --python --threads 16 \\ + check3_flux2_klein.py --reference /src \\ + --reference-commit --dit flux-2-klein-4b-Q4_K_M.gguf \\ + --sizes 512 --refs 1 + +--self-test writes a tiny model of the reference class on random weights, +so the gmlx side can check its conventions on the CPU. +""" + +from __future__ import annotations + +import argparse +import re +import sys +import time +import types +from pathlib import Path + +import numpy as np + +import fixtures +import oracle + +SCRIPT = "scripts/image_oracle/check3_flux2_klein.py" +RULE = ("tolerance = 2 x the oracle's own bf16 against fp32 relative L2: " + "teacher-forced for each block and the final layer, free running " + "for the time vector, modulations and embeddings and for the " + "velocity") +MODS = ("double_stream_modulation_img", "double_stream_modulation_txt", + "single_stream_modulation") +# The time offsets of encode_image_refs: reference i at REF_T * (1 + i). +REF_T = 10 + +# The tiny model of --self-test: Flux2Params scaled down, with two +# reference images of different grids. +TINY = {"in_channels": 8, "context_in_dim": 24, "hidden_size": 64, + "num_heads": 4, "depth": 2, "depth_single_blocks": 2, + "axes_dim": [4, 4, 4, 4], "theta": 2000, "mlp_ratio": 3.0, + "use_guidance_embed": False} +TINY_CASE = {"latent": (4, 6), "refs": ((2, 3), (2, 2)), "text": 10, + "sigma": 0.73} + + +def reference(path: Path): + """The reference's model and sampling modules. sampling imports + torchvision for its image preparation, which a step does not use and + the oracle environment lacks, so an empty module stands in.""" + sys.dont_write_bytecode = True + sys.path.insert(0, str(path)) + sys.modules.setdefault("torchvision", types.ModuleType("torchvision")) + from flux2 import model, sampling + + return model, sampling + + +def gguf_state(torch, path: Path) -> tuple[dict, dict]: + """The file's tensors by name, quantized and BF16 ones as + GGUFParameter, with the codec census.""" + import gguf + from diffusers.quantizers.gguf.utils import GGUFParameter + + reader = gguf.GGUFReader(str(path)) + floats = (gguf.GGMLQuantizationType.F32, gguf.GGMLQuantizationType.F16) + out, census = {}, {} + for t in reader.tensors: + name = re.sub(r"^(model\.)?diffusion_model\.", "", t.name) + census[t.tensor_type.name] = census.get(t.tensor_type.name, 0) + 1 + data = torch.from_numpy(np.array(t.data)) + if t.tensor_type in floats: + out[name] = data + else: + out[name] = GGUFParameter(data, quant_type=t.tensor_type) + return out, census + + +def params_of(fm, state: dict): + """Klein4BParams or Klein9BParams, by the width of img_in.""" + width = state["img_in.weight"].shape + for cls in (fm.Klein4BParams, fm.Klein9BParams): + p = cls() + if p.hidden_size in width: + return p + raise SystemExit(f"img_in.weight {tuple(width)} is no FLUX.2 klein size") + + +def _embedding_in_dtype(torch, model, dtype): + # The embedding is bf16, as the reference returns it for a bf16 time; + # the fp32 model takes it in its own dtype. + model.time_in.register_forward_pre_hook( + lambda _m, args, dt=dtype: tuple(a.to(dt) for a in args)) + + +def build(torch, fm, state: dict, mode: str): + """The reference DiT on ``state``, quantized leaves as GGUFLinear.""" + from diffusers.quantizers.gguf.utils import (GGUFParameter, + _replace_with_gguf_linear) + + dtype = oracle.torch_dtype(mode) + with torch.device("meta"): + model = fm.Flux2(params_of(fm, state)) + _replace_with_gguf_linear(model, dtype, state) + names = {n for n, _ in model.named_parameters()} + if names != set(state): + raise SystemExit(f"names: missing {sorted(names - set(state))[:4]}, " + f"extra {sorted(set(state) - names)[:4]}") + for name, v in state.items(): + owner, _, leaf = name.rpartition(".") + mod = model.get_submodule(owner) + if not isinstance(v, GGUFParameter): + v = torch.nn.Parameter(v.to(dtype), requires_grad=False) + mod._parameters[leaf] = v + assert not any(p.is_meta for p in model.parameters()) + assert not list(model.buffers()) + _embedding_in_dtype(torch, model, dtype) + return model.eval() + + +def plain_build(torch, fm, params, state: dict, mode: str): + """The reference DiT on float tensors in the mode's dtype.""" + dtype = oracle.torch_dtype(mode) + model = fm.Flux2(params) + model.load_state_dict({k: v.to(dtype) for k, v in state.items()}, + strict=True) + model = model.to(dtype) + _embedding_in_dtype(torch, model, dtype) + return model.eval() + + +def bf16(torch, a: np.ndarray) -> np.ndarray: + return oracle.to_numpy(torch.from_numpy(np.asarray(a, np.float32)).to( + torch.bfloat16)) + + +def _cat(torch, out): + """A modulation's chunks side by side, (B, n * dim).""" + flat = [] + + def walk(o): + if isinstance(o, (tuple, list)): + for x in o: + walk(x) + elif o is not None: + flat.append(o) + walk(out) + y = torch.cat(flat, dim=-1) + return y[:, 0] if y.dim() == 3 else y + + +class Capture: + """The rows of one call by gmlx module path. The forward calls each + block's forward_kv_extract, past module hooks, so each block's method + is wrapped on its instance.""" + + def __init__(self, torch, model, n_img: int): + self.torch = torch + self.rows: dict = {} + self.inputs: dict = {} + self.kwargs: dict = {} + self.undo = [] + self.n_img = n_img + hook = self._hook + hook("vec", model.time_in) + for name in MODS: + hook(name, getattr(model, name), chunks=True) + hook("final_layer.adaLN_modulation", + model.final_layer.adaLN_modulation, chunks=True) + hook("img_in", model.img_in) + hook("txt_in", model.txt_in) + hook("final_layer", model.final_layer, image=True) + for i, b in enumerate(model.double_blocks): + self._wrap(f"double_blocks.{i}", b, double=True) + for i, b in enumerate(model.single_blocks): + self._wrap(f"single_blocks.{i}", b, double=False) + + def _hook(self, name, mod, *, chunks=False, image=False): + def keep(_m, args, out): + if chunks: + out = _cat(self.torch, out) + if image: + out = out[:, :self.n_img] + self.inputs[name] = tuple( + a[:, :self.n_img] if i == 0 else a + for i, a in enumerate(args)) + self.rows[name] = out[0] if out.dim() == 3 else out + h = mod.register_forward_hook(keep) + self.undo.append(h.remove) + + def _wrap(self, name, blk, double: bool): + orig = blk.forward_kv_extract + + def run(*args, **kw): + self.inputs[name] = args + self.kwargs[name] = kw + out = orig(*args, **kw) + if double: + self.rows[f"{name}.img"] = out[0][0] + self.rows[f"{name}.txt"] = out[1][0] + else: + self.rows[name] = out[0][0] + return out + blk.forward_kv_extract = run + self.undo.append(lambda: delattr(blk, "forward_kv_extract")) + + def remove(self): + for u in self.undo: + u() + + +def case_inputs(torch, sampling, lat: np.ndarray, feats: np.ndarray, + refs: list, mode: str) -> dict: + """The tokens and ids of one sample, as the reference's denoise takes + them, in the mode's dtype.""" + dtype = oracle.torch_dtype(mode) + x, x_ids = sampling.batched_prc_img(torch.from_numpy(lat).to( + torch.bfloat16)) + n_img = x.shape[1] + if refs: + t_off = [REF_T + REF_T * t for t in torch.arange(0, len(refs))] + t_off = [t.view(-1) for t in t_off] + toks, ids = sampling.listed_prc_img( + [torch.from_numpy(r[0]).to(torch.bfloat16) for r in refs], + t_coord=t_off) + x = torch.cat([x, torch.cat(toks)[None]], dim=1) + x_ids = torch.cat([x_ids, torch.cat(ids)[None]], dim=1) + ctx, ctx_ids = sampling.batched_prc_txt( + torch.from_numpy(feats[None]).to(torch.bfloat16)) + return {"x": x.to(dtype), "x_ids": x_ids, "ctx": ctx.to(dtype), + "ctx_ids": ctx_ids, "n_img": n_img} + + +def call(torch, sampling, model, lat, feats, refs, sigma, mode, rows: bool): + ins = case_inputs(torch, sampling, lat, feats, refs, mode) + n_img = ins["n_img"] + # denoise fills the time in the dtype of its bf16 latents. + t_vec = torch.full((1,), sigma, dtype=torch.bfloat16) + cap = Capture(torch, model, n_img) if rows else None + emb = [] + h_emb = model.time_in.register_forward_pre_hook( + lambda _m, args: emb.append(args[0])) + try: + out = model(x=ins["x"], x_ids=ins["x_ids"], timesteps=t_vec, + ctx=ins["ctx"], ctx_ids=ins["ctx_ids"], guidance=None) + finally: + h_emb.remove() + if cap is not None: + cap.remove() + ins["time_in"] = emb[0] + _, c, h, w = lat.shape + vel = oracle.to_numpy(out[0, :n_img]).T.reshape(1, c, h, w) + return vel, cap, ins + + +def teacher_forced(torch, model16, cap32: Capture) -> dict: + """The bf16 output of each block and of the final layer fed the fp32 + model's inputs and modulations. The rotation tables stay float32, as + the reference forms them.""" + def cast(a): + if isinstance(a, tuple): + return tuple(cast(x) for x in a) + if isinstance(a, torch.Tensor) and a.is_floating_point() \ + and a.dim() != 6: + return a.to(torch.bfloat16) + return a + + out = {} + for name, args in cap32.inputs.items(): + if name.startswith("double_blocks."): + blk = model16.get_submodule(name) + img, txt, _ = blk.forward_kv_extract( + *(cast(a) for a in args), **cap32.kwargs[name]) + out[f"{name}.img"] = oracle.to_numpy(img[0]) + out[f"{name}.txt"] = oracle.to_numpy(txt[0]) + elif name.startswith("single_blocks."): + blk = model16.get_submodule(name) + y, _ = blk.forward_kv_extract(*(cast(a) for a in args), + **cap32.kwargs[name]) + out[name] = oracle.to_numpy(y[0]) + # The final layer forms its shift and scale from the time vector, so + # it runs here on the fp32 model's, rounded to bf16, as the blocks + # take theirs. + fl = model16.final_layer + x = cast(cap32.inputs["final_layer"][0]) + mod = cap32.rows["final_layer.adaLN_modulation"].to(torch.bfloat16) + shift, scale = mod[:, None].chunk(2, dim=-1) + y = fl.linear((1 + scale) * fl.norm_final(x) + shift) + out["final_layer"] = oracle.to_numpy(y[0]) + return out + + +def rows_of(cap: Capture) -> dict: + return {k: oracle.to_numpy(v) for k, v in cap.rows.items()} + + +def run_case(torch, sampling, models: dict, lat, feats, refs, sigma, + rows: bool, name: str, inputs: dict, files: dict, notes: list, + *, check: int = 3, script: str = SCRIPT, more=None) -> dict: + """One step in fp32 and bf16 written as fixture ``name``. ``more`` + takes the writer and the fp32 velocity before the write. Returns the + velocity of each mode.""" + fx = fixtures.FixtureWriter(name, check=check, family="flux2_klein", + script=script) + fx.inputs.update(inputs) + for role, path in files.items(): + fx.add_file(role, path) + for n in notes: + fx.note(n) + fx.add("latents", lat) + fx.add("features", feats) + for i, r in enumerate(refs): + fx.add(f"refs.{i}", r) + fx.add("sigma", np.float32(sigma)) + vel, caps, times = {}, {}, {} + for mode in ("fp32", "bf16"): + t0 = time.perf_counter() + oracle.emulate_bf16_matmul(mode == "bf16") + vel[mode], caps[mode], ins = call( + torch, sampling, models[mode], lat, feats, refs, sigma, mode, + rows) + times[f"{mode}_s"] = round(time.perf_counter() - t0, 1) + oracle.emulate_bf16_matmul(False) + fx.add("ids.image", oracle.to_numpy(ins["x_ids"][0])) + fx.add("ids.text", oracle.to_numpy(ins["ctx_ids"][0])) + # The reference's embedding of the bf16 time: its fp32 exp can be an + # ulp off the correctly rounded one, which can move one bf16 entry. + fx.add("in.time_in", oracle.to_numpy(ins["time_in"])) + fx.add("velocity", vel["fp32"]) + fx.add("velocity_bf16", vel["bf16"]) + gap = fixtures.compare(vel["bf16"], vel["fp32"]) + fx.results["velocity_bf16_vs_fp32"] = gap + fx.tolerances["velocity"] = {"rel_l2": 2 * gap["rel_l2"], + "cosine_min": 1 - 4 * (1 - gap["cosine"])} + if rows: + r32, r16 = rows_of(caps["fp32"]), rows_of(caps["bf16"]) + oracle.emulate_bf16_matmul(True) + t0 = time.perf_counter() + tf = teacher_forced(torch, models["bf16"], caps["fp32"]) + times["bf16_teacher_forced_s"] = round(time.perf_counter() - t0, 1) + oracle.emulate_bf16_matmul(False) + ins32 = caps["fp32"].inputs + fx.add("in.single_blocks.0", oracle.to_numpy( + ins32["single_blocks.0"][0][0])) + fx.add("in.final_layer", oracle.to_numpy(ins32["final_layer"][0][0])) + gaps = {} + for k, a in r32.items(): + fx.add(k, a) + forced = k in tf + gaps[k] = fixtures.compare(tf[k] if forced else r16[k], a) + gaps[k]["teacher_forced"] = forced + fx.tolerances[k] = {"rel_l2": 2 * gaps[k]["rel_l2"], + "teacher_forced": forced} + fx.results["rows_bf16_vs_fp32"] = gaps + fx.results["free_bf16_vs_fp32"] = { + k: fixtures.compare(r16[k], r32[k])["rel_l2"] for k in tf} + fx.results["times"] = times + fx.tolerances["rule"] = RULE + if more is not None: + more(fx, vel["fp32"]) + path = fx.write() + print(f"[check3] {name}: velocity bf16 vs fp32 rel L2 " + f"{gap['rel_l2']:.3e}, {times}, wrote {path}", flush=True) + return vel + + +def seeded(torch, rng, shape, std=1.0) -> np.ndarray: + return bf16(torch, rng.standard_normal(shape) * std) + + +# The self-test. + +def tiny_state(torch, fm, params, seed: int) -> dict: + """Random tiny weights by name, float32 numpy in torch order: norm + scales near one, matrices at 1 / sqrt(fan in).""" + with torch.device("meta"): + model = fm.Flux2(params) + rng = np.random.default_rng(seed) + out = {} + for name, p in model.named_parameters(): + shape = tuple(p.shape) + if name.endswith(".scale"): + v = 1 + rng.standard_normal(shape) * 0.2 + else: + v = rng.standard_normal(shape) / np.sqrt(shape[-1]) + out[name] = v.astype(np.float32) + return out + + +def tiny_config() -> dict: + """The tiny model in the keys of the official transformer config.""" + t = TINY + return {"attention_head_dim": t["hidden_size"] // t["num_heads"], + "axes_dims_rope": list(t["axes_dim"]), "eps": 1e-06, + "guidance_embeds": False, "in_channels": t["in_channels"], + "joint_attention_dim": t["context_in_dim"], + "mlp_ratio": t["mlp_ratio"], "num_attention_heads": t["num_heads"], + "num_layers": t["depth"], + "num_single_layers": t["depth_single_blocks"], + "out_channels": None, "patch_size": 1, "rope_theta": t["theta"], + "timestep_guidance_channels": 256} + + +def self_test(torch, fm, sampling, commit: str, a) -> int: + params = fm.Flux2Params(**TINY) + state = tiny_state(torch, fm, params, a.seed) + rng = np.random.default_rng(a.seed + 1) + c = TINY["in_channels"] + h, w = TINY_CASE["latent"] + lat = seeded(torch, rng, (1, c, h, w)) + feats = seeded(torch, rng, (TINY_CASE["text"], TINY["context_in_dim"]), + 2.0) + refs = [seeded(torch, rng, (1, c, rh, rw)) + for rh, rw in TINY_CASE["refs"]] + fx_inputs = {"config": tiny_config(), "case": TINY_CASE, "seed": a.seed, + "reference_commit": commit} + st = {k: torch.from_numpy(v) for k, v in state.items()} + models = {m: plain_build(torch, fm, params, st, m) + for m in ("fp32", "bf16")} + for with_refs, name in ((True, "selftest_flux2_klein_tiny"), + (False, "selftest_flux2_klein_tiny_norefs")): + run_case(torch, sampling, models, lat, feats, + refs if with_refs else [], TINY_CASE["sigma"], True, name, + dict(fx_inputs, refs=len(refs) if with_refs else 0), {}, + ["the weights are in selftest_flux2_klein_tiny_weights by " + "GGUF name in torch order"]) + wx = fixtures.FixtureWriter("selftest_flux2_klein_tiny_weights", check=3, + family="flux2_klein", script=SCRIPT) + wx.inputs.update(fx_inputs) + for g, v in state.items(): + wx.add(g, v) + wx.write() + rope_fixture(torch, fm, commit) + return 0 + + +def rope_fixture(torch, fm, commit: str) -> None: + """The reference's RoPE tables of a klein head, four axes of 32 at + theta 2000, at the positions of small grids and up to 4095, where an + angle formed in float64 differs from the reference's fp32 one.""" + pos = np.concatenate([np.arange(64), [127, 128, 255, 256, 511, 1000, + 1023, 2047, 2048, 3000, 4095]]) + ids = np.stack([pos, pos[::-1], np.roll(pos, 7), pos], axis=1) + emb = fm.EmbedND(dim=128, theta=2000, axes_dim=[32] * 4)( + torch.from_numpy(ids.astype(np.int64))[None]) + fx = fixtures.FixtureWriter("selftest_flux2_klein_rope", check=3, + family="flux2_klein", script=SCRIPT) + fx.inputs.update({"axes_dims": [32] * 4, "theta": 2000, + "reference_commit": commit, + "ids": "int64, as prc_img and prc_txt give them"}) + fx.add("ids", ids.astype(np.int64)) + fx.add("cos", oracle.to_numpy(emb[0, 0, :, :, 0, 0])) + fx.add("sin", oracle.to_numpy(emb[0, 0, :, :, 1, 0])) + fx.write() + + +def main(argv=None) -> int: + ap = argparse.ArgumentParser(description=__doc__.split("\n\n")[0]) + ap.add_argument("--reference", type=Path, required=True, + help="src directory of BFL's flux2") + ap.add_argument("--reference-commit", required=True, + help="the commit of --reference, for the manifest") + ap.add_argument("--dit", type=Path, help="FLUX.2 klein DiT GGUF") + ap.add_argument("--sizes", type=int, nargs="+", default=[512, 1024]) + ap.add_argument("--rows", type=int, nargs="*", default=[512], + help="sizes whose fixture holds every row") + ap.add_argument("--refs", type=int, default=0, + help="reference images, each of --ref-size") + ap.add_argument("--ref-size", type=int, default=0, + help="pixels of a reference side, 0 for the size") + ap.add_argument("--text-len", type=int, default=512) + ap.add_argument("--feature-std", type=float, default=4.0) + ap.add_argument("--steps", type=int, default=4, + help="steps of the schedule --step reads") + ap.add_argument("--step", type=int, default=0, + help="step of the schedule whose time is the image's") + ap.add_argument("--sigma", type=float, + help="the image's time, the time of --step when unset") + ap.add_argument("--seed", type=int, default=0) + ap.add_argument("--dequant", choices=oracle.DEQUANT, default="exact") + ap.add_argument("--name", default="check3_flux2_klein") + ap.add_argument("--self-test", action="store_true") + a = ap.parse_args(argv) + torch = oracle.setup() + oracle.set_dequant(a.dequant) + fm, sampling = reference(a.reference.expanduser()) + commit = a.reference_commit + if a.self_test: + return self_test(torch, fm, sampling, commit, a) + if a.dit is None: + ap.error("--dit is required") + t0 = time.perf_counter() + state, census = gguf_state(torch, a.dit) + models = {m: build(torch, fm, state, m) for m in ("fp32", "bf16")} + params = params_of(fm, state) + print(f"[check3] loaded {a.dit.name} in " + f"{time.perf_counter() - t0:.1f}s, codecs {census}, width " + f"{params.hidden_size}", flush=True) + rng = np.random.default_rng(a.seed) + feats = seeded(torch, rng, (a.text_len, params.context_in_dim), + a.feature_std) + c = params.in_channels + for size in a.sizes: + n = size // 16 + schedule = sampling.get_schedule(a.steps, n * n) + sigma = float(schedule[a.step]) if a.sigma is None else a.sigma + srng = np.random.default_rng(a.seed + size) + lat = seeded(torch, srng, (1, c, n, n)) + rn = (a.ref_size or size) // 16 + refs = [seeded(torch, srng, (1, c, rn, rn)) for _ in range(a.refs)] + inputs = {"size": size, "sigma": sigma, "step": a.step, + "schedule": f"get_schedule({a.steps}, {n * n})", + "seed": a.seed + size, + "latents": "seeded normal, rounded to bf16", + "features": f"seeded normal, std {a.feature_std}, " + "rounded to bf16", + "text_rows": int(feats.shape[0]), "refs": a.refs, + "ref_size": rn * 16 if a.refs else 0, + "dequant": oracle.dequant_mode(), + "matmul_bf16": "bf16 operands, float32 GEMM, one bf16 " + "rounding", + "timestep": "bf16 as the reference's denoise fills it, in " + "both modes", + "reference_commit": commit, "gguf_codecs": census} + tag = f"_r{a.refs}" if a.refs else "" + run_case(torch, sampling, models, lat, feats, refs, sigma, + size in a.rows, f"{a.name}{tag}_{size}", inputs, + {"dit": a.dit}, []) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tests/fixtures/image/oracle/selftest_flux2_klein_rope.manifest.json b/tests/fixtures/image/oracle/selftest_flux2_klein_rope.manifest.json new file mode 100644 index 000000000..88ea6284b --- /dev/null +++ b/tests/fixtures/image/oracle/selftest_flux2_klein_rope.manifest.json @@ -0,0 +1,94 @@ +{ + "schema": 1, + "name": "selftest_flux2_klein_rope", + "check": 3, + "family": "flux2_klein", + "script": "scripts/image_oracle/check3_flux2_klein.py", + "argv": [ + "check3_flux2_klein.py", + "--reference", + "src", + "--reference-commit", + "50fe5162777813d869182b139e83b10743caef15", + "--self-test" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": {}, + "inputs": { + "axes_dims": [ + 32, + 32, + 32, + 32 + ], + "theta": 2000, + "reference_commit": "50fe5162777813d869182b139e83b10743caef15", + "ids": "int64, as prc_img and prc_txt give them" + }, + "results": {}, + "tolerances": {}, + "notes": [], + "created": "2026-10-16T11:56:33Z", + "npz": "selftest_flux2_klein_rope.npz", + "tensors": { + "cos": { + "shape": [ + 75, + 64 + ], + "dtype": "float32", + "sha256": "6732727905d7a070c3f8855446f072e31c88db1521606f8de4c0555960071e1c" + }, + "ids": { + "shape": [ + 75, + 4 + ], + "dtype": "int64", + "sha256": "f3bbf26fa1f5268f372c54d28cd86e2eb128f34d8c3c521ba3e960ce39718e4c" + }, + "sin": { + "shape": [ + 75, + 64 + ], + "dtype": "float32", + "sha256": "025d95297c4cb5a84f3007885d2eabd8e3b83def09f31f48fb1b1b7f436bd5c5" + } + } +} diff --git a/tests/fixtures/image/oracle/selftest_flux2_klein_rope.npz b/tests/fixtures/image/oracle/selftest_flux2_klein_rope.npz new file mode 100644 index 0000000000000000000000000000000000000000..3b380f68554df0ec836b36fda8e14a8e8b1066a0 GIT binary patch literal 41536 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 Byk`Ia literal 0 HcmV?d00001 diff --git a/tests/fixtures/image/oracle/selftest_flux2_klein_tiny.manifest.json b/tests/fixtures/image/oracle/selftest_flux2_klein_tiny.manifest.json new file mode 100644 index 000000000..d3e05b0ed --- /dev/null +++ b/tests/fixtures/image/oracle/selftest_flux2_klein_tiny.manifest.json @@ -0,0 +1,488 @@ +{ + "schema": 1, + "name": "selftest_flux2_klein_tiny", + "check": 3, + "family": "flux2_klein", + "script": "scripts/image_oracle/check3_flux2_klein.py", + "argv": [ + "check3_flux2_klein.py", + "--reference", + "src", + "--reference-commit", + "50fe5162777813d869182b139e83b10743caef15", + "--self-test" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": {}, + "inputs": { + "config": { + "attention_head_dim": 16, + "axes_dims_rope": [ + 4, + 4, + 4, + 4 + ], + "eps": 1e-06, + "guidance_embeds": false, + "in_channels": 8, + "joint_attention_dim": 24, + "mlp_ratio": 3.0, + "num_attention_heads": 4, + "num_layers": 2, + "num_single_layers": 2, + "out_channels": null, + "patch_size": 1, + "rope_theta": 2000, + "timestep_guidance_channels": 256 + }, + "case": { + "latent": [ + 4, + 6 + ], + "refs": [ + [ + 2, + 3 + ], + [ + 2, + 2 + ] + ], + "text": 10, + "sigma": 0.73 + }, + "seed": 0, + "reference_commit": "50fe5162777813d869182b139e83b10743caef15", + "refs": 2 + }, + "results": { + "velocity_bf16_vs_fp32": { + "rel_l2": 0.0063506451997405525, + "cosine": 0.9999803156128745, + "max_abs": 0.023116111755371094 + }, + "rows_bf16_vs_fp32": { + "vec": { + "rel_l2": 0.004206520147257769, + "cosine": 0.9999911578838456, + "max_abs": 0.0038957595825195312, + "teacher_forced": false + }, + "double_stream_modulation_img": { + "rel_l2": 0.004797003145433416, + "cosine": 0.9999885566261811, + "max_abs": 0.0030391812324523926, + "teacher_forced": false + }, + "double_stream_modulation_txt": { + "rel_l2": 0.0049745755897831435, + "cosine": 0.9999878769869379, + "max_abs": 0.003469109535217285, + "teacher_forced": false + }, + "single_stream_modulation": { + "rel_l2": 0.0045720852501727515, + "cosine": 0.9999896119206672, + "max_abs": 0.0030649900436401367, + "teacher_forced": false + }, + "img_in": { + "rel_l2": 0.0023982931753764357, + "cosine": 0.9999971398388828, + "max_abs": 0.01459193229675293, + "teacher_forced": false + }, + "txt_in": { + "rel_l2": 0.002349083299421639, + "cosine": 0.9999972424598135, + "max_abs": 0.018368244171142578, + "teacher_forced": false + }, + "double_blocks.0.img": { + "rel_l2": 0.0032043115656396164, + "cosine": 0.9999948686511482, + "max_abs": 0.023833274841308594, + "teacher_forced": true + }, + "double_blocks.0.txt": { + "rel_l2": 0.002967357239521432, + "cosine": 0.9999955980347915, + "max_abs": 0.03692913055419922, + "teacher_forced": true + }, + "double_blocks.1.img": { + "rel_l2": 0.0031024928461431235, + "cosine": 0.999995195561846, + "max_abs": 0.017305850982666016, + "teacher_forced": true + }, + "double_blocks.1.txt": { + "rel_l2": 0.002950988169627837, + "cosine": 0.9999956461837226, + "max_abs": 0.03692483901977539, + "teacher_forced": true + }, + "single_blocks.0": { + "rel_l2": 0.0025329813293491522, + "cosine": 0.9999967947671438, + "max_abs": 0.026701927185058594, + "teacher_forced": true + }, + "single_blocks.1": { + "rel_l2": 0.0024883959795424493, + "cosine": 0.999996906097007, + "max_abs": 0.02818584442138672, + "teacher_forced": true + }, + "final_layer.adaLN_modulation": { + "rel_l2": 0.005922086563735664, + "cosine": 0.9999831717073902, + "max_abs": 0.003377169370651245, + "teacher_forced": false + }, + "final_layer": { + "rel_l2": 0.0036409988368653833, + "cosine": 0.9999936639152218, + "max_abs": 0.016054153442382812, + "teacher_forced": true + } + }, + "free_bf16_vs_fp32": { + "double_blocks.0.img": 0.0037090958406877992, + "double_blocks.0.txt": 0.0032062588891522826, + "double_blocks.1.img": 0.004573847286382772, + "double_blocks.1.txt": 0.003961564243362384, + "single_blocks.0": 0.004671627934894035, + "single_blocks.1": 0.005149206544449982, + "final_layer": 0.0063506451997405525 + }, + "times": { + "fp32_s": 0.0, + "bf16_s": 0.0, + "bf16_teacher_forced_s": 0.0 + } + }, + "tolerances": { + "velocity": { + "rel_l2": 0.012701290399481105, + "cosine_min": 0.9999212624514979 + }, + "vec": { + "rel_l2": 0.008413040294515539, + "teacher_forced": false + }, + "double_stream_modulation_img": { + "rel_l2": 0.009594006290866833, + "teacher_forced": false + }, + "double_stream_modulation_txt": { + "rel_l2": 0.009949151179566287, + "teacher_forced": false + }, + "single_stream_modulation": { + "rel_l2": 0.009144170500345503, + "teacher_forced": false + }, + "img_in": { + "rel_l2": 0.0047965863507528714, + "teacher_forced": false + }, + "txt_in": { + "rel_l2": 0.004698166598843278, + "teacher_forced": false + }, + "double_blocks.0.img": { + "rel_l2": 0.006408623131279233, + "teacher_forced": true + }, + "double_blocks.0.txt": { + "rel_l2": 0.005934714479042864, + "teacher_forced": true + }, + "double_blocks.1.img": { + "rel_l2": 0.006204985692286247, + "teacher_forced": true + }, + "double_blocks.1.txt": { + "rel_l2": 0.005901976339255674, + "teacher_forced": true + }, + "single_blocks.0": { + "rel_l2": 0.0050659626586983045, + "teacher_forced": true + }, + "single_blocks.1": { + "rel_l2": 0.004976791959084899, + "teacher_forced": true + }, + "final_layer.adaLN_modulation": { + "rel_l2": 0.011844173127471328, + "teacher_forced": false + }, + "final_layer": { + "rel_l2": 0.007281997673730767, + "teacher_forced": true + }, + "rule": "tolerance = 2 x the oracle's own bf16 against fp32 relative L2: teacher-forced for each block and the final layer, free running for the time vector, modulations and embeddings and for the velocity" + }, + "notes": [ + "the weights are in selftest_flux2_klein_tiny_weights by GGUF name in torch order" + ], + "created": "2026-10-16T11:56:33Z", + "npz": "selftest_flux2_klein_tiny.npz", + "tensors": { + "double_blocks.0.img": { + "shape": [ + 34, + 64 + ], + "dtype": "float32", + "sha256": "e0de53727b78bc60bab27e5d8a18d99affbdb0c78825562ec9308c93d42a34c3" + }, + "double_blocks.0.txt": { + "shape": [ + 10, + 64 + ], + "dtype": "float32", + "sha256": "376de4e8ff7523d7a2bf2c7daf4962c3a8bd3f31c22ccb7fae6cebce9f709db3" + }, + "double_blocks.1.img": { + "shape": [ + 34, + 64 + ], + "dtype": "float32", + "sha256": "afa87dde36834b760bb84e634ead906638a674d7a5bcb095694de3a4b75ec24c" + }, + "double_blocks.1.txt": { + "shape": [ + 10, + 64 + ], + "dtype": "float32", + "sha256": "dbf3d01263462c18d6aafe605dcee71faf8c921b3565e7118b7952a2c6ee729a" + }, + "double_stream_modulation_img": { + "shape": [ + 1, + 384 + ], + "dtype": "float32", + "sha256": "bb2bf75bbf705cc0cd526a626c03661ec6c16099c81d1bf524783f4bd977eb11" + }, + "double_stream_modulation_txt": { + "shape": [ + 1, + 384 + ], + "dtype": "float32", + "sha256": "15a03eeaaf772afc75428c68ba2e9ae4005475900c3b6d040a39fb9aad0874bb" + }, + "features": { + "shape": [ + 10, + 24 + ], + "dtype": "float32", + "sha256": "266f8fc9fef4b1ceddb650a2aea642fb520784c50439535366e924e013a4e372" + }, + "final_layer": { + "shape": [ + 24, + 8 + ], + "dtype": "float32", + "sha256": "253c35c22d48d67d78b7b623c51ac63af328f6d3514e758e7b7eb17dae61c41f" + }, + "final_layer.adaLN_modulation": { + "shape": [ + 1, + 128 + ], + "dtype": "float32", + "sha256": "2e3e0a10bf7e690b12449e24b3f046f010c767af20fa4afe2d791776a880f5f2" + }, + "ids.image": { + "shape": [ + 34, + 4 + ], + "dtype": "float32", + "sha256": "da0a1fc78688efdef495a063a2567b9b6d1e09271a56691b0c9f8d12df22a558" + }, + "ids.text": { + "shape": [ + 10, + 4 + ], + "dtype": "float32", + "sha256": "e0ad99a12c7367bc4496c4a622d4a5853b020d1432107824791b86d2b03e5ec4" + }, + "img_in": { + "shape": [ + 34, + 64 + ], + "dtype": "float32", + "sha256": "1dfb2bfc6210b6d37d6b0b958dec3ccae5e2077655bc5b4c8cb40f385684e204" + }, + "in.final_layer": { + "shape": [ + 24, + 64 + ], + "dtype": "float32", + "sha256": "1faef858fda29ff0e026058ac95a22b7c5105daee09b2f57d5d50c063eee4c19" + }, + "in.single_blocks.0": { + "shape": [ + 44, + 64 + ], + "dtype": "float32", + "sha256": "72ad79b0b43eb16b99f4bdd4c5c42adb665cbf7a8ec2d72b8eab2084158e9526" + }, + "in.time_in": { + "shape": [ + 1, + 256 + ], + "dtype": "float32", + "sha256": "5ca568a959a2467ebedb33adad8652492de1aef351cbc6b7d876d272126ebf1f" + }, + "latents": { + "shape": [ + 1, + 8, + 4, + 6 + ], + "dtype": "float32", + "sha256": "7d0aefea8d2160266e2a288916d22681bf085288383a2ca5041be76b90993927" + }, + "refs.0": { + "shape": [ + 1, + 8, + 2, + 3 + ], + "dtype": "float32", + "sha256": "339f6a068dc369b279d76fd1fd7c7d8de6a6842a29295bb51f1c4d9d9a7a1705" + }, + "refs.1": { + "shape": [ + 1, + 8, + 2, + 2 + ], + "dtype": "float32", + "sha256": "d7e5124b8838c3d04593e36e54928a990d84fd76a63583a6aa1be5b22f234369" + }, + "sigma": { + "shape": [], + "dtype": "float32", + "sha256": "86c887cea8c0b376b06f829ed68d9d51c2a186f1f504370fe2e3352d6c5bd181" + }, + "single_blocks.0": { + "shape": [ + 44, + 64 + ], + "dtype": "float32", + "sha256": "cfcd18aedee217e46fc7f41a9fe788aa79072f996576893e39691b0531e1db4f" + }, + "single_blocks.1": { + "shape": [ + 44, + 64 + ], + "dtype": "float32", + "sha256": "f36f2281191dea935ab006c224902cd548d4cba21517d12e2c238bddd91dd3d9" + }, + "single_stream_modulation": { + "shape": [ + 1, + 192 + ], + "dtype": "float32", + "sha256": "b016749ee74287f116ac70b723f667c37419ae5d95465f3ab9d9fd613a2d254d" + }, + "txt_in": { + "shape": [ + 10, + 64 + ], + "dtype": "float32", + "sha256": "4054bd3d93170f7bc76e1abd877be5e9301a2e9aaf4d7de05d61b6a820f332a0" + }, + "vec": { + "shape": [ + 1, + 64 + ], + "dtype": "float32", + "sha256": "62554ee727d99cf7832656ee902cdb97a9bc4e73fdd44c4164d4a044bbd12b76" + }, + "velocity": { + "shape": [ + 1, + 8, + 4, + 6 + ], + "dtype": "float32", + "sha256": "44cfe1ba5c74f7452aa9355a2747e012a4c6057bbfcb574e569aca91e53793d4" + }, + "velocity_bf16": { + "shape": [ + 1, + 8, + 4, + 6 + ], + "dtype": "float32", + "sha256": "1341b5a2d60b42820839a0b47ec77ede4e0418e50dda3552c1ff73bbf513a21a" + } + } +} diff --git a/tests/fixtures/image/oracle/selftest_flux2_klein_tiny.npz b/tests/fixtures/image/oracle/selftest_flux2_klein_tiny.npz new file mode 100644 index 0000000000000000000000000000000000000000..bf35dde5b149689723cf6d46d7cda887edfcbfca GIT binary patch literal 91178 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%0D%D488kC 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 S*l^*Gukf!ED}_!f_J0AAaGO&A literal 0 HcmV?d00001 diff --git a/tests/fixtures/image/oracle/selftest_flux2_klein_tiny_norefs.manifest.json b/tests/fixtures/image/oracle/selftest_flux2_klein_tiny_norefs.manifest.json new file mode 100644 index 000000000..dcf81a36e --- /dev/null +++ b/tests/fixtures/image/oracle/selftest_flux2_klein_tiny_norefs.manifest.json @@ -0,0 +1,468 @@ +{ + "schema": 1, + "name": "selftest_flux2_klein_tiny_norefs", + "check": 3, + "family": "flux2_klein", + "script": "scripts/image_oracle/check3_flux2_klein.py", + "argv": [ + "check3_flux2_klein.py", + "--reference", + "src", + "--reference-commit", + "50fe5162777813d869182b139e83b10743caef15", + "--self-test" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": {}, + "inputs": { + "config": { + "attention_head_dim": 16, + "axes_dims_rope": [ + 4, + 4, + 4, + 4 + ], + "eps": 1e-06, + "guidance_embeds": false, + "in_channels": 8, + "joint_attention_dim": 24, + "mlp_ratio": 3.0, + "num_attention_heads": 4, + "num_layers": 2, + "num_single_layers": 2, + "out_channels": null, + "patch_size": 1, + "rope_theta": 2000, + "timestep_guidance_channels": 256 + }, + "case": { + "latent": [ + 4, + 6 + ], + "refs": [ + [ + 2, + 3 + ], + [ + 2, + 2 + ] + ], + "text": 10, + "sigma": 0.73 + }, + "seed": 0, + "reference_commit": "50fe5162777813d869182b139e83b10743caef15", + "refs": 0 + }, + "results": { + "velocity_bf16_vs_fp32": { + "rel_l2": 0.005920716488197906, + "cosine": 0.9999836358591561, + "max_abs": 0.019063234329223633 + }, + "rows_bf16_vs_fp32": { + "vec": { + "rel_l2": 0.004206520147257769, + "cosine": 0.9999911578838456, + "max_abs": 0.0038957595825195312, + "teacher_forced": false + }, + "double_stream_modulation_img": { + "rel_l2": 0.004797003145433416, + "cosine": 0.9999885566261811, + "max_abs": 0.0030391812324523926, + "teacher_forced": false + }, + "double_stream_modulation_txt": { + "rel_l2": 0.0049745755897831435, + "cosine": 0.9999878769869379, + "max_abs": 0.003469109535217285, + "teacher_forced": false + }, + "single_stream_modulation": { + "rel_l2": 0.0045720852501727515, + "cosine": 0.9999896119206672, + "max_abs": 0.0030649900436401367, + "teacher_forced": false + }, + "img_in": { + "rel_l2": 0.0024369144679206194, + "cosine": 0.9999970390089069, + "max_abs": 0.013224601745605469, + "teacher_forced": false + }, + "txt_in": { + "rel_l2": 0.002349083299421639, + "cosine": 0.9999972424598135, + "max_abs": 0.018368244171142578, + "teacher_forced": false + }, + "double_blocks.0.img": { + "rel_l2": 0.0032554345317725142, + "cosine": 0.9999947037772717, + "max_abs": 0.017964601516723633, + "teacher_forced": true + }, + "double_blocks.0.txt": { + "rel_l2": 0.0027706361346572558, + "cosine": 0.9999961628827042, + "max_abs": 0.03526020050048828, + "teacher_forced": true + }, + "double_blocks.1.img": { + "rel_l2": 0.0031160911749619834, + "cosine": 0.9999951489318638, + "max_abs": 0.017408132553100586, + "teacher_forced": true + }, + "double_blocks.1.txt": { + "rel_l2": 0.0028436237574423285, + "cosine": 0.9999959580769077, + "max_abs": 0.029097557067871094, + "teacher_forced": true + }, + "single_blocks.0": { + "rel_l2": 0.002415620316124411, + "cosine": 0.999997089780399, + "max_abs": 0.024953365325927734, + "teacher_forced": true + }, + "single_blocks.1": { + "rel_l2": 0.0024889463210277965, + "cosine": 0.9999969461077569, + "max_abs": 0.026044845581054688, + "teacher_forced": true + }, + "final_layer.adaLN_modulation": { + "rel_l2": 0.005922086563735664, + "cosine": 0.9999831717073902, + "max_abs": 0.003377169370651245, + "teacher_forced": false + }, + "final_layer": { + "rel_l2": 0.00364878451309253, + "cosine": 0.9999935575326588, + "max_abs": 0.01097041368484497, + "teacher_forced": true + } + }, + "free_bf16_vs_fp32": { + "double_blocks.0.img": 0.003680458041837061, + "double_blocks.0.txt": 0.0031420512637720627, + "double_blocks.1.img": 0.004609837182417063, + "double_blocks.1.txt": 0.0037378886956631464, + "single_blocks.0": 0.004399246350501496, + "single_blocks.1": 0.004695640248471376, + "final_layer": 0.005920716488197906 + }, + "times": { + "fp32_s": 0.0, + "bf16_s": 0.0, + "bf16_teacher_forced_s": 0.0 + } + }, + "tolerances": { + "velocity": { + "rel_l2": 0.011841432976395812, + "cosine_min": 0.9999345434366242 + }, + "vec": { + "rel_l2": 0.008413040294515539, + "teacher_forced": false + }, + "double_stream_modulation_img": { + "rel_l2": 0.009594006290866833, + "teacher_forced": false + }, + "double_stream_modulation_txt": { + "rel_l2": 0.009949151179566287, + "teacher_forced": false + }, + "single_stream_modulation": { + "rel_l2": 0.009144170500345503, + "teacher_forced": false + }, + "img_in": { + "rel_l2": 0.004873828935841239, + "teacher_forced": false + }, + "txt_in": { + "rel_l2": 0.004698166598843278, + "teacher_forced": false + }, + "double_blocks.0.img": { + "rel_l2": 0.0065108690635450285, + "teacher_forced": true + }, + "double_blocks.0.txt": { + "rel_l2": 0.0055412722693145115, + "teacher_forced": true + }, + "double_blocks.1.img": { + "rel_l2": 0.006232182349923967, + "teacher_forced": true + }, + "double_blocks.1.txt": { + "rel_l2": 0.005687247514884657, + "teacher_forced": true + }, + "single_blocks.0": { + "rel_l2": 0.004831240632248822, + "teacher_forced": true + }, + "single_blocks.1": { + "rel_l2": 0.004977892642055593, + "teacher_forced": true + }, + "final_layer.adaLN_modulation": { + "rel_l2": 0.011844173127471328, + "teacher_forced": false + }, + "final_layer": { + "rel_l2": 0.00729756902618506, + "teacher_forced": true + }, + "rule": "tolerance = 2 x the oracle's own bf16 against fp32 relative L2: teacher-forced for each block and the final layer, free running for the time vector, modulations and embeddings and for the velocity" + }, + "notes": [ + "the weights are in selftest_flux2_klein_tiny_weights by GGUF name in torch order" + ], + "created": "2026-10-16T11:56:33Z", + "npz": "selftest_flux2_klein_tiny_norefs.npz", + "tensors": { + "double_blocks.0.img": { + "shape": [ + 24, + 64 + ], + "dtype": "float32", + "sha256": "abbcffbcc76f6b4403cf5bdda3afadaabd45e92ff04202f79725cb8a748f71b9" + }, + "double_blocks.0.txt": { + "shape": [ + 10, + 64 + ], + "dtype": "float32", + "sha256": "070d1e638b447ee7a7a469163118374806204ba075ca5791f591cf3c4655afc5" + }, + "double_blocks.1.img": { + "shape": [ + 24, + 64 + ], + "dtype": "float32", + "sha256": "c8c6b64453eeec1c45a70406bbe907f4cc6b14acfa1cc0fdfd3402c2d30b0d8d" + }, + "double_blocks.1.txt": { + "shape": [ + 10, + 64 + ], + "dtype": "float32", + "sha256": "f7f3c6a999bb9f038dd7f1ccd0d4868aab2e9d7d7ee96c8a57e37acc04f7c773" + }, + "double_stream_modulation_img": { + "shape": [ + 1, + 384 + ], + "dtype": "float32", + "sha256": "bb2bf75bbf705cc0cd526a626c03661ec6c16099c81d1bf524783f4bd977eb11" + }, + "double_stream_modulation_txt": { + "shape": [ + 1, + 384 + ], + "dtype": "float32", + "sha256": "15a03eeaaf772afc75428c68ba2e9ae4005475900c3b6d040a39fb9aad0874bb" + }, + "features": { + "shape": [ + 10, + 24 + ], + "dtype": "float32", + "sha256": "266f8fc9fef4b1ceddb650a2aea642fb520784c50439535366e924e013a4e372" + }, + "final_layer": { + "shape": [ + 24, + 8 + ], + "dtype": "float32", + "sha256": "d72bb5d6ba4861bbbe7ca7bf0b22376fcd76496cccb72f6a26d3708c33ae0e91" + }, + "final_layer.adaLN_modulation": { + "shape": [ + 1, + 128 + ], + "dtype": "float32", + "sha256": "2e3e0a10bf7e690b12449e24b3f046f010c767af20fa4afe2d791776a880f5f2" + }, + "ids.image": { + "shape": [ + 24, + 4 + ], + "dtype": "float32", + "sha256": "367cd1dab521640e9eb751eb45386ebd36b7b58ba4843b2e219866d3d7e0fcf7" + }, + "ids.text": { + "shape": [ + 10, + 4 + ], + "dtype": "float32", + "sha256": "e0ad99a12c7367bc4496c4a622d4a5853b020d1432107824791b86d2b03e5ec4" + }, + "img_in": { + "shape": [ + 24, + 64 + ], + "dtype": "float32", + "sha256": "fd0283692e2f83a80d777be1604f79fd10f90c8aed6e9f0b6d5747771b754e68" + }, + "in.final_layer": { + "shape": [ + 24, + 64 + ], + "dtype": "float32", + "sha256": "96b56579e11b90687202e870a74a1d4339426db196015f20f7a7355779f6f293" + }, + "in.single_blocks.0": { + "shape": [ + 34, + 64 + ], + "dtype": "float32", + "sha256": "ce4625d1ab0ccb95c0fdffe8fea634ae16a09ae19396ccbbf3344a94d9f8de4b" + }, + "in.time_in": { + "shape": [ + 1, + 256 + ], + "dtype": "float32", + "sha256": "5ca568a959a2467ebedb33adad8652492de1aef351cbc6b7d876d272126ebf1f" + }, + "latents": { + "shape": [ + 1, + 8, + 4, + 6 + ], + "dtype": "float32", + "sha256": "7d0aefea8d2160266e2a288916d22681bf085288383a2ca5041be76b90993927" + }, + "sigma": { + "shape": [], + "dtype": "float32", + "sha256": "86c887cea8c0b376b06f829ed68d9d51c2a186f1f504370fe2e3352d6c5bd181" + }, + "single_blocks.0": { + "shape": [ + 34, + 64 + ], + "dtype": "float32", + "sha256": "477d74e70f57aa886cafae25fa29753513696291f2b2779a3f58ae42718b8719" + }, + "single_blocks.1": { + "shape": [ + 34, + 64 + ], + "dtype": "float32", + "sha256": "c75fd204d4b48449d487a77f0030520a0e9d8fa762d18d0d89facae34e0ca5e0" + }, + "single_stream_modulation": { + "shape": [ + 1, + 192 + ], + "dtype": "float32", + "sha256": "b016749ee74287f116ac70b723f667c37419ae5d95465f3ab9d9fd613a2d254d" + }, + "txt_in": { + "shape": [ + 10, + 64 + ], + "dtype": "float32", + "sha256": "4054bd3d93170f7bc76e1abd877be5e9301a2e9aaf4d7de05d61b6a820f332a0" + }, + "vec": { + "shape": [ + 1, + 64 + ], + "dtype": "float32", + "sha256": "62554ee727d99cf7832656ee902cdb97a9bc4e73fdd44c4164d4a044bbd12b76" + }, + "velocity": { + "shape": [ + 1, + 8, + 4, + 6 + ], + "dtype": "float32", + "sha256": "1c7121ec098e3ac281bc007e2a79faef682b33761fbe01b8b6096285760194c5" + }, + "velocity_bf16": { + "shape": [ + 1, + 8, + 4, + 6 + ], + "dtype": "float32", + "sha256": "f56228f3e82ef45285e2cedf1adba9cfb3cf0001dbb0da21411cdd43b1107ca0" + } + } +} diff --git a/tests/fixtures/image/oracle/selftest_flux2_klein_tiny_norefs.npz b/tests/fixtures/image/oracle/selftest_flux2_klein_tiny_norefs.npz new file mode 100644 index 0000000000000000000000000000000000000000..1374171abce4d19cdaab4a0c62118aa7f74accbd GIT binary patch literal 74850 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/image/oracle/selftest_flux2_klein_tiny_weights.manifest.json b/tests/fixtures/image/oracle/selftest_flux2_klein_tiny_weights.manifest.json new file mode 100644 index 000000000..5568c252e --- /dev/null +++ b/tests/fixtures/image/oracle/selftest_flux2_klein_tiny_weights.manifest.json @@ -0,0 +1,418 @@ +{ + "schema": 1, + "name": "selftest_flux2_klein_tiny_weights", + "check": 3, + "family": "flux2_klein", + "script": "scripts/image_oracle/check3_flux2_klein.py", + "argv": [ + "check3_flux2_klein.py", + "--reference", + "src", + "--reference-commit", + "50fe5162777813d869182b139e83b10743caef15", + "--self-test" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": {}, + "inputs": { + "config": { + "attention_head_dim": 16, + "axes_dims_rope": [ + 4, + 4, + 4, + 4 + ], + "eps": 1e-06, + "guidance_embeds": false, + "in_channels": 8, + "joint_attention_dim": 24, + "mlp_ratio": 3.0, + "num_attention_heads": 4, + "num_layers": 2, + "num_single_layers": 2, + "out_channels": null, + "patch_size": 1, + "rope_theta": 2000, + "timestep_guidance_channels": 256 + }, + "case": { + "latent": [ + 4, + 6 + ], + "refs": [ + [ + 2, + 3 + ], + [ + 2, + 2 + ] + ], + "text": 10, + "sigma": 0.73 + }, + "seed": 0, + "reference_commit": "50fe5162777813d869182b139e83b10743caef15" + }, + "results": {}, + "tolerances": {}, + "notes": [], + "created": "2026-10-16T11:56:33Z", + "npz": "selftest_flux2_klein_tiny_weights.npz", + "tensors": { + "double_blocks.0.img_attn.norm.key_norm.scale": { + "shape": [ + 16 + ], + "dtype": "float32", + "sha256": "1481b2c06afa19165398551645aeee4913fefb1dde536e557009e79748e5e3c9" + }, + "double_blocks.0.img_attn.norm.query_norm.scale": { + "shape": [ + 16 + ], + "dtype": "float32", + "sha256": "fcddf7606b21a0625f1afac607e1c94eac5d304c017e5261007302473a8e33ef" + }, + "double_blocks.0.img_attn.proj.weight": { + "shape": [ + 64, + 64 + ], + "dtype": "float32", + "sha256": "ce33031de7fd1cb0ae24825acd98cd3a7f3a13f3b93375b5abbd33b33822a4ce" + }, + "double_blocks.0.img_attn.qkv.weight": { + "shape": [ + 192, + 64 + ], + "dtype": "float32", + "sha256": "55e5c778db60dcafbbf5d48fb98c36f91eb81b7e30d0506ba2b7273efdfd6efa" + }, + "double_blocks.0.img_mlp.0.weight": { + "shape": [ + 384, + 64 + ], + "dtype": "float32", + "sha256": "0aebb7b5bbde6504963223011770adba44d6965f1eb0a34df43fa225ba57569d" + }, + "double_blocks.0.img_mlp.2.weight": { + "shape": [ + 64, + 192 + ], + "dtype": "float32", + "sha256": "060606c0f8cc6357ad37d6f50d2a8d5a153af4d75daafbc86d1438cdd6d6f4a7" + }, + "double_blocks.0.txt_attn.norm.key_norm.scale": { + "shape": [ + 16 + ], + "dtype": "float32", + "sha256": "13957da1d6db47716c87536f564a1a37be7049f0a36f351d82a808939503353c" + }, + "double_blocks.0.txt_attn.norm.query_norm.scale": { + "shape": [ + 16 + ], + "dtype": "float32", + "sha256": "4b6f94e27b2c3d642fb299aa0b80380628cda11cf6ff666d92d187f9783d6fd8" + }, + "double_blocks.0.txt_attn.proj.weight": { + "shape": [ + 64, + 64 + ], + "dtype": "float32", + "sha256": "d46c88db6259a928347fb0948342bd207d6671585ecda296335c6e995610637f" + }, + "double_blocks.0.txt_attn.qkv.weight": { + "shape": [ + 192, + 64 + ], + "dtype": "float32", + "sha256": "0e44fb91684ac9894c38a48b10e6131ca5b5d2553d7147fe33e279f2cdf33d52" + }, + "double_blocks.0.txt_mlp.0.weight": { + "shape": [ + 384, + 64 + ], + "dtype": "float32", + "sha256": "95476e2f0db5fd0bc3db723c3d9301d5fdf11eb1989bf21232bc02984c22464f" + }, + "double_blocks.0.txt_mlp.2.weight": { + "shape": [ + 64, + 192 + ], + "dtype": "float32", + "sha256": "55482667b03458b27c7a8e54d3172f564898cc8f52e542dd61efd61f29ebf8b4" + }, + "double_blocks.1.img_attn.norm.key_norm.scale": { + "shape": [ + 16 + ], + "dtype": "float32", + "sha256": "77d14ef1fbccd4819b3fd01531f119ce4c75e4c6ddbdd5fda8beb03a88b29658" + }, + "double_blocks.1.img_attn.norm.query_norm.scale": { + "shape": [ + 16 + ], + "dtype": "float32", + "sha256": "a9ecf9ee233c9b99dd822972231d016791dfbf076200a3ed9526b8db669b154f" + }, + "double_blocks.1.img_attn.proj.weight": { + "shape": [ + 64, + 64 + ], + "dtype": "float32", + "sha256": "97bfcf9a058caf114b8ddb07537850ff013b1e897af90feabcc39022d855820a" + }, + "double_blocks.1.img_attn.qkv.weight": { + "shape": [ + 192, + 64 + ], + "dtype": "float32", + "sha256": "7e18cdb34e92818d79532fa7a9ef55e144546ef88861bb47644c7101e269cd92" + }, + "double_blocks.1.img_mlp.0.weight": { + "shape": [ + 384, + 64 + ], + "dtype": "float32", + "sha256": "cb23043e5be2dbaf127e10984a8f8eb965b026c8cd1bcb3f857d27936895ac3c" + }, + "double_blocks.1.img_mlp.2.weight": { + "shape": [ + 64, + 192 + ], + "dtype": "float32", + "sha256": "96fa69ee044a59c69bf1ac8f900775bed156149b35bd4c7864ce077b547475b1" + }, + "double_blocks.1.txt_attn.norm.key_norm.scale": { + "shape": [ + 16 + ], + "dtype": "float32", + "sha256": "c3d1043bdd135b7dfe2900a5579106d25281157f22b747c6c6170120ec3b72af" + }, + "double_blocks.1.txt_attn.norm.query_norm.scale": { + "shape": [ + 16 + ], + "dtype": "float32", + "sha256": "5ff9b99faad43e9dd51dc13b20395fc24784cba43eee7d17bdfe9660a4349b53" + }, + "double_blocks.1.txt_attn.proj.weight": { + "shape": [ + 64, + 64 + ], + "dtype": "float32", + "sha256": "abda3e301745721b92ce35cae3d65e2a7b3517c649c28245fa83e76b3ce0b75d" + }, + "double_blocks.1.txt_attn.qkv.weight": { + "shape": [ + 192, + 64 + ], + "dtype": "float32", + "sha256": "7623f4308d0e848b41bb9043249ff9895150cae31feac8af76ddfc0e4ae311ae" + }, + "double_blocks.1.txt_mlp.0.weight": { + "shape": [ + 384, + 64 + ], + "dtype": "float32", + "sha256": "d8dac16cb69b8fc77f3b9bb634dd4a0b8e126642618dd96d269d6595497409ad" + }, + "double_blocks.1.txt_mlp.2.weight": { + "shape": [ + 64, + 192 + ], + "dtype": "float32", + "sha256": "022e814bb60c3eff1ba9c3bb39e98afb3e9b0dec193fca6609ab5e81d2761d4d" + }, + "double_stream_modulation_img.lin.weight": { + "shape": [ + 384, + 64 + ], + "dtype": "float32", + "sha256": "cca869c70e1868abd03ca8b2bb9eb25e7dc2765d475e3c55d5d3c03249e2adad" + }, + "double_stream_modulation_txt.lin.weight": { + "shape": [ + 384, + 64 + ], + "dtype": "float32", + "sha256": "c440b3f567e550427e172c58f5160e96a92b82973a5ad8b862414ced68e40c71" + }, + "final_layer.adaLN_modulation.1.weight": { + "shape": [ + 128, + 64 + ], + "dtype": "float32", + "sha256": "969e2983958259af05b95f4632413235d791087f0800cb8dd0dcf019943929ff" + }, + "final_layer.linear.weight": { + "shape": [ + 8, + 64 + ], + "dtype": "float32", + "sha256": "098876ade42ae405d1540a73f41d7ecd697831f8b53765fad6ec37046c3f6fe1" + }, + "img_in.weight": { + "shape": [ + 64, + 8 + ], + "dtype": "float32", + "sha256": "1015dde7779edc916b78259ac98a5fb8cbc61788f5b18837f8565dc11aa44236" + }, + "single_blocks.0.linear1.weight": { + "shape": [ + 576, + 64 + ], + "dtype": "float32", + "sha256": "4c37c83218b20c47939ba2993303e068b6ddb9cc6ed8010331d23135182bce38" + }, + "single_blocks.0.linear2.weight": { + "shape": [ + 64, + 256 + ], + "dtype": "float32", + "sha256": "7925cb1dfceae726862369d07affb64b7c32d490767775196bd8cffa80b8edf9" + }, + "single_blocks.0.norm.key_norm.scale": { + "shape": [ + 16 + ], + "dtype": "float32", + "sha256": "a4fc6dcd6074a1198e576af5d960d33ae82969d9d921f21b690df59550dfb547" + }, + "single_blocks.0.norm.query_norm.scale": { + "shape": [ + 16 + ], + "dtype": "float32", + "sha256": "99dc76206ad0b7de27f472a8303936a0ef5565c0cbc59e1f5a9584f34d3e071a" + }, + "single_blocks.1.linear1.weight": { + "shape": [ + 576, + 64 + ], + "dtype": "float32", + "sha256": "79d0c0992f6ae1873534d0bc7c8840c7f0558b018c942f1f6d5f70529228cf12" + }, + "single_blocks.1.linear2.weight": { + "shape": [ + 64, + 256 + ], + "dtype": "float32", + "sha256": "d7b883d414b777d9158aaf1de3045f8e44bfa74551e3bf04d5325424f06c6c82" + }, + "single_blocks.1.norm.key_norm.scale": { + "shape": [ + 16 + ], + "dtype": "float32", + "sha256": "eedde046fd6d3e56dd7855dc20bdbb56bf6833ef91932c0c751d12d2b2787e2e" + }, + "single_blocks.1.norm.query_norm.scale": { + "shape": [ + 16 + ], + "dtype": "float32", + "sha256": "465c5e6f32da62e80b85af394304558795f6ec3033b9c2aff435acac7c2f061a" + }, + "single_stream_modulation.lin.weight": { + "shape": [ + 192, + 64 + ], + "dtype": "float32", + "sha256": "fb752397b6153c0d7cfc2d1fcd67f21d241f25d192c1ee6bf83bfc07f2167864" + }, + "time_in.in_layer.weight": { + "shape": [ + 64, + 256 + ], + "dtype": "float32", + "sha256": "e503b4f16dc96f0f172527c329c6efa952e48bb4866ba793e2a7d4d0a4f1fa38" + }, + "time_in.out_layer.weight": { + "shape": [ + 64, + 64 + ], + "dtype": "float32", + "sha256": "f1da46bfcace6ea0204e972ef8595ae14e6be020668f9aae20b8e72052a2eb3b" + }, + "txt_in.weight": { + "shape": [ + 64, + 24 + ], + "dtype": "float32", + "sha256": "222ae524fb72d98a2eacfb4089742f330b12116dea30ec96376ae0f30f9b8595" + } + } +} diff --git a/tests/fixtures/image/oracle/selftest_flux2_klein_tiny_weights.npz b/tests/fixtures/image/oracle/selftest_flux2_klein_tiny_weights.npz new file mode 100644 index 0000000000000000000000000000000000000000..cc2255b0d3c28e2b352a5d71404b22178828401c GIT binary patch literal 1661766 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

t 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∓GFZr!whVGRI!Mk@YTwUXYxl8nT)?hjg0M9*We#tb> zzld#F&!F?ME-B?TbIHLkC?u9Icz@gpu5EF}rVT>)_+>G9xI_ysg#2crt%_ie!Z$L1 zasiNxb9g_^92YE52CEWnOe*J_#SJ>Fq?4Ai+t#hc2Y(Id$$7>oYCTS%wm^+r{ivSA zNfhDMO8fUXj!bUm-a4Cf2tok~Mn|(xopYxT?t)AfM;_&Q+d@@5SZ0 z&nkY*=y9vEm@QVcN2`s>&3{i0j#q~=&uchR^$(=1oJfQ$uY*p1Bk-GC1QDKdC~pfv z`;|{HV&E}tp1^Yr?KL@B9RqZ*tp~I9R#pc8)za5xqZRJw%s^lCIj$Snj#o_OxEIC= zSh>vwlcv>E&Eh;kQ_pA8b0P|4WaUA*`3p_?tOdmaSoq2w;jwjFALTua1ms+T*AP2cdbes&ZG2vVdlh;>7xkM6<1xLez_-dGOvVv~uX+gg`Ui4XO3keI&5)^FI0Zu#} z7w9j;;&2I4F>e(-)|0>|Jv`UXBh>QYwC&{a2gH}}jA+z}A5`J8FU(zh4Mp?QXlx&U z54vs5=tg}a4c1k-Z%ql6{Ck}m>$#wXODHN6LZ=fv!$6@!({* zY`$H5c$FGj<=?^zUZ;!f9-)ml+AFqRainJq1IVsw1uhT_IfLIv;KJNxcyx&f2%0zG zov2p9y^qFNyYa0cMM9bNP!Gf*XFlH_W`w6g+~9QQRbri10maMX@C#w3|OXfTIeBpo~ z=axFkoVg*0ml(q8o27J#a40S^od&O6pVP{`5mLPBEqNPlikV@Dh;aWVm^w8dgdfLI z!Ae)GKl6$t@16xZz230zp)l+@=!rTncnzSm5<;R6qjWqEUklwr`%s6Q&F6J0-vr{E zT#8+W#%xTEHPNt(CtEue>FB0pxWluJyadj0X%*ke@jVspC<>#&+V!CAP)Zcplgx0K z5=e*(Vc=>F`g>(7&DZ6-n^{?+y-M3=dpy=EFe`j-V*JQ3nLg(~P@46Y z)aCHr>Fo=-7Gpcs!6rdqpQp>jTy`KC{)u#(bR$iPFNAH?J89mT+2F}lLCyre>#)5P z61!HQMeG&aBO-?n9hafig+BT+&YqCNyYT8A1J0&B1?tU zckl2<35P@%#7;cv`&rDI%gCQ9{f4lu0?$g-;8`h6u^Df^fP1z%Y%T9mDP2n

qj%B(pFR@&3)s^~}< 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

hP9KEo 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%0AxgMQsL|s8*ddIpXd_WVM9pr@cqe%e)rVC) zysq8jY}ei+?9%1aAnEi<`sY;|GkS>QnOScjAN;w!Og9E>66Hypo+XUUso?)xIhPhG zN#e(Cm2A(RR(w$Tm7iihnfsnbVR*VREw4Do^sD8Ac|;16eZmqSV*(tw>;((;pJ3XQ zqwEa5ZQOe#4>uijfWG{0e(ldZR{nxI(LW!ICv4Z_(W5~a_kJeX6vfSW7J1MDNi(`~ zIEk?}s%NXY9HoEq9^$JjPHeea)Z?@)`t?&Z%<}eurSH|qnXxWr{j#;pt;o+zxX~=^ zl${J3c}ZY;o{yW341nWIF>-OTI8!)bBF(UhMzFmPvQ^e(Mv5@mVh;mOHW99L5l!}@vHK*IryPeSZ{ zRD!4FkF)HY8|cgIp!YcApUeXv&U&(dwdbBIPdiOA$Elomz||g~Y4B*!mm>HW?26vL zf#~{p9{aMc46U@n$d9F0A%z?xC!6EoqYNKv&dep*KQHl?9gxGkRsFzs-U_mc+Emsx zn9AFoWdBHwGW7y{)}4nidh8xM!p#7EX>SCF{_{|?q6W4FI&<^-8%S=gI6Ghv#}hc- z$XA}-$7Mg?!-b3iCYCdx=>+cK$-eT$71mEtPGUXzA$uA>K7Yt+2c@H6n>A@WCda#1 za{;~2=`wu|3Gj(cBEMHC(1?h0xO>G9h}vgEl&AW#0Yg^w&&*uG+!Iq^x)K?8YX;`WHan5ZQf6Rk^6j~`}o`_mygU4on$5G7kWEy;g+ z+&*cU4K0tQ;Bwq9y7AUk@NS4gv(t@O{z?o@4lTl#gl64D@N53SymgczZ+cD0nPnbu zKHi1s*PMs_9)wPjQK0S0iSW11mv~>e1d}ScS%!u{=C0v6*f*&Kv>r*2X~SD-&yy)6 zMv+k6(lof*yPV2xbHehGr_AVJI&d;#rntTVByMW*#(YG{>UpN*=gEGAM%V> z-;D6A(-Nx;Rhc%W15D_0Z}?j~iFVf>BEm^&!1vgQdbeEZsEV;;aDEl2Z5qb;S%M5{ zKMz0eaM`N3W03an9{lF4Fr87&=#(~(x~x8kA7z@^ht!36fJ1kyy1|(wnOqZVvMmz1KPwy^)3-gY_shJ1hRo*M2HvEve z;dd5SdGF#ZwR`z#{C}-G=wk+XCM;vPldg4bgQWf5Bxs^O9EjAU%O3qle2?YuejlER zuihz>Xva*vCr}EZZ(guIrd4FWUk^-r{}TAArOcY7r!YyhlI%raN!1$!%35ob6rz#S2pB;MMMWb8VH zzpq-eyV5%yS7Uy!+hqsWzyiVBccaDA?-bOpdyqV!59oixsh+_}Sahl#N=I){@ zMkRFx{!5&JeYID?>-i`ub2VHQM+bgkomsJ>Wm!`q59KnQNkwp~IZeoKt@zt3l`YNWxww)>0**yDbmZnRJ^rk-vbH>=M9 z))#C>$D@kG&7E>{(%ZS3c^Yi~r9prCXM?88OTdvu#9H+w*!H9{w?sT>=M)!q(vg+e z4PUuj!fjSv#|a15C(&`KCpd6w7o6Qbk*!s`fs@V%V(LpVo_d`UNeXCkM7^_cQObdT z-Qgk3Unx)LP1?lT7XINKpDv81t6iYxNEysN$^AZ6NAkCWJ9mzafzDYmBJ7w)%C_!f z5A5BKk>b|$J4rz^snaypG!yTvpMt5k<3NbBrEPHRgxTSJz5S zld_>0dwT_EFg^qqxz8i31~K#gacXq~aP(pzbr^S~?-#7c!f$ElI9CogarcuiT-_{a zW2d8p%SKYwd<<7dSW>p)2%YqBI#2wh44J$m8^4RZ!@Ua=>H3PDs6Z<)sQMk`FW3o5 zH-EE|Yc1g#|2;kovWIWk!enbjH+Y1sgrOi&c&CGSmvrNA^CFJ3wH*vP|DbhAZ*$AF zvv`D~+bAtr1APkDd9%m3Y*yrJXw5YsCI6Hmb&D2MFYW>N+S%kujWE7lQc&DKH*+%$nug!2KM5>gJt%RwpkNuChAx*s4f!aMM(Bq0EhZzgP^a_XAON zuLbG<(Smt)^`Musl?^n>X>CZG2{EC^p+CcbZd@&mPJ372J?)2Ztn3sxiZSTFcnfH9 z7QB!Lh~)_h%-gaIc703$vEt@l9O^dWmnQ^Yj64DBoto72*E39DZKzt?MJDs70KML+ zOuk-o1P3E;nyn{7cK!_`zvgw~e`l)Mp{qi4XB9(^1zv;MTzS{VcPeFPP9nWi9Z9}e zAXD#{MgCUtTKD|-mA$pJ4`)7h!pSQe@SD#sFd13R^;q@b%xTI#^_oPikFKTDA1Ra1 zcXq*K@rxi+{Fd=leZ*UpvzP3iI10i2yFM0r(bv9UaAci+!k_(YSCoyCHbxg8p!O%P*8meH5vky!l@-ws8xLf+9 z@6bQ|U=|C4i;i<^bF{2TrhBiFrPr)Nwc>&BAt-6l_(5|B-AudpCf zV#=t*LpyS{M3QQ4k|pmRdO&P&4YRwMvrovFQrf$e+RwFtn)lD}-{K=|$3X>B&^8x^ zT~@MJuL4hGr;_37>;=b7kR;7k}(55vwjMFnC^RpH+?z6&+s^Mt@I1n=LnKj2erZ3 zGzEUiGW3ap7U|mOP9LdHr_uTxgE~|aB{O8GieCl{|EEPveviY#dG_>b?GWs|v70|W z_yPxQI$7J#6~y(eDQUU78;_{ELXN}<_|m3`Oo=kFnD0(kY_z2fZ_T+gcNya(ZArHI zR-!?-AH-}AVh{f(PF;f2K&RA`_<;b7nJ5zJXIqF<${ZprcN$OToq>({3uz{s%68Z% z;*QGSY*c$Wghx-Jn`IxcJHGSr)0r`#m<&BLEND-g3o?f*Fhtv!($6*|NUD2M~pS;Zk@no-xTsT-6Z&)Bv*1Y$~0z`4?_D??9gRaTeRPj-((YfDSg@f@o0<`Z!LFYK2~at%tXO-u@b} zT4qO%@0dc}8zial+z{Hjc?dU(3et8hQMzvGNt7FS!A{zh3nvHnqQM(W8gOzqwH@@N zt74@%Gq*D>UN47h_YI=iixdz_*QdYJoAJ(qcx;%RMPDte#SN*(L`G2&B)5HojqA>% zdioCByx<~kvT>m&8WT}7Yyj#GUF01S+eq`)HS^e$X5^Y#JPdyl2dN8@WZAKkti8S` z{@nKqUNk-g@r1v)r*0b2it6C;R|JrVf7^(8$pBVVbTbyw;pFF9N$Q+GnLf%_M*fZy za8ip$=Z^MaNM1GC9C5~te=nlq%TcsD>;}x9Kr&%hF*7<#my}w~Mz1nQrlEWroZl5r zHdTw0zy+s3zh)OnzdywP6_Y?#Up8WwgsGBbuVo;4nX^;Z9V44loym=PX^h?aFJPM* zO?5XGu!Z?m%y~I8p8X0Ncv)LO@}kUedxbg`ue^gAJQe(%ox%o=g|kV=PeDqtDAC(4 zOoWTnNVmW>W(mI$zDmudx6=Y}?%qZ=f0;2^k}E;#xcz4IfDOHYTKN8SBJEk2fI(0S zGk+UE%K<5@TDq4tR6K~#kq^opo_L$FW8Qd+k+@kC>CUk?$m0x~PFe-fygdPayUfAo zsVb0JBunaJglN})?NGLClw&FEgS(3c;QgB;cqlg-QhwV4qzz)|yc%eqAWW-W(+KSh z!y3oaFnWW_S+-AOeOEnWCUf?cpO@;<4jY$o zOmWdmFnMY_?`Ql!th#PU;x8AXn9K~Ev9$tv^k>qG?|ON%Z_Mz(=qdizj&B@;!i<-9 z!WhWV5N~4AVJ13kD*X6TK|f0!XjLBGPmiC<1`kCiW)UgD3lA63gGL4LAiae@A#N(h zoTz83B9-v$?hp8czXW<3D=|W-09?#}f~V(ARE)d@-Wy~{imVRq=o2K<>;W}io`pAa zglTZrP6#R1#nXWr==drIJUX^PY>PS0nUX=r-4=uR1w+)JF8KVV2k~4toBSCsCJ#e1 zSl5jn=6_h9?F+4aoZ)Mk3~7=~fPGUL@+a91dQRqYOn{Ru2Su77dHn*AH=^)g$22^> z!<6K_ia;N;2{8SNDme&GVVU+5I4?by{w_*ITjzCTuu_!F7rT${4{kDFEZf;XO?+Hy zy^wx8^9A!}X#$DuW~Ug;rCUY0{Z1#D-L%sPR^TKeFvpnoP5y)%FNR|S!|^M1q9Lf1 z>pM@FO~ri*@y~zD=$}m=7@^@1Jj?Yed`1O`knR(B_53LwzivS`wbX#u6hprMGh^oa z;5?FiObQ=#X><2+C%h>Ujn6p7`0fup+-zV=>%Xm_ef76sQOXW-R(&z@6KA9S)?l)| zQI;%m3!`}^1!Qv9F1R#QNZJgK!h*IdY}@l}IQv?VYWYnhQ6-0ncfAh1(eep0ZWqzn z`F6zi{6y;37zP&FJ?x6vKR{KDyW4EO39Q>2b|c3P7?hz!EaVvmTsvhJCaq+%JpVqO>Zb|S|Y`YU)jU#%;Wm@a~9JH z;n7s6!->4z*Un^zZiD~oR*}sPru51ODJCIL7we`E<1XJo*qzl3k0akRQLc?xx9l6U zxG<>Ib|b-e!!@km%1rEDYy@@l$8ldEkW9;X*k`*NG}=?p=}{K(%&9}M&P?dJ<;$-g z*CUUNUhoX3O3-_bpBR@7^|?y0%TYqNcw!@S+Ok?IiTNj}7y6^C4{f{gY9f-HTn^{GasWbZil+gChZkv?**5 zC;#~aJzOv2;k`KQ*lbN?mOY3_s+dni_82d)_@pbPh7^pgf z?Luv=^2lWw`Xg_4oyB zRW&57(jpjb+R8EM3-QRYLRzD)0s7;I`CE;9@tL4E@zb5cHmntWzmvjyIAKwna(=;AGS4$qm3hq~d<>s!dW zpMs40|Clu^q}XRYT$WR03isa8qD4B!PPqLSz9`x;V-vJs$!}Xa>CJU4`tc5y`CNx8HlHyT(kE^^6sgzE zdH6ZemDct?$MUX3Uf_y%h(a2qgEOXi+>XUhl6oL{zpu_vdSB4+U{fWTM zRk&1h6~`0U%u0V-PWw-OXAExX;ENS&P-D|Gn0L_%qTlVu9UU*2!b@UgeE0`*KhzaH z%{<}bX?v#U{1=$L!I0TG?>+=gdBr<)M45iR^_3a^dLACBnPd9|R|sA*g*@HehRe)K z*r2vI5Ko?A#os<~`(RJJPCshd>@Pr0xO0|Lhb&0Dybs-90Myb6nteT5qe=enfNgQW{w(> z;+Sh#8M%$lS^W&{-iaXNzXf!hRjAU=2-rAT!a}rn5YY)#u=gtM#e6hx{ty7k#?e-1EjrXH_m=4`&WX09s;^+*H zlec9khOD@vK;^6)cusY1*)vQ0TT1_1hQAJdX3rWmupN6O=@u<1R4)ib`(JtNoa=5x zipzaoF?S&w&4w6%ZdPPM)HihZX~gt@wnVaZBFIIn(~JF2Fr-3;M1L*-+nteImU%yH z2#Y8BqxV^6mK?3U;6*h<_v4mb8L)WuCZ>Pq0qB0rd56|;+1wu=G4`b(*|u^BEH(*{ z%YAc6Z$UG5PMkspeC}gKr870>YCpxWk4~Grgz6+QOsJPCx!G06zEx1d;jhEIx_4(- zc{86Dn%;o?kM)pIU`OZ!2hzKt9aTD&NSJ#SYhGIm^R3!2HYOjt^_MbPjxtnv&l~1k z^l7~8aFM)mMM{?mke5y;IR--pjlJB&YD99}PAxfVF}e#LWX{0{3g>v6^d`_J|8eFy z+3?moM;;D2U%OmL$Kl6S>})6ZcIPzMFnnd=gfAFIEN#Q+o}|i zp8^YL+AewY50r+b(?7tU)L%$CWXX$tKnz27qLAKElD_yX7T2nghtC?p_RBX2(RQX? zrAx`IdRM%rG71y#*MToH59_+P9Mbm)Qs^`a5)-rNBC}qcd8GoZeMQOj$PMhpX_k1Q zSA?ERe9EKmY;7y{p)-tbAli# z5|xFRSNrHpIb~Wi;U0So?(@S;Y;nr0c+{?vB>s(#ycgw@!C`?fDf2l4s>e9T&%aIN zLUI%iEj@^auNA1xY6~Kh_m0QEwF21*!puUZ3a-A_rsWZ7_^UXdj76!FWzvD%e7*p= zvAYC4dEZ#MM{}8<+`dC}R&nf=Mf9vqCwx>eq>yBp?1!;lKO zW6{QF%=(NPuYQ5kTq*SVFNZPW+%PkZwlPgjA7N#)7hYOl40=y%VBUo%On`MGZN5!N zO27@|TlS*XiCXB^3Sn#}E+8LQuET`YTi~VoRC;867MR@4WEE=8z*~*$U>G6H>v&>K z`0Bdkpf$%pxf+2%-@_oOPLibGc>=;_@-+CW9NEfc&DVEKr3d9_Y$U9Swo|ogm@n##ozYz!T zJc^h*LRYc>-F;h3UpqBajw-OTE4pS%BPY^GrMDlN)WnTJ7G1i<%E6q)tc}VXvcZm@raPl_y zJqAE^dj;dLb{}}GIfz;n%}5J3FpDp|1 zyoMd)cj4nsYf2_^XJ!os!ZJ%?^#d*Xc8@U55cXkrJxkzey;(wJOZ_3oBmh2kJYt>? zMe*-7TEa<3WukRikqu3*AaP=+@dnrH%D6L|_$_lIo;_05uyhCpTp#P=_&1qWDjeD4OnJ4(&0Z$EDoaRn4226Sdy3Ht+y;=gX3)H516; z(#dd6C5laKUP?SS=7Ng)dz`*B8&`B2lC7hoP;|)<=Zl2mDw{-7aw8oYI%iX<1u0Cp zxhp*bQ@&E`u zO(VYicyL>3N4if~kdmAu?5uw_G*Uj5tHY1tvSL5_?T;ogN@1b)!(*(T$JOduBVqLL zbsE*7N-R39;Cj$e_Hel#i9aqt|I1#+*P1^M4%V-u3U9Ylr~QYq`??9lPtL+~30I*i zx|5fdc$Sg4c^~BGE79^yXS!aIn=`#=K)0(NWsTNv#A73atVk;bW!gG%Ds<1&+A~@DUq?CU**%LTNEl+#$(NTe_T{ z8CuOO;}P<1u`{EpnTt0E)yTB=2`s%h#AULx*~D}Mx=(ckcd6Y5=iAGPaq27TYv&zWEMaBiDl`x=BqNbl;4E_=YCe| zoJVSGKQMSUm^O3Sr==6cX@0pDt=q2#+gFC5^rFL16W+;2nEz#N%En@3Rx3Vxqu6>z zNq{btJW2wW{6o{b*}Lk8b{eYHO?hT_n~{}JG}Aa8ys9MO^z)X zW3OjDh3~7myKv1+Vl{j6#^I6h-PEn}HIE0d&Do3Z+{)rggOl zT~oapec$CWUw@?2zsGafS*~>`Dt!b#$F8P-9}YwLtRAxcgDTt$cZF!b{dih|tBI$0 z(OpT;A$z?TnflO>n&WaR<5$J*OO}CZ%>>xl{|Z%$9>ALBiDdUZS(q51LmEO7z_53a z?OK&f1p0Qu&v(ht;7|pE-zDjx-+bs(&rn#(`wZNlH86@@CA7WDcxS+GCzyH!Zlky6dm^HDfR2pE(DS(RWbGEs(lD`Hg;7TJU6`2U0vP;lEr% z&iyf!)@^o&b2>(Jw~q#sEpQR-Jg1O=fW^3F?ifDWUI1-SMByDTCOr|Sa|N;s4V|DOpM$zx9A9H(A`w{o9f#k4!dF*D;El;bYVWg< zysDT;E#E5Oay=cocA*JNS3hMbJ$n)UI*F6z+vk(%BV%x4#Q+3WSU`h)DBqY0?bWp;6c0>J88@jrE{2?1WZxQQkp9}|AO`#FJ67-OTDQ}U$UGmduGA(lI=F40Q z=fxLQ@}3Mxun#uIGfR{u=`PMY$wiYS36oUk5=#I+!Vt?M1F{3rotIm%a-6Bhm&~Zk}8o9XyFM7 ze&uG^wlMkv2YH#gjm+J^M0}Z?g^ktw$W$jy(&27E;prK)dv8D%+MdAWOfiJqnFRmM z%4hn$m%y&s6RFaO3z@h&6lvUJ2)2=?r6SE3_!dZ6?0v|Rc7$2iqL^OJVt)O*1o8jA z1%+B=;rID8UQ5qiHg0DZD|BlZw@NO@_yxodk)Cqc=s!_*(HFG)0i%ys+ zM2^>&Q8%DT=KD}|0c7jAedL@s7n36d}cX= z0%LY*6Z@Cp(Um#ZaDT%K*5s-z-C5KCXMY}Ns+Z2@>Lcca=Xaam)Ea`*B5H7c=3b`3 zU5Tt>BB_HJryHLp4Q)@%5SonWB11VE>u!c`g?B>lhimN7cif&VHicYyQwWROmJ=a% zDXEv;ffd}H-KOC+9@Xde!N3Ii-vJH&b}x?IzVae^H~P}@Iw|b4nh7PZU$c6llc}de z4M|ugjcYQdQ^~e-%(Uu2s0?6X&#(ds?U9EOQ**5Pqz^C4SAf`&GtBGO5YVLG*jU9< zvdK4(PRzK1cAd}hSl4;DurQ5{X^2M4YZAo6JP$&BIo>b(ozFM;%BXEf!p+(LIIg@B z-LYgk@yiUMR&IVYCuIRz>wECypGpyx{o%O2hU4`|>!9cSLA)@Y%eG7#!EgR2;i94} z9Qz@|JdxeR`+3loRBz~J^Q%6>rR^Dvw5TdOR{IMM&;GZ$v6ac z?PO*MXpxc$ciG!&!qno05;^bHj;~h5(Opg{Ft+U~jL2AmmY6bq8qT6tb{wj&aD=em zR^;Zv6O3u@0T8zlp^G(!(eK6uhFMce+Vr)kM~@Xw)tiP-Ili~#ov*lXYbvbxU`ZUG zUS@NwHDS69Hy6orb%*dQazkn%yJ5Nn(fR950~g*#zVtzMPVrOzk$+XZyM+zRclk^F zOL}uKAdd@11h3~w&XD8pGHYQAE4WPT5*&?_qfRT@2pR3KF01!`}Ui>D78m zoOVT;tXR2^@!a(dC8xMm$v(+=0y8{Q==90=RI!9Fx@qHScNoLBoZ9u_-~*h0Ab%SULQcunD`h0*FCO zA+?QjCV9|<=QX}D(v=EC*RTK^H3jJK&PzCu_r227bGN1xDGbPcbB z`Vu+%uD>2KIiA5eTV1SQxek`!{)vlCEU5?2oPNDi%=qV6QsLqnEFRLp3q5d_dEBXyNIsVqoMdA0}WHW>jKc(F$s}RL_ zcr79YV|lE3oC(AveFMMIbUJXwfyj58(`1|DT+Mh6&A!p0b zpL!mYn-$5|S?2UXO$2YiY8ljApGhoLFN1|?CbVs5F|5}T6ReY%_NV}QdD3}YlY5d5 z+o==gUkG(w$1%VAEXgO%uN?N>6#huxVxt5~IDSqdOg5Z>rw?4kk69^f{oM=LH)>Dc zJW*o0*LYy->L6Hi>IhFv_7lda`=Y6yAnD`y$Ir$e!)-BnX!j9<*0Blncjp4Se7XaB zu2`NdzA+5qGXg1(euCaF6egb(CYP-S=t65a;Og z)7B^2os}r1tb%{jIS!3r5ip--kdQx~w0ighuWCmX`_tE+ae99WqCb6LL&kK-=h`=D z>-Yp>?v+s``%tKj6{fGxn-KAVpZK`uC-c%RmYvylka+u95P6N)*wUoIb5EMco~#;x zo~sIEsq9=FS#}t7A0|S-+a12ql`D`O=0J7~K4nCgsNuk{DoB47z`NetsQ0#LxcGH9 zF4&@n(=G4g=9DI=hyzlwRe`=sGy=7PK=Sh6PVnK1v3He|h~cjNTsEr$k9%=mpsNxP z{au*WTb4oQqk2f$BTm=+eGQgB+ThC715j+y4l{ln!UbWw=(!>JR!i`v4%fImvSS1E z%-u$34;wT4C+Dz6oL?$lIvo?lbeXfYy5z`web)B;OLkt+d%QlpAHJ$xhgx<6#10N( z(_RIF>!*?BPF-;4#v_#4{*FmF6H3p1e1r?PmE-fK21p)Rf=fS4CXO4-z--mjc-$LZW$(Bor^KpTm z7Ci1G(`{m$`>AFhtg%bP2N#;5|63w$3YI3{J^dhWT!XkPNWu*huI{*Ao*2KF%RYk& z5Zf__o5_)(QhSpjY^OH{M{;+A?TW;AV;(=<>kgDhay1>f6t1TyLfd|E3;^R&FwQ^C z7qa~ax4AmawzBguVMrBM4i(@&!BLp1tO$G!Pnw}3gx?3?jOcK7Yk^N-w&```wy(G2O!nI1CO>2s`}WQ#R>Rjp*w$((^1s7c>{Yk*m24*c|51w&0alM z36@_-@^|DBY&|JUBF^{oGiK%Sx2|2xQ@bbuO-oL~v#Pha zLMR33`L7^4C5c`3C6@vQq$pLo>;%)>OJTNgJIg$jAcNlrA>X}-hz=is z<*Wc5vG2lx6ld1`W)R(CrcUg*eAP8S?lY??C9}@}9Sf<0P1U&&5UN6(<*Fe1P$j$_ z9)ro|?|2Ghjzp%hlk-ejOK=XFE5~rc z6$8@8@wxx&HYXJZUm@nLD3ez4o7a8v27Bq01xl^DgNd@=@cn<8@brrn8_#*9g})a9 z%pi1Z$#t~UNW*V)Z$d)LG^n^4LA5xBe$Uf1NZD}}L#NFKsZtfZ4xiz?#b4IE8c;gfLd zJ!5|GJ#JLAC1<+FP?f5I(}e&~Gqj?xC=7Hr3PQbw9>*P1BXs;ZT>fFhvAn)8)!7>K ztI!3wUb&ZZTRwtLr#Uct({pCye+;Q?t_xeddzc8@AiiXOK2B-bg`yG)WO`W?jQZbW+yXvB zu%rQf@8Ci0E>-hqi{#UPUN>+pKMremEQahunRuPi$79<$|5QN{@AjO{@adl+eR?4X zCiMhiFgAnex&>t9!+ork%f}C2OR2z7&LJOs3M6Hhz~jBaxR=Z7_vPgiCjBw?NvP4d z9${Sj(T$2P2%$TE&4%AM|8hOhZ1OU_o2fi;6-?GeGxxhrfn19&6~nU-@T7p;ldR{v z*e0S{l?Ipla3Vk8Epy7Egvp32hG{`D?431>yU(nyf9v2MO`8B323pM`X!HqC@YL zIN;>bWc>8U9RI$OqbnEm;=|S&R!P5%sf-ea>#6a)&kwa}O0WnmT_X;^$V?#pisXKR z1Qj%}qV{^hENwi`d&t|t7$#hwk@oZl|NEXw_;N~-c0JW0BAc(Uj_R!(JN5(ksjGAI zddo;b_86m^TFq{>PM}FG>o|7)C{7#GCiP>(sG(T`9}DVvf|5;S#vN0f`g{d*Gf9N< zo!>A9AMRn;9Tgg%6hL);N@Ms`aU#>WH|uoOBdGS%jq281V5SOAp)<}+qRx^3b95elHU94( zZPfRWf3FcPaWKOhE3!b>%Y-RB;zq=h zTk)UbGTP0tY(*{{CUGN|sb-cC|9o#Sap>gu>+)JmO|Tq&)$fH{vct%@ODc8z+{u&p z+XvU|%xJjxW5|BI3nS(oC-n~3vHm!>(>z}ZKh!-KRwp0VUE)!t4pa9wJVra%N%bIdmwLD%S+JfB(S zQ1*;vdrzgar)F8>>1JbG)7^p3bo}rz=NOGEmBC-98oJVB9Nbco|&Gyqz`9 zP&y8K;-?XDvJ?y*6X>IxIv{gcjjrU!(l;B2;N+%q3@#dmL9qzN{*DGN2oWcH#5dxe zdz0zw06BcIbqj5uHHjDsuckL{Nsy6#NqXNm0uLC@VH@9z(lff}aIvo;HF%jyN}h+H zS+f>1a#a8lYp0NlNt=ma=RQXAM-BORAPHud#iGf3HJ<*AKP1Mv~kql2qWA@I>5oOtO3Y+HR4zrQf1ANO+Jj|msh|4$HpYE`AT zy7`zmZ5@7a8G*RFW1zvW!99)5{MmCud8_677(<`tZ4C&$<> zTnoEdS+YmThUiWb!>lbG{NANpH|NtZ?5TXiHmv-IF7LabT))kFhuR9J%{P{A`FjOF zd{BhKlpxZW_zd2)oMiP!ZRvPrAS<3c3JzGqvCBm1*2)K9t7ZvLPwxSzNq?9Rrmi5i zTmsI|SEpXrwzK_J(v0(10Q4rtL(`3TR@ZDkk>~zzk407CS70ah^Y)uDj8Vu)c{guq#$u7q=kOy`Cp=72;5-6An zf~U7Ma7iWZ{kxJB{_cQ+D@r8cU<6y5wg7%_aiDiaj$!+yOIWaTGTsVRrgOjAu!SaW zgtyQDzMry!z|(s4`o^PpHcp!ixV>X?j3tSnss*?_I02zeflMYhYcKYjMgw>2(J{w9 zv<-@ZV81485vqgedsBnm%YeuMiL)zDN>g`E2sPZyXT!SaeVG)eLS^G~$~pB$27CvbZ-TR9&Tu8JpB z@zWq|$0$7CBt|NZG(e?OAn7jBVeYN4-ldNwYoYg0*O1DtTf&L5DMt zzqOCuC~r#FPKYH1W0|lvcq&k1UsQb9%GkI3g!%D3;JG4>7ZRTc@eB51fS&->Nc7~} za?gnA&p5i|;`u~Zem9;xEKBE?I%2(AE7a-U;>-E_lXkUDM5>$1^GHr-hYgp|^^aVb z=zZtG-Y*tox(YG1cO8`yBurM(RJy4DH)?F1M4TcnqM}AO{FkXr`i6&jPB@(&zbFJR z8c))vyDq_%*Qrd*&STU|tqI-6Z;@lmy&*SgH!HV0p86+wldxG%ydyz(7;A3#bozH3 z^WVK^%x`Xf|NFBcjjB%z8c%0o9+zP)naDBd{_9~q3jaY^tqf^7qDmG8@!?LuW0)UYh;MJ?lBQrTdnmCD zKGju|Kz|JkUr-2EzxP9B&J^1AYYcgVKhX)c!KD?(7@W}u*WGU6{Y^@wp7R#TJt;(q zDTG9QS;^`zIs$VdWy#(i7NY*T!K_vta`|~3C`~M)^Xkqt22QJ=o#7$434_t3d~ z7<7V^$1EViexei`|Gi8f|W-OLjh6Qa**d1yBt4!3yMaj0;Gjed+5h6+VM z2rEwpANMdvEH2jY2CUeLeFR3jgcROc7 zX3a0yYnX<9_6LaU`eCq*{SLCSUvcpARNg&d4Z4470-Iyg$;@puVSA2kfG?ZIF>1&j zWUfdPAq5#SP$>gB-F2*|AeRBV^#IM*CNNt$2K8Ch$vBfoahc2kCQa`Hm$hHSvpggT zBNz1PH!=&_IFHS1kmelJ2l)?Qnc;=98*Jk8xx{?_H(Vqv0aLO(SV`S}=2?#y?~|Pn zQLeD0;t%K2S#^Klz+w@a`*JE}9|-aNkBZogXO%&+W-mV9V@kSr*|YDqCV|bot1uzD z9kP9r(OGR1Ha`ic#9R^7^k4D~#BSp}?%96JeHV@@R5Mdf4?#upIcABq5+q($XENrx zvj1*)QL{NcxO06l8E#92uE=^wE-k`WA5AEf$@4q*)ZjFQ{ba0Imob>s&hAZMnS@=E zWa71YJeDW`{$4Xd>hUY=-rkKV-|HcTn`N1C3=8@Ea*heX_097&=`Ujq+BuYi-|7@W zonuiS-4@TY+vG=HXr7}cgX^$Ggh0FH6Ns+OWmc955!T@xlV=~#q`lFibt|GdFODAl z!7+T5R7PO?_Czqdx19V7e9rjv2+-}W3GiCUn>?`I3wK3y;TYF5sz2=sKQ>mtHLVNq zw@Hx6)pLQ{0|78)f-!Xs2jXsDg->reV{Z|6N3VFnCjUu?hu@o^s_PGIuW|wZsK6#x^N5Kdb{R zG?U?B*g-P)as_kmvl3i|<4a;=gowua%EpMq+r9O{5Q}rjetJB-K}9=(8OIOwph@$-7d(_PfWB7aYeTT&EA@ zzdfSAZ?-I^yW`nY^Q zGeyA$)ql?+HX-TIHlB^0R_31+x(BY6;=i**%m}| z<`DK~h%z%Qgy3Xb4c<0&C5GRh!-_@${No?NKH-?uGrnx*8{FhNOs*FoL+d6JO535| zs-Jy@skqL_hyL1e5dI5F#Q?Llgh!R>3~wp&;_GE>w4FeslNG6ywFEfFPk>U(>rClC z5AbWO$d=8yii>Uwkd;@rvIg0LsId79Uf8R`O7NFs_1%?pYxs8Be>4sBnsV8F z7c^;Tt0-ca2@||>CM)J24J%uMp{K79PH%k8ELBz}c9Rb>n@*S#!6q(O5N^Pl<*XvC zKqkuO-NhE?CCt_Bx^VOB8xRS6ikpAwfbo}qtP1-bxC%0SnOTmmSxID{lP3|&Ho=)2 z0H}Ql>~RvM{yF#Y*24-q+wTJGo*9VqUZ01Ntq~X|V2@8`XMop}_FSHzL$PsK3W>=uMa%_M~Zvx!*OZ)WTXGMBFj zkfg_i`%Z(|Tt7Q_osmpr?(nGnaS!rwuK-F<7bnj>ZBch56#2%Qq<1^Vak;P!htFTd zimhJE(I<5{Tv^F>yj{Z1{AmsO%H!}*d?9;BE151HtAp_)X|OU%m-Jocd`STlXsqlE za#mG^rhU_;r!P7X7nK7Tv|%}ZcJOUM5Zce~Ul&Vh}2Tj=%=+=A`_Z&BevtP~VE3+?HO{T;~Gn&nX4`V*Ik zl`z}&eQ8pvC0TI(0Hdkp4n^X6xQ^q{d5n63dFO)Np&ehm#(`_OO+W&-4Cb$M=2Aj$xK{-)RYSK|Fi^ zy)E7Fstz5iY|z8B3EMd?Z2G2au%x6Cz1u_ z&S-k=9=6OhC;#G3G1_S{%z^Jlq-)Y2Y`MCV{z<8ZP^(|?{?-$iuX`K=KZMZL($ci& zdkIATeG5)i3H(LdRLFx@=iu*BP12CB%t+Ul6ou}gyg+T< zpU$O3QmPU+Tt=9GIg5r!a=wnphSAZyy#&+HTdH4nMvs6`V&nNt#N%HzaKbIo8gXR6KHE1cVN&5Z9@vnQdoENW{6H5S09n zNe}*uBlQW#EFEb1O^FgCE%c-B`LTb-sf^%Rei56yYZ9)1?F*_Yt&le(hED0)Nme>6 zCC)3o$bWqwVdehw;9w?Cr%t$yJ_A?q=u}QnDyBp5o1kf z4JdPb2X9<=UITi~Bw%NpH5urg1GCmG#J!g0Cc(8!$|h%I>&Je!SQnFR}am8i`2shD!Thiw>XV1JGNhdxWD(+Fo- z#-ChVbr)g6w8Kn7eGTkQ8?&DIKASmtvVy6o)CZRxZA>2L8FTqDk;n^AU}fISg2$XY zt9MU0#y^f_&h_fhSBFL6a+e*5rme#S{(bD7dk*r4uR+XHT^byii$z>++O`wux0K!V zl)@lB8ucc7Lq%!-kR17#d6?tWP9(0(WNPClL!Nzcr%Od&^E*~4!a64dGEHg?o4uBg z6^l>uJ@2h&OXj%~ttFRXWu>9bf$opo@1~68K6N1aNr|W-$TW(KInd=}-*JV@DQ48A z5_2=`=ptPKlFj`_9>3X4zJ*?({{{R&2tUOXXh-l(thgEbb%Ih{?%?{F0xX=XOA8N* zqwV!&VCL%z|24m1jndO0x913bHU5K}#Z}^t=?Cz`gIs#P$evygoXD@UU5e7jbFpJi z9jiSWM^?$+h7RUDT>09JYZ()|+K$V#ewoJ29=3o-z7)yHo`bF17IDn>Q0R59hSzH~ z==hIItPHt<;a8{7)n78`jKZySufj6mhglQ8c`cI>Sj`l6v(7ft8c5ne+U zKh4JuM_$cDO{43uh?~_47IuR}OEDZvP5^!D56DpILT~u9y%1#1&Y@FQ{Kg5Jem0(8d=xV*hG0_f z1LoV4!*rjzJlV1P8V)sevQ1KfjE_n;_WaihJ6vW^^Apps#? zJu6^TUvB_m^~vOqc_}Z4%Y;u7^d$ou8u8Nj5PDh z`cm=+5;oQb^LJRG-9j<;;Ek)G@pFVx?mvSne=_(A7rNP7qSx?f(J|IoqMG?Q;~r~~ zpG`OU%%l|p^7Lf)1KM0|O14LS0zJjKWaX+1bjkB&71uN}6E7_!@85Xy!ZJCuNUZ`n z;u1_1?vBE-qtEanH=8akmw-F}oFF;Of-c*cN)&SM zy1-N#>s$!EH%?*84_DIi!kW5zxzU8jq3o2vT6SpeL3qAIlNxaIWcu(p7LJ$U#pPab zLRy4Ap3V7xW3$+o58I*U>ljXaK8!gBBO!H~0KMBaAAUa!r4}|9;MC2F{QOTV@Kfk) z(sFeNvox)l38T%Zv(}OLSRG`;qXuyoTgl+9gXmjtMW5|G&#~OTqoI>B9a1ubvvuO2 z*5O7yHciLuQBSh3SO|{hd9t)O6K$+5>3`n8@wxL-+|*fzdopb4QfWOnXnd3v3dv){ ztSsr&&A#+;$wj{ZrUatwSj8^;*#rgrZLrUh!G-_bYZOT~WtH9H;a__&ta|^Q@l-dV zyOTxfoh!d#+dfTFZ#cltFMTZCTl>vqcvX@&~xW`u77Pu2V!Q^aStwW`+_TO+t5Mlmq3mTL;m4Iq-fJrSaInJ?h&tKD=!!m z@4-R%7b{BRExItn{yx|@iecIEEZC-_OB}Pr$fKzx%*iEdsp!|$_U%d^f`Kh{Vh^}(fPNT^P|tPQp^ztB~_@;#OFLCjS}D|nG>_S zawKb_I1zs1zKkSEQjfD)XaAG6zR721EuR5-rpK|@+nVv+ z9!52)gBbG(U5vroFVH^v8F-d=&}Whyi7n^?yTKdq$t98&aXSk8SVxR&T!EHG49Vg0 zT^}vAF^Kzqw@SK@#q+gcU$Y%qQ<@G}^NzE@p5gfIYZ7XB$J#hg6sFforSY@ddeE~* zn5Lja(#(&5)E+;Gexyt5;uhf%(+2Dh=!dxX^9U1X!OlB-69(noh)Ay?=Dj(LA43-q zkwz(-M}Kp99%+AB`}HaG*d!L;uGs=7j@@F<@2bJE_XlC&K|b4}Kb=u|o5i@qpQ1|B z^(HW`~HK_N5 z!_4~VRoE%giJ_aE$Vk~T`m*H}hB(E;*6jjRecXn+#|ZOl>Pv7cH$T1g>^P`$PL}9( z|G~3ci>)Olf5xtJTVU>LQBo`$K+}`*U{O^+NPiz_JUzIIB(K#6`{5I~^o$>U>vQNc`#t!>{( z^Ig)}GiR!qW%`m3qPhj#Tk`0;Z$i|K9HlA3C2+>XfFA$sKtH}{!0Sshz`?5yL?`uQ z&0kacHd27NH2+2+AA3~WAV_ty2cgdXE7Fq-Fknc7Dy?l`!@jDKEp5s4g}f&w{UjvW zL4roB22i{2`ea7a6K4O}BQ|}T8}LX<2Cdvu%zB+TK{c$DsM7A^yb4!q%)d09PH8?! zericF_aA1%KNW5#*=9g~)BQNM;Q(pq(Z}Ph)^xkFBH0ize9`cPR2d~!Sqr5hDomLz!bv%o&OmD+OpH#4sOS(Nt4RE;Y?T(<|vloNQwe6Y7?k7spH>n%x@o_;njF zj7)`J(gsw%_Yb4C;T%%VbH43^Cv+4!()AY#;QYxe`17+oT3so}K%KcXI7)-zYF+f{ zvnuf3z8Rw*Z-bhXlbDR+g}BH%od{jw9MNGvVPUWmJ(GKs^DrEPHFZO*bd?Ho8Q{YO1XCE`!O@!1POr$TVAO65L5ES#rhVEy$S;MQLJhlv`h_AqG4F!7C>9P?impg$MwnP(K_bw>w zn@p8Mb;xJA({xgGJr>Egg1+81e7Mh%c;l24l;g3ry0pt5BZQ%}xzVfjR@u9nqtMH)r0&MHa6h+-U*D+Ad&LyF)fnFD@@Jq^0*7RvIG<|%+1l~vh zH`g-av$Bn~t}v#0)7(g~>KGcC93;y7mFPTKDXK52h_5bx$Bp{IsB+~vL=AM4%AUWt zZ=N!lu5}Kgj>gj;DTOdD76f@SITujbKx6&3T3T{GlwEZ3>eJ|-rPd^r`@Aj3vXIp` z;24`)^ue9)_(GzXi{KP-xw$@M9=zuApYia&vBzJBLh>ScC-r)@0eD(wB>cb~o68>F zkZ$@4(=QI-JM$byMy!#MNo~iQW_OuKE2mKf_ykv{ynuD*!U3*Kro{sOtaENNxQU;I zZ)i<6>T|jOm-&oA28G8Welnht)z{VzKiusAQetSsWALU8Ws)r+yB3 ztTqg5WditxT_^B)w*|iMyv#~uG%*YO`cW`Qjq0yf#e;X8NXg@AaOcNC4AxD%-)~{+ypYSLD(S*r<^2$7t_K_|j!2e2L3is_G&|`JiX3yo2io~`w~J${EAh^AUC~K>pK)A| z+xbK&uzb#kCGgpZu{s-o4_d9byzmTizm?ko+O36M1|{_1kCPbuw~J2AyAOgFyOF!k zQu~Dcq;>jA_DEGKT{HHO_2-^%>tf8w0iRbe;-g5cpKQf!Lu2Al(At=zH;L;Me8$8{ z^T4XW3dkchrlV7j9AesGz~dr}3yD*aTLAsLPLse5cdbv^z5(~=ZEWgxe>zF58{Z8S zLDT8|v^r`s?z4+QwJ)8RYwd^f`2#S^bQbeRS`HVn*LVJLa$zne|A^JXQ(571m|O#<3~n4g-RXry6A?^i35Nj|wiY67TFtur}z@(c`r ztiUg_QbaK`07v#kfq%p!xOBgp4g2UvH~YT8FuzKSm#Qbr*9$|$bX7WZ5lGK65fs_K z4C^&2F|~`3#}U?g1?5+0@w6(*qLYYE{Fj;Id-)3H&N*%D3lyS?A4-`I$9{m{SQ%P<6(*hCyOxCekzl+vA_z%71;@Q`^7WCh-d32-p3C>M_l0W0+Dd?Xb0{gS= zX#cLKte?zjJoff2Q@>e=Mr^rA25%lACrb-~7g7SzPmQV8=GAn(GzioStJzD(mC*Ks zF0h(}oCtcNsZogA#Gh-7(&ex$<6d}iQ=sEO47{sy9En}AYo0tD3_Fc)7&khf1Z!rW4Ev=XYr zUSM+^{Qs&y}!`d0@ML!TJZo<9?$IrdrcxBY1A zlEYsrrT{WO4`87CR@kl32i==Snf>{nL2`lvam@*2jXgv0D{mT?4O)xRsj*PbXkz1= zUUsPX6>l)ln9EjJQ~3;4ax;87Ihl6?5C8kXeps7Ky*7V+Cz`XP9?slyrj3Yv7r3Cb;0LE)7quj<{E_nI@9n}}e2wi@@{ zTuS2poPwrxS+In22Mn~Fg+%pYX5oVYj9h&NA8}mojm>}f+cn(5-DERZ8VWKQXa2)` zuKJ`@r4LiTXQAtHLzF3!!t94fAVqx&Ek04f-}@vO%h+w$Bi0Mwb9WQJ=5V5#Ji>F1 zx{Xy~Cz+j@@vIw9n`wAvgS;0UPjtUJxtTG_PPuReXEjUW`6-{_?WIPTsvd{|XX>$O z>oo3;?2OOqAH!kusnqaLJ!+2EfUk@Xh*@xs(KQ6iTRVVf_yvdnfnBcNben<|O}sUM zcP6C@OK()clZuPzc|wNUBgVpqPGcg*lcKw=KBA{!B^woF!tU=Ggp9*-B=P2YR-Mc0 zrY7|B4X&rb`LT74mQ!8GvYUUIuIItzoIAnK7u(r{20IL2p-7E?>yp#H|MM>pj*GmN z)GS{5>#u~pjF%RA!4dDSz_0VB5FF!j{g#gL0S~~{EaZFW-8?5sdKpXVKt8B-DTI< zjW7e68}LKNC(zefOplJs;_)9r^vjS4Y}7TT#j*>@uJJRx%D)OUV#pU?+C0Rc4VrYg zZz+cNS`o7VKbU$`6>SQ9$=_d`qa;h2bTw_oc`M7%|4uniU{){6GTzMHfb*yuyAAel zlmyeA^GIONRscxFtERFvWV;4grg{=zthx@KU54m3g#}6NBOth$g`dy%!?MebjG&Jn z_@&&y1M`yThZAq$t=1bHn{SI|{XuYdnK1;#x%O}H%$3$i1rH|Q2uute)sK1 z@yLg8XR;)j4{=1VOO;*^j|Ib7d0@Z0gyBthMXOptQbzQ^^vzkm-}Aj}IW&TX@DM)D zk|$pmno+|?%A`KX2^0m3LHL&fbr`#j5k)(wf4B$Ls=5Q`7Ir{%QZ00-T*bu6ouE-X zn+B($QvD|acVTjV?Br?y2^O%C6Bxf$RwM^YEk3NCU{+JO#KgY9-u2* z*}tEo$iWdA`el_4d|LAu9sky2PMa8&@|{B!b>lI8Q3flTSHa(rV2u8@VkFU0p6n~t zrHk_WnbD=!Fz`eqZeAcwTevv$F@qOu?A_Unqn8Ys?(!bx^h(e%2~o;%B_xEX;@GDo zQi$zbr_q5_B+S7uy<%h?mB~`m`Lx-k1X8NrfM=Z?IYl^UoI2NwC8D`y5&Qt%p%hd`zO z59uY7>qjoJQmJOt?z0@#y_5utm#UGk@e;7gyx_{+cV?&@#4&Atv}3&`kDdzrhV2rS z{IlGgXZ877G~aoex_Qi^BJ+n?+uTVYeKiel=ii4q?=)N!;!4#&x{yP;I*e`R8fb|d zM~OL!(5hJk5`&}s%UfCI+VNdbal?{%Ne`p?uiv=qVLkfDKgAkL3s$7!A>Vb)Eha^+ z5{8n>_;PR0voUJD__Hqz*E$mrIGusY8Tv$Y+D*LE)r4DQzhKJHW-9&WF#B*9x0lE^ zhPjQyjP-A4gdO+srqN1zLfDhfRbD@uHglC_w+_A0yYpgf(iE*+`OQC*SH$Syfp1&8-0!G*uv`1{mx82!?~JlQxGHth(5iP*yine7GT zb5oh$ik-~QGi!j=(L!~x8zA5P71z{-!S5;$T2hmNQm-S?!&{n|ss-S!8e`a6wwUGx z0p45wi#<7BMT49P5ekmsxaiz2<*yK%U?l`I9rp4H?QNhe&JK-tWI?(A7xu{-hR)lg z3d_yQ@tTSb$DQX`yoQDF&cX^Gw9Q~UuCsh6ogK_7nHGFM=O2vBtEZFFS}`O#1W#76 z4B_d~i8Y9YW-mCFehe(lDdLr!4ItAWn^Ljki>c-(RXXM}o#+Hf)8C9eeC6&TmvWa= z)uo9I=N}l-$FWwVF~15V3M_EXh9P#!@mo-pW=RCNcR}+cO&X_?&1AKBfm@C?DM(q( zD-B4-%CTPX*<}OYBxUIAh|BPz_!Vrd)5PG3w;`0{aoxT?g&uiqMfw-4qnrScz|%%% z&ZRv3IV?s!RyXq}ZdRl@?`7zKp)md7mygSn#W3*hQ8;xvg=yyI(e@G=v^L0yr2dyc zEmjV)85QZYW?&L^Jn96V-vmkf7i-pdwgyk+N)Z~AsnF${DawjYrY4)yaK(Tb#uc~N z>~eg-&R4aeJdW@9c)>^12nIG&D;UkK9cbRko2-)Y0%m#!kG8+N1{Q~M7~cDPtiN3z z+bn(#Klm4bsi_U6v!`+bW_Q}_D@_Zzc~<{uH%xezZ4)!~7=NS6EhgQrpK;t4H}_sg z720;%kd_v%H#cwtng)+xGsnm}@;;6(U2%u~DW-;dUUNL>+YHocIznlkJak8;apzEk zeJ>gzL31aWtBxpt@(@N$b^;4-&uvxCIf~uoQQtWt$nrFUN3= zPz~_jFT&-yjx-Zq;{rjX<&#>X!0=juThlv+{%#QEh zK@Z-@Bt~D&!Tb-$HnHa%-kvYno1gS(_Q71D5XJP+^ z>98zCpRShSay+NP$i&AS4}EPfie9y+S10r6O&3jmW%m;N65YzbczF#JyR?&m7mq=8 zcqUU5qCx|v4FL2w;s%!qm8&eH+eBwV{&A zbLgHKvFsD2`Ct})lt~K~r(ynI8Ap-HM7>#rO!u=zy~0GgGOU%|%P~$B8|^svRRl42 z<9x+4v}sP|YV=iz!MBGy@yJ*({3|cxpY7*7Gv>PVr{h^h)RwzHvCoj_W=V&h+y|$7ewE_1MHW9^EUt*s`)x1qu0SkpdF;n^;)J1G%m+0L zQgFrfZ@l8j11SAn3{A$zp|#{VN_OWW>b^iZ(Hw}=j-(Gh3zO4}jH%&cB~q@KL@i%O zFy%Q77&%Lrepvq$+TA6HYd6OrEVai=84Pg{`p9^CE+Vnq&kZ(}yJe{~5JA}eQqqydlCFwR<4_333q0QkmIGHD)@2?N6-dH-7i{#u=rN{Bx z5;a^oC`x3E2f(^p95;4~67vn!WcK6{?78ek)aRXL{Ima|xqCSIb7C&ho->i0T`oW! zM#YJ9Suo_T6ek9OoI^8Igp7IlQ)r^>36N+XKUZ=noRx;2(Nb98cN zxji(_G#&ysg}_hmv(U0i7_@>dN!$=X=GBATF6|KgE0+n2rv3qM<1E}dYX?5Ps?D9x zZsTEY5BpPR2DP4dfR`A<-R%zC05M2|DxGAwpY6a3_ZgC-HJfnkk1MV_oX9xIao&*y z4>4##D3leQfM37dh+W_(oHB779u(|iu6(X#M}sDklyi!-dZr+){<8&~&S{e>?p{9r z>INfN(~8^WAA^JDaq?JMoy~RcCDtTTj$Ys#gkC$J^`ovet>QhkAb?U zAe|eq6UyoyVbZ%9u>Rj<`a4XCMrLq*^{<3PzcZ$HA0YSHPXcK+fgL`FQTC=e=*Tpo z#;g-~YnC0|@zag| z^xZ#(7C-yKb(^J$L?1V^lD9bw@C(mfUzq=;gVsjflJ)DhG3JSo2+fP@|^g@f{$fQ{80Q0sA z=9{ho`OwqJ{`aX8Od2OrsUyMEd6Fub5%dRVp9zPfTrZ|>NeEcaS0F`#Hnb{LmI_*} zroIukaj?pj7O5(umrM;bF24i|4D!)?=mS5Y!k?L;bQerIeA%S}$1qtnkNNxX3LD1F z8M|jMrSs8%n7%Qkw+lWnDz*hEkzs^=BmS_6&jW$I|CpNwvc#oYlVqC3;7zv-ct7a{ zzeeANEmI1J5#?P{UY?7{#bl&DEb^@9x=TJD1nL%dz7k z%7sXFt0eJ`9EON~Sz6nAguP+vNEbK-5XrMg=)^*M{H!*OzGVF1Yfmy>4LE?R{@K99 z@1>e4vRpUUklgqtKSiUGlAMj%1g(YDufuu^U+ zxy$j9{MH%c{%J3vT51Lz`K?0TPcNb;4%}sg|D|E(OFjx`fb{lZJ*2(`< zFJr>*D0X$r4tyPhtW3oO>LhfS>p7nSgBe@VI&uPC|D^=uoh8B5s+NDvM}Vgk9RimJ zHc=6|TP#@{jY*x0Q2dHG-MDrDE~6Q_x_S>&a$vvBV0s?&??*7WpUx!Jo)Mt*b{Bmu zRt=SgKiGXM3fT{3TGTaPkS_L7CYjEA=}$dJqEu?doKp{GBrkblyZ1RrURs64oL^?; znh5AV>r8iST1(qzWYSy5TEJ6Biu@hWB2sESY+|h~{7B)vHlC??)ZG`S^9ylruLZ~n zDnQ$;3vfmA2(#=~5w>>4(1Y8jpp7qd`F4j(K7{>3sXSXIy2i<8N%z$zM?isVgnW=_EeP%O;>>Gjd zJF74jd;U01hoZXjdwFzPeA=W7(YaU8q(9&2&UB_SGYCrLxs9byknu%Z)8YUeJ8Tn{0?hbHk-Z{xQ>A$JMbQ}g-p1jhMTq4!r2>Hw7095z1sQ- zN_gApEc4fFzm_>Gu>JxwObX$6Qz>v2WsW7gfl+!>#JrrRKo3kpW=v0jJ~kIXzfIy$ z;Lr&Exp%Q*VFtS_yBFvt2l^tditTb8XP-^hr{cfXP<3BJ!Vcc%7(iNJd^ClKHG5!$ zwmu1Se1r`vm6)yfCSbkKQ8+$9l=@D~qkaPlv}}nC_uk(|H@A#}?WHO?1l*=%Pu)YdkQ|~;-W{ArO6`Cg$UVhBs{WGK z(=AO+#W`n`{Cui!!Dp}CxeSb17)CXDvBEl1v^Y^0jMh#e%{oD(ns0Mb$*02WGnnw)`t6fpG?k3V$?68?bhjnZc-Rk@%8o$i zGp>j#&Lf&TG^vZM1pTt$CiD4yA-l)y5_uyhi~1LpVf)}@8eJX@e|cW?b&E8!V{0Da ze;b7u&7as`_J0(ehd);D8^^6=mrY~@|VM4Sku)eq+pIsB8@6Q3d?DHYae^EpX zyqwS`>=pF43`4NZTzb5668LLZu=}I7z%+DW%gyq54&47qS8xSJx@N$lCCk~d*!Aq3 z&k^YG^#8udTja-DReErNS-Cxc`jFo^+H#%UaW;`r z7LS85Ra4^nj`OcSk3wI~?~q2n!f@XvrWS_qk=rp;Q(sDlrj^tFqw}b~;X;ygFAXw3 zbnprXhroW`VY<8THskj9G(Mjc1HgUuyj2cR<=gAftssWIS!aj0lMgYzm#4y`wMFd3 zjX>B5V&td)Y_ja25H{OH;`Xf*iA_)j-pn}2?$f*gRj0pTNp(ftmX=67eP4-q9FKve zksG*vd}Cd{;C1+wWQ|5Qn^7*!3uj>*UDVNyw!BP`@d+eht&(ubwGJxJXi}eeLD(H3 z4xts&RH8TxqGr8@|JEB5_!>rkPKqM_`!jfNLJy(2bvJI@o6F^|cVM5+95S|)P=O7u zF#EF>nz`+#Gc`=;yZ>s?&me)9?XN^k<{IFPd^6SJ`fu{JfjrAJ3X&M|#MT1`?$M?CoG5*o$KLdJ}4+wvu-);2I9D-O9+n+Xj18I3};c z0O#U;1Yb<57*}g0w$SMg*4u3a6B}*fr~e7Ztc;lt6&six%`9(QQ!Fz){11aQrjgIq z57FS(B)Y=)4y2iL{@~Nc*jf4$=)k7y@b>v+^5K9xz41^L_gPAkGiy?~yZ9$?-`oi% zftp0%*DU7f%MdD`CP==n7G_3w#xN(e6G%f-7OPpKNb{B^;P&$(m@_E~rnDV_VJ@@b zV<$_e=p?{_|B7JvvNc+K1q@s@2>d8#9N6*;uNJMRHMc{FI-lFq3NNBoG2FgFCml9+ zSEEq!0urXcxw`FMGew=Jao_lFxW~(5S66JsTgG~1j_5^vu`eIAm$Z^s63Hkdb($xC zBiQU8D@vzdn2$$>jp>g?hE&CN4M|9yN)*mlV`}3J@=)m}yW9M!*`E#Bur$Az@8lha zMZP`weP95-P7`FM`F_;roDN+#eKWmXdkaO6zGm#TPvda&1&lAAK>mrp0MSHl=BrhY z0j(?)k43U(Au+V1dLLLXOyw`I|Bqa6C*+;L87vd^A%~f)-m2~aBdt5+-@D^X zr)LE)3G1OELj}2aGWk{VkX=|g%&uON$NSyk!p=FL1D0CLh|;$bp0fK~@_PFnytqP= z6&7oT(Z`vP)*(s0MNFlSdE-puJSm(e5KTDmGw;g5j~MLaLR+5hB#^3)!WLIxj`}fl z=R6jb@57m&MW=XoXYYZ%m3!&TVim$)<4!kCo=jHuuZM`UH{gc#3Ci3GM}@H)(6IR* zbXr@IxDSnBpR<|XJieEHbzaN*hF!$4X!2XZ12-}?Vu2S z9Tf~W^IXWJMe$5~haWBVc#G@Wk6~0|9)6H^W>3ylL8+}x{4eLef?()+ut|LjEBMd158^2=c&-*xUr9|ORVa@p z?pkEmMs9D=B|<&rqv#dhMCgt`i%eS<&U2j$ev8KO?Y1t{3SYu zDf_Dn2Ol_)f9f2EreQ6pTowk^Z*xdR#RyE?P{*@WT+OjeTcK=m8t2KGL_>e}L*Wm1 zs-bC5{Fen`RfrqyT7Hw!w%Ja3$D{G(KSAhJ$i$~fo1knC$D4hX5Bx+6VvFizWo8V% zzm)>U!GUx+`-^QiI|#vBMj6|iW9;>9>xqNXBC5)D)3hf9f%A9;ynAKN?y#|>Sv?o9 ze~TiMSMU~6P9}1`=E>|cp)hhHvk}UdWN}^sW%|2HkY=k}Q!y?xvqkJT-i)b-zhb5& z#pn*Zc~vM~+cT3a?up0FrbqaEiXPa!Ujh%u2bfMPchq{X&v=-`;_I#!*6Z+0TB28k z73v!>|FAPiJmy%tMW2|QJvOk_?F-0CX^31*gb~^Pc@|ugW5dd%POp6$5#BamZySPV>Wn4rcYXO(lA+`(US; zI5}4`n;cOohqsMVjAHy1p7U-)sMr1r*OOA<)1VG9_E*Mwf;l-wS8;vcz@!D_abXZi(8|L9<`m)fx`kw!N+NE# zZVb(nU<9zQTYGm`!84y~vlzrprjK7lBkZV2nVeEwgS#+xhH=T|p4l-@< zDQ7X}{n2AbcG(d@c~h8wc@#4uIZnXrOBg;a7Dmg|sO5|oQAIo=Mw#!h3rnQTdg*eFzL0k=$EcDY{^mya;kX&J)EgZqz&qb%dK5( zPqhgwN(!fnvvo<_QdgWNdVy`&AO&xmTzI3)-a&a%GF%K>4CXs@so0O-@Gv@%`Bu0c z?2t~iCR2uBbfSGHh!%x^Y%C)eH0n1z-1&FWGgXE3?`Uzvg5 z@4)U~0lfchh|S)sVR=5E84fmpBL%ytf3qIFo7D*3yRS048UtYTg$e}ji=mpS-)fQ# zzk>9S`)vLf|iI9tPdX`P}`U*^)#Ct}pNWGdGGeoFLCBF{!p zp0zwB0}DSFL#0%3A}U4YIlg0_L?2J{?qsrNY6aa@ z=19Z_PvZWW+LZTXA~AEzLi_E%nT{mR$5GDh#TrkNY9NqOR)p4T(wLkYg!XMeQFO{l z{KUNEJ&gGbTKXdN=MM{F9~DM-*ze@o=k7xN4em5SWC7$sGzsgNKtwJrrr6nl2RGis z(tvd6BwkERQ3JEiy%2?;`I5)G3gO1`4Ekla7dbamo}L0@GE&xnVJ>D&&!k3Z_nS$~ zLtQ~R<_=WXGi+}Fm#H}v0$Wr!RHI3U>j%&(d`y|L zPBc=GU~O%6s9SLxJG@(!%8E>8a`snY&Fb&4V!~?VPuT?ho-=T9Yzx~Im`GN6sgS5G z#&o=lqMm>_0Y@<^=`{m8+AW#l_C!YMW;RxdJZJ3It!G}JS%yzvhEnmeAFOLRz-U_z z7~H4@1G_S4yM38)IrtZj)Xjp~6JttRXtFeB{E z!u?Z1G^JXP#7a*k2WL;GPU)4@bH^tLx_u1G)U9a1IG3YNT}UOp1&PvWfl%AZZyV_QN%C)WRwxj%j#`WCc=V9NA9Fz zuY(w=lCetBqypNf8HT zx5Gm!o}ov-EHI{4GEQXS!6M#02{n@GkympLU;SQiqp;!regb?8M`|cAjwAY9p>$7XsF43|sgqo(An@#uA*n0i+6Gl}VM;Wq zyPJcRcjBnxa5_`Ob7tm`GjvMCZdjGi-NCKb;ECZxi0W0O%ez!bI$1!Azh&XdvpKZ< zMijg$&?RBbkwka)5jq~8126ksu-!SHuK2D`K&l_+_9I;CZQz^uZm3%rmk&$_<+{@5 z^m5@GdO=FD6d}cLXyktuPn_TF_}gIGeFm z6`}8DJZ2j^TA9x=BAm~20>&&_Ot+qhp_$yC^YcboGRrp!{)BRT)k(^Bx}q@ zp!Qi0^66!=Z~1F1l$inhGFK4y=YR2=LpTZ9&ykz2{(`42SAgO2+o~@<;HkMs;ZNx= z)L3zeIXEj39vMi}2XWKr&INH~SIG%hw#J=G#!jXE>m6VN`x7MB&qJR!F)jyf$?fUf zCBF;AZelaSAJA--f_RKh%@n1q>NE76%Y2mdbInsNG z;~CbU$MY+nz?P^jxWLE<2WG7Wc78n``nQli7A!|?xreyMN`vW;j=~djp214H|M1Il zDLNtc1GqLl0T;If=nTzdUoH$H?|*G$Cs~?GQBa(DX>Bgh6mN>Xa5BA9}M_r4RXspwZmN|n= z;mq%>-zjgdZ*mf41T09_9#bNI<3973kzs1b9a;Z?1Y*2Cjz0b&$A&C9jS-U;(7p|6 zjD$Y-{+LsZ0ghHQ?#(hrFl`o@)tAnQ9=C;&$=j&>s{y!l`8rmHaD5fKRCcx71iC!i zlgzS;#C5XV{c@uQF?uRb#GIwbB=HLvNlHk2Tpeq5YdR)Q&%xB37o4Av<9>Sy;e^ep z^y$&ZAf#-JN{_CB-o8gTs-BLW#@2XtwJZ6dB}rb3h>_-h9lZQ6Incf}4ifX6(Zr}9 zyd|``-_IS4$1dPP{XYhs9p`*LhBo&5AiDN46X~&+20NRP{G6$^<}s#bU?QEa(F_0jBk9}R0ZbA}VlM|Juopv&NlY|DY7#`*8(bf* zR63UAaD4VT?-FUyTNM(>^?e-*U$OTui?EgY3hBKjjIWiI*k4TQbR| zu`Fm2TZa2s54i081(!*3J#|HE;3d5V`JKWv*-sss=H}wyfER6JXVap&e}LRoq)W_m z$ZqvBV6bc-mMoqKj@2T#f!pb4mJkv=sz_8bMCp@F`QXdCkoNFfRDYH-9QVJ(?v5^m z&ZXXTzoscLwx8KshS%5>-a4}2;37t|R0Hq#G^0GXyFO@CKnBxKGPmbQu$7wL)MPY< ze0}o}W%fzpn;m+X7jzyUdu+z3j1XDkSjg?U7m+!`-+0mj4{`a8A?9iJ3TnJ31~L0G z4jM}0+||X*!@hbOq9EkFhKUOt zhmM9OWIy}_!^LYc+_;9hd+G^DwdpZ?_IH3H$K?Ee@haMEd&N(>a1(p3v@p+|AH!dk z+j(DzLFLq$wB;dy5lyxzfRn zMXN@H#p><29_7%8LPS@bjSBO*ehp( z?uL_SHva(=TrNUB#yy1}>Faqd;e()X)&#;sW#P-?^Wb;ciKyl{u*HY^xW0fX3MgsQ z-JLq5O3j??w6A4`PTOMnyg%qBIE2`MrGUgNh`=LXdiU?_iHd$>I^wf2_sY1(fyIpsiNlVb8f3czX0OtlMZzZ@G@* zFg0Ot{#r814xr0vFZwSx1sR=PIN16NFE5!7u~w>}K3|W%U%a0R9WcjuF-@woCX#)* z{WPrkvl@1agyLmULpuHZPTaydvfW*E=%3Cc`Xcr>=7=XS`>N`go=*#53Uh_IdA|fV zW%sc)cITP4*@y9C$hIczlf_zca;qD=?`CYFn&}AeO-ldP= z+XzqIE%UE9RuM)HPg(;4QHnJ8$ulmGXbs)(4WQ7D^AT_MVyuSd(T%n|u4k{$OxNKv z@v5hB$nhLMz1JT11^H2PE@QuOf;c(wB$e;J(-#}G%t`yqJ*dX`k(=kAVuf5ItbbuZ z4dvyzJE9aVnRuP8W?Y#zD{&Uq9ijRoCAbUhh}WB!Y_#$M@_nT_6&c?|t++XJR@Xzm z`Y9VoP^l#IpB!U~0;;fU$2hK8J&B5SOu}t_?^w%5LHf^h8El!5#6PY-lRjCYO_O{- zqNTYbmbr^^zHAdZcSRn%6=Y#N{|TG7b`X@KhVVoGarh+IM&C(HBKa49W2X+|vpbt{ zAIEleyF0{YoRI^y`{FdgJA$eY%%i>IlS#5yBySrtnJ<{JjO(K>h4!^6?d6?sWpDEwAh1}kE0}MEx{71rB zE?S@9Mx9wic~>zj!PfzmQU&tJN0ci5mZkp;6lhIhH*BhxAlarxnBT}F4)+B~ikA$% z;;upyPQ~KOm931gTml*!^g-S)Z@OT`Voci^kH2QWK+h+)nHTXA^k<*~?ktdn#SVX< zC+8E-{nBK5|FSFu2R`8~?B2jPGU~z;PbTp47SAXBdv-C)YTAKuXob+hTTF=kZTP39 zPKF)L+$JtjobM`0Bb=_INn{$-cU#f?vR0I|pFrYI+meFGK#gV#zI^MWZ(S^y%s^xblB|^vY@2o7OVoKI+G!0ZFn*(Oj-j@~dy|NnT@gs1j z;{}vAo2!1KVTwv1G>wj6Ez%gAXRs);s#_AMs&ST5^J^ zs$B$!7LI}Mor!qwcMIhD8`3?G70A!6!c<~z1s2r^(1eGF;l1|&j+)G*&1rS;`${U2 zz9T|Qq}EUs!J}07>{1BY8wvha#_%fc3Oms~iFfMzBgQCfBP+Qw1m=E=go|m(_&jVS zi~_eOd;SL|y;dN~dt`6|NRaw(gLp@E2C+DBff2U;%HI&13RC&Vu}%9pEp&cvmh~)` z%e&fQUR@I&@H$TxwC3XZq=`7?Y9CBbV?kiwNBp+Il9X$#r`L|}Cl|jta9uM`Q1TdL zr+v?dPBBZEezp>K9Mdu&18eIj; z(Np-L^&$>!JC7Zoen2ysN%-@Xu|L`i_V`!xG&G07coCP^d!S2)--TdCO$c)@0O8)` zTxd>K#)8ge&^E+i<;DO;aHb%r1rczaPtGh1x$6rLFS&;1Zs87j2<4y z1+U*nacJH|et_Wwcu2z7(u~^}8MOd(&m^OJ)k>J|u1Ynof8%fBFc6nHMy!YMAtE#S z3I8rhfc`r&v_NJU46YeqU)E{9rmP?Kgay-G5v7cBktz86y31rcK4rRogwXnUWiF#N zfqvTZ1zLMvgYldcbnZ+5TX|XXlk?alhvxEnmi@yIZJltyU=rGG?|3Tmo^o{W`q$vu8;!j}z*`rK)O8~hTUyP<_=F+EIH0fLOe306I znK@yZP9_dXQfrw*yqsCSL{PH^3_O#lijY65#}$LENhT2*HlzjV@yv@)O{jS;m*s7? zfyP;j7@hV7WXkypM)&M_T$mfm?zNU8UU>`XR(CZf^H&hzowQ}$%0wxCj=`Tnn#4FH z5B&BNFawjyaoJ!M+?Z4fn=E{Y-_IU4T~iC)o@|84qnl|>zZsm+u&2k4b;5@(d-_$W z7PS+ufV@d9qaW%`WdpWT6EfFziBbJSQ?a}?4tK1OXNM1q;MQk8%%+`x@%~Ifa@1U(V?!sB&Gpgn ztmiqq>&gHlVOt6J)3(A9^9DF4H;%G8BFvCm9IdsThbKFYXnKJz^^6z84lN^M+MUNw z5L2QS&eE7Aycm<-i1Vh;zY5|%3VBZ~q-b^XL8kw?E4i|CE4Hr8#_1+UsF<80**WhD zzd8L3p4&K$e6>q5GwM1+4>xi9*h|CUP<5H@IZeom(EBV#?IOE_%jj({C913>K-;Bv z(FHCBWMR!U2+$jWdrM-t+{Z@{?*+PUtu(GXR*jE;Oro+nf~Z%rgnGt#qu-WRX0&P( zl&-TSk0s7AZS5Ra-_4LcX+%J!`7X=AmNKNUqI>XxEF(r|@jvSEJ`>xb86)EaHaU(UXa)uLpVUsZE*-rO8vx z8eE<0N3MlOL+L|X_P~;z;dioWdp8SzN@J)`cR}93OHg#&-qfGY<%;sE10`$_C>rfs4 z2zL4S5&Qg9dSJOoVwP>`r?E@9!J} z{;Or6B%B3FJxAE(A;WBQmmA3tJO>I3lW{kf343aLisZcThFU)-Fldv8X`wARQ+otn zF1ZWS<`iEOIrkA$$K_%1b!WQi`Z?UG)6UWEzC*E&3aoY&0mYFxm}wqFj`;?H(8fyU z+3sIxt2~h&zab0vW%bB&m)Y>c={CF!R-_sYm)WoheDw7O=Z7$;9oAUwh-A}?r_7@=oZEnKHeWsY}miQ8#mzk{eEP2NK&thU!W{tN~MXA#X zW&FYAf1b3*!aIk(?8iGgLs%&M5Nfxgm=S46k-kGm9k;zN;b^ApNW&eUP8ZdMP=SfW>)U5GRO}SUIlV@Q*KMG=&4-jpCh64x*(Kpd<>$+rQUC2^wCT&H z)3*tbzp>6_l2kFbE6>1!aUm)^^a*lbtAeJeDz7s{ijCpU#nY_@*r}gh!2AAr@aEBK zvf-B;L|$*eMgBu5>v;>wkOtjlSdGt!FX_7>MjANw)_)^AnI9Z8HvQfd5-e;8jtjrR z7T2R7aPBztXbO>8Bk`b3sxa3~iP$e*Omm$K8OXf~DsR@(xch{P#+)W6pB0M}Z|s8LHyzllGL!6k*@%nQ zjp5qJtLS%G1}%<6gZm>9GUHA<=UG`rwf*~eU7gvi>x#J`@n;bIeye6iUxsjT!q_X`}y)#m&QQG5kd?V1lb;6&SMZW zm09_;5Y!xQag6pP8eTh*D*uh4-luFh{{BDQJ|qpcBQ@CeNRWowo(7rG9C&8(00noc zV$x4l;7>jSg+B#}iH97i=uRS8`={dg$SKfo$pqu)Gs(&|hBPLj8=u^|ftT`UlVOOU zA;GJ#@%?&!{@4bZFlPbn&VA1sZ(2YT6pC;x^*R9C;BD=MV>6S@lbaRwR=pQ+%J0!<`nrR2a_Ls1r{ugW1 zq`?0vDMZ9)?1IALJUH|9AM};AGK&k;X-C8ZHoETsw&}&u9jpGM`>ML}_VP50DgT1E zS#@}Pi;sTcWthD|5YEZzej)xwF~T@9S~ zlMlzPX|Z9wIdD294$iJkM#bOzO*Ed4) zo81_AOdS)n%<1+c;&3-5fs7^Y#hi;W0d}X`4ME?>pm2jb6n>g z7HskTuXwUG2+ibMSZuJ_0+#5NFTks1an+2)Nk0|nEyDs_e?ZX5{ zIM6vYNffg^Xu$70%x_pmUy6v*zrWYu)9vmwf6*LNOyN9NNga=z?Xa+eJ;{ z`gR@tF>@QHs9Xi9=xuC%^9fw+Y{G2UJPvGe8)|h;qt|M85zTlt^3O+wUYI3K16s#X zu=Ety?{=k+o^yWRu~D2J5efP83&A089o4&Z3oOSQS;bRMymQXtY-XhenZCak9xk#X zo>_skGw?1W(CExQ*T`YQuAjl#;+mMG^##uzH-gCt`$6tnFgbCw3T?zbp}AuTb~|W8 zx$r!i(k6kKeKl-#qBq%i=o!fFlP2mL?&7Gz0SGsX0Gr?DbV18gC=FSUJGQ>z7c|VL z9ejU^c01@B9aXG55KW!?Hql^{_4LzK0p^TbEB5O0$PLX=Sh35PDlU70-|pW8IV(vx z)h9!D=^nvlulHg|ZZ1Ahjv`%(t+21<8oWwa0u2(gq2tm)l;ZLt2i?|!`k4swbeoi! z=#V!4y#AqX`gTib&#=P|XGK&k_W*4-8){}2ft~v$nEHf#^lA6wyGXR)i|UnR)yHt` zOx^~c7k*&&#QlLi<U(gS6SK{!COeK44S}>tzANXeT z%W$d2Dc;LVFF>zK2b(v_kUFC|2=io!O?Mv3>pH{TgKjW+sv+EJtU+y^#jM2x9eV%e z5Nh`GVWUeU&d9Q$XJ&T8=<{JHtkY-skF4+q*+8Ngaat)50Or_+c(jXr1J%ll$(<5YFy+o+U5o9J+c_3%T79=-I|6Z}mtfcyJqP)O&& z+wCGm#V*3^hj}T2rx{uHPoK=c8cy{OOkvr)g^+mU0PVeCNtZ|cVH?+q&>j7~D4V^V zci_)ao@{_A>E)P??K=WcKGKEtT3ibGNjfAYQHM-5O~a|FfFG-3XtjzAD{VgkyyZTz zZ@f%!Nuw~yX{&|FBg^Sav5Vllgqv9ekHPB{CHmhn0T4~Q3hImZQTemOOp0VwfeNYRajar5&RudwmVW!2h21hS z@ZpC)8+vp$$*jv@dfsG`@d=T|q*mFY~F9et<}mR~n3wgYfqou8b~y)%A5 z(VjpE{CNiS^53G{#Bgkim`Kyr)Tx2pY>+eENj#S5ql@b#tR2i@2lg2xv&d;3C8}uch_2g) zU{>gSRQjHTe5({XxH%XsP42+o7=2I~(BwZh{0+Zb=7Hvb6ZLMa#U%N4;HlWeehxd& zK0X)bH_+p}MqObrb^8gT7i8I0sfXCE2wS3@dx1aCX$m@69b+60#o=X7&g=BG7mx$61Qm1V>_o=#F(_xNP2T@cHx;Ou0U5WWOYPy@h4x zi8Ns2wK0J7D0=A33KSEFr@LMYQKRpRXls``nRYl2hjUFyala^9T#kf;CXpCWmrH_8 znlbD~Irz>VsIxnfz_IR%!SGi&ePy4DhkWwzbcYjB+v^bvPBbo{Q zqzU^zDMM=ia{Q;flit3477m>H2z#tj`GH*iw@GOg{e8X{ZdQuZ!%=#mwrVOmik)X4 zWrgCRrIU%HQ4DGQ-j7G#B|(t=Yc^yW=Mo$1W!vRt=)o65@Ns~1QubehH|}O|($k)R zy%Pq9^ng;n1D&{XJ4xpSV^@@K=&F0}E!*(wW?d zcSXl1DRgJE2vK;hNN=`R^OjHIvNU$1Sesyp+7~atXz611#jh4_-epPYzWLP5Ie_r` z7Lvqg@thAN4fKjCV8dj0yxC=l&PzSH9=-&bmajnWdL6-4tN?^QI*IEW4qzuwmh3xV zMom;!V*E0OdAsu~-m}f%Q}IF0RXClPeouR?yvg@t^XUzu zLnQM}sBEt^i8FO1cgwHAC1V8`T^`N^g|y=}O?fIaw~VbK4tT`xI5(HR!A4#Y;`z4h zV0L!JLoP^SiC7TE%$`P<3<#4SO%_wF@;JpN8M&zJM4y$WDHD7|32l zvUp1<9{zKc6`z?7k8hl1&s;nOk}ss-XiX%!-Nj`H1(H!~_ARDv^(E+>=8I<1e{qN5 zI^yq}f)`Vx@c6XJ3nez7XIe4UGMYqRrm14!!3=ofn8c1&R4~`PlSw>l zPD@+cc{25fnA;CHPWp|b{E_r^XzS-d*&~<0{L3*;M)wN+BW-c%&?QiD{LbZ<^YNGU zNj&#S6fEw}gR_%kQ106qS}qxhul5_j#|>v-Wb81Gb$Kxx9~H7z+>ZO4S03aL8T@;n z>mL0IhJr)|{Op_s7p*EVq{j}bzYEikDNCTS{VVo7TZ)nI;+U|H?-+M?Au|7q3^lxJ z#xb?IT+AdfNY4EU1J|24wsAS?we>LL9m_E0><&6I;U1=c`wf=dY*@l6*epsi6$0XZ zg3%ErEN}k=jiSrg+bLbp<03&iQ+fDc^<$zW+r-ZAJ;^qmG{d7ZQTWfP7^WOGpf;CX z$s@_DP&bK3%B{Ey<*U1$RFsBje(s1ap23sfZP0mDVq0)=jxHkC*I3-BZ zmotuI{c%UMs2xEKz04tf{i%60+d#d5&$_MlznQCui&{7||z5q^*tX z2HA5SbctwkE_4%=?-HUJA32|BcoD9sO@V!3Xo?v0{kQMDYo zAv+I#7AC-!KirNZhwEZ#jzLGL746U42-lyE;_Rjt@ct!9l_yuj%U?&CG8xWqc0!lv zX-+0ZNePUF>p!?M9;27qo{ec#A!0%I?_^#G~Ow~6=f3rf|3~E#@ z$Oa^by_q|otvLp$57b8Zll8X-*;TI(lef#wlE@A5SD z9A#hkDzP?#2Jo+Z8p`SBveEimNRzT3d!w+4^;VE#2VA+_#_Jq1JRzHRFIWfkOFSS) zF&u)^gJG>k4>ZYI;>Q^)iO&;XT1j%rj?=-g{@yU|-TM=FD!sy^f3%Ta{miKM_)w=l zQTp!vbMS5qq*Cej@OcG=&)=osuscG1yFcxWSV*_ABcQ{v9%6hRz-Fs7W_@Ne-d%c_ zf7QDe4fK<^XL19xeQz^nhN?i7ogrAfT@5{*HN^9^IUT=LQTO`7GBi<3AyW)*qVZ}$ zn)I@R>9ON-T|}1xH)FB1I1ig1FD3<84Aaj)0%?vN+fn)qR=?bddSA3rao<(u7nf&$ zI9U-zx${ENzYO?jahF}Svm82o9%5veEwlGq3FK&9Ww!S2=LvLhKC>Qin&yo8UAUtw|9dQ^%EuA8wrg!revf@&@Y@A>is z6q{;OyQ76n`%4P3#S7@^U%`Ci^=B|;<}pN#>{CDq_FUgLE(npzIk* z|DIB!_E`>O#)5QusPrS>&O?+uS$i7REt*Y&gyJ#iNgdw$Sxz4Azsw@nsnxI+CJzKT zzn;4zow8&AhTF#Y5x0f#&;u*T4&OrhZ~S2SYfIo^l^57Ql)x=PGPL4eF+7lKfQ|D+ z$ob`8nUxFPV9}0+l!+kJ_FX)Q3rb}B5*>+V;s zZ?4xlp64+~dh9>~NNvr+g#mWNqq%@KM_q%ZVml!I=1n-n-6z71$Dpt9e3-aZk$`JC zMj4m0`e{4y@K_A(t%|0WZ8PZC>)NQWxq-c>S&TJ?_F(@^4$j{dAS+HChZdJKsQ$bT ziuG<{cxEB8o&SM!U~Ao^iG8f+$#S^Zkd3bzYOwcVAc@$qn7AF*K>I)UnUE+SY7%V+ zMu}FW@N5>-zupZ!bHAV`odF|ecffyKj|>Vw#pK5g%pW0p=&BIJi_gtS!z@7*j545Q z{StJ7q#OMCOz2TC#dWbyFx_bZv|G4imhnTgKl$EVFW^4b9I9t`EzzLDZEIjt#URf@ z{~NP3I1WoaIY!#*VCs=qkA3b?-aKsLkgD!#mtcB!KeiO6? zQIs6_!dgdl{-m{G_@A*3S@?UL-+0!8iPKv_edb<-sCX|t!_A@ZUpF9K4?^hE3+qtW z)SNhGhT!LgqwuQs1KRcVG5mS`DC%wpYdg=Q-JIDpXglXH$UlVQ23o`;*oirC5Aa6d zBPg8wh81ypi-G4n*fp;j8GD^@^o^^*P*dc%EJ z+YPChM-rZRdki;lIcT$*D0=mJpk&D&-hWC5VaJ6`XwBuLV9X-& zkTdUQWi7x0!vb6~6hQ)YM9JAy0g~0Ro9F*bjWkT3NlJJ8X1^57rjMqzgG`AmiLrmh z>{&8{2>fVaD{M4Cbxeu=wjblp10VVJhBtWE0z=_{6rG1ZmG2wJv-jSz%7|7lxx{Q!d2G++rrr+lHl^pW@5|Nl?T2Y1S^dLRM@l;Wdk| zsF&mB*&YFlc&!KD@IRWSk$(&HsCeNezV5fVaGzt01!R9UbSEqKR8y^pCi|}jB^*EC2mBMANqj$^sqgz?NfsFWV)L&%;S{f1wT3&wFfXbI zbU5C8Rg@&L-@(oN4xM85cSexSegRN*eD3EwlRdTpSfUJXqU@x(SRs`knUTIDzOB0cG5`Bz|1x7({ z>=Ony7O=mnW}v56DE+qD5!)4080S$*va(N?9;gq6voDSiozO}+Gs~HO_uN-(95Tkj z<+>z)mpAM!OT)(+jo4uF6`)Cq$S`JPc*ulN3@xLb!qspn<}Bm=qK~`p-2<~fdbH`M z2I<@0h?6Hgvu|D70c{pBsO3QDCksOK);EzTg%Elv(}BrxEJmqhFI{Fd|5t!Zmk3kG{8#)wK}ERnX*Rw4*^L^MnUVkGHK6$G2XwSAUA_z`+kr>+Ft-V)Mgc?ct2+&KnE0lTWLj6Y#s2qgWO!uaj* zCjDu*&@h{U<#o+4alsduSf4@usKwxQ!Pi_idL~{C=I*q`8z3oM1)8v%aV+I#b(Z#| zuaVE}-58AX(-#qovkkb{@ekez4yJ9k7fE?i2u^g;XZI|8f_)krpyLnVy^#;hOQ#aP z!Sf!xEX%n#zc0WG=7PNA`byxp#h?CD(}o|DlR&OYgk>%(P;)m;%4A6sZHYY?Sz3vu zYnwr)<~;U1JcK*8wIbQHjFGBX3W=Z9pk!JgiJfr<40f)>o0sQ65jU?Jsr7}rFH`uu zd4u4@F%q(N6KYp5oj454qgQ0h;Gl#HJN(Wa$%r*wl)4z7Dy)P`Jx3C}Zyfe-PJ?^% zLaC+c1X^J#ibL%jM)}J^0SKTWqmjVe{&ZR*NaE+Yv3R%KA8b~5@Ok{b0es= z=@nS=^eyBonzPHYVqry!9J#8a4678g8J|~A;Iv>EU0%%fkL#AvqRSE}a(O+Qk=Tu2 z^y(pVyojlp-2ncs+o}Gsx$y7sD2CVpEHZt?G)^c3yYx4F_diDwEQP7zRzV{Dh({Ct zD$_(*gu`+D7$>?2Gk21n*o zPAwXM74F4s_a_&0x+6-b);SP0^V4v7n?4QRyO0UpUj-9_gW$863sJpy7n+(aarCz# zTl47}n|Xf|oV)jk8MJN0tRhvK|Idt$)mYL6GcDqet8WNB#{FyxyVyG!TjHNFLVI{*=~ovjb$YNq{*)uNSSUrFHccdP(~iL} zwL09ejPqkJl;dXSHQ;XFj=Lj|qy5h7Abs^GWR+^8yjT)(Fu00c@)AVlxe0lvua6!d zIKikz^bN6dQh-9Z)3F?oZ*10Zb1;)1CS z_$knhHV)n3cf22F^7U)*!xJ~Im++W-tq7iR<|LHYS;g+Y*H^#M_5K%pC#6=$p|&<1Uk08)!DCX~PG%NmY*I%FWKQ!+yQ|SFtY0=ZoRq_>Gvc`U3D*4Z%YHaG0sixgbhysOg@) z_41!A=&SR4@llW=jT>vkl|8RO<@yrd?JXJX<2m+NbxsjYgJfu;m?7{NcSF?MHhfT% zi)oB6@r>(cpN5TNf0Yc@oo>M>QEfNJ>luM#W0d1%i9wv{4XKGpdGkq9VM}0n+DE z0{ZPqP?)4c^Q2!fH(exnsyk9K^K}GPdb!fRMqT1QJRbti{a{SA#{tURut$sQEpJl6 z|AGUk%?>X-^(mgqyj#O-tpGUwY$esKPJ|SxRcw8fI%STeun%9C!6T*HOvT4_AFaW#EoRoTjOw z6G?k@0L}UB3lD@it&iSCUXC`F$0WPgGV*wq89@^nF3akGJEP{(x@ zY`R!yeHQ&DNzzM!JNDV}`Lfnr#@Z_8hebSXhBiX6Ag!^rpzGgeD8BD<+ zac%6?FL5aR%>aJf+=+%~ok&rwG#x3Cpz}ACGrT$4wC3GPk{@2g|M)1G>IsOGKelI3 zTtb0Nli$Tg6^!BXTa)RBiV0Mg-aw~_7zi2E1M4?@=IXZm+JxQI`c0ZZstNZ ztA1y1@3*Gcxh%Eo=Lz)V?J^o%S3+h6d}Yq4OVBfSve;E-QnY4c5A*u_QP6p)MVB5` zCZ_{u(qokhbkI+XkB^JZK{jf6JwqSVUqt0vg7nPh{REPaMD4>?}scm_uNHz3JXEIDjZYZ7sL6Df7x~}V;ni6 zguGq*n5o>ZK{QZ;*6tLB?AA4~VWfx+Bf=oGJQ2FflW9S-IrG_En>#;pZ2JyR`fQmE z)(B0dk{$V^^j|mIU0w|do2Ju&pXQ{j<{W-_d6XGZzXXaVoFnRe5qw^M8NSqI!m$?> zI9$>OKLxz#vEYfcI!OzJ`T(0K5l(+H-A%5dV<+3Y@LE7E#G71rHUfnlj7 zU>e%MCeOcynZDdJY_0-rO=6+ak8^~Vr(t%IC0%N!K)k%;q0n5HSD(|!-cnS7b(@7q zL!bk;MV^D)d28_L3(nU#kj7NHF6H_bsn8nML>9OG2UlmAV1aBK2BxZV-eNPN%}A3P z#RBLvOvBs0oHy@B3Ye5nCHwA*UJD&JV=NaP;8;eLAp7+{Hh!)EZO=4uaaEdWaJ~j5G3P;e+f6#Pb&545v8adoB_r{cM?H z#c?dR=VqP}0W>7Yf&^4jY(2UQr4A8Nm$a3tRtb_B8V>YPtr{!7W;XkW%k}ean-Ccv zWqdpKmYM7EhoRX8)G}L>_>CLjwYM46`%x@oAejv=+s?zi&v_UoX+R?W<5=8RR}jAR zJ8bN3#&I13`gDUndVSkY=c%N^>c(z%@azm4K2s5=-9AdSp4US_fCv@f=CU7uW@Ga7 zQtZR2Sf{8+?xn7#A>DQk6nwfK_M5Hd_CY?X za^S1;6La=PVzZq%dqRUdzf5aj;?_?f8vhQ1w$m4o@2G>*`Jb`>?IM^X_yzdB^Xny~ z3R&}~=9o}i4VpVA!!9{*e2!D_yJ#aDtSwCAC3@jcK{E0l{)5MFDO&7IWO(!D^4fy( zFglsr;lBBVNvqXzo*KzxW1+3(bQUu@6 zuybW7ZnX46`|%^pE90kiqt2&6`Gq9;WAPFKCW=!lCXQy5#nOv!;xWE0k`OO09jQaF2!<@@df3)O4tB>= zcyDHm!4wH|^89)Zb9v!1mGfZ;sEpG?Dkl47$1K*S~L5aA0f-E}R=p zr67{ETOm!=?6vsqeqnI5`#c#7`;7s!tZ7D(B>j0Iob?U+1Vzme)Mo1gW`~UhWm{6n z)n7IA+ZGv`a?}^X=}4raiev03EY_cN?t$T>F6XfICQFoL4(!gTky4JcdIfJTCI$-k&N z%p93c{9kF29~$kDuXctR=uE-CQuWXiQd<|u1dx3yD)60SZpNzJV7+yY(SwqG_;hb8 ze^tdGQ&2U5>Li-d#jdsR{QD97Fm)HK)-fl7xt@&hw?XFj2YY(jav6!v>;U}%Yxb+q z0d_>o879qLjdI6xSg#CSVzF}*vu%bcu`fABnshdit8^2FB=ebRVOhkScY`-utsM1g zgeX7GiA+-N;yp;%1X0)WF~BbmBW4|=KMT0|m)Qw&r$ril?rz38D-hl;mLqr1$76xB zE-5j&0EfPuh1Zj(5-HW^(7j5DRL5D<%BXnwbeG~Nm%Ux13~(M^u&+&iAbI=(=gaiN zFRo{ws5OA^ob9=t!CQP2`5uVh0m7IJ;n{UdNMuVj@4cxVand=%Uz$3Z2E~UkC)}QZ zV*yFzeEDK{M11)!hu}cO1l`0YRp}^uB^`&hQms$<;AFI&S$2ZU;cRT=7X(sVb!rlQ8kUCk z-`3%=ytT~M?;gzi#y$kS2Gm+o3IDBgqcWRL@fh28pdw~Umm9dy?N7zHuFW*^t!5g$ z$-WPn*F&)V_-y9kED9zQ3h};71nkU8;wRteMS6V>E7ZWPe( zMC+89%$Vj3X!+qv#;P`wy3eSaHi0ge)Mdz!CCQn*kj&;S zprJzo{rcDB4t}?$5$&!+mT%vVbmF~H>AI9z`pb)py z$#K*ryCyl%uo8VT(3gYhFMF|>7lUKChZ*7Pki(gIRQ2ODy6NG3YP}-{O)K}|dx6_n z$aPSEA9sO!XD;GT-5+SUvLEIh79u?|TrzBr0r;I+PId@N)5QL#xN#(q-m!Nl22P9U z(}aBb2{@*(zaw)_Y%;Yy{RQo}?gx$aqtG@s1GPeDk?rR*S+T()SS&oBxZ3scj6OYL zu6{fMp1hCvATxoAoXW*8%R%0FKFw;iDc#Z&ohtIbICy*a!q(GzK&jX9esunEst z-o@~MI))#X1}{I^K&;h8W>K992t`eRB$1mqcK;N7@zkM=QzNA3AHky1g-8mwfmewL z(e{vso+)JxGqy}51Lo?u!~Q&b&Xd5yiwF1v3hzPRBARA9{YS!LhIv2A3-NR073ff1 zPgm6GQDKu#G*5oR&Ea3bImf5WjxRPSt7b+g#mCaZ+LyR8QIYNZP|3Ej&zPt)dhDls zDYCyS2AwOX!L>R*go@1Kx5+0s?AbKJu}-JrFS%NHL65Otn^NIRTpl$`eZo43B;prM z?zfZc-4xn(bJ?|c#*_UE8^5pNGMh4Vhl?xeos|mLAKYTC_B)Wi{aYY?R{)!e$MH?j zApBTkM*}2hlAFJ3nD8wX*fdncoF5P%tBw>iTIw-e#$O(VhOUFSpdwjjty9~lq03Q{v=dy%nk3AZKX!)N@QzGGET8_A?fyU^rYBT^iHy6Y+`Kb z?4^b{-}gLwVvO@(&+371m%1QC%$xMy6ab4@ZyGr@6Z(G*;3l_s(CO!ZJ_+w&lVK?9 zJi3;CjB19+LS=FxJRk2iw1DQ0BDC4hu~0>pGcKjV)OUd)`D@*FN^w=w9|(7f?q@9s15{JKH^b3yPgfhf`O(@Z!i)D1Y{a**x2nez@vO zs^`6A@uAPhH6C2LM>LsMrK<9(FL-~mlW z{zNBZxOXmDX>bzgNj}mi>R7h17aRBP#1p=;`0=PW?U0{{`^N^^m~4(I&})EQ>B4Yv zbR2`uEWjs|=a50+A;?qiWyv!M_KL}0_$XaT`*hRs?THT%b@45m8taZe52mpZk4xd7 z>Phx~@l3+!a)wvFn8341`{{N#1ot;BfQSi;nE5aVtipECed|hag{Cg4cRF4F>`5=j zLK|iUGWF@DOVVWPk}*8?S)Z{GTUsv82_qUlaEW4fZ^l$Ep5~>@4m~J7rY@XkOE! z`>n6DJF92V*UKNG6#Inj?yeOPA0;IU7irw+yv^Crc0i^QTLmsL;5HYx#yMHh9)Agg6$bK)tjw^X~p~ z!WZ;Jfi4RAPfW>#)^m77ZUSv<52p0nahPwSK-bwFgOBkR#Q)w^_K1olygcoSuihCG z#pPcdoOMdc6_*(#H+&V&;JDD~A42hdlQwxJ!R-;Ai(_Tj1&lkjjC#oAp^LURbhmmk zs%sD7E`vDoOz0(UIDCl8tjuDJR^_q3B^2-$#{jp>C-}8>fGI4L$LLc@uq+#hj9Vuo zD0l|Knu{=wr-u(7zk|tpUb4w#oH@wdQ|#A%fY08KK9$J3~)X!W+ z@zX40$aSa3wH47@MwYbf(We?Eh-(*jGkAV3Hyc)=nSH%X?CB4TU#AqgKC2Nrgcp+y zhr002N=YJd--paIm10s|elev>7Q;{w_q~}e538mcfkD6|oN-T->SRU}zP~kn`}7^= zhZbR>*LS?jKL8S&Oqt)e<5>BwM3|u6g$X)GX_Njbym;*}*xjyVn%*zQn%rez;mk4p zW$a+myDzZlcp@p3u^}Z@(eNsv6V_Q=f|zVGd^O;W!_!y7nXDn6rQBl(oV^c^w|<9u zhicq=ufi^+gdz9sooVcTd17390>aM%+}U{$E9=ssDJ>1BiuXXpx>qp#=LB758OJ$n zM8T2U-x$}YAz81>oMo*^>f}>!(>sLLE!|0+4@KaDzH8uebP$$qo`S5fD%CbM!!zcg zAUGqQH~XR%+4t!$Y&6GK3H=7^4wFTDeK19RtcT9KYSNJz#3Aq~x|E-=2-84Iaqz)Cr z?ILFs@ae@R>K~9vnMy}v3n6Gg6JB#nz4T4h@QY+YXOA2az0GyiJ3iyRaxGG@?<1H_ zlpzJtStKY&9_yXXLa+8Ah+I2}yD~VPz$z;$-=K<`Roltu+UEKx=jC}z{A1AOmjK-+ z`2@fDBR?v?1#E6{JK(i`@bS42(c<>pUNP5MlQp~9ji(0T(ci}qlA=UAPi;VSm4=M< z#dzSvRyya4B2GH^UdbgI3DtK}si+7Sb>dws}bX>)RXUO0~xdcd*u zMwyj#|99=_r^lRBVLo)W^@fyg$zj2uqI7^=Zzb)nwdKFXlgYk z#ebt@OjM%!sCBON4Pjj5<@01j4K@lwwX;oCz)%zt}T=-G`{9P?x@ z^_k?wIH!hD!GFd?uxk@8Ji>i04%y-Qd(xCNBtW*q7_)1?FpSUp4{v6yBjQgyX?(~Q zM5PIIPhBWz8Hi&U=el_zp~$M1&Vi!j2Qva;nEX^<^~Ys%KJ zaM}<&)(faN3;P4Q!b)IwUYYsvv>jGXy#a>}Cez*$M;f_4l@UyQfx=D7)Ys$|QyW}^ zX51af(Bu+S#0{gxXf>{{&?UmNIgitpg&29~EC`oH&`;@+u!D(*W&OQa8Rdo5J~}uw zTZ!BbxQ~VApE$;$BIs}&am_0R_;U44#`*n2T&LRw#?nf3G;kJK9b*OwD<`ne{ROD{ z$Wz{qpKXjd+sjAI3;4l6ovuyi5Jz!IVBjgwj)ld6=&PA<-%x}0&KN_j9oFRVY75e| zvYFlDcG5v?!6C}lUW(@L$YL}2r z95W_kDzIAu7LqweHgrT!1S2b6VW-zJ{2MR;s#w|HosJ|MP?fb(&e!B|p^(x`v z%u+0#<4#P!4Kd}V@v!ccC|U4$6Y6|WqDF?C=i^Z=>$oY1niSfzdYA_zNKj#D244P_ z1=W@rnEoIO1jF+ob?#nJQjYkEeVXE^)&fnbV;Qwj{ z{Wn<`eQY1X!q|)O>8l`llClI9IUa3g&L!T|%v~60T8|2Km+?B6qga!@13R8y0qxj0 zc0kpUc-wFtj`a$hvsR1Nw{m@c)vK^m`V~Ak8-UizYYd%lLzfh4Q-`w>bZ+!?s6WGU z`%7zd$a&>x8=cjdY~^OII#Jhg=d6{aC3X^M$Zn*z#bWf_tSj}+FSCfYd@?)ibq7?wT?CX`!br3l zvxNFHvt!-q#+J)i_sNwmL}Su(k;1*R!qogyK3vgj1NmK=1T-7r$+Z~jYWj|K{LSLg z%gPw9mx3t~;&g&c6`3F7N+!P71gRam^m|1<^WDmwdWfZf>x~%blu`zFpHkk?$)EOt zHtFCW90NjbO60oGbX>aYF}8mf1#;^MPyewqDxaT5R94t?te7S|HT^aF&@_U-b>j&L zX12jg`C)vZ`4=Q))tQl~BD@~)ls}|wO@C^PfX+@9MhDf|u-iKLh_?lIUy2|nDt^~{ zG}w}R|8W^QT?wjxJ%tV1)r!^8k?0mtz>)>3r2V-Jz2*{6JRf$!wNek%&JaW8H-)e% zzYB(qWyq`I%c#oo_}jPrzkjd@PVt6OUt9)uXN+ObwPMJZtbnTUC-ASy1S9wY_#SG#M{%d=)f=V51diEI)xLv%ChY_~;?<5Q?i$vKAxKVg#aUJ;^JtRoTG z&v*&O8_>=xjfOm30?}V>$nh38Vy>`@Df24gb}RXO!Jt0;`bUP?%~j=kP~!A8*KJBT z;7<*=wc{L%gN(x+K`P>OggG}^426FS)0`4>xJ!4?s9`x;eOiQ^og;{8%j)_2CG=s3 z(Mx<%XhhD=O=Gv-HNfh+L>SJLfKYrB6#L;OnGKWb0Xz2(vWza(&p3!*>w+AvF%G33=ONj7e05u4SQ0d^XO)L~yYYo1>Yxq{8?w$C5&5t&FH zU*dSH!JK=5a%{gF<-l@(t2R;g&jX4|;%$9o0#G24xq{Jq_!+b%PDwa0YckQuUd6O;abo*6?0~b*m2`HUE=;R5 zB~FdpyiRo!^VH3eL~(Nzwe^kh|way0{pXiKkr7s zRo*3TH#@oGETf)zhgJVJ#CC*?v#GPLLBX9oW}i8?=iO^dW^OvgRBE`>9WU0Pe&BI* zE{=gmbCl6CBao`QmND=AtoT{gfl&KapM*WoC0nj+VFaFLVQZBb8CYxpZ-eBB#f{Zu z&GmWpS1x{sBh|l{71rT2TP+a;;@Tl+LN+`VmL?9(L7@EY5_YyGu!jV@vFJ%8mDuXa z?2_Ds!Rur6P|s!3WRB*_JX|8wk+_pEn_W4HZ>!cUUwg|<~- zie(qqYn%zjnak+AC54cDx1M==I2zYwE+dcE+u^#NCU|>CkvtqL1k=6?Fe%lPbjKbe zTN@?Fw>x-AcxGi#qYra3-CVdr|BVmnm$!&-?KD0DU4K z1Iu(`;iZo*eRcXR>(6E8WH?rY`&}cNq|}MetK{(Y@{Qo^Y(xU@avU_h4koJN5mvt( z0rQq&3=D3B!-v{2QI%u!N=+i-?V)(~`9)@h#{|ekLF%(>GwrESr6%0o<$m0DvfTGS zDD)`Bv0PD9pYDae!_NH60o-nHn-HXWCGks^A48-6qRF>?bEx|15PglD@emaek% z#}`9Kc(M$aXE+x?wq=LGYrAk5=6Ks%)JAZ%_)qwDyc6`(d`R%hKoXfCM86Jj?f95AjQwJZ2PPbY~G$k!IuUvR}XD_PFZDywmYk~L!5yC#YjUN(Q;C@&EWM8@lAyw7Pv;(U6^A_iXxy<6r zM?YDqMa8J%C<2}5Oo;e0JyP4d8p9VHB`#m0S^4W-aKUmFB;2j#8zx@>`H%YKs){OY zTS4fWHB;#cNFi3=FT>T(@{9qO1IVmhNp07@$8YkP;Mpun<~fxxrLk?0^!O}_U$4S< zPbr=*%ExbG57@w|r`XUM9Wp72%ZqEgVHH0MkcHw`Af;IeSNPv$Rqu(B{dJ#!O?LvXV|&1lW_BIIcj}*73{P0;#kIs zAo%JSx$)MFC&%&Lo+g%o?FbS-p(jQGK*HHid-!x`=<>_7I;d zcEneI6g=Iye1#F8F7D7EG2b6hvt jGKSIyQ)m(<0rA6N@eVaD>K+In=Y6**@DZ4 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%0A*~CLWv9P8fe)HL@(e|DY47@4xLDo8I=^|y{xT`V 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

KVHTWW#n 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

-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

Uv*cuyxkfbKPGp?l6P-21AAm6nXh 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⩔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�@Oxe(T+=aUMKh(hG8MR1< z)ImC<;{fz2ti}TK%gi|5V!FexvTJK6lWT>>q*qCcWaDnK?#(P}ArXfQ4F2-R*Q_DY zc`u=FxgPbZmEw9Y7BD%q7^is_;_VX_9CJpMHuq)|@8c(!Tijjl@o^fW zlOP>yn|gUtZy!99RHCPxqbyok3QH|ElD0@?>`E=;ANn$x5nnzH@{cIcT_PVD6v)9X z>07YsMHwsDQ^0Jr^TO`+U%=Skly-leOiu9za88aa=Z3z30;gBfg)FOBI)0kQNs~aOgC^w`z~`*D&39qx!wNo zlWFJ{!Z8b;?uEc_uhHV24;`1#z^B4|bXz)ugqW10ikLK3ow6q#BBku*fSF9v&|{cw zSWJ$$ar>gc88l=6YpmW<24-C>9{-zy|2S?}yGtD0k$r{ysk6ujjYYWORU)0byd2{G z-ec0N4v}?IfAGu81~l5%i0jWMGfs<-HLYxtVa}gg3ZLAj)4?rsVaI<8r17RU?V(}J zj;Cc{Bv6HGCP}easKxvBOB4D667ao^4poYgqRwu%Ov0t#uyOJ$_#|7-28|jsE@wWl z^GYAGrGD`+j>o|HX9CCWQN>^jF=`fm1Kf^WWghAQ{zy*9~ zFp>Ul6ri53n=Cdf-vvt{ccyOZa;n-H4fZG7G3@&QTQOUNL=XB9nYcR0%rd5A;$?gw z{tM>jO`ui_<8bQdDR6#*EoRFLk;w+9V5v+2J$u`VdLG^a`p-Y%ZeAF4D8GO-&h7Wi zqP*#@8=|FG3>6XD%3k2QiPv0upzx3oE&hFmF+P_?zRCUKH@%am`~TfUwLU|tc^lrpn?>)pnvm8!|FWk_2+Dx61rTxIAV;KScynEguOYy5u)| zQ$rXwy;NfNjy17(Y8Gv5Ujngtj^t8|8VNtQg^ZmyBoiHrke@J}OfFtZ8aa*FTz)Tx zw~5k?MpHqcPnq23m|U|@agLZ*+)UzE9xGy)kM8Ri!?5>5Mr_X|)EoC92ZfqYb}Emw z>=vY7blaLF2vy7TZp_vE`&E2@qL!ZF_x3Y=_)K!eG8@OIUBJZ^lVNw6B$?1xi-Vymbm-y?`u4g4 z9evP&j>aAM-{UT`kFkQZXLl6{x=PTvTwyYM*HPxe5aN!v|6t5Y4Oe=PLzc%OrZ4gV zb`AZ2ongsjhnzAmrLzi?Q~sc_W-GjJVQ6f@QCRrnCn*2=k6pEX5u0URj(;jriuZ-9Zj`j{WbIRnncQ~lvSc9+a5u%00S z>#y{Hj-o8Nm2!obu``AB*9oMLJr(&Qe+%&SqEGBBqqSseo*#~nEFjlKoao)}X|Vcu z6C0lJok?0}PgNx4p(V&1ixLog}&6|Rw5oM{{`WKCt0(BZWMYq z6GJf;r;qNXZ{0s}9a>}pZ7N{wv^c3w)WwqqFYzjsg(W+5sT`{T&!$W#?!r2#x5VAdv^frTRAsWFTSbUch9PzQb`zvFwJ<7sQ#tc)n?9%ipG$>p3u` zvjcfQRA8UmKej17{c?ee8yVT-OWUWNzzUmpIMv<{HFl|!U7;pafmZ;EE>g^4*Nfy< zy*w=Vz8Vf+c#FM*MzD0c9OUNO@$TFHgrdesP+yaQuTE7`k>nCkaa6&lik57C&MLa7 zaXytT;zQKmVQhQe&Of0s#w71Iq(R|P=ydcpZ?&cX{bb6cby4o5^+_$`ea4X7_B({S zH59+bWD%Ksd0KeHhOC&W0uMw^lESeCbb>`L32!Mu-uZS^&)-dN6q~?$uOd+8?%8Rf zEAdeEdDtbplJkDd1*xF9ICy`YKOx2ymNs)ty3zTB>(!9cb1Rs{L#2G#LOr@EF@ZWQ z51}2mT-lwL+c{3K7y9~gdAM)`R_MxfdPQmo8=C`}k7DOwcfKmkR2qU8l|{_zw^8u^ zXeE|B9>RmXpZp(^(@-u=kQNyz)8Nl0P`hmBp|`LlOq&=|o&Hrl3^39d-tzxRH`+^C5K zHO*jLu&)aCPgf*Tw!27JRS?y%Plcq)N{IAzAb+;TV3SZAd&5W)rIPo7q6~`-lN{)N z!D-~5FJ+$G*QKSZuEDCMg?L5xZp8g8j`)%o+&uMV6*#-~u8Tuk@1e8CY zC84v@L36PnQP{MaCB}Np-H(BoIq@EhJ}hEypD?1q`+q`@iX-TcPvgb9s^P5%-FQ*z z7JmA18~mJQ2=Sc=Q9lUT=CB8g=}ErW_<#hw6Jn;k~>q z1P$H8DT{C7aB&Lz(PBP~NefW@t5(d}>Je;MS^xA9Nr)Q%`sTjGL-4AKiwq())2_oN&TBq|t@Ymf`7`I1^DmsczAN;_1e&JLtu7_~O)p)8gx{L9ST0pY{YSH<=5~+Su0N=wW({-J`SSL4&tZrY#_EcWL zA7^{G_mUiqzB-H6yxU68S><7Yksnq}C2;?^DDC`ofvFHVi%s0wa_yraGRSp}gIg1E z$_678{Oxdz)ItpZBkUR0XdZn{jqq35_bOC$F!1(UTqC=)LJTSkF7nYdd)fdn?q?d0qpKnY-}y z=9RI(9qX8uEmzs)&L)iDzq_F0uTRefc!Q7nCK9yMg|TXU#D1mMcs$*^AS!i>{jc&a zEcTZs8YdsKqSun~`|iDrYkdcHYYd>W*ElegWJZG`E1B`Sxfacw$WNOA$ zJkDh>cP1!7@5=)G)uT&})hp9`aa@<}tq_@)w1)nB?irNP>|WjMA|m6atjThs8Acaq)+3t8!Or4_M@;-kmG?2%_fyUMPQ@KF~+QM1a~iP zN55ZR;d)hllbU`p{8;#j+aD`auN^!z`5A*Yfn0}SMJ}EwFu{nF8n$(C2!7oz#Da|T z?4^7AU{<&YO|FjOe|F%G*`(ig%YNI^F72m*RU7J|_4^kxRl{NmHu^f(s z$&xANM`6ZY4|;e?2>X%Cmz2&Dpst+f`sJHBu!8f3kzPCY@kkb)t!Trb^GCsc{uT(^ zD?!+2))1h2fxE*bL(S%5eD{n6Vl|abvPlN_V=7FM*E~`;U6j<+{$aOzlYfJVmPQya|ei6YfzUKaqK~R6-!dTvr zrhA!oMr2nbYs&RTBzNb*G^4*L)VqY7-ID@)$a9eX97@=r0-W;%FxBA}R`maa*JA6z zMoAnW#BlTcAHQLzUJ!d)fZ~K^VX`6XDBrYQ5#-NJA>~I3;AdVJ8?$*F_jx!mJ={AK zH(o&}R}CWOC_~yCjNxPIIQ(!8-KF5Z3>~>%#oe{!_ zHMRVQr#L?43t4){G?jSY$O3y&4H{rLj~q~W1tG~6wDtZ%cE+u<@Zo+j6h2r)HMdHT z=FnGAqF#)X8yC<3}t();dXg0-hQ`+6edQ($jZs|EfWjt99sDiGIp?W zy$Wgb+S!yDQ4DwIT5*oPxzO({NzCu=;Hl?x93zFF=(*gOZt_!s`~AnLb4xnAussUz zi+SSZ*v-V_P9;69)WDiXf8hRpLI_zmW>Fii3~#OKnZ4H~(EDgCS**CS$w^Xzh})OK z!Ha)T&8Zqo_uYYYNz0gPi*@Mqr8%hJBhS_ked70K?19Y9uh8nxOJ;^?H22QCfTXt@ zbvf=+ar9>Rps7ss-yJgdTzLa`X4pCEF!FR_2&f+C z*r?CiV9&BF{$k?-boydScD%aJ_FvTlovv7tYT?TMkZxv%`4@RFcTQ(T4n4-{v%aCM zW(&&S3cx+q0`!~cR#yE=s+rK3JN+iL5Vrle0)FYzXrIKeB9(u@WI-*Q+{$m-<#LkI zST9e^XN!}2`a<;A70EHFLQmBacH0rmi7Zp^ZS#@_2oR$&<(p$Lvz+@L9)@8$SzGo1>C*{0Bi5zyb zt|lXUaUr{3e?CfUi~(a8Os~%`!@8s&s667z9+8+vK=c7jbN-0Vsc(4?D}2EHfhwut z_C1rLrRlq0CrIC^WV&B<75qA%N)_Jm;Ky1!V%xTv!0yTnyQsnmh`-w7ap zXWn59xX)zAlZEuH(p|zd? z>0917oB#7Ws#fhqwGwrv@t7J0FH^?+H7yvlJ0CWlGbUfY>r&@GP3+E!dPclsAx4K! zBvjRfuHNPkv3u4Mf!!te%2SFY+|z-JpRRJekLT=q%V_Q#rpwq|G9iT50-yi#@R#0c zW^Vrn=!vT3Z%^T~OhE*x&gf(s*Qb*SGczH~@;mF2wHyEL+rj>x@)(q}yotN53LRS% zf^9x?@M+`)R_GtWXP;i8-nSUMJMM|I+D4fCA_emK;Y`9$InU!XDlp4>7uoFN50&f@ z{J6w}ZVXIdkBrp7hs_92s<~{slMobno`S#2_p_7n5Vzy)=P%4V!t9DoCk88z!->>~ z*x)*msz919N6rb}^sGs=@)KKcItD>_2Hae2*hwxnpnmoeYqw)DT0NaY z9cKxX5sgt4a1X_`5z_RLtq`|+;?5bedPJAY)0K;Vfth=KNYy!MqHFvdS92bTVypw_ zAL4YiYX-ug}8`$Y`n?X%g~TX&hxc1gNTPM1!q)*>U) zOG!hOJaHB^hZBj$(Do=4a!MA_n>%l#nK{w5gc!Uvy$uO+A57`-anC|LKELBN{?KQ9Q%n3fn z<$8(cPl{n&pn&9a_xa~A%y>WI!-a(|#QUov`E$jJ9^t&s$Ct#wjMJ~#pEDGQS=1Ar zsh&B`EXF>DnZ$?jKf!k2A&3o9R2%Q2HnK9IvA2FI3t-0@HR`+T-y9@BQ9~TQQ%Tg$nS4l`?3gjutB`5KF%vJ_6x|cC61iZLZ6C38PcPaYgS7;NPm}8G2?C z{qX6yK}8!sd}+pS_XTjO_Z*9xLsHDgrZ3FnM>$-UHJpBXD#m*5ieOw@e8KpL4==pX z9S?F|;VrcV;Hob{yW5>JlI3$G53fE+~gCcXR$wldDNc9}Fe z6lujv-yDD~&eqtuZ9n|IewtLf&H(XMJE-~gNV?A>lVssH_D-ET?Be?Pr@7ttmf--_ zdtnMa)3cmE$zVBt;&SHGUl4dL(*q7+op5pQMdoJ5ZDb*e^e&N!u09 z`&-~bSMD{S#>L`<;r2A8Tt{+enE~lPv6#fV3()^k;)(S0N&i3hkafC3Oyhyim^E-5 zAAfm{8k?WstW#<9ark?vp7w`HdvqPwYj>b<(Md2+T}{gTEU~R<4_&M6h|dQuGoLq< zV%C9n%u9IAKiWA92R26G^QDU+BS`?%&QN2;ss?FuLD^ys)TY_IFMsP5W=7rGz)n?elD^zo857j*60!Rs1DbWe>SE&t4M+06&B>E$G%#51GrO0Q7yhdye?E6~Z2 z+E6a_5?7x4gx|B0P%Xn692Z}L(x)uiHY&60bN^xGb8*rhAV!`q_knp&RrnA5H6XKI zh^aTe!)ExY(`JD#-2SE$H-uaT$$TkV^~s(n96N&-3LBsxxet4PpF|1n%yo8DfL{3J zPrR~i(1UY)%&yPD*fTR=lSCr#$MH_)^u=w|{=z-fTV;vvhnGU7;ANcti6KTqqU6{~ zTf&=qg030M$8D*DO#R&_*ya(#TWvVZEb{b6R_r1OtW_Z=qMT{a_DtkCOk-tw-ohv= zOJn}iZT}}HUA?fq7Bxk>Vl_i7Ea+h207z) zRL^}Cmv=A4m;0}<@gy)@7@c!n(c=j+DnJZoWy*UQZ;ps|RtoVjEed6VDhujHjlj6zE(rO=c>-70oT*Ny-F2S9!S#AV-NAi@jsY27y^Fs*MPPaK@yQAow-R6 zy5}jRpVB1{TBS*;Qz}$wN)tJ~V$j*Yls*0SISO8}#ToIDc!A3Y=rm4&dsf-lKUsj9 z$z-#`cK}a|>JjK+$lsrDq5NAoO>&B1r##}GXTh$dxJsKg2PcDX9EBhM47pyC4M{8; zW-tF)Pn-_EMd|ulIOMNDzugePt9z%D(RX{9l0W7gw`d7UZ85?P5igiucl}Xo+<+$f z9K$vCzT|7pPLZLq0-Op3hkiY7XLhuH(8r^%|DGvMtaH=5tlNR*>u;p@jt_Ep?J_&S%H zr)5lJlpBkidV^MxT7PAxO{^2*&rGEE2VStDs$MvD-2?8FXuD$ITpcV){UKq?#u=--_I~8-dxA8hKSA^0Z`Ri1FZdfv@k*Y!qrq zV0Ip{fuI~?b~NV;v@z$wbV(B%H{OLay+ary8&&Rm*Ni@A9zwml0{yW15cEG8fD-3D zu;zpX`}aEcx!G~gtFOrXJk9aHb`N6tfAgsKSzAzwGhx3o|Ck?pF0!Rpr;(!}()3tT z5++v7B}J=`GZP;0p}A)eGro({6DGSD51m5vYFS1OjhrN*dsY(JfDxRb?oRqSp00P2 zD7h17KqYd`Xh70rnCb6G9o9aA?@C-hti=a^L?0$I)=Q#9q#~T>at^C&eL?p76e9Sa zIeD}AJ}V;{jnbTZtZw-Rh;hHq_zCEfh(DTCDNr9w^F?8%u?M~FkOeQZ58|qMYRvd= zO-y|=(o55Q+z0DaJSmS!b!9Gl!y{L-I7&DxEbW23UnmzHj9yrM?) zeYtyq_YlsGTg5&yeht0ZhuC{ifL7&?VAZjkz|!5Qdtd}t9<-&x6)kxB&7aFFg=~06 zIY#uMwKW}I8%-)?T$o$Qv&kPhJ-S{hpWhHufa3dJve&YXqDcBz*i@QD7l(3ebger0 zA4TWkm*d;U;r56hcNKWv@a;8I>kV1Er;+G}Ny|s^>nhLMoIr zC}|iG(lAmY-uwLro==~iai7eFR>T$gvcRh7lOmL znCF)?nd5rDn32o_=$^>kIWKt0{+tto7grjRDW)@Ms;LDyoP7v)wCf;pcp*tN%Vblt zCFtc_r_l9>06FwZoa`G=0Of>OoU0mGUT7c)Uj~d(*SQ0orwee76$P5|*dH3M>OmP@ z1?HP<>DPzHaHMnq>c=<0dA%|=|F6R;;4Iy}c>?JzsDRA}En%P2PxyIhKC{n73s1i~$3CnG#8Ryg zyd2vJRYz~b$ER`F$hoPH9y!iNN^`%NHaB5-J!tJ~m#NuzlFjz3O#ZAQKy zGp29m9%O6O#ppbv$4uz&wb*_ACsT4Li+O1O3arkpqIB{j$lNx8B(8PAr>8>6KYR&W z$FHFP_gpp@iNiG^Q?R%t1OJx9(y84!jCa#KjP$SK+l&g3V<`jpVqz8Ex;_t!FS>I7 z$E#Seo12YXyO?i7e_`JJ50Dnu0!I&9k=E)m%su!8efOV(4|h%x()Jg%9zDWmCD9Nd zW6rKGB6R+@`tnm!N^+}E?~NAx*f<8zRch=DV67SfK-h3NV&mnhU8C$}P7+4bK=ASwSCsC|(_ z$wTWoS4Jo}t_9V}meJAs6KJ;cCh+?D6=PkhAmv374qQ>flxPoP zHqW25d|yjfY} zA&^B>zE=?%hctu?eRj`MIG7A8}_ zyAYR?9KY}pi)RDsSmww*tA<8-+7P6SAAYB@y43+p#Eu)R)|5buY?G$aF)L`WODuIA zkSB|7M&jRxJE^;$GXx*m$4;H5P5W(3T+Wx}m7>REqxmq7Fav+S%zlIcHjUE9)2~jaK_PUrAB}!;jU5rn73KAXAz4 za=XiOXG_bOz3b_2&K2&)?K+ljGo^a=31IH`4JPjtA&cg`LH})1+&+9QcqwaudTSxR zJ;?DVeUxE%^(AuqOClI+hL+E`ElSq0h%IZEkZ7G~Ht9KZDWFOJ%g8uwaj0aZN$080)qctgtcSUsPf-)e81ch?%n%j zb!ov=XnjrLBs{=nQ$EuNPrict={a~#?FCeCJ<62KP9+O<=aBSCPe|VRji{9*Mo#*y zq`YpEC-XBk468jsWtM)9s+a^o;ZB|n)5gQa8=;v1k9;15cIq+lVOu*WD zbgTDrZ=BNeD^kx=NRSFF@-yMRHuo6pilc;-;oW z{GA7SSWA&G#v!l(jJ)JY^-fo)+L?nTiZ{XOvonlyIq;AEznJOP`8eaP4E`-NBo}QL zQR(X&;nn<~D48t@v*uiahvSdn->T32b1KUCDuvK{7gnRpZFfRrLW$nY!_X*xoq29A zKo6E^z;)pc2y(J#ubex8!@p->@3s?gce4T+$sGb?zX(X^QG+GB+K@IE;CA=joKr9E+I5rV2|lStzxF|zoZ0=3>ciYT&K^9nG$_@+9XjrBD^YLfEXinhh5oU}w%1BD{S=th1&lncJifbITKWRzJC) zQr9w)=rw(YB|bHJ8%f>2n}uQ6?My^*1Wb?}P(uf8w*n@!b3?N~()bl6~hVlcY~Qu-Z6@ znsM*(&WG;s$2k@cW}T%r)`swQ27$C|Jy_@X3K9bZY0~Q1a7;yxI2BK$R;&8aaGq^^4e~ zoxs#@o=e}nY~;86t>d~RT+dPVC*NVT8oYMI)8@t6^cZ))_&dG^d!D?8jl4rBds>MK zI-g}6G=LtIO~Tt-x0R>*3d5h`Zp>Vm#|-=vf%1)R@W7`K#Lw{9-Uft6ORPxUduw7d zEfm{2&8T!wBvu~qCdLDQ*>idoY<=@HTvk5LzHZZlJmn!+yHAOP#&0M4G$PR4!~v>K z=d*@7+W6kJkbcs9i;rC^z>F!vggKsgl4Alq3|L7s#XWd_p`i$0Yf*RY3@T?Gj!s7D zn6Pdu@jJML%q|JUe7hUWj>?a`$?;*Vz>*f+ZRCZr$5+rNqh0(%qYOR&xD}k%rQos0 zZIC{0LboJc<9**9iGo{3Y|tbW!$J^d9vm&8s7!M(qmhwmu7e z?+Iz&dJD38+t?_h7#(%bfFpA}$&$m(kT=H_O!IH!kCi#NISz>FauezyXpPn; z@l3L4M|r*MVO+C%9(cTJVdOUGi+X%V@ZHaX@&iBAJ35EU-j2e1aY53hWR4QYfxO!!19zW9 zq4&WtaGH037!NzZLBZ!Rsb7rNjkV&$xOkrJ_%w3OVH1{J3xTyZ3-6onE)wQegttp;QQtWUmklaF5DL<_QsM+ASg_8!Igi58d+;soFm3r0fD5;0 zvR6u1lDcg2ta+UWmpe`Sh0>}W4tuz z8N21Q%}SBv&KhB3Gg|O&%^7^V)PST*H$ul8W9V;ke)w zJHH5VleP=I`t=Tua_s9&y98A5J_kF4e&b&*E9r2g6lsqy96m9O2KP)c+3y>^#W{3V z^F%81UWkO$3xId_6k0rbi9PyHn7NFT$d5DA>8dq)yxnHAA$H?rt4}X`kqNM-{EF=; z)AItv;~cQ;$pPFhb(6PsQzMRd=72)FA1u#Tph?O**`&)x?7qiVbdpdpgk(;{Utj0Y zvTRw7k#dg>ZTXBn!jG8%4PlZeDM({XLr4YpOjot!c-`S2@XwM;us?8!b_?V%@JfWH zRXY*u8v^v%5}e}GD6W?VK|G+qIn6E-@nf?M&tIh zGfs%AXch90p5}7;YBsbeeM7yk3mF7OIe zV+CY7Z>5(j17JyW8T2%9oxTZ)^u%I&TwC41)Z`}N^=wmGXmSS>%-dnbd?5S384RO$~Q>zAf?iJrmYe@Qn zbL{?&Rxril4XC-V$LWX8pu3r2L&^U>B8kK$BO4dVEq zf()IgVLfv0L7;9QE}NHu9^Rv{@kj`Ss!0=h)do;hy1_Zauad+)Z!^+}GMfBEJY*qfK}fX@elL>MUPYIFwnZAxM^{%t71K+f2;s z^&l4gi}Q|nVs`&?IMDbK&POOS7xi+8;5#9rxO5e%Wp_f>@jLi-tsB#H{TBRv=m9}T z?1+&<1N^WT#8$h>)WSrao_BZ!yDsXJHP~E11(d$;>4C$B5 zhA-COqPddhE#Q$2!X@lCkqFe_&Lve3ykSR92zzi+BC9{N4Bre&k*pwLx^{gSC>s3a z7+@;6MJWi}o`=BTV8-vM?zMJq#|hNk@Xo zr}C9#;lq2h;)p!e>~7}09el~0Ss+g4iLAjkqw`QPV}v*QC6I7ocD&M_zzY0sU=v@a z!Fb?QwDr6a?X}Y;{NBxE1O8 zre7BaVE_3lX3q%|Qp)W*zH>aD?BZ|;zJHc&)%2!HEt^>Je*vWb)F^A7-pAN0T*dDi z>ZD{<7L;8sXVwo)K>U~h(O(X+Ib!*^d_x0#6ir6XH4Re-i_s=Y4gdTn3%idBk-|Nu zoMiq#NNy3J*Vl9VyFXX>%WWoce2u3l-Fc7w<^~%d`M;Ld%F)SqhWw!R~bP;xQP|%OyeW?ikV$K*F9*qp{OG(L>-qez3pEC>~D4 zmh2L293;e%E@no)3qagmX*@MQf}Z9tql=2J0kg9o-;^rC@9DCTHK32{|C>Su_fI05 zeZLdco7^+(r#z};)__||AEVwCO51`gNvh{Oxbm(Wl4t6JyhRZ%Heq1I-G+C{OPE^L zPbaSC2YE|s(&65hb@a!IK2(d`$Ih1d!G}3FK;xGYRE;J>%nEtBS8NL2)3l(KA9d-( zwq5LtE(yB6{5r>}2w{Hp_|Zt;9Na(C6>Kkf@;Xw?$m%=G=vl+fB$5b0$>R*RO5igq zsk;v?#(uzz!3VJ3r3+>9)QDqTJ*>N>NS+(^!WnseXgtq@;l-<2gXW)jP0E@m=R82m zAvrqX$PJHxm)=YW@Y}(5`OFWc-CvqAV$ykx6jlI0)|1Lrr zF9a{h%%^KR4EqDZ}}Vc3y>K<|HG?w=i%w+8aC6YkZH1{{F2%}Y?-J@(gk** z(XHvkG;$2A$2ODy{KCn{l+D=KE5`2s`5DdR$Dycc5}op{g)t9T#x%LR(B2$EE?Ozj zqfh1N->f1S|Jj3A6$EK!oPZDp@j8l+N7R9)vqY(|C(S=ArDh*|2ZA0~V>L!})DuB&VEIs~NtlcGbttLWso1tdf5AOv+bah>pMSU2L& zHxE)GIYYD9DR0Bz!B{2hG-N}j4Q7CNgFNxNE<+l3Xpw8DopF1|IG&_qu-4jw9ORGk zu+E++XmRaQtC{Hr}$`SV);dI>gF3fwoh0K~YfCrra;XJ{6@cBOn$QQ4| z)VFS&+xa9q4oo2HZ%9)u!--@EmxH@7 zcaId}a?0gv#g9;X2VuIT`~vA%{~9a8G>Kd!=QIqjfEe!Y)NOI#Je9X$Wc)h1-!aAl z&gClqyaRG{{=w;aD^bzQ6C4+*lF#28utAX9TkqRIDsoCN;MfwYv4GzY_iPJhwESU@ z{%~Z<`ircFrb>~h$)30|%#&EF?_k;X(`dGE2tu4|Ap58zyGc8MsK;!93$`0@gc*Q{ z7ankPsR4>QJK|IV63l7?@)RZ?{&$q4&D*s4@)3Y?P_kK8DyRNy3k2&c*lVE%WuZHc6C= zC-E&7?6;&GocZD{^ZJ1>oi=fZ8C`x5dZks!5_>Otuh|$Es>l$TjRsUGPJnECBF)?x zk;7ZrNdRg~IhIj8QJ>I(UbZYxHmsB{d*&H^{A4A2DDw?${WFTqnU4Iy7h3dTWdZ$| zEkK>Gx3Hg=&Y*`TX^@*g%xQ0g2pM|^bfS|Yy?^a3TjW~9Y)Ci^w+p#*QClKAv1=xo z?tC5Wwn;+Yo_?&Fr%Bxkjc`%*L^{a)Wi~DoqVBp!!9V6M+|fOWy)mUQaPJ1GnpDG_ zWf#*p<#zT_aW?ROy~exw?r1h608SV@g0d+NxbyWMs@8H1Vso6x-S{EyY-2@FRi<#R zfd#a4AdbvQ^+W-UVrZG1OvkA%u5g)4?*D9Lm*f&=7RIBm?-y8S_!9Nl9JrBdjn{uS zqgHe)>!bY@V#asUzj+yO?`#cSaBeR|w}*oB=ST<_*C4m2>>&FR-O-~+g0j6z#P5|K zBzG%PkycAuX|6&09dmGEn=)BvaUFeseq!p+OCc52;!gZ7+dR#8jGX4vXB>2IG z;a%j3u>@ICScA$oy|BEy3m*MTBsuj;^vjB+WP`ONN%H81p~EHU*k}&($3l72avtII zf-wv^YYbMaT=A*L33!&an*0%3gBK=?(J@I=+Fn?Ui84ww(nb|`X>TSc-HaJqauo6d zS5d7)-Pj>+1)~+s%%c1@w&$S|>oe90nL(7_Y_YsNU*rU{vGoZy3{}Ft<-(+7Sro8_ zf^fu1nJ4{Oj?r^^15IyDh+y*xB6HA>$G_Qv^rsJFyGWb-75{)|v~^(a{tF;_qlA^w zddkz7`hd}2^&A4d)3J1N7|KtcLC;Ohr(+6}aPhD(bsYZzja>^MeC!_EB&Y@wM<&2= zp)t-OQw#k8`6zl~8GPwZ;vI0eBi&uXMDLUr{tlcDGuzF<)6@%kxzFR3Gs`eyy8_w2 zri*b}sDRXDyicC9G*@a4CTr3KQCd~ z9d-KXZZ1Zb&7$W<7a@Db7bTmr(PQijti93%i8oI{-?Jdvwjdrx{lDXib%pq3pB`Nz zszSd8d}80o7t_7973gd}2%Y-6Fg^V+`u-|mFL3wscjs_jlo^#6_d1aJr6k~;7%vE6 zpMtkiJN{Z<53a!))Z|JFSdw6vIs5{y-BF`Ymk|0+xff=Taddn)4r%%+AaZ^$DzpB~ z0CEhN*hDT*Wk!eRh=7LSKDdm>ASf^d!XG?_=X$|#+IJf@wK@co^b%mg9w!uxZ->h8 zYi!Q1HvIkHTbNK8L2nyf!@gNNFs5!2=~*he6NeHpB_`}2{`$AyMELQJ;Jp1E&DJd=k)hc*{6Znf6JrhkD*djy!^ljj)+31!P zs;E*`m$T6BU5Wl0(@A{Y64Ikx2qS;y(=}Biu-jjY*t=Z7#vviv|EleoSaFj|Vt2Sf%?n$s?u#UBpvZtP1cd+P0Irel2f=-<)k#F&Z z72Qh2CP9sMmrtj)ev@bcpSz3Zg+g4sGMkYnLdwl1fL!K1P*j{tk8J$J->qOk80Som zRVYmsAJVYu%g`r5O(L{4WgGRZn}LmmW#Fz}1N`PgxLNi&-#BC|w)5|-!2lhcfINQ8qE<`p$8^^@*8z@Hm4ZYZF{t7HMh4W#Yd#O6zMC_t?^KCY>@`f# zUyFYI!LZ_dC^_r#1Jkp0N#<7-j)P}McAT(hZ_Yl&Y}Hx8*iBMpvzk(HG*SaqDxPxB z!JV+Bz>3bRQJ|h1rqQ(g5ua}nB{GtxaO8|Sk=HW9YuuUFb>$!S zhm#iL{;iI4bU9;`Wgt48mm#t4Ly+exfz6>xRh$#I%&+&E2WEZKXHt;C#5bJ(mFCz}7kv+1q; zt(Veq#iIcHS$7-7gbk=$pe3ox>Hx8*`NX`H!s_?|ey>?BUitMKSJ<7zXDZGlTXPBN zc-6rg=yv1J7lPE-?FRgIu0fSE+xeS6>_V5cYHU3tLDdet#cc}*m|z_XbUA+sH^(es zr*uSPX~=tYxO%93t4BKYwl1fagUpFY^(@%z(gF{T{lf_YXF#usA*oFqhc3Sr0tLLd zKBqE0aWD{nsb~_B5dl*8Vk*hB3WlNJd;Bkx_t5!1@c;?iIS1_mD(rFwW$ROUCstR( z&dHhNy8nNuGWRdk-F&ErJzV^347!ge#gq7_ZW|_+N?)ChnO)Cd8M(&(?4V`#hIyJer3k#xB%I zW-0wPdWIGMeHCLhw$rL_$@r@)86$4_Fgcn1uyB;)Y{-7vm<`ut5dqar9ueV;~AH=Sv8QSw@n#d(oVj;3-Q202il zaFR@>mbBj37Q}7%xUDS~J}ZZV^96On|Mmwig}S4Is}nt+S%ANvYf|E)N~-l&(Yx89 zq-;CKQC)JC>N82;dta4|a=gPY1FOiOkuo`bwgI=A4dJE$KXh7D4gQA6Jcv6^`wm&b zo@r5Ve@isY@pT3Gxd=Q-u+@^rV2miL#bmxe+0t^j}kE+TS2Oo3Kzq)Xiw5G#&>VeYq|y2iRP(MCsD$;~(MZDSs$HQ5n~ zTb)doq$PXKAst#Af?(MxRd)4~ z;+!$Bb!U@V_0ibSqem7$$#Q+tYPT`job?|JG6dGjJ;)_-bHfVS5|9vy;%kz8b ztjI)Sv1vLT7x{<2+2VBfMLEhk7K89}Jt{QKgKSQ$!LEx-u)8XjtzP{X?Y!;Dyj(ZV zi%`Mp%BO<=e?lbw(i050t;+noKW9J=7vMJ0SPIrjWU53^u8emQrZjh%UHJ`A= zUlfk54I@{5Qt{sVGk9vhDCt+z!P?()#JfY0sGW&LnXn{$_i78is)>R3#@|76%3RnS zyO@rch0=|m7K7hmVEqDe=-$4Stq?6%vi z@#Lel`n5Do)p~=A7a9`f_RXO5p&VCFe8XEDwUW;KtONHm%3$xEpM3uV8hBw*0#p2^ zgfG%IpNhCmqzWM$nDm>SAkOWUn_h^4QD`stE^pxVghaqiKS#?4Dj#|0rtPBZTtnzJ zX)%)dd>7N2ZOOJR6{qU1vQWFli20Zs4dO3)VbUjUR>7hHJl5<&ZwF;|`-xs08Stmk z^R>v}_$*o+ZwDb#CG7q8$*}T32>dMU}AQKolWyPH4MfH;TU4i)Ax2$cM#c7;n0d5n}TZ z{zc#!&J%oGHV+qBN|G44AMmfhkkp*(Vat!b1XIlsm{MUtbc$2K=bRyNioMS!EZfF> zFn_@weQ*%gY9vGK+Q(q9&V~3@4&hbrjl^x28?lplgjXIV!-q&S;y-l*`L<@9o$|tm zn9ZL+nu3gIWzSDWFMT`ZDGY&fUq2(k?KP@T9AkMa^5~~UVkDs3gIxO1#X4z5@H#~_ z(ARw~(bnr=)bE>+Eoai;#!l`t%k>xktk%FRS1woJwF_qWyo2HMKiPfL8^B)55g#P& zr5cO8X^+BH_->?wDJr(O?Oro)NZ~uv8Ky^*1Q*iBvf&iCGkIHi4;ZJeyNKtID#uWWBKop6q`D8fF4eW><+H zrASv1tWn!x5{F0)xmf!O5UfCH|XjIbkxmwqd`8GbR{5+8x}q1*A2W*~@F zEvFirrg47NDz@|CHD=G8QTD~bWyEP@8H^vfgi~~$vnAeP_{1s(c#n6HNB4%Up0I@6 zJ+h2w`*g6qb}Q+7Q4@0Oaw2o`k5i9EvF<`PRIx;sKI|6+FHdzUcVs5bSnEMXHX0I}16m~K+Few-(ZZJ~ z^8&*damKJ-n(sB=0EDi%!g^CtLWjZ ze_*?*8JvDd(!Tp6=&z*$Wl@)DiSQz(Eu{@+uinE<*O|#VBPw8taT@wx`imQ5`j`Um z^<-tWHOhS8xG}3^L9W|`hNcA5ipw#i^UZQBURF-l4tKCebr&->84gr^asmoJFn zk-$@U;{9cO)?r6=_6nog#Tv|pN`7Y~=dk9*z`@oh0P z;v9uv?mdR=om^k5YXX>UR>fxVhpIXuweGZp1`*p$IsZr?D5f)P@De5oEqGzVO*xR$r!t~E5nqOIjnd1RB9-;k=-^RMfAX({?-!2-tW7J;$11yY=_L=JRg>pO_7d*mV`?eO0e+9xL*K3U4B7btiG9AZe8`A!n z(qv1AFRAn0Li8K-K;Zp2d+z!h-h^)%(0z+yUStARHOJE?`8e)O%cGMOeArj&oU7%@ zWjIkBkF!P9XhD7w)_+sy%_>%=+b`WfHaLzZ<;8IPl2lk#c%1m!NfBC{NR5+L;p+EK zq4&`Wa@sSE9kY-nJ)2Ij!7mljv(b;1`mbdDQ#c1iF~?L$Q>Dka*Yea%XWxHpVtT%| zf#8LGbW~1)T*xj(spX5&bd?Z<%ci62lR)yWZUI(>g~K$LX!cN46Kj0c16LnPWn%y1 zGKgt<>YUaBh0JBbohx8K41OM3-=EjO7NOZ~|X|4MYsm`IoHv?32i(_!*y zHxz|gu>D6GN=;R##b+hR)AyEC(P|ia1!JMGT#uxb<#4R!O!kJWDP0#f2t-_-@D4}7 zk;~zDI}W37VvP9XDHOt5bQ|DP*~vk`4V9dBVSo?DfGme zd=Vnav2!O`w?p2(GW<3_6h01ZW3BrFac=cO(5#$F!^`c+jUXXhsp!Gl#Rh;(-fxbJ zJqAxDKJymNJ50pST*TCsJ0Z5+o?f%rN!%2i$@u;>#-ug^o$r)_;G&syV2c9905`55 zY=?j47DDpjtvIdp4qS6t1OB3G=%fP9=jE4cIj2a3I0(IgXE%Cb%A!Z;qSud77h5pu ztq^U0*aLY(&M?xs4)q>;K$y56D7D^(M-we*!1mYdNJBhy?Abu%l*Gvk(?WQ%N*%xE z#R2`DiyE=D+&$%IbnS|zKAm!8nfH0tA*mCbdqQZKO&9y`d<>1gZ$YmsuE#yjhj9I5 z3G%%NXmSfTA1&m%p9S^o;(>k?{Jjx8eJ7KPp(XHbixiO$x1`Zuukjo9wn6ZiUHJ;h zeN@}Hj=wp2Au;bZB;gOA5%6?pf~^P8{KHkY-9Q$a8kK1Kh5N9u_BNLOd5q%md$1xd zf#c|v(5G(mXxxrjq)%fqT_mM|zWl{_(ld^ko1)9^2{xgPpSXLlJ}!{=h$_$*tL{CNtj5YG^F8bq7&5YTSwdf z9w0s6!|0oxCUo0NUo>)kfF5F2)czaG?uZQ}&EAy|6yFW4zmy?F=`!1=kb{*{YvAXb zYcQ0hfK!&F!5!`V`@RoIQ1H!*20iw7Pgcxs?~m zINeYs$DTf6+c(_?cjhBD%$Y_{s9t3i2Gw!brwLRrRG(%Hr!ki~U#Z;|3)1p>0+o&) z<3Q33{#-0YyJv>-lWqs`YIjIbTF?a35|qfp{rV8%7{g@RDiGs&=V0BVZ#<6mjaI8e z$jR>oyuJ31tdgXc5__-L@RD;NJaKo$t=odpo9=`C6UAx8)Kg%neUw^g7Nh>V1(?ZnS#%7hm0AyvuHn9Rla9_7L>5+g7TzEW*Qyb@Q`gW zlpyz%SJE3NF5`}Maa8i57u2>Ean8^OD6wP;4QboKkeW)!=Q{eqHzTM*lqCHea|flr zeZWLxIgX3I34Swz5E~iBJGD%KK8^_>A?dD^jpy!-6s>4?UJuUZZRLEcR^*6+A{?)i zgjj235|xkyLPJx?vMV7(Xoo2KAVh_ZJdh{uaeBm_>ubx}7{cn8g^ZYHEBoi&B{pvI z6@IQApEvb`J>&#sVZre_RwaB13Oim0v(*$s`jqI|I%jGsy@t4!Co#RoH?U0SEL*wh zF9z9{;o^HeQ1!mU%AiD;xLt|0+z{W*lzSBM_O5t>LphaHB}18he0GDeyP-=(H@1Pv z6?2@<%?aK^3Z&x0IQ9qGkbP2mRO49@-ns$Ab@dIfKih^jzOHzHyUQ&DEOk#9QfxN5NWbZa}PO)X8B+WMu5*3cq zw^7rnv|$pg;kuu~n}Vprqv@p5auL})T*zf8?8qL2J>;p;Y+TZzOSPxfvo<%AY4d3_ z*nR#Dv*oWPU4A$M{ewHM##CM@u6*B!$M0?g zt(&n_OSul=!e=lNy@3-y$g`!}xTSh~3ae?dgP7;mgUVb@V&Z)f=PEBFc^}fL!O{0{ zGNuEj>d%K4yg|OLZ3CLLeul`jo9uQ^19Id?9o|2p&fXWgg#4qL^wU5Fh=kO_!yCFN z8}^MiHF*~OFX%bT)UJnIzj9b=bQgXaPNh?4R&Uc*m?6 z^|+m)Md%6Ui^WW^Ul9tgN+*%&qcJ?cHjW?Wyo5$LeP!QlNhC4T)g@0)p z^ooBV^fq0_@%eHz&*B6sd7h@TRKwVDK|%8Mg)WJ`y^!c@3DT4zWrErT_~upe#9pT97!|Ah6Wnfbm2&!YQG(!A4%$*YeFJnJpP_z!2dr%9t z=I(@(E5hK62LlnJ=Sfe16#R9|WFIc(@}s?r=z@?{Ai8&u`IJA8?=YlI2lXz);*Mfi zn>@&iPB_GTHS;5zgnBW#ayfG+PK2VSHa_;a3Y%tR^NZiMLT%VpIMw?U-duHHk4nlC zL#-buWbQ@W<#s_2X=Od0d;%{`WMfULdDe9o8T)@emPPj_GLchMKp^KHv+(eBxbv7} z!uxGUQnZ5_FuO7Dhz*G`=*Ei$YvEm_Gnrjy18-SpN)|cu{9VkzR(u;-u5}a6U3iR+ z>zcvrSS%DvR3kGv91lKnCOMUpX@FS-Dyk(?Zxu}x=@!CmbMD~RW1if1;t*Jlr=qRU zVRKzgK_av}8?t`av%0-Sn6ImVU9Fp-5R+JznvjOsL1eb|Rg^mzOhnu&%ElJnCA44{ z^sTL7*B$?j@A|pfk;@1Oh<3t0?Kk)}TZ>A1Kje39+d#O=H{T+OkmrxN{j#SS+>{AK z5kFf}mf6qV-(Q3Ct&c)wf(9OyilzH*%VDj{blmeel8QYpWQ@4;!u4xwq1xaqI&j@g zO zyks#sJjnHi_a5j0F`p3Z>ixp{noK6q6IJo^GikbZ_!WHCyiZCD(!kM9mgyS(BuGVQXs)Gp%kv z-#kv0Sbv;KRu;Oz6USWGaq$&q^NxUeiYP9%K1gOh6`~)9LP+W7yEyYi6uq83!p^%D z3I*lSWcPB%BSSstK2QzkJW5hV3TWJRV9ERN-XtWIx;LJPZdV13Gr^efp>mz#)wW|FAAcQ>QqQHQgq%_K(~(n;== zFSv8AElI84%kC!8kZZbzjeKN^?aU;!m=TNW83)*T86xGc4Qm)<+ez5{_8rV`kb;q# zx7fYpFJ>OrgZ5BcGVosnik((~gsGIdyFd#->=OIPvH@&1ia^oMAvUIV2Ho`^kJ^j6 z(l$LwGVClx{;icI)_r4m)tuX>XwL)z?v8r$i)N;LE4Oc0p$ZN`mF%w>%cy8r2`%nw zh22f{yrwG~&~ipAdOqn!TeV<(Hg!JXaXEoMX63L|`VQoH6tKK07vRC%3f5t0J$*C6 z!Ye@rs+H#PPnRu+*%K9r_(FMNsB;->)aHYY`7Qij8H8nnqxfWR8B}eXPmENq0darL z%5ghH!&qgg`szjvb^hS4$2v4#Ivkk`-i!dN!v7ye_pswbuQ5zusTF`as(w9-X_EvO3=V9;G@PGIu&-?&mi|!+Rm@?{;Ky&II0GC+Mgu z$Eih!gW1e_2)nur#4ATr>5vN;Ewh={y|G~riW|5k-hpgYtt-oJRc6t4H$cIb;P+kc zA!tAhkv)VlbPV&@a*1qxpw5CPr*W_=kDs0wvAJK*FsBkRdinckq0O|XxJP9Ko%!?! zb}Z~B_R+7=>vg=a-bw(a%W{|zpFtBFB~LDXm!XY<4_xzi-hb_R4noXU(6M$rt9v4z zhWn-B?!*xo@kX9oHDVk<$`R;wX{)XiyM);f6_|lUJDA3|K)mH>3{78!dSykBGcpzZ zbKk(rt%mSgn8vL&)S_|XF3c!ZitSH130lWmHF_^aj*1~07PI$A}T zW1~C`Um^#`BNK#m9Z0?1m&K7jl z5T}+6its%29MlKjVk508Vb5_fPHUYQ6K+f9J}6NNYxd#hJZoD0-yE*h{1Y{KWWaB|Byq2(h5`s7y=o;9w-yv9asI_^fpGjp)yoEm%b*Pd!j zHN>H*{vck>Gw=WA)4c2l+^Fmjs=f3$S2uMQs?JKqrJjk%U5~-cZXs8HRf|f$2}Lk}&K4Fy!le zl&%=&mgdLu{R%Gl(?^8vJ-=J9c#bs-3-G1)uFZl-Gc$^#9N6wZQmjY14i)#@<|+mZ zNcY??_;W=t%PTzvCqLXKZ3m>uh=X^?hcO4C=2|orpZyfNZLYwti=#LtyBSPr0qA-n+KM#N8@(0)h?w_Z{$d8My?@qMiX+? zU5?dnX`#g?*|_kbF3s7P4&E=nld3CnwAEjd?GCY|C4eF^~aX^zWbe$?~HwdiG^DaZ5 zkFw0>U^Rqj$}z{_PTX(o4oA)%5_T*mICAt1N@ZRWNq$ckv)+nMOXGbxemYde95HYA zbX>}xiJR^p37)$uKrrOW`uk&Xd{{8YH;2B!-EFR?za|z*l>Lz;`GTG3Ra7xvIYW4as z>Bk$;XrKuLUr4gMyH9~!r5s~V{s~WQ+RHvyJJRlU16=s$ZgoV|Y--tekqnxbK;S!7 z6fsbsMfzUM_fHpBV>la?@{X~Xy(YLWGlP5m^DnV8xy+qk=fVDbs-#n207?(DJxn3BbhrRRmw+bRHLZ*VL3*Aa)(XQ z3bdN{90hS>P_n9|N=f1(n(|pO=L;q9o>k+6Mb?=6Yb^wMBy!AAo6c(vW1=zRP;4^!9 zxbGH$$9XpOm){b2)I_OHVGZA}*UJU}K2F9C$$ znSX2{X*}x;QYjALI4_^>cbq|t)o+1R$QPbN5e3md6*y5gkyGi~$Gzy!fc%lc+&9Uk zFvhqEcK>llH_g59FU^$J`0oe9+XbvVO9XDHMWcR9FuL9_V69g!;qe?TFsa)KM>M7B ziyCR}aG*a;|F#`fG`?W)>=WpIrx+!ghjH7Bcxd6-gZsOEIqR(f-0_|5L}}szYTfgS zTbe5l)wi$1%!({QgV}rNjn`nKFP+C{`yOykDkJHm>ko*R{uDaA?FN6~=bEfp@q81T;&q_ae6oad_%Da+FLcDq${N1!x;Sqm=>Z=XDkn-gQNRM-uS(^SSo>i=D#aC zh9{+k*EMt`Ot5q(SAqOFsZ9Z06A`+w^)@-@hIspO5(X4`(<=*$r-dgU zWiIkxa2x+UZQ!_rEjs=l);xNG8QzM}ls6tyPKDA5Y!00mEzR!SxDWFp=fhQRO|;sT zft}`qxYA)M)|@$og}YKvrWjy!o*JyEDFuaT(cD>^aj49@hi%@9;@YddaL$9z3kRd23Xnn`LV8CP+*me| z6^lK_qg*_8?r7lT*74l*>`}DVNR>X#{ti(uu5fEl7hq_nfVTA?fy_875WA%bJv-w- zg?G`|eaWGQCA(mj;%30b-fYJ&y;)+g88x2&L|B-5A9l(KIf-l4FuH64ZSvNmTMhT)GAm=j{yUO1vDM6ea;=$g zok=QuEmg#|J>ryP-$lE40#S?lQOY?I-aYvWwF+BdcBxUc#;Zt=uUtu&{ej-UXIZqM>yIS+zhJP?fHk|c}jHF57vee+`Rr>CYJaov7 zVQt&HQPV??ZQ!|;zt%ON(fb?w^k&iITbk_ha-r}rxeaIL>#`1)3XGxr=U!7``_C)W zQmwz(&9lv=%1zk*Rlp?1j-mZXK>958qBqPI(>gkiG5x84!gW#slAIE+7}1V=baabiS_{0+dd%MA8N6TNA}Fd zy$%yL$YNgSHJEg5EIYybJ6?YgLde^3)MmOqHH)og@_hy<|4fx%W3GU}uytIdxhH+< zn#=pq4d}aWYfPVdkK`;V!>viX>6W?Oq?C1v6xQVU8Hjt0_f5k9QS35k4T3p5DRQsBiEsVJJ3z$``8#~c(iKu^^ zLYG_YLo0P@ZUvvYsmT;UuPM>&?iM-TSGWYHIbFn@03;;02}Kp$nFik<`r1+)V`e;b+nn(V=m8`Dtats9E(yNZFAN8-D~*95bRCQ{8g&*9R~&t%?*bez3Vk}lR& zq~${vY*EJ@B4POrf^!e!mLWwN^XUUrzLclGlG-q1d?=l@A(t>Nt zA#ci6ELB|z%^~ZtRJs#NJr0p2MtS7y_Abb;vBkDW`*Hnm9U2oHMJvYlk=EbinB^6F zD(Y|*uf-igT35?NIvseX`8MXbR^!YiVl;V#JzM$s6O6CmGc`GOd`Gb;42bjY#vP1P zd6LiELeLy{gEm~_5Q4ZhO}(Fx8-hi^4tBe#cddlBr4M9RX^eWg@d>yC<1i7_VVfv{@BS#5&URhmOGwy=_>u(1d9^FJl>J zr5Nr|VlJ0$xEXCh`0PU>&70s%@9frQdh7LspFf^}KC}0vxFfIH%-Ijc`0M|rm@WIZ z{Q-2+CAd*}DqZ(UkNS2jC-H(H{=VqN=+qs;+35*jWc>s!#nNDC+C1)dtTgLz7(w?d z*@BkKOy=T$0&Y&u1$Ol-u3xziQ?FbAvs_a+5HKX{`1J*Eo;Zq!98_q6LI*cl%ZwT= zoDbDUinw~6mtgAOk8g4)T#tJO{&OB+)`kJnWgAF;TP2e#eY~GY(vkM|q<~5phhMHt z!hc;Y_A_Dyc>NX64@ynI>pR9&(^uzU=nP>-UHuq+q89ANJzu?Ac?@0Tu6smn}BmOZ_gs8;%>?yzhf5PY4O5@g%B@vCV z`0h?_SEV{VP`H~+7^;P)@Y(q4z$9)@!U;~<_AQ*LQDNnohFtMR8DtET0Wizop?r`RCX(E)v%8`>BZKr3dKu48uX{aPe{m)COhZrv95>DAgCz;E$$Bf&ny$X z&g=#qm35$`l|rn{=2E42TNbq@4;<_t3i7)TqIJPO`0b;{W=Djwi5%h-r6#9Kl#0>v3 z)at$qk*Z^u>1j*Y=zLM&+?>LlSewN(epyi4=yG&gmc`EMv~aR-GI8nyGZy{qDAzP^ z6#en)Ik^>NP92-y!?>5?bjVSc%J64%{n=Vn#zhknSmX-}csq9r%yk!+un_s*mySsA-=H7={_o33WUR=hknq)O zS1sGLdE=^}uw`NERz|E1+8nYjeB#=W@QGVjg{=N>^ThD=+eAf1iR`WU-w*kJKQldj zJm&g|ifj?tVYG79rWG5F?6r+Zu(gr7wo&l9jhiHvI5p4`-uON4_M+(1O>-+?3ISTt=E9 z%`(^z)o#PwshcyIhO;P4S$7%FUOP=9{{*prjfd#2FEMyMUk=yJ7h?_OrgU!TM>r?q z4Y$9lbY0?y7yQgjtluB zE};pVltF*NA~yI^3l*NGgT+^QdU0Abnam%+|N2-8OSS%xSjS_+`7#&TT{T-92$5e6VZ!JO#CWADtXi@WJD(_{+S3J`%F|5{ zku!@IA6>xJx3;p4FIphfKpV6F%M*w?9^+okl|r%W`=;&f@5Ar)88}nji1Yuu99q2i z)BIv(>eQglBu+1-Cq%8;m}pU!lwT~=a`j{hJV3-AinC$y0a$zB8hgr%$j_WzK(mhI zL4!*Sn)r2apE~agkLO!6`Ee!ipJpJ##_wPe@Ru87U!G2UBy*X`wxy`=E3;xRH;rO@dtVW&h6iXRwS(kuUruM7>?hhS3iRm) zT_(263q{xP0k^#Y@S`9Nl)E+9AS|QqAHy(k>_O<-I*jWRr0MfKS*kTki(C9Yi-pKE zgVz&3Qd`u{n@(_-I%Bcs~z=&NhN$o=MgF@=~^3eKR?7B^p`u6efOQKLn|c z0Qd3nWPOG$m6`1i=4tUjnj>hO=`mRCw}E9(HR6_NmEhYwo@mk4j{D+QgMoq`ZPZNy zubal~x05(*jlR#t@ImW2cTYg1jet(in#XyxRFbmn$;|u8c`EO(PR$!Hu$#Y}Sn+}m zZt1WzZgl$%*V@F{K_z+mogenCZuEeajt00%QWnEk9fG_>pyuNBa764quFej_+|b9^ z@!XIlXbL#}^NWeH{zJT~BFTVRW zLdjx)_ZjA_?Q9zE$eRl%dwT@i3XVeL${KR$vB?1k$J}s9%{&EsCi(kQ&uP3<3;D6XAqsBmK3LM^A#a5s%H>zHa zFDrS39?{Y0du}!Cu&l)TvT+o?j%JO^Q*lD24*ZZ0N1^w1e9td9o!__+_??KU{GeLM z$4`_kyb;RY;yKYt%%K6HFRG9%T;9VS@wkPB&Naf11M69N=~OUu_QKO$R&4ue6>7S0 zNa&&v4f*`AMpk?h)m`|Bliwys3)h`zYKx`e?Qm>aa7+= zlKxoc&3G^{eOOsGARA>Fj4XeX=on1O~%cv%9cfeJl^n3FxjLUikK_CVjJY z19_*M!XB4i=vn+=il&f?D8=3(T=CA`4(A`J9TVVULI$c2;7 zKr{Xyq-e}SZ3}ZSJ3Jf04=iLw^P=HSR|x28xN?=Z)tSnv3K;nAL%*I{!LGWh&<`a6 z%(d?k*F2++%+8X)cYHYR;2k@fVoNbA{}PIgRb;n5_F(*}3pD@IL+GihgXjN7VaMWI zoPD)8JsIdpFXwy0#@|`6@$P4QqJ18{XaGC7bSueRVoH5~zY)&6tw$@5eH02kFTr`+ zDKu$pER)a6WlIWcaM{9aJXyfYj$1Di@f%sfg%W1e`pN-8_}pp2*Sze$Yo-FN{TIaP zO&Z5?A34#}+0T#$w}4}e9BP+KU=a@w9!;@Bjm#1VnspTnjI)TbDuc19>HQNg6nr39NJwFaYtjQ5h{#hcnzKN=?D}9Oz z_Nx43w*hr0e!~)@MW}qd6tceuLbk;%(#ij?4dg4aOKUGX<77m~m!2R+H(g=A;U4zs zXa|(#h%&FVr|_zD3|nh{k3EtWl2arH1F!KL`i`~q)sH>6HpCbVHax42`EJDeyLY4K zoI)}R9N5BQUczdoO|LdNVts8OdMEu5)D2{^C*#sE+~h83TAoLn;^owfmx>&;b%Zx& zzo95^1dT8{Aha~ON|X6P(8#~Xj#sm0=IaFpE4N&+L^(T4Xe{U-W}?+L*!e0}ElomsqZH|2~wO@(_~W{e`j=3kZtu=R8-}!$1G|j3zo$ zFQN>~PTJygQ5pF3-y*h@5An|QiHFYonP~6(S>X6-D;H?~0^Rq0gPheSv^U+Hmbqp@ zU!NwMcH#^=ZeC2Dn3#cNjT%faj>aM7Nc2^m$Id)=W3)$#MP1RP8J!mN(y#}`z&M(! z_6283rjw{nzEmQ!7jIY8a7}v?p;n^|OOAQ-;Hf*_(%1*jdKJ<7=w6K2GlI=o8V2JI zOcGG<9NaKl8waoDPZr#$6pw*F$|1}SQ?!GRZA2f!ZmJlP$+%IsA^BrLC(s@w4 z{TSKQ|B$;pA{NzG&t+Ekuo_#3B!l(6+du8un#g|vyvV<9U>#hO4 zV^PnQPiy9udo862CUQWOUlQSd5jOhgL8uqAhbPk$v0djSmfsCw3A7J8E#E@v>j2tx zQjGb@{X;oD=OzCcHsm@8W~+{8x+|MN*DM-*o)1Bs z_D&d#JjqSwhoJ|OIqZ$kRgwL~ILk20SszTnS;l2v2j>ugnaNZygv$DJeFxcWSTi{ufiM{m`Isfn^ zXk500$#vyW``_6Rt8!29>s>Z9yZ=Mc|E^>DxjQ8FRS&mLMT0IH>r5p(dvR=tJw2X# zk3?4tz?>^B*w?X~{kl;M1qz#4jL(1UWoZ!T)@lnf&7Yz7lb@V0&>GIUDu7Fq36{>5 z!yCbQ0rxdgJ_?+vryN%cWPG+6srD*QN>)0kM z4Ws{*pl|+i_H$tyENDrhrwi?9;?1%S+VTtL8PtWGBLFkfgjT< zz;CoH_$lq?#C)x3X1hI}4_5`_#L28Y%@7V~jAav+p2927r@`ugeY zmPR7Y2OGBKoQyF3_7+U4=LN$nUtnt7cwU634wti|z;xJ~CKX6fQ#}TgFI~b@`{UWC zQ~a`#pR*=iW)yYXRsjZef#po#g* zIpKr!3%Blz=^=^^7}6U3 zP=0uph2A4}Q;93zApF*6;q@(<%zW=HQr__$z8wl#*I$I#6K&2<76Qyrkh>f@kJyAA_ zTC42Duj?;i*fUXX#1o3L$qD4+|z}Ea9BA+p$x^k>C4e z(2AWkSlG6b=<*Qj>d6)${q8gVnfg|cZk2=Ft>bvxG=e|C`-@-IyQiwcbwZ>9h~3+O?8llO1TX{TE+Qz75vh-#{NP z{fVo(&FF0ZF|=>Q;QySWqREL9r0iWjUzRWd=f53Er_`;4+C7rgKk@=*?s-PitXH7n z!2tFpEEBRnP6E7G4ytjQOj~;kyK1zDoKU<2q6#WdUT~VKeKrRw5=FT$QnYcD|)>oWbfc(4Xx>Z;8usWo?l(7?$8w&KrEni^$8_F--JUGhYAoicBw7230>! zptrlIy65RIG=8e%>YnSv@B}4d)ijMht(~x)FOZz|Bo*dQ*Mon5$J5AD_fRV! z4klg^WhxaFLTlMepdKv_@i*1jm$)AAy7v;L)ZN*WeqB&9mZW#i*s!uW-(blyJ?gGm zK}s?{p}J-)C{54BobL6w&1^O5dbNNWFNstgO67V!*JG%NDYz`pXC6oE(CO809#nn= z)m4Q!Azl^?m#stVWJT1=H|La9!|BJEAyWI@pQJi1zqE^2{INeg>4@ksk6K>{p=@1^MrGld$I+8lk}z#@jE<#*I~yVSak{Mf|Y`sS?3`hDp6O@)SYZS1+Ka*)v_5$|B+Le2}|1x@}TkwBN5p@~)7;ifiqObcn z_=$sfP4*a0TGfnPCJ&XQ&!vyN4CyY7SMbR(3u4yo!W%cg6ZubVaQ93IJ09wc;%+Ip zqJOVI*b`BG)N3)wFPHaV$I!$ed6xKC0e|{U!Ji->ah6I8Ve+@8NyjQ&jox12MMaq5Fjz9*l`4 zQe$J7liUWH96gOQZm)o_C13G;6+ei2c^1ZKim^lW6?kuyJ2)P8A%C7mfR4yTOfa7X zhdQb-QN@4?d(_!XF~+Y+B$)54wcM6ZzARkbllD*XpigsR*vqjVc%#^k3OmivN8%i} z*>4VHG{1zR^mm9-Pa!12NjQ7-TkeQv5gzGQ4g--5G4%4``Agc5~J7}T2puC)c+!mUNzMe$}x8WBrt z8g1Ak@iw&Bs)YGjBj|^Rb7=U>4oIOX%xk1qInWG_rwAc1!d57? zO@kTSID+r}&XZqr_}cLG7r3-Trp%s~DkkUEVSr~D+j2gGv#cw_q#O|@y#9?u-f*J1 zyD#FnDT+AnUJNu(v}Ns|cnC_6%SA>8Ft=$Doc`pm=r~gyLwe5JFF3AA6BY!pdCP6- z?V4h+tA7TTBD|M2Oq{LDTEnvR4&v53nbooSBN(yPCbkuSNmLFW%DZ<0GhT=CkhBcb zKYt1bt{>-%&RR)#-!OOJTQ;_PTmd8dZG7Q@IxWjH$E~&VY1Df$&i}O+=tl9V*t7!^1lUo&VPw4OhK&IP0n5#G`0MzPqTyiA)!72ZpRo?FNt%I{`m?V^_ziFH;<_FLcJd5tfV^F6~(nR+wZCMy;)<2D>I4Fy5{4Y)a7l3qO~#0)3*YDX7i zE~9D<*>zZ+$>lmQtC(KgIX(<|qZPd=t_wmxHFkx6K0Xb*fq(u8sAr}ZW}B^o<=z64 z-hPPvi@b^{t8Cc*hkrQ>qapm(oI)4p*hznT?epvmbqz#KvpV zld9<`{3{F2NoQf`!C!nm>lThWNU?FvI((3m&k1}2>E?4<^kqgVSTB4G^}gTXt{o2q z*vc|Fw;XKi9wOy(cVANGUu({e9HkS{8{L&t@%PK;r3wcCp z)*8Cm^Cd2v@`5ZGrAY2RTTJ|BO#z#XOxV4oMkuDH$Tmu!qdVrhYYtcD3o;%p>ivj0aamUL`RveM>6+>N*M552WHgiy&)3E}9)#1FN2@ zQy)KumXR9l*R2tt7-LQy3Lc=1{d9WMWEYE&yoTM;{esFZdhEMnDYrG#oT}cDrT6Yn z!qNW%VC^wS=H|MCpAYSW;+z>Q=hHTJCa{HE4QYbgYNqsH>twXNx1XjD^1y#rD>-am zh%TK)_L0XVsq%MTZo7iR*7G{7c7v_pq?;L+v7Q%Y=9V$7ZI>{3Y#$h0Yk)hqV=%fp zgIo@jAOq6!EPsO%y?-MTKh;FxA{NYcwjacy1p}m-Uo-qwUx&7u-=W?z9rt%V1>U+O zeDqiWYK8+aV5=_O-aQ?^!ntCTMJ> z;=6f(F=Pt7aDPj-M(g2!@12lrl%cOr@59Khd~8rC=U#5#Lr2Xk#-<7r9y)0+5q*Dzkw{D(OkVg-`Flmv@@eB&&3#nZUdKH;&wEyU}^RJc)`1;<)Ga%+cl z=;dE}oX@e_Bp}3)nw!pN>R0&ng-O5P zbk0`3OyZ{u`}HvhyyEg;I71zpoc_bU>21(d*oOl<Nb~a~DuG%`%jfwPF=_{6Hcv2Sc60 zA^;k2yY}kuE zr6+|qhW!LTgmw5}b}}rwV?m63SCTqI5vKLbjOMA|`Q0vU*LYKQ@D=(+d zxaG*C-fhPypBQ$~bQ)-dN5NX%BhZ?w1M@guf4oBkSWgt3ZeKwwZTiWZy@AZUWjr1A zI0}0wKf;Vxj%=@}F+0=cO6OTR;6*-6HSppR1k1PLj^g=T&-6HqOlssNcJ^{#7mjBy zxJ&rU!h+4a(kHy8Z^F)|w2=ghXzZIkmo`e+&}G4%Aiu?wZOgrfHL{!7njLGHwdzrB zQ^GvDVucx78&VDly&do{^A_=Z<-mo8UFEKJ?85EwI&@vw1w7%9gJPm5z_V`+yo;U9 zHqUZ^8(Rd}H{~vFm)%99Hyg2D87pR@mO_J~4svt)R4Ht>Vr`~ktU`S>3ku8NZXR6& zE^bOJF7g3dPxoM7uRp8K{H?~;7xj`S%llw&*Ln!CzsZ+(l<@2Smw0{ZLA0EqP8}4D zsqc|CjE(z4#>=_TsSP{%8Qvwhkhg=i_lv=CK9KgXP=@7Y`9QVP8=SBE8x84Qa`)Q< z+#b4=v+~>qCV{U(dC3K4C@)4gfA1mQU5Ch7wKpXFnF%Y}?!#(TO7P#^m$<8S0UlLD zZt5$3%jjcDwQg8JPE{y&`^7Nb8LOy{jw5vxG;dt`%Q|{52iL}mZKRo3@dZ~6@ zI&-E4JGDIp)_?ROjSEk484Js}XaA`%Qwc?E=)MOB!#|^#YIAje<6o#NTQ2DOtWB#- zPU3ERD{^4QF!yS91=xhu;S`Aru&wGF{%+cZ(t4+1eIsS|=j`ajRyXP&c7jEpeesC{hSA29?MO6#9$!4?e{0?qSVYdDGUpWwc zN}Y{}U5u0bR?yJx=~#NAg-%~yPr9Ol;GY8@C<&;={>i4)bPX>6&aQ(S(;wi)R!#P) zdK4;M5lMBznE_3p! z`$*%^CYU?(5~$8sh7#>vd}vu6L{|!6BM%(UluM>EOETEo)bBVy;tc5ejAiRJY_Pjo zo~6C}0sa5&MXk*eOv`K^OA1NHzxlTGZ-+m6T6RKCVG>kIdxO^JOfGe&1^T=pi0@6Gc{x*Q9?f{qgi6dBG&DF<`d$IOeCuR!zQhLHKdU2C}U! z7b;PU%I~Et8Pk}EYBI{NFyMZ6)smT;4B=LMEz{~Wfq~*kT-5gs-oJaumlcMQYq1xr z-!ydKt*j&bb)igKv(Iu&;|V%Tq~jz-mJh?buUi=>DNV~i zZ=@NOUEmw2i4F>)w5Z*e8|R}#!v|YY_vkqsqkb2kc(SaW8K4G7hHoa**0?liWz=7l}m^R^n zAoc-)+Z*2Dyw~RJ%^6+DINph~4u=VU*UiPsMiZ*-LFw4U=hUcklTgf1OL(YvB&yF2 zA|XktxN6-#h)j}Uq8LGZ6r@1wp%(bg_ahGChv1oVC?uTj!R-OOeEUQaaoqR?%IBwJ z6hEI|$jkpOEUbh&xlg#PLy6{{8VfIuCewQ#)>r@OX~)GpJ7C}!#_p!gL35LARwz?J zZmZtGprzH^+9P^wDBYAT#}_A=8-ZMMyPI_=we0NqD!;-;5mlS{J#IFCUOJR(~T z!J1aMD?g9;nW_?eY{Q1ff5cR88B~qk$}NkY$*v`j!E-MpSoSUzVR&{tG|g{8AI~k^ zEX_XxOVM7)@O_TWpI*a{dq=U~dnHu=w&shvCS$=}MK)`WvmorFCbR}C(y>BM*6yo< ztw)U6o!`kYQ$&Tc7f*nXBA-A(V9KU$b6|UnGFb&*uxx4m5AFm!<;(-3@OpF@YmSVd zhX(j?L5wUOI&}xU|M2%uLX4olEsTin`#=gjngzENFGHE}3ApVWh)+U$aOKLeOlIye zD7g{`mRCzi&~`=Yu)&soC6d%O;ThK3zvC(ozvWc#P8U2Y(P5z@*3v@?d)a>eS$%TN zEzZSuG3%*u1G)S>>^`6ZZBFhO(={4%r>WD#GX-Qbm&__mKXDh#mf*79SoY^8A2Qd7 zg}2pvU=c4N=-77--5qSWTjSG+H81m+-0X!3#z0lOk8>qEvS7v4>!2okh>Jhl!`&Ou zK(&1p5XEK*7haskw#90ISW*HF=zPx|yf_WNOo`_#jU3s=O@-h(Pl#SS`?y)F&1k|$ zb!z=Qo$GW}qo-DyaNC_$!KtbdO&Sa@3I=(pZR{R5I?B5d=iJw0X`>1`zeZE`)VCSU4~!>9raEkm&1l-T zqMMVHrSuPH4XIvtS+lze?94jK$;Vd0>Zn7!%<(d0E%9d$Z=Agn(pPb8`fqFZhfPKa{YlThlPA_Z#f-+0OQ>h@oQd zdw4iG2aIikux!m{T>UtZ`l$baj5#(mBH#%4j_CrmK)!5anh@QMFX5NOLX3Ztiw2dK z@M7d_x_h$~u8(aKx+LDD#Yq#mxg{|yduIwOZ0{qDcnr>7+7Bsig{arI4_1uSr0u(F z!QbR1mvb|=dQ^%XcRzOvBt^QR!MhFYu;>W7)F+&N?r~=;1O}Y7ygEHspMY-7O5z^C1gm zMzICHjb!$K0ngQa!YRgCuqAN~7xu)C@s>$}tWq>wzM6!o6R(i0k||WbS;*bwVc~{j zF0^RYI(&>q+`n>B+F(A8CC>u-{+TrzSQ^8&io-(xFWTh1Z2<~%UFgc_R5V$*mPte< z(Pi(f*-;N0?B}05!FxucOS(VmFR`Mxq9>utUU_C1Uk83>nk?7uKNuKx5iGnENt9L1 zP{AM;lU*xerr|YGU8;%7H!nan&j3i8mEyN+=F~sXn5kNiXZvL$$#c16cre7DTZHSg zQQ#~n@F<1u<_>&&tO#a!nS%FY87wQRVsi2Kssr?bs8r=gvfN(*20{veEM3mzlTP47 z?6|>-$a^ zUyJjN3aEbWBIq>BEdI^=KLV1}>Ib;Z84po_UN9tfK^Gw0^+S_B0d+zzT)qKWd>D2b^WhKOGtdxy0~5Z_rZ+dbz#nU4Jel5(DhkCooUO(lRd2y?yBrv| zd>cLCYKil|Sg=VaX0U)7KA@^*1957f(fBb(HVs6Pn~y|s-kE9acbyBFw)7_%;Uo`h z=ZpuGFGE4~1@6>GO}x-jjF0+zxtq)D$cwRC@I$T=J(x9yUhG&2;~MUwt`(&rP>0$_ zz1V9p8L~QEhUMBUXMTh0L3>ER-5=Co-s5KCs*+;z?aWCmzMY9yA^f$lXc&?;^4J5< zeROY=2)(pFfRwoDL)MkGOk}DI1Q^A`qm>S*v_%@X#C{isJ9{&M(?=lM-Q>wBUufB6 zN0*nBz{gop?9jGOOgLx&|A(P73&g66!mxRaNM?~p#zGRlv$j;G3Pq$*6RA`xr9mMX zDzlJGiIOB!D!#L}p-K89k)(-AMJl3_RR6hm;o>{z?7i0eK2P@OS-ijS2ilxcBFuMt#yR$dh~)3 z#ods%#+tV1`D0d&Kbg8e7nX-dQ$1@=4jXorj@R};LPMjC&k-fMk6+E?hlk^k;WTue zl@E)1!%@2F20q)UOg7yXBn$eVFb}Ma>FBd2Xu2v%3uDz8&qE5haFaGkl$}o4tM2$G zH<{J!5hA0T6UlZz0p^W*yH}!=3SyR9lvgX4RJF-3>x6khrR4%<-4r2m=`7Q7EoaUcQhE<0NU>_FjKRv zsK={2`2LU-yEP&Ot{2as`UfRwq-!vn_W2&hP3FpFGj>q`XMC8ni>eiMg81YDcKu)i z$n5f_S6{}kpUkGfo>Pw0CSW(HuD%JqK@o?RYAj+W#MG=im(z ztG3ab)}{Q}Q7P()!WBmOfr9YK{ zNQ`Zz2dbM`rNUrlt*QWIEL}(6?2m`0qfKm9S1Iyo1hfa*(1C!^nNgNB!*~ z#7@W=lFm&;{k!wX5xB;kS1eeI(+pKroWT?{#lp6@UBum7fLd#uqo4AOss7&}D0h&> zE_DkwgEMyZZtx(FcX0RDY*W|}u#QN`32+&LiS(QJB>3}Af!FfxD2|9~kw1m0oE&f} zeY44&IAyNH$f09&Q@SV}k(q?wm(|(W$y>7a9jj>Mz5-O+*okFJuE5Xpuh>0BHju>S z3|sR5q7$rzryqhz+k7wjXa!g7`JqEn3m$U$#Vq<(+YcV^TS;{KEy1$52&KG*Ve1?> ztabawqzgo_xBqQsv);tX()708V%Dp}m8_i|1MOdeap~(USfWye3A3d!jspthtsi0c)Rx+;{-(w^=H}`F zXYPSXjUyfse2j%EI>g|hDvo#FB&YhQP0%Sx_89kR?dbOBE%lDaS2Am1zM3wSi3Wo4 zK>^ZcqQ)r1TGO8!Ceo6<)l9hV9CBE*286TRNxuAT@HQyJi*6B^{o^t2{ak?T>ugZC zoesNlov?W2Hz+TD4WnbzXqH6{7}@SdjcpmkYDP0#cfoO(;|J6 zZdBS?f>zx%=EP=P$+Dw^K!o2dJwub9Oyqy zV@Qz~hHd7CBv##=%N1}U%SD8I`D0H!r!BzgnTwbob|L7}>`q>Au>R#LZH!`v8J!_M zos7AL(0!Hz@O-ocdhh^^+hvD3U6pXMAd0VhFP=J#J_LgjU7BO#fs!kfN!vXovO%Q~ z;}3+8aOluzk}DdVR}b_bLIrtIs3GLTcpT zP$=%*5sMj0C$OE{@tnxBq3>_rVD+apqV2;_v^mWE%`nDpf2@!9NM)PyVR#fjMvkrP&A$gvD7ThPAf2>MR3qrNc=+%uU(wyskn%I=|Sm;G&P`NUJB8eA;G{;TLPTNeCETZC3(=PiiDS|kb}cB9zQm=B(REcSpkPbt?rVWo zVkMl~m(0`*BJ4V=18RO^9_Cd7-_K!8M!JRQzJ-59PDAt@;w{&&INVP2jY;o9lhXc1@#A)!}NPiJiS%& z82DQhJ0#Q4sg1q*NVzxiO!KQbJkj+I);aPziP9zfS z>AX`g@o6W|e8(lerce$4zP&h&*x^B=aw-`reg@BdDQ5j`Mqy1{430XOk(_0l$?aV} zjM@Dwq@yJn6#O2rm;BE$?_LVgj`<-_u-OW_o*%+{XEdSYlLqFT&&9~)<|Kr>Qzfd# zqUP`=kgApE-@5V&qraKps+xBY7??uEp_2F7xR#O7<#xd)321vSn(>rf&2)Pgk=Ku0 zNJEe&-QfEN^$X`Ra(eP`$jgE#JGem1-K`*$yBnSen;<)LA(S;r(T-b(*tvT`_yy1X zsNIiJDz|eXKH7AITy5>a0Ph!As3%2-C8pDfQ}jsnk1yb_7eOV?E7OqvZczEaM=Ww> z4%lbIAa}MsSy+gt?;IoUy>+<4Z=C-&*`4;z9_NbDet56_0Bx*MVfUY`AdmmWqw>WD ztovz8whWAdo5FKOl#%7N&Jc&x3k#X`Z|0+ajTkxS@CIiLbTJS9?uQ}S5)90fWU>_9 z$SYw!>LhO?s~lF-yFTrB#9xf`&ru-j4_{zR_ugd6TpzHdV-EanD{@gpYYEdg5Dp6} zOW^1B&1|<&Ae$vToo@YNN@7-&Qm-i^Oy1x&q85~nKYhBnXT}Zx*l`(O<=bEp@(5Qc zKI2ugj$AIJ5>ie5Nph1JEN|$9u)BFUV7kHPt%nC0vwi{UFS%J|v!hLkR4jB=pMi!- zQ>JgF4|Y6kV81IYCw|__tbB|(++Ul+4_lDQ1dcw&3z;iORXrbC6kE98`CnKlZbdCp z-ol0i2C083`}*=@6mFhCKK%3g8r+C=^&~pah0i-Ml*`kO=78a^g0VRw z2yz9~xIFO%_;&mgyO3>T;ucq+;(uZEPTXsr%(j(Kp_&fMczZ~F83&8s$o1a_t~1Xo z^Pwu%5>Jm!!o599*u)D3_}@_{yeK~#RbFti-LfRA=&}=U{e1*dGsVd`Ny8m93PbfW zAZ-nIt{1yzBPF6k23!7Nj%6;x#j9c2wN&y=Sp)0p+adebY3!Pn&kRxx=3{~)X&*_% zoT7WI-Ln{Y@L?&pJ7Fk z7sG#VMcC%=OF+SSHTlSn;DT3E@${)U6!cPHhN~rcYl>s3WREXgi4-GGA&>ny?+s?i zE@#)g&mj4)=Mk&xCiM4#YgD4ZohW5EFxzJM@YR1Upc)6Kk$WRvv^_W-DlLsrJG6yQ z`={dp&w8AEY#&%m&qVoSD`@1{Mkrl3ft-I6Nk7+dd51MsIA>-ZPbKdPW0@LEFP?NhoJP!Zqwqx|C$6qDAqy*KGMm~(p~T6a zF;rfLZz^UG*|$PO_UTNfwdp2~z$}_&*nlT@tC2SU2=qL8fvLJ{L&bZzT#RC|Jxzd6IQtJC26D^v3ES~n_V6NFz`k8U-burN!ST#G*p(UYuUqmL5(7e5C+ z=n9gF!a1z*6cJW(nFDUScaofJlO+y{S=h+!MrMBGvFpkeL2iu}84)|eb1(J9uv13V zXIK}f&ickotrsWau?9q~$`iNnPoji?9~mmY$wA;hLPK#D?y%G2hsNK*8@DqtY*{dW znPLfk^U{J&A5-EO3&d=y67j#8g#(W}@s#aTNPi|z>x#8GP|G-b)43bxtTw1t*!`9n z6y`uSCQX>&vVo12e21E>4Th-c5`l|ts55;#@0ss>`dwf;Rj_{x=TeOEi2ZiztgA_X zyx_7XucFB9CL!9m{XUJGMt~7`#moOG5)XvMK!+#E*-Rjp27$x9DC7 z+pUYG* z;2_DFQe^fO0Q=lV+{E?pF0Z-BkN7l|W_d(Vvz{Gvrm-`A{N#^UYeZmC03VC*Sd-D0 z^HJ@hH)scj(C?#_>`J2=CN#{J_Umb~cVF%V`Ppfdo(#f=+JE@t1bk z>hx;#85X3xMTM~8%0g7!DNHtORHe^kIk4`HGQO?DTD1Q8oPAPgO3zPj2a$)i1P|$x zU2iRDOKB|H@0tYt$%0ralZa>fv|y9vE=alROCQ(XhZWgM)b*(&UR*qZHU_DYlvz>W zB$I}DXPl|<*b}~W<0E$HKZZ^hvWCwCg5)7r%D!{0hL!g*AV2d4z;o|Ks2p5HgSp z$?nY#WF*j;O89XdZq4-&ePs&$=>8g*t%s@hZXP}>7G%lFr>JZ61FsHwvTb7nY|88( zjETW3oE*9a-KL!Y7t@naKfaWbM~gAt*n(c)c9?H25QeI)p(J2t5H1wDMEu8>;rTuC z;COm1X%C(T#hUWulWjaZ#n2W%1oyy7S#5I7G91+6rHMe-X1IC|;9kWSD5%q=5yDsS z&#k$@B;Bq5Abltj!sQm|FZ4ZdQzoOoBjzFa+5obM!DQ(ya@5BT0_0;Cc>pD^FZhzC(z6HrXSw;(OY59 zu_SX4|5Zdl;Yc;tS-p$iccoZURZ%)L%bWCi#i0AzLA2n>#1{ue}gMsmBXe zbqAK&J%y1yQ^`IfJt)~$0-r0@>7gnLDHX?QPNOzec$5acqKA>(3}Q@IPA2J+rld>B zpN@1@;Jnrg*c`Nu9xykC8*-QN#fu5#{`YSD^C$tQw7p|K#uf3Vt`a4e|2e@NgZVUS z$d=lEas#_qK7`*-#(NQhBs$KWyYD%HundDLYCIS@+lN&*I~NHfVeE9wn^$8Sk~5Yrb4BW0TcF z!FWM0dv$3UHqPY0RgYFuQK2qy6bU8eH-s7a!(47Q_$*ew8OOA_I`Ed8J!~|{AuG)H z!@)Vda2aIi#>9s;hl=vxo?9}U*n19bxNrUk_c2Ig_R{CY)0mXv7T$r)Vzek*7PH6v zS&!j1OyV*&nIc?&Yt>eIQTHT?9}wiVM5?gj*Itnz>w8Ro?I(0DsN}_m29U{blCiJ; z?G5XL+@8;#11^4CLP+RM+_;~cftXh_whMkhWQ8nh6{W&hl_HH&xd`4>++s53B>hpW zPvY!ng5BxUsP?HAOSwK+=~+c;#0Zjbz6n2Mc`RJ59%H=6GkKsaKth#vGydIeI8>ud z>y%UAm2(TOt}(*P2X4V>u>#!W#R97vOn=W$V?g334xgJ#a^|dO|E!e7vAjHxVHC)$ zmgA6jEFFSWCz9g}=Hinn#44pL?I#_z&$KsL)0cVJf%44wW=>K>YqzQlg%LO2u6~KWt); z_Rql1pkELYzn+aSY=$Yn77)weIgng^8oq2&r#2xwh;Zly9D6j#?&yufZ{GqS^kXj0 zJ73Q#{wv25!P`N7$QCx&Q&w^FQBeKuLilD*B<+_b?93!sUcU^7pOn!YwOtS%pa9E# z`j~=)C+OCwa=h20P7)6D*q9y*dMV141fPw=9rv2pl0+*mYgfzcKh}#uRzUXckH_KP zJs_kpjz8U=RV6I9RCmN+~+dSg)D3CPa9)TBr1{QJ`apIo}+<$t1}H-cG}BY?I1jrte=buYQ#SSYGA$36iTpLtp`F9e9fGa*Jro8cnK@y&fm; z)gp5Dzv8ycVa9oH1G6+)nuuQ?1;HCv*}cba!+WI&qH?&2sE0H$i7`uwoYGS2_#zXQ z_En*~6bG*U#0OJ7U91sZMQ@yGgDDSLc%Qe83><0$jbDwh;LZqh;X@OIo;$)SpLZZ# zNildQ(uKG-^|8cFj(Es5F{VX(ndY?DIO}UHZ&S{1oV1mLv1e>V_0DWYhl34{i}}E< z+*Fi{=;CYPN^&VDiJsaK#V=4=v&k+ zp9t4i`hxV?tLzhEL^VIF(+?*$Pk(69Vb=>VwyP7`q+^+Xn+Eav(=+@) zZFwwdyv+Y(un)cDTVZiCi*f#4V7#`N$>nCe9X15xv{#X!ut?x5S&%G&M=0v(OK2O$wL#>GtpWS@>T*&G{V1y?10j1=K}h8o+^?C3yaXP(^xKvx5j+9z z_vg{mpCutH(4Itb`BtUY0cg-!NmsAcz^>5(W`bEK`&)4;`4TwBggebcF4}}~-J9T4 zYz4aRo<~cJHOb~OXOvld1ygga*c0h1z%5mUUbHh~V$%q@PUD^C)AlU`d0!T*-^|^5n(pLS}5^D4fykX9Ty} z!tRZ-M9_Z=&bS(evae%7vAYL77p`Qbu0#>upVydmE*nR*=aH#jV&LUf#6KaAVbkB^ zWYYEX_~BzOBv+Kfp{6i8_vwAe`z1i0iQ5vpxjY(Xp9jZ|bldnGz73DyGE<>u3q0S& z^w^$QsLQ?lZeh;M;9+Qq{~JEh){nAdt1hb94btpTXnqX+c%Y9@mY{9l{$)7W-(;SG$2c3 z5lW5p$^N^Waqv|JYmhLV9{8L>;ulOHQvE7)XRsYUwVpupYxD8xy$pPKose|Vadv6S zC8R2oNn%$6ltlhxmb7iAyN#dV7K3+q^J@ybB}@kG%%AE!tkZ^PIDW6oifa&BG-|>K8@(|KobY< zUgh3d_GGl@J})(-me*FnfzM@(uxtklc@iRIg@z9mS|dXJ90F<8*&BGN#h=c?-P8dx+}cGBjVX4aNR0#@Z<_Fh6V( zG;N73y0wQw=DM3jwMWY*C{+0!Eu&cwL$oJHDn4e zBuc_T)Mug`>vzf$x~@kuM+U=aGtCu2#ln=RNQz3W_*WE~kAk73! zDOgIMg{-EB!*0PGw+HA}90g`~T~RhY2W&8fmtcGV0(R?T_xftE=D^7f3m&nj zRTnR^>!>1^(bzFVn!fxn$p0%`#jf*|B~lsb#IKl;nwSYBK-HXjT>A}7+ZEEJuS7&H z%L7>!fd@*|$%arCCRV7z&I=lJL^TOWM>7ai-bbIIYTP;IMyFH-!ijI;taFDbQ&((A z)K|?SQyzPwnzkdkTDO^Pp<<)lDJ8;75be2zZ@=8%NOWhn613dH|K(@|+P`UTG7LV-B8OEsFj zNhTyNJC2xqR-*4k%do-sE>_h)hrKGr;4}OftS!Ts!)e!`!SOT)j1D6U1tn_jbVK;X zGKRF7n~g26k|&y>gzi{zipicrN%Eu|yfsOZdWP3xMNbIK$bMLn6a3V>N%JI?}0p%nPjGcuo8$V;Gf()5U#L49=UgWjgZj?&DNE6!n;7rLD z9)EHOstqotsfywBiO~}J{o6gZQpgPVAFgJ$a~Ze$0TJkJ|CpB)x{iE!la0A*LqM!5 zIF6DxJQ6z2e6i=wZUWKl?tF%HsM#_TC%we6otpILziJ#F$j6Wh9U`mtA6A$6qU0_O zH0C5Rr?&?ZwO<8zN$4*g`#T1`r&bW3J-W=1osSrk#7*p%dk!#aewz6veFDk`{=i5< z0vtTlz)Z@$Q(fUY25&A7@*QhEpy=L4wDyak>4Cnm?|2m&51eMBO*T;3-UKFV>@B8v z-Nuz?1c>;8E>^ZLh)k?HNmqS5jSbC#L~3I-EU77gk7I-Av8a*F+@!-#-FSm!a{28) zGK1_hy&14>-3nUn;YK`%jalL5GIGRt1dNS_@f>%jY+D+Q=Sd{206jAF>IN>~e2DgK zUj#mX)_|u}Iq#!(0_d&0g+~h2$gfpG^uz%fEOiV)rNCTJp0pFzn0-WjeHq%J*8n+- zb6M{J2ew+@lo6c01&42^!L;A2X~`_^_Z;>E))gTuU9=l4%vyNY42t1^wlsaAEX)cR z+QU7cB}DM*D6dvSmfXqqBSNn3Y@WqWxbJ=tWXfdeA?vxs?r9^Awoa#p{yFdPh?A9*ouJD^koWi7WP0S94D%>F6p!9@Wfn&okPJyLQE z`vX`4wrJoh@|i_to5}a8$XY*#WTIA)n8dIvwn}s*pA?^D-|XD#fW3A@hkxs_IdzeUATuU&VA(^P=xa?Ma{2RL_#^cL1DpbwORWLWP8G=7 zpBvcx8W~yBKx5X-456>^{MClEoqIPeC!TO_sEvsCZAT+#XS)Ac z5Yzp#iji9^0teOV(7w!x7k=qI)B5!V{9O7KP5nl(H|7_*|MkL!_JWjnT9930r}??n z-}%e5CXi;0EpR9QGHM$tlMSQ6s3=s#dOk0P(ry>>)H;NY%X=^pR$jQjUzC1m*#^v; zN_MO*88)Ws6NS}kV0!8vdqC<4Cb?IF!a6>)PC=8jb!ZWZt*;p-aWgU6T!Hm-0_gK4 zAWJX6FkFCm+L5c@sD`7|C2cY6NMg4e)v} zkC?8`p_Z8{r2Tye{cqB0{Cc>C`MO;ahr9T!WuE7iN z7{|HigC`+_X@1i5(YaPwoskUJZ)DP&9eg+u^Z?TjNRyF9gK>V-jQ@2%HNb~-2@F>Yc zdzT-~gOvef-RDhMFh8En@L5RCZM})p(+Vn|CT;EGCk=lKQc93BzS+J$P@|L^xyG4Tkeh!17B9^oL6cZ}D<7x|!><8C^{UW%X26R4^Vp zLj%mFl`9d~v+XOx!bx-qpKA>FbXmAjnvk zeU!#8J7h@Vc`2N3Th9A%{so!&T zy1(XBXU9Vw^l}=#Jw1i#aCB!E^<2cp^?7(iV?Lx45nA>}3B%uTS#%9w;?pieUKMBX zWLsxKNrE?)M5oxy5DcayNSAnjujTFh`~{q~EBN*WF zKQV{R`jZMxw;%H_F8|EiH9m#-v`(dGM?#s&AJ0Qu1)zteE_Yv_!c53Eptfdz@nR*y z8E*b7FXjRa-eV?Mn81rOTWCs#I1McL1>&lkV9A~sSfZPRjcV!4M6Wxnai$N(KO5nF zUS5W86P2j>A%8smJ{X!V&ZfzAoQy4`4o_Z?BnJ$1Nm$<{)@x-H%3r&VLRnhG`T05O zF}RC4S`mQ4z18>`I{ERtyZKQmdd$PetH7<~5>B4|22UTFMNXBy0Qp(hVad)IP69KV z`aTk)V{tX0vGX4*marYBbiBcxH;WmA1_@$)SQYhgBV%*xHQcQir;iWjgMe5rjFxK9 zb3w5Bx0bXNzWX45ldi7|sJ%TadI36FnIWcaQJ^2&D?UudA`ED3YtXq|d)oVd|ZslRPmDY}P z4TiwA=eEtHTYGuMi`L@cff>}c{vNDs|Hm$9bm8ukxwta%9IP`U7>T{8}4QRp&}QR#w9uH%0c| zl!HXKLaTc6YC$*>JOHP@l=1T-f|%1+ey{?Hw{g3vI+y28qW*LX`b(dre`?f#-@KcQ z<;oNN9&>s;B854$ZVfyYvBKl~mJ$cw$GDoywDW#d!{$*H`fiR9Z+ZMF?E0~d#+l{9 z^W)vv@zs^y8gqroQ)V-teypW0)zyg^NoA$t!^r5iV<^9v`*wP;*!cP!k^WAhuNT4X zWDJ{pL5e(3*uiXLGr%g~DD6^`fFY&7==|U+ovB&I418J%E_G&9;=3Px|L!M#QhkPr zWjy?n?T2qwKEg77CRM(&0gqoUL7}J8wCAb@bw9S66s_atj&5-<|6m(7RK10)lAHYD z|1@yS>><3aZKBvX zyb$%b4fE`xXOlo>5wd2U6(L_0NZ^F`Om6Ee@?0nujS^omM$(%2K}MQfoctf}Yv)s_ zkKG1S!dra3*x!^=#ZQt@lsm=$%C6=R?7+avGp2j*Ca<&GH23F zB9R!q=qrTk>+bNjFRNm|Y1Cj((*xN0 zL_FXpaqYy1P6A2XywTah;$B-HI48M+CLro(|+TmM(qbAyvCu2wstIWe4 zp(%9dhGLj*^bIOk)uC`-F23hFatU7p(00Qiw#m(y$hYJ|m5n<2vh5kuu^<#qg_L6{ z6GZ!6?t-$y0eErWj>xo&5ecpv6w<~6ru`ypf5d=bz(V43c@ariSw|jSb3pS(87e&U zKE4#afLGxURE(@7#a|DzWqk*!!>ikP*I2KpRff)})5#EV-@-AY@k$A1ROC$zvKHw;ui zyOPp!cSyhW0u6o*F|smSA#a8?O+P0CKc&N1t6~izq#{OrrKHIvl0o*FEW(>|AymC5 zmVLuG!V(_|@bIhD*+ohTG+?)^i^S3ZfdD+ai22CZl>^Mqx%pi^eCbYY-8mh!I zAmmdEKS1y(2F1H$E-xBI9;bmxL^6BXQHQL-(~N$FE~?k|vHh~YP&)fLRwu?2-yR9l zcsmBOH|vlFMLr%l_Lo)N^_t1Jo{Q!G9S7q+3F`0S0ZZB^FyY6xqgLcBI^nk-1fOVt z3jJRYVZ%u|T4%DKLJKiK#DhLOE=696N|9Te`r+U0>AcR<6G?km3_Dpap1S^bg*9^a zW30E&g7^S2+9uHf@RMU}>R8i?stRl{mZVzElSy#-Bm5zA3>rGFP&13$vx zb8LlsBHoO*L;xu2%_C#yw{v`9Eo#N>0+e4P%8j(3WXW~l7rBtwR&9u7^w|?JZJ7B& zlQiiXMMRjUAe&th-C-9bvp9F$ZFz#W#pv_rBKcC>8- z?azy-S9&FEMsYgsQb+TAzG7$MZfbPtDB0=y3*UP>Q^D5}?1cr<=qOdsrZ>B=dxGZE z#XqM)kyQ?i*(||e16%&rfP5$vcB2nIL_^D%7L7c=gpTig#;Ux$1CPo*K)38BC>w?{ zJC<@CxUZUYRdEcA`2Ivy6r-y*=|C+cGQMr=OxNU{btvE5+IWIYH->^bMR>ELN=U_HSezA_?@Zr*b7&xBXOA7 z+pi5yBd2k;e;fyxTnMVtv*^tFdH9OUE57>L3L{?w;K{urc&0NIgQU4xczYo;OTP}z zh})4T;ukPcG#@=Wa_OG)mC*I{CTlvzXBRD)LxS?nFh*}G{i!Jc57H={PHF`=u6trU zG{~H2-ot(lea-kLF2c6$vDI*39j9>CDqyPEb^*b2BnR0~T!l3|WtDXwbMR z=q+1-o<_)glNZ4D39E?f*l{*#KX+!b2!%w$rCi@njDD>s0jcH3*r?eP$)nFVVacr7 z^i^R2yx11W?G<%M@^2TIJG=qU#{PzXhnA34Ap!XN?F+265F{errL41QFf1z#0NFp~ zbXQ(SjsB{aa9mvkW?4SKjI2zky9HE3*9jz_-o=sBYMB0780SB_iZ><>@$!2Q&>#(C zsx!Bz1}bvNf}%C#$bpq~ML`datHh9=Ko`2ta|5=mW9Y_fC8U4(U-Y;-jS9L1fTLF} zHj;a&mHe}2?Ry2Pw@i;jT+E<>dT#fW_Y>`U~J;}V~^Fj2*4RmWRXMX+NifIyG`2pVZ=(%G~ zAT~>abf{con-dH8$F|6jj`El2wc|I2Y||qvW{Hxp-~p^o|B2>Os`TmyN&M1n!ZwSV zlYv$@5}SA%NM|(JD5OP2Lu>hO*H6HqXHVHq@kG)+Z2{97JItKziRaGP4_G4yWfFMj zKYp#_490ugMAEZA8P~e=nYd3%pno%wSsGjePgXG`Xy;`Z8K{7E>2zvmmdTUzoXjRz z2$RYKPH2!giKvv-v3Gn{Qh@{eXi1YBIPBXRvQDOlnbL3Z5I#0~2uX;1KU^t5`1qGi@Ze$_Cv1kPuO%q*fN z9L`oRv8R8255nYj%En$EhCpROsNP@ATt1;kR-RZ$R=uA_Wll28t+6@edE-Y+9n+*Q z=Q?0#nlEf=YT!k-J2981M9{f&LYT3B4!xX1Ka{vpude4fDXx`qeYX?KLKJ}i z*$m7^JJ|p1D{pS=Y~H3D*C1=%1@P)OqgJCryiX6U$a#-e*5_IRO;PhD3-#6DZ2K3C z5Sm4U9@?>Lw{l>rd^sq3<-?W=8*<9Z9M|h9!p~lRHo#^ht~ZyaAw|nk=bAbsuj~Xb z$5!UR@=R*1bO7>ByTUJ*DRkn5bG(q4a5x;O0{kaIa6{6GJ}umXc`~k~t!M&$ad!Zo zt*^r&8(VhY2VJK164!BCT1peNs?jsB6k~kkh@yxI3Z6Jk8|%Fx;>Rq|`q+v0!}jur zXX{hT1QAa5`3iee#prC0neXVn!h&>N%f?yDGT0PVLE@%;h(2Ds4W&|_I-`}#=?AQ*BR&hL=Wa>5ZT<&#YEmLR`l17Tv0tp@#R%@acNR5y9B*g$eCAq_ z6JFTx4f>jzK}uSbsO*g-*`0S$&oB=PD_*0&MiD+fkp{j8_2~rT=NQ5D5KMyK;Q5GI z7?SdwaWaMOQwf;Vuvp0=i+xmlD zSE4}vE#uzlTTgL9b`5I&G6~-b)PvR$0T?vX#r7l@8gYFFX^`w;U#42XizriaJ*fn< z6Xj9sd?)6nE`hDJ{y_hy=sf(fdfzy1CNpJAk|Ja^R6OUpjdo;@h=%bsQi{@0ksYOo zkdZP{gd*!X*IgPET1pg6DrqQ{7W$pvAK>-!@;vTypX>U3-tP??Y59MiXrtjooi=U8 zyM}@^xvhe)u-=!3*aecyj}_q6jGMS%wg)UWFv9S=XE8U1A8uH@1R$-!rKB9)Qfl0(qydIp-uHxTFEZuUWq8-40^9(MgGg?h^cei`h*%*K6RrLKG@T8En%8CI|^<;tz{1hd$8B#eNo3Tj@Dk3pcz(InQPYL%x?AN z)MvF76H$V3VLzBVX2CK4LU_&QG#=f=aRQZ3f|K!f zln=>*Hy&Q>X3ZwZa<(MN9>%z>c?1e?aSGVGiRg+)aj%jgopf6qmAZVvZo3}cCsxG< z#zy19g6j}M%RyN24H$0iVfFXTCZ^nHwD7kb8o9lMl;WQdd}kKQYfhtfnNwi%`wwi- zyke$u(K<#zV;XcH$Rc0fzsCVR7aGp-kUW2l;sZGr|DJov93OQj0?#i&fwm+uxxJoF zX~;nVGi@^cz+P(2?d1-QDFE3ROX{j9W}SZz5d+6TL?IOiF5YL~2T4&|S2Z$TG=kFa zLh1f^B^Y$bhD|!N*xM3zO!_`SX14Efx`20zm^;T&>&PthiX4D1ovkQsV1ezwi_qH5ju^$WKOou#!uRYbfv*>=#>v(E_KzhA-7YRS04Vk`^baGY;a!89rdUL5E}~SfIzJ#h|j(n$GyFO{Rn&BhQykhtHg3 z_smBgJyDqhll#;mTyGfmOix6&i-Ppgr*3>_RL{1r4ujRv0-*bZA-^mp(Z|LIA){+D z>2oUp&DeAJ#8r?EOch7rdN*39G>5WX93Ol>`Aue?F=m5T!vn6Z@}k0F&Npj46~Xe$o9I+IPy9UHtkMf+g43S zgF~9MW9>AMsV?UKD*c7ZJMwr=_qNjNEO|P&|2)35r~|`^cJ!ByI6r^?NunWnkaeHy z$_&0e$~-sgfVN3OPH1Vu4qfnFp-!t|v za-x44rjUV8%Zb**S;URonW(qlX8NpcFk#b0MtS-{aG!k%3*?@${vp!z`-mW%YW5>9 z5>&{W-Yh0={xPy7B^9OZOwdoeu3Y<2=iR8~Z;)dZBRAr?YQP;Eu{}CP-cHhEX zv%28gn_Ol^-Fo(Uc@AScAjpc>U826pj$kvd3+ilIPLSzJE~H+QNqca~qmMfRKM*ohu&xu8l+<#I7@wmJzt zRfSqQGH~R;4YMDYLNPD6fRua?Ci`B`WWu#Y3E9TbP|mT%-pb?kg)c{&KdyM>;z1~= z{LTC=+C^vbb;-iO{jmHo1(#7hx|;jGPg!*si?=Mmn~|sSF7+nI->!kyLS?!y&6sX9 zLguvFd+xdPmHWM<*i}oXpz_>wRP+m@kLB+m27N+S(44f_9s(QhRm@VUL^gcY2-+$w zM7dmX5_hE^t3L6ubnzx!t+EFCb#}t`+-Sx^cs;#gnvX@3vT@)~DL$Ka1CyR`yj-Ce z@_Eh?uv@+vFITRCHaTS)y3QDt7!wi%J3x82Bi(25&usVUb)@&GF8Suoc@2&o!?p)D`atMC$gwmlsld;Vab)J!4k{2a(wc?&Mrort?u7vse9>)@-g z2V-u?&8*#X8K3v}*}_|i5S7Q!twez4s7cW;|7GzlUA0MCxEATVQ^3{^4&!UxNi;rA z2htC|gzKrl(A#t&w(0F6r<>cMHd+{F#U13j_A4-F(Ob4a{UX*syat*dws5nTG8j%O zpho5~)Y#dYYHrq`!>z0E1^v#pI-X)uxo+*WWh)t2^A9TZo_yh7e%Ocu;}1-I#w9`XKFf7ZyfNs22tE6C3fn5Bi)}>{$+wvQ*yJ0b zZ0I2=`mr*JnZ9Q_E(|`)t~OURJE^^cXLd-8R-b;14fnY3TZkwQMhxN8?rCTk8%B(e zThL8QAHeu}Tav7;Mn&5EU|ijh-t##OH^SDifr8JNtWTn-I@cQ4Wd*^_Ls6tpZw5r{ zh~}@_rAXw@)?&A4Hod)MF@Hm~61B-a#>9UW;O?9j?797i(L+fTZF@?YUtiC$@*nPU zUYS_t(bXziZnB#gY^y<&yhP}Jl#H@YsmO0i=N}YVOLV&Q**scIlngkZmHh*pVtNjb zS#v)-V*ow73TgC>>rgnU3qEK>VJ)A}W}Qpm{aAbtT8c_h+NhQ;kJ<_;Ljm~j%Y6EE zxeR@<>^Blt6vR&_V|tY{RcDwZfA^3dDFJl+@Iyw-Tb5o^ zz0B^8=>lHVD!e^qGRb{dg+J_;z_RRBxa`sddRVd^r)Q**3u{#AdXooOIR7=r+js@n z?atw|iyX6~=RP}76b^z#)u=i}fLA>4FkV(2L6^=-xPMF@>Uw@+$Ht}Ty=E7h&pM3* zfx}GbWO;14;!J*#C0MsYnZ1{Jll`U~L!{e!Fu+=Y&d3bLSHG?34#$T~`Nx$UV`~Vu zZVy25ok3Vwng^dJ|Kav16Ny)|BiV0z2VePA&;sYrs7RL)W1Nly9NXlW@Ej8BqDp^i z4dN*sNxFtzN2l98hfBgGY}XNPZhHDNE*5!;vwf<-m#+nG(tLLCiU{4rzl>XiW|8Qo z`E=_O&O`9q8!H}6qC#KG;Ns;hxZ;{l8+>-s9~U3vH>2M;I`uvC^F$k*Y$#xSrnKTM zWoxo;i3tEzCf(wb?IC$R|Q4(?{O z;Tb;g&VoIiBJ}hGX(C;k%d**9+4~CuX{)Rn4!TMruUjB&L?z{k=3gkfh^GS^b zaogy%lnT=_=ZSdT;dBB$OB2LUfaRXnE4*Ybtzlapa2n? ziF4A21pk@izzl!7M|mpoKF#%3_Hy$l;UH+cxryA`l@AFYw~;Cu z&GaX|heFAvXtZ@A7X9^w(b=L390a^jqACI$ z+jUhOEPbkg?R#=*?b}!Einp!s#r-Yp;5hIpSwr~xdMue}2J};*37K(9o6dA8frEqn zZ0y?o)aCUbc=?yI9bcF7Ua0AlcRLw+Z}kMS@v01!>@0%qyYIluOSEr&;d~!&>!;Bu|ptQ?{oQ=42!hO0>tt0&~&U?hkjCMxjvm1kQgL z%+9u0gL0qj3AcbDOW&3<>D#_=@0Q1)=yw!L79{}DTS8=hKE)2LL%3eF5yVI&>~WYz zE?)Qtb9CIP;({Q)eE1Gh6Xs#2n#yM?HmcGYT=U?o$xcSE-<||?S3!u3Fzc3Afxbe| zanI~+iA8A ziq1=BZ<*Q?#~1!^zTh_6$7nU~5;F&VZ8V|1MGg; zv4LHb`2n}k(|ie|bH0W>vt}ioa@mWn_6#CZA)LNHnTX7)_4xR5JllTBktBGhfcC%5 zjpDi+hus=G0ZHiZcgiNt@5fnx~G zc+av0`AhJ;!9v#haU$R2iU=zI*ox%y#8{5~`)RuZ86KNR zmG`<4N%cF>oIQl+u#@NVErQ0W*Ru;(o~K`P7ZLO3hmCEMHlv2*pRb487!JM zg)IEHgI<{FN#pnEF&7_5)3~j&tdg!QIXr0ry+30q4G`x1OeepvpH{~ZF+)X2xxNYa zZdIYlp>}4UE!NRSlVsAO{ukWeJ^F6dpn%r{@Q$|?0_~s zKU&K>7P<`t{z#zVZF740z(e-ID`%=SWJQfKGMGJwl3_&05Dy%RVb?s@$F_;ZV7o6B z%EGskr&WlqNtMv0p@uV_rb0vgXU>!NjF$utX>wo>$I?9r0(*UkZtG5VPiQGV%ui(! zYzCN+vunus;(6rE9#?GUcpNn4K5l9C0Ow=p@rcz-!iM;>oqH~iX`rJ19$k&V66%nIn<0h9ri-mg9sXAew6M>2_^c?ilDc7FRngp2!HN=#?jCR z-0o#Pjea6ZBDmiE^QbyVP(P3N-J)QEWh8pVR$;0Rm)+U20t@4Fn101p=+}CRQ^)Wq^Ro|qMj zhe{7H=aOX*YeR_m8wU(~s|EQ^CSa|4oGt&g7mSHLGjYBTDm1phs&EzRuDOABe>;J% zX4=ua4nm;bUIPQAZ{WLb6Wh33hzvA|Qs=Z9cqQ8du^(b#P04wveX)oA@#zgToi7H> z0exD%Qjv{VKF;J9s6ttz6I_?Rz`Qj0&CYSD0nN)NsLqlHAan2-bV4Xx`sN54^?mHi z2X5ro^TUMi-v_fs#ps9EJMb~H3C{}Jg4KeTjNQq(G?zI`T?~?7qvda~3=v~$toM=3 z-bb+ah%xT)u7|Ly?;y?n-F6vr{5Pv}xZ_Pa`j-W9Gm+0AWy*PJ&0IiGQJ5&55u(8> zL*a;L2HA7f6W(t{}ZF; z1fikkI&e{(ic<0isn4=T_Ni+vR=aR#-n$-DpXkmm@DL*zUE*9KvklxlkAZHXIK7-W zfgb2Lq!%8w!KGtuEaUbBbv8M`*P2l#a@KoT=obosS9h=lnMb(0y&biU?1P!1vLqtd zl~(>)j7uj;QpJZntRUiGo~=q0Q{OU-f;;M#4C4{)Dp2VQ#bbUfUXfBHl^oBtLT?i= zxl`%*?io~-WA{`9euIBjuTbN-I9=(Zk9IruqgTinyp%Dg!^hvj-%GNjVd+Gy zRU3xCCrq(9z?ypgSIs2-PQVtT&loOg0?~cLSbO_1$cW0)sh)yFyE+L5D#{u0ea`gD zmnIOgk|8H&hLcOH{YXNFC+2sS1Ggo`xXLIhKF^RSlo*qf`7P*wpP>)Nj7j#{N>s}b zrS`pnOkB_vOo|qzJd6E!|8gKBTo=kuk^c+4u5nf;iYsc_JE>x{s!*47{rri+kK0iwU>?~fBusbuW-;M2m1*$IJ*;VO z3a$((!v!I`;6~7KR;(eD$u?+#L}7pYbwrfhKX-!MN$liHUw@8k2WJwIE5>9^vJ{!C z=LUWnd&$Q+(@1%s5q$V__D1k??ZU@u7kQsWeljHubEtU^=V>jTPgbtU!>xhgxaD^Xdd?LjzUR-= z@STP5!d;PcZ5Cz3?RLQLs|M_7;#z!N{u8=wqS_|C;5#@Ryq8JiMgm4vI;jj81YxVeu(Pxme5GsiPV$Zy{!D=PQy2y zXC_QvOedaDPA*mjlm2*IO*REx8RV*T~b|!@ji3cplDY1!0%ce3+)u z4zt>NS?1~;sQxQXdQ}vtQPXPr>r4})`9r_U!FktW}LG(N2gb+>FF77_<>)K`L}Zua#ydmJ|?h2s^k zOYlsz9|vR4GH~9GlDV2}gwJCTv^#(!c7pUHcVEbTJC~Sl$;UeR^)#b(35=BmQNNdZ z#CdBP$bRH@5XbZ(JE{@&H|N8>d5Nskc8d4bnbV>N^Jw+=eFR<4V~6iWw9R^rBac_m zTea8C%5}N-{bi|eDy)jJW_s{jpe$qfG>pzPa-)A+&at9{ie#`(hu*k40xcza7`(Ha zzw5Ok>8sSDbJk3SEw`=MwyXi>^sK|Mc&aa*eyba<)SN=SBaP_QqeI-(Fj2Yl^b{3W-+9 zLA?SC(lM9~x!*Y!(2cJ+D)ftKo8^y@ubfD}NFZHw;VDB;+(75!lgL}E&$vY?nDmlE zh}`?crmWR4r*aDY$vH~)`n|@QCjzi&*A$vLNsS5&oMG3W;A2417l@NhL6=A;Cf{A0 zcoYZ0*&b6A=S2aV^%e(tZjjW;dDKiCz%L~j+FLlM({MA~Yc^!lrgx!(vm+Xw=tAuc zMtC^A71BP$)A&sXae{{f3?8BHLzH_lKW}8&u#$c|0@ZWNBE9wBXe5i#bXDygbIy1pw*J3a~ z_I6#jXOTd`bX|(M~*^ zCIvQk|A1)jTC6Sn!T%)H#J-BMhudA#NsIpsdX}d{3UxgoK=KQ_o!L%wN5zS4ib-Ri zVjDCa-N8x;5m;He0fO|S@IX}v+{jdd^2(X`W0w(;ljrubq2Xl0(LIp-stJyIxq-gz zT)2Eg!7N^O7~GcZM(v<{Oq1Nk_DqPR3)xYaoqP(n9iEIWq2o|8G>N1scfsLbH=%!S zFKf^{}H>Pnb<0| zi1hcC5Ld42xLqlNUeWh~1f?|kUxVmk0lk}eMx%}O^4dz{FKIC@YwCb<|J!MbgUpfR z{jk3>7tRFph)3KV9J;cIT-taAW;}fg`)X6j%9)4ZxQ{LMQV<~iCHWBk{U>aDTE(wF z!3VK$6Z&@VBTy=+fD)M&EcORtY-C8cwdyH%Sex$W)FZ&`ajI`K}!}paJAZCv> z$#p8m3wzhYj!(z%Ph3%#&H3Ek*0rE`)X8veD{?DqsG)H(8l-2p;kmfWTk`oqg&J>ow~vW8az& zNwO_W{N9_WqG(F>4>n;!Lprt}olbtsJE2U!Hh4P4)6aIL_&sIQY^P{FZq|t= z>vAP=e@ZJjXI0{yGjf!&PW0BBDza~18GfBL3YHcp;8M&y)MyxH8^Sc;M(-u`(LVx` z%-zN#H(E`@&gsCbDlM9|LYXY&vKPAzxlF5=31+WugUKV?VOHRE+}ew@0ICz-6?ST|&=r{^eUixgZl|N5t<060wAIj_+lU>v#J=`sZVG^zjeu z`fGvL9Ro0)>&)#_+e`wFuOdy~o#6gcL6|bVmvcP!qNdSBjEGna)7IOvexwY=#tNbQ z(>yx5q5~F)={tZKyX;BYpNKL61qtgX5l1SR_uXw(ljeAKmCY?T?J@3nwbM zm?46hIZUSAcU+J;flBW%C&vU;iT}fTtZ*g7diqR!Wi-kPaqN9}`(@NbG>A&R)FSrA zC7@mJMY~j@ad!)gyNs@YTIvq=L7Wi%8YYZ=A@k5^T$t|O>p$!X0P`gq$^!sva%4!1{e-}5QFbk(85951Z&p)j#hFJ-4i9Dp7VZIUlh~NohLk^3i-yil#^XUrBvEHFh{zEfsQVAn?d9m_ZJJPD z=f=*Q6-O1N`k?n8cb@KcBjOw9;L!6c%<$TC5O*R27cw^3BBw%?Jk!BYu^Q$P33_&B z9KCa80+m>=$h(%Ih?S!es3^y9Tr2@zuR#M@8gd$gu1Axs>PbYPRF*ecO_Y`vTp$z5 zq_~dU6zoxqMqg_{pUifM^IC=FH>=>qk!d)Wn`_o`z2P@aCVah*VpLZ6H0VoSgVeoU zkle(_SIV*^)6WV=|DK?8e`e#?yxFA1O^>%WI+xBm8;qLD0#s&4F3VS+3>EG@tnA1} zd^?w8F->r1PHmQfYxX{*V@(1!%gT_lv_a^2F_S*YlO-1G(~$8TEoiMvk)R|IVQ{|+OWpE zaf)RE`O((N&ioSun|@tGaj8!r>E8ug_&4CW!VK8Qvu*#QX%mg>X`&QoDEz-M~mPxB^uFX7#4QX-j$1?WukNUVZ&WXhgHm@<42o-JMj ztHFTu#~x?xj=hDs(s$ssaV#!6bqy2F-N6}x2cRu6i2vJs1DI3z(LMUN_bKuQnaGmhWT{j2o#xV!_fe5_Tw*gW@y(({`4{- zaQ{*W>48bC(~D-F$5|;N)3luKmH2{;h&m)JQpKQ2C*b<+a>#Idgc>ah=%ydd?!E0u z^7qZ+wA`Y2=YTh6IU69v9iqw^Gl{iYIyQap!FvzC@IHhYqQUfuWZ4Rq=B4DYDnrMp zMqe7(z6&Gk`0n(BqzfHnCOMks8Ml+?Tcjy?SIAP0_#zBz>n6>>V?E5@i^xGiErhwmTb5Yg1J8$;kvhU0IUNNib)xS4j#oIuVwygvGfA|oQA2UEk*&LI zPg)Zz1MaC-G*Wskyekq%simFZowJfQKc!4YS|zM|dYxSo-pp7vsld+i+gMWoB-bY1 z^rC?riQA{id4Wv{+j{^$LKW_Nycfnka(v;v8f=r$Sr`%AO}#tPK;!FN=E%@)MyGNk z9!}`SU`1{}qhko#Y$GPsL=eNoYX184VSHd_2O7sOutx6<83DJI@YPU>2upXtP-7fs zPnDo$D%(hkq6pTy?}Hsux8P@g01^8uK_@44!p2%n6p&tsMOB+H%hr+DxZXjT33p(I z)Mv;qNFlcu#lmlqbdq$mlG}}nlO5T=*duQ@)60QepE~b8yfvFh*SDG?C&R{eRE}=z#%5bxG856uIo@qZF4(XK~6YD}QM`t>+Cpc{>cG4U`D}5;Y0xlrImuIG6&P%uc5-+-Ywnn0*-I|0uNtE!t(|nDi}h@ zIlJjJ`@9|LM#(4Qdt&|jvb9@Gt8A`nNr=d*bf>io)SvjL{)QddaG6=1UI9}+deBQ17 z8_6HP9t;%-13}uspYtt<9Q|;d`ddVhmHJolae@RXi_@m}2Hu0Q%qj3mYGc4u2_{aL zKsl3}&{go9=P*eavn(F7W3PKq?PD^rk8Q)b0WyqZsU%JRx)2t381aT|7L$asc+LaP z^#w^UPlWTUH8_Qd?cd=s`RB%?N?> z%X*-?d7RmMc?+J{cMuCy?t%Q_PE6zX;=`H0(CD)TyXL1J`DHT={QmkA73&drl`2U7 ze2IWxH^1TnbHFAIQJS#(11r^)Nn;cxsqdG^5HVW8s+y#rMX5KD-?@^sTkpZs@!QF% zk21`IO9oJSy8^$7oWtc+cX{Js>lwQ#Vvx|UMv|Y~g3;EcP|oG~1v^B!GyVgF82aa#nCJ&x@0zae*ERB!D#WR-p zs-~1R&aY?P51W#ir+Of@yOD=yQ|LTNN&29p2`4y<5w|xKgDMjl&r55FTV)AzaDy-= zN#xP64a;b&O)%N6V2>vHd!hG28B~AQq?3F0(6v!FaeD4eT!YaNxX6OFeJ)E6|0u?R zdKdPa!YgR_*2J;G|AK(zUG}yACIZ|(;Pm62^pp7`cs-PmpERY~u^vzR&7Lv+46{LmyBGGe znX{VNnfWnL!o4>|PFewCRW{hxQp{}l3nYC?6w0r7hGP-&kkPi1?)|TwaSO76iT18U zhdqsL^Uia-Yz@Ah?i}*3D34v>Q(WIIAm4bTqXHHvMUs2n4s?ImBzRTFF<~~ZrV&Z4 zY@6sRa=^C@*ZH?H0?u=Z`uS6+u6Y->y-cFo;nq~6^EaI1c8xFGe87F@V(vb=oMPP| zN<0iDZ=S}|NBmp(K0=YaS?EL!UcW~TU9M}h?+PBvtYzrsKQOiVJIqr{!CyXe>A6qA zFk!(Idf0O#v5A_BG%px8q`qe^Et8<@n-BA$K#iz8FTpKu7Sav8laRISAKvy=A+>ux zpvc-BCR$Dtg=IMIR=^f|$^10#`+Nt|T%D=j3Uk=0Q^2>0X+?#7lh{f@D^&_C2j(YU*a-wYB}G2503+#wjQ4*DHdw-VDyY z5r-xg7IgF_*XO@Aje7lwr9Up2665v(=Hjj#*tPr$wB$VIKk+=kQ<)mc=zkJHr+W_c zlo>KV=Ln*ynG!M8w4@ikIUWkf0a?d!aW0 zM0im!mBewL-8_{IB+K8IUE~{!pG*g_aOE{LHP1%oyBzC37zOLX5e_7BE7uz_{8rTC zwLb753k595+#kVkkmIQOtkJ@U@{%a~!3eiJIgisOT!ljq{D{w)99Xv4o_ujU!LF|7 zoV?~TWdEx&xaYB$u8MjA(urCaKX4hA2)dCh?i^U8DvNyX{akT}7xlJEA#&MVcu{>D z=Z5Dq`(CF})mRPcwQd?Uc^Jx==2SzDc^%j=)%Y?*jy~D56Xzv3;HlM#n4W9P*e+m* z@Z77s?!3jQ^xcVO-(5kk+%7c2u|IbVGRpHl!m}?i zgtN$@Y4B0DuqPky@twif+#S~kyufAgnq+lH18SiWHcwY#Scg}*`P5b32CaVfjmiM* zwz4M+jT7LeT0PYpQldRO;xMNDBdBjg!go=f&run`d zOit)Q8tQnGI{pm9G=X*aI4SoKWJjwIxO4#F z^~!)E`xzt6o}se18>-3@dfMkJ?w*#7AAAP*3ny|}mZj$iZB-|g_tue3>UpR&;X2kI zpN*u0bDkQW!bj2#Ab#K=`Me^Uo6Y=ScLeIubg>#H`AiNuwE7)1yJ=BT;cK`e-k&`p zs>)p2Ed#PAhM-(QkF+gbN@Rqa8O@c==#aD>)^NEkA6@Qzdvy*imV2H*+DqdZ+;fyVamg z{VF^Bcrm+j&wNOjI2k67-omE!(WJVdl+~Sg3tJ*)(Xw+b{9E@A{r7TxzqY2PQ;_&}|X6M3tL&%%@V_TB;5LvimO04hMv3Fym=msro>Kb~Q`FZ<1J9+7JS{9Rr!FNSr zLEIvm_*jr47MQ7$t=n&d>##U$`12;rzdD32 zt@}ubQz|oF?1_befn4@okdFDqG7|rtMdrzA{!*I&up7M1oShs_ru3Gf=$JQKxX}^+ zT|CO2y9arTFGPa>ayPo&OOiy4hv4?my?FCp9R}rB(G|aS$*0gUoY7c@$PiQ2 zd`d02o-JUOe=3S$WUT3G^@R|A;x$Z6dCWBQKH>V%@zk(07LV@AC#f28* zs=v!b7p|{ieC-fzUm`(+&nO`8R~+ig7lLBKI(A`fEnI2H1j|7_^J=>RdFi4~`V{*a zpAF8$_LMN0@Gz3>OL8KE{+4Wi>H*^V`#6rC`V5zfeX`IOekRiwLN3uE4SbRCBrj ziR;!n!KIUn$wnV3 zh+im1iU`%4+s7}-%ErW{GUx&$?B>-{)Zv8;*=lA1@Bf>|V#;PLs+@&aw*l3O zzl(0u{6KzJ6^7h7jDaJ=tUH&LeEVcIof$j~%jy#@Cl{VL~R>OuM>obWSg@?@FfCTDUzrRQ*Ye_z z9Rs^PT#n0W8re4@LEJB>vNLmHiSP7Lvrg?*z}(YA`^rgRlD+;7jTd96mgS8-{hXQ!$E$yD+o zJ`KM6euSkfZ=?KoHQ0AzKCN_g1bHTqt$UEj_PiW~^erFp;g>Ncpk)C`|9*nML~aFs zc-+sZZ@Gj)ir3MtY9fh0XhQ@-3~1TkB$$)pPp=5p@*RETh}bLc*`A$`h1?#M9xMb; zeM91Aw+-gZ;~Y8zy%5})ftOzL@vW{sIlwVcozgW)+_iM9Q?W$`78`IZP1J;rg#yZ1MJfBA!hC0*!xSo@S(>Iwzk59++2}w z_T=w%D1G6^Sbix1M~6eKiO)^2jON4jj$kNV@g1kVFeK{7r;zcBoYQv`0O+~)Sk3nZiQF5}0ZV3$yd_tLy``SO@(p@6>>1jye~FXXBIVt&ooMN~8maEniQ z~YPWtMnxy<62t65i*Hck+eE*-r+<|MGkM9r0RM3FAKQ3=0{66%#QKVkHWnRIY* zGFtve*{VT41~+H&&vARx&yw%ZV%7kRj2e-8dwE*8-)eEkG(&J{JHWlGQD$PRA4+W4 zf=@#}o9&(*f@$xD*z?;N6xF{DcWp{gcgb|(^-YvUaQnr7p9A5oKF4)-&Va(6X&m5 z4?@Mdf?k~xN>F-oKymUo(Syba(?lH+-}!42`$WGKyKhUi2s;_SB9df zZLcchcjYx4|0+r94{js<>o>Ax>Xx{n15xiiH!BMk(Zt#e|Spl^C~ z{!TY0Nsi+-InRKl^+Ie&r8vF$Op!R`odb=wLu8TY6xxt}iYHVnOD72w!(W|sR4(}t zU*XPl_+1oAClyCyOU_BU#5=cZGn zVY64^`1A|ld2k1l<`@tA46pq)=!N;F2!Z9sh;*|7+ zQ41QtfH-G-AUh88pIyNX6Bknv>oaV3g(dNw{ecNruz;>NV~q1y77ZR6WB0xeU=Qk7 z;*Tgra+k|%|F`}h7`?EkB^lkIA8vqIKU$c*iUpwST*Gv_JJ8A5rRWr|POJ-j@Liuh zkkMpnWUl}rE*Z4&&QEkqY(ocSahk0180#)yhU(tkWUx>M^7l$p6{AnMq1Oo&@`kXQ z^HcDaEFq_@Cvnf)cc`QJ1nv!skb9#B)MAwBd@h6b9e*f~lGv6W}}mxIY{*5 zMdo}|QIoM=;!;+P0;M2T?WG|dW)tRGEqGU=GYs9F}xo#$)q7XmNokJYA zO$6mjr`VpBtGvA%mFOYY)sP$JM0X!ynU@N`P<@*skr>Fqutfs+XTfxGHt`+$>}Y3s zD_fYHX|0eg6v0Y;b>p~5x*+`mnb?&1aMH;bvm*uRl6&)s?06!1->w0VT2rw~X$rla zqfRX>dq5?#2~K(MBnRYwfy-7|n3{hI-$iuOV`eIur^paOJomn$LWxj9rBIqAq|%@PnGz{vE+L^ZRGK{ZzGx&#=F*%7A|)D> zhW~xm`JFfC<^McytSq&bwOY@!@4dg@&u1~&RHI4q_cwvPjszLXNuvk1Ik1Zdf>BRx z4_{PeKv;!==!&=@4!{QN^|?uOj<4yHK{#gt~gg!Z-c% zuKT9fCVEQ*rY*5t^4_PU3XU z(C+mZJmhj-Qe%qr^LkmH+CgpBH9r))$HYMQq#%8~I)iy&5=A~M-RE}0SuvTXra|Q+P3%!QPOq>F z$kWHYHP0ruvF+bhL+ErPddiUVrKV^wKjg${hqFEq87UBtbENTA9_ZsYgmN!uQL{^L z;e%WSGmqm7Eng^07S0;O;=w3v?JdM*71@+oy_T9R@*@_Cr@^-)0Zh&>plv$8aI7y0 zSrZ>zT&qMqoXufzOC#KKoD3d|t#F666@B)41lsEC>Dn1f;Ows%WMRs9vUk}5_Qc$N zELa~;Or*l_fpRmO7*Dm%RdebPKa46=w4LlBsh^@CPG&u(iD=GB}i$P2|I;dvod6WlhxZNE>4iEk^Ro-m^zn++=^fe!~9! z%<-F-SK>AqRnq*X08U0IfNt9bSTipRt(?|SeKA`+6D^7&pEi&u>Sn}SB%WgzC6Zr9 zQpgFrSa^R-m8rVFkGrW|VJig|GL2g&lYMSs?4*gep=+-Wz5iR5`dx5?G0CkU9Xo>e z1oG(JIm_@*zAt^rT0-S(Yw{{a7QM{viOfa;R<=ZzY9-Bqx3vzqK2{I^STw->yN)JsR8!L{hq zlFdCon$o8`WXbEL)2L#q6#k1iOBUCE1;{wdyQv~VD#j(_M6(uVZ_^24qg6^PET4f| z_80tf@jD*aJqyD+r?5T8HE^5z0E7f;pl7uyM7ZX&KL@VDfk~!xu6!x`%UuqA);_~; zgJM*rMgr8g=+o`~LipQ04w@l~E&X>M-|l(OInE?u>6GzsjAKr;+g2i+oJB6qH3OaQ zG3Z$~R3lm=!YI$Ig*6FPur2K{3BDPNuIDq@Oy5M(YB7OM)E>gF<@%tKCrMT=FU2dT zCZqZru8aQNls?LBh9&#jS;yy;?a}g)c@w3+Ai6Ul2NrncLcW?Ct{2|~=X=udQ(7wMeq2flgu}^{Xd$}PF@Zd63ncBL z_aHrMA^zxVWjl{8B+8rQ$RNk`=8U)W?Ack&;IJlHAnrm!_6UG@iWMHZ6a_Qy+3>%A zx{6jWDtWvqAsoY2fr={If=y#SpNyMJH=k6aL-F;vG-e7|&wG!4b?Nxmp%fLxljufi zU7}m_0QR`YqQIOY{zqSe>qG;Yhlk>5SZzE)=q;u)I1&~LNkPt!Xx>htGUQ)g46@N0 zq;7>SrIQvzo~<4DEjJ=3#_3Yg$rbFJtsDaI%^_H8$gt1WU%;4(Vs7SL#GYO_o@~%8 z!ETvf%&93G(QM6OTygL;ocsyoMZ|f~-S`N)^BUntAIAsU_877fMxZ0(5M3ns2c>+c zp+&tSb(`LWi3xv@H4j30wP~pAFdu&CG=gXm#}#k0!LXipTt7(-U!_H}U7xd|KTwfQ zJCg3*uY+1* zCCJV*W8E5e}qR_B}eDgIX=N~D-(ABl{+H4p0z%5boL3K6mIlZ4|FHokp zC%!68Oa1lyuk_FtctbqtV?w@ZBgy{3T?` zK6V<6t571(Mm?xrVLD!0nNDU6TF|4NBE;BaDs6#Iyi+@uHriGJe`g@E_Fsdk)$7QX zbN-}p&j53;4QSA;FzWuP6QfQ2(P%82uJhoSDsN80JzXIf_dWVf*zY?$;7muZ=>+qUXswERKRwoM4V z-+OcJ&{g~q@n7u2w}I4fsU-A2U(Dri{m8u&(IonH6v_UaN_Xu_fLfKeaR0|7ayr}# zlm<0$TBQ_G12@tl>Vlv36R=rFgxzvv5-F`SBH#9wz(aN%Ej<@S-+Od2((e{SgNruZ zy?+;od^wDDQ^jdnhX$N3UdW!=ahvNcxR7}brTprHYnZoT8^M0dGQx_#2SNThX7|Y& ztTGPddTz;hA7%YVa8uK`SPU4{yd(=mHlGJB~c50oRlp+_^q<1M1v!& zrMnWw9+jtSCLX|LqIpdCUk&2CUhP`` z>bwQXq*OJ%V76cowpl0EH*sCrFNoFP(cHucR>R-nP2g1nS zB@>DCKp#X4O|RJ|qe)IR<$>^A0Wu_B0cqZXRIB&}KiP4Z)%d*wezb`~o91HXFPD{; z_Zm+F7y2<(_x?apSR;Q`#cc9X@Ee+CoAB=a>}GU-I^(0ZT;3DbnG{6kGHHd;r2YLQ zY;@A0lgfq2zEK6tySjr$*3~j_<2o+Ry}{nRX-5O}#py`yHnJgk13qlnPo|sM(xi~P zD4+HKzc5BzHnxVZw_*X})&e>=$DS$JV@Rv)@?l+;3zw{fZbqoH;E~tvd zv)}jE*y`T_*)3O5w0;{@{_SGGMwI#NDL{`M4yJ$2v+%|gOLk_KIDMtV&9`Dx$o+?9 zxa;VZ8r{PJbmO*md=M$lw9B~DYOS?&*Apk=`^F#bCWjNn_=B)HFBMn*O$EIJb6Fcl zIdZSI4;47Jlw9^MCUWlyxRTV&cDAUKj(9)(<|1tL$#rSSd*sNm!7mkNJ2lsThwuNyS-LTHw1Q zp z^JdDzzy81M`%`6L|8O1je_c!Zw^zc;h~@B8=o+ssWd`2Aon;dnFUd|^tH~>DoK7s4 zt|GO$r-a?Y>aX^Z>xJdz-_tqe$m4wEnjjSzw z3sIj|kj@Y5Fg)-pU$rU?&efZ+X9WA0Z<@D(<$8Fwaeowh0_ zpk0~+Nizv1dLhCndPts**p%|blc(bXYkjhU^MosG5Jw;HEp(LYD&%;G63ZVW(3j^( ze3zy`^pTacmfi-jQ%kYHUdf(xM^Zf-saTLfaG6>BX0AFuOT{gsWRazyfnP+7d}#9oa*+y&K{7K?nI24_iQ@ zV-q_~Ig%v)^x}Wl`~{CaTfuG7xba2;|NYVsSo3nr_kaI+sR+mmtlt#uALJY4zk6Mn zanPpVb^c+-JJ)U6uyMO_aOiG90cn9qk^lay|MN9%@iG^;<$?m?0ug!v>$a^8)3Z_6 zW7f~oGgQ}G9}>1b%s<#SBrIUve|_Ji@ql zF`s|mp?FFW9Xs@%Nt3RCCGE1*|70ZIJogAH0>+bzL$~3Wr5sUN9uGQZ)leS6qUra3 z^oX?ry%Y;NZJiXJYn)HD{uRP|fm>jwFNb+0Lawv^Z>~Zfy;mnWY!9!Yav^4)8H3^6V(2}|jZn{q*o#Mi&O17r zE{~ZHeMe4Ve0LW^H1)|*RWl~-MGmgtB2L&zt*|9U9BZZDgWXs(`}$NMJGvKfk@q(C z(SC}Zi?tv}^fH_?Naq!APKP;mgP5)dboHiJ%_3b1?GH4tOs>4qX@+L>id5+Lbpm~asI&fUitLyJNxLqXslG>+!d>C-`~f zf#6pT#T!!!gI;1(T|Eci>f9%#N)OR)g$KE4Z%x{M^zyc(zK6MLd9;OFgS3<>QQoiF zFi)TZbPb#c`Pzifm#WYfNfWGIbQXPrmC1vX&e-L|!rhJQ;M%zdtn%_JHP7D_Vo3Nq zl*?L>bV+8wlURQG=b_Wo8iH=Exe@I&Gh}V?X2B3WvE>_#Qfay9lLC~(?ZlS z7=FRRbJI02k3S4&|0$6h6+XDMYA12GDCG(I?WKbDozUHEf==#0)=ZyGrDBeQM^h=Y z`hy#5*fq=^NUp`-F4wqvz;05sUWYU+^TJP)Z`N!%kdHU4Uc%9NQ*bJ${mQZC(f6*t zjNYZokQk7Fr$XnFOzy2o^3_C~bGri)zQx0?53;1J<1$!Ie+#u{O+2R$Zg_E>GIR?Z zhy6cJK-h!}yv%VIaoxr_CK;E3`Sz z#HB|g;npKVI#Jw)9(gZJT-^m|r)NLAQbV1**lvne76bgvbw^mv?^0xOcvI#E}00sFw;JrbSjz7;p=tfEKm)9V<6V2hx&SiK+B%FCllt?iQ zGN*0jNR#6S^z>_|r$SQkzJ?143OS778Z)n-73MUebM$#%<@4C1G5=5`%nJV6*^{~L zTGZz2aXb^?K&u7SS+}h@HDMvC;NF+YI1NlEdlp2)hd)iY;^RS>c=RZ9d}R^3mCgW9 z<9%d_og=K6l*13c=0f)Rbz&b^GaK$OVGnhUvYw+iaOxg)X8WJVtd@xsZOE8}Q+m^( z&$@>UU3`UiCq$Edijk~KhajyNTY{_eZ=udq1`IFAnX64Ei?|WAuH>2tBf3%llSRw4X`M zm#qYm%LX)|#sI}9i^Cy>GkBxF0<+bQu~a{Y{PPuo!kr1=#YKA`>pRfgo$6@Z{EVHG z^%%>dGO=#tJ_Nd?qN9KSkGxc+ua|02!?s>nIDy0Q9G0M6D`Ls(NC9eb*?{o+PB5vh zOX=$r6BxU(8qG|Ou#Z%M80CJ%`pp}$p9qqZmi=I~ONZ>4txY7)H&XTb`=BEh#oBqk zz_qIL%M%9S}1zlGeaoJeIvD1@&TBVy^9%%3D9 zn($=`ssG>r>Y|HDP_zNHe)@;W3d;p?vxDSscLj>Ym0)76Fg04EMfPL|W3O;M)06ZX zgCC{ABK<5*8*!OcTc%2Ht~Vgj*Ph|H&ewcR+(LD(>0?>oFl+K#9`iUX{j9j1Fmgqm z`qZc5o4}vQ*H6Xn*>ZGH>o?zMo&s5u-$g^pKH<4GH7HbG4|boe_zM<_Ll#ezwmSy$ z5`3mG3tsy%92o*!)Hmx~`u}U3@elBKUhKOi zBw$C7|MpEG!N#Wld$fuC&uH_Xum7jf#?F8zH6WXYjHb}G3tK;PyEfPA$J{Lcx*8hnllq_(IVV^shh3oQ11@#Jd=xwV`TgVbo;04LzZ47Go%0}3rUmZ?M?9hxh11FR=`r7`?&0wG0q%QiPv5hww($ zELs!IfH@sUYwMPh?zKr?|n_xi}pIVg(NGf#lMw;pUS zVaQ*BZn(COGejPDBZbqANM*D+efGNpL-kT1O7AE(-Zi9aGU`zFc`Hs*=B$vTQ^_#T zm5f_*5>o9`K>Xq{(%<}?v0)781KP(y5=OOzN3wR%|UPs>fH#p_x zSJWMJ)3PHeK&x65~>9CMgqzXrLc90D0hUr#V9$QhxPnZ zO!S0*Y{wg5#RARIs-OsuerdzTJKo&3$Be3c90aQ@3!F3OF1@wE6}6HLF;e9QJeuMH zJx?BUR^r(t??DW@H=V^DhU3}h2Om(dp0mE$b5`sLqU2R(70Pet-WmtRVEM$g%yI7G zYNMh+H;7)q^F?R{~OyK)2V_2DAfuHYhhPfjByu0tepzcTsnU&Ls z(aZ-7UN?tiI4R=0NFByNQNBi)r%T_tZp01KENGkQL0XxqPdpZtV&a!vw!DlF9@}%s zoh5=aC6BYsByL14OA}^FmKfC@-_BM%-ORM#)}d9hf;4ZnI4&e9Xpy!S_0!5hylgW0 zo`08>@c4&Y3%8QPIt6^OS7Q(N}ke4ZFoLz`L6lKkpSjupS5885-_xi)Z6U)3_#T2mI#k=UJ>fLUv9%iwhsB(!%)~ zc+Y7j{lovvTueHF8ydWz{iY;+>bf0wnG8XLZZT|oD~@U!Q+Xo8=W0^oli8M}HS~&l z2A;8=!8FgfO#X^@pd&w&t`b!ys&gV~TKo#^9TyC0@TKO;s1Uz7su6PfE73u;j%}MS z3THnIVIlV{Br#bX*Ke!fYwx`cQnLbx;QrHW&*wE@*nfiw*F1*bOs7+a?Xtx9?_-Ry zdIQ~S-5_GEIc^I43 z8l)R@Q1hZO{tHXMx;#tbYGcG6J`u&t71+Wo8+^Y?gMP_!*^2-u+9&r zLx6%Si9K)t>gEX$WyxoFdd3r6Iw(Y38#1u3G9J@4G8uu=D4g^_j!0cnfTE;W{LpWM zo2Tf}A50q#y8VK2o5Ptv)na^MdjYx_Te|h46Lt1pOVekGV%MpgG=7y3-B!vY{%xMj zlg9;geq0iBik!z^FSVg`RS;QGa0MBkdEl@wkA%!OV_ni?P__3uIz8_Imy%(=Q~71a zYef(a%iaRtV?W?dtOTv)XTh}8^{{kW540Uyjpv)9$WHg?X}K54AT^BKD&1LFq&%?7C6`m8A@|ypqT^wy4tJ(^GJw@kDa+Z9n{27Ec8$ zAH()>h5U5hIo4E0iHJm2!WBJpT%););jzB-z>Xm%A^tX7V|EQoWyVvZt)3{BZ9?Pw zW|H|`RnU_vz^1gVqDqPs)46M1y<#H#iHo>rHiWZtMgXO8UiXTle`V4?pMqUL^p+>{d_ zCq49>n2rU{uB@eds5Ofhlf<1=$y z{^2<8pXP)9(pYITnF%zrWDlq!eI2=hl59wP?K%v%_C}^+3&ju7@#t$ReJPkj8 zx`ipjiEP&|by7e=X#ediP*PoiW@AraaOVkJR~SP-41M5>OT^>T!#X72Whu@bxQ{*W zgvt7E3-G0k2WLAFA%O>C@WQVdJXsA*s6N-FbWy=|~m1_p^lW}ZC(@gTyonvAj zj>qWBQDCt?%SM0rHu!83Bzr%$0*9Dk{8s0(TP2q9hP4EUOL7CqeTqT53!Kre>=Nt3 zkz##HPM{dKsgJiW;YV{R3gtFOk{ka5#pe9MYZ?lq_=O5hpJW^Ha91R%bO_LhS|K{< zHirmB4cD}|MMKBk+pzuC7~X*;?BnTE;qJ#|Ji5`IwC^*a8n!BQe=paVSX+nJOgQ6q z+f>f78wGg=30N8zKo)pN0gr3F?^pK1^7~?h_s4)%UAYa@URl6s{4r1{J`583Z^0~M z8~ku08_lJ@Bh8JjNnLQC9e!&>L>?`mY8RWZf@=@&7QYA~eFm7fO_>~gA;P|V^a^Fn zKj6&u>Ews+94yYNWsTt# z^Y$`invCe!C<~9>Zje!VFIHH`!S-hJ+3iqz?@Q|$#_1i2= zLOoj96CEAwyv3XGh_C>eo}b89AIQKP36=2mp&A_wdw@^56|eTm7wlHk)5vDcCEf2; zseJZn&O{K#6n_mTY=sIvZT|~TT}Z*IsaN5aXfj^mJ!dMVv+zSzB7QC?!%MzJ_?08E zU*G(VeXDPWbrC8M7ud*ZIz*87V*{-4h%Obj`iHkwWMIowKKndWfGqv=m3gwJ9h!IV z;(05HK`}=He-^$Q9`BK&#eJXgYuI?&sbvlV@lV+``_q^w63bE4O9RJ^=j>uxBdB{W z9!m=*v(ZL{ybdlIBmLwcq#aga&JTnhsiDDkWw@_wK!?}& z@K#iE#!2}cbPRch=XxY)@kJ8|nfr#Xep~>`zV3$x>PQxdxZ?Q!S~{s$jP8)kL!|^O z9Cu+YJ$`o#UJmaitENn4zpZS9;ZbGsRNyt3)bd!5j(fOq?LOvsk~SGO*aS*5#nF)- zWMYF#AokV+(6(>J@k|W8>Tw@6QY^{w(M0(D*n**}6>zL9n)qY{P+Ls{6kgK>A_C*- z$67a{dioiD9eIH2yi?%gtd1{?n_2tLLOKxB#E&@h5)2$lnUmM=vofCPXcpm$)+?f! z{#l#oax=ux;UE&f%z`=&TcY|hIciZ(aXKoJPn`AlS)UygP0}QKyBZPIHnZEEQWzJ{ ziKK-dBKsEngILy^o$}}s6B6u8?Gm4}F{gWB>b+ku*K9nQA!bz5Y+uEw%WeV1uMSw4 zHlEQvGmk13p2hp^dc-4Fluj=i;~)4@iGlyLX!xS3#Bv3o{^rZznmfc+E8T#h$arYG z77mZA&!g+Y_0VrHp9$F#17)r!$rvj{_Xz5ckMECRT(}e!j`6}ju|DuJh~+d(;<;?`pbu-9#tBnUN(ajoSooQ5#_J`wx2@% z8p<9%K)!C#gCd)3jJYSlwk=qU&iOsSn_Skb(WEF7rfY&|a(sNGer zt=B9>*j4JxScWM7;O}~7$$1@m@!cez=|^jFXU7qud`*`42}e_b)5(yXEDg!K4T#_G ztq^&$5LFi$k;5yE@Tbg8ytzZ1XkHbkIv2I*+Tdmo$V%s|Fd1CCLyPYH^^sX%vVe?y zo=q=FUxu(B2g&Yl3ecOB295Ijn9miaG%MGcF}@kkw7Q3r%&7x-RQo)?bxQ_1aTKg` z22X2FMGW9Tj2p2FA7OtC6iW{Rh!2b7=(h7{-!%IP?6Ca^i}%lE4RrqEYHtg&d(9C%*=-GX1UFD- zl`C`Z%x^ZP>>2Ey_6y$`?V~d{O{76aUJ#ji9Txbe@VZC&pw}6X>IS~h=5?PMeV#~X z?kWfVRyW?4AL+Bxj!k3i&UHcK8EuxkW5EVHeZ02Ch&Jih;}PX`7_@W_{gpd`z8IZH zXN?mg#vkuOS$!J$vq%rk#HUly8O`WhZA1E!-(b7@C9oM*CPAlcusUTf*|@`s^^ljM z`ztsj!9-hZIWI;|e-|Xdf3!$ITmS}Xh*I|@w_v+IL+5mf;Q4vlWV7IPcskq!;`N)U zr`$v4f*D6p)Ug1K<=*6TwKOqkokDVVr$D`o4OViAgm0e|vFYUv_Lxj9KA0*)Cvb-4 zpIg^s_w68>5TDFcJ>g6eHJ;ov0f2-}EN&D$NWSgYC-UzEX`p)&`+R>eyfh8qsP3V# z;HE4QKkyp*%>aYXJYWpo%_q-lE@Ro^yR3NcYe;X3r|fGzbR=cC`KdZtpEb%`dDNM7 zUaMq6#Fy~BTE?^e`e(4r>jPBg2H~w=o8ZHxEN=EXMpkqtg0SHu(CFjRYwwz2?!)Ea zk{pQ*O1;dRX-DC4%0cuatKqZLYJOSxU;OO!m_1W~%%%%M;N31x{%OQ8>Pypcl^$oW z;T^{E%pP!@d>pcZt!Vfe4{FWKf=h?CQeUGI* z`vq)E+=nX#61km8D0A^q3_Z4E9Q+i~V|ZLU_1aV&+Vk`*mj5uq6!se1lAM5I%y6y$yoW1DUi|@D_9FyPd)yPtG?ziX43a?@L)PNzbJ=t{X#e*ZAWyr&cEu8(;@dFkNS&$$8$w1sIVZ{ zF0)mqt#S#ltAUUS?Y}v5%{$P$A%SyzFT+Xet$crvtuU#)n{k|W7=Mnm}hgGtF=`t)i$gvLA2fLRf^ zJLEhYBfkNS&qSf1)OA*W?=E)3;yakps)>1~o%qk;95YeOlgd7oCvkE^%+9X4m=Wp^ zDQ{$G+8lq_tLZ`D%Un7vCO}2Y)#-}BM>zQ%k6P+-XRK`%kg0!;J@-nVoU+&fIcN2F zLd{ul_*g5hS*6TTA(udZlQcD-Y{*2JUxVbo=OAWp3?0cJZ|HPZjMq}m8;cz71gpZFDvn}Xnx z>QegNOAH!Cbh*amEEtusLl@P2oYppRW%?&4I4qeXcerGmZZZndx@R&HAvLl0_8u1NmiN% z{bUu%&b&9sUlUP+ee<&*-D5n=xmu3j|3;urwGQ!=3WsZ_7SWXkzv0_zXYhkqdNuG4 zn3S$yx{ohM71t!#`^trWtGNo-&-gNtqFdqByBwJJS%)%%lSuuaSQy%1gH8@d@ZAS} z{>(iB5a$UhlTBun zNpq7W{r(K`c8Q|_5;2@vZ6`Ywt2*llbw1G+Bi^Ps^y%<=kh=!JEn;(_RnJ{5bYx;8A#4e}`Ydk%NN6k3nZc8Z}(- zh?)C$Gc7;e%Py%ECZ=w}WR9^iW?XMXO{>dn%A{kE@-B|@TI+dEQPbhlM2?O+(}j(` zrbu~WC0N}toB1(Sl1(8(1;0CY0-H2yO1O7eS8nf(g%n~#SpG% zlWC*WLi)>rGv*~p6G46^G?!bkWl!|zOJ9y^c;Oi4Gu?DN6BL}>n6czTo%pB-+%WRoBKFpX{y{&|~C;mlNVPb;~`Vhcp}3)9I;&XB*@ zk81rMW9CG>fiGVYiR6`1oIKZ*T!L}*;1e}cv7;Dl9-7di*W9)3yDU)~okD_CF0j)} zSJCE@g>a~SDyfbyW0v){@SeUtj(x8WGRn>U{G=!rt$Pr9wm-&GP9Bic;|yv#O2pZ9 zBO}*ck4dYl$=b()oE?c!qr06H-+D1c5I@uA0_ePN2uzQR+tMlr;HI>|V+ zo!NIsl(}T;jG9ANQTJ*Y2AsLcI`wcdi2Re#8{3AR+%wqow^fXg=pks$>ELJVmSr7d zLx`%=06Y1;GTWWLnkYDnAo==%8FU%I_y|`LcJA}_UkmTSx*G+|I}-tXvhXbCXDy|j z-z{lpV;Ct~DFlC1pQBHyA8%fc0kyNb0Oq5%VA*a$E*y6x@zoYs9%@df9ZF|iZwk}M z@kzKYJOiYI%b{oY8XJqHjbQX*3Q38(!+$Zug;HTXxYA(&d)G@~dhS!$JMSekFHW8^ zf9+_NLK2uTmzYEM*6{6)T&0`XnT%oVMaU`;VqG2IVdD94C~v-k7R3TYYq<=sioD5;U%#kTt9kVL))`sGC<2Wf|p;0G|7+Z(z%`>9-e`j-hhG!5|eLKc#&E9r2<*d2SbBnd9Mi{9SHv0ZU5&6uziKOgtNH#7&U zS~fW%FABK!L$ ze&kF%7LIQ*?%E07?6xuP#_SA(3LU8Zw-Up+CU_3-64-L4w{FJ`WNfc64OLZPRNBko zz&05i5V}sqv-+8fM1pH^$0MI_MykFqCW@OD1K(PJS$aaEX4fZavIpA8@yB&*V5b?4E&ZuNX1vQa5nPssJ*Y`V##oNAex4 zMX`!|4hrb%z#-1OcJO!S2%!c8zwmTR|3<}*LPv_V`u z5ASGFHpMiP8JqT$+e7YRSLJRey_I>`$`_%NBL9KiBvVrGClnc-UfgxgikyCx1qX&R z`HKUxp)y3D{C<_p>^%}ddADsabMa-+Zg8OfK_79b%bsZFU87=373h$;mrT~r$H%8dpnzf8mzXb0=F^Id3+#9U z&MN &=AQ&;h7r3hQzJ&;7$MiP6+Fr-(~5D-!?Vb|4}(= zKYImxc9!DHnNjRWaT)t-U_6mDlA&U;KY1DNI1=FXe75bQ5}iaOdC!lh;ucRXR(RSR zPMgV4*{<*0ZQ%?4itr+_yVg+uvwPTG-PK^J{ST|Zzk<=RWmH6VH(Q&zg{-(b8{fTj z1JhtGhcWjqZrL=C<@YT?MfM+irF1g+p?V%RINxHOs)87olFgW-IFEHO52Ip&*=)hv zS=2xNB3vp|Cwnr5XttIEc~3-XG4~8gjt8={o`k^sZP}=*m5Z;#q0@@xdeQ78c>%<2kF9?-!-#Te{dEN zP1?sxZo6n7vdM4uAdgc?y3tX|;1ZPAQ&+V!Z>f<5db%yLuyOxh_dxC~6SD z+#T3?&ybRjMs)qSatwVCi&2BA%-F(@Ao|aO=*1_)u3=Rs$KHmu+c$}<`YBHCM}7vI zI~t_o-ad9#;bngMDLJM%U>62vB+vpyIqq}Qo&0Q`OTrT_<8hr`tZ48A{B+))p39Ub z;TI-j|MK71z564Z>mo>Zw$?KrT{hz6{tCE0*^WtVcOex^DLZ+MDN2ve0vR6#lI&K1 zyf^U}Vb3+4nhv1>XIN1;SV5epHiD^Q5x+V{jn;`K!vu#nVA0SD{Oo_ciQlwn{>~gy zHpz*Ex7v^ch5n>Oh07bgC}o3racK6ol-;#C2zoUx!|mrO=Qbov$!A2(-nRu%JS+e^|7 zmn-S6fKFEJjv7vwV^0ib{)I!u53%}C3%m2dKHMpN5aUM=fk8|ob5EP2j+AK-DUEJ4 zDz9O#Z*?bzK~Xs3dz(3yXHLo$9mvc{?WnkX2$nK;LAiex*(xbYCvLK1s!JUpZQKf~ zHC>*4J*a@Od5tJsVnKv8)QDm15}-dEaOH;-jPYxFhp987d-S3BCVX*_il$sMR{1SR@jv>NyG*%#Xn+K7##~UNmQOBG{R4<|mC6 zLdH@9Dl)Q*+f6#smC~=ky>cG?;5q^K&ke-*zN>hFjKFG+uH-V$ldjmSOoVOUFjg6{ zxYGAIdHXFF&pa~Z{dB%rb3i1Dseil@L(=}R{odR?a_wr4M4xGMX~$u>_Vyh|in|CI zI!$oVN}cpP`N{U`oPx-0Mkv4K70lY9Pv3+cM`8LAQwjp&^~1ov+<}AX-+r{xy`k3)Fq!amv3ir^bdp_K7})O<}(wS zTIy3M&)PSg2DQNyIMLG%&glyPABpki>*72l?AN(M@ri-zARLCyhq(*l_2v3*QPmS zhub4?tgOPeltuK#icmDYH3LdlH$rkl9Ge$<9=d;=XWbgI=-ze-Vrh8<0**G~#eNp; zs<^zxZ&mh&hzrS;S4Zn=QM$)_G5xUXH)oI00e1Hn{x;DA)U#EMU1AxGj&n0{#i>KA z^sNufjGX1;qKd_rO(K;VHYBWuY zj<-xBzn@&hml72iSGNVexz|D3nIB;5b_5UK&K_IhC_j-=oOojzG9ZGT_0qLH4VvFSOt0j3uf;RG<`Wj^h|C zK0ltk`{#-Nxp`=K{VrCw`a@&CBkOVL5j4GtBvPu=G0P~9IiV{|C;IFI(`j$fGO8ck zY%-xNG?(~*7wE3LfTp2djL+)|T;){F*M9Y!f$mZwVEPP}j1xfFmL)V+aul-?mt(^M zF30ghk#;?p%p`2ThZ>)@;DNP5)O^SbK2@E@r0{3hIMo?;&znz%Wj&zh`3NYcE+y~n zB^e!#)FJ40iR^l~38%c4ga1d-nTOT%wPCn4r=(JvNu^0NXgvE}g-RMEB14Eu5{i&n z^E^kI2t^r^6w=x6lA)C1CnQQC3W*F!h5GjQZ&%k`oeV0~m!S8i3q$b{+ z4lJ`LK5r$+k12y_zpxQviP!ztyOIC5_qkE{*v`)Oj1fB|)9^WO_ZP9=~te&vGb1_Rgex_{c+u z+|~}Ge?8W5``VANa;F=#4#u%t0#?A&_7)~aI+g^t)?!HKON>?Y{qhl3Cj4R@e>CE4=>S;ow1Awf`3#!s=u)svdRY~D6vYw!Uw8>Vu`)HU?0z6eR&dK&!?I8v+ra*+F0f>~h+a4us9 z$b}oD%U36=XJHMNpC(X$oivzjxsZ9R;z_-pZRI_$dBfVgC`R|wL$FTN4NhMTh8@;t zG5Enb_$_$}x=w}Qn*+oAe@kW2K}CRGl6IrlR^MO*>|f!dJx8dJvTdyY@0*D%Eg ze=rpWd)Q0!?gHoKV&=Q*zyiN1bYAaCes$^!w#+1+>b&e?LMGhfO>KI?_RKvCgm&V+ z?JgK`GZ&U#SxMfMIJ2>Hu0rz1T_|H;g&SVoXRi5q;?Kx@6fr_(g}5L)dq{&eowtNZ z+Uz`mF+~7s+xVhcg+-bbe z?@e%dRtT}Sb*AR}X{@AEF>ao_n#{c9$}Zd`MK?~3g#T_gU~BpTTzhI76;bd zl&;wjDP?mwY@fq`aW5$L|HS^}2pI6r#?jIm-m`#i@SEig(m(z%=@o?j_`_Me`#F0_ z;~DH<7fk~WC1FqVOV;;?8d+;L!~};Ka-^IJa3c}4;s*D>H-3td8!te;UkzsWHL)3g z*U`4~H;{ko9WKuL1bA=(F%_4>WZx`mIHiYsBc-6sOC92V^(U+Tq62?*C{c;jhw#8^ z3C`TMfSm9eg)Xlhps+BXI7xKEll6OOQK~i$NXM`lyYwaxU4@*Or`xt)2Q)B@|D zOAz;NbGq@zIb_~Ov7h$E;#Hj-HvYQ;ao!Yw5gl#}^>_?hgL7#?XCL;u$MJ_kMwvRZ zV(8z*Fuf-yv*YtJ;gjYvIMZv0F@H^HO6WMItUgGdSKMZ0cs#Pwb|tUI(~M{=NoDhF zRY+;*D|XMPaun9xi9+L!WW(J=y1xH7jQ)6HQ+rX4>LgoohE)gF?{fnx`-hW_hrVIQ z+^K9uTNKQ#tN~ZAB;2{ej-0cc%q;w{9gj$@!@2&e(d6nYMu{_@912{{kx45tMfeUT z1XGOf-b3!l_a$nKX1q1hKF!p%b;l$#0t+w75Q*c+AkFwR?o<->4FlUXut% z)D%f(mkk;DzMQRz=5lMPZy|P+JKHTm5H9Xv@YQe@la0w&AK8n1?zVrQKP`(a5LeEz!$##GKin_VB=aj^Gv1x$vGN2Ae5+a&s(wa@}zj>tJg{`%AOHu98RYJk@8D8@WDem?a(Pm`AtY zdBkYij)R71J6^MIf!!YySXbMlR>m8>$kNgj%s!C9hRf+w!6}wp{_hz&{O$(un@1d8 zyJ5jXTe9A)7ZL`%x#nmMe76*WX-4zOhW(pBCMFw}3Ayub=V?K*a2uoTUJI`ruVK!> z7z);oFiA7H8VRJKVbXrUKO$VM?<2^#&cdov1-hzJjKp634e_Q&AgJv=DvU^ypY4sT znu-cD8q|kh7apRsqt&UOnKN&qpDcO1I01cI)JWr(pUma2R%EkN9JgnVCRf}ZkPv|+ z?C0+#wo2M`MQ1GvoE%~ETOTu9A9aG`wL&<_)$+=wPDjJIAmXVzm63a)M}>X6m=lsq zNJ!NJ?%pI1dVa}MQzZ?!Bl;P$|7sEcTRS1^(Mh<;WwURrm`ld5YZLnnEt*j6N!zxa zhm;rdspvwk_E@xnT^*-GIwsE|8xEQfd$|xAkd3^<;j`(-uGWRb z40?tB5^Ej&lF5M~zFS;sTCx{Z+?;Jo!(W zPLEwmH@mB#x=9CKvaln))jg17`T{G)Vu`>aXS_X$BQ_cnd^5F}zJ2iz_uJ)SU7!T{ ztr`r%RieOOTmz$pTZ!VXYs}C6xACP-Br~P)AiC6=(7J$eth}s5i_Oevz|tEvsfH1> zN`r-Dm6K%Yzr$pB@nZfB(`5Slix4cgl4LeL(qyAmxm|sWfb13$A5U(ZpAT z{5)q)^7^l_hcCTm_HQVJ0{6dY*!&m`zAm66pXSmcfsMFAaW;Jtvw&`%kiz~~4fN-p zIMS4LndJ`LSf1uY^PEi~F*uftZI`FEj<5K<@nzuS-HcNLxmn)6!&oCGO0>%p*>%TW zVWa@pXPGjME*^ddxt*VJzwA;{vW77O-U)C$DS2ieFh8n2oYyBE{GHI zkJ-JMqjIiT#O|EEloq)e)2&W}xMX%Z9G97x$Q*Xu4{=6w;ZEumn4;K)25-Ch;|KQA0hK}E89BqX%8Q`y z^a}G^5}0*y!sJ3UMGJ0EGr4^?4HoRfv4fGYLhclO}f*KMr2}$*UX|rk)dyGV2U{n6<(FysF1v_|;o?!-R`@=yoL! zkHl*e&T7SIkKJWkFZ$4g|1_{)Bb?5Sdxk~!OQ`JJM3T3~faaLz*8KNO1bRb1;J2N3 zA)Y3Hy9R;rFK%@8@okv1suim)E+txqN9mouTt?xs50&=k~TflVDIWN6w?(2rUJ z0Z)!WSX~O=PR@)N%l)yL9w0yzuBKq?$wegOj}leXo=kUY*wLpuud=&-&cf*7Z}@7% zCh}QH4<8PT(VQJ&jPcwIcDt+#jnL$yZs|9)AG`+1Hx?7SD++XY^%^V+TuBr(b9tV* z?Mz~06#Z71%#1`<@gk4a;Hfcb`n~!$ju_g*rqEO}Bvb)Pw9&U!cyQtq zn3c^krl;o7!eRm$GXWRu@TD7VeuDYeA$XME!l*pD0o%(msMz{K7&>qz&pMP&7U0sW9`@@Nz^mO>Fc^J}(V92`P;>Mz?2(%yX)}x<#cLvxex1Qwo@_ZLsYnXgrnlV z!u2`5d|`uQkkzL~H*L!UlJXg!{t{#~3!k!9XD5?6_TSiqDd+K|;^UePeQmgBg94fI z>m(a^v;i2Ihv;4rLX@qZAVnNJ$; z?W3AYlyRD<1guPxpm%*Jb3SntL^(31n(MSEuU1fl_6~M4JQFeb)N?_D*@~p}T-O>WAaw zQ});cJ+R30AwKct?C*<2n8?jF%OlhtMkS{Fp=rW=$bM9~rVDP#m^j(xfnZW|Ul-!Djg>KwkVPgx#_y#?M6Q$l;l2BX^zuqfe7g8M1-9hMCy*_a|hwS7C#) z3k=3=M(e#9jQDIx8ol0_cdAZ>mD+Xc^KnIgjM+Y=96uUs5`{2BMaH1}*=Cq=UQDyVGR{2fgg*|(Q>pU2ef zGoX8R&LRebGBixC6I3R7(730wNZQ^^Tq!n@mTx)@Z!hz3&!%Je-AI*&F5QL3UqqRs zT9FvIw+t6N{Dprfargb)I@{*rh)N<1yVvV1Xh$rAJ23)ua&!dSGq#hw5;g*n`(2=) zat6x(WuZsvWZF}F8E#GGXlnO15tV5kxM{@&thJd-bT|aYwy0(%Xh4)i=5yp7wN12o z)+LV8b{MNZM4(vrF7|nBKDIoRryIHm42}!agx5zgZ;Bgno*e_hW-_EP_ykP7@gLmU zbB1loH~^L%&*A>W7x?c*B-bLj2~UO9n1k;*vVBnq%gkwl^>T4I<6R5zYJc<77KMZ3 z$RPZRlp{>4Hz7atp=fP57Ahcp^RpeVTI$0}g}dzFt6?g(v;qVFePytpvw#nUGM4)k zsp_vO)L3ROut^uFOV@QETc@zglZEKh{G(W2^q-CE!#t+YT8x|yF$2vg5%8;7iZ=5T zp`ytQrmPu-D*G-J-Rw^jqGDMsr%*^Z5=G1I^g~(EROp`PO6y!t*4#=w49dy(8CA)} zpnQPB7oYENc-IvitzX05`YsO}2cLisw?6BJbl|l+x$G&`XuMEvLMu;ff$=3OM10v4 zI1ti;KK5%0+ot zz2+ZWXpd#t;XZ~`=rZAg?O<{LE-vuNgq!mdXjal`y6M$l{9yVKwr7^$&O{Bo$621= zo%+E$zI+9Q*xW_WyQ^q^d@FO=H6PL)E`jpQ4u1XhCVqMbCwsEH4XQ^4Na@OExNP)} zr7r}@pNsFXSv-kZYm(G&iae20>{YfU~Kpl9hh<0d)fex z%S(|hH+^k(MPHyZ+#*qONgnGPRLPz@(8$c4TMz$YrRl!uiL7tKZn8VslPGXmxP8CR z@w)9F;kgYnsNbam+$`CO#{1kYC3TsLRNJUZCH%`jZw zgZ0B7eC5Y^?6b>WoOwWjdP!d8X4!jjS&uEwH9Cq`-C_7A&VwFxw!zkE;xzE95}f&y z0WTNbz^9+0fh(=ROjku%-_6GwwK_D`kY{dG&myPGPU7>Ga-`K;+(xNsDKmX_I8g|d zB77!@GCmHhhW}oYp}33AJkX8D>NMz;>SKI~L|GVr@*iGsy9pW>PcQ{1*7u~5}yK^to8amDLK=-~D- z*NaEs@V*+9Zc*UqbF@Y~FA7dd{CD%^pIEXXIEK~He8L_PJi@}QQsnilWn-qu;T?NZ za%iI^ybxVRY}ybmJvxU|7$EZpLg<9tG0@4eN7>->{I6*Vpt(GN)%q(y3SM*T*%fVK zy+EF1Vmt(XJwaqASd*Z)5_mnBvuciC!8sm3_?ZTcyt3ogplf4*4st6=+#jxA7pOp| zDLljz(&6;aL=l$0nN1FHbH(;=Tpr0n4_kI+!(U@V-s%yqGwAdkZ4d7t_cyEJ!(eUd zaW@8D9nc~c+nm{VDr#hBu{Ralbc!uZ8;2GNInq5r0(s+C*pF)_;@kdI`YdoVE9tn1 z9gmN~kscoLJSd1Ct*pq8EHB7aA7}lIC(+Plqu5czV)vdl5U!uW(LVXW)93gQIfBGB zay>rTHG%h!tzpEujMTS<$*97B2ZGAMkd|RqmRXe=zx$lXjI2>UBevyHNy%t+!Mf5Ec9S5+)Lyio+eErx~pxD z2WMl#m^aS&p$GGKr9mr4-yh)aWU5mnNyNMFkX&4hYs0tWiFdYCG;lGTogz$YW&Y#y z{>1^=^@T~(pH3zi$e>HeF=%?A2hwB3)ICptRJPq`E~v=RSgTMRdGmvbYn{ua>z~K2 z_Z?vV=P6)N8=jdeL`v?y0l8&Dv_w~u=g(OxX7-w}ts*wm=;15INZOq`3LJ)@+gq6H zA1?CDznD<@uu|rEw+(su@+PLM>BHRxsaSr+<6dsydf+u7M4lLVS!;3`mWf)DsZ2J=3|HHio|}b z{xgT$tFOQogZtXl1C z|CJr6{Wl4Zbh%T_C*K*19CPY3#h(UQ2QlMAwp34|AG%-%fTM^Z0*np-A01+N|hK9u4g!9XryPiHmx0;Mp2dskekW%I3nt zSMVuv&F{Lh;H^9`p$FUt6HKP)AO_WBUH`Tba*T|+A0&4i?BFLA>N$1@3Sh5LHT z!NFddOnRS>g^eE>iGxz~c%meIkRFMD-JfG)2|-K8Y49>76J_)tusfQC=tFB8x=hNR z+Odc6#q|QLP;o%xfFrb2PL@9PE`&!TkJ-hyM|pu4n%S=#uJI0EaD(^N%6P7{nQ2|1 z4rg9VB3)<<9kPOSx4St#yDysgC-MZiEi_Dd^9BFk@meUvhoxTi%poZbGqqBTPAGGv z{0HV#$s?E8JsyDYtILUQ*avWXW=YCju8?iD**L%1fRGAV5OWM-B5S2-fB$u`Z*iyR zv)`l2Lx$*T&!PD>F*H;5F4nF*TCG|$nLc@CNXi$6F{`EWc`su-FmQq@`6>nYv8n?8 zIgX<9L0O8P-=X$z8E(BY2j|ZbA{Ey(Xz@}(5;hb}g+D6bY;HYPty;ufi9ZdkV&$N5 zuoA_W`k`0J9bjHF^wx|uT(2*kw`GAKObHgH%R}FyYM%m4{~HF;M27C#o51#;RAIlI zKY^AhV-Wjq6G=+F$~@jJhFfnbk{7>cL-+Ay9EjKg-)0HYrvEBYV|NG`y_`tTytX3m z&PdR>o>fG?vYxe0_rq#r7|=w2dfsti68_o3 zQtxy0-hoe;cKsK7Qcsba)15%fJjS}&TH%b;wVdJElr(W)UsAH1jw_zwb+={XX^lFl zq8a2Ztf8BG$ME);2R%Nk7Ds|Kensu+>`sl0B?4n32g;v9}AL8`lJYP1QD8X&6n^!i& zmHgG%h1*W~Qd7YX_#>bMPRE;3+0Yzjj_hvQxo9#qP*Ndv0n6C9oFF_oJOz|@P9sqx zm2kIG9oIgWArE?|(4}UaLF$e{&1vVK%ny?oVtc%Z`Mgk+tUhuTpXz<9$?J4v*7e%s zpYP>#(L+J-uOGqXgX3^nA{ih5sRiMz9proMO0YJe7}jiyM>uQFhVUHF{GdYD(F>S6 zxDBL*bgAfEDWb4>5{NDP!$@;ByPa#3IMVn{_-y3cui;o2`ex|gJdc>ES&;u+9^t%@i}+qT zn?1Ow4lJuDQK@V0HEG%YkZApjRoZY1zK17}#-e?!``1gT9*~aPG~>waqG9H*-ykE} z;YWA3@}VU1F^ZbrfwUTBcv{eiXF(l~gq`8HIRcgC&M#`xMeJbJ7l^F6%D)$GO8RE# z(EBUx$a4L+n78>B>>#(foS6VN&R@-n+IM3n25`8)46I#yl({`Ykvv{ogZ3p2kZZV%*#d*2xs%we3APLdT-4*YyaiW^)Q(^6ddE`?52Q1vLMW29%3*2ne|s@X5X z2PW>s=-^ql#7_>qyUb}p-v%;pP>5V9EM^`SFJKD$USX^3M5=!_iHV#3jd_>I@+_n} zYXp=wVW{2-oO^dR?Mt0X%bc?Kc~M5xa?eI`w3Kln;K{j&*q^^7m+c(|E_oLRJXSSY+opB2VtC|_R$;tHY8wr|mHWn_7*nt{< z2YB|#6ODE9#H?cp%HMiKC$^~4cSoONpk*sBoH6CM`($AE_cGqH-_uZK-8V1^(_uw2 z&M>a?5LOR-g9FPmK=61yZci*F#R`kyNUA6_tT%)?TR!8t{JYS%V>LAtY6F3fYpJH@ zAkvfdXet^`mqm-vGhD7rXIO~a_g-ah2f30a)n5E(XaaSPf+V!eiawB&fWvd-nfn(~ z5La74LwW~TS;hfGNs?z$L)dSf#I(mG@E7MEqHE%2k)X#Lz{0K#lQojarQEgD$1E4z zin}p;Z4oPa$eE^bc_;58SE_Sal!^57<#KwH>6XYIP*YEas{*ZzdDj<4PhEs2o%_XZ z>fS=TqpYCP?+v?&>pRbzFG`-NttN)toYqWRgv?uaoJu+>)2T~Yy#2zAo^_6aWo28K z9#46?G9jCoE?mN#cjSy|bH1_{)wNJDYyodq^Ll#v$~Tz4B7i8rUJelx*I**N#ofjq z_&rh;uqTjvPA7imxKF!Sax4qN*1ut%w3w6Y6E*0TRt6?rI1XM?Iz(Lj9BLjIgA-%w z%->sA@Uu({jO!Ya*5ntwy&jukMZW{JU6cuzRmS;uZYG1HktcKX6Jdqdyl3vT#KUA$ z3)r1#41L?wj3nz~82YR_q?%H zWR^7l!IK-gd;oQ!a$ZYFI*09*P*Wji!~J2!rmyfMs}Ensr_ zUO^@wNkP&GtS`gE(Q8SdJ*)r3zMqd579~|1@A@=@Y~WS(akbRR3d#F z`#PqKdS<=@yM8|?zAw%8p6mf1BMI6v^&X@B#FN=pbDLogiP8o&D-Ii}Ld?2F2rE(s zqQU*VpA)RW+L5E;&$FUBdpV>0sZ>&y`IAHG%Fy+$4Vd;q5CO=(f?2-zY?ZS(xBQV{;1wt%$lFwRa12+6h4o07~X#u*^yV1Y2_9# z(%3#3j=qkAA@`f8`(1#n`r$!OoIVA-58|kK<|)U&)5CSIy~zxn061r&NA47J4T&T$(~{SBO6eLlOfA?$rGN$cIdemN#$fjaNW%b^!CGZE_H>uG8wdruvOqpIe5=X{RgQ~`x;JO#iQ0QKW!`TU7 zs{I;H1w4X}VqGw7mJS!E6;e`E%?di|GC#EEV%#`q7(3esYhL@p6S*9W{Kkjix1O}w z)P$^RQ6%kVv&gBl3TU;m0pBjPqvxNiLGQ&4@LY5W4JBNsx^)tbaT#JOZpWruok_1bg+r$k5HGE(`1$5R^2}d|yunwvCKow#4QEpfJ#Ul0`UPH36{B_o`R%puCM)6hd_ic^^B@IH(XhU109yj5kp9^z;IscK*-Ofya{nWy zZ>lU!uPkFK?!P)ViJdV;V}MR!ku0Ke%#+`)Tyw(MDEj-a5P{E5bcv zD(OJ&IoRu(!p_TliIFlAWW!@6xYaYC`ZoJe{q+-IE{6gSF}H)Ra#1Q2Y)X&VD5J5% zIcUq)L!Sh58Zt4PElJVAa@+Utp38%FuM&V*hwaR(d*SS^*2A>v`aY;Xf10Ve<4k>K zpN9JSQ?xF976jiL1|IheZP9Rm@plqv%|-yX4pUsKSu{tU+Ch%;ApDD;~aki>#ata_9|`GN0P zzuOiNe^iOA=K3y~0=q%&+Dh)6QG@3EXc(-0f-Z^H5H6@m7j?hGBYX8ZgZ5IY@A(pj zg5HBe{smmcWz_WDMXA*tWzu|vWxf2?@HZ}cg>TixNP@;w7=4@udpFGnhxb!>Wyai` za$OmU?DJ-C8!klgHU^e_Y2e_Ep6JHi`Nzv^5%0?cCl_R~o~Hw${^FlMCmwWJ@;$3ZFMhlheB z$?VsZ*K1`>Y&5e#@A?}oj+uw2a=G<5{1?}~xWMWhTu6V3Hq<04tRpY8N*I^@Qshyp z2Ql1Sz*CI)%ck?Vd;R)UuERK)Y;U$A&fESY^WU7q=DdyME62X;Ubhz>op-~0u{^xT zd%(z9p9B4knatE@amakQ#8|)AgIO9DaNpt-ZjB6qD=OTV3ybL`JZrUCYg z%pzJT%6P){CY;zUMBaUVfHOBACV`RRu+-ry?s9nprRf7hNGD zR1)+r?4Tw?JQ}{@6z|#jg)r0R4QHzF;^`@_CQc^|iK=`r1l%pfGa?@J&FxyeulNGb z{NU(A9=q6h{XS4A6d->kGoi#IgD3~-QEfpz;@x=*9F`vheYdNmAu@)H--#5@x0=fMD}Fw8luTyT_B}#N@y+Dsx%W7BTboD?14~EGA({G zY2H$XlHr$m>M3Thre;4{{;{H}1FN9ZFdD~L9!&ac2+Kw6=mX~jSnnoBw=8Lbxu5xr}Nq0rXz`bxPI zoCb!v1kVEtA@02Pbq9Oz@-ysH;6sFp3VBlhAByid3t0gpL>lj&QB%r zk0puL?k%kN9SIt?rwAfd#<5Og0*TVHgZiz?bkBlDoHyN^Ies|+OB!Nfw~{_{_Et3e zIrtYArJG`5H48H51nGyaeq7RMO1$L)S*vg_A|A2~UYhjak_JJX(xSX9rn+w_@tboBbZ(tTDSKZkEKtCD&#ZuXZ-3hie#yc`UnjyL zp?lEq)B~FChqGbFC$J5|V)U1=Hmyk2Br9cQh)-Aq`yHR*%};6U>ZmkIB~Q^_kG-({ zpY-bp!BlU@nP! z7>BhBA4A5G2x#w>VqXr}!S%8#aN+tDAw#a@_$i57&H|}0U(%L})p4__Ma9Ta9^5n8 zOeC+r#bys9dU;C#_+?13iL{iiyEhxEzOG|$GR2V4G>YD@h>?(13+uV@$xmm!;c@x>t#}1Tva2rP+ z+A>(}MMXz1;;fQJmghc=(X|z(S9wW9ztD_q`L6`;a16MX;9=fp4!BYJW*5mB5`wm+ z%h=Uh#EDJzR8+rE47+S)(D;oLDk{cd`dVAw`AsqW42RE9Fxdz^CdxBP++KXO*EIUm zdlH?Z{{%m6lq3&UjG%)-5KW_^^!vxRDB#l%1+_OoLi#mc8c27XeYSAt`eFPU zL*d>`PjGYj0;XDaB=&a!DeAGoSLS_q#m1D_{GJaX$#wX&&x7*xyckuXP9`)n9AE64 zje{IZHDmZFzFFA|jjHaTxgZ{YwdqsEXiqjaJ08tvOHc`sPS)TcXT3dQ0Eq|roT=?N zXv*7aNG9*5}7?UwA zMw<5-YmDTnT)sOR#78k=R|i?cW5~|yu7#-RUF`j54lwE9f3PmT|Eaq=NZA%FgJF&b{R8Nw~DdsyMq%{(=jEtn!RT{ ziBzgS!L_@EY37D%=GtL>*gUrwbW+c;4;tNJNskoAPg#TC3J2Mbsx=t--#DxE2))jX>qo5s{m%lJ27jsh#T;_QIA9i zCBT9Do6Lkk1)@qtDBd+CXN$!l=A$mPTl9=+*`-3KCGE$jC&P%tuq}yeT2CTNTd;h0 zBO{&5gZO7f^wW=njJ|g-*l+d0C99tSYa@*Xm3Q%>oHsPjSx(=*iKWvdnwh}ZTFlyc z15R`2@GWNr!A@`=UhH_l7nM~d+nFY8ZukP_nWf~7(@U7tz5y9MeKPYZ55wPy6Xs$h z?)J1q`7#4ky|teS-dci_o)uEP;`3}oX*#s4=aTlsEKm{MhQ9f^HvOwN;-o+QVDQ)n zd{igV+Y!-Z#UychXf%WJ^sCUhTZU@paj$!e4q2L^$n@VJ)asTBd|cAWSP@%Bd2$>` zKAwx!l{3)xjR6>5nM{rdFW~1lB$DosAq?4n9t`cHZ^|`S!pgoXoE&RMr`di5YXyJo z*dqrKmb!GVIoA<*TY+x7t}|rgJ9a?Dix{Vy!3MV(v~NV86`k6Ea|YFjLd*#wQkIHu zIrf^fdo!lC&En9=jYJn6l@$qxk?&k?C9x)^412VMpaxSk#wY_G=*gbgo_BMKNqpX29cQ$vN!@u66 zg$Ex=5Si&G;Omz@Jg~!`bPEd6gme))a?^vf7RggPz8Ty<9YGyqsz7Y{ap+qULbD?> z!KeQjybWB!rz%c#Pnsr7-r0f4A+s2>+XCd6Q7`Pb6sIR|%8*EoG2{Q;i#6#OXPl!N zn0qxJKw^>=y~|HTf!9_xGJfk&yx_0Qt$XlxG)>)jO3*x3nzndiw>opIu78w;uNG z)+E^_*T5%RmqbPt6P9DC4Xr+bHZrPoLW4WAZRa>tg)b)62c$^k%OyBn=q!C!@Y{BIl2 zW8@!I+3Vk4t);YJxEU6kbmJ86rtiwj;}#FsPrfcIE}H!Dhr z23$JLZir4HQ_46t$o(~}&8cLL2QVME?A{FTE;h0PV(Cx{T)v*`=}8wIfGHDQ!0v%A zE9EanPBblmL*-JKBmV#_Z}h=Mu^J}Mc^^62Y)1AdaKE#?kBy;NA)#w4VTq13m78G5 zi_Pi9TCVFpIF;*5MyO!nhbU|d3d2M0LO8o=8xg!tTmnxPe-^WqR{ZP`v{ z6kmezs!p7^Z#vq&c!L%O`ytqW7O~EVWAw7q`4+)WJWG$&7%$=g-J4Qi*E2;Js|_JK z$%Qb&<%kuMmXpl*Y&zavjckZC%{owuvu5n0W5LI8v(;v>5!AwlN7ISnFHiQ7g&nN1 z<9J01YD5FiFa@PzRHZVVmDBbGFNp_GGM&(gseIIFdcm*pyTVkh(WYS!r-9QlZQM3h ziMOV4HgSG#3o(VF^uc0^#iR8Q`bCw_Sy%(_D_IQFT25cOs*$@Ql-hP!V}*eo8}3>K zU3$8Z)7yu^-FkHW$7}4!uW_dT-F4<9$F!N?YDl6*2*^mPzGUrek(`mk=NjQkK5>v7qI2+b*Sc5F>u2d(OJ0th6Ml1kS^_R z8Hd>g|3SrBThh@L2wGGNYV2)!XPk#%_Q&;bIog~iFVn=UarfZb$wWqF+6(mRUk5p^ zN#yIdc-HFUdo-BHt*b+gsAH>u!s?Z9bgm9bOHv^)u@9mTo#J>OGsvy!YrxWbGF#cE zN26k+(SE-!$lQ9uY)Cg|I`?{G+`CycG$w<+k$fGh&YggiDPc^vXeUhYQbL@f0I9#s zASTX`gk^oj_icPIeHBFn9ZOl|3t{93cix+q`2rM6_EO#N@i5(NB0V6|3^toy@GQQ5 z1Use*)=N#Mmsb_zSgbB4&7Vr`x5SYX34EOQ%7}KXm0@e1>w})e7~Z72XqrF;Uu9Y= zTe$9xb;NNi^4jkPhW-?!yUyK$UH1j)r&UexJ7Nr%@Lj24<}&_D%j;}!IoG{=Q_K4u zbbyxqc?qpE^MKxG;bG@)2sg`P{t0nC3&~2HD{=|{@uW%41Z6O@F@$ARP9z~z4O0{z zunJ=n=mMKT>?)KX$BI9*H+&XR*^wdqRkwmpRX7EM2UW<4los4$6OE;EC%9R%C>#PPHcSj2m^WaTYeo*DwP`;^TP` z7#5EA-LJqcyYp-~$JtsZsf;hw2XT|lG?*IA;=rd8-X)I7>2ojx=k{=S$f8Gy%rM}S zKl>>6g0gy+`@yvQ8_)F35)eFnh(wOIL7Dbps9qxlMLQnArX>oD;@<>Zkr0c`N|WfJ z$8L;9(sWEW(_m$FCXppvZdoKTitgDGi64Jg;A68?bU7+a)nm5d~Iqz*D9k}@}GkjhO|S2+7w5tWdro6@b+tu)V9rSaYU z-`D?r-Rsi!Sq?s*{k7J!etYk=_g?GwaGqk1AE9`^BY6I90lR#^h!jV1zN7A2M8Z>V zka=;0_%|)0{XP`I9{oxPwO&pBG_t~IuT1C{^-W-CKbmTse9oNyC7zkFawj~~m!t}u ze_PZ!3wqu3K6|}p7k--a6koJ?k&iQXz~yyu?Ck~x;%WL3ZYdWs8>(_BYki1}bc$hb ze2u4hSNQCX1vd1TlN0IOOeG>2837*)w_br~@be@tBznlYV}EWQN~1R~Z~Fpc~X{Ed;gzX(&@R>7Bd zBgtgVvDjR_3r%Ogfd!SeBx_OVWP=X^ScHj1+^=WVBp_SjO3 z@h?OjIuAMj0xmaC;VXz;)P$=|Yee&3wV^(jlfX|m3hq0T4}i2j?e=*QDQ zCF2fMKwa8z@FarUP4M~TeNeaImFVy_&U0w#OE7kt5AL)3mVL;UAaOalNM%!T{f>Nm z{rxd)w&C)1i22dxwT>jQO_t1xJI9Lo9fc{hiOqX|6D6H>;hCx}8)>?LF3A5C{fz1% z+SL#w+`Y*DCC#|$MmrA3{(@_aYw?WI0u=Hk=$Ma(pyKr;7Kgc$qk1R7er`29zGW*g z@qPmnzVF3N&(4B<#}nLIA%wH3`mlJgG%2zzg^34LhH2mT3!P#DOr;SM;3NIPDG`YCrp9FKKNyi8_i6$A*IHZs8L^rBb%M6cY7}TwyG5- zB(-4Q$MxWrluVO{^NH;OPaHTpn|-S7Ogz8%aHi)Pbms&KlA|-2RG2xF_8aa@>9|C) z;*=hpW4I7kteXwW=Vfr}{oyo*WJB%6!&rn_p!v)JJN_^wu@^K1Vlp8_XnC4>`0Wu} z7M3NldUp;!%x%Mh&_7XEG96$2z63KP%P~skW?8hO18O;TfW{8a?{StkX`QZ2rTQ); zrh+;~$rLTr%M^@*`vs-ct;$+P8l$- z6?}$11gXUpjK^|yGH22a48C%U^On(NR!%I%+Wr|}GGaGr7%qc>HS@{rM9xD^@g?35 zx-N3QyMuh2wVgGTU&T%};I3=&>U46%epEPMOx02qz{0E_^0~Q$1rPgBuTd3rW^o-m z=Di%O^xljo^F6S6;eL8M=o*f-KEcl58557iQ_0v7^U11Ji?QJBclbJ67kuxy(K6%J z-1N!CdE2t$aXoBX<|;AwJMmv#3wi;ItAY97T|L6 zak$khlifFGCQEa37>0Nuf6d&xS)mE zBwp0M_DPLCxO#xS=2Rz$j!A?P@oo6{_x|L;FiDiWwV72g>VTH; zaU`NzfgSOPn`87k3&NcF^!|Av9!Jh|EsXOh@3WBX5{YBXr_+qH$p{!fJ`SI4 z6RZj>C3%P9QSzxe)NwiAGWKYb(rR-eYo7xanpyC{N!jeu@nOX7+gEl}xF%8K+Gl+? z0cIo)r_pD`NVd%-2vtdgtYsG9U~UfEWVc~he?xHO*0lD0piP6T2apy&Kl)hDlg*wv zl`+(tK%!+Y!npqaP_XMNY_v#YuS+#C{u2~vh2u;7u<;65{xJ)VteguQqxsZ9eJZ=m zGpF3+;yAP{y2FkiVa}MuTY_w`7}+`QGfb;dqy4-ZAw=sMo3cNKjFLG5TB~M4UhNUw z@cIRmF6DffKS31{D(D3N^+@s&6m@_aZOzy3SOs4OQJ zEB1ib9xvAGiixP%{SU@tGWQ_o3X6)X&Dka|Yl!|nnnZBxHXBtlL^HM+gJn=YP4y(K z;ht@*TFfGB7VLpT>ko4IvZQHWi6L~rw`t^T5}`{@wJ^L_szj_nlhl|rvX#ZU$TsxH z6z&~U%e!3B4!g?54zWp+;)ODpTR&iulbutv&G{ZHA0ocIJ!8&40oOOdyOa;;BCSO_{C9$+b7c8*hEK{`UciRkzeAc)5XlrzBU6Ll zqw_^eI#JJ>q~sdF;@E2Va`PFCtQpA2YVYNIZ_0?elQTqlq=S!ii$G<68ls?nL%@tYV=Idc!TQ1`JZbTO zsoi-Cq-UE@tw&#>uIe=`t#yX1&=$7TMvATsAIENsVCa-NTzxX`f&ZWcayL-~l?oxG zY|v0L@hlI#T>K09u{?eg#qsKl*5{TR8MhL1ReSNqL?yu=5Pt8NRfDcqW) z5*xTRSV+YN_rbp6Vz^;$8)LS`m=vlUNAdTSTn@J!rtrya&Yxg08TL(|tY4hMtZ}B` z^JM~+zZlD`9dL$qdr=Pq77F3>=oBuW;cmk2N&sz#I+)wcL&oY5cpNszJ8y`E3zFelYGFf&5&+=BToAbyAN^)+HmvpG)P|10m?2av|rU^=mW-9Z%Eqrfjd#8^GmUhtz;&AySwDlLOnHC{lAS~ASN)_o%T zaw|E1Q!jXGf1+a2|SF41$I?jjYfa(5269MrENh6vgQMKg{wA z3h`=MIH>2(qE);3)N+?T-SmWowbd$Yg61XkQU3*xHeF?|>Q#zJv<4=*Wirz{rlb3( z&0sp_HJl8KMYe1a*)TFx^zDHdmtSuMf$Mx?liCPF7PjEMWDU4~?k;!=;_;UKSC(;h z1t}LzdhEbuCM=B0{ZM}aB_g+QYs&|b*rg1OuRVhc%C=L#b<*e~6ytpDxwQ6;N%%%u z8xO|xf!gJ5?A|Pj8yiE}5fSaI)HxQ556;GT#sUkf6|gL79lmNAM-SX_CYGLgFrnWj zawo0|&lg{T;4oiYbtF}gzIhco%sLF7_myeUP#x;Mt_I(4^MQD4K0U$BEn6Iv#O9cd z1A%j2`b-!L0SfEk&156GP0ZDIxU5-0zI#ZvtxT%BSOpe!_i6XGH7Pom9{X``3giTb|*V8do-@~ zyoYrKT6CVO9yyhG8Vo}9pjiDJylt;RJA*_NIZ2`JKq*MrvLDZcr((9$UM?5JCb~T! z2kaf}sBTFcHtD>8i#5t*L%TjPipZoES^L4E$XR4-Bu%Umr0FijDI|_tx8+!!z^YtJ zAelOQu#LILELwH}w8FHhTBa< zb-Z1L2C9|pW)xwz=UGwxG(+OZJt~Yb&Sz(qFQ5i;4>9T6MCv}rnJzn_0JElq;_yS0 zuvp05BV3!uzRvpub%B}4PiM$n#kr*I@=`j|IhQ$=`v!)%*D#~xov0*3A^No{oYnu6 zk@?~PkDqFxJ~M^L^fpLj0ea=UW7=I4Sd)JJsZ!f5 z#yoQ@rt1#k=0@Iy5k?8@%?b&OGNWv3VIjz`p9XUVJZJhGTFUmBu7N`iY{Tm&gUO59 zN?7+~HnyI06?hJJCf|1rCgB?k;Wo;W0}lWWSM*13sdh%;UQaLqFGnP|fto%o~QgvLiJ*~s!%aN#`m zEN2?Qr~2;#w<0O9DNcs=C7NVeq86i@Wmw!Vjnpc zHMm?Mvcl_3%FY6eP%A;(6(;1=WrIlqv ziQ0nJ`WH?aam;!8?PROB-yCA`N)hDz%5`zZryOMPsKFNLG|)CWh3b=ZtK;{J@G#+{9-ZsxD#TJV|a&4ws8C z=>j{NTZ8*_&@;wwAm^$2xsKVCEk?f7>Jo-+L!s?!lwW&Ql<<8R-J2AT2{){|$O ztrJ#oyK_aSOGPx?`Mec@;ck8&E^dB-?!KY=hWbAO@ugTp;S*1G)PkD>0aejeR*!`CKDg9;A%qZo3fa})B1YxTzW z_2`YRJ+*jmXWxwOM01})zJ+!V^q`PHpB`eeE_rjFkdxVuGO7zz#j|^=zh4j+@_!bi z(}8_EI=ikb@%1C|ZlnBzXxsy_W2NT7PGVOvoIl*>Z^R$k`Ux@YQ=FSy!8Q0t=_-c3 z-V*-|{b@0%oey}`$?qzLDxco?y^CSBe_BoVVtDA=1HBh9#Os@W?p_RMe(9dtn;52+ zjA-ucx~^hKA1BpqlzS7yZ)z8cI*DDy;QR8gM5CWQGn7O7cn#sOb_i|3@hGtPwh<%TYe4Q+1Yhn z#b6#P+ijG46T>b3skd~sCR(p|Be~_yaPO3LyUU3?6Cf7O`W5vuDs3V z{r`d2Q~mVieRMnfUH8A$;|cjoMT&pp{j{7mpZK`56WjF|Si}AUws#dp`rUHrK9;HY zSE!MG@3E9tn`qR1EIqyr{7c(Ac|FC_L}j^FXQR8u((L=7zwv%Lmi^ba&*{W=jim!m zse5eiv0QTXZENSTGqy{=`}37Ll^z-v;^FG=;vcvo+|M=4n@beV4QhV`wg-WZGHJfi zJ=ivS@IQmO(_k;)mET<7cOIKv!=NLs+!=U#@iR{mb=TQLZao?PmW^RQ0 np.ndarray: + return np.array(a.astype(mx.float32)) + + +def n_refs(arrays: dict) -> int: + return sum(1 for k in arrays if k.startswith("refs.")) + + +def inputs(model, arrays: dict): + """latents, features, references and sigma of a fixture.""" + lat = mx.array(arrays["latents"]) + feats = mx.array(arrays["features"])[None] + refs = None + if n_refs(arrays): + refs = model.references( + [mx.array(arrays[f"refs.{i}"]) for i in range(n_refs(arrays))]) + sigma = np.reshape(np.float32(arrays["sigma"]), (1,)) + return lat, feats, refs, sigma + + +@contextmanager +def oracle_time(arrays: dict): + """The model reads the reference's time embedding at the fixture's + sigma, so a row measures the model and not the sinusoid. The + reference's fp32 exp can be an ulp off the correctly rounded one, + which can move one bf16 entry of the embedding; ``own_time_gap`` + holds gmlx's own.""" + want = np.float32(arrays["sigma"].reshape(())) + emb = arrays["in.time_in"] + real = fm.time_embedding + + def time_embedding(t, dim): + t = np.reshape(np.asarray(t, np.float32), (-1,)) + assert (t == want).all(), f"no oracle embedding at t = {t!r}" + assert emb.shape[-1] == dim + return mx.array(np.broadcast_to(emb[:1], (t.size, dim))) + + fm.time_embedding = time_embedding + try: + yield + finally: + fm.time_embedding = real + + +def own_time_gap(arrays: dict) -> tuple[int, float]: + """The entries where gmlx's time embedding differs from the + reference's, and the largest difference in bf16 ulps of the + reference's entry.""" + got = np.array(fm.time_embedding(arrays["sigma"].reshape(()), + arrays["in.time_in"].shape[-1]))[0] + want = arrays["in.time_in"][0] + diff = got != want + if not diff.any(): + return 0, 0.0 + mag = np.maximum(np.abs(want[diff]), 2.0 ** -126) + ulp = 2.0 ** (np.floor(np.log2(mag)) - 7) + return int(diff.sum()), float((np.abs(got - want)[diff] / ulp).max()) + + +def mod_rows(mod: fm.StepModulation, vec: mx.array) -> dict: + """The time vector and the modulations in the fixture's row names.""" + def cat(chunks): + return mx.concatenate(chunks, axis=-1)[:, 0] + return {"vec": vec, + "double_stream_modulation_img": cat([*mod.img[0], *mod.img[1]]), + "double_stream_modulation_txt": cat([*mod.txt[0], *mod.txt[1]]), + "single_stream_modulation": cat(mod.single), + "final_layer.adaLN_modulation": cat(mod.final)} + + +def free_rows(model, arrays: dict) -> dict: + """Every row of one step from the fixture's inputs, and the + velocity.""" + lat, feats, refs, sigma = inputs(model, arrays) + taps: dict = {} + vec = model.vector(sigma, 1) + mod = model.modulation(sigma, 1) + out = mod_rows(mod, vec) + vel = model(lat, sigma, feats, taps, refs=refs, mod=mod) + out.update(taps) + got = {k: _np(v) for k, v in out.items()} + got = {k: v[0] if v.ndim == 3 else v for k, v in got.items()} + got["velocity"] = _np(vel) + return got + + +def fixture_modulation(model, arrays: dict) -> fm.StepModulation: + """The step's modulations as the oracle formed them.""" + act = model.act_dtype + + def split(name, n): + a = mx.array(arrays[name]).astype(act)[:, None, :] + return tuple(mx.split(a, n, axis=-1)) + + img = split("double_stream_modulation_img", 6) + txt = split("double_stream_modulation_txt", 6) + return fm.StepModulation( + img=(img[:3], img[3:]), txt=(txt[:3], txt[3:]), + single=split("single_stream_modulation", 3), + final=split("final_layer.adaLN_modulation", 2)) + + +def ids_of(model, arrays: dict) -> tuple: + """The position ids of the image stream, references after the image, + and of the text.""" + lat, feats, refs, _ = inputs(model, arrays) + _, _, h, w = lat.shape + img = fm.image_ids(h, w) + if refs is not None: + img = np.concatenate([img, refs.ids]) + return img, fm.text_ids(feats.shape[1]) + + +def forced_rows(model, arrays: dict) -> dict: + """Each block and the final layer on the fixture's float32 input to + it, with the fixture's modulations.""" + act = model.act_dtype + cfg = model.cfg + mod = fixture_modulation(model, arrays) + img_ids, txt_ids = ids_of(model, arrays) + rope_img = fm.rope_tables(img_ids, cfg.axes_dims, cfg.theta) + rope_txt = fm.rope_tables(txt_ids, cfg.axes_dims, cfg.theta) + + def row(name): + return mx.array(arrays[name])[None].astype(act) + + out = {} + for i, blk in enumerate(model.double_blocks): + src = ("img_in", "txt_in") if i == 0 else \ + (f"double_blocks.{i - 1}.img", f"double_blocks.{i - 1}.txt") + img, txt = blk(row(src[0]), row(src[1]), mod.img, mod.txt, rope_img, + rope_txt) + out[f"double_blocks.{i}.img"] = _np(img)[0] + out[f"double_blocks.{i}.txt"] = _np(txt)[0] + cos, sin = fm.rope_tables(np.concatenate([txt_ids, img_ids]), + cfg.axes_dims, cfg.theta) + n = arrays["in.single_blocks.0"].shape[0] + smod = tuple(mx.broadcast_to(t, (1, n, cfg.dim)) for t in mod.single) + for i, blk in enumerate(model.single_blocks): + src = "in.single_blocks.0" if i == 0 else f"single_blocks.{i - 1}" + out[f"single_blocks.{i}"] = _np(blk(row(src), smod, cos, sin))[0] + y = model.final_layer(row("in.final_layer"), *mod.final) + out["final_layer"] = _np(y)[0] + return out + + +# Fixture arrays that are inputs of the step, not rows of it. +INPUTS = ("latents", "features", "sigma", "velocity_bf16") +INPUT_PREFIXES = ("refs.", "ids.", "in.", "down.", "up.") + + +def fixture_rows(arrays: dict) -> set: + """The rows a fixture holds: every array but the step's inputs.""" + return {k for k in arrays + if k not in INPUTS and not k.startswith(INPUT_PREFIXES)} + + +def measures(model, arrays: dict, own_time: bool = False) -> dict: + """Relative L2 of every row against the fixture: teacher-forced for + the blocks and the final layer, free running for the rest, and + ``free `` for each block and the final layer run free. The rows + measured are the fixture's rows, each of them. The model reads the + reference's time embedding unless ``own_time``.""" + if own_time: + free = free_rows(model, arrays) + else: + with oracle_time(arrays): + free = free_rows(model, arrays) + forced = forced_rows(model, arrays) + got = {} + for k, v in free.items(): + if k == "velocity": + got[k] = rel(v, arrays["velocity"]) + elif k in forced: + got[k] = rel(forced[k], arrays[k]) + got[f"free {k}"] = rel(v, arrays[k]) + elif k in arrays: + got[k] = rel(v, arrays[k]) + rows = {k for k in got if not k.startswith("free ")} + want = fixture_rows(arrays) + assert rows == want, (f"rows the step did not give: {sorted(want - rows)}" + f"; rows the fixture lacks: {sorted(rows - want)}") + return got + + +def gate(name: str, m: dict) -> float: + """The product gate of a measure: the manifest's tolerance of a row, + and for a block or the final layer run free, ``free ``, twice the + oracle's own bf16 against fp32 gap of that row run free.""" + if name.startswith("free "): + return 2 * m["results"]["free_bf16_vs_fp32"][name[len("free "):]] + return m["tolerances"][name]["rel_l2"] + + +def missed(got: dict, m: dict) -> dict: + """The measures over their gate, by name.""" + out = {} + for k, v in got.items(): + g = gate(k, m) + if not v <= g: + out[k] = (v, g) + return out + + +def forced_row(name: str) -> bool: + return name.startswith(("double_blocks.", "single_blocks.")) \ + or name == "final_layer" + + +def free_row(name: str) -> bool: + """A free-running row of ``measures``: every measure but the + teacher-forced rows and the velocity.""" + return not forced_row(name) and name != "velocity" + + +# The exact gate: the step in the oracle's fp32 arithmetic. + +@contextmanager +def _exact(model): + """The exact path, after which every K-quant product of the step ran + dense.""" + with bg.exact_products(model) as used: + yield + bg.assert_all_dense(model, used) + + +def exact_measures(model, arrays: dict) -> dict: + with _exact(model): + return measures(model, arrays) + + +def exact_free_floor(model, arrays: dict) -> dict: + """Relative L2 of each free row of ``measures`` and of the velocity + between the exact step on the GPU and on the CPU stream.""" + with _exact(model), oracle_time(arrays): + gpu = free_rows(model, arrays) + with mx.stream(mx.cpu): + cpu = free_rows(model, arrays) + out = {} + for k, v in gpu.items(): + name = f"free {k}" if forced_row(k) else k + if k in arrays or k == "velocity": + out[name] = rel(v, cpu[k]) + return out + + +def exact_gate(name: str, tols: dict) -> float: + if name == "velocity": + return tols["velocity"] + if name.startswith("free "): + return tols["free"] + return tols["free"] if free_row(name) else bg.EXACT_TOL + + +def exact_over(got: dict, tols: dict) -> dict: + return {k: (v, exact_gate(k, tols)) for k, v in got.items() + if not v <= exact_gate(k, tols)} + + +def exact_line(label: str, got: dict, tols: dict) -> str: + def worst(keys): + k = max(keys, key=got.get) + return f"{got[k]:.2e} at {k}" + forced = [k for k in got if forced_row(k)] + free = [k for k in got if free_row(k) and not k.startswith("free ")] + run = [k for k in got if k.startswith("free ")] + return (f"{label}: teacher-forced rows within {worst(forced)}, gate " + f"{bg.EXACT_TOL:.0e}; velocity {got['velocity']:.2e}, gate " + f"{tols['velocity']:.2e}; free rows within {worst(free)}, " + f"blocks run free within {worst(run)}, gate {tols['free']:.2e}") + + +def fault_line(label: str, bad: dict, tols: dict) -> tuple[str, float]: + parts = [] + for kind, keep in (("teacher-forced", forced_row), + ("velocity", lambda k: k == "velocity"), + ("free", lambda k: free_row(k) and k != "velocity")): + r = {k: bad[k] / exact_gate(k, tols) for k in bad if keep(k)} + miss = [k for k, v in r.items() if v > 1] + if miss: + top = max(miss, key=r.get) + parts.append(f"{kind} {len(miss)} rows, up to {r[top]:.0f} of " + f"the gate at {top}") + top = max(bad[k] / exact_gate(k, tols) for k in bad) + return (f"{label}: misses through " + ("; ".join(parts) or "nothing"), + top) + + +# The site gate: each op of a block on the path a request takes, against +# the stock op in float32 on the same production input, within 2 n u. The +# float32 side runs on the CPU, whose float32 products are exact. A reading +# is (block, "step", op, call number) for an op of a block, with +# ``qg.HEAD`` after it for the worst head row of a q or k site, and +# (module path, call number) for a linear leaf, so the helpers of +# qwen_gates.py read it. +# +# The sites of a block: adaln, the LayerNorm and modulation in fp32 that +# round at 1 + scale and at the cast; q and k through the q and k seam; +# sdpa; glu, from a double block's modulated input to the rows of mlp.2, +# whose stock ops round the mlp.0 product and the swiglu; swiglu, the seam, +# where the stock ops run it; out, a gated product added to the residual, +# of a double block's proj or mlp.2 or a single block's linear2 on its +# attention and feed-forward rows; and every linear leaf. On the residual +# route ``out`` is one of mlx-kquant's residual epilogues, held to its own +# count, and its leaf is read through it. +OP_ROUNDINGS = { + "adaln": 2, # 1 + scale, then the cast of the fp32 result + "qk": 2, # the norm, then the cast after the fp32 rotation + "sdpa": 1, + "glu": 4, # the mlp.0 product, then swiglu + "swiglu": 3, # silu's sigmoid, silu, the product + "out": 3, # the leaf product, the gate, the residual +} +# Calls of each op in one block of each kind. +BLOCK_OPS = {"double": {"adaln": 4, "qk": 2, "sdpa": 1, "glu": 2, + "swiglu": 2, "out": 4}, + "single": {"adaln": 1, "qk": 1, "sdpa": 1, "swiglu": 1, + "out": 1}} +# The leaves a step reads past their call: the time vector and the +# modulations run as float32 products on the dequantized weight. +NOT_CALLED_PREFIX = ("time_in.", *(f"{m}." for m in MODS)) + + +def block_names(model) -> dict: + """id of each block of ``model`` to its module path.""" + out = {id(b): f"double_blocks.{i}" + for i, b in enumerate(model.double_blocks)} + out.update({id(b): f"single_blocks.{i}" + for i, b in enumerate(model.single_blocks)}) + return out + + +@contextmanager +def step_sites(model, sites: dict, routed: dict | None = None, + heads: dict | None = None, skipped: set | None = None): + """Fill ``sites`` with a reading for every op of every block and every + call of a linear leaf while steps run: key to (relative L2, gate). + ``routed`` takes the mlx-kquant op of each site a kernel route ran, + ``heads`` the place of the worst head row of each q and k site. + ``skipped`` takes the path of a leaf called on a float32 input, which + runs in float32 and has no site.""" + import mlx_kquant as kq + + from gmlx.image import ops + from gmlx.image.lora import install + from gmlx.image.ops import attention, epilogues + + f = mx.float32 + act = model.act_dtype + names = block_names(model) + cur: list = [] + counts: dict = {} + calls: dict = {} + ran: list = [] + paths = {id(m): p for p, m in install.modules(model).items() + if install.linear_dims(m) is not None} + + def exact_leaf(mod, x32): + codec = getattr(mod, "kquant_type", None) + w = mod["weight"].astype(f) if codec is None else \ + kq.dequantize(mod["weight"], mod["scales"], codec, f) + return x32 @ w.T + + def read(op, got, want, rounds, by_head=False): + key = (cur[-1], "step", op) + n = counts[key] = counts.get(key, 0) + 1 + outs = got if isinstance(got, tuple) else (got,) + same = all(o.dtype == act for o in outs) + gate = 2 * rounds * qg.SITE_UNIT * same + with mx.stream(mx.cpu): + exact = want() + r = qg._rel_l2(got, exact) + if by_head: + e2, r2 = bg._head_sums(outs, exact if isinstance( + exact, tuple) else (exact,)) + mx.eval(e2, r2) + sites[(*key, n)] = (r, gate) + if by_head: + worst, at = bg._worst(np.array(e2), np.array(r2)) + sites[(*key, n, qg.HEAD)] = (worst, gate) + if heads is not None: + heads[(*key, n)] = at + return (*key, n) + + def leaf_site(path, r, gate): + n = calls[path] = calls.get(path, 0) + 1 + sites[(path, n)] = (r, gate) + + def within(orig): + def run(blk, *a, **k): + hit = names.get(id(blk)) + if hit is None: + return orig(blk, *a, **k) + cur.append(hit) + try: + return orig(blk, *a, **k) + finally: + cur.pop() + return run + + def adaln(orig): + def run(blk, x, shift, scale): + y = orig(blk, x, shift, scale) + if cur: + read("adaln", y, lambda: fm.adaln( + x.astype(f), shift.astype(f), scale.astype(f), blk.eps, + f), OP_ROUNDINGS["adaln"]) + return y + return run + + def qk(orig): + def run(q, k, q_w, k_w, cos, sin, eps): + before = len(ran) + out = orig(q, k, q_w, k_w, cos, sin, eps) + if not cur: + return out + kernel = "qk" in ran[before:] + key = read("qk", tuple(out), lambda: attention.qk_norm_rope( + q.astype(f), k.astype(f), q_w.astype(f), k_w.astype(f), + cos, sin, eps), + bg.KERNEL_ROUNDINGS["qk"] if kernel else OP_ROUNDINGS["qk"], + by_head=True) + if kernel and routed is not None: + routed[key] = bg.KERNEL_OPS["qk"] + return out + return run + + def sdpa(orig): + def run(q, k, v, mask=None): + out = orig(q, k, v, mask) + if cur: + read("sdpa", out, lambda: attention.sdpa( + q.astype(f), k.astype(f), v.astype(f), mask), + OP_ROUNDINGS["sdpa"]) + return out + return run + + def hidden(orig): + def run(blk, mlp, h): + before = len(ran) + y = orig(blk, mlp, h) + if not cur: + return y + kernel = "glu" in ran[before:] + + def want(): + a, b = mx.split(exact_leaf(mlp[0], h.astype(f)), 2, axis=-1) + return epilogues.swiglu(a, b) + + key = read("glu", y, want, bg.KERNEL_ROUNDINGS["glu"] if kernel + else OP_ROUNDINGS["glu"]) + if kernel: + if routed is not None: + routed[key] = bg.KERNEL_OPS["glu"] + leaf_site(paths[id(mlp[0])], *sites[key]) + return y + return run + + def swiglu(orig): + def run(a, b): + out = orig(a, b) + if cur: + read("swiglu", out, lambda: epilogues.swiglu( + a.astype(f), b.astype(f)), OP_ROUNDINGS["swiglu"]) + return out + return run + + def gated(lin, x, gate, rows, y, before): + fused = "resid" in ran[before:] + n = math.prod(x.shape[:-1]) + each = 1 if n >= qg.RESID_ONE_ROUNDING_ROWS else 3 + + def want(): + return epilogues.gated_residual( + x.astype(f), gate.astype(f), exact_leaf(lin, rows.astype(f))) + + key = read("out", y, want, each if fused else OP_ROUNDINGS["out"]) + if fused: + if routed is not None: + routed[key] = "quantized_matmul_residual" + leaf_site(paths[id(lin)], *sites[key]) + + def double_out(orig): + def run(blk, lin, x, gate, rows): + before = len(ran) + y = orig(blk, lin, x, gate, rows) + if cur: + gated(lin, x, gate, rows, y, before) + return y + return run + + def single_out(orig): + def run(blk, x, gate, rows, hid): + before = len(ran) + y = orig(blk, x, gate, rows, hid) + if cur: + gated(blk.linear2, x, gate, + mx.concatenate([rows, hid], axis=-1), y, before) + return y + return run + + def resid(orig): + def run(x, leaf, residual, gate): + ran.append("resid") + return orig(x, leaf, residual, gate) + return run + + def leaf(orig): + def run(mod, x, *a, **k): + before = len(ran) + y = orig(mod, x, *a, **k) + path = paths.get(id(mod)) + if path is None: + return y + if x.dtype != act: + if skipped is not None: + skipped.add(path) + return y + with mx.stream(mx.cpu): + r = qg._rel_l2(y, exact_leaf(mod, x.astype(f))) + rounds = 1 + if "lora" in ran[before:]: + rounds = bg.KERNEL_ROUNDINGS["lora"] + leaf_site(path, r, 2 * rounds * qg.SITE_UNIT) + return y + return run + + leaf_types = {type(m) for m in install.linear_leaves(model).values()} + hooks = [(fm.DoubleBlock, "__call__", within), + (fm.SingleBlock, "__call__", within), + (fm.DoubleBlock, "adaln", adaln), (fm.SingleBlock, "adaln", adaln), + (fm.DoubleBlock, "hidden", hidden), + (fm.DoubleBlock, "out", double_out), + (fm.SingleBlock, "out", single_out), + (ops, "qk_norm_rope", qk), (ops, "sdpa", sdpa), + (ops, "swiglu", swiglu), (ops, "resid_fused", resid)] + hooks += [(cls, "__call__", leaf) for cls in leaf_types] + saved = [] + try: + for obj, attr, hook in hooks: + saved.append((obj, attr, getattr(obj, attr))) + setattr(obj, attr, hook(saved[-1][2])) + with bg.kernel_calls(ran.append): + yield sites + finally: + for obj, attr, orig in reversed(saved): + setattr(obj, attr, orig) + + +def missing_ops(model, sites: dict, routed: dict, skipped=()) -> list: + """What one step leaves unread: each block that ran calls every op of + ``BLOCK_OPS`` of its kind as often as it names, the swiglu seam of a + double block only where glu ran on the stock ops, and every linear leaf + of a block that ran and every embedding leaf is read once.""" + from gmlx.image.lora import install + + got: dict = {} + for block, _, op, _ in qg.op_sites(sites): + got[(block, op)] = got.get((block, op), 0) + 1 + ran = {b for b, _ in got} + glu_on: dict = {} + for k, v in routed.items(): + if len(k) == 4 and k[2] == "glu": + glu_on[k[0]] = glu_on.get(k[0], 0) + 1 + want = {} + for name in ran: + kind = name.split("_", 1)[0] + for op, n in BLOCK_OPS[kind].items(): + if op == "swiglu" and kind == "double": + n -= glu_on.get(name, 0) + if n: + want[(name, op)] = n + out = sorted(f"{k}: {got.get(k, 0)} of {n}" for k, n in want.items() + if got.get(k, 0) != n) + out += sorted(f"{k}: not a known op call" for k in got if k not in want) + + def called(p: str) -> bool: + if p.startswith(NOT_CALLED_PREFIX) or p in skipped: + return False + if p.startswith(("double_blocks.", "single_blocks.")): + return ".".join(p.split(".")[:2]) in ran + return True + + leaves = {p for p in install.linear_leaves(model) if called(p)} + read: dict = {} + for k in sites: + if len(k) == 2: + read[k[0]] = read.get(k[0], 0) + 1 + out += sorted(f"leaf {p}: {read.get(p, 0)} of 1" for p in leaves + if read.get(p, 0) != 1) + out += sorted(f"leaf {p}: not a leaf a step calls" for p in read + if p not in leaves) + return out diff --git a/tests/image/test_image_flux2_model.py b/tests/image/test_image_flux2_model.py new file mode 100644 index 000000000..df667afa2 --- /dev/null +++ b/tests/image/test_image_flux2_model.py @@ -0,0 +1,349 @@ +"""The FLUX.2 klein DiT on the CPU: the module tree against the tensor +names of the 4B and 9B files, the RoPE tables against the reference's, +and a tiny model against BFL's own class from the committed fixtures of +scripts/image_oracle/check3_flux2_klein.py --self-test, with two +reference images and with text alone, in fp32 at a fixed bound and in +bf16 at twice the oracle's own gap. The step parts that a pipeline +memoizes give the step they stand in for. Each wrong model of FAULTS +misses the fp32 bound. + +The fp32 rows read the reference's time embedding, so they measure the +model. gmlx's own embedding is held apart: the reference's fp32 exp is an +ulp off the correctly rounded one at some frequencies, which moves one +bf16 entry of the embedding at some times, 0.73 among them.""" +from __future__ import annotations + +import mlx.core as mx +import numpy as np +import pytest +from mlx.utils import tree_flatten + +import flux2_gates as fg +from image_fixtures import fixture_view +from oracle_fixture import committed_fixture + +from gmlx.image import fingerprint as fp +from gmlx.image import ops +from gmlx.image.dtypes import ImageDtypeError +from gmlx.image.families.flux2_klein import model as fm +from gmlx.image.loader import check_names +from gmlx.image.registry import get_family + +TINY = "selftest_flux2_klein_tiny" +NOREFS = "selftest_flux2_klein_tiny_norefs" +# The tiny model in fp32 on the CPU against the oracle in fp32. The +# weakest wrong model of FAULTS moves its most moved row far past it. +TOL = 4e-6 +# The fp32 step on gmlx's own time embedding, one entry one bf16 ulp off +# the reference's. +OWN_TOL = 2e-4 + + +@pytest.fixture(scope="module") +def tiny(): + weights, wm = committed_fixture(TINY + "_weights") + return weights, wm["inputs"]["config"] + + +@pytest.mark.parametrize("name", ["flux2_klein_4b_q4_k_m.header.json", + "flux2_klein_9b_q4_k_m.header.json"]) +def test_the_module_tree_names_every_tensor_of_the_file(name): + """Strict name equality and the torch shape of every tensor, on the + real config. Nothing is evaluated.""" + got = fp.identify(fixture_view(name)) + model = get_family("flux2_klein").build(got.config) + check_names(model, got.view.tensors, "FLUX.2 klein") + params = dict(tree_flatten(model.parameters())) + for n, t in got.view.tensors.items(): + assert params[n].shape == tuple(reversed(t.shape)), n + + +def test_the_rope_tables_are_the_references(): + """The reference forms each angle in fp32, so at the positions of + the fixture its cosines differ from those of a float64 angle by about + 6e-5. The tables here are within two fp32 ulps of the reference's at + every position, and the float64 form of ops.rope_tables is not.""" + arrays, m = committed_fixture("selftest_flux2_klein_rope") + ids = arrays["ids"].astype(np.float32) + cos, sin = fm.rope_tables(ids, m["inputs"]["axes_dims"], + m["inputs"]["theta"]) + for got, want in ((cos, arrays["cos"]), (sin, arrays["sin"])): + err = np.abs(np.array(got) - want).max() + assert err <= 2.4e-7, err + c64, _ = ops.rope_tables(ids, m["inputs"]["axes_dims"], + m["inputs"]["theta"]) + assert np.abs(np.array(c64) - arrays["cos"]).max() > 1e-5 + + +@pytest.mark.parametrize("name", [TINY, NOREFS]) +def test_the_tiny_model_matches_the_oracle_in_fp32(tiny, name): + weights, cfg = tiny + arrays, _ = committed_fixture(name) + model = fg.tiny_model(weights, cfg) + # The CPU stream keeps fp32 products exact; the GPU's TF32 would not. + with mx.stream(mx.cpu): + got = fg.measures(model, arrays) + worst = max(got, key=got.get) + print(f"flux2 tiny fp32 {name}: {len(got)} measures, worst " + f"{got[worst]:.2e} at {worst}") + assert got[worst] < TOL, got + + +@pytest.mark.parametrize("name", [TINY, NOREFS]) +def test_the_tiny_model_in_bf16_is_inside_the_bf16_tolerances(tiny, name): + """On gmlx's own time embedding, as a request runs.""" + weights, cfg = tiny + arrays, m = committed_fixture(name) + model = fg.tiny_model(weights, cfg, act=mx.bfloat16) + got = fg.measures(model, arrays, own_time=True) + out = fg.missed(got, m) + assert not out, out + + +def test_the_own_time_embedding_is_the_references_to_one_ulp(tiny): + """At 0.73 one entry of gmlx's embedding is one bf16 ulp off the + reference's, and the fp32 step on it stays within OWN_TOL.""" + weights, cfg = tiny + arrays, _ = committed_fixture(TINY) + n, ulps = fg.own_time_gap(arrays) + assert n <= 2 and ulps <= 1.0, (n, ulps) + model = fg.tiny_model(weights, cfg) + with mx.stream(mx.cpu): + got = fg.measures(model, arrays, own_time=True) + worst = max(got, key=got.get) + print(f"flux2 tiny fp32, own embedding: {n} entries off by up to " + f"{ulps:.0f} bf16 ulp; worst {got[worst]:.2e} at {worst}") + assert got[worst] < OWN_TOL, got + + +def test_the_position_ids_are_the_references(tiny): + """Image tokens at (0, row, column, 0), the tokens of reference image + i after them at a first axis of 10 + 10 i, and text at (0, 0, 0, + position).""" + weights, cfg = tiny + arrays, _ = committed_fixture(TINY) + model = fg.tiny_model(weights, cfg) + img, txt = fg.ids_of(model, arrays) + assert np.array_equal(img, arrays["ids.image"]) + assert np.array_equal(txt, arrays["ids.text"]) + n = arrays["latents"].shape[2] * arrays["latents"].shape[3] + assert set(np.unique(img[:n, 0])) == {0.0} + assert set(np.unique(img[n:, 0])) == {10.0, 20.0} + + +def _embedded(t1000: float, dim: int = 8) -> np.ndarray: + want = ops.timestep_embedding(np.array([t1000], np.float32), dim) + return np.array(want.astype(mx.bfloat16).astype(mx.float32)) + + +@pytest.mark.parametrize("t, t1000", [(1.0, 1000.0), (0.958, 956.0), + (0.73, 732.0)]) +def test_the_time_embedding_follows_the_bf16_time(t, t1000): + """The time rounds to bf16, then 1000 times it rounds to bf16 before + the sinusoid, as the reference's embedder does on the bf16 time of its + denoise. 0.958 is 0.95703125 in bf16 and gives 956, where 1000 times + the time itself gives 960; 0.73 is 0.73046875 and gives 732, not + 728.""" + got = np.array(fm.time_embedding(np.float32(t), 8)) + assert np.array_equal(got, _embedded(t1000)) + if t != 1.0: + unrounded = float(fm._bf16(np.float32(1000) * np.float32(t))[()]) + assert unrounded != t1000 + assert not np.array_equal(got, _embedded(unrounded)) + + +def test_the_reference_tokens_run_in_the_activation_dtype(tiny): + """float32 reference latents enter the image stream as the bf16 of + the activations, as the image's latents do.""" + weights, cfg = tiny + arrays, _ = committed_fixture(TINY) + model = fg.tiny_model(weights, cfg, act=mx.bfloat16) + lat, feats, refs, sigma = fg.inputs(model, arrays) + refs = fm.References(refs.tokens * (1 + 2.0 ** -12) + 1e-3, refs.ids) + rounded = fm.References(refs.tokens.astype(mx.bfloat16), refs.ids) + assert not mx.array_equal(rounded.tokens.astype(mx.float32), + refs.tokens).item() + got = model(lat, sigma, feats, refs=refs) + want = model(lat, sigma, feats, refs=rounded) + assert mx.array_equal(got, want).item() + + +def test_the_step_parts_give_the_step(tiny): + weights, cfg = tiny + arrays, _ = committed_fixture(TINY) + model = fg.tiny_model(weights, cfg, act=mx.bfloat16) + lat, feats, refs, sigma = fg.inputs(model, arrays) + whole = model(lat, sigma, feats, refs=refs) + mod = model.modulation(sigma, 1) + cap = model.caption(feats) + parts = model(lat, sigma, None, refs=refs, mod=mod, caption=cap) + assert mx.array_equal(whole, parts).item() + assert len(mod.arrays()) == 6 + 6 + 3 + 2 + assert cap.arrays()[0].shape == (1, feats.shape[1], model.cfg.dim) + with pytest.raises(ValueError, match="text features"): + model(lat, sigma, None, mod=mod) + + +def test_a_batch_of_two_gives_each_row_its_own_velocity(tiny): + weights, cfg = tiny + arrays, _ = committed_fixture(TINY) + model = fg.tiny_model(weights, cfg) + lat, feats, refs, sigma = fg.inputs(model, arrays) + with mx.stream(mx.cpu): + one = model(lat, sigma, feats, refs=refs) + other = model(lat * 0.5, sigma, feats * 0.5, refs=refs) + two = model(mx.concatenate([lat, lat * 0.5]), np.repeat(sigma, 2), + mx.concatenate([feats, feats * 0.5]), refs=refs) + assert mx.allclose(two[:1], one, atol=1e-5).item() + assert mx.allclose(two[1:], other, atol=1e-5).item() + + +def test_float16_is_refused(tiny): + weights, cfg = tiny + model = fg.tiny_model(weights, cfg) + with pytest.raises(ImageDtypeError, match="float16"): + model.act_dtype = mx.float16 + + +def test_wrong_configs_are_refused(tiny): + _, cfg = tiny + with pytest.raises(ValueError, match="sum to the head dim"): + fm.Flux2KleinDiT(dict(cfg, axes_dims_rope=[4, 4, 4, 2])) + with pytest.raises(ValueError, match="guidance"): + fm.Flux2KleinDiT(dict(cfg, guidance_embeds=True)) + with pytest.raises(ValueError, match="one latent pixel"): + fm.Flux2KleinDiT(dict(cfg, patch_size=2)) + + +# Wrong models: each changes one convention of the forward. + +def _double(mp, change): + real = fm.DoubleBlock.__call__ + mp.setattr(fm.DoubleBlock, "__call__", + lambda self, img, txt, mi, mt, ri, rt: real( + self, img, txt, *change(mi, mt), ri, rt)) + + +def _shift_scale_swapped(mp, model): + _double(mp, lambda mi, mt: (((mi[0][1], mi[0][0], mi[0][2]), mi[1]), mt)) + + +def _norm_mods_swapped(mp, model): + """The modulation of the attention's norm on the feed-forward's and + the other way round.""" + _double(mp, lambda mi, mt: ((mi[1], mi[0]), mt)) + + +def _stream_mods_crossed(mp, model): + _double(mp, lambda mi, mt: (mt, mi)) + + +def _glu_halves_swapped(mp, model): + def hidden(self, mlp, h): + a, b = mx.split(mlp[0](h), 2, axis=-1) + return ops.swiglu(b, a) + mp.setattr(fm.DoubleBlock, "hidden", hidden) + + +def _single_split_swapped(mp, model): + """The single block's feed-forward halves in the other order.""" + real = ops.swiglu + mp.setattr(ops, "swiglu", lambda a, b: real(b, a)) + mp.setattr(fm.DoubleBlock, "hidden", + lambda self, mlp, h: real(*mx.split(mlp[0](h), 2, axis=-1))) + + +def _joint_image_first(mp, model): + """The joint tokens image first against the position ids text first, + so each token runs at another token's position.""" + real = fm.SingleBlock.__call__ + + def call(self, x, mod, cos, sin): + n = x.shape[1] - model._n_txt + roll = mx.concatenate([x[:, -n:], x[:, :-n]], axis=1) + y = real(self, roll, mod, cos, sin) + return mx.concatenate([y[:, n:], y[:, :n]], axis=1) + mp.setattr(fm.SingleBlock, "__call__", call) + + +def _refs_at_the_image(mp, model): + real = fm.image_ids + mp.setattr(fm, "image_ids", lambda h, w, index=None: real(h, w)) + + +def _refs_unscaled(mp, model): + real = fm.image_ids + + def ids(h, w, index=None): + out = real(h, w) + if index is not None: + out[:, 0] = 1 + index + return out + mp.setattr(fm, "image_ids", ids) + + +def _text_at_one_axis_early(mp, model): + def text_ids(n): + ids = np.zeros((n, 4), np.float32) + ids[:, 2] = np.arange(n) + return ids + mp.setattr(fm, "text_ids", text_ids) + + +def _time_unrounded(mp, model): + def emb(t, dim): + return ops.timestep_embedding( + np.float32(1000) * np.reshape(t, (-1,)).astype(np.float32), dim) + mp.setattr(fm, "time_embedding", emb) + + +def _final_shift_scale_swapped(mp, model): + real = fm.LastLayer.__call__ + mp.setattr(fm.LastLayer, "__call__", + lambda self, x, shift, scale: real(self, x, scale, shift)) + + +FAULTS = {"shift and scale swapped": _shift_scale_swapped, + "attention and feed-forward modulations swapped": + _norm_mods_swapped, + "image and text modulations crossed": _stream_mods_crossed, + "glu halves swapped": _glu_halves_swapped, + "single block halves swapped": _single_split_swapped, + "joint tokens image first": _joint_image_first, + "references at the image's positions": _refs_at_the_image, + "reference time axis unscaled": _refs_unscaled, + "text position on another axis": _text_at_one_axis_early, + "time embedding in fp32": _time_unrounded, + "final shift and scale swapped": _final_shift_scale_swapped} + + +@pytest.fixture(scope="module") +def clean_velocity(tiny): + weights, cfg = tiny + arrays, _ = committed_fixture(TINY) + with mx.stream(mx.cpu): + return fg.measures(fg.tiny_model(weights, cfg), arrays)["velocity"] + + +@pytest.mark.parametrize("name", list(FAULTS)) +def test_each_wrong_model_misses_the_fp32_bound(tiny, clean_velocity, + monkeypatch, name): + """Each wrong model moves its most moved row past 100 times the + bound of the step on gmlx's own embedding, and moves the velocity + past 100 times the clean run's, so a fault that leaves the forward as + it was fails here.""" + weights, cfg = tiny + arrays, _ = committed_fixture(TINY) + model = fg.tiny_model(weights, cfg) + model._n_txt = arrays["features"].shape[0] + with monkeypatch.context() as mp: + FAULTS[name](mp, model) + with mx.stream(mx.cpu): + got = fg.measures(model, arrays, + own_time=name == "time embedding in fp32") + worst = max(got, key=got.get) + print(f"flux2 tiny, {name}: worst {got[worst]:.2e} at {worst}, " + f"velocity {got['velocity']:.2e} against {clean_velocity:.2e} " + "clean") + assert got[worst] > 100 * OWN_TOL, (name, worst, got[worst]) + assert got["velocity"] > 100 * clean_velocity, (name, got["velocity"]) From d45060b927a22339b07736ae485883152d02b483 Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 05:26:01 -0700 Subject: [PATCH 003/101] test(image): flux2 klein check 3 against the reference dit, product, exact and site gates --- .../check3_flux2_klein_1024.manifest.json | 176 ++++ .../check3_flux2_klein_512.manifest.json | 927 +++++++++++++++++ ...check3_flux2_klein_base_1024.manifest.json | 180 ++++ .../check3_flux2_klein_base_512.manifest.json | 931 +++++++++++++++++ ...eck3_flux2_klein_base_r1_512.manifest.json | 942 ++++++++++++++++++ .../check3_flux2_klein_r1_1024.manifest.json | 188 ++++ .../check3_flux2_klein_r1_512.manifest.json | 939 +++++++++++++++++ .../check3_flux2_klein_s1_512.manifest.json | 930 +++++++++++++++++ tests/image/test_image_check3_flux2_klein.py | 422 ++++++++ 9 files changed, 5635 insertions(+) create mode 100644 tests/fixtures/image/oracle/check3_flux2_klein_1024.manifest.json create mode 100644 tests/fixtures/image/oracle/check3_flux2_klein_512.manifest.json create mode 100644 tests/fixtures/image/oracle/check3_flux2_klein_base_1024.manifest.json create mode 100644 tests/fixtures/image/oracle/check3_flux2_klein_base_512.manifest.json create mode 100644 tests/fixtures/image/oracle/check3_flux2_klein_base_r1_512.manifest.json create mode 100644 tests/fixtures/image/oracle/check3_flux2_klein_r1_1024.manifest.json create mode 100644 tests/fixtures/image/oracle/check3_flux2_klein_r1_512.manifest.json create mode 100644 tests/fixtures/image/oracle/check3_flux2_klein_s1_512.manifest.json create mode 100644 tests/image/test_image_check3_flux2_klein.py diff --git a/tests/fixtures/image/oracle/check3_flux2_klein_1024.manifest.json b/tests/fixtures/image/oracle/check3_flux2_klein_1024.manifest.json new file mode 100644 index 000000000..9b4101663 --- /dev/null +++ b/tests/fixtures/image/oracle/check3_flux2_klein_1024.manifest.json @@ -0,0 +1,176 @@ +{ + "schema": 1, + "name": "check3_flux2_klein_1024", + "check": 3, + "family": "flux2_klein", + "script": "scripts/image_oracle/check3_flux2_klein.py", + "argv": [ + "check3_flux2_klein.py", + "--reference", + "src", + "--reference-commit", + "50fe5162777813d869182b139e83b10743caef15", + "--dit", + "flux-2-klein-4b-Q4_K_M.gguf", + "--sizes", + "512", + "1024", + "--rows", + "512" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": { + "dit": { + "name": "flux-2-klein-4b-Q4_K_M.gguf", + "size": 2604311104, + "sha256": "0b25d143c8469b342bc5af3bce92b783bf6b0636d285f7b2f75e38af63af9a15" + } + }, + "inputs": { + "size": 1024, + "sigma": 1.0, + "step": 0, + "schedule": "get_schedule(4, 4096)", + "seed": 1024, + "latents": "seeded normal, rounded to bf16", + "features": "seeded normal, std 4.0, rounded to bf16", + "text_rows": 512, + "refs": 0, + "ref_size": 0, + "dequant": "exact", + "matmul_bf16": "bf16 operands, float32 GEMM, one bf16 rounding", + "timestep": "bf16 as the reference's denoise fills it, in both modes", + "reference_commit": "50fe5162777813d869182b139e83b10743caef15", + "gguf_codecs": { + "F32": 60, + "Q5_K": 30, + "Q4_K": 50, + "BF16": 9 + } + }, + "results": { + "velocity_bf16_vs_fp32": { + "rel_l2": 0.026728408429329907, + "cosine": 0.9996452850845854, + "max_abs": 0.14870575070381165 + }, + "times": { + "fp32_s": 20.6, + "bf16_s": 102.7 + } + }, + "tolerances": { + "velocity": { + "rel_l2": 0.053456816858659814, + "cosine_min": 0.9985811403383416 + }, + "rule": "tolerance = 2 x the oracle's own bf16 against fp32 relative L2: teacher-forced for each block and the final layer, free running for the time vector, modulations and embeddings and for the velocity" + }, + "notes": [], + "created": "2026-10-16T12:02:19Z", + "npz": "check3_flux2_klein_1024.npz", + "tensors": { + "features": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "3482cc3e89168264731155ce529cc5ff9299b09f9e6ade75b1a420d631896802" + }, + "ids.image": { + "shape": [ + 4096, + 4 + ], + "dtype": "float32", + "sha256": "e0fd52cd4061c2c0d3094706675d76769012c61ad3e12de6ed0464ff4cd3a971" + }, + "ids.text": { + "shape": [ + 512, + 4 + ], + "dtype": "float32", + "sha256": "914a4d07f258895514e1b52023c57a677aa4925531d34e54831414224030a0f8" + }, + "in.time_in": { + "shape": [ + 1, + 256 + ], + "dtype": "float32", + "sha256": "cbacd50d6ddae5179d08ae5986820a7baaecca4b2a9962dd856fc80aa62707e4" + }, + "latents": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "2ce0f3a03885ff5202f83cc448e3caeafce143ff69753702eb39499c5466df80" + }, + "sigma": { + "shape": [], + "dtype": "float32", + "sha256": "e00e5eb9444182f352323374ef4e08ebcb784725fdd4fd612d7730540b3e0c8c" + }, + "velocity": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "c28f7b5ec8105b2046f4c1ac015adb2356edf0c17d3d70ce71279d692a01b0b8" + }, + "velocity_bf16": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "0902c84c046853560c50b8041aeb1cc8aec9b355d1fd4ed4d09a28b1f97c387c" + } + } +} diff --git a/tests/fixtures/image/oracle/check3_flux2_klein_512.manifest.json b/tests/fixtures/image/oracle/check3_flux2_klein_512.manifest.json new file mode 100644 index 000000000..75c9aad56 --- /dev/null +++ b/tests/fixtures/image/oracle/check3_flux2_klein_512.manifest.json @@ -0,0 +1,927 @@ +{ + "schema": 1, + "name": "check3_flux2_klein_512", + "check": 3, + "family": "flux2_klein", + "script": "scripts/image_oracle/check3_flux2_klein.py", + "argv": [ + "check3_flux2_klein.py", + "--reference", + "src", + "--reference-commit", + "50fe5162777813d869182b139e83b10743caef15", + "--dit", + "flux-2-klein-4b-Q4_K_M.gguf", + "--sizes", + "512", + "1024", + "--rows", + "512" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": { + "dit": { + "name": "flux-2-klein-4b-Q4_K_M.gguf", + "size": 2604311104, + "sha256": "0b25d143c8469b342bc5af3bce92b783bf6b0636d285f7b2f75e38af63af9a15" + } + }, + "inputs": { + "size": 512, + "sigma": 1.0, + "step": 0, + "schedule": "get_schedule(4, 1024)", + "seed": 512, + "latents": "seeded normal, rounded to bf16", + "features": "seeded normal, std 4.0, rounded to bf16", + "text_rows": 512, + "refs": 0, + "ref_size": 0, + "dequant": "exact", + "matmul_bf16": "bf16 operands, float32 GEMM, one bf16 rounding", + "timestep": "bf16 as the reference's denoise fills it, in both modes", + "reference_commit": "50fe5162777813d869182b139e83b10743caef15", + "gguf_codecs": { + "F32": 60, + "Q5_K": 30, + "Q4_K": 50, + "BF16": 9 + } + }, + "results": { + "velocity_bf16_vs_fp32": { + "rel_l2": 0.028642818119725817, + "cosine": 0.9995984352018201, + "max_abs": 0.21285152435302734 + }, + "rows_bf16_vs_fp32": { + "vec": { + "rel_l2": 0.0017350471821734716, + "cosine": 0.9999985048596156, + "max_abs": 0.007456779479980469, + "teacher_forced": false + }, + "double_stream_modulation_img": { + "rel_l2": 0.0017075999965016557, + "cosine": 0.9999985477892043, + "max_abs": 0.039051055908203125, + "teacher_forced": false + }, + "double_stream_modulation_txt": { + "rel_l2": 0.001656781628104715, + "cosine": 0.9999986362054634, + "max_abs": 0.019323348999023438, + "teacher_forced": false + }, + "single_stream_modulation": { + "rel_l2": 0.0016003666594017491, + "cosine": 0.9999987212076318, + "max_abs": 0.093231201171875, + "teacher_forced": false + }, + "img_in": { + "rel_l2": 0.0016575440299538614, + "cosine": 0.999998626273488, + "max_abs": 0.03107452392578125, + "teacher_forced": false + }, + "txt_in": { + "rel_l2": 0.0016583942242231634, + "cosine": 0.9999986248639099, + "max_abs": 0.06249237060546875, + "teacher_forced": false + }, + "double_blocks.0.img": { + "rel_l2": 0.006236457797986627, + "cosine": 0.9999809943959477, + "max_abs": 1.329925537109375, + "teacher_forced": true + }, + "double_blocks.0.txt": { + "rel_l2": 0.004888688431446736, + "cosine": 0.9999892983777108, + "max_abs": 18.9603271484375, + "teacher_forced": true + }, + "double_blocks.1.img": { + "rel_l2": 0.004303949727638918, + "cosine": 0.9999918474038793, + "max_abs": 1.0814971923828125, + "teacher_forced": true + }, + "double_blocks.1.txt": { + "rel_l2": 0.003722265440890747, + "cosine": 0.9999930825967017, + "max_abs": 10.555419921875, + "teacher_forced": true + }, + "double_blocks.2.img": { + "rel_l2": 0.005007419025405858, + "cosine": 0.9999878781582996, + "max_abs": 0.5919647216796875, + "teacher_forced": true + }, + "double_blocks.2.txt": { + "rel_l2": 0.0039786322933890155, + "cosine": 0.9999921410121733, + "max_abs": 6.00872802734375, + "teacher_forced": true + }, + "double_blocks.3.img": { + "rel_l2": 0.005557254608415285, + "cosine": 0.9999848709341038, + "max_abs": 0.7550125122070312, + "teacher_forced": true + }, + "double_blocks.3.txt": { + "rel_l2": 0.004150387622510045, + "cosine": 0.9999914009407971, + "max_abs": 7.34716796875, + "teacher_forced": true + }, + "double_blocks.4.img": { + "rel_l2": 0.003523052926961884, + "cosine": 0.9999938832299675, + "max_abs": 3.165985107421875, + "teacher_forced": true + }, + "double_blocks.4.txt": { + "rel_l2": 0.004765642024589566, + "cosine": 0.9999887979229051, + "max_abs": 9.090576171875, + "teacher_forced": true + }, + "single_blocks.0": { + "rel_l2": 0.0036037220292481622, + "cosine": 0.9999935171625959, + "max_abs": 5.9737548828125, + "teacher_forced": true + }, + "single_blocks.1": { + "rel_l2": 0.004032402703694658, + "cosine": 0.9999918926951953, + "max_abs": 5.60894775390625, + "teacher_forced": true + }, + "single_blocks.2": { + "rel_l2": 0.004570657271942593, + "cosine": 0.9999895553052052, + "max_abs": 7.385986328125, + "teacher_forced": true + }, + "single_blocks.3": { + "rel_l2": 0.0046412253624915105, + "cosine": 0.9999893223206665, + "max_abs": 6.2412109375, + "teacher_forced": true + }, + "single_blocks.4": { + "rel_l2": 0.004310319770751865, + "cosine": 0.9999908746924567, + "max_abs": 5.119873046875, + "teacher_forced": true + }, + "single_blocks.5": { + "rel_l2": 0.0034023670621807223, + "cosine": 0.9999942998514957, + "max_abs": 7.875732421875, + "teacher_forced": true + }, + "single_blocks.6": { + "rel_l2": 0.0036289654624523304, + "cosine": 0.9999936602450411, + "max_abs": 5.57769775390625, + "teacher_forced": true + }, + "single_blocks.7": { + "rel_l2": 0.0038851268967880106, + "cosine": 0.9999928704004942, + "max_abs": 6.3369140625, + "teacher_forced": true + }, + "single_blocks.8": { + "rel_l2": 0.0038552103768339126, + "cosine": 0.9999927672220579, + "max_abs": 5.019775390625, + "teacher_forced": true + }, + "single_blocks.9": { + "rel_l2": 0.004045527837750271, + "cosine": 0.999991975538846, + "max_abs": 4.3590087890625, + "teacher_forced": true + }, + "single_blocks.10": { + "rel_l2": 0.004344295673558342, + "cosine": 0.9999905678222402, + "max_abs": 5.680419921875, + "teacher_forced": true + }, + "single_blocks.11": { + "rel_l2": 0.005456528433272177, + "cosine": 0.9999852159365538, + "max_abs": 4.3427734375, + "teacher_forced": true + }, + "single_blocks.12": { + "rel_l2": 0.005516182299685123, + "cosine": 0.9999848653307715, + "max_abs": 4.71661376953125, + "teacher_forced": true + }, + "single_blocks.13": { + "rel_l2": 0.005201191830327112, + "cosine": 0.9999865074159162, + "max_abs": 5.000732421875, + "teacher_forced": true + }, + "single_blocks.14": { + "rel_l2": 0.005389188636142675, + "cosine": 0.9999854878126732, + "max_abs": 4.923828125, + "teacher_forced": true + }, + "single_blocks.15": { + "rel_l2": 0.005514829844130725, + "cosine": 0.9999847937427155, + "max_abs": 5.2982177734375, + "teacher_forced": true + }, + "single_blocks.16": { + "rel_l2": 0.005535729352765672, + "cosine": 0.9999846788690245, + "max_abs": 4.093780517578125, + "teacher_forced": true + }, + "single_blocks.17": { + "rel_l2": 0.005665327632527008, + "cosine": 0.9999839529769706, + "max_abs": 4.599609375, + "teacher_forced": true + }, + "single_blocks.18": { + "rel_l2": 0.005167545223523915, + "cosine": 0.9999866486032514, + "max_abs": 13.69329833984375, + "teacher_forced": true + }, + "single_blocks.19": { + "rel_l2": 0.004550071045744809, + "cosine": 0.9999896977221697, + "max_abs": 17.335205078125, + "teacher_forced": true + }, + "final_layer.adaLN_modulation": { + "rel_l2": 0.0013852935633001928, + "cosine": 0.9999990845155656, + "max_abs": 0.06572341918945312, + "teacher_forced": false + }, + "final_layer": { + "rel_l2": 0.003942578079641046, + "cosine": 0.9999922341257942, + "max_abs": 0.018228769302368164, + "teacher_forced": true + } + }, + "free_bf16_vs_fp32": { + "double_blocks.0.img": 0.005956868888908466, + "double_blocks.0.txt": 0.004895435110762565, + "double_blocks.1.img": 0.006968515943798406, + "double_blocks.1.txt": 0.006903660606410423, + "double_blocks.2.img": 0.008749550782605362, + "double_blocks.2.txt": 0.009134708525565374, + "double_blocks.3.img": 0.009942712305516, + "double_blocks.3.txt": 0.010838438650797571, + "double_blocks.4.img": 0.005116841764136379, + "double_blocks.4.txt": 0.011185973937468511, + "single_blocks.0": 0.01035023640036577, + "single_blocks.1": 0.011620126988937414, + "single_blocks.2": 0.01341922210844923, + "single_blocks.3": 0.013391553548032942, + "single_blocks.4": 0.012537774068780616, + "single_blocks.5": 0.010416095494590747, + "single_blocks.6": 0.011116181059155008, + "single_blocks.7": 0.01218995796953851, + "single_blocks.8": 0.013480304836445044, + "single_blocks.9": 0.014778396941348608, + "single_blocks.10": 0.017951924945105932, + "single_blocks.11": 0.020913129192743452, + "single_blocks.12": 0.022325808389941127, + "single_blocks.13": 0.02480051365218746, + "single_blocks.14": 0.0271701197202394, + "single_blocks.15": 0.02955777086081382, + "single_blocks.16": 0.031772201172509174, + "single_blocks.17": 0.0331560323087693, + "single_blocks.18": 0.029516898429018935, + "single_blocks.19": 0.027095364575425943, + "final_layer": 0.028642818119725817 + }, + "times": { + "fp32_s": 6.6, + "bf16_s": 14.7, + "bf16_teacher_forced_s": 15.5 + }, + "exact_free_floor": { + "rel_l2": 8.215813818504455e-06, + "row": "free single_blocks.17", + "measured": "gmlx's exact step on the GPU against the same step on the CPU stream, worst free row; tests/image/flux2_gates.py exact_free_floor on flux2-klein, Apple M5 Max" + }, + "exact_velocity_floor": { + "rel_l2": 7.094426938707685e-06, + "measured": "gmlx's exact step on the GPU against the same step on the CPU stream, velocity; tests/image/flux2_gates.py exact_free_floor on flux2-klein, Apple M5 Max" + } + }, + "tolerances": { + "velocity": { + "rel_l2": 0.05728563623945163, + "cosine_min": 0.9983937408072805 + }, + "vec": { + "rel_l2": 0.003470094364346943, + "teacher_forced": false + }, + "double_stream_modulation_img": { + "rel_l2": 0.0034151999930033114, + "teacher_forced": false + }, + "double_stream_modulation_txt": { + "rel_l2": 0.00331356325620943, + "teacher_forced": false + }, + "single_stream_modulation": { + "rel_l2": 0.0032007333188034982, + "teacher_forced": false + }, + "img_in": { + "rel_l2": 0.0033150880599077228, + "teacher_forced": false + }, + "txt_in": { + "rel_l2": 0.0033167884484463267, + "teacher_forced": false + }, + "double_blocks.0.img": { + "rel_l2": 0.012472915595973254, + "teacher_forced": true + }, + "double_blocks.0.txt": { + "rel_l2": 0.009777376862893473, + "teacher_forced": true + }, + "double_blocks.1.img": { + "rel_l2": 0.008607899455277837, + "teacher_forced": true + }, + "double_blocks.1.txt": { + "rel_l2": 0.007444530881781494, + "teacher_forced": true + }, + "double_blocks.2.img": { + "rel_l2": 0.010014838050811716, + "teacher_forced": true + }, + "double_blocks.2.txt": { + "rel_l2": 0.007957264586778031, + "teacher_forced": true + }, + "double_blocks.3.img": { + "rel_l2": 0.01111450921683057, + "teacher_forced": true + }, + "double_blocks.3.txt": { + "rel_l2": 0.00830077524502009, + "teacher_forced": true + }, + "double_blocks.4.img": { + "rel_l2": 0.007046105853923768, + "teacher_forced": true + }, + "double_blocks.4.txt": { + "rel_l2": 0.009531284049179132, + "teacher_forced": true + }, + "single_blocks.0": { + "rel_l2": 0.0072074440584963245, + "teacher_forced": true + }, + "single_blocks.1": { + "rel_l2": 0.008064805407389316, + "teacher_forced": true + }, + "single_blocks.2": { + "rel_l2": 0.009141314543885186, + "teacher_forced": true + }, + "single_blocks.3": { + "rel_l2": 0.009282450724983021, + "teacher_forced": true + }, + "single_blocks.4": { + "rel_l2": 0.00862063954150373, + "teacher_forced": true + }, + "single_blocks.5": { + "rel_l2": 0.0068047341243614445, + "teacher_forced": true + }, + "single_blocks.6": { + "rel_l2": 0.007257930924904661, + "teacher_forced": true + }, + "single_blocks.7": { + "rel_l2": 0.007770253793576021, + "teacher_forced": true + }, + "single_blocks.8": { + "rel_l2": 0.007710420753667825, + "teacher_forced": true + }, + "single_blocks.9": { + "rel_l2": 0.008091055675500542, + "teacher_forced": true + }, + "single_blocks.10": { + "rel_l2": 0.008688591347116683, + "teacher_forced": true + }, + "single_blocks.11": { + "rel_l2": 0.010913056866544354, + "teacher_forced": true + }, + "single_blocks.12": { + "rel_l2": 0.011032364599370246, + "teacher_forced": true + }, + "single_blocks.13": { + "rel_l2": 0.010402383660654223, + "teacher_forced": true + }, + "single_blocks.14": { + "rel_l2": 0.01077837727228535, + "teacher_forced": true + }, + "single_blocks.15": { + "rel_l2": 0.01102965968826145, + "teacher_forced": true + }, + "single_blocks.16": { + "rel_l2": 0.011071458705531344, + "teacher_forced": true + }, + "single_blocks.17": { + "rel_l2": 0.011330655265054015, + "teacher_forced": true + }, + "single_blocks.18": { + "rel_l2": 0.01033509044704783, + "teacher_forced": true + }, + "single_blocks.19": { + "rel_l2": 0.009100142091489618, + "teacher_forced": true + }, + "final_layer.adaLN_modulation": { + "rel_l2": 0.0027705871266003857, + "teacher_forced": false + }, + "final_layer": { + "rel_l2": 0.007885156159282092, + "teacher_forced": true + }, + "rule": "tolerance = 2 x the oracle's own bf16 against fp32 relative L2: teacher-forced for each block and the final layer, free running for the time vector, modulations and embeddings and for the velocity", + "exact_free": { + "rel_l2": 5e-05 + }, + "exact_velocity": { + "rel_l2": 5e-05 + } + }, + "notes": [], + "created": "2026-10-16T12:00:15Z", + "npz": "check3_flux2_klein_512.npz", + "tensors": { + "double_blocks.0.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "43cfda9c5e8907d9c15b45a071e44bd385be666ed85ff2e1b279166281308c33" + }, + "double_blocks.0.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "f8a2c88c230077bb03c18405e45485c6a4c4dd0fc44c6c5def16ef036a0054b2" + }, + "double_blocks.1.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "8b9334523ed43ac914b334f616173c7a01b87803ed6871476404ee479b838f6f" + }, + "double_blocks.1.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "7fda7093d6f8f8d8032ca96492884ddcdb8ce5f19a8add58cd98ed7528612b47" + }, + "double_blocks.2.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "fb8d8d73c3e9f1e2a57452558b804846b783d3595fc4d1a00e99742214123746" + }, + "double_blocks.2.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "c7526c746750a7dcabb8d3e3345dfda0d623d655d649df0095647b455cdf15df" + }, + "double_blocks.3.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "0a3fc44d23012a3269e8a34ea3261de4447628d04514ed8354530aa9940de22f" + }, + "double_blocks.3.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "a58bdcd2f003d104ab5c7fa67a77e221d71cd3b3f44ebc265abeea3297f4020a" + }, + "double_blocks.4.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "f836c9aebb8c9c9791abd9297fb4a5d52eeae9fd604af9896db12b13008fbaea" + }, + "double_blocks.4.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "0c02961b1dbc77197c15cfdb7fc556c722a933c8e2b5fa514f31f97a7d550ec6" + }, + "double_stream_modulation_img": { + "shape": [ + 1, + 18432 + ], + "dtype": "float32", + "sha256": "4ee30047b3e6dae420119278ff22bcabbbc4e81caff9cacc931d6772b941c0a3" + }, + "double_stream_modulation_txt": { + "shape": [ + 1, + 18432 + ], + "dtype": "float32", + "sha256": "482250b40d35864c8f72a097dfcd531b74e17bba04f14241142ab357056bd2c9" + }, + "features": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "3482cc3e89168264731155ce529cc5ff9299b09f9e6ade75b1a420d631896802" + }, + "final_layer": { + "shape": [ + 1024, + 128 + ], + "dtype": "float32", + "sha256": "a05ccca27b6a99e163b7ec992dec7979b6b0be696dd45201a875ee1791c4a75b" + }, + "final_layer.adaLN_modulation": { + "shape": [ + 1, + 6144 + ], + "dtype": "float32", + "sha256": "0ebb63d3a29bea2dafbbdad9050417c53dcd46ce81c8461ac79056aa81f95cb5" + }, + "ids.image": { + "shape": [ + 1024, + 4 + ], + "dtype": "float32", + "sha256": "8e6ca6477f8b787a44f1d3a6c05641319299ae79d0c43802e3396b7e9558fe8d" + }, + "ids.text": { + "shape": [ + 512, + 4 + ], + "dtype": "float32", + "sha256": "914a4d07f258895514e1b52023c57a677aa4925531d34e54831414224030a0f8" + }, + "img_in": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "153bc3dbdbb4160fc7d556e7684ca601f9337aa6c6a02121f481623438140035" + }, + "in.final_layer": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "8f6ed619709daaa9ee84ecc477f06427e383d75127aa9696a8a473eb208697d9" + }, + "in.single_blocks.0": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "96ecd712f4a764a66638203178555387061000c189d4b601f586c3e163a88ff9" + }, + "in.time_in": { + "shape": [ + 1, + 256 + ], + "dtype": "float32", + "sha256": "cbacd50d6ddae5179d08ae5986820a7baaecca4b2a9962dd856fc80aa62707e4" + }, + "latents": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "2cb3e62b5bb6a58f5b08f360ba95db386349bd0b4fe4128bd931125c8cceae04" + }, + "sigma": { + "shape": [], + "dtype": "float32", + "sha256": "e00e5eb9444182f352323374ef4e08ebcb784725fdd4fd612d7730540b3e0c8c" + }, + "single_blocks.0": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "ab52ee51b727c7d0ab79b69395088b6180bdb761924dbb468cb38a9509010f0c" + }, + "single_blocks.1": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "1452b3ac28b098f7622786ff777c46e8ccad6563e0c85ad4fad03541bca505fa" + }, + "single_blocks.10": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "0b31b917d3501d34b88b38aed574da47bdcef7bb820e9955cf5f21840fd7a3cc" + }, + "single_blocks.11": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "d1141409f7a71fa4dd829f836cb5d0bb82e5cc2d7b58520a97789b60889f9340" + }, + "single_blocks.12": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "fefda4030fd3140a47563b13b08897a7a76a04d9e961ebcb016336a2ebb6d955" + }, + "single_blocks.13": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "ec6fb64177a74c5cb3c1c27450dfe3414555de6c92428d857075be7bdc5c409f" + }, + "single_blocks.14": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "fe350985506afdd3eb5b7493b32dfa5e9a1f0b3eaabc270294b29adac9602bb5" + }, + "single_blocks.15": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "08ebe1c95e367c54cbdec693c4926db2b785b436ff83f2bb1be68529cf841d99" + }, + "single_blocks.16": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "6e6adb7a678f74477766105db29bb2838cd451e2b7896ce642a4ee098a151d0f" + }, + "single_blocks.17": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "679a30dc0189725dd4c2de1a4bc2ea08cc0dbf2ae2c1e31dfb976bf37a5e71d3" + }, + "single_blocks.18": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "2de129fcec23316eff1e0b65220af24022fccd3e6a2f59d2034a6af206724a54" + }, + "single_blocks.19": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "152ab93f2024a307944e3da68c05b2c4fd31cfb77782460dfaead26bfe16c126" + }, + "single_blocks.2": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "11774d85c79b2a2f1907998b4349bbfd686df0a8a61b850342acdca2ef93cf91" + }, + "single_blocks.3": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "72b2f0007d739223244b8644926996f2253de3cb173b511a4846b7a42b941de3" + }, + "single_blocks.4": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "a49ec16d7358e9691e95ea5dd37946f5562e6e6fe9070d836b103ec62cbddf53" + }, + "single_blocks.5": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "978771aa50edc6e4c2d38bfc977285a8fe0739f696ba8c3618849f9905f4b0f2" + }, + "single_blocks.6": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "956155a963ca13e66b651ddbb2fe3b2781b35ceec1d39d09b0a42ad825479f24" + }, + "single_blocks.7": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "d2889a5a5fa89a08c01a6e2883ae142b795621082cc509cf11cb5db5e8a4f059" + }, + "single_blocks.8": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "5a55eda684e3ef86c8e96a981794c085a8951adac5ddc696b864e6dc172899fe" + }, + "single_blocks.9": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "f001b8311e8720b9d3a98998dbc4b013aee1d389c80529dc07a82733cebe23b1" + }, + "single_stream_modulation": { + "shape": [ + 1, + 9216 + ], + "dtype": "float32", + "sha256": "120948198c29b521754b6b39454864e82f32161adede73d939cd14cfade6c3d4" + }, + "txt_in": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "3d69d3571d1fe732cd193fe97eae90834a65320a47a3f06c6566031b17fe79ff" + }, + "vec": { + "shape": [ + 1, + 3072 + ], + "dtype": "float32", + "sha256": "1f669d07af0ecb908139d999eb12e9dfffa7216d21ec7ae4cc9fc56d1335f3b2" + }, + "velocity": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "3687d99e4aaf0a9dabf847e625dd5d8684614b6a9e5bf314e935558ba338eb9a" + }, + "velocity_bf16": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "ab4c59cb1e88e4163b05b0aa9253187ac962067496a6cc299314d6bcd24b0166" + } + } +} diff --git a/tests/fixtures/image/oracle/check3_flux2_klein_base_1024.manifest.json b/tests/fixtures/image/oracle/check3_flux2_klein_base_1024.manifest.json new file mode 100644 index 000000000..809a88b53 --- /dev/null +++ b/tests/fixtures/image/oracle/check3_flux2_klein_base_1024.manifest.json @@ -0,0 +1,180 @@ +{ + "schema": 1, + "name": "check3_flux2_klein_base_1024", + "check": 3, + "family": "flux2_klein", + "script": "scripts/image_oracle/check3_flux2_klein.py", + "argv": [ + "check3_flux2_klein.py", + "--reference", + "src", + "--reference-commit", + "50fe5162777813d869182b139e83b10743caef15", + "--dit", + "flux-2-klein-base-4b-Q4_K_M.gguf", + "--sizes", + "512", + "1024", + "--rows", + "512", + "--steps", + "50", + "--name", + "check3_flux2_klein_base" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": { + "dit": { + "name": "flux-2-klein-base-4b-Q4_K_M.gguf", + "size": 2604311104, + "sha256": "8348ff1f2b3ac3cf9eb62f38322fcbb6d92811d39aa036d0671cf7bef9411266" + } + }, + "inputs": { + "size": 1024, + "sigma": 1.0, + "step": 0, + "schedule": "get_schedule(50, 4096)", + "seed": 1024, + "latents": "seeded normal, rounded to bf16", + "features": "seeded normal, std 4.0, rounded to bf16", + "text_rows": 512, + "refs": 0, + "ref_size": 0, + "dequant": "exact", + "matmul_bf16": "bf16 operands, float32 GEMM, one bf16 rounding", + "timestep": "bf16 as the reference's denoise fills it, in both modes", + "reference_commit": "50fe5162777813d869182b139e83b10743caef15", + "gguf_codecs": { + "F32": 60, + "Q5_K": 30, + "Q4_K": 50, + "BF16": 9 + } + }, + "results": { + "velocity_bf16_vs_fp32": { + "rel_l2": 0.009406134271140856, + "cosine": 0.9999567386301972, + "max_abs": 0.05108070373535156 + }, + "times": { + "fp32_s": 20.2, + "bf16_s": 96.8 + } + }, + "tolerances": { + "velocity": { + "rel_l2": 0.018812268542281713, + "cosine_min": 0.9998269545207887 + }, + "rule": "tolerance = 2 x the oracle's own bf16 against fp32 relative L2: teacher-forced for each block and the final layer, free running for the time vector, modulations and embeddings and for the velocity" + }, + "notes": [], + "created": "2026-10-16T12:05:38Z", + "npz": "check3_flux2_klein_base_1024.npz", + "tensors": { + "features": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "3482cc3e89168264731155ce529cc5ff9299b09f9e6ade75b1a420d631896802" + }, + "ids.image": { + "shape": [ + 4096, + 4 + ], + "dtype": "float32", + "sha256": "e0fd52cd4061c2c0d3094706675d76769012c61ad3e12de6ed0464ff4cd3a971" + }, + "ids.text": { + "shape": [ + 512, + 4 + ], + "dtype": "float32", + "sha256": "914a4d07f258895514e1b52023c57a677aa4925531d34e54831414224030a0f8" + }, + "in.time_in": { + "shape": [ + 1, + 256 + ], + "dtype": "float32", + "sha256": "cbacd50d6ddae5179d08ae5986820a7baaecca4b2a9962dd856fc80aa62707e4" + }, + "latents": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "2ce0f3a03885ff5202f83cc448e3caeafce143ff69753702eb39499c5466df80" + }, + "sigma": { + "shape": [], + "dtype": "float32", + "sha256": "e00e5eb9444182f352323374ef4e08ebcb784725fdd4fd612d7730540b3e0c8c" + }, + "velocity": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "291f27f5cb93048b7d6a08d0e14a2b1ba080279a2a6bd766e13fa237b6007eee" + }, + "velocity_bf16": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "187f2d887beee6eb66b57bb049309836dd140eaaba2fca51cfa85a0e82e09cb2" + } + } +} diff --git a/tests/fixtures/image/oracle/check3_flux2_klein_base_512.manifest.json b/tests/fixtures/image/oracle/check3_flux2_klein_base_512.manifest.json new file mode 100644 index 000000000..7356b4b80 --- /dev/null +++ b/tests/fixtures/image/oracle/check3_flux2_klein_base_512.manifest.json @@ -0,0 +1,931 @@ +{ + "schema": 1, + "name": "check3_flux2_klein_base_512", + "check": 3, + "family": "flux2_klein", + "script": "scripts/image_oracle/check3_flux2_klein.py", + "argv": [ + "check3_flux2_klein.py", + "--reference", + "src", + "--reference-commit", + "50fe5162777813d869182b139e83b10743caef15", + "--dit", + "flux-2-klein-base-4b-Q4_K_M.gguf", + "--sizes", + "512", + "1024", + "--rows", + "512", + "--steps", + "50", + "--name", + "check3_flux2_klein_base" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": { + "dit": { + "name": "flux-2-klein-base-4b-Q4_K_M.gguf", + "size": 2604311104, + "sha256": "8348ff1f2b3ac3cf9eb62f38322fcbb6d92811d39aa036d0671cf7bef9411266" + } + }, + "inputs": { + "size": 512, + "sigma": 1.0, + "step": 0, + "schedule": "get_schedule(50, 1024)", + "seed": 512, + "latents": "seeded normal, rounded to bf16", + "features": "seeded normal, std 4.0, rounded to bf16", + "text_rows": 512, + "refs": 0, + "ref_size": 0, + "dequant": "exact", + "matmul_bf16": "bf16 operands, float32 GEMM, one bf16 rounding", + "timestep": "bf16 as the reference's denoise fills it, in both modes", + "reference_commit": "50fe5162777813d869182b139e83b10743caef15", + "gguf_codecs": { + "F32": 60, + "Q5_K": 30, + "Q4_K": 50, + "BF16": 9 + } + }, + "results": { + "velocity_bf16_vs_fp32": { + "rel_l2": 0.01011235366798261, + "cosine": 0.9999523477041233, + "max_abs": 0.0583532452583313 + }, + "rows_bf16_vs_fp32": { + "vec": { + "rel_l2": 0.0017382974193546016, + "cosine": 0.9999984963979891, + "max_abs": 0.01546478271484375, + "teacher_forced": false + }, + "double_stream_modulation_img": { + "rel_l2": 0.0016464845265631162, + "cosine": 0.999998656706599, + "max_abs": 0.2581787109375, + "teacher_forced": false + }, + "double_stream_modulation_txt": { + "rel_l2": 0.0017673264060670969, + "cosine": 0.9999984496291131, + "max_abs": 0.08278656005859375, + "teacher_forced": false + }, + "single_stream_modulation": { + "rel_l2": 0.0016693167013436423, + "cosine": 0.9999987328209464, + "max_abs": 0.25644683837890625, + "teacher_forced": false + }, + "img_in": { + "rel_l2": 0.001658899549988673, + "cosine": 0.9999986240411464, + "max_abs": 0.030887603759765625, + "teacher_forced": false + }, + "txt_in": { + "rel_l2": 0.0016594420810833153, + "cosine": 0.9999986231333832, + "max_abs": 0.06241798400878906, + "teacher_forced": false + }, + "double_blocks.0.img": { + "rel_l2": 0.009540977752435665, + "cosine": 0.999954836928076, + "max_abs": 5.0153961181640625, + "teacher_forced": true + }, + "double_blocks.0.txt": { + "rel_l2": 0.0069377706426185775, + "cosine": 0.9999774018113349, + "max_abs": 31.791015625, + "teacher_forced": true + }, + "double_blocks.1.img": { + "rel_l2": 0.006649501563100343, + "cosine": 0.9999785795122681, + "max_abs": 4.256011962890625, + "teacher_forced": true + }, + "double_blocks.1.txt": { + "rel_l2": 0.0045447811247192665, + "cosine": 0.9999896730169231, + "max_abs": 18.66796875, + "teacher_forced": true + }, + "double_blocks.2.img": { + "rel_l2": 0.005261559549383555, + "cosine": 0.9999861620416702, + "max_abs": 1.4852409362792969, + "teacher_forced": true + }, + "double_blocks.2.txt": { + "rel_l2": 0.004656249911230326, + "cosine": 0.9999891614391384, + "max_abs": 13.906494140625, + "teacher_forced": true + }, + "double_blocks.3.img": { + "rel_l2": 0.0055068642642163625, + "cosine": 0.9999848374430461, + "max_abs": 1.7391357421875, + "teacher_forced": true + }, + "double_blocks.3.txt": { + "rel_l2": 0.00454208800874406, + "cosine": 0.9999896858341075, + "max_abs": 13.08984375, + "teacher_forced": true + }, + "double_blocks.4.img": { + "rel_l2": 0.005466018976288926, + "cosine": 0.9999880911461314, + "max_abs": 8.8795166015625, + "teacher_forced": true + }, + "double_blocks.4.txt": { + "rel_l2": 0.005036387029229275, + "cosine": 0.9999874130728001, + "max_abs": 28.795166015625, + "teacher_forced": true + }, + "single_blocks.0": { + "rel_l2": 0.004308329503827267, + "cosine": 0.9999907296858094, + "max_abs": 15.1708984375, + "teacher_forced": true + }, + "single_blocks.1": { + "rel_l2": 0.005275017667337504, + "cosine": 0.9999861184880046, + "max_abs": 15.265869140625, + "teacher_forced": true + }, + "single_blocks.2": { + "rel_l2": 0.006438152933911185, + "cosine": 0.9999792755001737, + "max_abs": 18.581787109375, + "teacher_forced": true + }, + "single_blocks.3": { + "rel_l2": 0.006433765571714711, + "cosine": 0.9999793036369694, + "max_abs": 11.5911865234375, + "teacher_forced": true + }, + "single_blocks.4": { + "rel_l2": 0.006071021281160534, + "cosine": 0.9999815861015529, + "max_abs": 15.121337890625, + "teacher_forced": true + }, + "single_blocks.5": { + "rel_l2": 0.0034069654051150566, + "cosine": 0.9999943315181662, + "max_abs": 41.90771484375, + "teacher_forced": true + }, + "single_blocks.6": { + "rel_l2": 0.00344914383873835, + "cosine": 0.99999426149282, + "max_abs": 32.79248046875, + "teacher_forced": true + }, + "single_blocks.7": { + "rel_l2": 0.0036015168971661373, + "cosine": 0.9999936698873152, + "max_abs": 31.716796875, + "teacher_forced": true + }, + "single_blocks.8": { + "rel_l2": 0.003431672085520725, + "cosine": 0.9999943596189002, + "max_abs": 31.21923828125, + "teacher_forced": true + }, + "single_blocks.9": { + "rel_l2": 0.0037194828593437486, + "cosine": 0.9999931788033187, + "max_abs": 19.66650390625, + "teacher_forced": true + }, + "single_blocks.10": { + "rel_l2": 0.007344195530392019, + "cosine": 0.9999757574681905, + "max_abs": 41.420654296875, + "teacher_forced": true + }, + "single_blocks.11": { + "rel_l2": 0.0062874504321306, + "cosine": 0.9999807190097133, + "max_abs": 22.28363037109375, + "teacher_forced": true + }, + "single_blocks.12": { + "rel_l2": 0.005824801210614887, + "cosine": 0.9999830988598768, + "max_abs": 8.793212890625, + "teacher_forced": true + }, + "single_blocks.13": { + "rel_l2": 0.0064140199709444064, + "cosine": 0.9999799179193445, + "max_abs": 17.8663330078125, + "teacher_forced": true + }, + "single_blocks.14": { + "rel_l2": 0.006755839980672825, + "cosine": 0.9999775423710814, + "max_abs": 14.216064453125, + "teacher_forced": true + }, + "single_blocks.15": { + "rel_l2": 0.005138351982925765, + "cosine": 0.9999870380883641, + "max_abs": 11.834228515625, + "teacher_forced": true + }, + "single_blocks.16": { + "rel_l2": 0.006381250874061261, + "cosine": 0.9999805955261966, + "max_abs": 15.1763916015625, + "teacher_forced": true + }, + "single_blocks.17": { + "rel_l2": 0.005654065896090167, + "cosine": 0.9999841118777101, + "max_abs": 12.849853515625, + "teacher_forced": true + }, + "single_blocks.18": { + "rel_l2": 0.005601162859650175, + "cosine": 0.9999871026894865, + "max_abs": 40.389892578125, + "teacher_forced": true + }, + "single_blocks.19": { + "rel_l2": 0.0030563169537825468, + "cosine": 0.9999953323268364, + "max_abs": 25.56982421875, + "teacher_forced": true + }, + "final_layer.adaLN_modulation": { + "rel_l2": 0.0019135450516302758, + "cosine": 0.9999981870803879, + "max_abs": 0.26091766357421875, + "teacher_forced": false + }, + "final_layer": { + "rel_l2": 0.003653727532566743, + "cosine": 0.9999933251740659, + "max_abs": 0.020452499389648438, + "teacher_forced": true + } + }, + "free_bf16_vs_fp32": { + "double_blocks.0.img": 0.010557044009883693, + "double_blocks.0.txt": 0.007365078692943346, + "double_blocks.1.img": 0.014068471494725353, + "double_blocks.1.txt": 0.010907056313517278, + "double_blocks.2.img": 0.015310313593025628, + "double_blocks.2.txt": 0.01455336315422087, + "double_blocks.3.img": 0.01557569831413209, + "double_blocks.3.txt": 0.016803132257945812, + "double_blocks.4.img": 0.01184261235034715, + "double_blocks.4.txt": 0.01683909086063929, + "single_blocks.0": 0.015858958040000915, + "single_blocks.1": 0.01780211412238872, + "single_blocks.2": 0.0209124428803768, + "single_blocks.3": 0.0208733703827703, + "single_blocks.4": 0.02051640247721974, + "single_blocks.5": 0.011376755950265745, + "single_blocks.6": 0.013198187613442047, + "single_blocks.7": 0.01360375665283107, + "single_blocks.8": 0.014667359710304941, + "single_blocks.9": 0.0160115228126724, + "single_blocks.10": 0.02358747718774324, + "single_blocks.11": 0.027860172550688077, + "single_blocks.12": 0.029338391934553287, + "single_blocks.13": 0.03050730354119924, + "single_blocks.14": 0.02958555791802098, + "single_blocks.15": 0.02819577046229217, + "single_blocks.16": 0.029812878045880533, + "single_blocks.17": 0.02840448049361726, + "single_blocks.18": 0.02212959813087555, + "single_blocks.19": 0.01919788297122255, + "final_layer": 0.01011235366798261 + }, + "times": { + "fp32_s": 6.6, + "bf16_s": 14.8, + "bf16_teacher_forced_s": 15.0 + }, + "exact_free_floor": { + "rel_l2": 5.921820186447133e-06, + "row": "free single_blocks.13", + "measured": "gmlx's exact step on the GPU against the same step on the CPU stream, worst free row; tests/image/flux2_gates.py exact_free_floor on flux2-klein, Apple M5 Max" + }, + "exact_velocity_floor": { + "rel_l2": 1.229684911398905e-06, + "measured": "gmlx's exact step on the GPU against the same step on the CPU stream, velocity; tests/image/flux2_gates.py exact_free_floor on flux2-klein, Apple M5 Max" + } + }, + "tolerances": { + "velocity": { + "rel_l2": 0.02022470733596522, + "cosine_min": 0.9998093908164933 + }, + "vec": { + "rel_l2": 0.003476594838709203, + "teacher_forced": false + }, + "double_stream_modulation_img": { + "rel_l2": 0.0032929690531262323, + "teacher_forced": false + }, + "double_stream_modulation_txt": { + "rel_l2": 0.0035346528121341938, + "teacher_forced": false + }, + "single_stream_modulation": { + "rel_l2": 0.0033386334026872847, + "teacher_forced": false + }, + "img_in": { + "rel_l2": 0.003317799099977346, + "teacher_forced": false + }, + "txt_in": { + "rel_l2": 0.0033188841621666306, + "teacher_forced": false + }, + "double_blocks.0.img": { + "rel_l2": 0.01908195550487133, + "teacher_forced": true + }, + "double_blocks.0.txt": { + "rel_l2": 0.013875541285237155, + "teacher_forced": true + }, + "double_blocks.1.img": { + "rel_l2": 0.013299003126200686, + "teacher_forced": true + }, + "double_blocks.1.txt": { + "rel_l2": 0.009089562249438533, + "teacher_forced": true + }, + "double_blocks.2.img": { + "rel_l2": 0.01052311909876711, + "teacher_forced": true + }, + "double_blocks.2.txt": { + "rel_l2": 0.009312499822460652, + "teacher_forced": true + }, + "double_blocks.3.img": { + "rel_l2": 0.011013728528432725, + "teacher_forced": true + }, + "double_blocks.3.txt": { + "rel_l2": 0.00908417601748812, + "teacher_forced": true + }, + "double_blocks.4.img": { + "rel_l2": 0.010932037952577852, + "teacher_forced": true + }, + "double_blocks.4.txt": { + "rel_l2": 0.01007277405845855, + "teacher_forced": true + }, + "single_blocks.0": { + "rel_l2": 0.008616659007654534, + "teacher_forced": true + }, + "single_blocks.1": { + "rel_l2": 0.010550035334675007, + "teacher_forced": true + }, + "single_blocks.2": { + "rel_l2": 0.01287630586782237, + "teacher_forced": true + }, + "single_blocks.3": { + "rel_l2": 0.012867531143429423, + "teacher_forced": true + }, + "single_blocks.4": { + "rel_l2": 0.012142042562321069, + "teacher_forced": true + }, + "single_blocks.5": { + "rel_l2": 0.006813930810230113, + "teacher_forced": true + }, + "single_blocks.6": { + "rel_l2": 0.0068982876774767, + "teacher_forced": true + }, + "single_blocks.7": { + "rel_l2": 0.007203033794332275, + "teacher_forced": true + }, + "single_blocks.8": { + "rel_l2": 0.00686334417104145, + "teacher_forced": true + }, + "single_blocks.9": { + "rel_l2": 0.007438965718687497, + "teacher_forced": true + }, + "single_blocks.10": { + "rel_l2": 0.014688391060784038, + "teacher_forced": true + }, + "single_blocks.11": { + "rel_l2": 0.0125749008642612, + "teacher_forced": true + }, + "single_blocks.12": { + "rel_l2": 0.011649602421229774, + "teacher_forced": true + }, + "single_blocks.13": { + "rel_l2": 0.012828039941888813, + "teacher_forced": true + }, + "single_blocks.14": { + "rel_l2": 0.01351167996134565, + "teacher_forced": true + }, + "single_blocks.15": { + "rel_l2": 0.01027670396585153, + "teacher_forced": true + }, + "single_blocks.16": { + "rel_l2": 0.012762501748122521, + "teacher_forced": true + }, + "single_blocks.17": { + "rel_l2": 0.011308131792180334, + "teacher_forced": true + }, + "single_blocks.18": { + "rel_l2": 0.01120232571930035, + "teacher_forced": true + }, + "single_blocks.19": { + "rel_l2": 0.0061126339075650935, + "teacher_forced": true + }, + "final_layer.adaLN_modulation": { + "rel_l2": 0.0038270901032605516, + "teacher_forced": false + }, + "final_layer": { + "rel_l2": 0.007307455065133486, + "teacher_forced": true + }, + "rule": "tolerance = 2 x the oracle's own bf16 against fp32 relative L2: teacher-forced for each block and the final layer, free running for the time vector, modulations and embeddings and for the velocity", + "exact_free": { + "rel_l2": 5e-05 + }, + "exact_velocity": { + "rel_l2": 5e-05 + } + }, + "notes": [], + "created": "2026-10-16T12:03:40Z", + "npz": "check3_flux2_klein_base_512.npz", + "tensors": { + "double_blocks.0.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "8419c8c10ddbd71fa64799c019ec27a45d56d693a77654ccbb0e100f8f661083" + }, + "double_blocks.0.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "a993d0d7a8284b5666250c9ce3d1c26fdece8702a61ed5fc55eee1afc755ac34" + }, + "double_blocks.1.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "65832f12d635f2c19fdb879163eeaca4ffd38aec4119961d7f00e03605bd4e59" + }, + "double_blocks.1.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "89040f014300ef34bf257a2183d848af4fe0b0f4975101058d3d715ae7ba19a6" + }, + "double_blocks.2.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "9c8833d38fd1ef773d8853414f9269e8b719277a4d636dfbbd645240f66306c5" + }, + "double_blocks.2.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "65fb905f9fb509e0d65a0000c22780079a16167100128408feb0015f935a0bc5" + }, + "double_blocks.3.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "58fc412d5ff3aaa1634b1cf92913c59d47a37a7306da7cbc2e02c1f5c851d073" + }, + "double_blocks.3.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "b4583862a94a30c772bfecf8ebfb8abad4ff684eefc81a60894a143fd45af07e" + }, + "double_blocks.4.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "aa42dfaca24f7566ea9eab500f153b1d5665340338cbda8ab86dff93e5d855b8" + }, + "double_blocks.4.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "6c1b965c4894978b49357f84b1223d96bd9b7ad91351c39be76a6e44c09bec5d" + }, + "double_stream_modulation_img": { + "shape": [ + 1, + 18432 + ], + "dtype": "float32", + "sha256": "73ed5c97924695b232328c26d9968306beb41131318d34e04add56f47fed5bc2" + }, + "double_stream_modulation_txt": { + "shape": [ + 1, + 18432 + ], + "dtype": "float32", + "sha256": "4cb1969d5f3e07e8ddbd78ca42ee82cadc492cbbb73105d3dad5e151de73cfa0" + }, + "features": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "3482cc3e89168264731155ce529cc5ff9299b09f9e6ade75b1a420d631896802" + }, + "final_layer": { + "shape": [ + 1024, + 128 + ], + "dtype": "float32", + "sha256": "95fe6e03c5e92319da801a0bfe7c5a873786c152c730a2fd8eb0e270dd8f8374" + }, + "final_layer.adaLN_modulation": { + "shape": [ + 1, + 6144 + ], + "dtype": "float32", + "sha256": "db554a26f26b73dc7dde6a883f3cee2ffefa601ea9d7fc41870508e3dfb7eda0" + }, + "ids.image": { + "shape": [ + 1024, + 4 + ], + "dtype": "float32", + "sha256": "8e6ca6477f8b787a44f1d3a6c05641319299ae79d0c43802e3396b7e9558fe8d" + }, + "ids.text": { + "shape": [ + 512, + 4 + ], + "dtype": "float32", + "sha256": "914a4d07f258895514e1b52023c57a677aa4925531d34e54831414224030a0f8" + }, + "img_in": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "6298a9cba1236a7083b21858392fe7f4d9f861db484edbc27fded29d5c37e4f7" + }, + "in.final_layer": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "70d7b278abc4a857607a87c1753d3ee6a374e5f3b983cc67f5548c810045882f" + }, + "in.single_blocks.0": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "14c74b91a0dfcd075dbc0b48bae37c124df2ffe571ce9355256f8df519d06434" + }, + "in.time_in": { + "shape": [ + 1, + 256 + ], + "dtype": "float32", + "sha256": "cbacd50d6ddae5179d08ae5986820a7baaecca4b2a9962dd856fc80aa62707e4" + }, + "latents": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "2cb3e62b5bb6a58f5b08f360ba95db386349bd0b4fe4128bd931125c8cceae04" + }, + "sigma": { + "shape": [], + "dtype": "float32", + "sha256": "e00e5eb9444182f352323374ef4e08ebcb784725fdd4fd612d7730540b3e0c8c" + }, + "single_blocks.0": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "d0bf56913a971b8412362c87df475f192ffa3e143ac94d1b151b5d0ffdd9f8eb" + }, + "single_blocks.1": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "1524d8e36a5bd60c627b6e1bc1e1d6e5320989b56be2633a0426bdf33d7e0b84" + }, + "single_blocks.10": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "ae88a8b6e16d7631f2d4d1b87fc148565f001aa529b1b0b148a1b4a3215cff41" + }, + "single_blocks.11": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "759b54d5fe2b899457a441eb61dd199a9e9e2840613e0d56c70214d1073b3830" + }, + "single_blocks.12": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "d98ec28877c7574223b35991b7ccddcd426c903af96c22d4bda3b8b9f50e79b0" + }, + "single_blocks.13": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "902ece97009bcb7edd74c8c9d67736ea548884e3227be2e1d3debccba64ebf7f" + }, + "single_blocks.14": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "1ed0e87e6e25c9d01a10ab2b3c722afd5dc61ef285696a7c385dcf749fd3b267" + }, + "single_blocks.15": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "330ca5d39c3bf7a986015deb41876dff6b33be599b3a3ed4d1c64eead5596685" + }, + "single_blocks.16": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "f0ed2e12a49fa1d10d49469ddbbb5c0497694b7fff3346a2d37847daa157d164" + }, + "single_blocks.17": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "cd0ce88baf593b8e891211b1a405e1fee9dafb5e386ea342f1b378b2ed10856e" + }, + "single_blocks.18": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "0016e09bef2cc36fce5f073624f9eee77d52254a1dd1817133957a2f92fb41f4" + }, + "single_blocks.19": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "8db4c540d043e8601ca59394b0c0eefc6bb0b6c5b45ba29158252cf9d382a5a9" + }, + "single_blocks.2": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "cd9710a9d8e080b3bc3e0a5c105b7b3977947c08a66bab13533fd7979682e0f9" + }, + "single_blocks.3": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "589faa4a572c392704778f9462b0200af19d9dab1d316399fda2b4fdf6467852" + }, + "single_blocks.4": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "7eb0c4a70fbdaea6358e2752ff8c4dfa58fa8982afd091be8ed95223e07e11a0" + }, + "single_blocks.5": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "39d540ea862501679a126846f2881d0ba458f154dd41f007ce97298b6a4a6e23" + }, + "single_blocks.6": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "f6f60742ae0309aaff88d60f6dd09ff0352a8a6f511b7bc65b857b3fa22bc2f1" + }, + "single_blocks.7": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "d38836360482374f304c7c380d5a96427bb6bf38d91990d33bad920d69e74399" + }, + "single_blocks.8": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "270b2de4f38de1c5af552588c70dbb02af6dfb56e815f918eca6cf84ef1052ae" + }, + "single_blocks.9": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "65e98260739501f3bbc1c36a472914332993d5cac55365ab649a5b8ca6d34e1b" + }, + "single_stream_modulation": { + "shape": [ + 1, + 9216 + ], + "dtype": "float32", + "sha256": "12e97e1d2a61989d6d32edbeec2485cb063a4c2ca33404c16c60e7e63ddf45b8" + }, + "txt_in": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "cccd06d66c0ffe480a988fe4d99ce37026e9904f57fb9c6dba9b0c5fac7cc7a8" + }, + "vec": { + "shape": [ + 1, + 3072 + ], + "dtype": "float32", + "sha256": "973469ca17446ade003cb24507a4c35e9c26b4312dc4e396f2b92860455cdeba" + }, + "velocity": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "1f87c046492da7c2471fc2cade2783687ceac7c2bbfde17d2c4aff39a063d844" + }, + "velocity_bf16": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "9fc5241c1e9446d55b8e9f0ba1e01c4658abb4771a6c0c66c26f3f862b5f36e9" + } + } +} diff --git a/tests/fixtures/image/oracle/check3_flux2_klein_base_r1_512.manifest.json b/tests/fixtures/image/oracle/check3_flux2_klein_base_r1_512.manifest.json new file mode 100644 index 000000000..6463fafca --- /dev/null +++ b/tests/fixtures/image/oracle/check3_flux2_klein_base_r1_512.manifest.json @@ -0,0 +1,942 @@ +{ + "schema": 1, + "name": "check3_flux2_klein_base_r1_512", + "check": 3, + "family": "flux2_klein", + "script": "scripts/image_oracle/check3_flux2_klein.py", + "argv": [ + "check3_flux2_klein.py", + "--reference", + "src", + "--reference-commit", + "50fe5162777813d869182b139e83b10743caef15", + "--dit", + "flux-2-klein-base-4b-Q4_K_M.gguf", + "--sizes", + "512", + "--rows", + "512", + "--refs", + "1", + "--steps", + "50", + "--name", + "check3_flux2_klein_base" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": { + "dit": { + "name": "flux-2-klein-base-4b-Q4_K_M.gguf", + "size": 2604311104, + "sha256": "8348ff1f2b3ac3cf9eb62f38322fcbb6d92811d39aa036d0671cf7bef9411266" + } + }, + "inputs": { + "size": 512, + "sigma": 1.0, + "step": 0, + "schedule": "get_schedule(50, 1024)", + "seed": 512, + "latents": "seeded normal, rounded to bf16", + "features": "seeded normal, std 4.0, rounded to bf16", + "text_rows": 512, + "refs": 1, + "ref_size": 512, + "dequant": "exact", + "matmul_bf16": "bf16 operands, float32 GEMM, one bf16 rounding", + "timestep": "bf16 as the reference's denoise fills it, in both modes", + "reference_commit": "50fe5162777813d869182b139e83b10743caef15", + "gguf_codecs": { + "F32": 60, + "Q5_K": 30, + "Q4_K": 50, + "BF16": 9 + } + }, + "results": { + "velocity_bf16_vs_fp32": { + "rel_l2": 0.009645132826187895, + "cosine": 0.9999555007543726, + "max_abs": 0.0527958869934082 + }, + "rows_bf16_vs_fp32": { + "vec": { + "rel_l2": 0.0017382974193546016, + "cosine": 0.9999984963979891, + "max_abs": 0.01546478271484375, + "teacher_forced": false + }, + "double_stream_modulation_img": { + "rel_l2": 0.0016464845265631162, + "cosine": 0.999998656706599, + "max_abs": 0.2581787109375, + "teacher_forced": false + }, + "double_stream_modulation_txt": { + "rel_l2": 0.0017673264060670969, + "cosine": 0.9999984496291131, + "max_abs": 0.08278656005859375, + "teacher_forced": false + }, + "single_stream_modulation": { + "rel_l2": 0.0016693167013436423, + "cosine": 0.9999987328209464, + "max_abs": 0.25644683837890625, + "teacher_forced": false + }, + "img_in": { + "rel_l2": 0.0016577882596413905, + "cosine": 0.9999986258688389, + "max_abs": 0.030887603759765625, + "teacher_forced": false + }, + "txt_in": { + "rel_l2": 0.0016594420810833153, + "cosine": 0.9999986231333832, + "max_abs": 0.06241798400878906, + "teacher_forced": false + }, + "double_blocks.0.img": { + "rel_l2": 0.010445345538428538, + "cosine": 0.9999456200933294, + "max_abs": 5.853179931640625, + "teacher_forced": true + }, + "double_blocks.0.txt": { + "rel_l2": 0.006933209700006471, + "cosine": 0.999977133584721, + "max_abs": 29.543212890625, + "teacher_forced": true + }, + "double_blocks.1.img": { + "rel_l2": 0.0066467184286505936, + "cosine": 0.9999784806658546, + "max_abs": 3.42596435546875, + "teacher_forced": true + }, + "double_blocks.1.txt": { + "rel_l2": 0.004657524968109548, + "cosine": 0.9999891573494079, + "max_abs": 15.347412109375, + "teacher_forced": true + }, + "double_blocks.2.img": { + "rel_l2": 0.005643599523339037, + "cosine": 0.9999841006520317, + "max_abs": 1.7820167541503906, + "teacher_forced": true + }, + "double_blocks.2.txt": { + "rel_l2": 0.004805157934810656, + "cosine": 0.9999884558928018, + "max_abs": 13.78857421875, + "teacher_forced": true + }, + "double_blocks.3.img": { + "rel_l2": 0.00599312622299804, + "cosine": 0.9999820495188481, + "max_abs": 1.9605331420898438, + "teacher_forced": true + }, + "double_blocks.3.txt": { + "rel_l2": 0.004702610840337081, + "cosine": 0.9999889437078382, + "max_abs": 12.4866943359375, + "teacher_forced": true + }, + "double_blocks.4.img": { + "rel_l2": 0.0052518092974316605, + "cosine": 0.9999897636795838, + "max_abs": 9.46978759765625, + "teacher_forced": true + }, + "double_blocks.4.txt": { + "rel_l2": 0.0050393784000627734, + "cosine": 0.9999873809863316, + "max_abs": 24.220458984375, + "teacher_forced": true + }, + "single_blocks.0": { + "rel_l2": 0.004437634953061179, + "cosine": 0.9999901601807578, + "max_abs": 18.66162109375, + "teacher_forced": true + }, + "single_blocks.1": { + "rel_l2": 0.005787348516995351, + "cosine": 0.9999832532010429, + "max_abs": 15.50341796875, + "teacher_forced": true + }, + "single_blocks.2": { + "rel_l2": 0.007561637042623985, + "cosine": 0.999971545403901, + "max_abs": 20.939697265625, + "teacher_forced": true + }, + "single_blocks.3": { + "rel_l2": 0.006385055022486865, + "cosine": 0.9999796262449101, + "max_abs": 13.7032470703125, + "teacher_forced": true + }, + "single_blocks.4": { + "rel_l2": 0.005786805644616853, + "cosine": 0.9999832761743555, + "max_abs": 11.9049072265625, + "teacher_forced": true + }, + "single_blocks.5": { + "rel_l2": 0.0034168017849679367, + "cosine": 0.9999944564435376, + "max_abs": 51.34375, + "teacher_forced": true + }, + "single_blocks.6": { + "rel_l2": 0.0033102712379065816, + "cosine": 0.9999948382816324, + "max_abs": 36.333984375, + "teacher_forced": true + }, + "single_blocks.7": { + "rel_l2": 0.003334258573486067, + "cosine": 0.9999945468889391, + "max_abs": 30.12060546875, + "teacher_forced": true + }, + "single_blocks.8": { + "rel_l2": 0.003714211915059085, + "cosine": 0.9999933769696261, + "max_abs": 35.189453125, + "teacher_forced": true + }, + "single_blocks.9": { + "rel_l2": 0.003512616333528145, + "cosine": 0.9999939586313475, + "max_abs": 22.68798828125, + "teacher_forced": true + }, + "single_blocks.10": { + "rel_l2": 0.008033855186842971, + "cosine": 0.9999726021120089, + "max_abs": 39.924560546875, + "teacher_forced": true + }, + "single_blocks.11": { + "rel_l2": 0.006164038502185468, + "cosine": 0.9999816981663566, + "max_abs": 17.75537109375, + "teacher_forced": true + }, + "single_blocks.12": { + "rel_l2": 0.005476544879259275, + "cosine": 0.9999850678198249, + "max_abs": 11.85546875, + "teacher_forced": true + }, + "single_blocks.13": { + "rel_l2": 0.006778387002396583, + "cosine": 0.99997766579361, + "max_abs": 16.1044921875, + "teacher_forced": true + }, + "single_blocks.14": { + "rel_l2": 0.005993339926694989, + "cosine": 0.9999821707303889, + "max_abs": 10.90087890625, + "teacher_forced": true + }, + "single_blocks.15": { + "rel_l2": 0.005419366754439725, + "cosine": 0.9999856459332621, + "max_abs": 12.3349609375, + "teacher_forced": true + }, + "single_blocks.16": { + "rel_l2": 0.006832680453284206, + "cosine": 0.9999778433572958, + "max_abs": 15.08642578125, + "teacher_forced": true + }, + "single_blocks.17": { + "rel_l2": 0.006053409578438944, + "cosine": 0.9999818624047151, + "max_abs": 13.692626953125, + "teacher_forced": true + }, + "single_blocks.18": { + "rel_l2": 0.006649570671927462, + "cosine": 0.9999820555710595, + "max_abs": 44.8626708984375, + "teacher_forced": true + }, + "single_blocks.19": { + "rel_l2": 0.0030558408035105036, + "cosine": 0.9999953315334242, + "max_abs": 25.00341796875, + "teacher_forced": true + }, + "final_layer.adaLN_modulation": { + "rel_l2": 0.0019135450516302758, + "cosine": 0.9999981870803879, + "max_abs": 0.26091766357421875, + "teacher_forced": false + }, + "final_layer": { + "rel_l2": 0.0036489005576738776, + "cosine": 0.9999933430164553, + "max_abs": 0.022334575653076172, + "teacher_forced": true + } + }, + "free_bf16_vs_fp32": { + "double_blocks.0.img": 0.011648768941293413, + "double_blocks.0.txt": 0.007459039290931021, + "double_blocks.1.img": 0.014668508382344025, + "double_blocks.1.txt": 0.01142568139735851, + "double_blocks.2.img": 0.01611259656658615, + "double_blocks.2.txt": 0.015098258950314426, + "double_blocks.3.img": 0.01647614095687245, + "double_blocks.3.txt": 0.017458660376664683, + "double_blocks.4.img": 0.011024018767158465, + "double_blocks.4.txt": 0.01745750082108466, + "single_blocks.0": 0.01571981190671497, + "single_blocks.1": 0.01747532916022876, + "single_blocks.2": 0.02024765794931976, + "single_blocks.3": 0.019583287129238534, + "single_blocks.4": 0.019142397620491195, + "single_blocks.5": 0.010514344895118117, + "single_blocks.6": 0.012138803796817524, + "single_blocks.7": 0.012523693264996225, + "single_blocks.8": 0.013367572589354707, + "single_blocks.9": 0.014572252373776363, + "single_blocks.10": 0.022535236550953578, + "single_blocks.11": 0.026120553241776194, + "single_blocks.12": 0.026529250891747423, + "single_blocks.13": 0.027254848054773573, + "single_blocks.14": 0.02713936522342675, + "single_blocks.15": 0.02616550532034762, + "single_blocks.16": 0.028492114231322002, + "single_blocks.17": 0.026721226674140876, + "single_blocks.18": 0.02021636633959232, + "single_blocks.19": 0.016892406649311232, + "final_layer": 0.009645132826187895 + }, + "times": { + "fp32_s": 10.8, + "bf16_s": 33.8, + "bf16_teacher_forced_s": 34.3 + }, + "exact_free_floor": { + "rel_l2": 6.087682366110386e-06, + "row": "free single_blocks.13", + "measured": "gmlx's exact step on the GPU against the same step on the CPU stream, worst free row; tests/image/flux2_gates.py exact_free_floor on flux2-klein, Apple M5 Max" + }, + "exact_velocity_floor": { + "rel_l2": 1.2516758626676791e-06, + "measured": "gmlx's exact step on the GPU against the same step on the CPU stream, velocity; tests/image/flux2_gates.py exact_free_floor on flux2-klein, Apple M5 Max" + } + }, + "tolerances": { + "velocity": { + "rel_l2": 0.01929026565237579, + "cosine_min": 0.9998220030174902 + }, + "vec": { + "rel_l2": 0.003476594838709203, + "teacher_forced": false + }, + "double_stream_modulation_img": { + "rel_l2": 0.0032929690531262323, + "teacher_forced": false + }, + "double_stream_modulation_txt": { + "rel_l2": 0.0035346528121341938, + "teacher_forced": false + }, + "single_stream_modulation": { + "rel_l2": 0.0033386334026872847, + "teacher_forced": false + }, + "img_in": { + "rel_l2": 0.003315576519282781, + "teacher_forced": false + }, + "txt_in": { + "rel_l2": 0.0033188841621666306, + "teacher_forced": false + }, + "double_blocks.0.img": { + "rel_l2": 0.020890691076857076, + "teacher_forced": true + }, + "double_blocks.0.txt": { + "rel_l2": 0.013866419400012943, + "teacher_forced": true + }, + "double_blocks.1.img": { + "rel_l2": 0.013293436857301187, + "teacher_forced": true + }, + "double_blocks.1.txt": { + "rel_l2": 0.009315049936219096, + "teacher_forced": true + }, + "double_blocks.2.img": { + "rel_l2": 0.011287199046678074, + "teacher_forced": true + }, + "double_blocks.2.txt": { + "rel_l2": 0.009610315869621312, + "teacher_forced": true + }, + "double_blocks.3.img": { + "rel_l2": 0.01198625244599608, + "teacher_forced": true + }, + "double_blocks.3.txt": { + "rel_l2": 0.009405221680674161, + "teacher_forced": true + }, + "double_blocks.4.img": { + "rel_l2": 0.010503618594863321, + "teacher_forced": true + }, + "double_blocks.4.txt": { + "rel_l2": 0.010078756800125547, + "teacher_forced": true + }, + "single_blocks.0": { + "rel_l2": 0.008875269906122358, + "teacher_forced": true + }, + "single_blocks.1": { + "rel_l2": 0.011574697033990703, + "teacher_forced": true + }, + "single_blocks.2": { + "rel_l2": 0.01512327408524797, + "teacher_forced": true + }, + "single_blocks.3": { + "rel_l2": 0.01277011004497373, + "teacher_forced": true + }, + "single_blocks.4": { + "rel_l2": 0.011573611289233706, + "teacher_forced": true + }, + "single_blocks.5": { + "rel_l2": 0.006833603569935873, + "teacher_forced": true + }, + "single_blocks.6": { + "rel_l2": 0.006620542475813163, + "teacher_forced": true + }, + "single_blocks.7": { + "rel_l2": 0.006668517146972134, + "teacher_forced": true + }, + "single_blocks.8": { + "rel_l2": 0.00742842383011817, + "teacher_forced": true + }, + "single_blocks.9": { + "rel_l2": 0.00702523266705629, + "teacher_forced": true + }, + "single_blocks.10": { + "rel_l2": 0.016067710373685942, + "teacher_forced": true + }, + "single_blocks.11": { + "rel_l2": 0.012328077004370936, + "teacher_forced": true + }, + "single_blocks.12": { + "rel_l2": 0.01095308975851855, + "teacher_forced": true + }, + "single_blocks.13": { + "rel_l2": 0.013556774004793166, + "teacher_forced": true + }, + "single_blocks.14": { + "rel_l2": 0.011986679853389979, + "teacher_forced": true + }, + "single_blocks.15": { + "rel_l2": 0.01083873350887945, + "teacher_forced": true + }, + "single_blocks.16": { + "rel_l2": 0.013665360906568412, + "teacher_forced": true + }, + "single_blocks.17": { + "rel_l2": 0.012106819156877889, + "teacher_forced": true + }, + "single_blocks.18": { + "rel_l2": 0.013299141343854924, + "teacher_forced": true + }, + "single_blocks.19": { + "rel_l2": 0.006111681607021007, + "teacher_forced": true + }, + "final_layer.adaLN_modulation": { + "rel_l2": 0.0038270901032605516, + "teacher_forced": false + }, + "final_layer": { + "rel_l2": 0.007297801115347755, + "teacher_forced": true + }, + "rule": "tolerance = 2 x the oracle's own bf16 against fp32 relative L2: teacher-forced for each block and the final layer, free running for the time vector, modulations and embeddings and for the velocity", + "exact_free": { + "rel_l2": 5e-05 + }, + "exact_velocity": { + "rel_l2": 5e-05 + } + }, + "notes": [], + "created": "2026-10-16T12:07:01Z", + "npz": "check3_flux2_klein_base_r1_512.npz", + "tensors": { + "double_blocks.0.img": { + "shape": [ + 2048, + 3072 + ], + "dtype": "float32", + "sha256": "7ec5a5c772e5c3b566e68de59d519d50674e46273df0f0394189ae2bf4a9a843" + }, + "double_blocks.0.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "11a818d3222b7aa6c2b5c77647b1c693493e0a418d77f6118fe3bf54df910b53" + }, + "double_blocks.1.img": { + "shape": [ + 2048, + 3072 + ], + "dtype": "float32", + "sha256": "1aaca5290664cd6ca32c299e4d917582668a54bc154bf8974093150aa9c99935" + }, + "double_blocks.1.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "186eacfa85692d765e69bfbda0b0e934037bf43e775a60700454bd1893d74d7b" + }, + "double_blocks.2.img": { + "shape": [ + 2048, + 3072 + ], + "dtype": "float32", + "sha256": "5e6eda40391f92a9500120de76e2e4a5dd19ce82d2c68be9561993f66b380478" + }, + "double_blocks.2.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "b274e122181befaa4d89a9d3b42972ef39371ff7564ba8d8f01570c6dcac908f" + }, + "double_blocks.3.img": { + "shape": [ + 2048, + 3072 + ], + "dtype": "float32", + "sha256": "19703dbdbe9b5b61216c4d269ffef97af7b4c9d440356e10b2a0922c10d86142" + }, + "double_blocks.3.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "3b47a15e88649e6a9679dc640422ad1687389b10772561efd6c299ee16cdf266" + }, + "double_blocks.4.img": { + "shape": [ + 2048, + 3072 + ], + "dtype": "float32", + "sha256": "275f2cad4c299a05940163823e21848db4843fc5d8e3e737c8cf4b9afed6700e" + }, + "double_blocks.4.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "b99e4fddaa2ca1a72ba65efaa888c9e6e5256263363fe668d5829a487119feb2" + }, + "double_stream_modulation_img": { + "shape": [ + 1, + 18432 + ], + "dtype": "float32", + "sha256": "73ed5c97924695b232328c26d9968306beb41131318d34e04add56f47fed5bc2" + }, + "double_stream_modulation_txt": { + "shape": [ + 1, + 18432 + ], + "dtype": "float32", + "sha256": "4cb1969d5f3e07e8ddbd78ca42ee82cadc492cbbb73105d3dad5e151de73cfa0" + }, + "features": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "3482cc3e89168264731155ce529cc5ff9299b09f9e6ade75b1a420d631896802" + }, + "final_layer": { + "shape": [ + 1024, + 128 + ], + "dtype": "float32", + "sha256": "2b59a9aa1dc30e7b2524439cd862f9e79bf5952099ed3cf63743aeaf53c6d779" + }, + "final_layer.adaLN_modulation": { + "shape": [ + 1, + 6144 + ], + "dtype": "float32", + "sha256": "db554a26f26b73dc7dde6a883f3cee2ffefa601ea9d7fc41870508e3dfb7eda0" + }, + "ids.image": { + "shape": [ + 2048, + 4 + ], + "dtype": "float32", + "sha256": "1ae78fae8f1e1ee5b47214b5e0de11d0874c7576615c41d9d733793abe84ffdc" + }, + "ids.text": { + "shape": [ + 512, + 4 + ], + "dtype": "float32", + "sha256": "914a4d07f258895514e1b52023c57a677aa4925531d34e54831414224030a0f8" + }, + "img_in": { + "shape": [ + 2048, + 3072 + ], + "dtype": "float32", + "sha256": "5dac051397f3eb1993a7fd2ae0153a5b37d7dd1055b196a9417e1dd6fea152ff" + }, + "in.final_layer": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "a16685ab22a56a06e72f979f9ea7080b311b98ae9c14c453964244f82d180f7d" + }, + "in.single_blocks.0": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "d8c005ad4b7e616e26c4a746bf3b446504fd8e8ac4567b3838968e4a68ca27f0" + }, + "in.time_in": { + "shape": [ + 1, + 256 + ], + "dtype": "float32", + "sha256": "cbacd50d6ddae5179d08ae5986820a7baaecca4b2a9962dd856fc80aa62707e4" + }, + "latents": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "2cb3e62b5bb6a58f5b08f360ba95db386349bd0b4fe4128bd931125c8cceae04" + }, + "refs.0": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "7097102f2f785e6b17e40c748de6f47327eef79637c255a6c7b18a57c0fdf0e6" + }, + "sigma": { + "shape": [], + "dtype": "float32", + "sha256": "e00e5eb9444182f352323374ef4e08ebcb784725fdd4fd612d7730540b3e0c8c" + }, + "single_blocks.0": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "14af89712f77733e32412a1d46eaeef92827b562052b5a756cee72f206a1650e" + }, + "single_blocks.1": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "3d3f84c6e0651e2152299e2df12c78b8cf5d5a51285078922e0fadacefdce9d3" + }, + "single_blocks.10": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "dd2a1ee33c87aabf71330cc51b63da3fd325489cce292307c38b21015bc7e6e9" + }, + "single_blocks.11": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "ffb60f3543c974899ef80ae5073259c7b83c1130668b0c91b7cfbb489bef84b1" + }, + "single_blocks.12": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "2a6a8a18c9e4d6f020acb174f2b80e03a8aa12dfc278cf556d7424a90fbec914" + }, + "single_blocks.13": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "328bb14d06cfe7c395eb8732265917bf1c966135713f23eaa4c10b06942ff3ea" + }, + "single_blocks.14": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "ec252db5e4a820a4aaac2eee34be87f938d18febfe665d41a48c7a72938e3d31" + }, + "single_blocks.15": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "6aa303d9d278666b3ffb1fcb1dd9d022cd91abc0de37e68c9cf64a9dd5685a66" + }, + "single_blocks.16": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "b317dbd848071214bfe0b6dd1c7d4a57fe9a56f15d2bb68dd711970935bb27cb" + }, + "single_blocks.17": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "b82c64b0a35b69ef6f98f19393cf2a768ac2bd52892540601ee57d208b40d0ec" + }, + "single_blocks.18": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "29f8772f4f6908ccf177595603c092c724860c89da0697ead48f8f1849b947ac" + }, + "single_blocks.19": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "da55d99a620baffa87192ae810f8d50c3f682b60f223abc329b09e270d3887bd" + }, + "single_blocks.2": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "e6c602defb88abd155dc52a2ac002d8f2b9542a6d44a326970a6daed39793094" + }, + "single_blocks.3": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "381c5094bc98e573bf512ef27cd050413c5b3d63885075b22201d0d52214f1da" + }, + "single_blocks.4": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "84df200c703b1b0b848c2213036abb288f833d65e92272a5f615993f779978fd" + }, + "single_blocks.5": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "6c6d608592d109204daf3f71c84419c80fd0b9fb7f37959b32bc744646b2009a" + }, + "single_blocks.6": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "6cf000969cbcd13c3dab9dfd10d215b78e6748aecea96ca611fc9a7cbfe60f5c" + }, + "single_blocks.7": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "113ef2111e543d18abdfa3d4eb0a53a456a0b07f7c8ced0060e2ee6ea4ae6e5d" + }, + "single_blocks.8": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "4bd3c7503a40cc97edabedccbfdaf33c0c93e9734754066b990d511d8496367d" + }, + "single_blocks.9": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "0ca77ac0c5c98ee0373511b77cb6544904d772addb33c4fd1a1b9c5d0ba9ef07" + }, + "single_stream_modulation": { + "shape": [ + 1, + 9216 + ], + "dtype": "float32", + "sha256": "12e97e1d2a61989d6d32edbeec2485cb063a4c2ca33404c16c60e7e63ddf45b8" + }, + "txt_in": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "cccd06d66c0ffe480a988fe4d99ce37026e9904f57fb9c6dba9b0c5fac7cc7a8" + }, + "vec": { + "shape": [ + 1, + 3072 + ], + "dtype": "float32", + "sha256": "973469ca17446ade003cb24507a4c35e9c26b4312dc4e396f2b92860455cdeba" + }, + "velocity": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "edb66e079371d23773aea3ea4f2753c4aed1fa25145f5ffff31a940f28f2a43b" + }, + "velocity_bf16": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "07dd13cce35f58962e87deced37acf907c1df252f5caa5ab2752880dc2696b64" + } + } +} diff --git a/tests/fixtures/image/oracle/check3_flux2_klein_r1_1024.manifest.json b/tests/fixtures/image/oracle/check3_flux2_klein_r1_1024.manifest.json new file mode 100644 index 000000000..9f0a9f3ed --- /dev/null +++ b/tests/fixtures/image/oracle/check3_flux2_klein_r1_1024.manifest.json @@ -0,0 +1,188 @@ +{ + "schema": 1, + "name": "check3_flux2_klein_r1_1024", + "check": 3, + "family": "flux2_klein", + "script": "scripts/image_oracle/check3_flux2_klein.py", + "argv": [ + "check3_flux2_klein.py", + "--reference", + "src", + "--reference-commit", + "50fe5162777813d869182b139e83b10743caef15", + "--dit", + "flux-2-klein-4b-Q4_K_M.gguf", + "--sizes", + "512", + "1024", + "--rows", + "512", + "--refs", + "1" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": { + "dit": { + "name": "flux-2-klein-4b-Q4_K_M.gguf", + "size": 2604311104, + "sha256": "0b25d143c8469b342bc5af3bce92b783bf6b0636d285f7b2f75e38af63af9a15" + } + }, + "inputs": { + "size": 1024, + "sigma": 1.0, + "step": 0, + "schedule": "get_schedule(4, 4096)", + "seed": 1024, + "latents": "seeded normal, rounded to bf16", + "features": "seeded normal, std 4.0, rounded to bf16", + "text_rows": 512, + "refs": 1, + "ref_size": 1024, + "dequant": "exact", + "matmul_bf16": "bf16 operands, float32 GEMM, one bf16 rounding", + "timestep": "bf16 as the reference's denoise fills it, in both modes", + "reference_commit": "50fe5162777813d869182b139e83b10743caef15", + "gguf_codecs": { + "F32": 60, + "Q5_K": 30, + "Q4_K": 50, + "BF16": 9 + } + }, + "results": { + "velocity_bf16_vs_fp32": { + "rel_l2": 0.02556485879173634, + "cosine": 0.9997003122720273, + "max_abs": 0.12485519051551819 + }, + "times": { + "fp32_s": 43.1, + "bf16_s": 355.3 + } + }, + "tolerances": { + "velocity": { + "rel_l2": 0.05112971758347268, + "cosine_min": 0.9988012490881091 + }, + "rule": "tolerance = 2 x the oracle's own bf16 against fp32 relative L2: teacher-forced for each block and the final layer, free running for the time vector, modulations and embeddings and for the velocity" + }, + "notes": [], + "created": "2026-10-16T12:15:03Z", + "npz": "check3_flux2_klein_r1_1024.npz", + "tensors": { + "features": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "3482cc3e89168264731155ce529cc5ff9299b09f9e6ade75b1a420d631896802" + }, + "ids.image": { + "shape": [ + 8192, + 4 + ], + "dtype": "float32", + "sha256": "5156b794ef4827c31669dd3f45d9c5b507d1ce3ba9b29edb9d0297c13af4b2d6" + }, + "ids.text": { + "shape": [ + 512, + 4 + ], + "dtype": "float32", + "sha256": "914a4d07f258895514e1b52023c57a677aa4925531d34e54831414224030a0f8" + }, + "in.time_in": { + "shape": [ + 1, + 256 + ], + "dtype": "float32", + "sha256": "cbacd50d6ddae5179d08ae5986820a7baaecca4b2a9962dd856fc80aa62707e4" + }, + "latents": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "2ce0f3a03885ff5202f83cc448e3caeafce143ff69753702eb39499c5466df80" + }, + "refs.0": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "3838d8dc4ae1a4d33bd8595c6caa1c70aaf963cc8bd0137cb99570f847c1ba45" + }, + "sigma": { + "shape": [], + "dtype": "float32", + "sha256": "e00e5eb9444182f352323374ef4e08ebcb784725fdd4fd612d7730540b3e0c8c" + }, + "velocity": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "e5708d36dc06ff18af3888d45ecde815c89dc6fc582a60b887c11c8b366de052" + }, + "velocity_bf16": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "db66adc4e3b7d8ce455377236a1dce0d262864caa2a19bc8c6bf5a7b424f5a3e" + } + } +} diff --git a/tests/fixtures/image/oracle/check3_flux2_klein_r1_512.manifest.json b/tests/fixtures/image/oracle/check3_flux2_klein_r1_512.manifest.json new file mode 100644 index 000000000..938ad6a46 --- /dev/null +++ b/tests/fixtures/image/oracle/check3_flux2_klein_r1_512.manifest.json @@ -0,0 +1,939 @@ +{ + "schema": 1, + "name": "check3_flux2_klein_r1_512", + "check": 3, + "family": "flux2_klein", + "script": "scripts/image_oracle/check3_flux2_klein.py", + "argv": [ + "check3_flux2_klein.py", + "--reference", + "src", + "--reference-commit", + "50fe5162777813d869182b139e83b10743caef15", + "--dit", + "flux-2-klein-4b-Q4_K_M.gguf", + "--sizes", + "512", + "1024", + "--rows", + "512", + "--refs", + "1" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": { + "dit": { + "name": "flux-2-klein-4b-Q4_K_M.gguf", + "size": 2604311104, + "sha256": "0b25d143c8469b342bc5af3bce92b783bf6b0636d285f7b2f75e38af63af9a15" + } + }, + "inputs": { + "size": 512, + "sigma": 1.0, + "step": 0, + "schedule": "get_schedule(4, 1024)", + "seed": 512, + "latents": "seeded normal, rounded to bf16", + "features": "seeded normal, std 4.0, rounded to bf16", + "text_rows": 512, + "refs": 1, + "ref_size": 512, + "dequant": "exact", + "matmul_bf16": "bf16 operands, float32 GEMM, one bf16 rounding", + "timestep": "bf16 as the reference's denoise fills it, in both modes", + "reference_commit": "50fe5162777813d869182b139e83b10743caef15", + "gguf_codecs": { + "F32": 60, + "Q5_K": 30, + "Q4_K": 50, + "BF16": 9 + } + }, + "results": { + "velocity_bf16_vs_fp32": { + "rel_l2": 0.025426353511159745, + "cosine": 0.9996809817485715, + "max_abs": 0.12555384635925293 + }, + "rows_bf16_vs_fp32": { + "vec": { + "rel_l2": 0.0017350471821734716, + "cosine": 0.9999985048596156, + "max_abs": 0.007456779479980469, + "teacher_forced": false + }, + "double_stream_modulation_img": { + "rel_l2": 0.0017075999965016557, + "cosine": 0.9999985477892043, + "max_abs": 0.039051055908203125, + "teacher_forced": false + }, + "double_stream_modulation_txt": { + "rel_l2": 0.001656781628104715, + "cosine": 0.9999986362054634, + "max_abs": 0.019323348999023438, + "teacher_forced": false + }, + "single_stream_modulation": { + "rel_l2": 0.0016003666594017491, + "cosine": 0.9999987212076318, + "max_abs": 0.093231201171875, + "teacher_forced": false + }, + "img_in": { + "rel_l2": 0.0016584009491729577, + "cosine": 0.9999986248530056, + "max_abs": 0.03107452392578125, + "teacher_forced": false + }, + "txt_in": { + "rel_l2": 0.0016583942242231634, + "cosine": 0.9999986248639099, + "max_abs": 0.06249237060546875, + "teacher_forced": false + }, + "double_blocks.0.img": { + "rel_l2": 0.006527308343581304, + "cosine": 0.9999788241228388, + "max_abs": 1.2749404907226562, + "teacher_forced": true + }, + "double_blocks.0.txt": { + "rel_l2": 0.004909201216871114, + "cosine": 0.9999895252789313, + "max_abs": 16.5091552734375, + "teacher_forced": true + }, + "double_blocks.1.img": { + "rel_l2": 0.004236274786247123, + "cosine": 0.9999920730730145, + "max_abs": 0.9542922973632812, + "teacher_forced": true + }, + "double_blocks.1.txt": { + "rel_l2": 0.0037354133354565665, + "cosine": 0.9999930285485323, + "max_abs": 8.2554931640625, + "teacher_forced": true + }, + "double_blocks.2.img": { + "rel_l2": 0.0052643758051258765, + "cosine": 0.9999867023497548, + "max_abs": 0.7426605224609375, + "teacher_forced": true + }, + "double_blocks.2.txt": { + "rel_l2": 0.004190546955006557, + "cosine": 0.9999912620162736, + "max_abs": 9.56689453125, + "teacher_forced": true + }, + "double_blocks.3.img": { + "rel_l2": 0.00539132388641542, + "cosine": 0.9999857834926674, + "max_abs": 0.750946044921875, + "teacher_forced": true + }, + "double_blocks.3.txt": { + "rel_l2": 0.004315383253318242, + "cosine": 0.9999907100165896, + "max_abs": 6.9315185546875, + "teacher_forced": true + }, + "double_blocks.4.img": { + "rel_l2": 0.0034016737375271756, + "cosine": 0.9999943227522284, + "max_abs": 3.101165771484375, + "teacher_forced": true + }, + "double_blocks.4.txt": { + "rel_l2": 0.004844919426873743, + "cosine": 0.9999884867092274, + "max_abs": 7.56195068359375, + "teacher_forced": true + }, + "single_blocks.0": { + "rel_l2": 0.003637067282478339, + "cosine": 0.9999934447629046, + "max_abs": 8.3662109375, + "teacher_forced": true + }, + "single_blocks.1": { + "rel_l2": 0.0041220452965887834, + "cosine": 0.9999915273113349, + "max_abs": 4.326416015625, + "teacher_forced": true + }, + "single_blocks.2": { + "rel_l2": 0.0046871880689029225, + "cosine": 0.9999890151572758, + "max_abs": 3.8045654296875, + "teacher_forced": true + }, + "single_blocks.3": { + "rel_l2": 0.004607523027962271, + "cosine": 0.9999895272465307, + "max_abs": 4.327880859375, + "teacher_forced": true + }, + "single_blocks.4": { + "rel_l2": 0.004338077569758272, + "cosine": 0.9999908349659039, + "max_abs": 4.52362060546875, + "teacher_forced": true + }, + "single_blocks.5": { + "rel_l2": 0.0033933382251680614, + "cosine": 0.9999944211445629, + "max_abs": 8.1153564453125, + "teacher_forced": true + }, + "single_blocks.6": { + "rel_l2": 0.00355338535399856, + "cosine": 0.9999940303154268, + "max_abs": 6.3853759765625, + "teacher_forced": true + }, + "single_blocks.7": { + "rel_l2": 0.003773323874773841, + "cosine": 0.9999934469661956, + "max_abs": 5.81024169921875, + "teacher_forced": true + }, + "single_blocks.8": { + "rel_l2": 0.0036882776191895757, + "cosine": 0.9999934737800531, + "max_abs": 4.705810546875, + "teacher_forced": true + }, + "single_blocks.9": { + "rel_l2": 0.0038945280013133058, + "cosine": 0.9999925734599119, + "max_abs": 4.702880859375, + "teacher_forced": true + }, + "single_blocks.10": { + "rel_l2": 0.004339613798794241, + "cosine": 0.999990587773519, + "max_abs": 4.064453125, + "teacher_forced": true + }, + "single_blocks.11": { + "rel_l2": 0.005600856859139728, + "cosine": 0.9999844224894425, + "max_abs": 4.44720458984375, + "teacher_forced": true + }, + "single_blocks.12": { + "rel_l2": 0.005688425125743223, + "cosine": 0.9999839472640791, + "max_abs": 3.714111328125, + "teacher_forced": true + }, + "single_blocks.13": { + "rel_l2": 0.005447377932740518, + "cosine": 0.9999852199362257, + "max_abs": 3.90618896484375, + "teacher_forced": true + }, + "single_blocks.14": { + "rel_l2": 0.005684140957940585, + "cosine": 0.9999838626022862, + "max_abs": 4.288330078125, + "teacher_forced": true + }, + "single_blocks.15": { + "rel_l2": 0.005959661812600941, + "cosine": 0.9999822446589983, + "max_abs": 3.8485107421875, + "teacher_forced": true + }, + "single_blocks.16": { + "rel_l2": 0.005960128699924741, + "cosine": 0.9999822484699037, + "max_abs": 5.2501220703125, + "teacher_forced": true + }, + "single_blocks.17": { + "rel_l2": 0.005847717852944405, + "cosine": 0.999982912900637, + "max_abs": 3.71929931640625, + "teacher_forced": true + }, + "single_blocks.18": { + "rel_l2": 0.005160391915064564, + "cosine": 0.9999866954792682, + "max_abs": 11.244384765625, + "teacher_forced": true + }, + "single_blocks.19": { + "rel_l2": 0.00470032993870488, + "cosine": 0.999988961807143, + "max_abs": 20.150634765625, + "teacher_forced": true + }, + "final_layer.adaLN_modulation": { + "rel_l2": 0.0013852935633001928, + "cosine": 0.9999990845155656, + "max_abs": 0.06572341918945312, + "teacher_forced": false + }, + "final_layer": { + "rel_l2": 0.003865711193885784, + "cosine": 0.9999925394215975, + "max_abs": 0.020499229431152344, + "teacher_forced": true + } + }, + "free_bf16_vs_fp32": { + "double_blocks.0.img": 0.006196975925761756, + "double_blocks.0.txt": 0.00495344451944832, + "double_blocks.1.img": 0.006894508188904803, + "double_blocks.1.txt": 0.006977996790444269, + "double_blocks.2.img": 0.00872396805646243, + "double_blocks.2.txt": 0.009265669912284035, + "double_blocks.3.img": 0.009580465120684981, + "double_blocks.3.txt": 0.010981132766131042, + "double_blocks.4.img": 0.004909610860612563, + "double_blocks.4.txt": 0.0113649679894209, + "single_blocks.0": 0.009600616664273556, + "single_blocks.1": 0.0108373464235805, + "single_blocks.2": 0.012432054235406866, + "single_blocks.3": 0.011900054683818783, + "single_blocks.4": 0.011314986452997576, + "single_blocks.5": 0.009056528479157286, + "single_blocks.6": 0.009690947244499669, + "single_blocks.7": 0.01067097364405623, + "single_blocks.8": 0.011701673984008482, + "single_blocks.9": 0.012825189107779227, + "single_blocks.10": 0.015952382281736247, + "single_blocks.11": 0.01841819975945179, + "single_blocks.12": 0.02020580526327357, + "single_blocks.13": 0.022282284377365163, + "single_blocks.14": 0.024196694859527582, + "single_blocks.15": 0.026380414380672856, + "single_blocks.16": 0.02882662203494187, + "single_blocks.17": 0.02972557673806983, + "single_blocks.18": 0.025712475311688993, + "single_blocks.19": 0.026158168422159997, + "final_layer": 0.025426353511159745 + }, + "times": { + "fp32_s": 10.9, + "bf16_s": 33.7, + "bf16_teacher_forced_s": 34.1 + }, + "exact_free_floor": { + "rel_l2": 8.053759344992696e-06, + "row": "free single_blocks.17", + "measured": "gmlx's exact step on the GPU against the same step on the CPU stream, worst free row; tests/image/flux2_gates.py exact_free_floor on flux2-klein, Apple M5 Max" + }, + "exact_velocity_floor": { + "rel_l2": 6.6135050804764316e-06, + "measured": "gmlx's exact step on the GPU against the same step on the CPU stream, velocity; tests/image/flux2_gates.py exact_free_floor on flux2-klein, Apple M5 Max" + } + }, + "tolerances": { + "velocity": { + "rel_l2": 0.05085270702231949, + "cosine_min": 0.9987239269942858 + }, + "vec": { + "rel_l2": 0.003470094364346943, + "teacher_forced": false + }, + "double_stream_modulation_img": { + "rel_l2": 0.0034151999930033114, + "teacher_forced": false + }, + "double_stream_modulation_txt": { + "rel_l2": 0.00331356325620943, + "teacher_forced": false + }, + "single_stream_modulation": { + "rel_l2": 0.0032007333188034982, + "teacher_forced": false + }, + "img_in": { + "rel_l2": 0.0033168018983459153, + "teacher_forced": false + }, + "txt_in": { + "rel_l2": 0.0033167884484463267, + "teacher_forced": false + }, + "double_blocks.0.img": { + "rel_l2": 0.013054616687162608, + "teacher_forced": true + }, + "double_blocks.0.txt": { + "rel_l2": 0.009818402433742228, + "teacher_forced": true + }, + "double_blocks.1.img": { + "rel_l2": 0.008472549572494246, + "teacher_forced": true + }, + "double_blocks.1.txt": { + "rel_l2": 0.007470826670913133, + "teacher_forced": true + }, + "double_blocks.2.img": { + "rel_l2": 0.010528751610251753, + "teacher_forced": true + }, + "double_blocks.2.txt": { + "rel_l2": 0.008381093910013114, + "teacher_forced": true + }, + "double_blocks.3.img": { + "rel_l2": 0.01078264777283084, + "teacher_forced": true + }, + "double_blocks.3.txt": { + "rel_l2": 0.008630766506636484, + "teacher_forced": true + }, + "double_blocks.4.img": { + "rel_l2": 0.006803347475054351, + "teacher_forced": true + }, + "double_blocks.4.txt": { + "rel_l2": 0.009689838853747487, + "teacher_forced": true + }, + "single_blocks.0": { + "rel_l2": 0.007274134564956678, + "teacher_forced": true + }, + "single_blocks.1": { + "rel_l2": 0.008244090593177567, + "teacher_forced": true + }, + "single_blocks.2": { + "rel_l2": 0.009374376137805845, + "teacher_forced": true + }, + "single_blocks.3": { + "rel_l2": 0.009215046055924542, + "teacher_forced": true + }, + "single_blocks.4": { + "rel_l2": 0.008676155139516544, + "teacher_forced": true + }, + "single_blocks.5": { + "rel_l2": 0.006786676450336123, + "teacher_forced": true + }, + "single_blocks.6": { + "rel_l2": 0.00710677070799712, + "teacher_forced": true + }, + "single_blocks.7": { + "rel_l2": 0.007546647749547682, + "teacher_forced": true + }, + "single_blocks.8": { + "rel_l2": 0.007376555238379151, + "teacher_forced": true + }, + "single_blocks.9": { + "rel_l2": 0.0077890560026266115, + "teacher_forced": true + }, + "single_blocks.10": { + "rel_l2": 0.008679227597588482, + "teacher_forced": true + }, + "single_blocks.11": { + "rel_l2": 0.011201713718279455, + "teacher_forced": true + }, + "single_blocks.12": { + "rel_l2": 0.011376850251486445, + "teacher_forced": true + }, + "single_blocks.13": { + "rel_l2": 0.010894755865481037, + "teacher_forced": true + }, + "single_blocks.14": { + "rel_l2": 0.01136828191588117, + "teacher_forced": true + }, + "single_blocks.15": { + "rel_l2": 0.011919323625201882, + "teacher_forced": true + }, + "single_blocks.16": { + "rel_l2": 0.011920257399849482, + "teacher_forced": true + }, + "single_blocks.17": { + "rel_l2": 0.01169543570588881, + "teacher_forced": true + }, + "single_blocks.18": { + "rel_l2": 0.010320783830129129, + "teacher_forced": true + }, + "single_blocks.19": { + "rel_l2": 0.00940065987740976, + "teacher_forced": true + }, + "final_layer.adaLN_modulation": { + "rel_l2": 0.0027705871266003857, + "teacher_forced": false + }, + "final_layer": { + "rel_l2": 0.007731422387771568, + "teacher_forced": true + }, + "rule": "tolerance = 2 x the oracle's own bf16 against fp32 relative L2: teacher-forced for each block and the final layer, free running for the time vector, modulations and embeddings and for the velocity", + "exact_free": { + "rel_l2": 5e-05 + }, + "exact_velocity": { + "rel_l2": 5e-05 + } + }, + "notes": [], + "created": "2026-10-16T12:08:23Z", + "npz": "check3_flux2_klein_r1_512.npz", + "tensors": { + "double_blocks.0.img": { + "shape": [ + 2048, + 3072 + ], + "dtype": "float32", + "sha256": "f9bb109b2befcf2f8a4c512782892907c2f7cf8447734d48d6dce2b41192cc68" + }, + "double_blocks.0.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "531933ec7fa4212e599fb789c778c33641a53548f47c0e294e18a875fd6c54e7" + }, + "double_blocks.1.img": { + "shape": [ + 2048, + 3072 + ], + "dtype": "float32", + "sha256": "eec8098cc485e8296cb80266e37c3ab6e2d900a63ea64d46c39dd6937b620f5b" + }, + "double_blocks.1.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "b490e017dc79a94fb80bf0a58f5cd75f008c6afd135610f3a59d616a947d05e2" + }, + "double_blocks.2.img": { + "shape": [ + 2048, + 3072 + ], + "dtype": "float32", + "sha256": "46d340d01fffc680282cd353259cb08bd49df9fd0dd26258de326a33db901338" + }, + "double_blocks.2.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "3e738b0f865e63f098473e5927dc8f2de112275dcf157bce8b28686854c59878" + }, + "double_blocks.3.img": { + "shape": [ + 2048, + 3072 + ], + "dtype": "float32", + "sha256": "5cf870dbaea3e84e1c177fd255a03300463ce1aeef44472391c72bd42ac3589d" + }, + "double_blocks.3.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "43f5806b1faab78b81511b84bbcbefaf3180b28deb193c87cd2a99a127feb03f" + }, + "double_blocks.4.img": { + "shape": [ + 2048, + 3072 + ], + "dtype": "float32", + "sha256": "9155b0c7fdce4ce72bc19af4dc62eb3dd08b46923a07095f73d8b533834d4b49" + }, + "double_blocks.4.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "b4a031a72b003fbc2efb01fba386cd31ed1b05bb33bb287be84ee4af1a3d6738" + }, + "double_stream_modulation_img": { + "shape": [ + 1, + 18432 + ], + "dtype": "float32", + "sha256": "4ee30047b3e6dae420119278ff22bcabbbc4e81caff9cacc931d6772b941c0a3" + }, + "double_stream_modulation_txt": { + "shape": [ + 1, + 18432 + ], + "dtype": "float32", + "sha256": "482250b40d35864c8f72a097dfcd531b74e17bba04f14241142ab357056bd2c9" + }, + "features": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "3482cc3e89168264731155ce529cc5ff9299b09f9e6ade75b1a420d631896802" + }, + "final_layer": { + "shape": [ + 1024, + 128 + ], + "dtype": "float32", + "sha256": "fbc1ad4ea80e683db6bf35a999d161edacc0aebc451d16ba07bbdc0cd3045853" + }, + "final_layer.adaLN_modulation": { + "shape": [ + 1, + 6144 + ], + "dtype": "float32", + "sha256": "0ebb63d3a29bea2dafbbdad9050417c53dcd46ce81c8461ac79056aa81f95cb5" + }, + "ids.image": { + "shape": [ + 2048, + 4 + ], + "dtype": "float32", + "sha256": "1ae78fae8f1e1ee5b47214b5e0de11d0874c7576615c41d9d733793abe84ffdc" + }, + "ids.text": { + "shape": [ + 512, + 4 + ], + "dtype": "float32", + "sha256": "914a4d07f258895514e1b52023c57a677aa4925531d34e54831414224030a0f8" + }, + "img_in": { + "shape": [ + 2048, + 3072 + ], + "dtype": "float32", + "sha256": "b628aeeffa149820e77f19cbab2cb44658eab9749916819cfdaaa9f7220b622c" + }, + "in.final_layer": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "86417309ab11ef0abdae64c47dc32d75685b23b6456e21a311b38d9c18b8aa15" + }, + "in.single_blocks.0": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "806b449fddf3c60647302e36546c34f76021eb317a0213aa36fece09e93cc4de" + }, + "in.time_in": { + "shape": [ + 1, + 256 + ], + "dtype": "float32", + "sha256": "cbacd50d6ddae5179d08ae5986820a7baaecca4b2a9962dd856fc80aa62707e4" + }, + "latents": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "2cb3e62b5bb6a58f5b08f360ba95db386349bd0b4fe4128bd931125c8cceae04" + }, + "refs.0": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "7097102f2f785e6b17e40c748de6f47327eef79637c255a6c7b18a57c0fdf0e6" + }, + "sigma": { + "shape": [], + "dtype": "float32", + "sha256": "e00e5eb9444182f352323374ef4e08ebcb784725fdd4fd612d7730540b3e0c8c" + }, + "single_blocks.0": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "8dd5f9f5e188396c6a533d22e868dae4c06549b41c8658c67bf7ef564a2ec111" + }, + "single_blocks.1": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "359e729f04e7925e113582069fd69e3522151dcb75e7b588f6a776a1ea316cbe" + }, + "single_blocks.10": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "31819ab3d52de3ffa5c78df37bdbe41293843434a3a69b5173ee9d2ebd98ca80" + }, + "single_blocks.11": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "5b397ec6ea76f44f2ef468d0c1726dd483b0d8b75de7a11494822b35bb88024f" + }, + "single_blocks.12": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "0f80362927311c84f66e0db4c91e262ab3d873e0308245297bf89929163027cc" + }, + "single_blocks.13": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "a825870863f640f6be5d056345cca765db6e3cfe47b920611cfd0fbd9aee0392" + }, + "single_blocks.14": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "77f505640ddb0eccee5f3b05b8594afd079dbc03f6f9e46f8ffdffca3d7bd763" + }, + "single_blocks.15": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "f4e5daabfb46d6c487d70ede289aba417b0042c56bfc0db9c0c0b5f238822bfd" + }, + "single_blocks.16": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "8ccd6df5a076fd85164b199b236e2be95a4dc2d227f2f2f332335a78fa4a1e51" + }, + "single_blocks.17": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "b70239b5df30374af3ff65fe0b01d719f00c9ede59f3b015a1291663a5ebf672" + }, + "single_blocks.18": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "b958c292fc1e9f62be9da353b4182e9414eaa5efa61928f497fbaf39432d5cb5" + }, + "single_blocks.19": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "dc5fbf79f90206317d5993c672eb4b02a989b84974f8275f96cd64bcf2554bbc" + }, + "single_blocks.2": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "97a085b72d6cc61e0bddbdaec72e2cabbb115613aed1a92a172470861b095ceb" + }, + "single_blocks.3": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "f6a9d5da36d5b4583edb3296e374ea6552999d50622c49184db8ab1d31f06415" + }, + "single_blocks.4": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "4aa9fca9d872c865087bb81b5c7daa21087d2f08feae7e909b474be15663d4be" + }, + "single_blocks.5": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "aabb28f1fe4afc392b1b14b403cf1ef40d9001f920ed9f37a532d8d5cc4ffa45" + }, + "single_blocks.6": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "eb0d7ea547bcc392b74089f96eb50d76b2bd7f73a8b4d4392bcb7c008ea04f25" + }, + "single_blocks.7": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "7f2bd58ac27d1d50b7b919b4a2add7161ebf393167d47de93f7570fd5d24e077" + }, + "single_blocks.8": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "d43b4b3fc7ba085c3c11ba1eb63bc23954d8b4aa260b115af6a5aed0508b114a" + }, + "single_blocks.9": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "db33bcf54ac31ce5038821e098f81afb82d38629200d06ce6d9d047a75c31f87" + }, + "single_stream_modulation": { + "shape": [ + 1, + 9216 + ], + "dtype": "float32", + "sha256": "120948198c29b521754b6b39454864e82f32161adede73d939cd14cfade6c3d4" + }, + "txt_in": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "3d69d3571d1fe732cd193fe97eae90834a65320a47a3f06c6566031b17fe79ff" + }, + "vec": { + "shape": [ + 1, + 3072 + ], + "dtype": "float32", + "sha256": "1f669d07af0ecb908139d999eb12e9dfffa7216d21ec7ae4cc9fc56d1335f3b2" + }, + "velocity": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "4c35c8cf05619c6046d29b60892884bad23ad4a41a3f651a3a9fc5a73b934925" + }, + "velocity_bf16": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "ef39f7866579aa4319a0580a17b4fc4b9f5437a1754d83dc3010df85856ece10" + } + } +} diff --git a/tests/fixtures/image/oracle/check3_flux2_klein_s1_512.manifest.json b/tests/fixtures/image/oracle/check3_flux2_klein_s1_512.manifest.json new file mode 100644 index 000000000..4012ec1a4 --- /dev/null +++ b/tests/fixtures/image/oracle/check3_flux2_klein_s1_512.manifest.json @@ -0,0 +1,930 @@ +{ + "schema": 1, + "name": "check3_flux2_klein_s1_512", + "check": 3, + "family": "flux2_klein", + "script": "scripts/image_oracle/check3_flux2_klein.py", + "argv": [ + "check3_flux2_klein.py", + "--reference", + "src", + "--reference-commit", + "50fe5162777813d869182b139e83b10743caef15", + "--dit", + "flux-2-klein-4b-Q4_K_M.gguf", + "--sizes", + "512", + "--rows", + "512", + "--step", + "1", + "--name", + "check3_flux2_klein_s1" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": { + "dit": { + "name": "flux-2-klein-4b-Q4_K_M.gguf", + "size": 2604311104, + "sha256": "0b25d143c8469b342bc5af3bce92b783bf6b0636d285f7b2f75e38af63af9a15" + } + }, + "inputs": { + "size": 512, + "sigma": 0.958085298538208, + "step": 1, + "schedule": "get_schedule(4, 1024)", + "seed": 512, + "latents": "seeded normal, rounded to bf16", + "features": "seeded normal, std 4.0, rounded to bf16", + "text_rows": 512, + "refs": 0, + "ref_size": 0, + "dequant": "exact", + "matmul_bf16": "bf16 operands, float32 GEMM, one bf16 rounding", + "timestep": "bf16 as the reference's denoise fills it, in both modes", + "reference_commit": "50fe5162777813d869182b139e83b10743caef15", + "gguf_codecs": { + "F32": 60, + "Q5_K": 30, + "Q4_K": 50, + "BF16": 9 + } + }, + "results": { + "velocity_bf16_vs_fp32": { + "rel_l2": 0.03582015816334706, + "cosine": 0.9993587309947841, + "max_abs": 0.16196325421333313 + }, + "rows_bf16_vs_fp32": { + "vec": { + "rel_l2": 0.0017015087906758694, + "cosine": 0.9999985926782361, + "max_abs": 0.00716400146484375, + "teacher_forced": false + }, + "double_stream_modulation_img": { + "rel_l2": 0.0017240670540702484, + "cosine": 0.9999985810224307, + "max_abs": 0.0388336181640625, + "teacher_forced": false + }, + "double_stream_modulation_txt": { + "rel_l2": 0.0016900468002695548, + "cosine": 0.9999986351046767, + "max_abs": 0.029680252075195312, + "teacher_forced": false + }, + "single_stream_modulation": { + "rel_l2": 0.0016310984007320978, + "cosine": 0.9999986849685991, + "max_abs": 0.12985610961914062, + "teacher_forced": false + }, + "img_in": { + "rel_l2": 0.0016575440299538614, + "cosine": 0.999998626273488, + "max_abs": 0.03107452392578125, + "teacher_forced": false + }, + "txt_in": { + "rel_l2": 0.0016583942242231634, + "cosine": 0.9999986248639099, + "max_abs": 0.06249237060546875, + "teacher_forced": false + }, + "double_blocks.0.img": { + "rel_l2": 0.00884695842909035, + "cosine": 0.9999617482044347, + "max_abs": 1.5395126342773438, + "teacher_forced": true + }, + "double_blocks.0.txt": { + "rel_l2": 0.00473118879620931, + "cosine": 0.9999889434765491, + "max_abs": 12.9473876953125, + "teacher_forced": true + }, + "double_blocks.1.img": { + "rel_l2": 0.004704179556984753, + "cosine": 0.99998894213095, + "max_abs": 0.7206573486328125, + "teacher_forced": true + }, + "double_blocks.1.txt": { + "rel_l2": 0.003846146858483984, + "cosine": 0.9999926664276974, + "max_abs": 9.321533203125, + "teacher_forced": true + }, + "double_blocks.2.img": { + "rel_l2": 0.0061410233343296575, + "cosine": 0.9999811493563855, + "max_abs": 0.6355247497558594, + "teacher_forced": true + }, + "double_blocks.2.txt": { + "rel_l2": 0.004166924356895854, + "cosine": 0.9999913356537753, + "max_abs": 8.5709228515625, + "teacher_forced": true + }, + "double_blocks.3.img": { + "rel_l2": 0.006449662807133783, + "cosine": 0.9999792087000869, + "max_abs": 0.631622314453125, + "teacher_forced": true + }, + "double_blocks.3.txt": { + "rel_l2": 0.004280790813202694, + "cosine": 0.9999908380682181, + "max_abs": 8.1044921875, + "teacher_forced": true + }, + "double_blocks.4.img": { + "rel_l2": 0.0039017181913682864, + "cosine": 0.9999925012564952, + "max_abs": 2.9127197265625, + "teacher_forced": true + }, + "double_blocks.4.txt": { + "rel_l2": 0.004568112056662135, + "cosine": 0.9999897113186829, + "max_abs": 9.862060546875, + "teacher_forced": true + }, + "single_blocks.0": { + "rel_l2": 0.0035848190143650885, + "cosine": 0.9999935790604975, + "max_abs": 8.574951171875, + "teacher_forced": true + }, + "single_blocks.1": { + "rel_l2": 0.004912167672533925, + "cosine": 0.9999883512239798, + "max_abs": 6.60546875, + "teacher_forced": true + }, + "single_blocks.2": { + "rel_l2": 0.006137203782687792, + "cosine": 0.9999818656457102, + "max_abs": 9.722900390625, + "teacher_forced": true + }, + "single_blocks.3": { + "rel_l2": 0.00665396118745378, + "cosine": 0.9999784281418658, + "max_abs": 6.15106201171875, + "teacher_forced": true + }, + "single_blocks.4": { + "rel_l2": 0.005958561134927088, + "cosine": 0.9999829047341969, + "max_abs": 6.73553466796875, + "teacher_forced": true + }, + "single_blocks.5": { + "rel_l2": 0.004238770309707378, + "cosine": 0.999991645768671, + "max_abs": 7.359375, + "teacher_forced": true + }, + "single_blocks.6": { + "rel_l2": 0.004484129112560967, + "cosine": 0.9999899575155141, + "max_abs": 4.8819580078125, + "teacher_forced": true + }, + "single_blocks.7": { + "rel_l2": 0.004644205438591708, + "cosine": 0.9999892177698532, + "max_abs": 4.9346923828125, + "teacher_forced": true + }, + "single_blocks.8": { + "rel_l2": 0.004737433094825856, + "cosine": 0.9999887799570136, + "max_abs": 4.68682861328125, + "teacher_forced": true + }, + "single_blocks.9": { + "rel_l2": 0.005127519108207715, + "cosine": 0.999986982580412, + "max_abs": 5.43927001953125, + "teacher_forced": true + }, + "single_blocks.10": { + "rel_l2": 0.005753379207014835, + "cosine": 0.9999837886417015, + "max_abs": 5.726226806640625, + "teacher_forced": true + }, + "single_blocks.11": { + "rel_l2": 0.006293320287375982, + "cosine": 0.9999806684682885, + "max_abs": 5.23492431640625, + "teacher_forced": true + }, + "single_blocks.12": { + "rel_l2": 0.006058916920463859, + "cosine": 0.9999816461431512, + "max_abs": 3.597900390625, + "teacher_forced": true + }, + "single_blocks.13": { + "rel_l2": 0.006261280551392385, + "cosine": 0.9999804099981573, + "max_abs": 3.807861328125, + "teacher_forced": true + }, + "single_blocks.14": { + "rel_l2": 0.0066488332510855, + "cosine": 0.9999779039875525, + "max_abs": 4.14483642578125, + "teacher_forced": true + }, + "single_blocks.15": { + "rel_l2": 0.006509000611243411, + "cosine": 0.9999789880620366, + "max_abs": 4.27484130859375, + "teacher_forced": true + }, + "single_blocks.16": { + "rel_l2": 0.006144058382617268, + "cosine": 0.9999811260525814, + "max_abs": 6.4180908203125, + "teacher_forced": true + }, + "single_blocks.17": { + "rel_l2": 0.005878316205552456, + "cosine": 0.9999828524140693, + "max_abs": 7.2587890625, + "teacher_forced": true + }, + "single_blocks.18": { + "rel_l2": 0.004215410426520738, + "cosine": 0.9999912652805506, + "max_abs": 23.218505859375, + "teacher_forced": true + }, + "single_blocks.19": { + "rel_l2": 0.003946053931380145, + "cosine": 0.9999922557181341, + "max_abs": 23.257568359375, + "teacher_forced": true + }, + "final_layer.adaLN_modulation": { + "rel_l2": 0.0014242386711217307, + "cosine": 0.9999990343058969, + "max_abs": 0.09222793579101562, + "teacher_forced": false + }, + "final_layer": { + "rel_l2": 0.005556075495547004, + "cosine": 0.9999845915887525, + "max_abs": 0.012211143970489502, + "teacher_forced": true + } + }, + "free_bf16_vs_fp32": { + "double_blocks.0.img": 0.009298752904123247, + "double_blocks.0.txt": 0.0046775528662360965, + "double_blocks.1.img": 0.01088090917476125, + "double_blocks.1.txt": 0.006697951919572823, + "double_blocks.2.img": 0.013389885735736887, + "double_blocks.2.txt": 0.009230024568729737, + "double_blocks.3.img": 0.014461488838167976, + "double_blocks.3.txt": 0.011120123733569546, + "double_blocks.4.img": 0.007354101312387466, + "double_blocks.4.txt": 0.01084407234215341, + "single_blocks.0": 0.010627891887115545, + "single_blocks.1": 0.012357643130823093, + "single_blocks.2": 0.014745876760359797, + "single_blocks.3": 0.01629443745629569, + "single_blocks.4": 0.015468264514669953, + "single_blocks.5": 0.014538301409737947, + "single_blocks.6": 0.015677791042341804, + "single_blocks.7": 0.01722838802395885, + "single_blocks.8": 0.01947355757918194, + "single_blocks.9": 0.021655819526668854, + "single_blocks.10": 0.02596909145026221, + "single_blocks.11": 0.02975910565760892, + "single_blocks.12": 0.032963613422007605, + "single_blocks.13": 0.03718756746486771, + "single_blocks.14": 0.04120145007136669, + "single_blocks.15": 0.041324905356640455, + "single_blocks.16": 0.042638186085852875, + "single_blocks.17": 0.040680462451668266, + "single_blocks.18": 0.02499145036590956, + "single_blocks.19": 0.024838433690565733, + "final_layer": 0.03582015816334706 + }, + "times": { + "fp32_s": 6.6, + "bf16_s": 14.9, + "bf16_teacher_forced_s": 15.1 + }, + "exact_free_floor": { + "rel_l2": 1.0796157676308624e-05, + "row": "free single_blocks.16", + "measured": "gmlx's exact step on the GPU against the same step on the CPU stream, worst free row; tests/image/flux2_gates.py exact_free_floor on flux2-klein, Apple M5 Max" + }, + "exact_velocity_floor": { + "rel_l2": 1.0432772371519421e-05, + "measured": "gmlx's exact step on the GPU against the same step on the CPU stream, velocity; tests/image/flux2_gates.py exact_free_floor on flux2-klein, Apple M5 Max" + } + }, + "tolerances": { + "velocity": { + "rel_l2": 0.07164031632669413, + "cosine_min": 0.9974349239791365 + }, + "vec": { + "rel_l2": 0.003403017581351739, + "teacher_forced": false + }, + "double_stream_modulation_img": { + "rel_l2": 0.003448134108140497, + "teacher_forced": false + }, + "double_stream_modulation_txt": { + "rel_l2": 0.0033800936005391096, + "teacher_forced": false + }, + "single_stream_modulation": { + "rel_l2": 0.0032621968014641956, + "teacher_forced": false + }, + "img_in": { + "rel_l2": 0.0033150880599077228, + "teacher_forced": false + }, + "txt_in": { + "rel_l2": 0.0033167884484463267, + "teacher_forced": false + }, + "double_blocks.0.img": { + "rel_l2": 0.0176939168581807, + "teacher_forced": true + }, + "double_blocks.0.txt": { + "rel_l2": 0.00946237759241862, + "teacher_forced": true + }, + "double_blocks.1.img": { + "rel_l2": 0.009408359113969506, + "teacher_forced": true + }, + "double_blocks.1.txt": { + "rel_l2": 0.007692293716967968, + "teacher_forced": true + }, + "double_blocks.2.img": { + "rel_l2": 0.012282046668659315, + "teacher_forced": true + }, + "double_blocks.2.txt": { + "rel_l2": 0.008333848713791708, + "teacher_forced": true + }, + "double_blocks.3.img": { + "rel_l2": 0.012899325614267565, + "teacher_forced": true + }, + "double_blocks.3.txt": { + "rel_l2": 0.008561581626405388, + "teacher_forced": true + }, + "double_blocks.4.img": { + "rel_l2": 0.007803436382736573, + "teacher_forced": true + }, + "double_blocks.4.txt": { + "rel_l2": 0.00913622411332427, + "teacher_forced": true + }, + "single_blocks.0": { + "rel_l2": 0.007169638028730177, + "teacher_forced": true + }, + "single_blocks.1": { + "rel_l2": 0.00982433534506785, + "teacher_forced": true + }, + "single_blocks.2": { + "rel_l2": 0.012274407565375584, + "teacher_forced": true + }, + "single_blocks.3": { + "rel_l2": 0.01330792237490756, + "teacher_forced": true + }, + "single_blocks.4": { + "rel_l2": 0.011917122269854176, + "teacher_forced": true + }, + "single_blocks.5": { + "rel_l2": 0.008477540619414756, + "teacher_forced": true + }, + "single_blocks.6": { + "rel_l2": 0.008968258225121935, + "teacher_forced": true + }, + "single_blocks.7": { + "rel_l2": 0.009288410877183417, + "teacher_forced": true + }, + "single_blocks.8": { + "rel_l2": 0.009474866189651711, + "teacher_forced": true + }, + "single_blocks.9": { + "rel_l2": 0.01025503821641543, + "teacher_forced": true + }, + "single_blocks.10": { + "rel_l2": 0.01150675841402967, + "teacher_forced": true + }, + "single_blocks.11": { + "rel_l2": 0.012586640574751964, + "teacher_forced": true + }, + "single_blocks.12": { + "rel_l2": 0.012117833840927718, + "teacher_forced": true + }, + "single_blocks.13": { + "rel_l2": 0.01252256110278477, + "teacher_forced": true + }, + "single_blocks.14": { + "rel_l2": 0.013297666502171, + "teacher_forced": true + }, + "single_blocks.15": { + "rel_l2": 0.013018001222486822, + "teacher_forced": true + }, + "single_blocks.16": { + "rel_l2": 0.012288116765234535, + "teacher_forced": true + }, + "single_blocks.17": { + "rel_l2": 0.011756632411104912, + "teacher_forced": true + }, + "single_blocks.18": { + "rel_l2": 0.008430820853041476, + "teacher_forced": true + }, + "single_blocks.19": { + "rel_l2": 0.00789210786276029, + "teacher_forced": true + }, + "final_layer.adaLN_modulation": { + "rel_l2": 0.0028484773422434613, + "teacher_forced": false + }, + "final_layer": { + "rel_l2": 0.011112150991094008, + "teacher_forced": true + }, + "rule": "tolerance = 2 x the oracle's own bf16 against fp32 relative L2: teacher-forced for each block and the final layer, free running for the time vector, modulations and embeddings and for the velocity", + "exact_free": { + "rel_l2": 5e-05 + }, + "exact_velocity": { + "rel_l2": 5e-05 + } + }, + "notes": [], + "created": "2026-10-16T12:02:59Z", + "npz": "check3_flux2_klein_s1_512.npz", + "tensors": { + "double_blocks.0.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "9f639ec0746cad2e311fd3c9eb7815012fbefdc3697f90be1f0d780109b4bc16" + }, + "double_blocks.0.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "d89fd736d85180f971efb74d52534f71b7a2ddaf7d9436fa506ee7746e9a001a" + }, + "double_blocks.1.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "c56951b0564774a80fbffe59d801237fc4d0c540e9fe2fd5d4e3f4ce3ed0984f" + }, + "double_blocks.1.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "0aa611d26c3a19eeb260b5f1aef4faee257ce1f986598d4c07311f48e22ff66b" + }, + "double_blocks.2.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "237737e219f7c60afab6f552cafa87249dbed8f5f54b19b5ce13a7a300aa3a4d" + }, + "double_blocks.2.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "cf6f5c600d93e4d7c6a770dd5fda610732bacf455c70d0f53eaece1aea0c009d" + }, + "double_blocks.3.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "a589ad643d04fc723d9583b9bdd351e3affdb1afca5d7f51cb81fe7c7c8f1aec" + }, + "double_blocks.3.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "420e3d75c568ec1018f08b8a3dae4195e49b38ed20f95d1ac2e7682dd3dc7dce" + }, + "double_blocks.4.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "f9d6a3dd4a412b810be5cea0c994fc0023a768695cba088cb920e071eb3f5d8d" + }, + "double_blocks.4.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "f8a5366ef0e04039c971a8b867c1b7a370af6984c7751b077d0f48a2ecc1dd10" + }, + "double_stream_modulation_img": { + "shape": [ + 1, + 18432 + ], + "dtype": "float32", + "sha256": "6a47f948a3ac0c12eea5a4268d56c5dedf77b6a0bbcb7751e3d8cc90e15aae60" + }, + "double_stream_modulation_txt": { + "shape": [ + 1, + 18432 + ], + "dtype": "float32", + "sha256": "483b0a07d4810147f60662af1199d0b963bedcb96c476905963e4d35cf26bf7b" + }, + "features": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "3482cc3e89168264731155ce529cc5ff9299b09f9e6ade75b1a420d631896802" + }, + "final_layer": { + "shape": [ + 1024, + 128 + ], + "dtype": "float32", + "sha256": "ad74ace1302318cbf5a41a28b024f98f9c7b6e5ea252e3b2feb9e9f0eb670307" + }, + "final_layer.adaLN_modulation": { + "shape": [ + 1, + 6144 + ], + "dtype": "float32", + "sha256": "3df76e3c6355868b7e72acaf157ef6f4f5085112940292722dd0d57d65dca50f" + }, + "ids.image": { + "shape": [ + 1024, + 4 + ], + "dtype": "float32", + "sha256": "8e6ca6477f8b787a44f1d3a6c05641319299ae79d0c43802e3396b7e9558fe8d" + }, + "ids.text": { + "shape": [ + 512, + 4 + ], + "dtype": "float32", + "sha256": "914a4d07f258895514e1b52023c57a677aa4925531d34e54831414224030a0f8" + }, + "img_in": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "153bc3dbdbb4160fc7d556e7684ca601f9337aa6c6a02121f481623438140035" + }, + "in.final_layer": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "6761fb458d4978cf1978ecc3ab83aa1c186fec6752f8d654e01cacfaf6aa54f5" + }, + "in.single_blocks.0": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "fc8e8a208c5d506ac03f7ad3d68678214aa986f30e2344635622a7a5ac2d7a1a" + }, + "in.time_in": { + "shape": [ + 1, + 256 + ], + "dtype": "float32", + "sha256": "919faf1a2d75ebe94d1406f30b2164241ff1f51756ae89a5bea168ae8bd2469f" + }, + "latents": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "2cb3e62b5bb6a58f5b08f360ba95db386349bd0b4fe4128bd931125c8cceae04" + }, + "sigma": { + "shape": [], + "dtype": "float32", + "sha256": "a4f97ae73ebb6b17294a19b9df4647cd141bd03e2b9381add065e8a34b6d5b89" + }, + "single_blocks.0": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "8b9e5baf657704c14a2a97b9981d46a8057d8c0e7452a7db34b97a3a59d8b260" + }, + "single_blocks.1": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "bb79c98fb5d8d3f37bcbf3761e6233a7694808a618f4d728aa987f2b6d2d761f" + }, + "single_blocks.10": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "5e9487d7fed0836e6617a7dfb13a01ae62d46047cf0855ebfc34a0a5017c0578" + }, + "single_blocks.11": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "8d1c8812f7fcfa8cfcd6d6b541a04735ec89996659262a504f38b07481a60837" + }, + "single_blocks.12": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "1622784d06956ff1fab51f2e187fcd971e6d0e73bc882a11c42d085fe3692c8e" + }, + "single_blocks.13": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "1bb4e0b7fee803a972152040ae8ff1e5c343b3de990343ce316b74807dfb0ae4" + }, + "single_blocks.14": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "7ccc9d03ee68707f0c4869b055f82cd4d80bb227d64362a9ab9470b754f38d7e" + }, + "single_blocks.15": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "4ae2daa6ce5df06aee5ac1031fd1f3fd7ec7e438c5bd5ddf69bda00df57e076f" + }, + "single_blocks.16": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "34b60812d46b3d9f06ff9b093e4d145816e2a345b872a867036375c447c36838" + }, + "single_blocks.17": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "9af0053cb3e766b008643fb8155e569df934218283a7758ac23f7c927e91b62e" + }, + "single_blocks.18": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "fd0686c8b8c9e93cd876ceddbea91a2f8541b29107f8a7791958c255b73a3661" + }, + "single_blocks.19": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "215d03fb388c73fcb86a7e59e3c47451bf58d3845dfba9092432dab7fc631e37" + }, + "single_blocks.2": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "f5ab2a2a71083d7c7f8f08113b1bc0fb2e71204d816d4fc9e7b794314758ebc1" + }, + "single_blocks.3": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "483080dba5584f6e2706c521cc5059987ddfde1bf222e118d2dda22e2d80ee47" + }, + "single_blocks.4": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "6f42a9982a83fec776a4adad9fe2a6b00ba933b16f4e6b8c1baa51fa1189caa7" + }, + "single_blocks.5": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "350fafb306b3202776e12099cacd6c4a91ba933c0f30ed3fb2e7b0878b6cc00f" + }, + "single_blocks.6": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "99b244f6ff2433974a5cf1dce88797f2d371cbbf4aa80bf9be6a212f62a0f736" + }, + "single_blocks.7": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "107971b429b3c0864460ff36fdb408e8faa9b3f36ccaa267151dc6a75667aff3" + }, + "single_blocks.8": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "1856a358cd6690badeae8b1cb4d9c1968dde34f682e97def008588c277835535" + }, + "single_blocks.9": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "5baaf799db71b91367ae18112f65b43c7eafc3935f850025a31709852eab3c5a" + }, + "single_stream_modulation": { + "shape": [ + 1, + 9216 + ], + "dtype": "float32", + "sha256": "9c826c88989e1fceafbf4c3bd5a71aa9e97f1a15b41ec737cdd4888f69abe00d" + }, + "txt_in": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "3d69d3571d1fe732cd193fe97eae90834a65320a47a3f06c6566031b17fe79ff" + }, + "vec": { + "shape": [ + 1, + 3072 + ], + "dtype": "float32", + "sha256": "88cb12026a990d38815e86e1085182044ff51010a34877bd32ff9cdb20adaf2d" + }, + "velocity": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "8552ea2af171b9ddb7a75f63ab6a2130c5b1af0a9dd3e8555a8e58acde3b02e9" + }, + "velocity_bf16": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "de2b7c8296f830320ee4c1ea62a577efba0a60cd0a5c6a1b6b7223d50a74d700" + } + } +} diff --git a/tests/image/test_image_check3_flux2_klein.py b/tests/image/test_image_check3_flux2_klein.py new file mode 100644 index 000000000..429a4970b --- /dev/null +++ b/tests/image/test_image_check3_flux2_klein.py @@ -0,0 +1,422 @@ +"""Check 3 of the image acceptance gate for FLUX.2 klein: one denoise step +of the gmlx DiT, row by row, against BFL's reference DiT on the same GGUF, +under three gates, for the distilled and the Base 4B checkpoints. + +scripts/image_oracle/check3_flux2_klein.py writes the fixtures. Each step +is the first of the sampler, at time 1, where seeded normal latents are on +every trajectory, with 512 rows of seeded normal text features and, in the +r1 fixtures, one reference image at the output size. One more distilled +step is the second of the 4-step schedule at 512 pixels, time 0.958 on +seeded normal latents, where 1000 times the time rounded to bf16 differs +from 1000 times the time itself, in bf16, so the step holds the rounding +the reference makes first. Every row of the step at 512 and the velocity +at 1024 are in fp32, with the oracle's own bf16 against fp32 gap of each. + +The product gate runs the model as it ships, in bf16 with the kernel +routes at their default and its own time embedding, and holds each row to +twice the oracle's gap: teacher-forced for each block and the final layer, +free running for the rest. The exact gate runs the model in the oracle's +fp32 arithmetic on the reference's time embedding, every K-quant product +dense on its dequantized weight and every float tensor of the file in +float32. It holds the teacher-forced rows to EXACT_TOL, and the free rows +and the velocity each to the larger of EXACT_TOL and twice gmlx's own fp32 +floor that the manifest records. The site gate holds each op of every +block and each linear leaf on the path a request takes to the stock op in +float32 on the same input, within 2 n u (flux2_gates.py). + +The rows need the FLUX.2 klein 4B GGUFs under KQUANT_TEST_GGUF_DIR and the +fixtures under GMLX_IMAGE_FIXTURES. They skip until both are there. +""" +from __future__ import annotations + +import math +import os +from pathlib import Path + +import mlx.core as mx +import numpy as np +import pytest + +import flux2_gates as fg +import qwen_gates as qg +from block_gates import exact_process, rerun_exact +from image_fixtures import image_dits +from oracle_fixture import ORACLE, committed, fixture, fx + +from gmlx.image import loader as image_loader +from gmlx.image import ops +from gmlx.image.families.flux2_klein import model as fm +from gmlx.image.ops import kq_routes + +# A Mac of 16 GB, as most users run (tests/host_box.py). +pytestmark = pytest.mark.host_gb(16) + +ROWS = {"distilled": "check3_flux2_klein_512", + "distilled r1": "check3_flux2_klein_r1_512", + "base": "check3_flux2_klein_base_512", + "base r1": "check3_flux2_klein_base_r1_512", + "distilled step 1": "check3_flux2_klein_s1_512"} +VELOCITY = {"distilled": "check3_flux2_klein_1024", + "distilled r1": "check3_flux2_klein_r1_1024", + "base": "check3_flux2_klein_base_1024"} +DITS = {"distilled": "flux-2-klein-4b-Q4_K_M.gguf", + "base": "flux-2-klein-base-4b-Q4_K_M.gguf"} +STEPS = {"distilled": 4, "base": 50} +REFERENCE_COMMIT = "50fe5162777813d869182b139e83b10743caef15" +# The case that runs every stream. +FULL = "distilled r1" + + +def schedule(steps: int, tokens: int) -> list[float]: + """get_schedule of BFL's flux2 sampling.py at REFERENCE_COMMIT.""" + a1, b1, a2, b2 = 8.73809524e-05, 1.89833333, 0.00016927, 0.45666666 + if tokens > 4300: + mu = a2 * tokens + b2 + else: + m200, m10 = a2 * tokens + b2, a1 * tokens + b1 + a = (m200 - m10) / 190.0 + mu = a * steps + m200 - 200.0 * a + out = [] + for i in range(steps + 1): + t = 1 - i / steps + out.append(1.0 if t == 1 else 0.0 if t == 0 else + math.exp(mu) / (math.exp(mu) + (1 / t - 1))) + return out + + +def _manifest(name: str) -> dict: + if not (ORACLE / f"{name}.manifest.json").is_file(): + pytest.skip(f"{name}.manifest.json is not committed: run " + "scripts/image_oracle/check3_flux2_klein.py on the " + "FLUX.2 klein GGUF and commit the manifest it writes") + return committed(name) + + +class _Dits: + """The DiT of a fixture's file, one loaded at a time.""" + + def __init__(self, root): + self.root, self.path, self.model = root, None, None + + def __call__(self, m: dict): + want = m["files"]["dit"] + if self.path is not None and Path(self.path).name == want["name"]: + return self.model, self.path + self.model = self.path = None + mx.clear_cache() + for p in image_dits(self.root, "flux2_klein"): + if Path(p).name == want["name"] and \ + os.path.getsize(p) == want["size"]: + break + else: + pytest.skip(f"{want['name']} is not under KQUANT_TEST_GGUF_DIR") + if fx.file_identity(p)["sha256"] != want["sha256"]: + pytest.fail(f"{p} is not the file the oracle read") + self.model, _ = image_loader.load_dit(p, log=lambda *_: None) + self.path = p + return self.model, p + + +@pytest.fixture(scope="module") +def dits(gguf_dir): + return _Dits(gguf_dir) + + +def _rows(case: str) -> tuple[dict, dict]: + return fixture(_manifest(ROWS[case])["name"]) + + +def test_the_manifests_follow_the_rule(): + """The committed manifests alone: each step is the first of the + sampler on the reference's commit, or the second of the 4-step + schedule for the step 1 case, every row tolerance is twice the gap + beside it, and the exact gate's free-row and velocity tolerances + follow their floors.""" + for case, name in [*ROWS.items(), *VELOCITY.items()]: + m = _manifest(name) + ins = m["inputs"] + variant = case.split()[0] + assert m["files"]["dit"]["name"] == DITS[variant], name + assert ins["reference_commit"] == REFERENCE_COMMIT, name + step = 1 if case.endswith("step 1") else 0 + n = (ins["size"] // 16) ** 2 + assert ins["step"] == step, name + assert ins["schedule"] == f"get_schedule({STEPS[variant]}, {n})" + assert ins["sigma"] == pytest.approx( + schedule(STEPS[variant], n)[step], abs=1e-6) + assert ins["text_rows"] == 512, name + assert ins["refs"] == (1 if case.endswith("r1") else 0), name + assert ins["refs"] == 0 or ins["ref_size"] == ins["size"], name + gap = m["results"]["velocity_bf16_vs_fp32"] + tol = m["tolerances"]["velocity"] + assert tol["rel_l2"] == 2 * gap["rel_l2"] + assert tol["cosine_min"] == pytest.approx( + 1 - 4 * (1 - gap["cosine"]), abs=1e-12) + # The oracle's own gap is the size of one step's rounding. + assert gap["rel_l2"] < 0.06, (name, gap) + for name in ROWS.values(): + rows = _manifest(name) + for k, g in rows["results"]["rows_bf16_vs_fp32"].items(): + assert rows["tolerances"][k]["rel_l2"] == 2 * g["rel_l2"], k + assert g["teacher_forced"] == fg.forced_row(k), k + fg.exact_tols(rows) + + +@pytest.mark.integration +@pytest.mark.parametrize("case", list(ROWS)) +def test_check3_rows_at_512(dits, case): + arrays, m = _rows(case) + model, _ = dits(m) + got = fg.measures(model, arrays, own_time=True) + out = fg.missed(got, m) + ratio = {k: v / fg.gate(k, m) for k, v in got.items()} + top = max(ratio, key=ratio.get) + free = {k: r for k, r in ratio.items() if k.startswith("free ")} + ftop = max(free, key=free.get) + print(f"flux2 check3 512 {case}: {len(ratio)} measures, worst " + f"{got[top]:.2e} at {top}, {ratio[top]:.2f} of its gate; of the " + f"{len(free)} blocks run free, {free[ftop]:.2f} of its gate at " + f"{ftop[len('free '):]}; velocity {got['velocity']:.2e} of gate " + f"{m['tolerances']['velocity']['rel_l2']:.2e}") + assert not out, out + + +@pytest.mark.integration +@pytest.mark.parametrize("case", list(VELOCITY)) +def test_check3_velocity_at_1024(dits, case): + arrays, m = fixture(_manifest(VELOCITY[case])["name"]) + model, _ = dits(m) + got = fg.free_rows(model, arrays)["velocity"] + rel = fg.rel(got, arrays["velocity"]) + cos = fx.cosine(got, arrays["velocity"]) + tol = m["tolerances"]["velocity"] + print(f"flux2 check3 1024 {case}: velocity {rel:.2e} of gate " + f"{tol['rel_l2']:.2e}, cosine {cos:.6f} floor " + f"{tol['cosine_min']:.6f}") + assert rel <= tol["rel_l2"] and cos >= tol["cosine_min"] + + +@pytest.mark.integration +@pytest.mark.parametrize("case", list(ROWS)) +def test_check3_own_time_embedding(case): + """gmlx's own time embedding against the reference's: equal, or one + entry one bf16 ulp off where the reference's fp32 exp is an ulp off + the correctly rounded one.""" + arrays, _ = _rows(case) + n, ulps = fg.own_time_gap(arrays) + print(f"flux2 check3 {case}: own time embedding {n} entries off, up " + f"to {ulps:.0f} bf16 ulp") + assert n <= 2 and ulps <= 1.0, (n, ulps) + + +# The exact gate. + +def _shift_scale_swapped(mp, model): + real = fm.DoubleBlock.__call__ + mp.setattr(fm.DoubleBlock, "__call__", + lambda self, img, txt, mi, mt, ri, rt: real( + self, img, txt, ((mi[0][1], mi[0][0], mi[0][2]), mi[1]), + mt, ri, rt)) + + +def _glu_halves_swapped(mp, model): + def hidden(self, mlp, h): + a, b = mx.split(mlp[0](h), 2, axis=-1) + return ops.swiglu(b, a) + mp.setattr(fm.DoubleBlock, "hidden", hidden) + + +def _reference_at_the_image(mp, model): + """The reference image's tokens at the image's own positions, where + the reference puts them at 10 on the first axis.""" + real = fm.image_ids + mp.setattr(fm, "image_ids", lambda h, w, index=None: real(h, w)) + + +def _text_on_the_first_axis(mp, model): + """The text tokens' positions on the first axis, where the reference + puts them on the last.""" + def ids(n): + out = np.zeros((n, 4), np.float32) + out[:, 0] = np.arange(n) + return out + mp.setattr(fm, "text_ids", ids) + + +# Wrong models the exact gate must fail. RoPE angles formed in float64, +# as ops.rope_tables forms them, are not one: at the positions of these +# steps, at most 511, they move the rows by less than the gate, and +# test_image_flux2_model.py holds the tables to the reference's at +# positions up to 4095. +EXACT_FAULTS = {"shift and scale swapped": _shift_scale_swapped, + "glu halves swapped": _glu_halves_swapped, + "reference at the image's positions": _reference_at_the_image, + "text on the first axis": _text_on_the_first_axis} + + +@pytest.mark.integration +@pytest.mark.parametrize("case", list(ROWS)) +def test_check3_exact_gate_at_512(dits, request, monkeypatch, case): + """Every teacher-forced row within EXACT_TOL of the oracle in its + arithmetic, the free rows and the velocity within the fixture's gates + from the floors measured now, and each wrong model of EXACT_FAULTS + over the gate.""" + arrays, m = _rows(case) + if not exact_process(): + return rerun_exact(request, "flux2 check3 exact") + model, path = dits(m) + n = fg.exact_floats(model, path) + label = f"flux2 check3 exact 512 {case}" + tol = fg.check_floor(m, fg.exact_free_floor(model, arrays), label) + got = fg.exact_measures(model, arrays) + print(fg.exact_line(f"{label}, {n} float tensors in fp32", got, tol)) + over = fg.exact_over(got, tol) + for name, apply in EXACT_FAULTS.items() if case == FULL else (): + with monkeypatch.context() as mp: + apply(mp, model) + bad = fg.exact_measures(model, arrays) + line, top = fg.fault_line(f"flux2 check3 exact 512, {name}", bad, + tol) + print(line) + assert top > 10, (name, top) + assert not over, over + + +# The site gate. + +def _sites(model, arrays: dict) -> tuple: + """The sites of one free-running production step on the fixture's + inputs, the kernel sites, the head rows, the leaves called on a + float32 input and the velocity.""" + sites, routed, heads, skipped = {}, {}, {}, set() + with fg.step_sites(model, sites, routed=routed, heads=heads, + skipped=skipped): + vel = fg.free_rows(model, arrays)["velocity"] + return sites, routed, heads, skipped, vel + + +def site_line(label: str, sites: dict, routed: dict) -> str: + worst = qg.worst_by_op(sites) + kinds: dict = {} + for op in routed.values(): + kinds[op] = kinds.get(op, 0) + 1 + return (f"{label}: {len(sites)} readings, the largest over its gate " + "by op: " + + ", ".join(f"{k} {v:.2f}" for k, v in sorted(worst.items())) + + "; sites on mlx-kquant: " + + (", ".join(f"{k} {v}" for k, v in sorted(kinds.items())) + or "none")) + + +@pytest.mark.integration +def test_check3_site_gate_at_512(dits): + """Every op of every block and every linear leaf a step calls on the + path a request takes is within its site gate of the stock op in + float32 on the same input, and that run's velocity passes the + product gate.""" + arrays, m = _rows(FULL) + model, _ = dits(m) + sites, routed, heads, skipped, vel = _sites(model, arrays) + missing = fg.missing_ops(model, sites, routed, skipped=skipped) + assert not missing, missing + # With the qk route in force every q and k site ran on the kernel and + # is held to its count, and with the routes off none did. + qk = {k for k in qg.op_sites(sites) if k[2] == "qk"} + on = "qk" in kq_routes.active() + assert {k for k, v in routed.items() if v == "qk_norm_rope"} == ( + qk if on else set()) + assert set(qg.head_sites(sites)) == qk + print(site_line("flux2 check3 sites 512", sites, routed)) + print("flux2 check3 sites 512, q and k: " + + qg.qk_reading(sites, routed, heads)) + over = qg.over_gate(sites) + assert not over, over + rel = fg.rel(vel, arrays["velocity"]) + assert rel <= m["tolerances"]["velocity"]["rel_l2"], rel + + +def _adaln_high(mp, model): + for cls in (fm.DoubleBlock, fm.SingleBlock): + real = cls.adaln + mp.setattr(cls, "adaln", + lambda self, x, shift, scale, real=real: + real(self, x, shift, scale) * 1.05) + + +def _a_head_off(mp, model): + """Head 1 of the seam's output a twentieth off, on the kernel when the + qk route is in force.""" + real_qk = ops.qk_norm_rope + + def off(q, k, qw, kw, cos, sin, eps): + q2, k2 = real_qk(q, k, qw, kw, cos, sin, eps) + scale = mx.array([1.05 if h == 1 else 1.0 + for h in range(q2.shape[1])]).astype(q2.dtype) + return q2 * scale[:, None, None], k2 + mp.setattr(ops, "qk_norm_rope", off) + + +def _attention_high(mp, model): + real = ops.sdpa + mp.setattr(ops, "sdpa", lambda q, k, v, mask=None: real(q, k, v, mask) + * 1.05) + + +def _hidden_high(mp, model): + real = fm.DoubleBlock.hidden + mp.setattr(fm.DoubleBlock, "hidden", + lambda self, mlp, h: real(self, mlp, h) * 1.05) + + +def _swiglu_high(mp, model): + real = ops.swiglu + mp.setattr(ops, "swiglu", lambda a, b: real(a, b) * 1.05) + + +def _gated_residual_high(mp, model): + real_resid, real_res = ops.resid_fused, ops.gated_residual + mp.setattr(ops, "resid_fused", lambda x, leaf, r, g: + real_resid(x, leaf, r, g * 1.05)) + mp.setattr(ops, "gated_residual", + lambda x, g, y: real_res(x, g * 1.05, y)) + + +# name: (the wrong production op, the ops whose sites must miss) +SITE_FAULTS = {"modulated norm a twentieth high": (_adaln_high, {"adaln"}), + "one head of q a twentieth off": (_a_head_off, {"qk"}), + "attention a twentieth high": (_attention_high, {"sdpa"}), + "feed-forward hidden a twentieth high": (_hidden_high, + {"glu"}), + "single block activation a twentieth high": (_swiglu_high, + {"swiglu"}), + "gated residual a twentieth high": (_gated_residual_high, + {"out"})} + + +@pytest.mark.integration +@pytest.mark.parametrize("name", list(SITE_FAULTS)) +def test_check3_each_wrong_op_fails_the_site_gate(dits, monkeypatch, name): + """A site reads an op on the op's own input, so a wrong op is over the + gate at its own sites. Each block reads its own sites, so the first + double block and two single blocks are enough.""" + arrays, m = _rows(FULL) + model, _ = dits(m) + keep_double, keep_single = list(model.double_blocks), \ + list(model.single_blocks) + apply, hit = SITE_FAULTS[name] + try: + model.double_blocks = keep_double[:1] + model.single_blocks = keep_single[:2] + with monkeypatch.context() as mp: + apply(mp, model) + sites, _, _, _, _ = _sites(model, arrays) + finally: + model.double_blocks = keep_double + model.single_blocks = keep_single + over = qg.over_gate(sites) + worst = qg.worst_by_op(sites) + print(f"flux2 check3 sites, {name}: {len(over)} readings over the " + "gate; the largest by op " + + ", ".join(f"{k} {v:.2f}" for k, v in sorted(worst.items()))) + missed = {qg.site_op(k) for k in over if len(k) != 2} + assert hit <= missed, (name, sorted(missed)) From 53c7e6e0669e83b54e393b379cfeed9e6ded09e3 Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 05:26:07 -0700 Subject: [PATCH 004/101] feat(image): flux2 klein text encoder spec, pad rows at their own positions --- gmlx/image/families/flux2_klein/family.py | 65 +++++++++- gmlx/image/text_encoder.py | 44 ++++--- licenses/flux2-LICENSE | 5 +- .../image/flux2_klein_chat_template.jinja | 89 ++++++++++++++ tests/fixtures/image/manifest.json | 7 ++ tests/image/test_image_text_encoder.py | 115 +++++++++++++++++- 6 files changed, 301 insertions(+), 24 deletions(-) create mode 100644 tests/fixtures/image/flux2_klein_chat_template.jinja diff --git a/gmlx/image/families/flux2_klein/family.py b/gmlx/image/families/flux2_klein/family.py index 6153cdc42..628905373 100644 --- a/gmlx/image/families/flux2_klein/family.py +++ b/gmlx/image/families/flux2_klein/family.py @@ -2,8 +2,9 @@ # SPDX-FileCopyrightText: Copyright 2025 Black Forest Labs, Inc. # Ported from BFL's FLUX.2 reference at commit 50fe516: the constants of # Klein4BParams, Klein9BParams and Flux2Params in src/flux2/model.py and -# the defaults of FLUX2_MODEL_INFO in src/flux2/util.py, and the tensor -# names and shapes of Flux2 in src/flux2/model.py, and modified for gmlx +# the defaults of FLUX2_MODEL_INFO in src/flux2/util.py, the tensor names +# and shapes of Flux2 in src/flux2/model.py and the prompt rules of +# Qwen3Embedder in src/flux2/text_encoder.py, and modified for gmlx # (Apache-2.0; see licenses/flux2-LICENSE). """FLUX.2 klein fingerprint, constants, config synthesis and the hooks of its registry row. @@ -98,6 +99,65 @@ } +# The encoder of Qwen3Embedder in src/flux2/text_encoder.py: Qwen3-4B, the +# hidden states of three layers stacked per token, the prompt in the chat +# template of one user turn with thinking off, right-padded with the pad +# token to 512 rows and cut there, and the pad rows kept. The reference +# masks the pads as keys and gives each row its index as its position. +PROMPT = ConstantsRow( + values={ + # What the Qwen3 chat template renders for one user turn with the + # generation prompt and enable_thinking False. + "template": ("<|im_start|>user\n{}<|im_end|>\n<|im_start|>assistant\n" + "\n\n\n\n"), + # hidden_states indices of the encoder, 0 being the embeddings. + "tap_layers": (9, 18, 27), + "max_tokens": 512, + # The tokenizer's pad token <|endoftext|>. + "pad_id": 151643, + }, + repo="github.com/black-forest-labs/flux2", + revision="50fe5162777813d869182b139e83b10743caef15", +) + +# The Qwen3-4B Q8_0 GGUF of unsloth/Qwen3-4B-GGUF, which Z-Image reads too, +# holds the weights of the 4B text_encoder of the official repository: its +# F32 norms equal the bf16 tensors there bit for bit, and the Q8_0 blocks +# of the matrices compared equal those bf16 matrices quantized to Q8_0. So +# the identity rows are Z-Image's. +ENCODER_IDENTITY_SOURCE = ( + "black-forest-labs/FLUX.2-klein-4B text_encoder at " + "e7b7dc27f91deacad38e78976d1f2b499d76a294") + + +def encoder(): + """The text encoder of the 4B checkpoints: Qwen3-4B after three of its + layers and before its final norm, on the chat template of one user + turn with thinking off. The three states of a token are its features + side by side, layer by layer, and the 512 rows hold the pad rows the + reference keeps, each at its own position. The tap runs in float32.""" + from gmlx.image.text_encoder import Z_IMAGE, EncoderSpec + + p = PROMPT.values + return EncoderSpec( + name="qwen3-4b", + arch="qwen3", + model_type="qwen3", + hidden=2560, + layers=36, + tap_layers=tuple(p["tap_layers"]), + template=p["template"], + max_tokens=p["max_tokens"], + stack=True, + identity=Z_IMAGE.identity, + identity_source=ENCODER_IDENTITY_SOURCE, + activation="float32", + pad_multiple=p["max_tokens"], + pad_id=p["pad_id"], + pad_position=None, + ) + + def size_of(view: HeaderView) -> str | None: """The klein size whose input widths the file has, or None.""" shapes = (view.shape(IMG_IN), view.shape(TXT_IN)) @@ -263,6 +323,7 @@ def synth_config(view: HeaderView) -> dict: # The q and k norm scales, F32 in the file, stay fp32: the norm then # runs in fp32 and rounds once with the rotation. fp32_keep=("norm.query_norm.scale", "norm.key_norm.scale"), + encoder=encoder, identity_tensors=IDENTITY_TENSORS, variants=VARIANTS, sampling=SAMPLING, diff --git a/gmlx/image/text_encoder.py b/gmlx/image/text_encoder.py index a01e25892..836cc6dc4 100644 --- a/gmlx/image/text_encoder.py +++ b/gmlx/image/text_encoder.py @@ -17,10 +17,13 @@ A family whose reference keeps the rows of right padding in the conditioning names its pad token, the multiple the rows are padded to -and the position each pad row takes. In the reference each pad row -attends to every real token and to no pad row, itself included, so -every pad row of a layer holds the same values. The tap runs one pad row -after the real tokens, with that mask and its position, and repeats it. +and the rotary position of the pad rows: one position for all of them, +or for each its own index after the real tokens. In the reference each +pad row attends to every real token and to no pad row, itself included. +Pad rows at one position then hold the same values in every layer, so +the tap runs one pad row after the real tokens, with that mask and that +position, and repeats it. Pad rows at their own indices differ, and the +tap runs each of them with that mask. A family that conditions on reference images loads the encoder with its vision tower, from the encoder GGUF and its mmproj, as the multimodal @@ -87,7 +90,8 @@ class EncoderSpec: pad_multiple: int = 0 # rows padded to a multiple of this, # at most max_tokens; 0 for no pads pad_id: int | None = None # token id of the pad rows - pad_position: int = 1 # rotary position of every pad row + pad_position: int | None = 1 # rotary position of every pad row, + # None for each at its own index @property def template_id(self) -> str: @@ -101,8 +105,9 @@ def template_id(self) -> str: if self.stack: text += "\x00stack" if self.pad_multiple: - text += (f"\x00pad={self.pad_multiple},{self.pad_id}," - f"{self.pad_position}") + where = ("each" if self.pad_position is None + else self.pad_position) + text += f"\x00pad={self.pad_multiple},{self.pad_id},{where}" return hashlib.sha256(text.encode()).hexdigest() @@ -235,7 +240,7 @@ def _text_stack(model): def tap(model, ids, *, layers: tuple, activation: str | None = None, pad: int = 0, pad_id: int | None = None, - pad_position: int = 1) -> list[mx.array]: + pad_position: int | None = 1) -> list[mx.array]: """Hidden states after running the first ``n`` decoder layers, for each ``n`` in ``layers``, with no final norm. ``ids`` is one prompt's token ids. Each result is (1, L, hidden) in the model's activation dtype, and @@ -243,26 +248,31 @@ def tap(model, ids, *, layers: tuple, activation: str | None = None, are cast to that dtype, and the layers run in it by promotion over the weights as loaded. - With ``pad`` the result has ``pad`` more rows: one row of token - ``pad_id`` at rotary position ``pad_position`` that attends to every - real token and not to itself, repeated.""" + With ``pad`` the result has ``pad`` more rows of token ``pad_id``, each + attending to every real token and to no pad row. At a ``pad_position`` + they are one row at that rotary position, repeated. With + ``pad_position`` None each runs at its own index after the real + tokens.""" embed, blocks = _text_stack(model) stops = sorted(set(layers)) if not stops or stops[0] < 1 or stops[-1] > len(blocks): raise ValueError(f"tap layers {layers} outside 1..{len(blocks)}") - n = len(ids) - seq = list(ids) + ([pad_id] if pad else []) if pad and pad_id is None: raise ValueError("pad rows need a pad id") + n = len(ids) + each = bool(pad) and pad_position is None + rows = pad if each else min(pad, 1) + seq = list(ids) + [pad_id] * rows x = mx.array(np.asarray(seq, np.int32).reshape(1, -1)) h = embed(x) if activation is not None: h = h.astype(getattr(mx, activation)) if pad: - allowed = np.tril(np.ones((n + 1, n + 1), bool)) - allowed[n, n] = False + allowed = np.tril(np.ones((n + rows, n + rows), bool)) + allowed[:, n:] = False mask = mx.array(allowed) - place = pad_rope(model, n, pad_position) + place = (contextlib.nullcontext() if each + else pad_rope(model, n, pad_position)) else: mask = "causal" if n > 1 else None place = contextlib.nullcontext() @@ -272,7 +282,7 @@ def tap(model, ids, *, layers: tuple, activation: str | None = None, h = blocks[i](h, mask, None) if i + 1 in stops: out[i + 1] = h - if pad: + if pad and not each: for k, v in out.items(): row = mx.broadcast_to(v[:, n:], (1, pad, v.shape[-1])) out[k] = mx.concatenate([v[:, :n], row], axis=1) diff --git a/licenses/flux2-LICENSE b/licenses/flux2-LICENSE index 47b8a6ea5..56a76df7b 100644 --- a/licenses/flux2-LICENSE +++ b/licenses/flux2-LICENSE @@ -7,8 +7,9 @@ source. - gmlx/image/families/flux2_klein/family.py: the constants of Klein4BParams, Klein9BParams and Flux2Params in src/flux2/model.py, the - defaults of FLUX2_MODEL_INFO in src/flux2/util.py, and the tensor names - and shapes of Flux2 in src/flux2/model.py. + defaults of FLUX2_MODEL_INFO in src/flux2/util.py, the tensor names and + shapes of Flux2 in src/flux2/model.py, and the prompt rules of + Qwen3Embedder in src/flux2/text_encoder.py. - gmlx/image/families/flux2_klein/model.py: the Flux2 forward, DoubleStreamBlock, SingleStreamBlock, SelfAttention, SiLUActivation, Modulation, LastLayer, MLPEmbedder, QKNorm, timestep_embedding and rope diff --git a/tests/fixtures/image/flux2_klein_chat_template.jinja b/tests/fixtures/image/flux2_klein_chat_template.jinja new file mode 100644 index 000000000..01be9b307 --- /dev/null +++ b/tests/fixtures/image/flux2_klein_chat_template.jinja @@ -0,0 +1,89 @@ +{%- if tools %} + {{- '<|im_start|>system\n' }} + {%- if messages[0].role == 'system' %} + {{- messages[0].content + '\n\n' }} + {%- endif %} + {{- "# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within XML tags:\n" }} + {%- for tool in tools %} + {{- "\n" }} + {{- tool | tojson }} + {%- endfor %} + {{- "\n\n\nFor each function call, return a json object with function name and arguments within XML tags:\n\n{\"name\": , \"arguments\": }\n<|im_end|>\n" }} +{%- else %} + {%- if messages[0].role == 'system' %} + {{- '<|im_start|>system\n' + messages[0].content + '<|im_end|>\n' }} + {%- endif %} +{%- endif %} +{%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %} +{%- for message in messages[::-1] %} + {%- set index = (messages|length - 1) - loop.index0 %} + {%- if ns.multi_step_tool and message.role == "user" and message.content is string and not(message.content.startswith('') and message.content.endswith('')) %} + {%- set ns.multi_step_tool = false %} + {%- set ns.last_query_index = index %} + {%- endif %} +{%- endfor %} +{%- for message in messages %} + {%- if message.content is string %} + {%- set content = message.content %} + {%- else %} + {%- set content = '' %} + {%- endif %} + {%- if (message.role == "user") or (message.role == "system" and not loop.first) %} + {{- '<|im_start|>' + message.role + '\n' + content + '<|im_end|>' + '\n' }} + {%- elif message.role == "assistant" %} + {%- set reasoning_content = '' %} + {%- if message.reasoning_content is string %} + {%- set reasoning_content = message.reasoning_content %} + {%- else %} + {%- if '' in content %} + {%- set reasoning_content = content.split('')[0].rstrip('\n').split('')[-1].lstrip('\n') %} + {%- set content = content.split('')[-1].lstrip('\n') %} + {%- endif %} + {%- endif %} + {%- if loop.index0 > ns.last_query_index %} + {%- if loop.last or (not loop.last and reasoning_content) %} + {{- '<|im_start|>' + message.role + '\n\n' + reasoning_content.strip('\n') + '\n\n\n' + content.lstrip('\n') }} + {%- else %} + {{- '<|im_start|>' + message.role + '\n' + content }} + {%- endif %} + {%- else %} + {{- '<|im_start|>' + message.role + '\n' + content }} + {%- endif %} + {%- if message.tool_calls %} + {%- for tool_call in message.tool_calls %} + {%- if (loop.first and content) or (not loop.first) %} + {{- '\n' }} + {%- endif %} + {%- if tool_call.function %} + {%- set tool_call = tool_call.function %} + {%- endif %} + {{- '\n{"name": "' }} + {{- tool_call.name }} + {{- '", "arguments": ' }} + {%- if tool_call.arguments is string %} + {{- tool_call.arguments }} + {%- else %} + {{- tool_call.arguments | tojson }} + {%- endif %} + {{- '}\n' }} + {%- endfor %} + {%- endif %} + {{- '<|im_end|>\n' }} + {%- elif message.role == "tool" %} + {%- if loop.first or (messages[loop.index0 - 1].role != "tool") %} + {{- '<|im_start|>user' }} + {%- endif %} + {{- '\n\n' }} + {{- content }} + {{- '\n' }} + {%- if loop.last or (messages[loop.index0 + 1].role != "tool") %} + {{- '<|im_end|>\n' }} + {%- endif %} + {%- endif %} +{%- endfor %} +{%- if add_generation_prompt %} + {{- '<|im_start|>assistant\n' }} + {%- if enable_thinking is defined and enable_thinking is false %} + {{- '\n\n\n\n' }} + {%- endif %} +{%- endif %} \ No newline at end of file diff --git a/tests/fixtures/image/manifest.json b/tests/fixtures/image/manifest.json index 10b5f30f8..b91d424dd 100644 --- a/tests/fixtures/image/manifest.json +++ b/tests/fixtures/image/manifest.json @@ -141,6 +141,13 @@ "size": 531, "sha256": "c8a88c1433f24e52c01f46766c9f519e76d91d1c00bfb43fe0db2e4ed3c84d70" }, + "flux2_klein_chat_template.jinja": { + "repo": "black-forest-labs/FLUX.2-klein-4B", + "revision": "e7b7dc27f91deacad38e78976d1f2b499d76a294", + "file": "tokenizer/chat_template.jinja", + "size": 4168, + "sha256": "a55ee1b1660128b7098723e0abcd92caa0788061051c62d51cbe87d9cf1974d8" + }, "flux3_klein_config.json": { "repo": "black-forest-labs/flux-3-image-klein", "revision": "8454017f9ebaada30c998fccd9f67a80c7580f68", diff --git a/tests/image/test_image_text_encoder.py b/tests/image/test_image_text_encoder.py index c686e72f4..b3630054d 100644 --- a/tests/image/test_image_text_encoder.py +++ b/tests/image/test_image_text_encoder.py @@ -561,6 +561,50 @@ def test_the_flux3_spec_pads_as_the_reference_does(): assert spec.template_id != krea.template_id +_FLUX2_TEMPLATE = "flux2_klein_chat_template.jinja" + + +@pytest.mark.parametrize("prompt", _PROMPTS) +def test_the_flux2_template_is_the_official_render_with_thinking_off(prompt): + """FLUX.2 klein's reference renders the Qwen3 chat template of the + official tokenizer on one user turn with the generation prompt and + enable_thinking False. That template is Z-Image's, byte for byte.""" + from jinja2.ext import loopcontrols + from jinja2.sandbox import ImmutableSandboxedEnvironment + + text = (FIXTURES / _FLUX2_TEMPLATE).read_text() + assert text == (FIXTURES / _TEMPLATE).read_text() + env = ImmutableSandboxedEnvironment( + trim_blocks=True, lstrip_blocks=True, extensions=[loopcontrols]) + want = env.from_string(text).render( + messages=[{"role": "user", "content": prompt}], + add_generation_prompt=True, enable_thinking=False) + assert te.render(te.encoder_spec("flux2_klein"), prompt) == want + row = load_json("manifest.json")[_FLUX2_TEMPLATE] + assert row["repo"] == "black-forest-labs/FLUX.2-klein-4B" + assert len(row["revision"]) == 40 + + +def test_the_flux2_spec_pads_as_the_reference_does(): + from gmlx.image.families.flux2_klein import family as ff + + spec = te.encoder_spec("flux2_klein") + assert (spec.arch, spec.model_type, spec.hidden, spec.layers) == ( + "qwen3", "qwen3", 2560, 36) + assert spec.tap_layers == (9, 18, 27) and spec.stack + # Every prompt fills 512 rows, its own and the pads. + assert spec.pad_multiple == spec.max_tokens == 512 + assert (spec.pad_id, spec.pad_position) == (151643, None) + assert spec.drop == 0 and spec.activation == "float32" + assert spec.identity_source == ff.ENCODER_IDENTITY_SOURCE + assert [te.pad_rows(spec, n) for n in (1, 33, 511, 512)] == [ + 511, 479, 1, 0] + assert te.rows_at_most(spec, "a cat") == 512 + # The same encoder weights as Z-Image's, in another template. + assert spec.identity == te.Z_IMAGE.identity + assert spec.template_id != te.Z_IMAGE.template_id + + def test_pad_rows_reach_the_next_multiple_under_the_cap(): spec = _spec(pad_multiple=8, pad_id=0) assert [te.pad_rows(spec, n) for n in (1, 3, 8, 9, 15, 16)] == [ @@ -576,11 +620,17 @@ def test_pad_rows_reach_the_next_multiple_under_the_cap(): ids = {s.template_id for s in ( _spec(), spec, dataclasses.replace(spec, pad_multiple=4), dataclasses.replace(spec, pad_id=1), - dataclasses.replace(spec, pad_position=0))} - assert len(ids) == 5 - # A spec with no pads keeps the key it had before pads existed. + dataclasses.replace(spec, pad_position=0), + dataclasses.replace(spec, pad_position=None))} + assert len(ids) == 6 + # A spec with no pads keeps the key it had before pads existed, and a + # spec with pads at one position the key it had before pads at their + # own indices existed. assert _spec().template_id == dataclasses.replace( _spec(), pad_id=0, pad_position=3).template_id + flux3 = te.encoder_spec("flux3_klein") + assert flux3.template_id == hashlib.sha256( + (flux3.template + "\x00stack\x00pad=80,151643,1").encode()).hexdigest() @pytest.mark.parametrize("family", ["z_image", "krea2", "qwen_image21", @@ -691,6 +741,57 @@ def test_pad_rows_are_the_reference_forward_of_the_padded_prompt(): assert not _close(g, w, tol=1e-2) +def test_pad_rows_at_their_own_indices_are_the_reference_forward( + monkeypatch): + """With no pad position each pad row runs at its own index, reading + the real keys alone, as FLUX.2 klein's reference runs them. The pad + rows then differ, and pads at one position or read as causal tokens + are another forward.""" + m, _ = _tiny_qwen3() + ids, pad, pad_id = [3, 17, 42, 5, 99, 1, 64], 5, 9 + n = len(ids) + seq = ids + [pad_id] * pad + allowed = np.tril(np.ones((n + pad, n + pad), bool)) + allowed[:, n:] = False + layers = (1, 4) + want = _np_forward(m, seq, range(n + pad), allowed, layers) + got = _cpu_tap(m, ids, layers=layers, pad=pad, pad_id=pad_id, + pad_position=None) + for g, w in zip(got, want): + assert g.shape == (1, n + pad, 64) + assert _close(g, w) + spread = np.linalg.norm(w[n + 1:] - w[n], axis=1) / np.linalg.norm( + w[n]) + assert spread.min() > 1e-3 + for wrong in (_np_forward(m, seq, list(range(n)) + [n] * pad, allowed, + (4,)), + _np_forward(m, seq, range(n + pad), + np.tril(np.ones((n + pad, n + pad), bool)), + (4,))): + assert not _close(got[1], wrong[0], tol=1e-2) + # The real rows are the plain tap's, and one token runs with its pads. + (plain,) = _cpu_tap(m, ids, layers=(4,)) + real = np.array(got[1][0, :n], np.float64) + ref = np.array(plain[0], np.float64) + assert np.linalg.norm(real - ref) / np.linalg.norm(ref) < 1e-5 + (one,) = _cpu_tap(m, [7], layers=(2,), pad=2, pad_id=9, + pad_position=None) + want = _np_forward(m, [7, 9, 9], [0, 1, 2], + np.array([[1, 0, 0], [1, 0, 0], [1, 0, 0]], bool), + (2,))[0] + assert _close(one, want) + with pytest.raises(ValueError, match="pad id"): + _cpu_tap(m, ids, layers=(3,), pad=2, pad_position=None) + # No rope is swapped for pads at their own indices. + def swapped(*_a, **_k): + raise AssertionError("pad_rope ran") + + monkeypatch.setattr(te, "pad_rope", swapped) + te.tap(m, [3, 17], layers=(1,), pad=2, pad_id=9, pad_position=None) + with pytest.raises(AssertionError, match="pad_rope ran"): + te.tap(m, [3, 17], layers=(1,), pad=2, pad_id=9) + + def test_the_real_rows_of_a_padded_tap_are_the_tap_of_the_prompt(): m, _ = _tiny_qwen3() ids = [3, 17, 42, 5] @@ -763,3 +864,11 @@ def test_an_encoding_keeps_its_pad_rows(): max_tokens=24), owned=False).encode("ab") assert plain.pads == 0 and plain.features.shape == (n, 2 * 64) + # Pads at their own indices reach the tap with the spec's rule. + each = dataclasses.replace(spec, pad_position=None) + got = te.EncoderHandle(m, tok, each, owned=False).encode("ab") + want = te.tap(m, list(got.ids), layers=(1, 3), pad=got.pads, pad_id=9, + pad_position=None) + assert got.pads == 16 - n and got.template_id == each.template_id + assert mx.array_equal(got.features, + mx.concatenate([w[0] for w in want], -1)).item() From 33ad7d828dc743704dd511018f5cd58105ad3b13 Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 05:38:29 -0700 Subject: [PATCH 005/101] test(image): flux2 klein check 2 against the reference tap, pad rows gated apart --- scripts/image_oracle/check2_flux2_klein.py | 368 ++++++++++++++ .../oracle/check2_flux2_klein.manifest.json | 460 ++++++++++++++++++ tests/image/test_image_check2_flux2_klein.py | 249 ++++++++++ 3 files changed, 1077 insertions(+) create mode 100644 scripts/image_oracle/check2_flux2_klein.py create mode 100644 tests/fixtures/image/oracle/check2_flux2_klein.manifest.json create mode 100644 tests/image/test_image_check2_flux2_klein.py diff --git a/scripts/image_oracle/check2_flux2_klein.py b/scripts/image_oracle/check2_flux2_klein.py new file mode 100644 index 000000000..4d691d76e --- /dev/null +++ b/scripts/image_oracle/check2_flux2_klein.py @@ -0,0 +1,368 @@ +#!/usr/bin/env python3 +"""Check 2 oracle for FLUX.2 klein: the text encoder tap. + +BFL's Qwen3Embedder.forward (src/flux2/text_encoder.py of --reference) +renders each prompt in the Qwen3 chat template of one user turn with the +generation prompt and enable_thinking False, tokenizes it with padding to +max_length 512 and truncation there, and runs Qwen3-4B with the attention +mask and no position ids, so each row takes its index as its position and +each pad row reads the real tokens alone. It stacks hidden_states 9, 18 +and 27 of every row, the pad rows kept, to (512, 3 * 2560), layer by +layer, in the model's dtype. This script calls that method itself, on an +instance whose model is the GGUF's and whose tokenizer is the official +folder's, and checks that hidden_states[k] is the output of decoder layer +k - 1, read by a forward hook: the state after k layers, before the final +norm. + +transformers builds the model as Qwen3ForCausalLM from the config of the +official text_encoder folder, and gguf-py dequantizes each tensor of the +GGUF to float32 into it by name. The output matrix is left out: the tap +never reads it. The bf16 run casts that model to bf16 and keeps its +rotary frequencies in fp32, as a model loaded in bf16 keeps them. + +For each prompt the fixture holds the rendered text, the ids and mask the +method fed the model, the rotary positions the model took, and the fp32 +and bf16 features of every row. The manifest records the bf16 against +fp32 gap of each prompt over all rows, the real rows and the pad rows, +the smallest and largest relative L2 of a pad row of the fp32 run to the +first pad row, and the tolerances: relative L2 at twice each gap, and a +per-token cosine floor of 1 - 4 (1 - c) on the real rows, c the oracle's +own smallest per-token cosine of the real rows of the prompt. + +The pad rows take no cosine floor. In the oracle's own bf16 run, a change +of the arithmetic at the size of one bf16 rounding moves the pad rows by +about a tenth in relative L2 and single pad rows to a cosine near 0.5, +where the real rows move by about 2e-3. A floor from that run would hold +nothing. + + python scripts/image_oracle/run.py --python --threads 16 \\ + check2_flux2_klein.py --reference /src \\ + --reference-commit --encoder Qwen3-4B-Q8_0.gguf \\ + --text-encoder /text_encoder \\ + --tokenizer /tokenizer +""" + +from __future__ import annotations + +import argparse +import sys +import time +import types +from pathlib import Path + +import numpy as np + +import fixtures +import oracle +from check2_qwen_image21 import HEAD, dequantized, hf_name +from check2_z_image import _LONG, PROMPTS, token_cosine + +NAME = "check2_flux2_klein" +SCRIPT = "scripts/image_oracle/check2_flux2_klein.py" +RULE = ("relative L2 = 2 x the oracle's own bf16 against fp32 relative L2 " + "of the same prompt, over all rows, over the real rows and over " + "the pad rows; per-token cosine of each real row at least " + "1 - 4 (1 - c), c the oracle's own smallest per-token cosine of the " + "real rows of the same prompt") +# The 4B widths, from the GGUF header. +WIDTHS = {"hidden_size": "embedding_length", + "intermediate_size": "feed_forward_length", + "num_hidden_layers": "block_count", + "num_attention_heads": "attention.head_count", + "num_key_value_heads": "attention.head_count_kv", + "head_dim": "attention.key_length"} + + +def reference(path: Path): + """The reference's text_encoder module. It imports sampling, which + imports torchvision for its image preparation, which the tap does not + use and the oracle environment lacks, so an empty module stands in + while it imports. transformers looks torchvision up by its spec, which + the stand-in lacks, so the names text_encoder takes from transformers + import first, and the stand-in leaves sys.modules after.""" + from transformers import (AutoModelForCausalLM, AutoProcessor, # noqa: F401 + AutoTokenizer, Mistral3ForConditionalGeneration, + pipeline) + + sys.dont_write_bytecode = True + sys.path.insert(0, str(path)) + if "torchvision" in sys.modules: + raise SystemExit("error: torchvision is imported") + sys.modules["torchvision"] = types.ModuleType("torchvision") + try: + from flux2 import text_encoder + finally: + del sys.modules["torchvision"] + return text_encoder + + +def load_encoder(torch, encoder: Path, folder: Path): + """(model, codec census): Qwen3ForCausalLM in float32 on the CPU with + the GGUF's weights and no output matrix.""" + import gguf + from accelerate import init_empty_weights + from accelerate.utils import set_module_tensor_to_device + from transformers import AutoConfig, Qwen3ForCausalLM + + cfg = AutoConfig.from_pretrained(str(folder), local_files_only=True) + reader = gguf.GGUFReader(str(encoder)) + kv = {f.name: f for f in reader.fields.values()} + for k, key in WIDTHS.items(): + f = kv[f"qwen3.{key}"] + got = f.parts[f.data[0]].tolist()[0] + if got != getattr(cfg, k): + raise SystemExit(f"error: {k} is {got} in the GGUF, " + f"{getattr(cfg, k)} in the config") + with init_empty_weights(): + te = Qwen3ForCausalLM(cfg) + te.lm_head = torch.nn.Identity() + lm = te.model + want = {n: tuple(p.shape) for n, p in lm.named_parameters()} + census, seen, left = {}, set(), [] + for t in reader.tensors: + name = hf_name(t.name) + if name is None: + left.append(t.name) + continue + value = dequantized(torch, t) + if tuple(value.shape) != want.get(name): + raise SystemExit(f"error: {t.name} is {tuple(value.shape)}, " + f"{name} wants {want.get(name)}") + set_module_tensor_to_device(lm, name, "cpu", value=value, + dtype=torch.float32) + seen.add(name) + census[t.tensor_type.name] = census.get(t.tensor_type.name, 0) + 1 + if set(left) - {HEAD} or seen != set(want): + raise SystemExit(f"error: GGUF tensors left over {left[:4]}, model " + f"parameters not set {sorted(set(want) - seen)[:4]}") + meta = [n for n, p in te.named_parameters() if p.is_meta] + kinds = {p.dtype for p in te.parameters()} | { + b.dtype for b in te.buffers() if b.is_floating_point()} + if meta or kinds != {torch.float32}: + raise SystemExit(f"error: parameters on no device {meta[:4]}, " + f"dtypes {kinds}") + if len(lm.layers) != 36: + raise SystemExit(f"error: {len(lm.layers)} layers, expected 36") + return te.eval(), census + + +class Keep: + """The model, keeping the inputs and output of its last call, the + outputs of the decoder layers ``taps`` and the rotary positions.""" + + def __init__(self, model, taps): + self.model = model + self.last = None + self.layers = {} + self.positions = None + inner = model.model + for i in taps: + inner.layers[i].register_forward_hook(self._layer(i)) + inner.rotary_emb.register_forward_pre_hook(self._rope, + with_kwargs=True) + + def _layer(self, i): + def hook(_mod, _args, out): + self.layers[i] = out[0] if isinstance(out, tuple) else out + return hook + + def _rope(self, _mod, args, kwargs): + pos = kwargs.get("position_ids", args[1] if len(args) > 1 else None) + self.positions = pos + + @property + def device(self): + return self.model.device + + def __call__(self, **kwargs): + self.layers, self.positions = {}, None + out = self.model(**kwargs) + self.last = (kwargs, out) + return out + + +def embedder(torch, text_encoder, keep, tok): + """An instance of the reference's Qwen3Embedder on ``keep`` and + ``tok``: its __init__ loads from a hub id, so it is set by hand as + __init__ sets it.""" + enc = object.__new__(text_encoder.Qwen3Embedder) + torch.nn.Module.__init__(enc) + enc.model = keep + enc.tokenizer = tok + enc.max_length = text_encoder.MAX_LENGTH + return enc + + +def features(torch, text_encoder, enc, prompt: str) -> dict: + t0 = time.perf_counter() + out = enc([prompt]) + secs = time.perf_counter() - t0 + keep = enc.model + kw, res = keep.last + hs = res.hidden_states + layers = text_encoder.OUTPUT_LAYERS_QWEN3 + tapped = {k: bool(torch.equal(hs[k], keep.layers[k - 1])) + for k in layers} + if not all(tapped.values()): + raise SystemExit(f"error: hidden_states and the layer outputs " + f"differ: {tapped}") + length = kw["input_ids"].shape[1] + f = torch.stack([hs[k] for k in layers], dim=1) + f = f.permute(0, 2, 1, 3).reshape(length, -1) + if not torch.equal(f, out[0]): + raise SystemExit("error: the stack differs from forward's own") + mask = kw["attention_mask"][0] + real = int(mask.sum()) + f32 = oracle.to_numpy(out[0]) + pads = f32[real:].astype(np.float64) + spread = [0.0, 0.0] + if len(pads) > 1: + r = (np.linalg.norm(pads[1:] - pads[0], axis=1) + / np.linalg.norm(pads[0])) + spread = [float(r.min()), float(r.max())] + pos = keep.positions + pos = (np.arange(length)[None] if pos is None + else pos.numpy().astype(np.int64)) + return {"ids": kw["input_ids"][0].numpy().astype(np.int64), + "mask": mask.numpy().astype(np.int64), + "positions": pos.astype(np.int64), + "positions_given": keep.positions is not None, + "features": f32, "real": real, "pad_spread": spread, + "seconds": secs} + + +def rendered(tok, prompt: str) -> str: + return tok.apply_chat_template( + [{"role": "user", "content": prompt}], tokenize=False, + add_generation_prompt=True, enable_thinking=False) + + +def one_pad(tok, cap: int) -> str: + """The longest prefix of the long prompt, cut at a character, whose + templated prompt is one token under the cap, so its features have one + pad row.""" + for n in range(len(_LONG), 0, -1): + p = _LONG[:n].rstrip() + if len(tok(rendered(tok, p))["input_ids"]) == cap - 1: + return p + raise SystemExit(f"error: no prefix of the long prompt is {cap - 1} " + "tokens") + + +def main(argv=None) -> int: + ap = argparse.ArgumentParser(description=__doc__.split("\n\n")[0]) + ap.add_argument("--reference", required=True, type=Path, + help="src directory of BFL's flux2") + ap.add_argument("--reference-commit", required=True, + help="commit of --reference, for the manifest") + ap.add_argument("--encoder", required=True, type=Path, + help="Qwen3-4B text GGUF") + ap.add_argument("--text-encoder", required=True, type=Path, + help="the official repo's text_encoder folder") + ap.add_argument("--tokenizer", required=True, type=Path, + help="the official repo's tokenizer folder") + ap.add_argument("--name", default=NAME) + a = ap.parse_args(argv) + torch = oracle.setup() + text_encoder = reference(a.reference.expanduser()) + from transformers import AutoTokenizer + + tok = AutoTokenizer.from_pretrained(str(a.tokenizer.expanduser()), + local_files_only=True) + cap = text_encoder.MAX_LENGTH + prompts = dict(PROMPTS) + prompts["one_pad"] = one_pad(tok, cap) + t0 = time.perf_counter() + te, census = load_encoder(torch, a.encoder, a.text_encoder.expanduser()) + load_s = time.perf_counter() - t0 + print(f"[check2] loaded {a.encoder.name} in {load_s:.1f}s, codecs " + f"{census}", flush=True) + fx = fixtures.FixtureWriter(a.name, check=2, family="flux2_klein", + script=SCRIPT) + fx.add_file("encoder", a.encoder) + fx.add_file("text_encoder/config.json", a.text_encoder / "config.json") + for f in ("tokenizer.json", "tokenizer_config.json", + "chat_template.jinja"): + fx.add_file(f"tokenizer/{f}", a.tokenizer / f) + layers = list(text_encoder.OUTPUT_LAYERS_QWEN3) + fx.inputs.update(prompts=prompts, + rendered={k: rendered(tok, p) + for k, p in prompts.items()}, + tap_layers=layers, max_length=cap, + reference_commit=a.reference_commit, + gguf_codecs=census, + matmul_bf16=("bf16 operands, float32 GEMM, one bf16 " + "rounding")) + enc = embedder(torch, text_encoder, Keep(te, [k - 1 for k in layers]), + tok) + runs = {} + for mode in ("fp32", "bf16"): + if mode == "bf16": + # A model loaded in bf16 keeps its rotary frequencies in fp32, + # which a cast of the fp32 model would round. + rot = te.model.rotary_emb + inv = rot.inv_freq.clone() + te.to(torch.bfloat16) + rot.inv_freq = inv + oracle.emulate_bf16_matmul(True) + runs[mode] = {} + for k, v in prompts.items(): + runs[mode][k] = features(torch, text_encoder, enc, v) + print(f"[check2] {mode} {k}: " + f"{runs[mode][k]['seconds']:.1f}s", flush=True) + oracle.emulate_bf16_matmul(False) + tol = {"rel_l2": {}, "rel_l2_real": {}, "rel_l2_pads": {}, + "token_cosine_min": {}} + rows, secs, pads, given = {}, {}, {}, {} + for k in prompts: + f32, b16 = runs["fp32"][k], runs["bf16"][k] + for key in ("ids", "mask", "positions"): + assert np.array_equal(f32[key], b16[key]), (k, key) + fx.add(f"{key}_{k}", f32[key]) + fx.add(f"features_{k}", f32["features"]) + fx.add(f"features_{k}_bf16", b16["features"]) + n = f32["real"] + got, ref = b16["features"], f32["features"] + gap = fixtures.rel_l2(got, ref) + real = fixtures.rel_l2(got[:n], ref[:n]) + c = token_cosine(got, ref) + tol["rel_l2"][k] = 2 * gap + tol["rel_l2_real"][k] = 2 * real + tol["token_cosine_min"][k] = float(1 - 4 * (1 - c[:n].min())) + res = {"rel_l2": gap, "rel_l2_real": real, + "token_cosine_min_real": float(c[:n].min()), + "worst_real_token": int(c[:n].argmin())} + if n < len(c): + res.update(rel_l2_pads=fixtures.rel_l2(got[n:], ref[n:]), + token_cosine_min_pads=float(c[n:].min()), + worst_pad_row=n + int(c[n:].argmin())) + tol["rel_l2_pads"][k] = 2 * res["rel_l2_pads"] + fx.results[f"bf16_vs_fp32_{k}"] = res + rows[k] = {"real": n, "rows": int(f32["ids"].shape[0])} + pads[k] = f32["pad_spread"] + given[k] = f32["positions_given"] + secs[k] = {m: round(runs[m][k]["seconds"], 1) for m in runs} + print(f"[check2] {k}: {rows[k]}, pad rows {pads[k][0]:.1e} to " + f"{pads[k][1]:.1e} from the first, bf16 vs fp32 rel L2 " + f"{gap:.3e}, real rows {real:.3e}, pad rows " + f"{res.get('rel_l2_pads', 0.0):.3e}, min token cosine real " + f"{c[:n].min():.5f}, pads " + f"{res.get('token_cosine_min_pads', 1.0):.5f}", flush=True) + if rows["long"]["real"] != cap or rows["one_pad"]["real"] != cap - 1: + raise SystemExit(f"error: rows {rows}") + fx.inputs["rows"] = rows + fx.results["pad_rows_rel_l2_to_the_first"] = pads + fx.results["positions_from_the_model"] = given + fx.results["seconds"] = {"load_s": round(load_s, 1), **secs} + fx.results["oracle"] = {"device": "cpu", + "threads": torch.get_num_threads()} + fx.tolerances.update(**tol, rule=RULE) + fx.note("positions_from_the_model is whether the rotary embedding " + "took position ids from the model's forward; the positions " + "recorded are those ids, else the row indices.") + print(f"[check2] wrote {fx.write()}", flush=True) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tests/fixtures/image/oracle/check2_flux2_klein.manifest.json b/tests/fixtures/image/oracle/check2_flux2_klein.manifest.json new file mode 100644 index 000000000..079c7f2fe --- /dev/null +++ b/tests/fixtures/image/oracle/check2_flux2_klein.manifest.json @@ -0,0 +1,460 @@ +{ + "schema": 1, + "name": "check2_flux2_klein", + "check": 2, + "family": "flux2_klein", + "script": "scripts/image_oracle/check2_flux2_klein.py", + "argv": [ + "check2_flux2_klein.py", + "--reference", + "src", + "--reference-commit", + "50fe5162777813d869182b139e83b10743caef15", + "--encoder", + "Qwen3-4B-Q8_0.gguf", + "--text-encoder", + "text_encoder", + "--tokenizer", + "tokenizer" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": { + "encoder": { + "name": "Qwen3-4B-Q8_0.gguf", + "size": 4280405792, + "sha256": "eed555233267a33c7e8ee31682762cc7751b3f6d224039086e0e846f05fffa5d" + }, + "text_encoder/config.json": { + "name": "config.json", + "size": 1536, + "sha256": "214b4c29a0d975e9fddf9994a5673f22cb2c4c5750352f9227c2c3251ebeab40" + }, + "tokenizer/tokenizer.json": { + "name": "tokenizer.json", + "size": 11422654, + "sha256": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4" + }, + "tokenizer/tokenizer_config.json": { + "name": "tokenizer_config.json", + "size": 5404, + "sha256": "443bfa629eb16387a12edbf92a76f6a6f10b2af3b53d87ba1550adfcf45f7fa0" + }, + "tokenizer/chat_template.jinja": { + "name": "chat_template.jinja", + "size": 4168, + "sha256": "a55ee1b1660128b7098723e0abcd92caa0788061051c62d51cbe87d9cf1974d8" + } + }, + "inputs": { + "prompts": { + "plain": "A red bicycle leaning against a weathered brick wall at sunset, a cat asleep in its basket, warm light, 35mm photograph", + "empty": "", + "non_ascii": "Un caf\u00e9 \u00e0 Montr\u00e9al en hiver, \u7a93\u8fba\u3067\u5bdd\u3066\u3044\u308b\u732b, \u4e00\u676f\u62ff\u94c1\u548c\u4e00\u672c\u4e66, \u0441\u043d\u0435\u0433 \u0437\u0430 \u043e\u043a\u043d\u043e\u043c, \ud83d\udc31\u2615", + "long": "A narrow cobblestone street in an old harbor town at dusk, lined with three story houses painted ochre, teal and faded red. Laundry hangs on lines strung between the balconies, and a bicycle with a wicker basket leans against a green door. A fishmonger closes the shutters of a small shop while gulls circle above the masts in the harbor. Warm lamplight spills from a cafe where two old men play chess at a marble table, and a cat watches them from a windowsill full of geraniums. Puddles from an afternoon rain reflect the lamps and the violet sky, and the far end of the street opens onto the sea, where a lighthouse is just switching on. In the foreground a girl in a yellow raincoat crouches to inspect a snail on the curb, her boots splashed with mud. Behind her a baker carries a tray of round loaves dusted with flour toward a delivery van whose rear doors stand open. A hand painted sign above the bakery reads Panificio in chipped gold letters. Strings of small bulbs zigzag overhead, some of them dark, and a pigeon sits on the wire between two of them. On the left, a stone staircase climbs toward a chapel with a bell tower, its steps worn into shallow bowls by centuries of feet. Moss grows in the cracks, and someone has left a bunch of wildflowers on the third step. A scooter with a dented fender is parked at an angle beside a bollard shaped like a lion. The sky shades from deep indigo at the top of the frame to a band of apricot just above the horizon, with a thin crescent moon and a single bright planet. Fishing boats with blue and white hulls rock at their moorings, nets heaped on their decks, and a man in a wool cap coils rope on the quay. Far out on the water the running lights of a ferry move slowly toward an island whose hills are already black. The air looks cool and damp, with a faint haze that softens the distant lights into halos. Shot on medium format film with a normal lens at eye level, shallow depth of field on the girl and the snail, gentle grain, muted greens and warm highlights, no text other than the bakery sign, no watermark. The composition follows the curve of the street from the lower left corner to the lighthouse at the upper right, leading the eye past each small story along the way. Every window tells something: a family eating soup under a hanging lamp, a tailor pinning the hem of a coat on a wooden dummy, an empty room with a piano and a vase of dry roses, a boy practicing the violin with his music stand turned toward the glass. Rainwater still drips from the gutters, catching the light in bright beads, and the cobbles shine like the backs of beetles. A black dog trots out of an alley with a paper bag in its mouth, looking over its shoulder as if someone might follow.", + "one_pad": "A narrow cobblestone street in an old harbor town at dusk, lined with three story houses painted ochre, teal and faded red. Laundry hangs on lines strung between the balconies, and a bicycle with a wicker basket leans against a green door. A fishmonger closes the shutters of a small shop while gulls circle above the masts in the harbor. Warm lamplight spills from a cafe where two old men play chess at a marble table, and a cat watches them from a windowsill full of geraniums. Puddles from an afternoon rain reflect the lamps and the violet sky, and the far end of the street opens onto the sea, where a lighthouse is just switching on. In the foreground a girl in a yellow raincoat crouches to inspect a snail on the curb, her boots splashed with mud. Behind her a baker carries a tray of round loaves dusted with flour toward a delivery van whose rear doors stand open. A hand painted sign above the bakery reads Panificio in chipped gold letters. Strings of small bulbs zigzag overhead, some of them dark, and a pigeon sits on the wire between two of them. On the left, a stone staircase climbs toward a chapel with a bell tower, its steps worn into shallow bowls by centuries of feet. Moss grows in the cracks, and someone has left a bunch of wildflowers on the third step. A scooter with a dented fender is parked at an angle beside a bollard shaped like a lion. The sky shades from deep indigo at the top of the frame to a band of apricot just above the horizon, with a thin crescent moon and a single bright planet. Fishing boats with blue and white hulls rock at their moorings, nets heaped on their decks, and a man in a wool cap coils rope on the quay. Far out on the water the running lights of a ferry move slowly toward an island whose hills are already black. The air looks cool and damp, with a faint haze that softens the distant lights into halos. Shot on medium format film with a normal lens at eye level, shallow depth of field on the girl and the snail, gentle grain, muted greens and warm highlights, no text other than the bakery sign, no watermark. The composition follows the curve of the street from the lower left corner to the lighthouse at the upper right, leading the eye past each" + }, + "rendered": { + "plain": "<|im_start|>user\nA red bicycle leaning against a weathered brick wall at sunset, a cat asleep in its basket, warm light, 35mm photograph<|im_end|>\n<|im_start|>assistant\n\n\n\n\n", + "empty": "<|im_start|>user\n<|im_end|>\n<|im_start|>assistant\n\n\n\n\n", + "non_ascii": "<|im_start|>user\nUn caf\u00e9 \u00e0 Montr\u00e9al en hiver, \u7a93\u8fba\u3067\u5bdd\u3066\u3044\u308b\u732b, \u4e00\u676f\u62ff\u94c1\u548c\u4e00\u672c\u4e66, \u0441\u043d\u0435\u0433 \u0437\u0430 \u043e\u043a\u043d\u043e\u043c, \ud83d\udc31\u2615<|im_end|>\n<|im_start|>assistant\n\n\n\n\n", + "long": "<|im_start|>user\nA narrow cobblestone street in an old harbor town at dusk, lined with three story houses painted ochre, teal and faded red. Laundry hangs on lines strung between the balconies, and a bicycle with a wicker basket leans against a green door. A fishmonger closes the shutters of a small shop while gulls circle above the masts in the harbor. Warm lamplight spills from a cafe where two old men play chess at a marble table, and a cat watches them from a windowsill full of geraniums. Puddles from an afternoon rain reflect the lamps and the violet sky, and the far end of the street opens onto the sea, where a lighthouse is just switching on. In the foreground a girl in a yellow raincoat crouches to inspect a snail on the curb, her boots splashed with mud. Behind her a baker carries a tray of round loaves dusted with flour toward a delivery van whose rear doors stand open. A hand painted sign above the bakery reads Panificio in chipped gold letters. Strings of small bulbs zigzag overhead, some of them dark, and a pigeon sits on the wire between two of them. On the left, a stone staircase climbs toward a chapel with a bell tower, its steps worn into shallow bowls by centuries of feet. Moss grows in the cracks, and someone has left a bunch of wildflowers on the third step. A scooter with a dented fender is parked at an angle beside a bollard shaped like a lion. The sky shades from deep indigo at the top of the frame to a band of apricot just above the horizon, with a thin crescent moon and a single bright planet. Fishing boats with blue and white hulls rock at their moorings, nets heaped on their decks, and a man in a wool cap coils rope on the quay. Far out on the water the running lights of a ferry move slowly toward an island whose hills are already black. The air looks cool and damp, with a faint haze that softens the distant lights into halos. Shot on medium format film with a normal lens at eye level, shallow depth of field on the girl and the snail, gentle grain, muted greens and warm highlights, no text other than the bakery sign, no watermark. The composition follows the curve of the street from the lower left corner to the lighthouse at the upper right, leading the eye past each small story along the way. Every window tells something: a family eating soup under a hanging lamp, a tailor pinning the hem of a coat on a wooden dummy, an empty room with a piano and a vase of dry roses, a boy practicing the violin with his music stand turned toward the glass. Rainwater still drips from the gutters, catching the light in bright beads, and the cobbles shine like the backs of beetles. A black dog trots out of an alley with a paper bag in its mouth, looking over its shoulder as if someone might follow.<|im_end|>\n<|im_start|>assistant\n\n\n\n\n", + "one_pad": "<|im_start|>user\nA narrow cobblestone street in an old harbor town at dusk, lined with three story houses painted ochre, teal and faded red. Laundry hangs on lines strung between the balconies, and a bicycle with a wicker basket leans against a green door. A fishmonger closes the shutters of a small shop while gulls circle above the masts in the harbor. Warm lamplight spills from a cafe where two old men play chess at a marble table, and a cat watches them from a windowsill full of geraniums. Puddles from an afternoon rain reflect the lamps and the violet sky, and the far end of the street opens onto the sea, where a lighthouse is just switching on. In the foreground a girl in a yellow raincoat crouches to inspect a snail on the curb, her boots splashed with mud. Behind her a baker carries a tray of round loaves dusted with flour toward a delivery van whose rear doors stand open. A hand painted sign above the bakery reads Panificio in chipped gold letters. Strings of small bulbs zigzag overhead, some of them dark, and a pigeon sits on the wire between two of them. On the left, a stone staircase climbs toward a chapel with a bell tower, its steps worn into shallow bowls by centuries of feet. Moss grows in the cracks, and someone has left a bunch of wildflowers on the third step. A scooter with a dented fender is parked at an angle beside a bollard shaped like a lion. The sky shades from deep indigo at the top of the frame to a band of apricot just above the horizon, with a thin crescent moon and a single bright planet. Fishing boats with blue and white hulls rock at their moorings, nets heaped on their decks, and a man in a wool cap coils rope on the quay. Far out on the water the running lights of a ferry move slowly toward an island whose hills are already black. The air looks cool and damp, with a faint haze that softens the distant lights into halos. Shot on medium format film with a normal lens at eye level, shallow depth of field on the girl and the snail, gentle grain, muted greens and warm highlights, no text other than the bakery sign, no watermark. The composition follows the curve of the street from the lower left corner to the lighthouse at the upper right, leading the eye past each<|im_end|>\n<|im_start|>assistant\n\n\n\n\n" + }, + "tap_layers": [ + 9, + 18, + 27 + ], + "max_length": 512, + "reference_commit": "50fe5162777813d869182b139e83b10743caef15", + "gguf_codecs": { + "F32": 145, + "Q8_0": 253 + }, + "matmul_bf16": "bf16 operands, float32 GEMM, one bf16 rounding", + "rows": { + "plain": { + "real": 40, + "rows": 512 + }, + "empty": { + "real": 12, + "rows": 512 + }, + "non_ascii": { + "real": 49, + "rows": 512 + }, + "long": { + "real": 512, + "rows": 512 + }, + "one_pad": { + "real": 511, + "rows": 512 + } + } + }, + "results": { + "bf16_vs_fp32_plain": { + "rel_l2": 0.013412603765453614, + "rel_l2_real": 0.0015491928085275219, + "token_cosine_min_real": 0.9998014309432653, + "worst_real_token": 36, + "rel_l2_pads": 0.11212438731374405, + "token_cosine_min_pads": 0.7112113534333863, + "worst_pad_row": 358 + }, + "bf16_vs_fp32_empty": { + "rel_l2": 0.0052531261483292095, + "rel_l2_real": 0.0015100940688100703, + "token_cosine_min_real": 0.999792927197924, + "worst_real_token": 3, + "rel_l2_pads": 0.04710904173641587, + "token_cosine_min_pads": 0.9792194736505284, + "worst_pad_row": 498 + }, + "bf16_vs_fp32_non_ascii": { + "rel_l2": 0.013545750600282222, + "rel_l2_real": 0.0015603361912397468, + "token_cosine_min_real": 0.9998196936679316, + "worst_real_token": 45, + "rel_l2_pads": 0.11277478311132295, + "token_cosine_min_pads": 0.6003199724932757, + "worst_pad_row": 361 + }, + "bf16_vs_fp32_long": { + "rel_l2": 0.0020080203424409633, + "rel_l2_real": 0.0020080203424409633, + "token_cosine_min_real": 0.999686138183859, + "worst_real_token": 77 + }, + "bf16_vs_fp32_one_pad": { + "rel_l2": 0.002032955541495963, + "rel_l2_real": 0.002013510054611784, + "token_cosine_min_real": 0.999686138183859, + "worst_real_token": 77, + "rel_l2_pads": 0.06567071460682039, + "token_cosine_min_pads": 0.9978416750725576, + "worst_pad_row": 511 + }, + "pad_rows_rel_l2_to_the_first": { + "plain": [ + 0.7136575262319458, + 2.605666172309648 + ], + "empty": [ + 0.2567397624582779, + 0.9864455225465358 + ], + "non_ascii": [ + 0.4647251459714205, + 5.983267347908616 + ], + "long": [ + 0.0, + 0.0 + ], + "one_pad": [ + 0.0, + 0.0 + ] + }, + "positions_from_the_model": { + "plain": true, + "empty": true, + "non_ascii": true, + "long": true, + "one_pad": true + }, + "seconds": { + "load_s": 5.7, + "plain": { + "fp32": 2.5, + "bf16": 5.3 + }, + "empty": { + "fp32": 2.5, + "bf16": 5.3 + }, + "non_ascii": { + "fp32": 2.5, + "bf16": 5.5 + }, + "long": { + "fp32": 2.5, + "bf16": 5.6 + }, + "one_pad": { + "fp32": 2.5, + "bf16": 5.6 + } + }, + "oracle": { + "device": "cpu", + "threads": 16 + } + }, + "tolerances": { + "rel_l2": { + "plain": 0.026825207530907228, + "empty": 0.010506252296658419, + "non_ascii": 0.027091501200564444, + "long": 0.004016040684881927, + "one_pad": 0.004065911082991926 + }, + "rel_l2_real": { + "plain": 0.0030983856170550437, + "empty": 0.0030201881376201406, + "non_ascii": 0.0031206723824794935, + "long": 0.004016040684881927, + "one_pad": 0.004027020109223568 + }, + "rel_l2_pads": { + "plain": 0.2242487746274881, + "empty": 0.09421808347283174, + "non_ascii": 0.2255495662226459, + "one_pad": 0.13134142921364078 + }, + "token_cosine_min": { + "plain": 0.9992057237730614, + "empty": 0.999171708791696, + "non_ascii": 0.9992787746717262, + "long": 0.9987445527354359, + "one_pad": 0.9987445527354359 + }, + "rule": "relative L2 = 2 x the oracle's own bf16 against fp32 relative L2 of the same prompt, over all rows, over the real rows and over the pad rows; per-token cosine of each real row at least 1 - 4 (1 - c), c the oracle's own smallest per-token cosine of the real rows of the same prompt" + }, + "notes": [ + "positions_from_the_model is whether the rotary embedding took position ids from the model's forward; the positions recorded are those ids, else the row indices." + ], + "created": "2026-10-16T12:35:42Z", + "npz": "check2_flux2_klein.npz", + "tensors": { + "features_empty": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "bbc7e6b3be98d976d5fcd78a7b4576085e3d07ac7a87a8c7e3d63abf30c26fb6" + }, + "features_empty_bf16": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "eafdc4e97d61cc2fe7bf0cfc4e636ea7b9b827261e9d5bad3dbab0610efde3dd" + }, + "features_long": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "4cc3d572a3eed98c268a2d9194b4d15804a218eb2a7f103dc49a728919ad8bb7" + }, + "features_long_bf16": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "2cefcccf0b33c195c3750da0bb9373d75b58cdf77e349d8ce2d85d66dc522449" + }, + "features_non_ascii": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "0dd1da92a690ea3f8cf012b16e739bcfab8bf0965ce307f9ea40aaa1d74510ee" + }, + "features_non_ascii_bf16": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "3333c0470312e65518a7d7b534856cd2a21fbf803e1e4f389864fca4b21082c0" + }, + "features_one_pad": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "5337fa90cee98fa0bd7c413760d9cbd0676a17e624b335170b5a0b2d4e04f324" + }, + "features_one_pad_bf16": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "d6b8d80c3f699034a9bd99f8954151d36e8dd8c10c3c352f4e8ce1e0b2db951e" + }, + "features_plain": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "ad55cd3cae3ec5369e0fc6fd4c14371099d78e309d0abb5569a2cdaa14c8f3f0" + }, + "features_plain_bf16": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "d6af288a6de734a494fbd349a7d9940833f4a809844c30e79b8de7e37c15aa33" + }, + "ids_empty": { + "shape": [ + 512 + ], + "dtype": "int64", + "sha256": "c4e0a29a3fdf28c261c1ccb91f302d3ebc96411fd9a664e12e494e3aafa347b6" + }, + "ids_long": { + "shape": [ + 512 + ], + "dtype": "int64", + "sha256": "16beeb97289dab01a74d052761efab912f183b61ac38d3e27d636b577e043ace" + }, + "ids_non_ascii": { + "shape": [ + 512 + ], + "dtype": "int64", + "sha256": "ba2480a1f56167bdebfa0b2ffbc5c9ca87022f11d1a4d2d15b70a329b0c99747" + }, + "ids_one_pad": { + "shape": [ + 512 + ], + "dtype": "int64", + "sha256": "e1ba6115f4b96ba056be3cc79bc7d9c8c0432b8fae893582de2b5b415f94a323" + }, + "ids_plain": { + "shape": [ + 512 + ], + "dtype": "int64", + "sha256": "cba19b77091c9331cccef6f12e3569ef10f59acdf3e745c267e6edb22e06b0c3" + }, + "mask_empty": { + "shape": [ + 512 + ], + "dtype": "int64", + "sha256": "6d5f687abe60809ffff5acda376aeaa5dbe69ab135d619b19a97d66bdfad26c1" + }, + "mask_long": { + "shape": [ + 512 + ], + "dtype": "int64", + "sha256": "8a472efbc41a4502e6da085422880bc742625c1187f2d36ed39e669d736ac113" + }, + "mask_non_ascii": { + "shape": [ + 512 + ], + "dtype": "int64", + "sha256": "fd1c57b8daa03955eff02561df5b4d6afb851ab2291d5f81154a014dad802b86" + }, + "mask_one_pad": { + "shape": [ + 512 + ], + "dtype": "int64", + "sha256": "f8d6cfb638c8259475032b7ed0a2a774856173ae0106e5cdcbd7985dbf4d6a60" + }, + "mask_plain": { + "shape": [ + 512 + ], + "dtype": "int64", + "sha256": "c3503104c3b74db2bf667c77ec73ee42b9bd400516dd561162e183ce21cd796d" + }, + "positions_empty": { + "shape": [ + 1, + 512 + ], + "dtype": "int64", + "sha256": "5738153ec97595b1c1e4dc027f7b7fb4534f19ed2ce9f9ee712e6d34a384cde7" + }, + "positions_long": { + "shape": [ + 1, + 512 + ], + "dtype": "int64", + "sha256": "5738153ec97595b1c1e4dc027f7b7fb4534f19ed2ce9f9ee712e6d34a384cde7" + }, + "positions_non_ascii": { + "shape": [ + 1, + 512 + ], + "dtype": "int64", + "sha256": "5738153ec97595b1c1e4dc027f7b7fb4534f19ed2ce9f9ee712e6d34a384cde7" + }, + "positions_one_pad": { + "shape": [ + 1, + 512 + ], + "dtype": "int64", + "sha256": "5738153ec97595b1c1e4dc027f7b7fb4534f19ed2ce9f9ee712e6d34a384cde7" + }, + "positions_plain": { + "shape": [ + 1, + 512 + ], + "dtype": "int64", + "sha256": "5738153ec97595b1c1e4dc027f7b7fb4534f19ed2ce9f9ee712e6d34a384cde7" + } + } +} diff --git a/tests/image/test_image_check2_flux2_klein.py b/tests/image/test_image_check2_flux2_klein.py new file mode 100644 index 000000000..9821d0d25 --- /dev/null +++ b/tests/image/test_image_check2_flux2_klein.py @@ -0,0 +1,249 @@ +"""Check 2 of the image acceptance gate for FLUX.2 klein: the text encoder +tap. + +gmlx encodes the oracle's prompts with the Qwen3-4B GGUF the oracle read. +The reference renders each prompt with thinking off, right-pads it with +the pad token to 512 rows and cuts it there, masks the pads as keys, +gives each row its index as its position, and keeps the pad rows. The +token ids and pad rows gmlx forms must equal the ids the reference feeds +its model. The stacked features must stay within the manifest's relative +L2 of the oracle's fp32 features over all rows, over the real rows and +over the pad rows, and each real row within its per-token cosine floor. +The pad rows take no cosine floor: the oracle's own bf16 run moves single +pad rows to a cosine near 0.5. Each wrong encoder below must fail some +reading. + +Skipped unless KQUANT_TEST_GGUF_DIR holds the encoder GGUF the fixture +names and GMLX_IMAGE_FIXTURES holds the fixture. +scripts/image_oracle/check2_flux2_klein.py writes it.""" +from __future__ import annotations + +import dataclasses +import os + +import mlx.core as mx +import numpy as np +import pytest +from oracle_fixture import fixture, fx + +pytestmark = pytest.mark.integration + +NAME = "check2_flux2_klein" + + +def token_cosine(got: np.ndarray, ref: np.ndarray) -> np.ndarray: + g = got.astype(np.float64) + r = ref.astype(np.float64) + return (g * r).sum(-1) / (np.linalg.norm(g, axis=-1) + * np.linalg.norm(r, axis=-1)) + + +@pytest.fixture(scope="module") +def check2(): + return fixture(NAME) + + +@pytest.fixture(scope="module") +def handle(gguf_index, check2): + from gmlx.image import text_encoder as te + + spec = te.encoder_spec("flux2_klein") + want = check2[1]["files"]["encoder"] + for p in gguf_index.get(spec.arch, []): + if (os.path.basename(p) == want["name"] + and os.path.getsize(p) == want["size"] + and fx.file_identity(p)["sha256"] == want["sha256"]): + break + else: + pytest.skip(f"{want['name']} is not under KQUANT_TEST_GGUF_DIR") + h = te.load_encoder(p, spec, log=lambda *_: None) + yield h + h.release() + + +def _padded(spec, ids: list) -> list: + from gmlx.image import text_encoder as te + + return list(ids) + [spec.pad_id] * te.pad_rows(spec, len(ids)) + + +def test_the_encoder_is_the_identified_one(handle): + from gmlx.image import text_encoder as te + + spec = handle.spec + assert len(handle.model.model.layers) == spec.layers == 36 + got = te.model_identity(handle.model, spec) + assert got == {r.gguf_name: r.sha256 for r in spec.identity} + + +def test_the_ids_pads_and_positions_equal_what_the_reference_feeds( + handle, check2): + """The rendered text, the ids and the mask of each prompt, the prompt + past the token cap included, and the position of every row.""" + from gmlx.image import text_encoder as te + + arrays, m = check2 + spec = handle.spec + ins = m["inputs"] + for key, prompt in ins["prompts"].items(): + assert te.render(spec, prompt) == ins["rendered"][key], key + ids = handle.token_ids(prompt) + want = arrays[f"ids_{key}"].tolist() + assert _padded(spec, ids) == want, key + assert len(want) == spec.max_tokens + mask = arrays[f"mask_{key}"] + assert mask.tolist() == [1] * len(ids) + [0] * (len(want) - len(ids)) + pos = arrays[f"positions_{key}"] + assert pos.shape == (1, len(want)) + assert (pos[0] == np.arange(len(want))).all(), key + assert all(m["results"]["positions_from_the_model"].values()) + rows = ins["rows"] + assert rows["long"]["real"] == rows["long"]["rows"] == 512 + assert rows["one_pad"]["real"] == 511 + assert all(r["rows"] == 512 for r in rows.values()) + + +def _reading(got: np.ndarray, ref: np.ndarray, tol: dict, key: str, + real: int) -> dict: + """The relative L2 over all rows, the real rows and the pad rows, and + the smallest per-token cosine of the real rows, with their gates. + ``real`` is the reference's count of real rows.""" + out = {"rows": int(got.shape[0]), "shape": got.shape, + "want_shape": ref.shape, + "tol_rel_l2": tol["rel_l2"][key], + "tol_rel_l2_real": tol["rel_l2_real"][key], + "tol_rel_l2_pads": tol["rel_l2_pads"].get(key), + "tol_cosine": tol["token_cosine_min"][key]} + if got.shape == ref.shape: + cos = token_cosine(got[:real], ref[:real]) + out.update(rel_l2=fx.rel_l2(got, ref), + rel_l2_real=fx.rel_l2(got[:real], ref[:real]), + token_cosine_min=float(cos.min()), + worst_token=int(cos.argmin())) + if real < ref.shape[0]: + out["rel_l2_pads"] = fx.rel_l2(got[real:], ref[real:]) + return out + + +def _caught(r: dict, ids, want_ids) -> list: + by = [] + if list(ids) != list(want_ids): + by.append("token ids") + if r["shape"] != r["want_shape"]: + by.append("shape") + if "rel_l2" not in r: + return by + if not (r["rel_l2"] <= r["tol_rel_l2"] + and r["rel_l2_real"] <= r["tol_rel_l2_real"]): + by.append("relative L2") + if "rel_l2_pads" in r and not r["rel_l2_pads"] <= r["tol_rel_l2_pads"]: + by.append("pad rows") + if not r["token_cosine_min"] >= r["tol_cosine"]: + by.append("token cosine") + return by + + +def test_features_are_within_the_calibrated_tolerance(handle, check2): + arrays, m = check2 + tol = m["tolerances"] + for key, prompt in m["inputs"]["prompts"].items(): + tap = handle.encode(prompt) + got = np.array(tap.features.astype(mx.float32)) + ref = arrays[f"features_{key}"] + assert tap.features.dtype == mx.float32 + assert len(tap.ids) + tap.pads == ref.shape[0] == 512 + r = _reading(got, ref, tol, key, m["inputs"]["rows"][key]["real"]) + pads = "" + if "rel_l2_pads" in r: + pads = (f", pad rows {r['rel_l2_pads']:.3e} of gate " + f"{r['tol_rel_l2_pads']:.3e}") + print(f"[check2] flux2 {key}: {r['rows']} rows ({tap.pads} pads), " + f"rel L2 {r['rel_l2']:.3e} of gate {r['tol_rel_l2']:.3e}, " + f"real rows {r['rel_l2_real']:.3e} of gate " + f"{r['tol_rel_l2_real']:.3e}, min real token cosine " + f"{r['token_cosine_min']:.6f} floor {r['tol_cosine']:.6f}" + f"{pads}") + assert not _caught(r, [], []), (key, r) + + +def _features(handle, spec, prompt: str, *, layers=None, pads=True, + causal_pads=False, stack=True): + """The features of a prompt with one convention changed. Returns the + ids fed the model and the features.""" + from gmlx.image import text_encoder as te + + ids = te.token_ids(spec, handle.tokenizer, prompt) + n = te.pad_rows(spec, len(ids)) if pads else 0 + layers = layers or spec.tap_layers + if causal_pads: + hs = te.tap(handle.model, ids + [spec.pad_id] * n, layers=layers, + activation=spec.activation) + else: + hs = te.tap(handle.model, ids, layers=layers, + activation=spec.activation, pad=n, pad_id=spec.pad_id, + pad_position=spec.pad_position) + rows = [h[0] for h in hs] + f = mx.concatenate(rows, axis=-1) if stack else rows[0] + return ids + [spec.pad_id] * n, np.array(f.astype(mx.float32)) + + +WRONG = { + "every tap one layer early": ( + lambda h, s, p: _features(h, s, p, layers=tuple( + n - 1 for n in s.tap_layers)), {"relative L2", "token cosine"}), + "the taps in reverse": ( + lambda h, s, p: _features(h, s, p, + layers=tuple(reversed(s.tap_layers))), + {"relative L2", "token cosine"}), + "the first tap alone": ( + lambda h, s, p: _features(h, s, p, stack=False), {"shape"}), + "the pad rows dropped": ( + lambda h, s, p: _features(h, s, p, pads=False), + {"shape", "token ids"}), + "the pads as causal tokens": ( + lambda h, s, p: _features(h, s, p, causal_pads=True), + {"pad rows"}), + "the pads at position 1, as FLUX.3 klein's": ( + lambda h, s, p: _features(h, dataclasses.replace(s, pad_position=1), + p), {"pad rows"}), + "the template with thinking on": ( + lambda h, s, p: _features(h, dataclasses.replace( + s, template="<|im_start|>user\n{}<|im_end|>\n" + "<|im_start|>assistant\n"), p), {"token ids"}), + "a token cap of 256": ( + lambda h, s, p: _features(h, dataclasses.replace( + s, max_tokens=256, pad_multiple=256), p), + {"token ids", "shape"}), +} + + +@pytest.mark.parametrize("name", list(WRONG), + ids=[n.replace(" ", "_").replace(",", "") + .replace("'", "").replace(".", "") + for n in WRONG]) +def test_each_wrong_encoder_fails_a_reading(handle, check2, name): + arrays, m = check2 + make, kinds = WRONG[name] + missed = {} + prompts = m["inputs"]["prompts"] + # The prompts with more than one pad row, past a cap of 256, or with + # the end of the template inside the cap. + pads = ["plain", "empty", "non_ascii"] + keys = {"the pad rows dropped": pads, "the pads as causal tokens": pads, + "the pads at position 1, as FLUX.3 klein's": pads, + "a token cap of 256": ["long", "one_pad"], + "the template with thinking on": [*pads, "one_pad"]}.get( + name, list(prompts)) + for key in keys: + ids, got = make(handle, handle.spec, prompts[key]) + r = _reading(got, arrays[f"features_{key}"], m["tolerances"], key, + m["inputs"]["rows"][key]["real"]) + print(f"[check2] flux2 {name}, {key}: caught by " + f"{_caught(r, ids, arrays[f'ids_{key}'].tolist())}, " + + ", ".join(f"{k} {r[k]:.3e} of {r['tol_' + k]:.3e}" + for k in ("rel_l2", "rel_l2_real", "rel_l2_pads") + if k in r)) + by = _caught(r, ids, arrays[f"ids_{key}"].tolist()) + if not set(by) & kinds: + missed[key] = (by, r) + assert not missed, (name, missed) From 93d2fd2f66fe657e61763baee2a35d79a7d9b3d7 Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 05:59:01 -0700 Subject: [PATCH 006/101] feat(image): flux2 klein schedule and bf16 loop, with the check 4 and check 6 oracles --- gmlx/image/api.py | 4 + gmlx/image/families/flux2_klein/family.py | 29 +- gmlx/image/registry.py | 12 +- gmlx/image/schedule.py | 46 +++ scripts/image_oracle/check4_flux2_klein.py | 108 ++++++ scripts/image_oracle/check6_flux2_klein.py | 391 +++++++++++++++++++++ 6 files changed, 581 insertions(+), 9 deletions(-) create mode 100644 scripts/image_oracle/check4_flux2_klein.py create mode 100644 scripts/image_oracle/check6_flux2_klein.py diff --git a/gmlx/image/api.py b/gmlx/image/api.py index 09202cda3..2a5ad7b1e 100644 --- a/gmlx/image/api.py +++ b/gmlx/image/api.py @@ -1171,6 +1171,8 @@ def sample(pipe: ImagePipeline, cond: Conditioning, *, noise = noise.astype(getattr(mx, rules.noise)).astype(mx.float32) act = (pipe.dit.act_dtype if rules is not None and rules.act_update else None) + held = (pipe.dit.act_dtype + if rules is not None and rules.act_latents else mx.float32) m = None if mask is None else _latent_mask(mask, shape, pipe.vae_scale) x = noise if init is None else noised(s[0], noise, init) @@ -1195,6 +1197,8 @@ def sample(pipe: ImagePipeline, cond: Conditioning, *, x = smp.step(x, v, i) if m is not None: x = inpaint_blend(x, m, noised(s[i + 1], noise, init)) + if held != mx.float32: + x = x.astype(held).astype(mx.float32) mx.eval(x) if on_step is not None: on_step(i, x) diff --git a/gmlx/image/families/flux2_klein/family.py b/gmlx/image/families/flux2_klein/family.py index 628905373..b3807a547 100644 --- a/gmlx/image/families/flux2_klein/family.py +++ b/gmlx/image/families/flux2_klein/family.py @@ -3,8 +3,9 @@ # Ported from BFL's FLUX.2 reference at commit 50fe516: the constants of # Klein4BParams, Klein9BParams and Flux2Params in src/flux2/model.py and # the defaults of FLUX2_MODEL_INFO in src/flux2/util.py, the tensor names -# and shapes of Flux2 in src/flux2/model.py and the prompt rules of -# Qwen3Embedder in src/flux2/text_encoder.py, and modified for gmlx +# and shapes of Flux2 in src/flux2/model.py, the prompt rules of +# Qwen3Embedder in src/flux2/text_encoder.py and the rounding of denoise +# and denoise_cfg in src/flux2/sampling.py, and modified for gmlx # (Apache-2.0; see licenses/flux2-LICENSE). """FLUX.2 klein fingerprint, constants, config synthesis and the hooks of its registry row. @@ -23,8 +24,8 @@ import re from gmlx.image.fingerprint import HeaderView, Match, Refusal -from gmlx.image.registry import (ConstantsRow, Family, SamplingRow, - VariantRow) +from gmlx.image.registry import (ConstantsRow, Family, LoopRules, + SamplingRow, VariantRow) TITLE = "FLUX.2 klein" # What a refusal of another FLUX model names as the ones gmlx image runs. @@ -58,6 +59,8 @@ "eps": 1e-06, # A latent pixel is one 128-channel token: the VAE's 8x and its # 2x2 patchify. The DiT takes the tokens with no patch of its own. + "vae_scale_factor": 16, + "size_multiple": 16, "patch_size": 1, }, repo="black-forest-labs/FLUX.2-klein-4B", @@ -76,6 +79,11 @@ "base": SamplingRow(50, 4.0, 1.0, *_BFL), } +# The loop of denoise and denoise_cfg in src/flux2/sampling.py, on the bf16 +# noise of scripts/cli.py: the latents, the velocity, its guidance and the +# step's product and sum all in bf16. +LOOP = LoopRules(noise="bfloat16", act_update=True, act_latents=True) + # The variants of a size share every shape, so the variant comes from the # hash of the image input projection, which the distillation changed. # Every GGUF of the unsloth repos keeps it BF16. @@ -271,6 +279,17 @@ def fingerprint(view: HeaderView) -> Match | Refusal | None: return Match() +def schedule(steps: int, *, tokens: int | None, variant: str | None = None): + """The sigmas of get_schedule for an image of ``tokens`` latent tokens, + for either variant.""" + from gmlx.image.schedule import flux2_sigmas + + if tokens is None: + raise ValueError(f"the {TITLE} schedule depends on the image token " + f"count; pass tokens") + return flux2_sigmas(steps, tokens) + + def build(config: dict): from .model import Flux2KleinDiT @@ -327,4 +346,6 @@ def synth_config(view: HeaderView) -> dict: identity_tensors=IDENTITY_TENSORS, variants=VARIANTS, sampling=SAMPLING, + schedule=schedule, + loop=LOOP, ) diff --git a/gmlx/image/registry.py b/gmlx/image/registry.py index d0363f09a..5d8b21812 100644 --- a/gmlx/image/registry.py +++ b/gmlx/image/registry.py @@ -68,13 +68,15 @@ class StepParts: class LoopRules: """Where a family's reference sampling loop rounds, when it does not run in float32 throughout. ``noise`` is the dtype the initial noise - is rounded to; the latents stay float32 across the steps. With - ``act_update`` the guided velocity and the Euler product take the - DiT's activation dtype, each op rounded to it as the reference's - tensors of that dtype are, and only the sum with the latents runs in - float32.""" + is rounded to. With ``act_update`` the guided velocity and the Euler + product take the DiT's activation dtype, each op rounded to it as the + reference's tensors of that dtype are, and the sum with the latents + runs in float32. The latents stay float32 across the steps, unless + ``act_latents`` rounds them to the activation dtype after each step, + as a reference that keeps its latents in that dtype does.""" noise: str | None = None act_update: bool = False + act_latents: bool = False @dataclass(frozen=True) diff --git a/gmlx/image/schedule.py b/gmlx/image/schedule.py index b03119813..4d84f20d7 100644 --- a/gmlx/image/schedule.py +++ b/gmlx/image/schedule.py @@ -12,6 +12,10 @@ # flux3_sigmas follows timesteps of src/flux3/sampling.py of BFL's FLUX.3 # klein reference at commit 45e57c9 (Apache-2.0; see # licenses/flux-3-image-klein-LICENSE). +# SPDX-FileCopyrightText: Copyright 2025 Black Forest Labs, Inc. +# flux2_mu and flux2_sigmas follow compute_empirical_mu and get_schedule of +# src/flux2/sampling.py of BFL's FLUX.2 reference at commit 50fe516 +# (Apache-2.0; see licenses/flux2-LICENSE). """Sigma schedules, computed on the host in numpy with float32 results. A schedule is part of a family's numerics, so it must equal the reference @@ -38,6 +42,12 @@ FLUX.3 klein's reference forms ``torch.linspace(1.0, 0.0, n + 1)`` in float32, which ends at zero, and applies the static shift with its alpha, the same for every image size. + +FLUX.2 klein's reference forms the same float32 linspace and shifts it +exponentially by a mu of the image token count and the step count. It +divides Python floats by float32 tensors, which torch forms as the +reciprocal of the tensor times the float, so each such quotient rounds +twice. """ from __future__ import annotations @@ -176,6 +186,42 @@ def flux3_sigmas(steps: int, alpha: float) -> np.ndarray: return shift_static(linspace_f32(1.0, 0.0, steps + 1), alpha) +def flux2_mu(tokens: int, steps: int) -> float: + """mu of the FLUX.2 klein shift, in Python floats and in the + reference's order of operations. Above 4300 image tokens it is a line + in the token count. At 4300 and below it is read at ``steps`` on the + line through the mu of 10 steps and the mu of 200 steps, each a line + in the token count.""" + a1, b1 = 8.73809524e-05, 1.89833333 + a2, b2 = 0.00016927, 0.45666666 + if tokens > 4300: + return float(a2 * tokens + b2) + m200 = a2 * tokens + b2 + m10 = a1 * tokens + b1 + a = (m200 - m10) / 190.0 + b = m200 - 200.0 * a + return float(a * steps + b) + + +def flux2_sigmas(steps: int, tokens: int) -> np.ndarray: + """FLUX.2 klein sigmas for an image of ``tokens`` latent tokens, + length ``steps + 1`` with a final zero. + + ``t = linspace_f32(1.0, 0.0, steps + 1)`` and ``e = exp(mu)`` rounded + to float32 give ``r(1 / (e + (r(1 / t) - 1))) * e``, where ``r(1 / + a)`` is the float32 reciprocal and every other operation is also in + float32. The reciprocal of zero is infinite, so the last sigma is + zero, and the first is 1 or the float32 value next below it. + """ + if steps < 1: + raise ValueError(f"steps must be at least 1, not {steps}") + t = linspace_f32(1.0, 0.0, steps + 1) + e = _F32(math.exp(flux2_mu(tokens, steps))) + with np.errstate(divide="ignore"): + d = _F32(1) / t - _F32(1) + return ((_F32(1) / (e + d)) * e).astype(_F32) + + def check_sigmas(sigmas) -> np.ndarray: """An external schedule as float32, refused unless it is one dimension with at least two values, finite and not increasing.""" diff --git a/scripts/image_oracle/check4_flux2_klein.py b/scripts/image_oracle/check4_flux2_klein.py new file mode 100644 index 000000000..ca791d3c2 --- /dev/null +++ b/scripts/image_oracle/check4_flux2_klein.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python3 +"""Check 4 oracle for FLUX.2 klein: the schedule of BFL's reference. + +get_schedule of src/flux2/sampling.py forms torch.linspace(1, 0, n + 1) in +float32 and shifts it by the mu of compute_empirical_mu, which reads the +image token count and the step count, and both variants take it. For each +step count and token count the fixture holds the float32 schedule, and at +the default step counts of both variants, for the token counts of a 512 +and a 1024 image, the values the samplers read from it: each step's time +as denoise fills its bf16 time tensor, 1000 times that in bf16 as the +embedder reads it, and the step dt, the float32 of the difference of two +times as Python floats, as the bf16 product takes it. gmlx must equal all +of them bit for bit. + + python scripts/image_oracle/run.py --python \\ + check4_flux2_klein.py --reference /src \\ + --reference-commit +""" + +from __future__ import annotations + +import argparse +import sys +from pathlib import Path + +import numpy as np + +import check3_flux2_klein as c3 +import fixtures +import oracle + +NAME = "check4_flux2_klein" +# Every count to 16, the counts users ask for beyond, and the defaults. +STEPS = (*range(1, 17), 20, 24, 28, 32, 40, 50, 64, 100) +# Image token counts: one token, squares of 256 to 4096 pixels, 768 x +# 1344, and 4300 and 4301, where the rule for mu changes, with a 1056 +# pixel square just past it. +TOKENS = (1, 256, 1024, 2304, 4032, 4096, 4300, 4301, 4356, 9216, 16384, + 65536) +CHAIN_STEPS = (4, 50) +CHAIN_TOKENS = (1024, 4096) + + +def chain(torch, schedule: list) -> dict: + """What denoise and denoise_cfg read from ``schedule``, step by step, + as float32 arrays.""" + t_bf16, t1000, dt = [], [], [] + for t_curr, t_prev in zip(schedule[:-1], schedule[1:]): + filled = torch.full((1,), t_curr, dtype=torch.bfloat16) + t_bf16.append(filled.float().item()) + # timestep_embedding of src/flux2/model.py multiplies first. + t1000.append((1000.0 * filled).float().item()) + dt.append(t_prev - t_curr) + return {k: np.asarray(v, np.float32) for k, v in ( + ("t_bf16", t_bf16), ("t1000", t1000), ("dt", dt))} + + +def main(argv=None) -> int: + ap = argparse.ArgumentParser(description=__doc__.split("\n\n")[0]) + ap.add_argument("--reference", type=Path, required=True, + help="src directory of BFL's flux2") + ap.add_argument("--reference-commit", required=True, + help="the commit the reference directory holds") + ap.add_argument("--out", type=Path, + help="fixture directory (default $GMLX_IMAGE_FIXTURES)") + a = ap.parse_args(argv) + torch = oracle.setup() + _, sampling = c3.reference(a.reference.expanduser()) + fx = fixtures.FixtureWriter( + NAME, check=4, family="flux2_klein", + script=f"scripts/image_oracle/{Path(__file__).name}", + argv=[Path(__file__).name]) + mus = {} + for n in STEPS: + rows = [] + for tok in TOKENS: + s = sampling.get_schedule(n, tok) + a32 = np.asarray(s, np.float32) + assert len(s) == n + 1 and np.array_equal( + a32.astype(np.float64), np.asarray(s, np.float64)) + rows.append(a32) + fx.add(f"sigmas_{n}", np.stack(rows)) + mus[str(n)] = [sampling.compute_empirical_mu(t, n) for t in TOKENS] + for n in CHAIN_STEPS: + for tok in CHAIN_TOKENS: + for k, v in chain(torch, sampling.get_schedule(n, tok)).items(): + fx.add(f"{k}_{n}_{tok}", v) + fx.inputs.update( + steps=list(STEPS), tokens=list(TOKENS), mu=mus, + chain_steps=list(CHAIN_STEPS), chain_tokens=list(CHAIN_TOKENS), + reference_commit=a.reference_commit, + schedule="sigmas_ (len(tokens), steps + 1): row i is " + "sampling.get_schedule(steps, tokens[i]), float32 values as " + "the Python floats it returns, ending at zero", + mu_rule="mu[steps][i] is compute_empirical_mu(tokens[i], steps)", + chain="for each step of sampling.denoise and denoise_cfg: t_bf16 " + "the step's time filled into a bf16 tensor, t1000 1000 times " + "that in bf16, dt the float32 of the next time less this one " + "in Python floats") + fx.tolerances.update(sigmas="bitwise", chain="bitwise", + rule="the schedule is exact") + print(f"wrote {fx.write(a.out)}; {len(STEPS) * len(TOKENS)} schedules, " + f"reference {a.reference_commit}") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/image_oracle/check6_flux2_klein.py b/scripts/image_oracle/check6_flux2_klein.py new file mode 100644 index 000000000..c8fd7abc3 --- /dev/null +++ b/scripts/image_oracle/check6_flux2_klein.py @@ -0,0 +1,391 @@ +#!/usr/bin/env python3 +"""Check 6 oracle for FLUX.2 klein: a whole sampling run on injected +noise, to the final latents, for a distilled checkpoint and for Base. + +The run is the text to image path of BFL's scripts/cli.py on the +reference's commit, read from --reference (its src directory), with the +DiT of --dit built as in check3_flux2_klein: the prompt's features, and +for Base the empty prompt's before them, through batched_prc_txt, the +noise in bf16 through batched_prc_img, get_schedule(steps, image tokens), +and sampling.denoise for a distilled checkpoint or sampling.denoise_cfg +for Base. Steps and guidance are the defaults of FLUX2_MODEL_INFO in +src/flux2/util.py for the variant of --variant at the file's size. No +reference images. + +The features are those of --features, the check 2 oracle's float32 +features of the plain prompt and of the empty prompt, rounded to bf16 as +the CLI rounds the encoder's output. The noise is numpy's PCG64 standard +normal for the seed, NCHW, which is how gmlx makes noise from a seed, +rounded to bf16 where the CLI draws it in bf16. + +The bf16 run is the CLI's: the DiT, the latents and every op of the loop +in bfloat16, products as one float32 GEMM over bf16 operands with one +rounding (oracle.emulate_bf16_matmul). The fp32 run keeps the latents and +every op in float32. In both the time goes into the DiT in bf16, as the +CLI fills it from its bf16 latents, and its embedding comes back in bf16. + +One fixture per variant and size holds the noise, the features, the +schedule, the time the DiT saw at each step, the fp32 latents after the +steps of --keep and after the last one, and with a bf16 run the final +bf16 latents and the bf16 against fp32 gap after every step. At GATE_SIZE +the tolerance of gmlx's bf16 latents after a step is twice that gap, so +that size needs a bf16 run. At every other size gmlx's exact fp32 run is +held to EXACT_REL_L2 after each kept step and the last, and its bf16 run +is read against the GATE_SIZE gates. + + python scripts/image_oracle/run.py --python --threads 16 \\ + check6_flux2_klein.py --reference /src \\ + --reference-commit --dit flux-2-klein-4b-Q4_K_M.gguf \\ + --variant distilled --features check2_flux2_klein.npz \\ + --sizes 512 1024 --bf16 512 + +--self-test runs the same path on a stub DiT whose velocity is a table of +the step plus the first text feature less the latents, rounded to bf16, +and keeps the latents after every step, so the gmlx loop can be held to +the reference's arithmetic bit for bit. +""" + +from __future__ import annotations + +import argparse +import sys +import time +import types +from pathlib import Path + +import numpy as np + +import check3_flux2_klein as c3 +import fixtures +import oracle + +NAME = "check6_flux2_klein" +SCRIPT = "scripts/image_oracle/check6_flux2_klein.py" +SEED = 6 +KEEP = {"distilled": (1, 2, 3), "base": (1, 2, 5, 10, 25)} +PROMPT = "plain" +GATE_SIZE = 512 +EXACT_REL_L2 = 1e-3 +RULE = (f"latents after a kept step and after the last. At {GATE_SIZE}: " + "gmlx's bf16 run at relative L2 twice the oracle's own bf16 " + "against fp32 relative L2 after that step. At any other size: " + "gmlx's exact fp32 run against the fp32 latents at exact_rel_l2, " + f"and its bf16 run read as a share of the {GATE_SIZE} gate of the " + "step, not gated") +# The stub run of --self-test: the latent grid and channels, the text +# rows and their width, and the steps of each variant. +STUB = {"latent": (4, 6), "channels": 8, "text": 5, "text_dim": 4, + "steps": {"distilled": 4, "base": 6}} + + +def reference(path: Path): + """The reference's model, sampling and util modules. sampling imports + torchvision for its image preparation, which the run does not use and + the oracle environment lacks, so an empty module stands in while they + import. diffusers and transformers look torchvision up by its spec, + which the stand-in lacks, so the names they give import first, and the + stand-in leaves sys.modules after.""" + from diffusers.quantizers.gguf.utils import GGUFParameter # noqa: F401 + from transformers import (AutoModelForCausalLM, AutoProcessor, # noqa: F401 + AutoTokenizer, Mistral3ForConditionalGeneration, + pipeline) + + sys.dont_write_bytecode = True + sys.path.insert(0, str(path)) + if "torchvision" in sys.modules: + raise SystemExit("error: torchvision is imported") + sys.modules["torchvision"] = types.ModuleType("torchvision") + try: + from flux2 import model, sampling, util + finally: + del sys.modules["torchvision"] + return model, sampling, util + + +def model_info(util, fm, state, variant: str) -> dict: + """The FLUX2_MODEL_INFO row of the file's size and the variant.""" + size = "4b" if c3.params_of(fm, state).hidden_size == 3072 else "9b" + key = (f"flux.2-klein-{size}" if variant == "distilled" + else f"flux.2-klein-base-{size}") + row = util.FLUX2_MODEL_INFO[key] + if row["guidance_distilled"] != (variant == "distilled"): + raise SystemExit(f"error: {key} is not {variant}") + return {"key": key, **row["defaults"]} + + +class Recorded: + """The DiT as denoise calls it. At each call it keeps sample 0's image + latents, the time, the rows and the moment, and passes the time in + bf16, as the CLI fills it from its bf16 latents.""" + + def __init__(self, torch, model, n_img: int): + self.torch, self.model, self.n_img = torch, model, n_img + self.latents, self.times, self.rows, self.marks = [], [], [], [] + + def __call__(self, **kw): + t = kw["timesteps"].to(self.torch.bfloat16) + kw["timesteps"] = t + self.latents.append(oracle.to_numpy(kw["x"][0, :self.n_img])) + self.times.append(float(t[0].float())) + self.rows.append(int(kw["x"].shape[0])) + self.marks.append(time.perf_counter()) + return self.model(**kw) + + +def to_tokens(lat: np.ndarray) -> np.ndarray: + _, c, h, w = lat.shape + return np.ascontiguousarray(lat[0].reshape(c, h * w).T) + + +def to_latents(tok: np.ndarray, h: int, w: int) -> np.ndarray: + return np.ascontiguousarray(tok.T.reshape(1, tok.shape[1], h, w)) + + +def generate(torch, sampling, model, variant: str, feats: dict, + noise: np.ndarray, steps: int, guidance: float, dtype): + """The CLI's text to image path on ``model``, the latents and the + loop in ``dtype``. Returns the latents after every step, the times, + the rows of each call, the seconds of every step and the schedule.""" + _, _, h, w = noise.shape + prompt = torch.from_numpy(feats[PROMPT][None].copy()).to(torch.bfloat16) + if variant == "distilled": + ctx = prompt + else: + empty = torch.from_numpy(feats[""][None].copy()).to(torch.bfloat16) + ctx = torch.cat([empty, prompt], dim=0) + ctx, ctx_ids = sampling.batched_prc_txt(ctx) + randn = torch.from_numpy(noise.copy()).to(torch.bfloat16) + x, x_ids = sampling.batched_prc_img(randn) + timesteps = sampling.get_schedule(steps, x.shape[1]) + rec = Recorded(torch, model, x.shape[1]) + run = sampling.denoise if variant == "distilled" else sampling.denoise_cfg + t0 = time.perf_counter() + out = run(rec, x.to(dtype), x_ids, ctx.to(dtype), ctx_ids, + timesteps=timesteps, guidance=guidance) + end = time.perf_counter() + if len(rec.latents) != steps: + raise SystemExit(f"error: {len(rec.latents)} DiT calls for {steps} " + f"steps") + want = oracle.to_numpy(randn) + if not np.array_equal(to_latents(rec.latents[0], h, w), want): + raise SystemExit("error: the first latents are not the noise " + "rounded to bf16") + after = [to_latents(t, h, w) + for t in rec.latents[1:] + [oracle.to_numpy(out[0])]] + secs = np.diff(np.array([t0, *rec.marks[1:], end])) + return (after, np.float32(rec.times), rec.rows, secs, + np.asarray(timesteps, np.float32)) + + +def check_times(torch, schedule: np.ndarray, times) -> None: + """The times the DiT saw: each the bf16 of its schedule entry.""" + want = oracle.to_numpy(torch.from_numpy(schedule[:-1]).to( + torch.bfloat16)) + if not np.array_equal(times, want): + raise SystemExit("error: the DiT saw times off the schedule") + + +def load_features(torch, path: Path) -> dict: + z = np.load(path) + return {PROMPT: c3.bf16(torch, z["features_plain"]), + "": c3.bf16(torch, z["features_empty"])} + + +# The self-test. + +class StubDiT: + """The velocity of sample s at call k: (table[k] + ctx[s, 0, 0]) less + the latents, rounded to bf16.""" + + def __init__(self, torch, table: np.ndarray): + self.torch, self.step = torch, 0 + self.table = torch.from_numpy(np.stack([to_tokens(t[None]) + for t in table])) + + def __call__(self, *, x, x_ids, timesteps, ctx, ctx_ids, guidance): + torch = self.torch + out = [((self.table[self.step] + ctx[s, 0, 0].float()) - x[s]) + .to(torch.bfloat16) for s in range(x.shape[0])] + self.step += 1 + return torch.stack(out) + + +def self_test(torch, sampling, util, commit: str, a) -> int: + rng = np.random.default_rng(a.seed) + h, w = STUB["latent"] + c = STUB["channels"] + noise = rng.standard_normal((1, c, h, w), dtype=np.float32) + feats = {PROMPT: c3.bf16(torch, rng.standard_normal( + (STUB["text"], STUB["text_dim"]))), + "": c3.bf16(torch, rng.standard_normal( + (STUB["text"], STUB["text_dim"])))} + fx = fixtures.FixtureWriter("selftest_flux2_klein_loop", check=6, + family="flux2_klein", script=SCRIPT) + fx.add("noise", noise) + fx.add("features", feats[PROMPT]) + fx.add("features_empty", feats[""]) + guidance = {} + for variant in ("distilled", "base"): + key = ("flux.2-klein-4b" if variant == "distilled" + else "flux.2-klein-base-4b") + g = util.FLUX2_MODEL_INFO[key]["defaults"]["guidance"] + steps = STUB["steps"][variant] + table = rng.standard_normal((steps, c, h, w), dtype=np.float32) + after, times, rows, _, schedule = generate( + torch, sampling, StubDiT(torch, table), variant, feats, noise, + steps, g, torch.bfloat16) + check_times(torch, schedule, times) + fx.add(f"{variant}_table", table) + fx.add(f"{variant}_schedule", schedule) + fx.add(f"{variant}_times", times) + fx.add(f"{variant}_latents", np.concatenate(after)) + fx.results[variant] = {"steps": steps, "guidance": g, "rows": rows, + "model_info": key} + guidance[variant] = g + fx.inputs.update(stub=STUB, seed=a.seed, reference_commit=commit, + tokens=h * w, + velocity="bf16((table[step] + ctx[s, 0, 0]) - latents) " + "per sample s, its own text", + latents="after every step, (steps, C, h, w) float32") + fx.note("the CLI's text to image path on the stub DiT, the latents in " + "bf16, sampling.denoise for distilled and denoise_cfg for Base " + "with the empty prompt's text in row 0") + path = fx.write(a.out) + print(f"[check6] self-test wrote {path}; guidance {guidance}", flush=True) + return 0 + + +def main(argv=None) -> int: + ap = argparse.ArgumentParser(description=__doc__.split("\n\n")[0]) + ap.add_argument("--reference", type=Path, required=True, + help="src directory of BFL's flux2") + ap.add_argument("--reference-commit", required=True, + help="the commit of --reference, for the manifest") + ap.add_argument("--dit", type=Path, help="FLUX.2 klein DiT GGUF") + ap.add_argument("--variant", choices=("distilled", "base"), + help="the checkpoint --dit holds") + ap.add_argument("--features", type=Path, + help="check 2 .npz with features_plain and " + "features_empty") + ap.add_argument("--sizes", type=int, nargs="+", default=[512]) + ap.add_argument("--bf16", type=int, nargs="*", default=[512], + help="sizes that also run in bf16") + ap.add_argument("--steps", type=int, + help="steps, FLUX2_MODEL_INFO's for the variant when " + "unset") + ap.add_argument("--keep", type=int, nargs="*", + help="steps whose fp32 latents the fixture keeps") + ap.add_argument("--seed", type=int, default=SEED) + ap.add_argument("--dequant", choices=oracle.DEQUANT, default="exact") + ap.add_argument("--name", help="fixture name before the size, " + f"{NAME} or {NAME}_base by the variant when unset") + ap.add_argument("--out", type=Path, + help="fixture directory (default $GMLX_IMAGE_FIXTURES)") + ap.add_argument("--self-test", action="store_true") + a = ap.parse_args(argv) + torch = oracle.setup() + oracle.set_dequant(a.dequant) + fm, sampling, util = reference(a.reference.expanduser()) + commit = a.reference_commit + if a.self_test: + return self_test(torch, sampling, util, commit, a) + if a.dit is None or a.features is None or a.variant is None: + ap.error("--dit, --variant and --features are required") + if any(s % 16 for s in a.sizes) or set(a.bf16) - set(a.sizes): + ap.error("sizes must be multiples of 16, and --bf16 among --sizes") + if GATE_SIZE in a.sizes and GATE_SIZE not in a.bf16: + ap.error(f"the {GATE_SIZE} gate is the bf16 run's gap: pass --bf16 " + f"{GATE_SIZE}") + variant = a.variant + t0 = time.perf_counter() + state, census = c3.gguf_state(torch, a.dit) + info = model_info(util, fm, state, variant) + modes = ("fp32", "bf16") if a.bf16 else ("fp32",) + models = {m: c3.build(torch, fm, state, m) for m in modes} + print(f"[check6] loaded {a.dit.name} ({variant}, {info['key']}) in " + f"{time.perf_counter() - t0:.1f}s, codecs {census}", flush=True) + steps = a.steps or info["num_steps"] + guidance = info["guidance"] + keep = [k for k in (KEEP[variant] if a.keep is None else a.keep) + if k < steps] + feats = load_features(torch, a.features) + name = a.name or (NAME if variant == "distilled" else f"{NAME}_base") + c = c3.params_of(fm, state).in_channels + for size in a.sizes: + n = size // 16 + rng = np.random.Generator(np.random.PCG64(a.seed)) + noise = rng.standard_normal((1, c, n, n), dtype=np.float32) + fx = fixtures.FixtureWriter(f"{name}_{size}", check=6, + family="flux2_klein", script=SCRIPT) + fx.add_file("dit", a.dit) + fx.add_file("features", a.features) + fx.add("noise", noise) + fx.add("features", feats[PROMPT]) + if variant == "base": + fx.add("features_empty", feats[""]) + oracle.emulate_bf16_matmul(False) + after, times, rows, secs, schedule = generate( + torch, sampling, models["fp32"], variant, feats, noise, steps, + guidance, torch.float32) + check_times(torch, schedule, times) + fx.add("schedule", schedule) + fx.add("times", times) + fx.add("latents", after[-1]) + for k in keep: + fx.add(f"latents_step{k}", after[k - 1]) + row = {"fp32_s": round(float(secs.sum()), 1), + "fp32_median_step_s": round(float(np.median(secs)), 2), + "rows": sorted(set(rows))} + print(f"[check6] {variant} {size}: fp32 {row['fp32_s']} s, rows " + f"{row['rows']}", flush=True) + if size in a.bf16: + oracle.emulate_bf16_matmul(True) + try: + after16, times16, _, secs16, _ = generate( + torch, sampling, models["bf16"], variant, feats, noise, + steps, guidance, torch.bfloat16) + finally: + oracle.emulate_bf16_matmul(False) + if not np.array_equal(times16, times): + raise SystemExit("error: the bf16 run saw other times") + fx.add("latents_bf16", after16[-1]) + gap = fixtures.compare(after16[-1], after[-1]) + by_step = [fixtures.rel_l2(x, y) for x, y in zip(after16, after)] + row.update(bf16_s=round(float(secs16.sum()), 1), + latents_bf16_vs_fp32=gap, + bf16_vs_fp32_by_step=by_step) + if size == GATE_SIZE: + fx.tolerances["latents_rel_l2"] = 2 * gap["rel_l2"] + fx.tolerances["by_step_rel_l2"] = [2 * g for g in by_step] + print(f"[check6] {variant} {size}: bf16 {row['bf16_s']} s, final " + f"rel L2 {gap['rel_l2']:.3e}, by step " + f"{[f'{v:.2e}' for v in by_step]}", flush=True) + fx.results.update( + oracle={"device": "cpu", "threads": torch.get_num_threads(), + "dequant": oracle.dequant_mode(), + "bf16_matmul": "bf16 operands, float32 GEMM, one bf16 " + "rounding"}, + run=row) + fx.inputs.update( + size=size, variant=variant, model_info=info["key"], steps=steps, + guidance=guidance, seed=a.seed, bf16=size in a.bf16, + kept_steps=keep, refs=0, tokens=n * n, + noise="numpy Generator(PCG64(seed)).standard_normal(shape, " + "dtype=float32), NCHW, shape (1, 128, size / 16, " + "size / 16); the CLI's noise is bf16, so it is rounded", + features="check2_flux2_klein float32 features_plain, and " + "features_empty for Base, rounded to bf16", + latents="(1, 128, size / 16, size / 16) float32 in the gmlx " + "layout, after the step", + times="the bf16 time the DiT saw at each step, as float32", + reference_commit=commit, gguf_codecs=census) + if size != GATE_SIZE: + fx.tolerances["exact_rel_l2"] = EXACT_REL_L2 + fx.tolerances["rule"] = RULE + path = fx.write(a.out) + print(f"[check6] wrote {path}", flush=True) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) From 12f3440eba07fe23f46d4642a0c13d3bf018a0e6 Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 05:59:01 -0700 Subject: [PATCH 007/101] test(image): flux2 klein check 4 bitwise against the reference schedule, the loop bitwise on a stub --- .../oracle/check4_flux2_klein.manifest.json | 726 ++++++++++++++++++ .../image/oracle/check4_flux2_klein.npz | Bin 0 -> 35234 bytes .../selftest_flux2_klein_loop.manifest.json | 202 +++++ .../oracle/selftest_flux2_klein_loop.npz | Bin 0 -> 19224 bytes tests/image/test_image_check4_flux2_klein.py | 168 ++++ tests/image/test_image_flux2_sampling.py | 146 ++++ 6 files changed, 1242 insertions(+) create mode 100644 tests/fixtures/image/oracle/check4_flux2_klein.manifest.json create mode 100644 tests/fixtures/image/oracle/check4_flux2_klein.npz create mode 100644 tests/fixtures/image/oracle/selftest_flux2_klein_loop.manifest.json create mode 100644 tests/fixtures/image/oracle/selftest_flux2_klein_loop.npz create mode 100644 tests/image/test_image_check4_flux2_klein.py create mode 100644 tests/image/test_image_flux2_sampling.py diff --git a/tests/fixtures/image/oracle/check4_flux2_klein.manifest.json b/tests/fixtures/image/oracle/check4_flux2_klein.manifest.json new file mode 100644 index 000000000..814c8b243 --- /dev/null +++ b/tests/fixtures/image/oracle/check4_flux2_klein.manifest.json @@ -0,0 +1,726 @@ +{ + "schema": 1, + "name": "check4_flux2_klein", + "check": 4, + "family": "flux2_klein", + "script": "scripts/image_oracle/check4_flux2_klein.py", + "argv": [ + "check4_flux2_klein.py" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": {}, + "inputs": { + "steps": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 20, + 24, + 28, + 32, + 40, + 50, + 64, + 100 + ], + "tokens": [ + 1, + 256, + 1024, + 2304, + 4032, + 4096, + 4300, + 4301, + 4356, + 9216, + 16384, + 65536 + ], + "mu": { + "1": [ + 1.966706305839619, + 1.9879993152056084, + 2.052128849296118, + 2.159011406113634, + 2.3033028578172794, + 2.3086469856581564, + 2.3256813931509472, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "2": [ + 1.959119017518817, + 1.9805219306065853, + 2.044982468847394, + 2.1524166992487412, + 2.2974529102905596, + 2.302824621810628, + 2.319946952280842, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "3": [ + 1.9515317291980148, + 1.973044546007562, + 2.0378360883986697, + 2.1458219923838486, + 2.2916029627638395, + 2.2970022579630993, + 2.314212511410737, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "4": [ + 1.9439444408772126, + 1.965567161408539, + 2.0306897079499455, + 2.139227285518956, + 2.2857530152371197, + 2.291179894115571, + 2.3084780705406316, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "5": [ + 1.9363571525564107, + 1.9580897768095158, + 2.0235433275012213, + 2.1326325786540634, + 2.2799030677103995, + 2.2853575302680427, + 2.302743629670526, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "6": [ + 1.9287698642356086, + 1.9506123922104928, + 2.016396947052497, + 2.126037871789171, + 2.2740531201836798, + 2.2795351664205143, + 2.2970091888004207, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "7": [ + 1.9211825759148065, + 1.9431350076114695, + 2.0092505666037725, + 2.119443164924278, + 2.2682031726569596, + 2.2737128025729856, + 2.2912747479303155, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "8": [ + 1.9135952875940043, + 1.9356576230124463, + 2.0021041861550484, + 2.1128484580593856, + 2.2623532251302394, + 2.2678904387254573, + 2.2855403070602103, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "9": [ + 1.9060079992732022, + 1.9281802384134232, + 1.9949578057063244, + 2.106253751194493, + 2.2565032776035197, + 2.262068074877929, + 2.279805866190105, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "10": [ + 1.8984207109524, + 1.9207028538144, + 1.9878114252576, + 2.0996590443296, + 2.2506533300767995, + 2.2562457110304006, + 2.27407142532, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "11": [ + 1.890833422631598, + 1.913225469215377, + 1.9806650448088758, + 2.0930643374647073, + 2.2448033825500797, + 2.2504233471828723, + 2.2683369844498946, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "12": [ + 1.8832461343107958, + 1.9057480846163537, + 1.9735186643601517, + 2.0864696305998147, + 2.2389534350233595, + 2.2446009833353435, + 2.2626025435797894, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "13": [ + 1.8756588459899939, + 1.8982707000173304, + 1.9663722839114275, + 2.079874923734922, + 2.23310348749664, + 2.238778619487815, + 2.256868102709684, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "14": [ + 1.8680715576691918, + 1.8907933154183074, + 1.9592259034627033, + 2.0732802168700295, + 2.2272535399699196, + 2.232956255640287, + 2.251133661839579, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "15": [ + 1.8604842693483896, + 1.8833159308192842, + 1.9520795230139791, + 2.066685510005137, + 2.2214035924431994, + 2.2271338917927586, + 2.2453992209694738, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "16": [ + 1.8528969810275875, + 1.8758385462202611, + 1.944933142565255, + 2.0600908031402443, + 2.2155536449164797, + 2.22131152794523, + 2.239664780099368, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "20": [ + 1.822547827744379, + 1.8459290078241684, + 1.916347620770358, + 2.033711975680674, + 2.1921538548096, + 2.1980220725551165, + 2.216727016618947, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "24": [ + 1.7921986744611706, + 1.8160194694280758, + 1.887762098975461, + 2.0073331482211034, + 2.1687540647027195, + 2.1747326171650028, + 2.1937892531385264, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "28": [ + 1.7618495211779621, + 1.7861099310319832, + 1.8591765771805644, + 1.9809543207615328, + 2.1453542745958396, + 2.151443161774889, + 2.170851489658105, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "32": [ + 1.7315003678947538, + 1.7562003926358907, + 1.8305910553856675, + 1.9545754933019623, + 2.1219544844889597, + 2.1281537063847753, + 2.147913726177684, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "40": [ + 1.670802061328337, + 1.6963813158437053, + 1.7734200117958738, + 1.9018178383828213, + 2.0751549042751996, + 2.081574795604548, + 2.102038199216842, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "50": [ + 1.5949291781203159, + 1.6216074698534737, + 1.7019562073086316, + 1.835870769733895, + 2.016655429008, + 2.0233511571292637, + 2.0446937905157894, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "64": [ + 1.4887071416290865, + 1.5169240854671495, + 1.6019068810264927, + 1.743544873625398, + 1.9347561636339197, + 1.9418380632638657, + 1.9644116183343157, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ], + "100": [ + 1.2155647620802106, + 1.2477382399023158, + 1.3446371848724212, + 1.5061354264892635, + 1.7241580526719997, + 1.7322329647528425, + 1.7579717470105263, + 1.18469693, + 1.19400678, + 2.01665898, + 3.22998634, + 11.54994538 + ] + }, + "chain_steps": [ + 4, + 50 + ], + "chain_tokens": [ + 1024, + 4096 + ], + "reference_commit": "50fe5162777813d869182b139e83b10743caef15", + "schedule": "sigmas_ (len(tokens), steps + 1): row i is sampling.get_schedule(steps, tokens[i]), float32 values as the Python floats it returns, ending at zero", + "mu_rule": "mu[steps][i] is compute_empirical_mu(tokens[i], steps)", + "chain": "for each step of sampling.denoise and denoise_cfg: t_bf16 the step's time filled into a bf16 tensor, t1000 1000 times that in bf16, dt the float32 of the next time less this one in Python floats" + }, + "results": {}, + "tolerances": { + "sigmas": "bitwise", + "chain": "bitwise", + "rule": "the schedule is exact" + }, + "notes": [], + "created": "2026-10-16T12:52:10Z", + "npz": "check4_flux2_klein.npz", + "tensors": { + "dt_4_1024": { + "shape": [ + 4 + ], + "dtype": "float32", + "sha256": "6e02f6306e9c311fd0bdababa73caf824ded78cd74f3c62860ccfe94d38b3373" + }, + "dt_4_4096": { + "shape": [ + 4 + ], + "dtype": "float32", + "sha256": "5b4044ae21df88033c18ccba1112440b2325305c7d2645c476f93da663eff763" + }, + "dt_50_1024": { + "shape": [ + 50 + ], + "dtype": "float32", + "sha256": "89466024bd7cdb5e01886f666da02da88283908fbaf3cacb32456448b00ac502" + }, + "dt_50_4096": { + "shape": [ + 50 + ], + "dtype": "float32", + "sha256": "290fe083914f3b17e35f754baf231c123bc90ac60d18ebd2f7e94e70d261e445" + }, + "sigmas_1": { + "shape": [ + 12, + 2 + ], + "dtype": "float32", + "sha256": "17611c66990ac0ad0f3c118b132e3cedb6d7514a80ce4eb14efb734820284f85" + }, + "sigmas_10": { + "shape": [ + 12, + 11 + ], + "dtype": "float32", + "sha256": "4bf7f92819824a3528e78ebd9ebea020fd695c41512b7ae1619eeedc00ecd1f4" + }, + "sigmas_100": { + "shape": [ + 12, + 101 + ], + "dtype": "float32", + "sha256": "82511061999a5e7b1a81a5b960570f984283085ba4eb52ca17e1918e3b61cca5" + }, + "sigmas_11": { + "shape": [ + 12, + 12 + ], + "dtype": "float32", + "sha256": "f43fb77de7103369972e3d90e85613c564c63d10cd8cf116b1a92acaa335603b" + }, + "sigmas_12": { + "shape": [ + 12, + 13 + ], + "dtype": "float32", + "sha256": "d1a7a52d183517c8c6cdb65cdce6d3396e1a91f2b7b5fdecad37950f98747034" + }, + "sigmas_13": { + "shape": [ + 12, + 14 + ], + "dtype": "float32", + "sha256": "a087e51ecb5adae6b91e184d51edfb0b53a17dcea0679a39e44cb373756f9c48" + }, + "sigmas_14": { + "shape": [ + 12, + 15 + ], + "dtype": "float32", + "sha256": "5a4475f987fe0235ee3730ff28836650c32430a5fc6260e92f676a8d2e0f5ff5" + }, + "sigmas_15": { + "shape": [ + 12, + 16 + ], + "dtype": "float32", + "sha256": "e1e6f2434dd2ee82a89d6b3752a1c503b9a353e6da2b8b25f6447ed3b215c680" + }, + "sigmas_16": { + "shape": [ + 12, + 17 + ], + "dtype": "float32", + "sha256": "b07789b39e3b4b9d53bc8786da553d6b55112d2fc449176bc441d58027c7fd9b" + }, + "sigmas_2": { + "shape": [ + 12, + 3 + ], + "dtype": "float32", + "sha256": "b594880c6234d40a351dfcf54440d154d92c385952890294eff38a1e0bd071dd" + }, + "sigmas_20": { + "shape": [ + 12, + 21 + ], + "dtype": "float32", + "sha256": "97749957acd349533db838b446a0842b565f5e67e568552e9a4c82e4f2bca6d3" + }, + "sigmas_24": { + "shape": [ + 12, + 25 + ], + "dtype": "float32", + "sha256": "69da7aa5fd3ee644425dcdcaf621670a3a594281e5f0bba14b27cfe8c226a825" + }, + "sigmas_28": { + "shape": [ + 12, + 29 + ], + "dtype": "float32", + "sha256": "a15c47132cc5bda7877c64d022b9e2e7f926e7dc9b465ef47706efff4902b909" + }, + "sigmas_3": { + "shape": [ + 12, + 4 + ], + "dtype": "float32", + "sha256": "6482f4fe763b8ae0405534eff58ad9899995c16e4ee87862ad79510c7c9c0e3f" + }, + "sigmas_32": { + "shape": [ + 12, + 33 + ], + "dtype": "float32", + "sha256": "78e9af293460f1f910050f630556c6ebf929f3a802f8aba7319c4c6406d3fe7e" + }, + "sigmas_4": { + "shape": [ + 12, + 5 + ], + "dtype": "float32", + "sha256": "aa150ea0be596e9437e62762d9a87c698e404d30586b5b025666f80e6b5fb1f5" + }, + "sigmas_40": { + "shape": [ + 12, + 41 + ], + "dtype": "float32", + "sha256": "0ba3afb0dfa25b2fa5288e7bd56ff38a4f245430f0cff83a055f76c21a114ea6" + }, + "sigmas_5": { + "shape": [ + 12, + 6 + ], + "dtype": "float32", + "sha256": "3121bf03edd943e1d7723c0bc19b24bd79d140ae11530b9d93380954ff0ad679" + }, + "sigmas_50": { + "shape": [ + 12, + 51 + ], + "dtype": "float32", + "sha256": "ed6ab71a108401f22caacbf2c7f27ff4ae4ebff583dbc65b8c6a790ce9a082ae" + }, + "sigmas_6": { + "shape": [ + 12, + 7 + ], + "dtype": "float32", + "sha256": "2706ae30ede9044e8c9b47a45715579105d0686329c4f4c829f8d271ad3ab43a" + }, + "sigmas_64": { + "shape": [ + 12, + 65 + ], + "dtype": "float32", + "sha256": "359653d175f11cf6f11c552b53ae3685257a445aa9fce9f44ccf32c7912abed2" + }, + "sigmas_7": { + "shape": [ + 12, + 8 + ], + "dtype": "float32", + "sha256": "8422e81288e46f0ca5c34392ab477c6932d5009490f1f91d753aca1f6c33f224" + }, + "sigmas_8": { + "shape": [ + 12, + 9 + ], + "dtype": "float32", + "sha256": "018e6ad84b5973a3bc5d6c82d221b7a7d95b59537f65b6f8cb6578131bea86c3" + }, + "sigmas_9": { + "shape": [ + 12, + 10 + ], + "dtype": "float32", + "sha256": "b6da36b700a5eb19aa473a304cf1d3cfb7444ab8805f10cab36a540cae0d03fe" + }, + "t1000_4_1024": { + "shape": [ + 4 + ], + "dtype": "float32", + "sha256": "3c8f76a13b7d592cde9b9878d9bf70106887034e4c9c90c6f1941779d82591a4" + }, + "t1000_4_4096": { + "shape": [ + 4 + ], + "dtype": "float32", + "sha256": "7818e11e19e753e257b0cb7355b595562452af21e0f95f319f547b1b6dee05ca" + }, + "t1000_50_1024": { + "shape": [ + 50 + ], + "dtype": "float32", + "sha256": "5c276443cd9a1f3bace4dbe2aa1f3a3358894f83beaacf36cbf32fbf11e88af3" + }, + "t1000_50_4096": { + "shape": [ + 50 + ], + "dtype": "float32", + "sha256": "f8d6d98dd330df46dd4cf2b615941b33a43a211be0fef3099f9bc07a2a3e7f99" + }, + "t_bf16_4_1024": { + "shape": [ + 4 + ], + "dtype": "float32", + "sha256": "dc88fa8eb61cc7d72b0f02c6dc49b252aa99e0be170fccf10a05a81e261ec3b1" + }, + "t_bf16_4_4096": { + "shape": [ + 4 + ], + "dtype": "float32", + "sha256": "3dbb533432a33b3793d501553be8eba6200fc0dda87edff05c71d4a1900468be" + }, + "t_bf16_50_1024": { + "shape": [ + 50 + ], + "dtype": "float32", + "sha256": "6f3b5a1e298be3799cf4dd9a1713581c89162c18f0f4a7b2d34273c084c50760" + }, + "t_bf16_50_4096": { + "shape": [ + 50 + ], + "dtype": "float32", + "sha256": "c8e08a1da0f4a3b17d8b56f9136bd303d132b8022a156e1583b7b5ab70577b3d" + } + } +} diff --git a/tests/fixtures/image/oracle/check4_flux2_klein.npz b/tests/fixtures/image/oracle/check4_flux2_klein.npz new file mode 100644 index 0000000000000000000000000000000000000000..90b8bcb1147bfaca0098581200ff485d4e7870db GIT binary patch literal 35234 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 XLvM<`L|PU0R=rg|UdDZ@_^bXu9XClQ literal 0 HcmV?d00001 diff --git a/tests/fixtures/image/oracle/selftest_flux2_klein_loop.manifest.json b/tests/fixtures/image/oracle/selftest_flux2_klein_loop.manifest.json new file mode 100644 index 000000000..72c6624ec --- /dev/null +++ b/tests/fixtures/image/oracle/selftest_flux2_klein_loop.manifest.json @@ -0,0 +1,202 @@ +{ + "schema": 1, + "name": "selftest_flux2_klein_loop", + "check": 6, + "family": "flux2_klein", + "script": "scripts/image_oracle/check6_flux2_klein.py", + "argv": [ + "check6_flux2_klein.py", + "--reference", + "src", + "--reference-commit", + "50fe5162777813d869182b139e83b10743caef15", + "--self-test", + "--out", + "oracle" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": {}, + "inputs": { + "stub": { + "latent": [ + 4, + 6 + ], + "channels": 8, + "text": 5, + "text_dim": 4, + "steps": { + "distilled": 4, + "base": 6 + } + }, + "seed": 6, + "reference_commit": "50fe5162777813d869182b139e83b10743caef15", + "tokens": 24, + "velocity": "bf16((table[step] + ctx[s, 0, 0]) - latents) per sample s, its own text", + "latents": "after every step, (steps, C, h, w) float32" + }, + "results": { + "distilled": { + "steps": 4, + "guidance": 1.0, + "rows": [ + 1, + 1, + 1, + 1 + ], + "model_info": "flux.2-klein-4b" + }, + "base": { + "steps": 6, + "guidance": 4.0, + "rows": [ + 2, + 2, + 2, + 2, + 2, + 2 + ], + "model_info": "flux.2-klein-base-4b" + } + }, + "tolerances": {}, + "notes": [ + "the CLI's text to image path on the stub DiT, the latents in bf16, sampling.denoise for distilled and denoise_cfg for Base with the empty prompt's text in row 0" + ], + "created": "2026-10-16T12:56:07Z", + "npz": "selftest_flux2_klein_loop.npz", + "tensors": { + "base_latents": { + "shape": [ + 6, + 8, + 4, + 6 + ], + "dtype": "float32", + "sha256": "8b8d8762ac5f6f89638471869ce8224accc790a1376b97c5a17c8f26ffa487bd" + }, + "base_schedule": { + "shape": [ + 7 + ], + "dtype": "float32", + "sha256": "720287ff925997176bbff07c3adda0e2c247d81a9a0d285e7f8f8423818dc60c" + }, + "base_table": { + "shape": [ + 6, + 8, + 4, + 6 + ], + "dtype": "float32", + "sha256": "e87c788e8099a412e365636a00e16da84c2617aeeede8cc4059378c70f88bdbd" + }, + "base_times": { + "shape": [ + 6 + ], + "dtype": "float32", + "sha256": "0971ced007a4b41604d83275a6daffecef6492da347ef4dced6162d5f669801f" + }, + "distilled_latents": { + "shape": [ + 4, + 8, + 4, + 6 + ], + "dtype": "float32", + "sha256": "10697066fcf36e2f6891a186ad53215afddadfbedfa25bc9b854d0cc508985dd" + }, + "distilled_schedule": { + "shape": [ + 5 + ], + "dtype": "float32", + "sha256": "5a5708866b27d97358c5756eb0a6ef58a10b838e4092ee306628d8f81504a3bb" + }, + "distilled_table": { + "shape": [ + 4, + 8, + 4, + 6 + ], + "dtype": "float32", + "sha256": "8391cdca1f61c2f6719fcb21e2b0f1a22ff026f765252044d0e02b7dfc60e5cc" + }, + "distilled_times": { + "shape": [ + 4 + ], + "dtype": "float32", + "sha256": "b7c86084180ff734740e668f26e68f42f2797c79d4302fe1385d003ff95f9318" + }, + "features": { + "shape": [ + 5, + 4 + ], + "dtype": "float32", + "sha256": "b675dffd6b0ac13494fb49606655382d67851baec6d1cc698972726634654e66" + }, + "features_empty": { + "shape": [ + 5, + 4 + ], + "dtype": "float32", + "sha256": "37c22c80bda198fbc5517a0d1f3f07c99bab4d9aab492b3ed087c51acd40df0b" + }, + "noise": { + "shape": [ + 1, + 8, + 4, + 6 + ], + "dtype": "float32", + "sha256": "fe4bf9fbc6608cac5cac72839fd25a4cfcca44704bb1c98c8e3fbf1d9a67194b" + } + } +} diff --git a/tests/fixtures/image/oracle/selftest_flux2_klein_loop.npz b/tests/fixtures/image/oracle/selftest_flux2_klein_loop.npz new file mode 100644 index 0000000000000000000000000000000000000000..1037f3eeb38f752df40a78bbd0605bb6cd0fda97 GIT binary patch literal 19224 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 list: + return np.asarray(a, np.float32).view(np.uint32).tolist() + + +def test_the_schedule_is_bitwise_equal_for_both_variants(check4): + arrays, m = check4 + fam = get_family("flux2_klein") + i = m["inputs"] + assert m["tolerances"]["sigmas"] == "bitwise" + assert i["reference_commit"] == REFERENCE_COMMIT + assert len(i["steps"]) == 24 and len(i["tokens"]) == 12 + assert {4300, 4301} <= set(i["tokens"]) + for n in i["steps"]: + rows = arrays[f"sigmas_{n}"] + assert rows.shape == (len(i["tokens"]), n + 1) + for want, tok in zip(rows, i["tokens"]): + for variant in ("distilled", "base"): + got = fam.schedule(n, tokens=tok, variant=variant) + assert got.dtype == np.float32 and got.shape == (n + 1,) + assert _bits(got) == _bits(want), (n, tok, variant) + + +def test_mu_is_the_reference_mu(check4): + from gmlx.image.schedule import flux2_mu + + _, m = check4 + i = m["inputs"] + for n in i["steps"]: + got = [flux2_mu(t, n) for t in i["tokens"]] + assert got == i["mu"][str(n)], n + + +def test_the_ends_of_every_schedule(check4): + """The last sigma is zero and the first is 1 or the float32 below it, + as the reference's reciprocal leaves it; both occur. No sigma rises, + and at 65536 tokens and many steps the shift leaves the first two at + 1, so the first step does not move, in the reference and in gmlx.""" + from gmlx.image.schedule import check_sigmas + + arrays, m = check4 + below = np.nextafter(np.float32(1), np.float32(0)) + firsts, flat = set(), set() + for n in m["inputs"]["steps"]: + rows = arrays[f"sigmas_{n}"] + assert (rows[:, -1] == 0).all() + assert np.isin(rows[:, 0], [np.float32(1), below]).all() + assert (np.diff(rows, axis=1) <= 0).all() + firsts.update(rows[:, 0].tolist()) + for want, tok in zip(rows, m["inputs"]["tokens"]): + assert _bits(check_sigmas(want)) == _bits(want) + if (np.diff(want) == 0).any(): + flat.add(tok) + assert firsts == {1.0, float(below)} + assert flat == {65536} + + +def test_one_quotient_misses_the_reference(check4): + """e / (e + (1 / t - 1)) with one rounding per quotient is not the + reference's schedule: the reciprocal and its product are.""" + import math + + from gmlx.image.schedule import flux2_mu, linspace_f32 + + arrays, m = check4 + i = m["inputs"] + f = np.float32 + miss = 0 + for n in i["steps"]: + for want, tok in zip(arrays[f"sigmas_{n}"], i["tokens"]): + t = linspace_f32(1.0, 0.0, n + 1) + e = f(math.exp(flux2_mu(tok, n))) + with np.errstate(divide="ignore"): + one = (e / (e + (f(1) / t - f(1)))).astype(f) + miss += _bits(one) != _bits(want) + assert miss > len(i["steps"]) * len(i["tokens"]) // 2 + + +def test_the_default_step_counts_are_the_reference_ones(check4): + _, m = check4 + fam = get_family("flux2_klein") + assert (fam.sampling["distilled"].steps, fam.sampling["distilled"].cfg) \ + == (4, 1.0) + assert (fam.sampling["base"].steps, fam.sampling["base"].cfg) \ + == (50, 4.0) + assert m["inputs"]["chain_steps"] == [4, 50] + assert m["inputs"]["chain_tokens"] == [1024, 4096] + + +@pytest.mark.parametrize("steps", [4, 50]) +@pytest.mark.parametrize("tokens", [1024, 4096]) +def test_the_values_the_samplers_read_are_the_reference_ones(check4, steps, + tokens): + """At every step the model's time embedding of the schedule's time is + the embedding of the reference's 1000 times the time, in bf16, and + the Euler step moves by the reference's dt. The time in bf16 is the + reference's too.""" + import mlx.core as mx + + from gmlx.image import ops + from gmlx.image.families.flux2_klein import model as fm + from gmlx.image.samplers import Euler + + arrays, _ = check4 + key = f"{steps}_{tokens}" + sig = get_family("flux2_klein").schedule(steps, tokens=tokens) + assert _bits(fm._bf16(sig[:-1])) == _bits(arrays[f"t_bf16_{key}"]) + t1000 = arrays[f"t1000_{key}"] + euler = Euler(sig, product=mx.bfloat16) + zero, one = mx.zeros((1,), mx.float32), mx.ones((1,), mx.float32) + dt = [] + with mx.stream(mx.cpu): + for i in range(steps): + got = fm.time_embedding(sig[i], 256) + want = ops.timestep_embedding(t1000[i:i + 1], 256) + want = want.astype(mx.bfloat16).astype(mx.float32) + assert mx.array_equal(got, want).item(), i + dt.append(np.array(Euler(sig).step(zero, one, i))[0]) + # The bf16 product of a unit velocity is dt in bf16. + p = np.array(euler.step(zero, one, i))[0] + assert p == float(fm._bf16(np.float32(dt[-1]))[()]), i + assert _bits(dt) == _bits(arrays[f"dt_{key}"]) + + +@pytest.mark.parametrize("variant", ["distilled", "base"]) +def test_the_pipeline_takes_the_family_schedule(variant): + from gmlx.image.api import ImagePipeline + from gmlx.image.schedule import flux2_sigmas + + pipe = ImagePipeline(dit=None, family=get_family("flux2_klein"), + variant=variant) + for tokens in (1024, 4096, 16384): + got = pipe.sigmas(4, tokens=tokens) + assert _bits(got) == _bits(flux2_sigmas(4, tokens)) + assert _bits(pipe.sigmas(4, 1024)) != _bits(pipe.sigmas(4, 4096)) + with pytest.raises(ValueError, match="pass tokens"): + pipe.sigmas(4) + + +def test_flux2_sigmas_refuses_zero_steps(): + from gmlx.image.schedule import flux2_sigmas + + with pytest.raises(ValueError, match="at least 1"): + flux2_sigmas(0, 1024) diff --git a/tests/image/test_image_flux2_sampling.py b/tests/image/test_image_flux2_sampling.py new file mode 100644 index 000000000..3ea65e028 --- /dev/null +++ b/tests/image/test_image_flux2_sampling.py @@ -0,0 +1,146 @@ +"""The FLUX.2 klein sampling loop on the CPU. + +On a stub DiT, gmlx's sample holds bit for bit to the text to image path +of BFL's scripts/cli.py, as scripts/image_oracle/check6_flux2_klein.py +--self-test records it: sampling.denoise for a distilled checkpoint, and +sampling.denoise_cfg for Base, which guides the prompt's row by the empty +prompt's. The reference keeps the latents in bf16, and each loop rule of +the family is needed for that. Every other family's loop rules are +unchanged. +""" +from __future__ import annotations + +import dataclasses +from types import SimpleNamespace + +import mlx.core as mx +import numpy as np +import pytest +from oracle_fixture import committed_fixture + +from gmlx.image import api +from gmlx.image.conditioning import Conditioning +from gmlx.image.registry import LoopRules, families, get_family + +LOOP = "selftest_flux2_klein_loop" + + +@pytest.fixture(scope="module") +def loop(): + return committed_fixture(LOOP) + + +class _Stub: + """The velocity of the self-test's stub: bf16((table[k] + the first + feature) - latents), at the step k whose time is sigma.""" + + def __init__(self, table, schedule): + self.table = [mx.array(t)[None] for t in table] + self.step = {np.float32(s).tobytes(): k + for k, s in enumerate(schedule[:-1])} + assert len(self.step) == len(table) + self.cfg = SimpleNamespace(flow_map=False, + in_channels=table.shape[1], patch=1) + self.act_dtype = mx.bfloat16 + self.calls = [] + + def __call__(self, x, sigma, feats): + k = self.step[np.float32(sigma[0]).tobytes()] + self.calls.append((k, feats.shape[1], float(feats[0, 0, 0]))) + v = (self.table[k] + feats[0, 0, 0]) - x + return v.astype(mx.bfloat16).astype(mx.float32) + + +def _bits(a) -> np.ndarray: + return np.asarray(a, np.float32).view(np.uint32) + + +def _sample(arrays, m, variant: str, family=None): + """Every step's latents of gmlx's sample on the stub, and the stub.""" + fam = family or get_family("flux2_klein") + res = m["results"][variant] + stub = _Stub(arrays[f"{variant}_table"], arrays[f"{variant}_schedule"]) + pipe = api.ImagePipeline(dit=stub, family=fam, variant=variant) + cond = Conditioning(mx.array(arrays["features"])) + neg = (Conditioning(mx.array(arrays["features_empty"])) + if variant == "base" else None) + _, _, h, w = arrays["noise"].shape + after = [] + with mx.stream(mx.cpu): + api.sample(pipe, cond, neg=neg, height=h * 16, width=w * 16, + steps=res["steps"], noise=mx.array(arrays["noise"]), + on_step=lambda i, x: after.append(np.array(x))) + return np.concatenate(after), stub, pipe + + +@pytest.mark.parametrize("variant", ["distilled", "base"]) +def test_the_loop_is_the_reference_loop_bit_for_bit(loop, variant): + arrays, m = loop + res = m["results"][variant] + steps = res["steps"] + schedule = arrays[f"{variant}_schedule"] + got, stub, pipe = _sample(arrays, m, variant) + assert pipe.defaults.cfg == res["guidance"] + tokens = m["inputs"]["tokens"] + assert np.array_equal(_bits(pipe.sigmas(steps, tokens)), _bits(schedule)) + want = arrays[f"{variant}_latents"] + same = [bool(np.array_equal(_bits(g), _bits(w))) + for g, w in zip(got, want)] + assert len(same) == steps and all(same), same + # The latents stay bf16 values after every step. + assert np.array_equal(_bits(got) & 0xFFFF, np.zeros_like(_bits(got))) + plain = float(arrays["features"][0, 0]) + empty = float(arrays["features_empty"][0, 0]) + if variant == "distilled": + assert res["rows"] == [1] * steps + assert [c[0] for c in stub.calls] == list(range(steps)) + assert {c[2] for c in stub.calls} == {plain} + else: + # denoise_cfg runs the empty prompt's row beside the prompt's. + assert res["rows"] == [2] * steps + assert [c[0] for c in stub.calls] == sorted(list(range(steps)) * 2) + assert [c[2] for c in stub.calls] == [plain, empty] * steps + + +@pytest.mark.parametrize("variant", ["distilled", "base"]) +@pytest.mark.parametrize("rules", [ + None, LoopRules(noise=None, act_update=True, act_latents=True), + LoopRules(noise="bfloat16", act_update=False, act_latents=True), + LoopRules(noise="bfloat16", act_update=True, act_latents=False)], + ids=["no rules", "float32 noise", "float32 update", "float32 latents"]) +def test_each_loop_rule_is_needed(loop, variant, rules): + arrays, m = loop + fam = dataclasses.replace(get_family("flux2_klein"), loop=rules) + got, _, _ = _sample(arrays, m, variant, fam) + want = arrays[f"{variant}_latents"] + assert not np.array_equal(_bits(got[-1]), _bits(want[-1])) + + +def test_only_flux2_klein_keeps_its_latents_in_the_activation_dtype(): + rules = {f.name: f.loop for f in families()} + assert rules["flux2_klein"] == LoopRules(noise="bfloat16", + act_update=True, + act_latents=True) + assert rules["flux3_klein"] == LoopRules(noise="bfloat16", + act_update=True) + assert all(r is None or not r.act_latents + for n, r in rules.items() if n != "flux2_klein") + + +def test_an_fp32_run_keeps_fp32_latents(loop): + """With fp32 activations the latents are not rounded, as the oracle's + fp32 run keeps them.""" + arrays, m = loop + stub = _Stub(arrays["distilled_table"], arrays["distilled_schedule"]) + stub.act_dtype = mx.float32 + pipe = api.ImagePipeline(dit=stub, family=get_family("flux2_klein"), + variant="distilled") + _, _, h, w = arrays["noise"].shape + after = [] + with mx.stream(mx.cpu): + api.sample(pipe, Conditioning(mx.array(arrays["features"])), + height=h * 16, width=w * 16, + steps=m["results"]["distilled"]["steps"], + noise=mx.array(arrays["noise"]), + on_step=lambda i, x: after.append(np.array(x))) + assert (_bits(np.concatenate(after)) & 0xFFFF).any() From b06658657ac1dfa96cc8e8147808b9b992f54bbc Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 07:19:23 -0700 Subject: [PATCH 008/101] fix(image): flux2 klein encoder tap casts q, k and v to fp32 before the qk norm, rope and attention --- gmlx/image/families/flux2_klein/family.py | 10 +- gmlx/image/text_encoder.py | 55 +++++++- tests/image/test_image_check2_flux2_klein.py | 4 +- tests/image/test_image_text_encoder.py | 132 +++++++++++++++++++ 4 files changed, 194 insertions(+), 7 deletions(-) diff --git a/gmlx/image/families/flux2_klein/family.py b/gmlx/image/families/flux2_klein/family.py index b3807a547..afddc9177 100644 --- a/gmlx/image/families/flux2_klein/family.py +++ b/gmlx/image/families/flux2_klein/family.py @@ -143,7 +143,14 @@ def encoder(): layers and before its final norm, on the chat template of one user turn with thinking off. The three states of a token are its features side by side, layer by layer, and the 512 rows hold the pad rows the - reference keeps, each at its own position. The tap runs in float32.""" + reference keeps, each at its own position. + + The residual stream and the norms run in float32, and q, k and v are + cast to float32 after their products, so the qk norm, the rotary + embedding and the attention run in float32 too. The products of a + quantized file return bfloat16: the attention's output product and + the feed-forward, its activation included, return bfloat16 to the + float32 residual.""" from gmlx.image.text_encoder import Z_IMAGE, EncoderSpec p = PROMPT.values @@ -163,6 +170,7 @@ def encoder(): pad_multiple=p["max_tokens"], pad_id=p["pad_id"], pad_position=None, + fp32_qkv=True, ) diff --git a/gmlx/image/text_encoder.py b/gmlx/image/text_encoder.py index 836cc6dc4..8d817debf 100644 --- a/gmlx/image/text_encoder.py +++ b/gmlx/image/text_encoder.py @@ -92,6 +92,9 @@ class EncoderSpec: pad_id: int | None = None # token id of the pad rows pad_position: int | None = 1 # rotary position of every pad row, # None for each at its own index + fp32_qkv: bool = False # q, k and v cast to float32 after + # their products, for the qk norm, + # the rotary and the attention @property def template_id(self) -> str: @@ -240,7 +243,8 @@ def _text_stack(model): def tap(model, ids, *, layers: tuple, activation: str | None = None, pad: int = 0, pad_id: int | None = None, - pad_position: int | None = 1) -> list[mx.array]: + pad_position: int | None = 1, + fp32_qkv: bool = False) -> list[mx.array]: """Hidden states after running the first ``n`` decoder layers, for each ``n`` in ``layers``, with no final norm. ``ids`` is one prompt's token ids. Each result is (1, L, hidden) in the model's activation dtype, and @@ -252,7 +256,11 @@ def tap(model, ids, *, layers: tuple, activation: str | None = None, attending to every real token and to no pad row. At a ``pad_position`` they are one row at that rotary position, repeated. With ``pad_position`` None each runs at its own index after the real - tokens.""" + tokens. + + With ``fp32_qkv`` every attention casts its q, k and v products to + float32, so its qk norm, rotary embedding and attention run in + float32 whatever dtype a quantized product returns.""" embed, blocks = _text_stack(model) stops = sorted(set(layers)) if not stops or stops[0] < 1 or stops[-1] > len(blocks): @@ -277,7 +285,8 @@ def tap(model, ids, *, layers: tuple, activation: str | None = None, mask = "causal" if n > 1 else None place = contextlib.nullcontext() out: dict[int, mx.array] = {} - with place: + cast = (float32_qkv(model) if fp32_qkv else contextlib.nullcontext()) + with place, cast: for i in range(stops[-1]): h = blocks[i](h, mask, None) if i + 1 in stops: @@ -289,6 +298,43 @@ def tap(model, ids, *, layers: tuple, activation: str | None = None, return [out[k] for k in layers] +class _Float32Out: + """A product whose output is cast to float32.""" + + def __init__(self, product): + self.product = product + + def __call__(self, x: mx.array) -> mx.array: + return self.product(x).astype(mx.float32) + + +_QKV = ("q_proj", "k_proj", "v_proj") + + +@contextlib.contextmanager +def float32_qkv(model): + """Run a tap with each attention's q, k and v products cast to + float32, and restore the products after.""" + _, blocks = _text_stack(model) + found = [] + for b in blocks: + attn = getattr(b, "self_attn", None) + products = [getattr(attn, name, None) for name in _QKV] + if any(p is None for p in products): + raise TypeError(f"{type(b).__name__} has no self_attn q_proj, " + "k_proj and v_proj to cast") + found.append((attn, products)) + try: + for attn, products in found: + for name, p in zip(_QKV, products): + setattr(attn, name, _Float32Out(p)) + yield + finally: + for attn, products in found: + for name, p in zip(_QKV, products): + setattr(attn, name, p) + + class _PadRope: """A rotary embedding that rotates the last of ``n + 1`` rows at the pad position and the others as the wrapped one does.""" @@ -593,7 +639,8 @@ def encode(self, prompt: str) -> TextTap: with vision_rope(self.model, spec): hidden = tap(self.model, ids, layers=spec.tap_layers, activation=spec.activation, pad=pads, - pad_id=spec.pad_id, pad_position=spec.pad_position) + pad_id=spec.pad_id, pad_position=spec.pad_position, + fp32_qkv=spec.fp32_qkv) mx.eval(hidden) return TextTap(ids=tuple(ids), hidden=tuple(hidden), template_id=spec.template_id, diff --git a/tests/image/test_image_check2_flux2_klein.py b/tests/image/test_image_check2_flux2_klein.py index 9821d0d25..f7f45b4da 100644 --- a/tests/image/test_image_check2_flux2_klein.py +++ b/tests/image/test_image_check2_flux2_klein.py @@ -177,11 +177,11 @@ def _features(handle, spec, prompt: str, *, layers=None, pads=True, layers = layers or spec.tap_layers if causal_pads: hs = te.tap(handle.model, ids + [spec.pad_id] * n, layers=layers, - activation=spec.activation) + activation=spec.activation, fp32_qkv=spec.fp32_qkv) else: hs = te.tap(handle.model, ids, layers=layers, activation=spec.activation, pad=n, pad_id=spec.pad_id, - pad_position=spec.pad_position) + pad_position=spec.pad_position, fp32_qkv=spec.fp32_qkv) rows = [h[0] for h in hs] f = mx.concatenate(rows, axis=-1) if stack else rows[0] return ids + [spec.pad_id] * n, np.array(f.astype(mx.float32)) diff --git a/tests/image/test_image_text_encoder.py b/tests/image/test_image_text_encoder.py index b3630054d..3c7f9159a 100644 --- a/tests/image/test_image_text_encoder.py +++ b/tests/image/test_image_text_encoder.py @@ -12,6 +12,7 @@ import pytest import mlx.core as mx +import mlx.nn as nn from image_fixtures import FIXTURES, load_json @@ -846,6 +847,137 @@ def __call__(self, x, mask, cache): te.tap(m, [3, 17], layers=(4,)) +class _Bf16Product(nn.Module): + """A product that returns bfloat16 whatever its input, as a Q8_0 + KQuantLinear does on a float32 input.""" + + def __init__(self, inner): + super().__init__() + self.inner = inner + + def __call__(self, x): + return self.inner(x).astype(mx.bfloat16) + + +class _Float32Product(nn.Module): + def __init__(self, inner): + super().__init__() + self.inner = inner + + def __call__(self, x): + return self.inner(x).astype(mx.float32) + + +def _bf16_products(m): + """The tiny model as a quantized file loads: bf16 weights, so bf16 + norm scales, and products that return bf16.""" + m.set_dtype(mx.bfloat16) + for b in m.model.layers: + for o, names in ((b.self_attn, ("q_proj", "k_proj", "v_proj", + "o_proj")), + (b.mlp, ("gate_proj", "up_proj", "down_proj"))): + for name in names: + setattr(o, name, _Bf16Product(getattr(o, name))) + + +def test_fp32_qkv_runs_the_qk_norm_rope_and_attention_in_float32( + monkeypatch): + from gmlx._vendor.mlx_lm.models import qwen3 + + m, _ = _tiny_qwen3() + _bf16_products(m) + seen = [] + sdpa = qwen3.scaled_dot_product_attention + + def spy(q, k, v, **kw): + seen.append((q.dtype, k.dtype, v.dtype)) + return sdpa(q, k, v, **kw) + + monkeypatch.setattr(qwen3, "scaled_dot_product_attention", spy) + products = [[getattr(b.self_attn, n) for n in te._QKV] + for b in m.model.layers] + ids = [3, 17, 42, 5] + kw = dict(layers=(2, 4), activation="float32", pad=3, pad_id=9, + pad_position=None) + plain = te.tap(m, ids, **kw) + assert len(seen) == 4 and set(seen) == {(mx.bfloat16,) * 3} + seen.clear() + cast = te.tap(m, ids, fp32_qkv=True, **kw) + assert len(seen) == 4 and set(seen) == {(mx.float32,) * 3} + assert all(getattr(b.self_attn, n) is p + for b, ps in zip(m.model.layers, products) + for n, p in zip(te._QKV, ps)) + for a, b in zip(plain, cast): + assert a.dtype == b.dtype == mx.float32 + assert not mx.array_equal(a, b).item() + # The cast tap is the tap of a model whose q, k and v products return + # float32 after their own rounding, and the other products are as + # they were. + for b in m.model.layers: + for n in te._QKV: + setattr(b.self_attn, n, _Float32Product(getattr(b.self_attn, n))) + for a, b in zip(cast, te.tap(m, ids, **kw)): + assert mx.array_equal(a, b).item() + # The products are restored after a tap that raises, and a block with + # no products to cast swaps none. + m2, _ = _tiny_qwen3() + before = [[getattr(b.self_attn, n) for n in te._QKV] + for b in m2.model.layers] + + def same(): + return all(getattr(b.self_attn, n) is p + for b, ps in zip(m2.model.layers, before) + for n, p in zip(te._QKV, ps)) + + with pytest.raises(RuntimeError, match="boom"): + with te.float32_qkv(m2): + assert all(isinstance(b.self_attn.q_proj, te._Float32Out) + for b in m2.model.layers) + raise RuntimeError("boom") + assert same() + + class _NoAttention: + def __call__(self, x, mask, cache): + return x + + keep = m2.model.layers[2] + m2.model.layers[2] = _NoAttention() + with pytest.raises(TypeError, match="_NoAttention has no self_attn"): + te.tap(m2, ids, layers=(4,), fp32_qkv=True) + m2.model.layers[2] = keep + assert same() + + +def test_an_encoding_casts_qkv_only_when_its_spec_says(): + m, _ = _tiny_qwen3() + _bf16_products(m) + tok = _CharTokenizer() + spec = _spec(tap=(1, 3), stack=True, pad_multiple=8, pad_id=9, + max_tokens=24, pad_position=None) + got = {} + for flag in (False, True): + s = dataclasses.replace(spec, fp32_qkv=flag) + enc = te.EncoderHandle(m, tok, s, owned=False).encode("ab") + want = te.tap(m, list(enc.ids), layers=(1, 3), pad=enc.pads, + pad_id=9, pad_position=None, fp32_qkv=flag) + assert mx.array_equal(enc.features, + mx.concatenate([w[0] for w in want], -1)).item() + assert enc.template_id == spec.template_id + got[flag] = enc.features + assert not mx.array_equal(got[False], got[True]).item() + + +def test_only_the_flux2_spec_casts_qkv(): + specs = {} + for fam in registry.families(): + try: + specs[fam.name] = te.encoder_spec(fam) + except te.ImageModelError: + continue + assert {n for n, s in specs.items() if s.fp32_qkv} == {"flux2_klein"} + assert len(specs) > 1 + + def test_an_encoding_keeps_its_pad_rows(): m, _ = _tiny_qwen3() tok = _CharTokenizer() From 1c41cd5622cd2cacbb9ef6264b1808942a3d08ab Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 07:19:31 -0700 Subject: [PATCH 009/101] fix(image): flux2 klein dit config has its patch of one latent pixel, so a pipeline samples --- gmlx/image/families/flux2_klein/model.py | 2 ++ tests/image/test_image_flux2_model.py | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/gmlx/image/families/flux2_klein/model.py b/gmlx/image/families/flux2_klein/model.py index 66b6a95c6..8b1dcc3a2 100644 --- a/gmlx/image/families/flux2_klein/model.py +++ b/gmlx/image/families/flux2_klein/model.py @@ -71,6 +71,8 @@ class Flux2Config: axes_dims: tuple theta: float eps: float + # A latent pixel is one token: the DiT has no patch of its own. + patch: int = 1 @classmethod def from_dict(cls, c: dict) -> "Flux2Config": diff --git a/tests/image/test_image_flux2_model.py b/tests/image/test_image_flux2_model.py index df667afa2..2e9e2b0e6 100644 --- a/tests/image/test_image_flux2_model.py +++ b/tests/image/test_image_flux2_model.py @@ -198,6 +198,27 @@ def test_a_batch_of_two_gives_each_row_its_own_velocity(tiny): assert mx.allclose(two[1:], other, atol=1e-5).item() +def test_a_pipeline_samples_on_the_grid_of_one_latent_pixel(tiny): + """A latent pixel is one token, so the DiT has no patch of its own: + sizes are multiples of the VAE's 16 pixels, and a 32 x 48 request + samples a 2 x 3 latent grid.""" + from gmlx.image import api + from gmlx.image.conditioning import Conditioning + + weights, cfg = tiny + arrays, _ = committed_fixture(TINY) + model = fg.tiny_model(weights, cfg, act=mx.bfloat16) + pipe = api.ImagePipeline(dit=model, family=get_family("flux2_klein"), + variant="distilled") + assert model.cfg.patch == 1 and pipe.size_multiple == 16 + cond = Conditioning(mx.array(arrays["features"]), "tiny") + x = api.sample(pipe, cond, height=32, width=48, seed=0, steps=2) + assert x.shape == (1, model.cfg.in_channels, 2, 3) + assert bool(mx.isfinite(x).all().item()) + with pytest.raises(ValueError, match="multiples of 16"): + api.sample(pipe, cond, height=40, width=48, seed=0, steps=2) + + def test_float16_is_refused(tiny): weights, cfg = tiny model = fg.tiny_model(weights, cfg) From c2cf43689b89228cf128d3d23191c782e59671a8 Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 07:19:37 -0700 Subject: [PATCH 010/101] test(image): flux2 klein tiny key norm scales apart from the query's, and the scale swap fault --- scripts/image_oracle/check3_flux2_klein.py | 8 +- .../selftest_flux2_klein_tiny.manifest.json | 104 +++++++++--------- .../oracle/selftest_flux2_klein_tiny.npz | Bin 91178 -> 91178 bytes ...test_flux2_klein_tiny_norefs.manifest.json | 104 +++++++++--------- .../selftest_flux2_klein_tiny_norefs.npz | Bin 74850 -> 74850 bytes ...est_flux2_klein_tiny_weights.manifest.json | 14 +-- .../selftest_flux2_klein_tiny_weights.npz | Bin 1661766 -> 1661766 bytes tests/image/test_image_flux2_model.py | 8 +- 8 files changed, 125 insertions(+), 113 deletions(-) diff --git a/scripts/image_oracle/check3_flux2_klein.py b/scripts/image_oracle/check3_flux2_klein.py index 0d82797ed..f4fec6276 100644 --- a/scripts/image_oracle/check3_flux2_klein.py +++ b/scripts/image_oracle/check3_flux2_klein.py @@ -412,7 +412,11 @@ def seeded(torch, rng, shape, std=1.0) -> np.ndarray: def tiny_state(torch, fm, params, seed: int) -> dict: """Random tiny weights by name, float32 numpy in torch order: norm - scales near one, matrices at 1 / sqrt(fan in).""" + scales near one, matrices at 1 / sqrt(fan in). The key norm scales + are then 1.5 times their draw at even indices and 1 / 1.5 times at odd + ones. A swap of the query and key scales changes the logits only + through the cross terms of each rotary pair, so the key scales differ + from the query scales inside each pair.""" with torch.device("meta"): model = fm.Flux2(params) rng = np.random.default_rng(seed) @@ -421,6 +425,8 @@ def tiny_state(torch, fm, params, seed: int) -> dict: shape = tuple(p.shape) if name.endswith(".scale"): v = 1 + rng.standard_normal(shape) * 0.2 + if name.endswith("key_norm.scale"): + v = v * np.where(np.arange(shape[-1]) % 2 == 0, 1.5, 1 / 1.5) else: v = rng.standard_normal(shape) / np.sqrt(shape[-1]) out[name] = v.astype(np.float32) diff --git a/tests/fixtures/image/oracle/selftest_flux2_klein_tiny.manifest.json b/tests/fixtures/image/oracle/selftest_flux2_klein_tiny.manifest.json index d3e05b0ed..c489ab252 100644 --- a/tests/fixtures/image/oracle/selftest_flux2_klein_tiny.manifest.json +++ b/tests/fixtures/image/oracle/selftest_flux2_klein_tiny.manifest.json @@ -95,9 +95,9 @@ }, "results": { "velocity_bf16_vs_fp32": { - "rel_l2": 0.0063506451997405525, - "cosine": 0.9999803156128745, - "max_abs": 0.023116111755371094 + "rel_l2": 0.0062468351018711, + "cosine": 0.9999814549541527, + "max_abs": 0.026412010192871094 }, "rows_bf16_vs_fp32": { "vec": { @@ -137,39 +137,39 @@ "teacher_forced": false }, "double_blocks.0.img": { - "rel_l2": 0.0032043115656396164, - "cosine": 0.9999948686511482, - "max_abs": 0.023833274841308594, + "rel_l2": 0.003154067587353027, + "cosine": 0.9999950331330437, + "max_abs": 0.02054595947265625, "teacher_forced": true }, "double_blocks.0.txt": { - "rel_l2": 0.002967357239521432, - "cosine": 0.9999955980347915, - "max_abs": 0.03692913055419922, + "rel_l2": 0.002675955625034365, + "cosine": 0.999996447022459, + "max_abs": 0.02823162078857422, "teacher_forced": true }, "double_blocks.1.img": { - "rel_l2": 0.0031024928461431235, - "cosine": 0.999995195561846, - "max_abs": 0.017305850982666016, + "rel_l2": 0.003053385500496127, + "cosine": 0.9999953396275552, + "max_abs": 0.016620874404907227, "teacher_forced": true }, "double_blocks.1.txt": { - "rel_l2": 0.002950988169627837, - "cosine": 0.9999956461837226, - "max_abs": 0.03692483901977539, + "rel_l2": 0.003001179731981744, + "cosine": 0.9999954983556271, + "max_abs": 0.03304338455200195, "teacher_forced": true }, "single_blocks.0": { - "rel_l2": 0.0025329813293491522, - "cosine": 0.9999967947671438, - "max_abs": 0.026701927185058594, + "rel_l2": 0.002477751418952348, + "cosine": 0.999996931464018, + "max_abs": 0.024991512298583984, "teacher_forced": true }, "single_blocks.1": { - "rel_l2": 0.0024883959795424493, - "cosine": 0.999996906097007, - "max_abs": 0.02818584442138672, + "rel_l2": 0.002381827196450496, + "cosine": 0.999997167606257, + "max_abs": 0.023763656616210938, "teacher_forced": true }, "final_layer.adaLN_modulation": { @@ -179,20 +179,20 @@ "teacher_forced": false }, "final_layer": { - "rel_l2": 0.0036409988368653833, - "cosine": 0.9999936639152218, - "max_abs": 0.016054153442382812, + "rel_l2": 0.003979171784932159, + "cosine": 0.9999921158236452, + "max_abs": 0.014881610870361328, "teacher_forced": true } }, "free_bf16_vs_fp32": { - "double_blocks.0.img": 0.0037090958406877992, - "double_blocks.0.txt": 0.0032062588891522826, - "double_blocks.1.img": 0.004573847286382772, - "double_blocks.1.txt": 0.003961564243362384, - "single_blocks.0": 0.004671627934894035, - "single_blocks.1": 0.005149206544449982, - "final_layer": 0.0063506451997405525 + "double_blocks.0.img": 0.0036045740937670125, + "double_blocks.0.txt": 0.0031531205718257674, + "double_blocks.1.img": 0.004371857635555795, + "double_blocks.1.txt": 0.00417435202442174, + "single_blocks.0": 0.004665581427916114, + "single_blocks.1": 0.005113604739533443, + "final_layer": 0.0062468351018711 }, "times": { "fp32_s": 0.0, @@ -202,8 +202,8 @@ }, "tolerances": { "velocity": { - "rel_l2": 0.012701290399481105, - "cosine_min": 0.9999212624514979 + "rel_l2": 0.0124936702037422, + "cosine_min": 0.9999258198166108 }, "vec": { "rel_l2": 0.008413040294515539, @@ -230,27 +230,27 @@ "teacher_forced": false }, "double_blocks.0.img": { - "rel_l2": 0.006408623131279233, + "rel_l2": 0.006308135174706054, "teacher_forced": true }, "double_blocks.0.txt": { - "rel_l2": 0.005934714479042864, + "rel_l2": 0.00535191125006873, "teacher_forced": true }, "double_blocks.1.img": { - "rel_l2": 0.006204985692286247, + "rel_l2": 0.006106771000992254, "teacher_forced": true }, "double_blocks.1.txt": { - "rel_l2": 0.005901976339255674, + "rel_l2": 0.006002359463963488, "teacher_forced": true }, "single_blocks.0": { - "rel_l2": 0.0050659626586983045, + "rel_l2": 0.004955502837904696, "teacher_forced": true }, "single_blocks.1": { - "rel_l2": 0.004976791959084899, + "rel_l2": 0.004763654392900992, "teacher_forced": true }, "final_layer.adaLN_modulation": { @@ -258,7 +258,7 @@ "teacher_forced": false }, "final_layer": { - "rel_l2": 0.007281997673730767, + "rel_l2": 0.007958343569864319, "teacher_forced": true }, "rule": "tolerance = 2 x the oracle's own bf16 against fp32 relative L2: teacher-forced for each block and the final layer, free running for the time vector, modulations and embeddings and for the velocity" @@ -266,7 +266,7 @@ "notes": [ "the weights are in selftest_flux2_klein_tiny_weights by GGUF name in torch order" ], - "created": "2026-10-16T11:56:33Z", + "created": "2026-10-16T13:40:10Z", "npz": "selftest_flux2_klein_tiny.npz", "tensors": { "double_blocks.0.img": { @@ -275,7 +275,7 @@ 64 ], "dtype": "float32", - "sha256": "e0de53727b78bc60bab27e5d8a18d99affbdb0c78825562ec9308c93d42a34c3" + "sha256": "d2870817b46d634a7f84154214dec73cdcb01e2f582212e818cc00a089d92178" }, "double_blocks.0.txt": { "shape": [ @@ -283,7 +283,7 @@ 64 ], "dtype": "float32", - "sha256": "376de4e8ff7523d7a2bf2c7daf4962c3a8bd3f31c22ccb7fae6cebce9f709db3" + "sha256": "01d4e174f17a05b5f676dea9afd846195c312d0905666b5e373f36e80d35dd85" }, "double_blocks.1.img": { "shape": [ @@ -291,7 +291,7 @@ 64 ], "dtype": "float32", - "sha256": "afa87dde36834b760bb84e634ead906638a674d7a5bcb095694de3a4b75ec24c" + "sha256": "ccd04b4ca63cfccc9154b10eab51acb7fd3721a5431ba12da715b9b1872179fd" }, "double_blocks.1.txt": { "shape": [ @@ -299,7 +299,7 @@ 64 ], "dtype": "float32", - "sha256": "dbf3d01263462c18d6aafe605dcee71faf8c921b3565e7118b7952a2c6ee729a" + "sha256": "089103aabb2adb91f9b28e291dcd56798bb6a834adab8878cd7b7ced87aacd1a" }, "double_stream_modulation_img": { "shape": [ @@ -331,7 +331,7 @@ 8 ], "dtype": "float32", - "sha256": "253c35c22d48d67d78b7b623c51ac63af328f6d3514e758e7b7eb17dae61c41f" + "sha256": "4d49f2f707db7321d177d5acd570cb4d80b5d97535faeb0cb560981bb369d21f" }, "final_layer.adaLN_modulation": { "shape": [ @@ -371,7 +371,7 @@ 64 ], "dtype": "float32", - "sha256": "1faef858fda29ff0e026058ac95a22b7c5105daee09b2f57d5d50c063eee4c19" + "sha256": "bb53581ff02acebc263a5894865170557a4f86db15c1f104ec7fd472ba046898" }, "in.single_blocks.0": { "shape": [ @@ -379,7 +379,7 @@ 64 ], "dtype": "float32", - "sha256": "72ad79b0b43eb16b99f4bdd4c5c42adb665cbf7a8ec2d72b8eab2084158e9526" + "sha256": "6a3a3ddfddf3e8a007902e90cc94f2d1fbd4e76d846f1629a985e150ca55ca88" }, "in.time_in": { "shape": [ @@ -430,7 +430,7 @@ 64 ], "dtype": "float32", - "sha256": "cfcd18aedee217e46fc7f41a9fe788aa79072f996576893e39691b0531e1db4f" + "sha256": "c5faf7f2905fbefdc4c911db3aa71e962ec4f401550854090114012a7eed3f46" }, "single_blocks.1": { "shape": [ @@ -438,7 +438,7 @@ 64 ], "dtype": "float32", - "sha256": "f36f2281191dea935ab006c224902cd548d4cba21517d12e2c238bddd91dd3d9" + "sha256": "08a99c46ceaad73ceb05f1cb67296214d4764724a6f0af1b2bcc13957ad9e257" }, "single_stream_modulation": { "shape": [ @@ -472,7 +472,7 @@ 6 ], "dtype": "float32", - "sha256": "44cfe1ba5c74f7452aa9355a2747e012a4c6057bbfcb574e569aca91e53793d4" + "sha256": "6baffac4b461a23f96080fe4fbf767c484e6669217a528d41314626fa18aa67b" }, "velocity_bf16": { "shape": [ @@ -482,7 +482,7 @@ 6 ], "dtype": "float32", - "sha256": "1341b5a2d60b42820839a0b47ec77ede4e0418e50dda3552c1ff73bbf513a21a" + "sha256": "c2b0d6d59eff38e51f637d26f2e23ed2320cc638ff07aa1b0285dbd45e7656cd" } } } diff --git a/tests/fixtures/image/oracle/selftest_flux2_klein_tiny.npz b/tests/fixtures/image/oracle/selftest_flux2_klein_tiny.npz index bf35dde5b149689723cf6d46d7cda887edfcbfca..1268443974292d03eced93141570fcb304999d7e 100644 GIT binary patch delta 65707 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 Rve8pC=Kufx-g}C|{{e@_2GIZj delta 65707 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 delta 52747 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

$nZa!f}v>!b8Kd+h-|ddn(+$o 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 delta 703 zcmXBSYeIA#c0szk&UMWfWI7!xJcSTIyT;C2IT9~qnpufyC_Cpe#K z$U1tEZ871)%|f(VM9|BE_{3I%;$%UB+IVW$Sivt_aWOlUC-7i5m4bF$JJ^JgBXYcn zGQdB*0E!SZp4FE_{Imf*uagm%mJ4ZQAqJAQFdA!-^{Ek$pBF=Z;68LeuIiWa1%wmf z%q``+)WuWgd+$bUT>{w4-7X?_FqQUVHJjcIvRBhB2sW1^Tnc=iuf+bJM-ds7i~8#o zu%7dW`-&2(m2NcmH{-8Tfu6-8Of;GCWxWa+`=X&|EG~pAv5jLaLNbw`X7QM#S716V zWcREI1&*=k?z1?wvkWgT8L*JX;5RGA#aSbCehk>a0vMUQkZjg~irkCLP&sDao51^; z1Z{8%=2o?OsZ~h05$=Qsv7M7zMVX_N;mM!dEHmgij(T||w2PI98Z{#9Upo*{jd4i{ zCLfhR7+r+n-UrBvslci8YP9EfLD{cG-i3#lT5mOE;o*|%$t Yhtuf@zI}9VJ%di<* Date: Fri, 16 Oct 2026 07:19:38 -0700 Subject: [PATCH 011/101] docs(image): flux2 notices row, license lines for the schedule and the check 3 test --- THIRD_PARTY_NOTICES.md | 1 + licenses/flux2-LICENSE | 10 ++++++++-- tests/image/test_image_check3_flux2_klein.py | 5 +++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index 539ad3ff6..f32041ca1 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -22,6 +22,7 @@ in [`licenses/`](licenses/). | [mflux](https://github.com/filipstrand/mflux) | MIT | The Z-Image transformer at commit `e066d98`, ported to `gmlx/image/families/z_image/model.py` with the fused qkv kept and modules named after the GGUF tensors, and its attention, timestep and RoPE helpers in `gmlx/image/ops/attention.py` and `gmlx/image/ops/embeds.py`. | | [diffusers](https://github.com/huggingface/diffusers) | Apache-2.0 | Code at commit `e0abab8`, ported to MLX and modified for gmlx: the Z-Image forward of `transformer_z_image.py` in `gmlx/image/families/z_image/model.py`, its timestep embedding, RoPE tables and rotary product in `gmlx/image/ops/embeds.py` and `gmlx/image/ops/attention.py`, the RMSNorm rounding of `normalization.py` in `gmlx/image/ops/norms.py`, and the FLUX.1 autoencoder of `autoencoders/vae.py`, `resnet.py`, `unet_2d_blocks.py`, `downsampling.py`, `upsampling.py` and `attention_processor.py` in `gmlx/image/vae/flux1_ae.py`, the quant convs and BatchNorm statistics of `autoencoders/autoencoder_kl_flux2.py` in `gmlx/image/vae/flux2_ae.py`, the Qwen-Image 2.1 autoencoder of `autoencoders/autoencoder_kl_qwenimage21.py`, for one frame, in `gmlx/image/vae/qwen_image21_vae.py`, and the UniPC bh2 sampler of `schedulers/scheduling_unipc_multistep.py` in `gmlx/image/unipc.py`. Also the Qwen-Image 2.1 forward, token layout and RoPE of `transformer_qwenimage21.py` in `gmlx/image/families/qwen_image21/model.py` and `layout.py`, and the dynamic shift of `pipelines/qwenimage21/pipeline_qwenimage21.py` and `schedulers/scheduling_flow_match_euler_discrete.py` in `gmlx/image/schedule.py`, and the reference image sizes, the prompt template with image slots and the image branch of the encoder tap of that pipeline in `gmlx/image/families/qwen_image21/edit.py`. For Krea 2, at the same commit: the forward of `transformer_krea2.py` in `gmlx/image/families/krea2/model.py`, the Qwen-Image autoencoder of `autoencoders/autoencoder_kl_qwenimage.py`, for one frame, in `gmlx/image/vae/qwen_image_vae.py`, the prompt template, encoder layers and constants of `pipelines/krea2/pipeline_krea2.py` and `modular_pipelines/krea2/` in `gmlx/image/families/krea2/family.py`, and the schedule of that pipeline in `krea2_sigmas` of `gmlx/image/schedule.py`. | | [flux-3-image-klein](https://github.com/black-forest-labs/flux-3-image-klein) | Apache-2.0 | BFL's FLUX.3 klein reference at commit `45e57c9`, ported to MLX and modified for gmlx: the DiT constants and tensor layout of `src/flux3/dit.py`, the image RoPE scale and schedule alpha of `src/flux3/pipeline.py` and the encoder layers, pad multiple, length, pad token and position and chat template of `src/flux3/text_encoder.py` in `gmlx/image/families/flux3_klein/family.py`, the DiT forward of `src/flux3/dit.py` with the position ids of `pipeline.py`, `autoencoder.py` and `text_encoder.py` in `gmlx/image/families/flux3_klein/model.py`, the schedule of `src/flux3/sampling.py` in `flux3_sigmas` of `gmlx/image/schedule.py`, the latent patchify and BatchNorm of `src/flux3/autoencoder.py` in `gmlx/image/vae/flux2_ae.py`, and the reference canvas, reference preparation and default size of `src/flux3/pipeline.py` with the reference choice and output crop of `src/flux3/generate.py` in `gmlx/image/families/flux3_klein/edit.py`. | +| [flux2](https://github.com/black-forest-labs/flux2) | Apache-2.0 | BFL's FLUX.2 reference at commit `50fe516`, ported to MLX and modified for gmlx: the DiT constants of `Klein4BParams`, `Klein9BParams` and `Flux2Params` and the tensor names and shapes of `Flux2` in `src/flux2/model.py`, the sampling defaults of `FLUX2_MODEL_INFO` in `src/flux2/util.py`, the prompt rules of `Qwen3Embedder` in `src/flux2/text_encoder.py` and the rounding of `denoise` and `denoise_cfg` in `src/flux2/sampling.py` in `gmlx/image/families/flux2_klein/family.py`, the DiT forward of `src/flux2/model.py` with the token ids of `prc_img`, `prc_txt` and `encode_image_refs` in `src/flux2/sampling.py` in `gmlx/image/families/flux2_klein/model.py`, and the schedule of `compute_empirical_mu` and `get_schedule` in `src/flux2/sampling.py` in `flux2_mu` and `flux2_sigmas` of `gmlx/image/schedule.py`. | | [ComfyUI-GGUF](https://github.com/city96/ComfyUI-GGUF) | Apache-2.0 | The model detection keys of `convert.py` at commit `6ea2651`, which `gmlx/image/fingerprint.py` uses to refuse other diffusion model layouts by name. | | [misaki](https://github.com/hexgrad/misaki) | Apache-2.0 | Whole package vendored at `gmlx/_vendor/misaki` (commit `fba1236`): Kokoro's grapheme-to-phoneme front-end, used by the TTS service until upstream's next PyPI release. | | [musl](https://musl.libc.org) | MIT | Statically linked into the guest entry binary `gmlx/container/guest/gmlx-entry` as its C library ([`licenses/musl-COPYRIGHT`](licenses/musl-COPYRIGHT)). | diff --git a/licenses/flux2-LICENSE b/licenses/flux2-LICENSE index 56a76df7b..6285324f8 100644 --- a/licenses/flux2-LICENSE +++ b/licenses/flux2-LICENSE @@ -8,13 +8,19 @@ source. - gmlx/image/families/flux2_klein/family.py: the constants of Klein4BParams, Klein9BParams and Flux2Params in src/flux2/model.py, the defaults of FLUX2_MODEL_INFO in src/flux2/util.py, the tensor names and - shapes of Flux2 in src/flux2/model.py, and the prompt rules of - Qwen3Embedder in src/flux2/text_encoder.py. + shapes of Flux2 in src/flux2/model.py, the prompt rules of + Qwen3Embedder in src/flux2/text_encoder.py, and the rounding of denoise + and denoise_cfg in src/flux2/sampling.py. - gmlx/image/families/flux2_klein/model.py: the Flux2 forward, DoubleStreamBlock, SingleStreamBlock, SelfAttention, SiLUActivation, Modulation, LastLayer, MLPEmbedder, QKNorm, timestep_embedding and rope of src/flux2/model.py, and the token ids of prc_img, prc_txt and encode_image_refs in src/flux2/sampling.py. +- gmlx/image/schedule.py: flux2_mu and flux2_sigmas, from + compute_empirical_mu and get_schedule in src/flux2/sampling.py. +- tests/image/test_image_check3_flux2_klein.py: schedule, a transcription + of get_schedule and compute_empirical_mu in src/flux2/sampling.py with + their constants. flux2 is distributed under the Apache License 2.0: diff --git a/tests/image/test_image_check3_flux2_klein.py b/tests/image/test_image_check3_flux2_klein.py index 429a4970b..c8f0e10b7 100644 --- a/tests/image/test_image_check3_flux2_klein.py +++ b/tests/image/test_image_check3_flux2_klein.py @@ -67,6 +67,11 @@ FULL = "distilled r1" +# SPDX-FileCopyrightText: Copyright 2025 Black Forest Labs, Inc. +# schedule transcribes get_schedule and compute_empirical_mu of +# src/flux2/sampling.py of BFL's FLUX.2 reference at commit 50fe516, with +# their constants, in Python floats (Apache-2.0; see +# licenses/flux2-LICENSE). def schedule(steps: int, tokens: int) -> list[float]: """get_schedule of BFL's flux2 sampling.py at REFERENCE_COMMIT.""" a1, b1, a2, b2 = 8.73809524e-05, 1.89833333, 0.00016927, 0.45666666 From c91f3ebe4814391077c81e0f678d4572eac71f38 Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 07:19:38 -0700 Subject: [PATCH 012/101] test(image): flux2 klein img_in stays bf16 in every published quant, f16 included --- .../image/flux2_klein_4b_f16.header.json | 156 +++++++++++++++++ .../image/flux2_klein_img_in_identity.json | 165 ++++++++++++++++++ tests/fixtures/image/manifest.json | 14 ++ tests/image/test_image_flux2_family.py | 31 ++++ 4 files changed, 366 insertions(+) create mode 100644 tests/fixtures/image/flux2_klein_4b_f16.header.json create mode 100644 tests/fixtures/image/flux2_klein_img_in_identity.json diff --git a/tests/fixtures/image/flux2_klein_4b_f16.header.json b/tests/fixtures/image/flux2_klein_4b_f16.header.json new file mode 100644 index 000000000..3bf83bfee --- /dev/null +++ b/tests/fixtures/image/flux2_klein_4b_f16.header.json @@ -0,0 +1,156 @@ +{ + "gguf_version": 3, + "kv": {"general.architecture": "flux"}, + "n_tensors": 149, + "tensors": [ + ["double_blocks.0.img_attn.norm.key_norm.scale", [128], "F32"], + ["double_blocks.0.img_attn.norm.query_norm.scale", [128], "F32"], + ["double_blocks.0.img_attn.proj.weight", [3072, 3072], "F16"], + ["double_blocks.0.img_attn.qkv.weight", [3072, 9216], "F16"], + ["double_blocks.0.img_mlp.0.weight", [3072, 18432], "F16"], + ["double_blocks.0.img_mlp.2.weight", [9216, 3072], "F16"], + ["double_blocks.0.txt_attn.norm.key_norm.scale", [128], "F32"], + ["double_blocks.0.txt_attn.norm.query_norm.scale", [128], "F32"], + ["double_blocks.0.txt_attn.proj.weight", [3072, 3072], "F16"], + ["double_blocks.0.txt_attn.qkv.weight", [3072, 9216], "F16"], + ["double_blocks.0.txt_mlp.0.weight", [3072, 18432], "F16"], + ["double_blocks.0.txt_mlp.2.weight", [9216, 3072], "F16"], + ["double_blocks.1.img_attn.norm.key_norm.scale", [128], "F32"], + ["double_blocks.1.img_attn.norm.query_norm.scale", [128], "F32"], + ["double_blocks.1.img_attn.proj.weight", [3072, 3072], "F16"], + ["double_blocks.1.img_attn.qkv.weight", [3072, 9216], "F16"], + ["double_blocks.1.img_mlp.0.weight", [3072, 18432], "F16"], + ["double_blocks.1.img_mlp.2.weight", [9216, 3072], "F16"], + ["double_blocks.1.txt_attn.norm.key_norm.scale", [128], "F32"], + ["double_blocks.1.txt_attn.norm.query_norm.scale", [128], "F32"], + ["double_blocks.1.txt_attn.proj.weight", [3072, 3072], "F16"], + ["double_blocks.1.txt_attn.qkv.weight", [3072, 9216], "F16"], + ["double_blocks.1.txt_mlp.0.weight", [3072, 18432], "F16"], + ["double_blocks.1.txt_mlp.2.weight", [9216, 3072], "F16"], + ["double_blocks.2.img_attn.norm.key_norm.scale", [128], "F32"], + ["double_blocks.2.img_attn.norm.query_norm.scale", [128], "F32"], + ["double_blocks.2.img_attn.proj.weight", [3072, 3072], "F16"], + ["double_blocks.2.img_attn.qkv.weight", [3072, 9216], "F16"], + ["double_blocks.2.img_mlp.0.weight", [3072, 18432], "F16"], + ["double_blocks.2.img_mlp.2.weight", [9216, 3072], "F16"], + ["double_blocks.2.txt_attn.norm.key_norm.scale", [128], "F32"], + ["double_blocks.2.txt_attn.norm.query_norm.scale", [128], "F32"], + ["double_blocks.2.txt_attn.proj.weight", [3072, 3072], "F16"], + ["double_blocks.2.txt_attn.qkv.weight", [3072, 9216], "F16"], + ["double_blocks.2.txt_mlp.0.weight", [3072, 18432], "F16"], + ["double_blocks.2.txt_mlp.2.weight", [9216, 3072], "F16"], + ["double_blocks.3.img_attn.norm.key_norm.scale", [128], "F32"], + ["double_blocks.3.img_attn.norm.query_norm.scale", [128], "F32"], + ["double_blocks.3.img_attn.proj.weight", [3072, 3072], "F16"], + ["double_blocks.3.img_attn.qkv.weight", [3072, 9216], "F16"], + ["double_blocks.3.img_mlp.0.weight", [3072, 18432], "F16"], + ["double_blocks.3.img_mlp.2.weight", [9216, 3072], "F16"], + ["double_blocks.3.txt_attn.norm.key_norm.scale", [128], "F32"], + ["double_blocks.3.txt_attn.norm.query_norm.scale", [128], "F32"], + ["double_blocks.3.txt_attn.proj.weight", [3072, 3072], "F16"], + ["double_blocks.3.txt_attn.qkv.weight", [3072, 9216], "F16"], + ["double_blocks.3.txt_mlp.0.weight", [3072, 18432], "F16"], + ["double_blocks.3.txt_mlp.2.weight", [9216, 3072], "F16"], + ["double_blocks.4.img_attn.norm.key_norm.scale", [128], "F32"], + ["double_blocks.4.img_attn.norm.query_norm.scale", [128], "F32"], + ["double_blocks.4.img_attn.proj.weight", [3072, 3072], "F16"], + ["double_blocks.4.img_attn.qkv.weight", [3072, 9216], "F16"], + ["double_blocks.4.img_mlp.0.weight", [3072, 18432], "F16"], + ["double_blocks.4.img_mlp.2.weight", [9216, 3072], "F16"], + ["double_blocks.4.txt_attn.norm.key_norm.scale", [128], "F32"], + ["double_blocks.4.txt_attn.norm.query_norm.scale", [128], "F32"], + ["double_blocks.4.txt_attn.proj.weight", [3072, 3072], "F16"], + ["double_blocks.4.txt_attn.qkv.weight", [3072, 9216], "F16"], + ["double_blocks.4.txt_mlp.0.weight", [3072, 18432], "F16"], + ["double_blocks.4.txt_mlp.2.weight", [9216, 3072], "F16"], + ["double_stream_modulation_img.lin.weight", [3072, 18432], "BF16"], + ["double_stream_modulation_txt.lin.weight", [3072, 18432], "BF16"], + ["final_layer.adaLN_modulation.1.weight", [3072, 6144], "BF16"], + ["final_layer.linear.weight", [3072, 128], "BF16"], + ["img_in.weight", [128, 3072], "BF16"], + ["single_blocks.0.linear1.weight", [3072, 27648], "F16"], + ["single_blocks.0.linear2.weight", [12288, 3072], "F16"], + ["single_blocks.0.norm.key_norm.scale", [128], "F32"], + ["single_blocks.0.norm.query_norm.scale", [128], "F32"], + ["single_blocks.1.linear1.weight", [3072, 27648], "F16"], + ["single_blocks.1.linear2.weight", [12288, 3072], "F16"], + ["single_blocks.1.norm.key_norm.scale", [128], "F32"], + ["single_blocks.1.norm.query_norm.scale", [128], "F32"], + ["single_blocks.10.linear1.weight", [3072, 27648], "F16"], + ["single_blocks.10.linear2.weight", [12288, 3072], "F16"], + ["single_blocks.10.norm.key_norm.scale", [128], "F32"], + ["single_blocks.10.norm.query_norm.scale", [128], "F32"], + ["single_blocks.11.linear1.weight", [3072, 27648], "F16"], + ["single_blocks.11.linear2.weight", [12288, 3072], "F16"], + ["single_blocks.11.norm.key_norm.scale", [128], "F32"], + ["single_blocks.11.norm.query_norm.scale", [128], "F32"], + ["single_blocks.12.linear1.weight", [3072, 27648], "F16"], + ["single_blocks.12.linear2.weight", [12288, 3072], "F16"], + ["single_blocks.12.norm.key_norm.scale", [128], "F32"], + ["single_blocks.12.norm.query_norm.scale", [128], "F32"], + ["single_blocks.13.linear1.weight", [3072, 27648], "F16"], + ["single_blocks.13.linear2.weight", [12288, 3072], "F16"], + ["single_blocks.13.norm.key_norm.scale", [128], "F32"], + ["single_blocks.13.norm.query_norm.scale", [128], "F32"], + ["single_blocks.14.linear1.weight", [3072, 27648], "F16"], + ["single_blocks.14.linear2.weight", [12288, 3072], "F16"], + ["single_blocks.14.norm.key_norm.scale", [128], "F32"], + ["single_blocks.14.norm.query_norm.scale", [128], "F32"], + ["single_blocks.15.linear1.weight", [3072, 27648], "F16"], + ["single_blocks.15.linear2.weight", [12288, 3072], "F16"], + ["single_blocks.15.norm.key_norm.scale", [128], "F32"], + ["single_blocks.15.norm.query_norm.scale", [128], "F32"], + ["single_blocks.16.linear1.weight", [3072, 27648], "F16"], + ["single_blocks.16.linear2.weight", [12288, 3072], "F16"], + ["single_blocks.16.norm.key_norm.scale", [128], "F32"], + ["single_blocks.16.norm.query_norm.scale", [128], "F32"], + ["single_blocks.17.linear1.weight", [3072, 27648], "F16"], + ["single_blocks.17.linear2.weight", [12288, 3072], "F16"], + ["single_blocks.17.norm.key_norm.scale", [128], "F32"], + ["single_blocks.17.norm.query_norm.scale", [128], "F32"], + ["single_blocks.18.linear1.weight", [3072, 27648], "F16"], + ["single_blocks.18.linear2.weight", [12288, 3072], "F16"], + ["single_blocks.18.norm.key_norm.scale", [128], "F32"], + ["single_blocks.18.norm.query_norm.scale", [128], "F32"], + ["single_blocks.19.linear1.weight", [3072, 27648], "F16"], + ["single_blocks.19.linear2.weight", [12288, 3072], "F16"], + ["single_blocks.19.norm.key_norm.scale", [128], "F32"], + ["single_blocks.19.norm.query_norm.scale", [128], "F32"], + ["single_blocks.2.linear1.weight", [3072, 27648], "F16"], + ["single_blocks.2.linear2.weight", [12288, 3072], "F16"], + ["single_blocks.2.norm.key_norm.scale", [128], "F32"], + ["single_blocks.2.norm.query_norm.scale", [128], "F32"], + ["single_blocks.3.linear1.weight", [3072, 27648], "F16"], + ["single_blocks.3.linear2.weight", [12288, 3072], "F16"], + ["single_blocks.3.norm.key_norm.scale", [128], "F32"], + ["single_blocks.3.norm.query_norm.scale", [128], "F32"], + ["single_blocks.4.linear1.weight", [3072, 27648], "F16"], + ["single_blocks.4.linear2.weight", [12288, 3072], "F16"], + ["single_blocks.4.norm.key_norm.scale", [128], "F32"], + ["single_blocks.4.norm.query_norm.scale", [128], "F32"], + ["single_blocks.5.linear1.weight", [3072, 27648], "F16"], + ["single_blocks.5.linear2.weight", [12288, 3072], "F16"], + ["single_blocks.5.norm.key_norm.scale", [128], "F32"], + ["single_blocks.5.norm.query_norm.scale", [128], "F32"], + ["single_blocks.6.linear1.weight", [3072, 27648], "F16"], + ["single_blocks.6.linear2.weight", [12288, 3072], "F16"], + ["single_blocks.6.norm.key_norm.scale", [128], "F32"], + ["single_blocks.6.norm.query_norm.scale", [128], "F32"], + ["single_blocks.7.linear1.weight", [3072, 27648], "F16"], + ["single_blocks.7.linear2.weight", [12288, 3072], "F16"], + ["single_blocks.7.norm.key_norm.scale", [128], "F32"], + ["single_blocks.7.norm.query_norm.scale", [128], "F32"], + ["single_blocks.8.linear1.weight", [3072, 27648], "F16"], + ["single_blocks.8.linear2.weight", [12288, 3072], "F16"], + ["single_blocks.8.norm.key_norm.scale", [128], "F32"], + ["single_blocks.8.norm.query_norm.scale", [128], "F32"], + ["single_blocks.9.linear1.weight", [3072, 27648], "F16"], + ["single_blocks.9.linear2.weight", [12288, 3072], "F16"], + ["single_blocks.9.norm.key_norm.scale", [128], "F32"], + ["single_blocks.9.norm.query_norm.scale", [128], "F32"], + ["single_stream_modulation.lin.weight", [3072, 9216], "BF16"], + ["time_in.in_layer.weight", [256, 3072], "BF16"], + ["time_in.out_layer.weight", [3072, 3072], "BF16"], + ["txt_in.weight", [7680, 3072], "BF16"] + ] +} diff --git a/tests/fixtures/image/flux2_klein_img_in_identity.json b/tests/fixtures/image/flux2_klein_img_in_identity.json new file mode 100644 index 000000000..8ae88fbe1 --- /dev/null +++ b/tests/fixtures/image/flux2_klein_img_in_identity.json @@ -0,0 +1,165 @@ +{ + "_note": "img_in.weight of every GGUF of the two unsloth FLUX.2 klein 4B repos by HTTP range reads: its codec and the sha256 of its bf16 bits, as gmlx.image.fingerprint.weight_identity forms it over the identity tensors", + "repos": { + "unsloth/FLUX.2-klein-4B-GGUF": { + "revision": "0084d1df98e2e2137fe776d55170bc4792ec1d66", + "files": { + "flux-2-klein-4b-BF16.gguf": { + "img_in.weight": "BF16", + "sha256": "591c63d49ea6d7cb55c1d349febb8736613013aef145462659f19816ed3639a9", + "size": 7751115328 + }, + "flux-2-klein-4b-F16.gguf": { + "img_in.weight": "BF16", + "sha256": "591c63d49ea6d7cb55c1d349febb8736613013aef145462659f19816ed3639a9", + "size": 7751115328 + }, + "flux-2-klein-4b-Q2_K.gguf": { + "img_in.weight": "BF16", + "sha256": "591c63d49ea6d7cb55c1d349febb8736613013aef145462659f19816ed3639a9", + "size": 1827807808 + }, + "flux-2-klein-4b-Q3_K_M.gguf": { + "img_in.weight": "BF16", + "sha256": "591c63d49ea6d7cb55c1d349febb8736613013aef145462659f19816ed3639a9", + "size": 2124489280 + }, + "flux-2-klein-4b-Q3_K_S.gguf": { + "img_in.weight": "BF16", + "sha256": "591c63d49ea6d7cb55c1d349febb8736613013aef145462659f19816ed3639a9", + "size": 2101928512 + }, + "flux-2-klein-4b-Q4_0.gguf": { + "img_in.weight": "BF16", + "sha256": "591c63d49ea6d7cb55c1d349febb8736613013aef145462659f19816ed3639a9", + "size": 2460394048 + }, + "flux-2-klein-4b-Q4_1.gguf": { + "img_in.weight": "BF16", + "sha256": "591c63d49ea6d7cb55c1d349febb8736613013aef145462659f19816ed3639a9", + "size": 2690425408 + }, + "flux-2-klein-4b-Q4_K_M.gguf": { + "img_in.weight": "BF16", + "sha256": "591c63d49ea6d7cb55c1d349febb8736613013aef145462659f19816ed3639a9", + "size": 2604311104 + }, + "flux-2-klein-4b-Q4_K_S.gguf": { + "img_in.weight": "BF16", + "sha256": "591c63d49ea6d7cb55c1d349febb8736613013aef145462659f19816ed3639a9", + "size": 2583077440 + }, + "flux-2-klein-4b-Q5_0.gguf": { + "img_in.weight": "BF16", + "sha256": "591c63d49ea6d7cb55c1d349febb8736613013aef145462659f19816ed3639a9", + "size": 2920456768 + }, + "flux-2-klein-4b-Q5_1.gguf": { + "img_in.weight": "BF16", + "sha256": "591c63d49ea6d7cb55c1d349febb8736613013aef145462659f19816ed3639a9", + "size": 3150488128 + }, + "flux-2-klein-4b-Q5_K_M.gguf": { + "img_in.weight": "BF16", + "sha256": "591c63d49ea6d7cb55c1d349febb8736613013aef145462659f19816ed3639a9", + "size": 3073368640 + }, + "flux-2-klein-4b-Q5_K_S.gguf": { + "img_in.weight": "BF16", + "sha256": "591c63d49ea6d7cb55c1d349febb8736613013aef145462659f19816ed3639a9", + "size": 3050807872 + }, + "flux-2-klein-4b-Q6_K.gguf": { + "img_in.weight": "BF16", + "sha256": "591c63d49ea6d7cb55c1d349febb8736613013aef145462659f19816ed3639a9", + "size": 3409273408 + }, + "flux-2-klein-4b-Q8_0.gguf": { + "img_in.weight": "BF16", + "sha256": "591c63d49ea6d7cb55c1d349febb8736613013aef145462659f19816ed3639a9", + "size": 4300644928 + } + } + }, + "unsloth/FLUX.2-klein-base-4B-GGUF": { + "revision": "5fd6513800b1f13016fab83600b392a35f29d56d", + "files": { + "flux-2-klein-base-4b-BF16.gguf": { + "img_in.weight": "BF16", + "sha256": "2a60e24acf60f890172dfdf3a887d7f9dc51675c515a566126bb24ddab3d2fce", + "size": 7751115328 + }, + "flux-2-klein-base-4b-F16.gguf": { + "img_in.weight": "BF16", + "sha256": "2a60e24acf60f890172dfdf3a887d7f9dc51675c515a566126bb24ddab3d2fce", + "size": 7751115328 + }, + "flux-2-klein-base-4b-Q2_K.gguf": { + "img_in.weight": "BF16", + "sha256": "2a60e24acf60f890172dfdf3a887d7f9dc51675c515a566126bb24ddab3d2fce", + "size": 1827807808 + }, + "flux-2-klein-base-4b-Q3_K_M.gguf": { + "img_in.weight": "BF16", + "sha256": "2a60e24acf60f890172dfdf3a887d7f9dc51675c515a566126bb24ddab3d2fce", + "size": 2124489280 + }, + "flux-2-klein-base-4b-Q3_K_S.gguf": { + "img_in.weight": "BF16", + "sha256": "2a60e24acf60f890172dfdf3a887d7f9dc51675c515a566126bb24ddab3d2fce", + "size": 2101928512 + }, + "flux-2-klein-base-4b-Q4_0.gguf": { + "img_in.weight": "BF16", + "sha256": "2a60e24acf60f890172dfdf3a887d7f9dc51675c515a566126bb24ddab3d2fce", + "size": 2460394048 + }, + "flux-2-klein-base-4b-Q4_1.gguf": { + "img_in.weight": "BF16", + "sha256": "2a60e24acf60f890172dfdf3a887d7f9dc51675c515a566126bb24ddab3d2fce", + "size": 2690425408 + }, + "flux-2-klein-base-4b-Q4_K_M.gguf": { + "img_in.weight": "BF16", + "sha256": "2a60e24acf60f890172dfdf3a887d7f9dc51675c515a566126bb24ddab3d2fce", + "size": 2604311104 + }, + "flux-2-klein-base-4b-Q4_K_S.gguf": { + "img_in.weight": "BF16", + "sha256": "2a60e24acf60f890172dfdf3a887d7f9dc51675c515a566126bb24ddab3d2fce", + "size": 2583077440 + }, + "flux-2-klein-base-4b-Q5_0.gguf": { + "img_in.weight": "BF16", + "sha256": "2a60e24acf60f890172dfdf3a887d7f9dc51675c515a566126bb24ddab3d2fce", + "size": 2920456768 + }, + "flux-2-klein-base-4b-Q5_1.gguf": { + "img_in.weight": "BF16", + "sha256": "2a60e24acf60f890172dfdf3a887d7f9dc51675c515a566126bb24ddab3d2fce", + "size": 3150488128 + }, + "flux-2-klein-base-4b-Q5_K_M.gguf": { + "img_in.weight": "BF16", + "sha256": "2a60e24acf60f890172dfdf3a887d7f9dc51675c515a566126bb24ddab3d2fce", + "size": 3073368640 + }, + "flux-2-klein-base-4b-Q5_K_S.gguf": { + "img_in.weight": "BF16", + "sha256": "2a60e24acf60f890172dfdf3a887d7f9dc51675c515a566126bb24ddab3d2fce", + "size": 3050807872 + }, + "flux-2-klein-base-4b-Q6_K.gguf": { + "img_in.weight": "BF16", + "sha256": "2a60e24acf60f890172dfdf3a887d7f9dc51675c515a566126bb24ddab3d2fce", + "size": 3409273408 + }, + "flux-2-klein-base-4b-Q8_0.gguf": { + "img_in.weight": "BF16", + "sha256": "2a60e24acf60f890172dfdf3a887d7f9dc51675c515a566126bb24ddab3d2fce", + "size": 4300644928 + } + } + } + } +} diff --git a/tests/fixtures/image/manifest.json b/tests/fixtures/image/manifest.json index b91d424dd..dff314be0 100644 --- a/tests/fixtures/image/manifest.json +++ b/tests/fixtures/image/manifest.json @@ -127,6 +127,20 @@ "sha256": "5489463ed96056b0bb5472abb5d1bba7055e48d574e37877acb43b407465e26f", "kv_kept": "general.architecture" }, + "flux2_klein_4b_f16.header.json": { + "repo": "unsloth/FLUX.2-klein-4B-GGUF", + "revision": "0084d1df98e2e2137fe776d55170bc4792ec1d66", + "file": "flux-2-klein-4b-F16.gguf", + "size": 7751115328, + "sha256": "c814dc08a07e3a6203547183eae8299835d32dc002fe0c24e1d02b4f2af649da", + "kv_kept": "general.architecture" + }, + "flux2_klein_img_in_identity.json": { + "repo": "unsloth/FLUX.2-klein-4B-GGUF and unsloth/FLUX.2-klein-base-4B-GGUF", + "revision": "0084d1df98e2e2137fe776d55170bc4792ec1d66 and 5fd6513800b1f13016fab83600b392a35f29d56d", + "file": "img_in.weight of every .gguf, by HTTP range reads", + "note": "each file's size is in the fixture; the hashes are of the tensor's bf16 bits" + }, "flux2_klein_4b_transformer_config.json": { "repo": "black-forest-labs/FLUX.2-klein-4B", "revision": "e7b7dc27f91deacad38e78976d1f2b499d76a294", diff --git a/tests/image/test_image_flux2_family.py b/tests/image/test_image_flux2_family.py index 572002761..35981ff07 100644 --- a/tests/image/test_image_flux2_family.py +++ b/tests/image/test_image_flux2_family.py @@ -115,6 +115,37 @@ def test_the_identity_table_names_both_4b_variants_with_their_sampling(): assert fam.unknown_variant is None and not fam.needs_variant +def test_every_published_quant_keeps_the_identity_tensor_bf16(): + """img_in.weight is BF16 in every GGUF of both unsloth 4B repos, the + F16 file included, so every file of a checkpoint gives the hash of + its variant row. The range reads of the fixtures hold the codec and + the hash of each file, and the F16 header stores every other matrix + F16 and still matches the 4B config.""" + from collections import Counter + + table = load_json("flux2_klein_img_in_identity.json")["repos"] + want = {"unsloth/FLUX.2-klein-4B-GGUF": ("distilled", DISTILLED_HASH), + "unsloth/FLUX.2-klein-base-4B-GGUF": ("base", BASE_HASH)} + assert set(table) == set(want) + fam = get_family("flux2_klein") + for repo, row in table.items(): + variant, digest = want[repo] + files = row["files"] + assert len(files) == 15, repo + assert {f.rsplit("-", 1)[1] for f in files} >= { + "F16.gguf", "BF16.gguf", "Q4_K_M.gguf", "Q8_0.gguf"} + assert {v["img_in.weight"] for v in files.values()} == {"BF16"} + assert {v["sha256"] for v in files.values()} == {digest} + assert fam.variants[digest].name == variant + view = fixture_view("flux2_klein_4b_f16.header.json") + assert view.tensors["img_in.weight"].codec == "BF16" + assert Counter(t.codec for t in view.tensors.values()) == { + "F32": 60, "F16": 80, "BF16": 9} + got = fp.identify(view) + assert got.family.name == "flux2_klein" + assert got.config == official_config(CONFIG_4B) + + @pytest.mark.parametrize("digest,variant", [(DISTILLED_HASH, "distilled"), (BASE_HASH, "base"), ("0" * 64, "unknown")]) From 562901e516fb8457275975f8b9de8c7d27b2f447 Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 08:20:59 -0700 Subject: [PATCH 013/101] test(image): flux2 klein check 6 on latents, bf16 at 512 and the exact run at 1024 --- .../check6_flux2_klein_1024.manifest.json | 212 ++++++++++ .../check6_flux2_klein_512.manifest.json | 224 +++++++++++ ...check6_flux2_klein_base_1024.manifest.json | 246 ++++++++++++ .../check6_flux2_klein_base_512.manifest.json | 346 ++++++++++++++++ tests/image/test_image_check6_flux2_klein.py | 376 ++++++++++++++++++ 5 files changed, 1404 insertions(+) create mode 100644 tests/fixtures/image/oracle/check6_flux2_klein_1024.manifest.json create mode 100644 tests/fixtures/image/oracle/check6_flux2_klein_512.manifest.json create mode 100644 tests/fixtures/image/oracle/check6_flux2_klein_base_1024.manifest.json create mode 100644 tests/fixtures/image/oracle/check6_flux2_klein_base_512.manifest.json create mode 100644 tests/image/test_image_check6_flux2_klein.py diff --git a/tests/fixtures/image/oracle/check6_flux2_klein_1024.manifest.json b/tests/fixtures/image/oracle/check6_flux2_klein_1024.manifest.json new file mode 100644 index 000000000..2bed8e468 --- /dev/null +++ b/tests/fixtures/image/oracle/check6_flux2_klein_1024.manifest.json @@ -0,0 +1,212 @@ +{ + "schema": 1, + "name": "check6_flux2_klein_1024", + "check": 6, + "family": "flux2_klein", + "script": "scripts/image_oracle/check6_flux2_klein.py", + "argv": [ + "check6_flux2_klein.py", + "--reference", + "src", + "--reference-commit", + "50fe5162777813d869182b139e83b10743caef15", + "--features", + "check2_flux2_klein.npz", + "--dit", + "flux-2-klein-4b-Q4_K_M.gguf", + "--variant", + "distilled", + "--sizes", + "512", + "1024", + "--bf16", + "512" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": { + "dit": { + "name": "flux-2-klein-4b-Q4_K_M.gguf", + "size": 2604311104, + "sha256": "0b25d143c8469b342bc5af3bce92b783bf6b0636d285f7b2f75e38af63af9a15" + }, + "features": { + "name": "check2_flux2_klein.npz", + "size": 157354382, + "sha256": "207834c4c3c183edee80e865e3c8f6c445654fbb29862589f0778673b4c43613" + } + }, + "inputs": { + "size": 1024, + "variant": "distilled", + "model_info": "flux.2-klein-4b", + "steps": 4, + "guidance": 1.0, + "seed": 6, + "bf16": false, + "kept_steps": [ + 1, + 2, + 3 + ], + "refs": 0, + "tokens": 4096, + "noise": "numpy Generator(PCG64(seed)).standard_normal(shape, dtype=float32), NCHW, shape (1, 128, size / 16, size / 16); the CLI's noise is bf16, so it is rounded", + "features": "check2_flux2_klein float32 features_plain, and features_empty for Base, rounded to bf16", + "latents": "(1, 128, size / 16, size / 16) float32 in the gmlx layout, after the step", + "times": "the bf16 time the DiT saw at each step, as float32", + "reference_commit": "50fe5162777813d869182b139e83b10743caef15", + "gguf_codecs": { + "F32": 60, + "Q5_K": 30, + "Q4_K": 50, + "BF16": 9 + } + }, + "results": { + "oracle": { + "device": "cpu", + "threads": 16, + "dequant": "exact", + "bf16_matmul": "bf16 operands, float32 GEMM, one bf16 rounding" + }, + "run": { + "fp32_s": 82.8, + "fp32_median_step_s": 20.54, + "rows": [ + 1 + ] + }, + "gmlx_bf16": { + "rel_l2": { + "1": 0.00213, + "2": 0.00702, + "3": 0.0394, + "4": 0.235 + }, + "share_of_512_gate": { + "1": 0.4799211766332812, + "2": 0.7421875862493584, + "3": 0.8728296916279858, + "4": 1.2964098446893757 + } + } + }, + "tolerances": { + "exact_rel_l2": 0.001, + "rule": "latents after a kept step and after the last. At 512: gmlx's bf16 run at relative L2 twice the oracle's own bf16 against fp32 relative L2 after that step. At any other size: gmlx's exact fp32 run against the fp32 latents at exact_rel_l2, and its bf16 run read as a share of the 512 gate of the step, not gated" + }, + "notes": [ + "results.gmlx_bf16: gmlx's bf16 latents at 1024, kernel routes at their default, against the fp32 latents after each kept step and the last, and as a share of the 512 gate of that step, as tests/image/test_image_check6_flux2_klein.py prints them, to three digits. A reading, not a gate." + ], + "created": "2026-10-16T13:03:30Z", + "npz": "check6_flux2_klein_1024.npz", + "tensors": { + "features": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "d826e5b160e0d8ed351f4fa73c61332506de8c02987d73ab1a215b694316469e" + }, + "latents": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "5a49427f0ac3ef210bdca1605936c07d7369b1b7b9349377bffcea332fdd6406" + }, + "latents_step1": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "ef921be7ed9ce593d174c10d7b0a14cf791deaac81b3f6fc79a933dc07470f54" + }, + "latents_step2": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "67c329372a848260bf5561388f096cb964ce31dbf49987a96c55f9032679463c" + }, + "latents_step3": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "385b3159bb79db684c51a5cc47682ef6cc741d32cfcae8e55be7bff03d115f00" + }, + "noise": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "bcd95295bb6b6d4f2030450a235b4f3e631d78cfeabead17132ec18138429b6a" + }, + "schedule": { + "shape": [ + 5 + ], + "dtype": "float32", + "sha256": "716bbd15043b4b31e63d84374538c884b85e67c0924198a9d4a112b7d9b3d59d" + }, + "times": { + "shape": [ + 4 + ], + "dtype": "float32", + "sha256": "3dbb533432a33b3793d501553be8eba6200fc0dda87edff05c71d4a1900468be" + } + } +} diff --git a/tests/fixtures/image/oracle/check6_flux2_klein_512.manifest.json b/tests/fixtures/image/oracle/check6_flux2_klein_512.manifest.json new file mode 100644 index 000000000..958af46f3 --- /dev/null +++ b/tests/fixtures/image/oracle/check6_flux2_klein_512.manifest.json @@ -0,0 +1,224 @@ +{ + "schema": 1, + "name": "check6_flux2_klein_512", + "check": 6, + "family": "flux2_klein", + "script": "scripts/image_oracle/check6_flux2_klein.py", + "argv": [ + "check6_flux2_klein.py", + "--reference", + "src", + "--reference-commit", + "50fe5162777813d869182b139e83b10743caef15", + "--features", + "check2_flux2_klein.npz", + "--dit", + "flux-2-klein-4b-Q4_K_M.gguf", + "--variant", + "distilled", + "--sizes", + "512", + "1024", + "--bf16", + "512" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": { + "dit": { + "name": "flux-2-klein-4b-Q4_K_M.gguf", + "size": 2604311104, + "sha256": "0b25d143c8469b342bc5af3bce92b783bf6b0636d285f7b2f75e38af63af9a15" + }, + "features": { + "name": "check2_flux2_klein.npz", + "size": 157354382, + "sha256": "207834c4c3c183edee80e865e3c8f6c445654fbb29862589f0778673b4c43613" + } + }, + "inputs": { + "size": 512, + "variant": "distilled", + "model_info": "flux.2-klein-4b", + "steps": 4, + "guidance": 1.0, + "seed": 6, + "bf16": true, + "kept_steps": [ + 1, + 2, + 3 + ], + "refs": 0, + "tokens": 1024, + "noise": "numpy Generator(PCG64(seed)).standard_normal(shape, dtype=float32), NCHW, shape (1, 128, size / 16, size / 16); the CLI's noise is bf16, so it is rounded", + "features": "check2_flux2_klein float32 features_plain, and features_empty for Base, rounded to bf16", + "latents": "(1, 128, size / 16, size / 16) float32 in the gmlx layout, after the step", + "times": "the bf16 time the DiT saw at each step, as float32", + "reference_commit": "50fe5162777813d869182b139e83b10743caef15", + "gguf_codecs": { + "F32": 60, + "Q5_K": 30, + "Q4_K": 50, + "BF16": 9 + } + }, + "results": { + "oracle": { + "device": "cpu", + "threads": 16, + "dequant": "exact", + "bf16_matmul": "bf16 operands, float32 GEMM, one bf16 rounding" + }, + "run": { + "fp32_s": 26.0, + "fp32_median_step_s": 6.51, + "rows": [ + 1 + ], + "bf16_s": 64.3, + "latents_bf16_vs_fp32": { + "rel_l2": 0.09063491802482679, + "cosine": 0.9958903048995704, + "max_abs": 2.756352663040161 + }, + "bf16_vs_fp32_by_step": [ + 0.002219114412644039, + 0.004729262608308729, + 0.02257026793309004, + 0.09063491802482679 + ] + } + }, + "tolerances": { + "latents_rel_l2": 0.18126983604965358, + "by_step_rel_l2": [ + 0.004438228825288078, + 0.009458525216617457, + 0.04514053586618008, + 0.18126983604965358 + ], + "rule": "latents after a kept step and after the last. At 512: gmlx's bf16 run at relative L2 twice the oracle's own bf16 against fp32 relative L2 after that step. At any other size: gmlx's exact fp32 run against the fp32 latents at exact_rel_l2, and its bf16 run read as a share of the 512 gate of the step, not gated" + }, + "notes": [], + "created": "2026-10-16T13:02:06Z", + "npz": "check6_flux2_klein_512.npz", + "tensors": { + "features": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "d826e5b160e0d8ed351f4fa73c61332506de8c02987d73ab1a215b694316469e" + }, + "latents": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "48ae9bcd7b641d1f25d913db6a085008431d1a3f82f72721b92ecca6574d15d8" + }, + "latents_bf16": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "7b47b8c9198a017ff94de75264bca0320cdee96765013e3a28bba575931e34ac" + }, + "latents_step1": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "31842e113eeeb6db9fbbb45a2cc5434701a1a037e0b8599d79f3e13e4d1bbb25" + }, + "latents_step2": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "19147074051cab0a98b5b93871b7175db3c308872f3bacf94321fd000a86b35d" + }, + "latents_step3": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "182c1cdf5dbe0293fea7cf10673ba1ebf8a7518483576d73d6c841800d4672b9" + }, + "noise": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "d614e8f6414c19a6e58b7af3fb3e7e866a4c21c40c780bf93ece8c4f09d875de" + }, + "schedule": { + "shape": [ + 5 + ], + "dtype": "float32", + "sha256": "9f2da4a92411327695519cb907933a612b2c6a5c66593a012e960ca146d7755d" + }, + "times": { + "shape": [ + 4 + ], + "dtype": "float32", + "sha256": "dc88fa8eb61cc7d72b0f02c6dc49b252aa99e0be170fccf10a05a81e261ec3b1" + } + } +} diff --git a/tests/fixtures/image/oracle/check6_flux2_klein_base_1024.manifest.json b/tests/fixtures/image/oracle/check6_flux2_klein_base_1024.manifest.json new file mode 100644 index 000000000..e73a57c41 --- /dev/null +++ b/tests/fixtures/image/oracle/check6_flux2_klein_base_1024.manifest.json @@ -0,0 +1,246 @@ +{ + "schema": 1, + "name": "check6_flux2_klein_base_1024", + "check": 6, + "family": "flux2_klein", + "script": "scripts/image_oracle/check6_flux2_klein.py", + "argv": [ + "check6_flux2_klein.py", + "--reference", + "src", + "--reference-commit", + "50fe5162777813d869182b139e83b10743caef15", + "--features", + "check2_flux2_klein.npz", + "--dit", + "flux-2-klein-base-4b-Q4_K_M.gguf", + "--variant", + "base", + "--sizes", + "512", + "1024", + "--bf16", + "512" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": { + "dit": { + "name": "flux-2-klein-base-4b-Q4_K_M.gguf", + "size": 2604311104, + "sha256": "8348ff1f2b3ac3cf9eb62f38322fcbb6d92811d39aa036d0671cf7bef9411266" + }, + "features": { + "name": "check2_flux2_klein.npz", + "size": 157354382, + "sha256": "207834c4c3c183edee80e865e3c8f6c445654fbb29862589f0778673b4c43613" + } + }, + "inputs": { + "size": 1024, + "variant": "base", + "model_info": "flux.2-klein-base-4b", + "steps": 50, + "guidance": 4.0, + "seed": 6, + "bf16": false, + "kept_steps": [ + 1, + 2, + 5, + 10, + 25 + ], + "refs": 0, + "tokens": 4096, + "noise": "numpy Generator(PCG64(seed)).standard_normal(shape, dtype=float32), NCHW, shape (1, 128, size / 16, size / 16); the CLI's noise is bf16, so it is rounded", + "features": "check2_flux2_klein float32 features_plain, and features_empty for Base, rounded to bf16", + "latents": "(1, 128, size / 16, size / 16) float32 in the gmlx layout, after the step", + "times": "the bf16 time the DiT saw at each step, as float32", + "reference_commit": "50fe5162777813d869182b139e83b10743caef15", + "gguf_codecs": { + "F32": 60, + "Q5_K": 30, + "Q4_K": 50, + "BF16": 9 + } + }, + "results": { + "oracle": { + "device": "cpu", + "threads": 16, + "dequant": "exact", + "bf16_matmul": "bf16 operands, float32 GEMM, one bf16 rounding" + }, + "run": { + "fp32_s": 1997.0, + "fp32_median_step_s": 39.94, + "rows": [ + 2 + ] + }, + "gmlx_bf16": { + "rel_l2": { + "1": 0.00185, + "2": 0.00337, + "5": 0.00683, + "10": 0.0109, + "25": 0.0229, + "50": 0.254 + }, + "share_of_512_gate": { + "1": 0.5376233726769168, + "2": 0.5460001949074939, + "5": 0.6081398225212772, + "10": 0.6290154396344905, + "25": 0.8309443441049426, + "50": 1.9890994260678314 + } + } + }, + "tolerances": { + "exact_rel_l2": 0.001, + "rule": "latents after a kept step and after the last. At 512: gmlx's bf16 run at relative L2 twice the oracle's own bf16 against fp32 relative L2 after that step. At any other size: gmlx's exact fp32 run against the fp32 latents at exact_rel_l2, and its bf16 run read as a share of the 512 gate of the step, not gated" + }, + "notes": [ + "results.gmlx_bf16: gmlx's bf16 latents at 1024, kernel routes at their default, against the fp32 latents after each kept step and the last, and as a share of the 512 gate of that step, as tests/image/test_image_check6_flux2_klein.py prints them, to three digits. A reading, not a gate." + ], + "created": "2026-10-16T14:13:01Z", + "npz": "check6_flux2_klein_base_1024.npz", + "tensors": { + "features": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "d826e5b160e0d8ed351f4fa73c61332506de8c02987d73ab1a215b694316469e" + }, + "features_empty": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "ccb1e251d828b7fcaa0ba4734488ec4d8654ad0e9889f3ed11e80edc555c4145" + }, + "latents": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "8de4a996297c66716391eabbf20e209e66e76344becf72eadbea6c4cc9cc8613" + }, + "latents_step1": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "2b27aa77e4524ed4ad71969da7c6cd86702f50f9a8d1ac5300e2e365fcdde565" + }, + "latents_step10": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "bdcdf3ab32f14f4e94420addf17ea8ceb544443f31bda77fdcf3a325c836e565" + }, + "latents_step2": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "bc27ce896415f62dad58b30ec5e6a2f8a03723160ce690c193e58e0f725f3bd4" + }, + "latents_step25": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "b1989cc0f45e8836603118545101cb3fa6eea9758df55b54382e74c7fc8e5527" + }, + "latents_step5": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "83bbc6a7bdc7f01cc3187e3f1178951196f3a5270d032c2ae1e077b29cdafbaf" + }, + "noise": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "bcd95295bb6b6d4f2030450a235b4f3e631d78cfeabead17132ec18138429b6a" + }, + "schedule": { + "shape": [ + 51 + ], + "dtype": "float32", + "sha256": "fbe3fc79eb7fcd229c63d2cd225c34045e10ab4d54a9cc57fb71559933566237" + }, + "times": { + "shape": [ + 50 + ], + "dtype": "float32", + "sha256": "c8e08a1da0f4a3b17d8b56f9136bd303d132b8022a156e1583b7b5ab70577b3d" + } + } +} diff --git a/tests/fixtures/image/oracle/check6_flux2_klein_base_512.manifest.json b/tests/fixtures/image/oracle/check6_flux2_klein_base_512.manifest.json new file mode 100644 index 000000000..9fcd34b41 --- /dev/null +++ b/tests/fixtures/image/oracle/check6_flux2_klein_base_512.manifest.json @@ -0,0 +1,346 @@ +{ + "schema": 1, + "name": "check6_flux2_klein_base_512", + "check": 6, + "family": "flux2_klein", + "script": "scripts/image_oracle/check6_flux2_klein.py", + "argv": [ + "check6_flux2_klein.py", + "--reference", + "src", + "--reference-commit", + "50fe5162777813d869182b139e83b10743caef15", + "--features", + "check2_flux2_klein.npz", + "--dit", + "flux-2-klein-base-4b-Q4_K_M.gguf", + "--variant", + "base", + "--sizes", + "512", + "1024", + "--bf16", + "512" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": { + "dit": { + "name": "flux-2-klein-base-4b-Q4_K_M.gguf", + "size": 2604311104, + "sha256": "8348ff1f2b3ac3cf9eb62f38322fcbb6d92811d39aa036d0671cf7bef9411266" + }, + "features": { + "name": "check2_flux2_klein.npz", + "size": 157354382, + "sha256": "207834c4c3c183edee80e865e3c8f6c445654fbb29862589f0778673b4c43613" + } + }, + "inputs": { + "size": 512, + "variant": "base", + "model_info": "flux.2-klein-base-4b", + "steps": 50, + "guidance": 4.0, + "seed": 6, + "bf16": true, + "kept_steps": [ + 1, + 2, + 5, + 10, + 25 + ], + "refs": 0, + "tokens": 1024, + "noise": "numpy Generator(PCG64(seed)).standard_normal(shape, dtype=float32), NCHW, shape (1, 128, size / 16, size / 16); the CLI's noise is bf16, so it is rounded", + "features": "check2_flux2_klein float32 features_plain, and features_empty for Base, rounded to bf16", + "latents": "(1, 128, size / 16, size / 16) float32 in the gmlx layout, after the step", + "times": "the bf16 time the DiT saw at each step, as float32", + "reference_commit": "50fe5162777813d869182b139e83b10743caef15", + "gguf_codecs": { + "F32": 60, + "Q5_K": 30, + "Q4_K": 50, + "BF16": 9 + } + }, + "results": { + "oracle": { + "device": "cpu", + "threads": 16, + "dequant": "exact", + "bf16_matmul": "bf16 operands, float32 GEMM, one bf16 rounding" + }, + "run": { + "fp32_s": 616.9, + "fp32_median_step_s": 12.32, + "rows": [ + 2 + ], + "bf16_s": 1552.5, + "latents_bf16_vs_fp32": { + "rel_l2": 0.0638479898669827, + "cosine": 0.9979613203954703, + "max_abs": 1.5215966999530792 + }, + "bf16_vs_fp32_by_step": [ + 0.0017205353171203665, + 0.003086079484432201, + 0.004105047337006621, + 0.0049638505110413626, + 0.00561548491569226, + 0.006227324480897491, + 0.0068486784638306965, + 0.007485188568660946, + 0.008078585681863988, + 0.008664334222331484, + 0.009200076657498925, + 0.009638110242773855, + 0.010063384212257602, + 0.010476162278297233, + 0.010847139028098805, + 0.011182607694103786, + 0.01152799202462906, + 0.011878627428565226, + 0.012182642298692328, + 0.012478765906111727, + 0.012749212564505523, + 0.013027832419212298, + 0.013270367124806389, + 0.013535774121400376, + 0.013779502900803119, + 0.0140542896340424, + 0.014328465576542711, + 0.014625206372073821, + 0.014954848160375522, + 0.015289825150544733, + 0.015666644441756212, + 0.016122262033657173, + 0.016689318943235762, + 0.01729732392796594, + 0.01805162927688876, + 0.018943138203452416, + 0.02004462487533897, + 0.021399789112664047, + 0.023052341356311845, + 0.02515384528029166, + 0.02789807008319942, + 0.031150521321140143, + 0.03490984422793783, + 0.03912462676143487, + 0.04375134039482014, + 0.04867486147304397, + 0.05362138669391468, + 0.05800860202223831, + 0.061650200687876404, + 0.0638479898669827 + ] + } + }, + "tolerances": { + "latents_rel_l2": 0.1276959797339654, + "by_step_rel_l2": [ + 0.003441070634240733, + 0.006172158968864402, + 0.008210094674013242, + 0.009927701022082725, + 0.01123096983138452, + 0.012454648961794983, + 0.013697356927661393, + 0.014970377137321892, + 0.016157171363727976, + 0.017328668444662968, + 0.01840015331499785, + 0.01927622048554771, + 0.020126768424515204, + 0.020952324556594466, + 0.02169427805619761, + 0.02236521538820757, + 0.02305598404925812, + 0.023757254857130452, + 0.024365284597384657, + 0.024957531812223453, + 0.025498425129011047, + 0.026055664838424596, + 0.026540734249612778, + 0.027071548242800753, + 0.027559005801606237, + 0.0281085792680848, + 0.028656931153085423, + 0.029250412744147643, + 0.029909696320751043, + 0.030579650301089466, + 0.031333288883512424, + 0.032244524067314345, + 0.033378637886471524, + 0.03459464785593188, + 0.03610325855377752, + 0.03788627640690483, + 0.04008924975067794, + 0.042799578225328094, + 0.04610468271262369, + 0.05030769056058332, + 0.05579614016639884, + 0.062301042642280285, + 0.06981968845587566, + 0.07824925352286974, + 0.08750268078964028, + 0.09734972294608794, + 0.10724277338782937, + 0.11601720404447662, + 0.12330040137575281, + 0.1276959797339654 + ], + "rule": "latents after a kept step and after the last. At 512: gmlx's bf16 run at relative L2 twice the oracle's own bf16 against fp32 relative L2 after that step. At any other size: gmlx's exact fp32 run against the fp32 latents at exact_rel_l2, and its bf16 run read as a share of the 512 gate of the step, not gated" + }, + "notes": [], + "created": "2026-10-16T13:39:43Z", + "npz": "check6_flux2_klein_base_512.npz", + "tensors": { + "features": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "d826e5b160e0d8ed351f4fa73c61332506de8c02987d73ab1a215b694316469e" + }, + "features_empty": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "ccb1e251d828b7fcaa0ba4734488ec4d8654ad0e9889f3ed11e80edc555c4145" + }, + "latents": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "4785e44bc176f02323ac9339c166af674346fbc03da35bc825005a3cca9133ba" + }, + "latents_bf16": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "a58f04daccae5993c183af48eee94ccbe943f4dd7a0f8a90c9817455f64ab248" + }, + "latents_step1": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "520cb7806f01e2b3363a559bf310cf8d3c9d45dc40d5299c5cb81e3bdf9ea296" + }, + "latents_step10": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "d5d0b2569c4f5a3142607ebff41a300d75cef2c3d15496556ea5f2fc1049ed48" + }, + "latents_step2": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "587c5cd888a00bbec6685b7de19405309e2e99f438eeadf40006f25e9be75de0" + }, + "latents_step25": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "47b1b8baad252991c1f90e2e9abe016c4760cbed9ba734a05c6ae6f2e4c050b1" + }, + "latents_step5": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "dfe5944da4e086df6f1a640fd1cdcb7feb72574c923ad8fc13de20e4b30b0c1a" + }, + "noise": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "d614e8f6414c19a6e58b7af3fb3e7e866a4c21c40c780bf93ece8c4f09d875de" + }, + "schedule": { + "shape": [ + 51 + ], + "dtype": "float32", + "sha256": "b06c419e92b1d7be976ddd5c97842251f3a9fd71bdd912881d8d8c0d5c66cecd" + }, + "times": { + "shape": [ + 50 + ], + "dtype": "float32", + "sha256": "6f3b5a1e298be3799cf4dd9a1713581c89162c18f0f4a7b2d34273c084c50760" + } + } +} diff --git a/tests/image/test_image_check6_flux2_klein.py b/tests/image/test_image_check6_flux2_klein.py new file mode 100644 index 000000000..e4658e023 --- /dev/null +++ b/tests/image/test_image_check6_flux2_klein.py @@ -0,0 +1,376 @@ +"""Check 6 of the image acceptance gate for FLUX.2 klein, on latents: a +whole sampling run on injected noise, for the distilled checkpoint and +for Base. gmlx samples from the seed's noise with the variant's defaults +on the oracle's conditioning, the empty prompt's for the unconditional +row of Base. The seed's noise must equal the oracle's, and the schedule +and the times the DiT saw must be the reference's. + +At 512 the run is the model as it ships, in bf16, and the latents after +each step the oracle kept and after the last must stay within twice the +oracle's own bf16 against fp32 gap after that step. A distilled run on +the schedule of another image size, and a Base run whose unconditional +row is the prompt's, fail the kept steps. + +At 1024 the gate is the exact run: check 3's exact arithmetic, held to +EXACT_REL_L2 of the oracle's fp32 latents after each kept step and after +the last. The time embedding without its inner bf16 rounding, the +schedule of another image size, and Base with the prompt as its +unconditional row each fail it. The bf16 run at 1024 must stay finite, +and its readings print as a share of the 512 gate of each step, as the +manifest records them. + +Skipped unless the manifests of scripts/image_oracle/check6_flux2_klein.py +are committed, GMLX_IMAGE_FIXTURES holds their arrays and +KQUANT_TEST_GGUF_DIR the DiT GGUFs the oracle read.""" +from __future__ import annotations + +import os +from pathlib import Path + +import flux2_gates as fg +import mlx.core as mx +import numpy as np +import pytest +from block_gates import exact_process, rerun_exact +from image_fixtures import image_dits +from oracle_fixture import ORACLE, committed, fixture, fx + +# A Mac of 16 GB, as most users run (tests/host_box.py). +pytestmark = pytest.mark.host_gb(16) + +NAMES = {"distilled": "check6_flux2_klein", "base": "check6_flux2_klein_base"} +DITS = {"distilled": "flux-2-klein-4b-Q4_K_M.gguf", + "base": "flux-2-klein-base-4b-Q4_K_M.gguf"} +MODEL_INFO = {"distilled": "flux.2-klein-4b", "base": "flux.2-klein-base-4b"} +GATE_SIZE = 512 +EXACT_SIZE = 1024 +SIZES = (GATE_SIZE, EXACT_SIZE) +EXACT_REL_L2 = 1e-3 +REFERENCE_COMMIT = "50fe5162777813d869182b139e83b10743caef15" +CASES = [(v, s) for v in NAMES for s in SIZES] + + +def _name(variant: str, size: int) -> str: + return f"{NAMES[variant]}_{size}" + + +def _have(variant: str, size: int) -> bool: + return (ORACLE / f"{_name(variant, size)}.manifest.json").is_file() + + +def _manifest(variant: str, size: int) -> dict: + if not _have(variant, size): + pytest.skip(f"{_name(variant, size)}.manifest.json is not " + "committed: run scripts/image_oracle/check6_flux2_klein.py" + " on the FLUX.2 klein GGUF and commit the manifest") + return committed(_name(variant, size)) + + +def _bits(a) -> list: + return np.asarray(a, np.float32).view(np.uint32).tolist() + + +def _kept(m: dict) -> list: + return m["inputs"]["kept_steps"] + [m["inputs"]["steps"]] + + +def _gates(variant: str) -> dict: + """The bf16 gate of the latents after each kept step and after the + last, at the gate size.""" + m = _manifest(variant, GATE_SIZE) + by_step = m["tolerances"]["by_step_rel_l2"] + assert len(by_step) == m["inputs"]["steps"] + return {k: by_step[k - 1] for k in _kept(m)} + + +class _Pipes: + """The pipeline of a fixture's file, one loaded at a time.""" + + def __init__(self, root): + self.root, self.path, self.pipe = root, None, None + + def release(self) -> None: + self.pipe = self.path = None + mx.clear_cache() + + def __call__(self, m: dict): + from gmlx.image import api + + want = m["files"]["dit"] + if self.path is not None and Path(self.path).name == want["name"]: + return self.pipe + self.release() + for p in image_dits(self.root, "flux2_klein"): + if Path(p).name == want["name"] and \ + os.path.getsize(p) == want["size"]: + break + else: + pytest.skip(f"{want['name']} is not under KQUANT_TEST_GGUF_DIR") + if fx.file_identity(p)["sha256"] != want["sha256"]: + pytest.fail(f"{p} is not the file the oracle read") + self.pipe = api.load(p, log=lambda *_: None) + self.path = p + assert self.pipe.variant == m["inputs"]["variant"] + return self.pipe + + +@pytest.fixture(scope="module") +def pipes(gguf_dir): + return _Pipes(gguf_dir) + + +def _conds(arrays: dict, variant: str, size: int): + from gmlx.image.conditioning import Conditioning + + cond = Conditioning(mx.array(arrays["features"]), + f"check6 flux2 {variant} {size}") + neg = None + if variant == "base": + neg = Conditioning(mx.array(arrays["features_empty"]), + f"check6 flux2 {variant} {size} empty") + return cond, neg + + +def _run(pipe, arrays: dict, m: dict, variant: str, size: int, + stop: int | None = None, neg=False, + tokens: int | None = None) -> tuple[dict, bool]: + """The relative L2 of the latents after each kept step and after the + last against the oracle's fp32 latents, and whether the latents + stayed finite after every step. ``stop`` ends the run after that + many steps, and ``tokens`` takes the schedule of that token count.""" + from gmlx.image import api + + steps = m["inputs"]["steps"] + want = {k: arrays[f"latents_step{k}"] for k in m["inputs"]["kept_steps"]} + want[steps] = arrays["latents"] + cond, uncond = _conds(arrays, variant, size) + if neg: + uncond = cond + got: dict = {} + finite = [True] + + def on_step(i, x): + a = np.array(x) + finite[0] = finite[0] and bool(np.isfinite(a).all()) + if i + 1 in want: + got[i + 1] = fx.rel_l2(a, want[i + 1]) + + sigmas = pipe.sigmas(steps, tokens or (size // 16) ** 2) + if stop is not None: + sigmas = sigmas[:stop + 1] + api.sample(pipe, cond, neg=uncond, height=size, width=size, + noise=mx.array(arrays["noise"]), sigmas=sigmas, + on_step=on_step) + return got, finite[0] + + +def _line(label: str, got: dict, gates: dict) -> str: + return f"{label}: " + ", ".join( + f"step {k} {v:.2e} ({v / gates[k]:.2f} of its gate)" + for k, v in sorted(got.items())) + + +def test_the_manifests_follow_the_rule(): + """The committed manifests alone: each run is the reference's on its + commit at FLUX2_MODEL_INFO's steps and guidance for the file's + variant, every gate at the gate size is twice the gap beside it, and + the exact size holds the exact tolerance and the bf16 readings of + each kept step.""" + from gmlx.image.registry import get_family + + fam = get_family("flux2_klein") + seen = 0 + for variant, size in CASES: + if not _have(variant, size): + continue + seen += 1 + m = committed(_name(variant, size)) + i, r = m["inputs"], m["results"]["run"] + row = fam.sampling[variant] + assert m["files"]["dit"]["name"] == DITS[variant] + assert i["reference_commit"] == REFERENCE_COMMIT + assert (i["variant"], i["size"], i["refs"]) == (variant, size, 0) + assert i["model_info"] == MODEL_INFO[variant] + assert (i["steps"], i["guidance"]) == (row.steps, row.cfg) + assert i["tokens"] == (size // 16) ** 2 + # denoise_cfg runs the empty prompt's row beside the prompt's. + assert r["rows"] == ([1] if variant == "distilled" else [2]) + tol = m["tolerances"] + if size == GATE_SIZE: + assert i["bf16"] + by = r["bf16_vs_fp32_by_step"] + assert tol["by_step_rel_l2"] == [2 * g for g in by] + assert tol["latents_rel_l2"] == pytest.approx( + 2 * by[-1], rel=1e-12) + assert "exact_rel_l2" not in tol + else: + assert set(tol) == {"exact_rel_l2", "rule"} + assert tol["exact_rel_l2"] == EXACT_REL_L2 + read = m["results"]["gmlx_bf16"] + keys = {str(k) for k in _kept(m)} + assert set(read["rel_l2"]) == set( + read["share_of_512_gate"]) == keys + if not seen: + pytest.skip("no check 6 manifest of FLUX.2 klein is committed") + + +@pytest.mark.parametrize("variant,size", CASES) +def test_the_seed_gives_the_noise_of_the_oracle(variant, size): + from gmlx.image.samplers import noise_from_seed + + m = _manifest(variant, size) + arrays, _ = fixture(m["name"]) + noise = arrays["noise"] + assert noise.shape == (1, 128, size // 16, size // 16) + assert np.array_equal(noise_from_seed(m["inputs"]["seed"], noise.shape), + noise) + + +@pytest.mark.parametrize("variant,size", CASES) +def test_the_schedule_and_times_are_the_reference_ones(variant, size): + """The schedule of a request is the one the reference ran bit for + bit, and the time the DiT reads at each step is its entry in bf16.""" + from gmlx.image.api import ImagePipeline + from gmlx.image.families.flux2_klein.model import _bf16 + from gmlx.image.registry import get_family + + m = _manifest(variant, size) + arrays, _ = fixture(m["name"]) + pipe = ImagePipeline(dit=None, family=get_family("flux2_klein"), + variant=variant) + steps = pipe.defaults.steps + assert steps == m["inputs"]["steps"] + got = pipe.sigmas(steps, (size // 16) ** 2) + assert _bits(got) == _bits(arrays["schedule"]) + assert _bits(_bf16(got[:-1])) == _bits(arrays["times"]) + + +@pytest.mark.integration +@pytest.mark.parametrize("variant", list(NAMES)) +def test_check6_latents_at_512(pipes, variant): + m = _manifest(variant, GATE_SIZE) + arrays, _ = fixture(m["name"]) + gates = _gates(variant) + got, finite = _run(pipes(m), arrays, m, variant, GATE_SIZE) + print(_line(f"flux2 check6 {variant} {GATE_SIZE}", got, gates)) + assert finite + assert sorted(got) == sorted(gates) + over = {k: (v, gates[k]) for k, v in got.items() if v > gates[k]} + assert not over, over + + +@pytest.mark.integration +@pytest.mark.parametrize("variant", list(NAMES)) +def test_check6_bf16_at_1024_stays_finite(pipes, variant): + """The run as it ships at 1024, read against the 512 gates.""" + m = _manifest(variant, EXACT_SIZE) + arrays, _ = fixture(m["name"]) + gates = _gates(variant) + got, finite = _run(pipes(m), arrays, m, variant, EXACT_SIZE) + print(_line(f"flux2 check6 bf16 {variant} {EXACT_SIZE} against the " + f"{GATE_SIZE} gates", got, gates)) + assert sorted(got) == sorted(gates) + assert finite + + +def _time_inner_unrounded(mp, pipe): + """The time embedding of 1000 t without the bf16 rounding of t.""" + from gmlx.image import ops + from gmlx.image.families.flux2_klein import model as fm + + def embed(t, dim): + t1000 = fm._bf16(np.float32(1000) * np.reshape(t, (-1,)).astype( + np.float32)) + emb = ops.timestep_embedding(t1000, dim) + return emb.astype(mx.bfloat16).astype(mx.float32) + + mp.setattr(fm, "time_embedding", embed) + + +# The schedule of a 512 image, where the run is at 1024. +OTHER_TOKENS = 1024 + +# Wrong runs the exact gate must fail: the fault, the steps it runs (all +# with None), whether the unconditional row is the prompt's, and the +# token count of the schedule (the image's with None). +EXACT_FAULTS = { + "distilled": { + "time embedding without its inner rounding": + (_time_inner_unrounded, None, False, None), + "the schedule of a 512 image": (None, 2, False, OTHER_TOKENS)}, + # Without its inner rounding the time embedding changes only at the + # steps whose 1000 times the time rounds to another bf16 value: the + # last of the distilled schedule at 1024, and steps 7, 15, 16, 19, 21, + # 22 and 23 of Base's before its kept step 25. + "base": { + "time embedding without its inner rounding": + (_time_inner_unrounded, 25, False, None), + "prompt as the unconditional row": (None, 5, True, None)}} + + +@pytest.mark.integration +@pytest.mark.parametrize("variant", list(NAMES)) +def test_check6_exact_at_1024(pipes, request, monkeypatch, variant): + """The run in the oracle's fp32 arithmetic within EXACT_REL_L2 of its + latents after each kept step and after the last, with every K-quant + product dense, and each wrong run of EXACT_FAULTS over the gate at a + kept step.""" + from gmlx.image import api + from gmlx.image.conditioning import ByteLRU + + m = _manifest(variant, EXACT_SIZE) + arrays, _ = fixture(m["name"]) + if not exact_process(): + pipes.release() + return rerun_exact(request, "flux2 check6 exact") + pipe = pipes(m) + pipe.dit.act_dtype = mx.float32 + n = fg.exact_floats(pipe.dit, pipes.path) + gate = {k: EXACT_REL_L2 for k in _kept(m)} + with fg._exact(pipe.dit): + got, finite = _run(pipe, arrays, m, variant, EXACT_SIZE) + print(_line(f"flux2 check6 exact {variant} {EXACT_SIZE}, {n} float " + "tensors in fp32", got, gate)) + assert finite and sorted(got) == sorted(gate) + over = {k: v for k, v in got.items() if v > EXACT_REL_L2} + for name, (apply, stop, neg, tokens) in EXACT_FAULTS[variant].items(): + with monkeypatch.context() as mp: + # The memos of the clean run would hand the fault its + # modulations and its caption. + mp.setattr(pipe, "modulations", ByteLRU(api.MODULATION_BYTES)) + mp.setattr(pipe, "captions", ByteLRU(api.CAPTION_BYTES)) + if apply is not None: + apply(mp, pipe) + with fg._exact(pipe.dit): + bad, _ = _run(pipe, arrays, m, variant, EXACT_SIZE, + stop=stop, neg=neg, tokens=tokens) + print(_line(f"flux2 check6 exact {variant} {EXACT_SIZE}, {name}", + bad, gate)) + assert bad and max(bad.values()) > EXACT_REL_L2, (name, bad) + assert not over, over + + +@pytest.mark.integration +def test_another_image_size_schedule_fails_the_kept_steps(pipes): + """A distilled run at 512 on the schedule of a 1024 image.""" + variant = "distilled" + m = _manifest(variant, GATE_SIZE) + arrays, _ = fixture(m["name"]) + gates = _gates(variant) + got, _ = _run(pipes(m), arrays, m, variant, GATE_SIZE, stop=2, + tokens=4096) + share = {k: v / gates[k] for k, v in got.items()} + print(f"flux2 check6 the schedule of a 1024 image: {share}") + assert share and min(share.values()) > 1.0, share + + +@pytest.mark.integration +def test_base_without_its_unconditional_row_fails_the_kept_steps(pipes): + variant = "base" + m = _manifest(variant, GATE_SIZE) + arrays, _ = fixture(m["name"]) + gates = _gates(variant) + got, _ = _run(pipes(m), arrays, m, variant, GATE_SIZE, stop=2, neg=True) + share = {k: v / gates[k] for k, v in got.items()} + print(f"flux2 check6 prompt as the unconditional row: {share}") + assert share and min(share.values()) > 1.0, share From d6b3cecd55db2063f3e0733a0b3cf08b51e045a9 Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 08:29:24 -0700 Subject: [PATCH 014/101] feat(image): flux2 klein edits take reference images by the rules of encode_image_refs --- THIRD_PARTY_NOTICES.md | 2 +- gmlx/image/families/flux2_klein/edit.py | 127 +++++++++++++ gmlx/image/families/flux2_klein/family.py | 44 ++++- gmlx/image/families/flux2_klein/model.py | 7 +- licenses/flux2-LICENSE | 11 +- tests/image/test_image_flux2_edit.py | 207 ++++++++++++++++++++++ tests/image/test_image_flux2_model.py | 3 +- 7 files changed, 391 insertions(+), 10 deletions(-) create mode 100644 gmlx/image/families/flux2_klein/edit.py create mode 100644 tests/image/test_image_flux2_edit.py diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index f32041ca1..793667ddc 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -22,7 +22,7 @@ in [`licenses/`](licenses/). | [mflux](https://github.com/filipstrand/mflux) | MIT | The Z-Image transformer at commit `e066d98`, ported to `gmlx/image/families/z_image/model.py` with the fused qkv kept and modules named after the GGUF tensors, and its attention, timestep and RoPE helpers in `gmlx/image/ops/attention.py` and `gmlx/image/ops/embeds.py`. | | [diffusers](https://github.com/huggingface/diffusers) | Apache-2.0 | Code at commit `e0abab8`, ported to MLX and modified for gmlx: the Z-Image forward of `transformer_z_image.py` in `gmlx/image/families/z_image/model.py`, its timestep embedding, RoPE tables and rotary product in `gmlx/image/ops/embeds.py` and `gmlx/image/ops/attention.py`, the RMSNorm rounding of `normalization.py` in `gmlx/image/ops/norms.py`, and the FLUX.1 autoencoder of `autoencoders/vae.py`, `resnet.py`, `unet_2d_blocks.py`, `downsampling.py`, `upsampling.py` and `attention_processor.py` in `gmlx/image/vae/flux1_ae.py`, the quant convs and BatchNorm statistics of `autoencoders/autoencoder_kl_flux2.py` in `gmlx/image/vae/flux2_ae.py`, the Qwen-Image 2.1 autoencoder of `autoencoders/autoencoder_kl_qwenimage21.py`, for one frame, in `gmlx/image/vae/qwen_image21_vae.py`, and the UniPC bh2 sampler of `schedulers/scheduling_unipc_multistep.py` in `gmlx/image/unipc.py`. Also the Qwen-Image 2.1 forward, token layout and RoPE of `transformer_qwenimage21.py` in `gmlx/image/families/qwen_image21/model.py` and `layout.py`, and the dynamic shift of `pipelines/qwenimage21/pipeline_qwenimage21.py` and `schedulers/scheduling_flow_match_euler_discrete.py` in `gmlx/image/schedule.py`, and the reference image sizes, the prompt template with image slots and the image branch of the encoder tap of that pipeline in `gmlx/image/families/qwen_image21/edit.py`. For Krea 2, at the same commit: the forward of `transformer_krea2.py` in `gmlx/image/families/krea2/model.py`, the Qwen-Image autoencoder of `autoencoders/autoencoder_kl_qwenimage.py`, for one frame, in `gmlx/image/vae/qwen_image_vae.py`, the prompt template, encoder layers and constants of `pipelines/krea2/pipeline_krea2.py` and `modular_pipelines/krea2/` in `gmlx/image/families/krea2/family.py`, and the schedule of that pipeline in `krea2_sigmas` of `gmlx/image/schedule.py`. | | [flux-3-image-klein](https://github.com/black-forest-labs/flux-3-image-klein) | Apache-2.0 | BFL's FLUX.3 klein reference at commit `45e57c9`, ported to MLX and modified for gmlx: the DiT constants and tensor layout of `src/flux3/dit.py`, the image RoPE scale and schedule alpha of `src/flux3/pipeline.py` and the encoder layers, pad multiple, length, pad token and position and chat template of `src/flux3/text_encoder.py` in `gmlx/image/families/flux3_klein/family.py`, the DiT forward of `src/flux3/dit.py` with the position ids of `pipeline.py`, `autoencoder.py` and `text_encoder.py` in `gmlx/image/families/flux3_klein/model.py`, the schedule of `src/flux3/sampling.py` in `flux3_sigmas` of `gmlx/image/schedule.py`, the latent patchify and BatchNorm of `src/flux3/autoencoder.py` in `gmlx/image/vae/flux2_ae.py`, and the reference canvas, reference preparation and default size of `src/flux3/pipeline.py` with the reference choice and output crop of `src/flux3/generate.py` in `gmlx/image/families/flux3_klein/edit.py`. | -| [flux2](https://github.com/black-forest-labs/flux2) | Apache-2.0 | BFL's FLUX.2 reference at commit `50fe516`, ported to MLX and modified for gmlx: the DiT constants of `Klein4BParams`, `Klein9BParams` and `Flux2Params` and the tensor names and shapes of `Flux2` in `src/flux2/model.py`, the sampling defaults of `FLUX2_MODEL_INFO` in `src/flux2/util.py`, the prompt rules of `Qwen3Embedder` in `src/flux2/text_encoder.py` and the rounding of `denoise` and `denoise_cfg` in `src/flux2/sampling.py` in `gmlx/image/families/flux2_klein/family.py`, the DiT forward of `src/flux2/model.py` with the token ids of `prc_img`, `prc_txt` and `encode_image_refs` in `src/flux2/sampling.py` in `gmlx/image/families/flux2_klein/model.py`, and the schedule of `compute_empirical_mu` and `get_schedule` in `src/flux2/sampling.py` in `flux2_mu` and `flux2_sigmas` of `gmlx/image/schedule.py`. | +| [flux2](https://github.com/black-forest-labs/flux2) | Apache-2.0 | BFL's FLUX.2 reference at commit `50fe516`, ported to MLX and modified for gmlx: the DiT constants of `Klein4BParams`, `Klein9BParams` and `Flux2Params` and the tensor names and shapes of `Flux2` in `src/flux2/model.py`, the sampling defaults of `FLUX2_MODEL_INFO` in `src/flux2/util.py`, the prompt rules of `Qwen3Embedder` in `src/flux2/text_encoder.py`, the rounding of `denoise` and `denoise_cfg` and the reference image rules of `encode_image_refs` in `src/flux2/sampling.py` in `gmlx/image/families/flux2_klein/family.py`, the DiT forward of `src/flux2/model.py` with the token ids of `prc_img`, `prc_txt` and `encode_image_refs` in `src/flux2/sampling.py` in `gmlx/image/families/flux2_klein/model.py`, and the schedule of `compute_empirical_mu` and `get_schedule` in `src/flux2/sampling.py` in `flux2_mu` and `flux2_sigmas` of `gmlx/image/schedule.py`, and the reference image preparation of `encode_image_refs` and `default_prep` in `src/flux2/sampling.py` in `gmlx/image/families/flux2_klein/edit.py`. | | [ComfyUI-GGUF](https://github.com/city96/ComfyUI-GGUF) | Apache-2.0 | The model detection keys of `convert.py` at commit `6ea2651`, which `gmlx/image/fingerprint.py` uses to refuse other diffusion model layouts by name. | | [misaki](https://github.com/hexgrad/misaki) | Apache-2.0 | Whole package vendored at `gmlx/_vendor/misaki` (commit `fba1236`): Kokoro's grapheme-to-phoneme front-end, used by the TTS service until upstream's next PyPI release. | | [musl](https://musl.libc.org) | MIT | Statically linked into the guest entry binary `gmlx/container/guest/gmlx-entry` as its C library ([`licenses/musl-COPYRIGHT`](licenses/musl-COPYRIGHT)). | diff --git a/gmlx/image/families/flux2_klein/edit.py b/gmlx/image/families/flux2_klein/edit.py new file mode 100644 index 000000000..aaf43b8a2 --- /dev/null +++ b/gmlx/image/families/flux2_klein/edit.py @@ -0,0 +1,127 @@ +# SPDX-License-Identifier: Apache-2.0 AND MIT +# SPDX-FileCopyrightText: Copyright 2025 Black Forest Labs, Inc. +# Ported from BFL's FLUX.2 reference at commit 50fe516: the preparation of +# reference images of encode_image_refs and default_prep, with +# cap_min_pixels, cap_pixels and center_crop_to_multiple_of_x, in +# src/flux2/sampling.py, and modified for gmlx (Apache-2.0; see +# licenses/flux2-LICENSE). +"""The reference images of a FLUX.2 klein edit, by the rules of the +reference's encode_image_refs. + +The encoder reads the prompt alone. The references go to the DiT only, +as VAE latents after the image tokens. A reference must have sides of +at least 64 pixels and an aspect ratio of at most 8. One reference is +fitted under 2024 x 2024 pixels and each of several under 1024 x 1024, +with the sides of the fitted size floored, and each is then cropped to +the 16 pixel grid, centered. A request without a size takes the size of +the first prepared reference.""" +from __future__ import annotations + +import math + +import numpy as np + +from gmlx.image.conditioning import Reference + +from .family import REFERENCES + + +class Prepared(tuple): + """The prepared references of a request, in order. ``crop`` is None: + the output of an edit is never cropped.""" + + crop = None + + +class BadReference(ValueError): + """A reference image the rules refuse. ``index`` is its place in the + request.""" + + def __init__(self, message: str, index: int): + super().__init__(message) + self.index = index + + +def _rgb(image): + """``image`` upright and in RGB: the EXIF orientation applied, as + image loaders do before the reference reads a file, and an alpha + channel dropped, not composited, as the reference's convert does.""" + from PIL import Image, ImageOps + + if isinstance(image, Reference): + image = image.pixels + if isinstance(image, np.ndarray): + a = np.asarray(image) + if a.dtype != np.uint8 or a.ndim != 3 or a.shape[2] not in (3, 4): + raise ValueError("a reference array must be (H, W, 3) or " + f"(H, W, 4) uint8, not {a.dtype} {a.shape}") + image = Image.fromarray(a, "RGBA" if a.shape[2] == 4 else "RGB") + return ImageOps.exif_transpose(image).convert("RGB") + + +def _reference(image) -> Reference: + px = np.asarray(image, np.uint8) + alpha = np.full(px.shape[:2] + (1,), 255, np.uint8) + return Reference(np.concatenate([px, alpha], axis=2)) + + +def check_size(width: int, height: int) -> None: + """Refuse a reference with a side under the least or an aspect ratio + past the most, as cap_min_pixels does.""" + r = REFERENCES.values + low, most = r["min_side"], r["max_aspect"] + if width < low or height < low: + raise ValueError(f"a reference of {width}x{height} pixels has a " + f"side under {low}") + if width / height > most or height / width > most: + raise ValueError(f"a reference of {width}x{height} pixels is wider " + f"or taller than {most} to 1") + + +def fitted_size(width: int, height: int, limit: int) -> tuple: + """(width, height) of a reference under ``limit`` pixels, as + cap_pixels sizes it.""" + if width * height <= limit: + return width, height + scale = math.sqrt(limit / (width * height)) + return int(width * scale), int(height * scale) + + +def prepare_one(image, limit: int) -> Reference: + """One reference: checked, fitted under ``limit`` pixels by a Lanczos + resize, and cropped to the grid, centered.""" + from PIL import Image + + image = _rgb(image) + check_size(*image.size) + fit = fitted_size(*image.size, limit) + if fit != image.size: + image = image.resize(fit, Image.Resampling.LANCZOS) + g = REFERENCES.values["grid"] + width, height = image.size + w, h = width // g * g, height // g * g + left, top = (width - w) // 2, (height - h) // 2 + return _reference(image.crop((left, top, left + w, top + h))) + + +def prepare(images) -> Prepared: + """The references of a request by the rule of their count. An image + the rules refuse raises BadReference.""" + images = list(images) + r = REFERENCES.values + if len(images) > r["max_refs"]: + raise ValueError(f"at most {r['max_refs']} references, and the " + f"request has {len(images)}") + limit = r["one_max_pixels"] if len(images) == 1 else r["multi_max_pixels"] + out = [] + for i, image in enumerate(images): + try: + out.append(prepare_one(image, limit)) + except ValueError as e: + raise BadReference(str(e), i) from None + return Prepared(out) + + +def default_size(refs) -> tuple | None: + """(width, height) of the first prepared reference, None without.""" + return (refs[0].width, refs[0].height) if refs else None diff --git a/gmlx/image/families/flux2_klein/family.py b/gmlx/image/families/flux2_klein/family.py index afddc9177..06737fd3d 100644 --- a/gmlx/image/families/flux2_klein/family.py +++ b/gmlx/image/families/flux2_klein/family.py @@ -4,8 +4,9 @@ # Klein4BParams, Klein9BParams and Flux2Params in src/flux2/model.py and # the defaults of FLUX2_MODEL_INFO in src/flux2/util.py, the tensor names # and shapes of Flux2 in src/flux2/model.py, the prompt rules of -# Qwen3Embedder in src/flux2/text_encoder.py and the rounding of denoise -# and denoise_cfg in src/flux2/sampling.py, and modified for gmlx +# Qwen3Embedder in src/flux2/text_encoder.py, the rounding of denoise +# and denoise_cfg and the reference image rules of encode_image_refs and +# cap_min_pixels in src/flux2/sampling.py, and modified for gmlx # (Apache-2.0; see licenses/flux2-LICENSE). """FLUX.2 klein fingerprint, constants, config synthesis and the hooks of its registry row. @@ -24,8 +25,8 @@ import re from gmlx.image.fingerprint import HeaderView, Match, Refusal -from gmlx.image.registry import (ConstantsRow, Family, LoopRules, - SamplingRow, VariantRow) +from gmlx.image.registry import (ConstantsRow, EditParts, Family, + LoopRules, SamplingRow, VariantRow) TITLE = "FLUX.2 klein" # What a refusal of another FLUX model names as the ones gmlx image runs. @@ -333,6 +334,39 @@ def synth_config(view: HeaderView) -> dict: } +# The reference images of an edit, by encode_image_refs and default_prep +# in src/flux2/sampling.py: sides of 64 pixels at least and an aspect +# ratio of 8 at most, one reference under 2024 x 2024 pixels and each of +# several under 1024 x 1024, cropped to the grid of one latent token. The +# reference sets no count; gmlx takes 10, as FLUX.3 klein's does. The +# encoder reads the prompt alone, and the references reach the DiT as +# latents only. +REFERENCES = ConstantsRow( + values={ + "max_refs": 10, + "one_max_pixels": 2024 ** 2, + "multi_max_pixels": 1024 ** 2, + "min_side": 64, + "max_aspect": 8, + "grid": 16, + }, + repo="github.com/black-forest-labs/flux2", + revision="50fe5162777813d869182b139e83b10743caef15", +) + + +def _prepare_all(images): + from .edit import prepare + + return prepare(images) + + +def _size(refs): + from .edit import default_size + + return default_size(refs) + + FAMILY = Family( name="flux2_klein", title=TITLE, @@ -356,4 +390,6 @@ def synth_config(view: HeaderView) -> dict: sampling=SAMPLING, schedule=schedule, loop=LOOP, + edit=EditParts(max_refs=REFERENCES.values["max_refs"], + prepare_all=_prepare_all, size=_size), ) diff --git a/gmlx/image/families/flux2_klein/model.py b/gmlx/image/families/flux2_klein/model.py index 8b1dcc3a2..348021fea 100644 --- a/gmlx/image/families/flux2_klein/model.py +++ b/gmlx/image/families/flux2_klein/model.py @@ -460,8 +460,11 @@ def chunks(mod, n): def references(self, latents) -> References: """The reference latents (B, C, h, w), in the order of their - images, as the tokens and ids the DiT takes.""" - return References.of(list(latents)) + images, as the tokens and ids the DiT takes. The tokens are + bf16, as encode_image_refs gives them, so an fp32 run reads the + references the reference's does.""" + return References.of([mx.array(z).astype(mx.bfloat16) + for z in latents]) def caption(self, feats: mx.array, taps: dict | None = None) -> Caption: """The text tokens of features (B, L, text dim) after txt_in.""" diff --git a/licenses/flux2-LICENSE b/licenses/flux2-LICENSE index 6285324f8..61d3209be 100644 --- a/licenses/flux2-LICENSE +++ b/licenses/flux2-LICENSE @@ -9,8 +9,12 @@ source. Klein4BParams, Klein9BParams and Flux2Params in src/flux2/model.py, the defaults of FLUX2_MODEL_INFO in src/flux2/util.py, the tensor names and shapes of Flux2 in src/flux2/model.py, the prompt rules of - Qwen3Embedder in src/flux2/text_encoder.py, and the rounding of denoise - and denoise_cfg in src/flux2/sampling.py. + Qwen3Embedder in src/flux2/text_encoder.py, the rounding of denoise + and denoise_cfg in src/flux2/sampling.py, and the reference image rules + of encode_image_refs and cap_min_pixels in src/flux2/sampling.py. +- gmlx/image/families/flux2_klein/edit.py: the preparation of reference + images of encode_image_refs and default_prep, with cap_min_pixels, + cap_pixels and center_crop_to_multiple_of_x, in src/flux2/sampling.py. - gmlx/image/families/flux2_klein/model.py: the Flux2 forward, DoubleStreamBlock, SingleStreamBlock, SelfAttention, SiLUActivation, Modulation, LastLayer, MLPEmbedder, QKNorm, timestep_embedding and rope @@ -21,6 +25,9 @@ source. - tests/image/test_image_check3_flux2_klein.py: schedule, a transcription of get_schedule and compute_empirical_mu in src/flux2/sampling.py with their constants. +- tests/image/test_image_flux2_edit.py: _official, a transcription of + cap_min_pixels, cap_pixels and center_crop_to_multiple_of_x in + src/flux2/sampling.py on sizes. flux2 is distributed under the Apache License 2.0: diff --git a/tests/image/test_image_flux2_edit.py b/tests/image/test_image_flux2_edit.py new file mode 100644 index 000000000..af233b5d0 --- /dev/null +++ b/tests/image/test_image_flux2_edit.py @@ -0,0 +1,207 @@ +"""Reference images of FLUX.2 klein: the size check, pixel cap and grid +crop of the reference's encode_image_refs, the refusals, and the +conditioning a pipeline makes of a prompt with references, whose encoder +reads the prompt alone and whose references reach the DiT as VAE latents +in bf16. CPU tier.""" +from __future__ import annotations + +import dataclasses +import io +import math + +import mlx.core as mx +import numpy as np +import pytest +from test_image_api import _Encoder +from test_image_flux3_edit import _RefDit, _Vae + +from gmlx.image import api +from gmlx.image.families.flux2_klein import edit +from gmlx.image.families.flux2_klein import family as ff +from gmlx.image.families.flux2_klein import model as fm +from gmlx.image.registry import get_family + +PIL = pytest.importorskip("PIL") + + +def _picture(w: int, h: int, seed: int = 0, channels: int = 3): + rng = np.random.default_rng(seed) + return rng.integers(0, 256, (h, w, channels)).astype(np.uint8) + + +# SPDX-FileCopyrightText: Copyright 2025 Black Forest Labs, Inc. +# _official transcribes cap_min_pixels, cap_pixels and +# center_crop_to_multiple_of_x of src/flux2/sampling.py of BFL's FLUX.2 +# reference at commit 50fe516 on sizes (Apache-2.0; see +# licenses/flux2-LICENSE). +def _official(width: int, height: int, limit: int): + """(resized size, crop box) of a reference, or None when refused.""" + if width < 64 or height < 64: + return None + if width / height > 8 or height / width > 8: + return None + if width * height > limit: + scale = math.sqrt(limit / (width * height)) + width, height = int(width * scale), int(height * scale) + new_w, new_h = (width // 16) * 16, (height // 16) * 16 + left, top = (width - new_w) // 2, (height - new_h) // 2 + return (width, height), (left, top, left + new_w, top + new_h) + + +ONE, SEVERAL = 2024 ** 2, 1024 ** 2 +SIZES = [(600, 400), (400, 400), (608, 400), (2400, 1800), (64, 64), + (63, 400), (512, 64), (513, 64), (64, 512), (64, 513), (2024, 2024), + (2025, 2024), (4096, 4096), (1366, 768), (1031, 777), (8000, 1000), + (1, 1)] + + +@pytest.mark.parametrize("size", SIZES) +@pytest.mark.parametrize("limit", [ONE, SEVERAL]) +def test_the_size_of_a_reference_is_the_reference_rule(size, limit): + want = _official(*size, limit) + if want is None: + with pytest.raises(ValueError): + edit.check_size(*size) + return + edit.check_size(*size) + assert edit.fitted_size(*size, limit) == want[0] + + +def test_the_rows_name_their_source(): + r = ff.REFERENCES + assert r.values == {"max_refs": 10, "one_max_pixels": ONE, + "multi_max_pixels": SEVERAL, "min_side": 64, + "max_aspect": 8, "grid": 16} + assert r.repo == "github.com/black-forest-labs/flux2" + assert r.revision == ff.PROMPT.revision + parts = ff.FAMILY.edit + assert parts is not None and parts.max_refs == 10 and parts.text_only + assert parts.prepare is None and parts.encode is None + one = _picture(600, 400) + got = parts.prepare_all([one]) + assert got.crop is None and len(got) == 1 + assert parts.size(got) == (592, 400) + + +@pytest.mark.parametrize("size", [(600, 400), (1031, 777), (2400, 1800), + (512, 64)]) +@pytest.mark.parametrize("count", [1, 2]) +def test_a_reference_is_fitted_with_lanczos_and_cropped_centered(size, + count): + from PIL import Image + + src = _picture(*size) + limit = ONE if count == 1 else SEVERAL + (w, h), box = _official(*size, limit) + fitted = Image.fromarray(src) + if (w, h) != size: + fitted = fitted.resize((w, h), Image.Resampling.LANCZOS) + want = np.asarray(fitted.crop(box)) + refs = edit.prepare([src] * count) + assert refs.crop is None and len(refs) == count + for ref in refs: + assert (ref.pixels[..., 3] == 255).all() + assert np.array_equal(ref.pixels[..., :3], want) + assert edit.default_size(refs) == (box[2] - box[0], box[3] - box[1]) + assert edit.default_size(()) is None + + +def test_one_reference_keeps_more_pixels_than_each_of_several(): + src = _picture(2400, 1800) + (one,) = edit.prepare([src]) + two = edit.prepare([src, src]) + assert (one.width, one.height) == (2336, 1744) + assert (two[0].width, two[0].height) == (1168, 880) + + +def test_a_reference_is_upright_and_its_alpha_dropped_not_composited(): + from PIL import Image + + src = _picture(80, 72, channels=4) + src[..., 3] = 0 + (ref,) = edit.prepare([src]) + assert (ref.pixels[..., 3] == 255).all() + assert np.array_equal(ref.pixels[..., :3], src[4:68, :, :3]) + # The EXIF orientation applies before the rule: 6 turns it a quarter. + im = Image.fromarray(_picture(96, 64)) + exif = im.getexif() + exif[0x0112] = 6 + buf = io.BytesIO() + im.save(buf, format="JPEG", exif=exif) + with Image.open(io.BytesIO(buf.getvalue())) as jpg: + jpg.load() + (turned,) = edit.prepare([jpg]) + assert (turned.width, turned.height) == (64, 96) + # A prepared reference prepares again to itself. + again = edit.prepare([ref]) + assert np.array_equal(again[0].pixels, ref.pixels) + + +def test_the_rules_refuse_what_they_cannot_prepare(): + ok = _picture(64, 64) + with pytest.raises(edit.BadReference, match="side under 64") as e: + edit.prepare([ok, _picture(63, 400)]) + assert e.value.index == 1 + with pytest.raises(edit.BadReference, match="than 8 to 1") as e: + edit.prepare([_picture(513, 64)]) + assert e.value.index == 0 + with pytest.raises(ValueError, match="at most 10 references"): + edit.prepare([ok] * 11) + with pytest.raises(edit.BadReference, match="uint8"): + edit.prepare([np.zeros((64, 64, 3), np.float32)]) + + +def test_the_dit_reads_its_references_in_bf16_with_the_ids_of_their_index(): + """encode_image_refs gives its tokens in bf16, and each reference its + time coordinate 10 + 10 i.""" + rng = np.random.default_rng(0) + a = mx.array(rng.standard_normal((1, 8, 2, 3)).astype(np.float32)) + b = mx.array(rng.standard_normal((1, 8, 1, 2)).astype(np.float32)) + refs = fm.Flux2KleinDiT.references(None, [a, b]) + assert refs.tokens.dtype == mx.bfloat16 + toks = np.array(refs.tokens.astype(mx.float32)) + plain = np.concatenate([np.array(fm.tokens(z)) for z in (a, b)], axis=1) + want = np.concatenate([np.array(fm.tokens(z).astype(mx.bfloat16) + .astype(mx.float32)) for z in (a, b)], + axis=1) + assert np.array_equal(toks, want) + assert not np.array_equal(toks, plain) + assert sorted(set(refs.ids[:, 0].tolist())) == [10.0, 20.0] + + +@pytest.fixture +def pipe(monkeypatch): + from gmlx.image.vae import tiling + + monkeypatch.setattr(tiling, "_plan", lambda *a, **k: False) + fam = dataclasses.replace(get_family("z_image"), + edit=get_family("flux2_klein").edit) + return api.ImagePipeline(dit=_RefDit(), family=fam, variant="turbo", + encoder=_Encoder(), vae=_Vae()) + + +def test_a_text_only_edit_encodes_the_prompt_alone(pipe): + a, b = _picture(600, 400, 1), _picture(400, 400, 2) + text = api.encode_text(pipe, "ab") + cond = api.encode_text(pipe, "ab", images=[a, b], ref_latents=False) + assert pipe.encoder.encoded == ["ab"] + assert cond.key == text.key and cond.features is text.features + assert cond.image_slots == () and cond.pending + assert [r.identity for r in cond.refs] == [ + r.identity for r in edit.prepare([a, b])] + assert pipe.vae.calls == [] + done = api.encode_text(pipe, "ab", images=[a, b]) + assert not done.pending and len(done.ref_latents) == 2 + assert pipe.vae.calls == [(1, 400, 592, 3), (1, 400, 400, 3)] + + +def test_references_take_no_area_and_prepared_ones_pass_through(pipe): + a = _picture(600, 400) + refs = api.references(pipe, [a]) + assert refs.crop is None and [(r.width, r.height) for r in refs] == [ + (592, 400)] + assert api.references(pipe, list(refs)) == tuple(refs) + with pytest.raises(ValueError, match="takes no reference area"): + api.references(pipe, [a], area=512 * 512) + with pytest.raises(ValueError, match="at most 10 reference images"): + api.references(pipe, [a] * 11) diff --git a/tests/image/test_image_flux2_model.py b/tests/image/test_image_flux2_model.py index a7c436ec1..d1857b1c4 100644 --- a/tests/image/test_image_flux2_model.py +++ b/tests/image/test_image_flux2_model.py @@ -159,7 +159,8 @@ def test_the_reference_tokens_run_in_the_activation_dtype(tiny): arrays, _ = committed_fixture(TINY) model = fg.tiny_model(weights, cfg, act=mx.bfloat16) lat, feats, refs, sigma = fg.inputs(model, arrays) - refs = fm.References(refs.tokens * (1 + 2.0 ** -12) + 1e-3, refs.ids) + refs = fm.References(refs.tokens.astype(mx.float32) * (1 + 2.0 ** -12) + + 1e-3, refs.ids) rounded = fm.References(refs.tokens.astype(mx.bfloat16), refs.ids) assert not mx.array_equal(rounded.tokens.astype(mx.float32), refs.tokens).item() From b0dd69d6df84993caefc414d52c133699d51a8bc Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 08:29:24 -0700 Subject: [PATCH 015/101] test(image): flux2 klein check 6 edit with one reference against the oracle --- .../image_oracle/check6_flux2_klein_edit.py | 362 ++++++++++++ .../check6_flux2_klein_edit.manifest.json | 517 ++++++++++++++++++ .../test_image_check6_flux2_klein_edit.py | 205 +++++++ 3 files changed, 1084 insertions(+) create mode 100644 scripts/image_oracle/check6_flux2_klein_edit.py create mode 100644 tests/fixtures/image/oracle/check6_flux2_klein_edit.manifest.json create mode 100644 tests/image/test_image_check6_flux2_klein_edit.py diff --git a/scripts/image_oracle/check6_flux2_klein_edit.py b/scripts/image_oracle/check6_flux2_klein_edit.py new file mode 100644 index 000000000..0388ec98c --- /dev/null +++ b/scripts/image_oracle/check6_flux2_klein_edit.py @@ -0,0 +1,362 @@ +#!/usr/bin/env python3 +"""Check 6 oracle for FLUX.2 klein edits: a whole sampling run with one +reference image, on injected noise, to the final latents, and the +preparation of reference images of several sizes. + +The references are prepared by the reference's own encode_image_refs in +src/flux2/sampling.py, with BFL's AutoEncoder in float32 from +--autoencoder: default_prep under the pixel limit of the reference count, +the encode, and the ids of each reference's index. The run is +check6_flux2_klein's text to image path with those tokens and ids as +img_cond_seq and img_cond_seq_ids, the size the first prepared reference's +(gmlx's default; the CLI's match_image_size takes the source's own size, +and its default is 1360 x 768). The DiT's input is kept at every call, so +the fixture holds the reference tokens and ids the DiT read, and the +encode is kept in float32 before encode_image_refs rounds it to bf16. + +The oracle environment has no torchvision. default_prep reads it for +ToTensor alone, so a stand-in gives ToTensor's result for an RGB image: +the uint8 pixels, channels first, divided by 255 in float32. The +preparations of the sources of PREPARE are the PIL images default_prep +makes before ToTensor, kept as uint8, and each is checked against +default_prep's tensor. A source the rules refuse is kept with its error. + + python scripts/image_oracle/run.py --python --threads 16 \\ + check6_flux2_klein_edit.py --reference /src \\ + --reference-commit --dit flux-2-klein-4b-Q4_K_M.gguf \\ + --variant distilled --autoencoder ae.safetensors \\ + --features check2_flux2_klein.npz +""" + +from __future__ import annotations + +import argparse +import sys +import time +import types +from pathlib import Path + +import numpy as np + +import check3_flux2_klein as c3 +import check6_flux2_klein as c6 +import fixtures +import oracle + +NAME = "check6_flux2_klein_edit" +SCRIPT = "scripts/image_oracle/check6_flux2_klein_edit.py" +SEED = 6 +# Synthetic sources, (width, height, channels). +SOURCES = {"wide": (600, 400, 3), "square": (400, 400, 4), + "large": (2400, 1800, 3), "many": (1600, 1000, 3), + "odd": (1031, 777, 3), "narrow": (512, 64, 3), + "small": (64, 40, 3), "long": (513, 64, 3)} +# The edit the DiT runs: its sources, in order. +CASE = ("wide",) +# Sources prepared as one reference and as one of several. +PREPARE = {"one": ("wide", "square", "large", "odd", "narrow", "small", + "long"), + "several": ("wide", "large", "many", "odd")} +RULE = ("latents after a kept step and after the last: relative L2 at " + "twice the oracle's own bf16 against fp32 relative L2 after that " + "step, on the run's own size") + + +def source(rng, width: int, height: int, channels: int) -> np.ndarray: + """A picture of gradients, rectangles and a little noise, (H, W, C) + uint8.""" + y, x = np.mgrid[0:height, 0:width].astype(np.float32) + img = np.stack([x / max(1, width - 1) * 255, + y / max(1, height - 1) * 255, + (x + y) / max(1, width + height - 2) * 255], axis=-1) + for _ in range(12): + x0, x1 = sorted(rng.integers(0, width, 2)) + y0, y1 = sorted(rng.integers(0, height, 2)) + img[y0:y1 + 1, x0:x1 + 1] = rng.integers(0, 256, 3) + img += rng.normal(0, 6, img.shape) + img = np.clip(np.rint(img), 0, 255).astype(np.uint8) + if channels == 4: + alpha = rng.integers(0, 256, (height, width, 1), dtype=np.uint8) + img = np.concatenate([img, alpha], axis=-1) + return img + + +def pil(a: np.ndarray): + from PIL import Image + + return Image.fromarray(a, "RGBA" if a.shape[2] == 4 else "RGB") + + +def to_tensor_module(torch): + """A torchvision stand-in whose transforms.ToTensor gives torchvision's + result for an RGB PIL image.""" + def to_tensor(pic): + if pic.mode != "RGB": + raise SystemExit(f"error: ToTensor of a {pic.mode} image") + a = np.array(pic, np.uint8, copy=True) + return torch.from_numpy(a).permute(2, 0, 1).contiguous().to( + torch.float32).div(255) + + tv = types.ModuleType("torchvision") + tv.transforms = types.SimpleNamespace(ToTensor=lambda: to_tensor) + return tv + + +def prepared(sampling, image, limit: int): + """default_prep's PIL steps for ``image`` under ``limit`` pixels: the + uint8 pixels before ToTensor, or the error the rules raise.""" + try: + img = sampling.to_rgb(image) + img = sampling.cap_min_pixels(img) + img = sampling.cap_pixels(img, limit) + img = sampling.center_crop_to_multiple_of_x(img, 16) + except ValueError as e: + return None, str(e) + out = np.asarray(img, np.uint8) + t = oracle.to_numpy(sampling.default_prep(img=image, limit_pixels=limit)) + want = out.transpose(2, 0, 1).astype(np.float32) / np.float32(255) + if not np.array_equal(t, 2 * want - 1): + raise SystemExit("error: default_prep is not its PIL steps") + return out, None + + +class Encodes: + """BFL's AutoEncoder whose encode also keeps each output in float32, + before encode_image_refs rounds its tokens to bf16.""" + + def __init__(self, ae): + self.ae, self.kept = ae, [] + + def encode(self, x): + z = self.ae.encode(x) + self.kept.append(oracle.to_numpy(z.float())) + return z + + +class OnCPU: + """encode_image_refs moves each prepared image with .cuda(); on the + CPU that is the image itself.""" + + def __init__(self, torch): + self.torch = torch + + def __enter__(self): + self.real = self.torch.Tensor.cuda + self.torch.Tensor.cuda = lambda t, *a, **k: t + + def __exit__(self, *exc): + self.torch.Tensor.cuda = self.real + + +class Kept(c6.Recorded): + """c6.Recorded that also keeps the reference rows of the first call.""" + + def __init__(self, torch, model, n_img: int): + super().__init__(torch, model, n_img) + self.ref_tokens = self.ref_ids = None + + def __call__(self, **kw): + if self.ref_tokens is None: + self.ref_tokens = oracle.to_numpy(kw["x"][0, self.n_img:].float()) + self.ref_ids = oracle.to_numpy(kw["x_ids"][0, self.n_img:]) + return super().__call__(**kw) + + +def generate(torch, sampling, model, variant: str, feats: dict, + noise: np.ndarray, steps: int, guidance: float, dtype, + ref_tokens, ref_ids): + """c6.generate with the references after the image tokens.""" + _, _, h, w = noise.shape + prompt = torch.from_numpy(feats[c6.PROMPT][None].copy()).to( + torch.bfloat16) + if variant == "distilled": + ctx = prompt + else: + empty = torch.from_numpy(feats[""][None].copy()).to(torch.bfloat16) + ctx = torch.cat([empty, prompt], dim=0) + ctx, ctx_ids = sampling.batched_prc_txt(ctx) + randn = torch.from_numpy(noise.copy()).to(torch.bfloat16) + x, x_ids = sampling.batched_prc_img(randn) + timesteps = sampling.get_schedule(steps, x.shape[1]) + rec = Kept(torch, model, x.shape[1]) + run = sampling.denoise if variant == "distilled" else sampling.denoise_cfg + t0 = time.perf_counter() + out = run(rec, x.to(dtype), x_ids, ctx.to(dtype), ctx_ids, + timesteps=timesteps, guidance=guidance, + img_cond_seq=ref_tokens.to(dtype), img_cond_seq_ids=ref_ids) + end = time.perf_counter() + if len(rec.latents) != steps: + raise SystemExit(f"error: {len(rec.latents)} DiT calls for {steps} " + f"steps") + if not np.array_equal(c6.to_latents(rec.latents[0], h, w), + oracle.to_numpy(randn)): + raise SystemExit("error: the first latents are not the noise " + "rounded to bf16") + after = [c6.to_latents(t, h, w) + for t in rec.latents[1:] + [oracle.to_numpy(out[0])]] + secs = np.diff(np.array([t0, *rec.marks[1:], end])) + return (after, np.float32(rec.times), secs, + np.asarray(timesteps, np.float32), rec) + + +def main(argv=None) -> int: + ap = argparse.ArgumentParser(description=__doc__.split("\n\n")[0]) + ap.add_argument("--reference", type=Path, required=True, + help="src directory of BFL's flux2") + ap.add_argument("--reference-commit", required=True, + help="the commit of --reference, for the manifest") + ap.add_argument("--dit", type=Path, required=True, + help="FLUX.2 klein DiT GGUF") + ap.add_argument("--variant", choices=("distilled", "base"), + required=True, help="the checkpoint --dit holds") + ap.add_argument("--autoencoder", type=Path, required=True, + help="BFL's ae.safetensors") + ap.add_argument("--features", type=Path, required=True, + help="check 2 .npz with features_plain and " + "features_empty") + ap.add_argument("--no-bf16", action="store_true") + ap.add_argument("--steps", type=int, + help="steps, FLUX2_MODEL_INFO's for the variant when " + "unset") + ap.add_argument("--seed", type=int, default=SEED) + ap.add_argument("--dequant", choices=oracle.DEQUANT, default="exact") + ap.add_argument("--name", default=NAME) + ap.add_argument("--out", type=Path, + help="fixture directory (default $GMLX_IMAGE_FIXTURES)") + a = ap.parse_args(argv) + torch = oracle.setup() + oracle.set_dequant(a.dequant) + fm, sampling, util = c6.reference(a.reference.expanduser()) + # sampling imported c6.reference's empty stand-in under its own name. + sampling.torchvision = to_tensor_module(torch) + from flux2 import autoencoder + from safetensors.torch import load_file + + t0 = time.perf_counter() + ae = autoencoder.AutoEncoder(autoencoder.AutoEncoderParams()) + ae.load_state_dict(load_file(str(a.autoencoder)), strict=True) + ae = ae.float().eval() + state, census = c3.gguf_state(torch, a.dit) + info = c6.model_info(util, fm, state, a.variant) + modes = ("fp32",) if a.no_bf16 else ("fp32", "bf16") + models = {m: c3.build(torch, fm, state, m) for m in modes} + print(f"[edit] loaded {a.dit.name} ({a.variant}, {info['key']}) and the " + f"autoencoder in {time.perf_counter() - t0:.1f}s, codecs {census}", + flush=True) + steps = a.steps or info["num_steps"] + guidance = info["guidance"] + keep = [k for k in c6.KEEP[a.variant] if k < steps] + feats = c6.load_features(torch, a.features) + fx = fixtures.FixtureWriter(a.name, check=6, family="flux2_klein", + script=SCRIPT) + fx.add_file("dit", a.dit) + fx.add_file("autoencoder", a.autoencoder) + fx.add_file("features", a.features) + fx.add("features", feats[c6.PROMPT]) + if a.variant == "base": + fx.add("features_empty", feats[""]) + rng = np.random.Generator(np.random.PCG64(a.seed)) + srcs = {k: source(rng, *v) for k, v in SOURCES.items()} + for k, img in srcs.items(): + fx.add(f"source_{k}", img) + limits = {"one": 2024 ** 2, "several": 1024 ** 2} + preps = {} + for rule, names in PREPARE.items(): + for k in names: + px, err = prepared(sampling, pil(srcs[k]), limits[rule]) + if px is not None: + fx.add(f"prepared_{rule}_{k}", px) + preps[f"{rule}_{k}"] = ({"size": [px.shape[1], px.shape[0]]} + if px is not None else {"error": err}) + fx.inputs["prepared"] = preps + enc = Encodes(ae) + with OnCPU(torch), torch.no_grad(): + ref_tokens, ref_ids = sampling.encode_image_refs( + enc, [pil(srcs[k]) for k in CASE]) + if len(enc.kept) != len(CASE): + raise SystemExit(f"error: {len(enc.kept)} reference encodes") + first = preps[f"one_{CASE[0]}"]["size"] if len(CASE) == 1 else None + width, height = first + h, w = height // 16, width // 16 + c = c3.params_of(fm, state).in_channels + noise = np.random.Generator(np.random.PCG64(a.seed)).standard_normal( + (1, c, h, w), dtype=np.float32) + fx.add("noise", noise) + fx.add("ref_tokens", oracle.to_numpy(ref_tokens[0].float())) + fx.add("ref_ids", oracle.to_numpy(ref_ids[0])) + lat = enc.kept[0] + if lat.shape != (1, c, h, w): + raise SystemExit(f"error: reference latents {lat.shape}") + rounded = oracle.to_numpy(torch.from_numpy(lat).to(torch.bfloat16).float()) + if not np.array_equal(c6.to_latents(oracle.to_numpy( + ref_tokens[0].float()), h, w), rounded): + raise SystemExit("error: the tokens are not the encode in bf16") + fx.add("ref_latents_0", lat) + oracle.emulate_bf16_matmul(False) + after, times, secs, schedule, rec = generate( + torch, sampling, models["fp32"], a.variant, feats, noise, steps, + guidance, torch.float32, ref_tokens, ref_ids) + c6.check_times(torch, schedule, times) + if not (np.array_equal(rec.ref_tokens, oracle.to_numpy( + ref_tokens[0].float())) + and np.array_equal(rec.ref_ids, oracle.to_numpy(ref_ids[0]))): + raise SystemExit("error: the DiT read other reference rows") + fx.add("schedule", schedule) + fx.add("times", times) + fx.add("latents", after[-1]) + for k in keep: + fx.add(f"latents_step{k}", after[k - 1]) + row = {"sources": list(CASE), "size": [width, height], + "fp32_s": round(float(secs.sum()), 1)} + print(f"[edit] {width}x{height}, fp32 {row['fp32_s']} s", flush=True) + if "bf16" in models: + oracle.emulate_bf16_matmul(True) + try: + after16, times16, secs16, _, _ = generate( + torch, sampling, models["bf16"], a.variant, feats, noise, + steps, guidance, torch.bfloat16, ref_tokens, ref_ids) + finally: + oracle.emulate_bf16_matmul(False) + if not np.array_equal(times16, times): + raise SystemExit("error: the bf16 run saw other times") + fx.add("latents_bf16", after16[-1]) + gap = fixtures.compare(after16[-1], after[-1]) + by_step = [fixtures.rel_l2(x, y) for x, y in zip(after16, after)] + row.update(bf16_s=round(float(secs16.sum()), 1), + latents_bf16_vs_fp32=gap, bf16_vs_fp32_by_step=by_step) + fx.tolerances["by_step_rel_l2"] = [2 * g for g in by_step] + print(f"[edit] bf16 {row['bf16_s']} s, final rel L2 " + f"{gap['rel_l2']:.3e}, by step " + f"{[f'{v:.2e}' for v in by_step]}", flush=True) + fx.results.update( + oracle={"device": "cpu", "threads": torch.get_num_threads(), + "dequant": oracle.dequant_mode(), + "bf16_matmul": "bf16 operands, float32 GEMM, one bf16 " + "rounding", + "autoencoder": "float32"}, + run=row) + fx.inputs.update( + variant=a.variant, model_info=info["key"], steps=steps, + guidance=guidance, seed=a.seed, kept_steps=keep, case=list(CASE), + sources=SOURCES, limits=limits, bf16="bf16" in models, + noise="numpy Generator(PCG64(seed)).standard_normal(shape, " + "dtype=float32), NCHW, (1, 128, height / 16, width / 16) of " + "the first prepared reference; the CLI's noise is bf16, so " + "it is rounded", + sources_rule="numpy Generator(PCG64(seed)) in SOURCES order: " + "gradients, 12 rectangles, normal noise of 6, and a " + "random alpha for 4 channels", + ref_tokens="encode_image_refs' bf16 tokens as float32, (L, 128)", + ref_ids="encode_image_refs' ids, (L, 4)", + ref_latents="the float32 encode of each reference, (1, 128, " + "height / 16, width / 16), before encode_image_refs " + "rounds its tokens to bf16", + reference_commit=a.reference_commit, gguf_codecs=census) + fx.tolerances["rule"] = RULE + path = fx.write(a.out) + print(f"[edit] wrote {path}", flush=True) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tests/fixtures/image/oracle/check6_flux2_klein_edit.manifest.json b/tests/fixtures/image/oracle/check6_flux2_klein_edit.manifest.json new file mode 100644 index 000000000..d3b932814 --- /dev/null +++ b/tests/fixtures/image/oracle/check6_flux2_klein_edit.manifest.json @@ -0,0 +1,517 @@ +{ + "schema": 1, + "name": "check6_flux2_klein_edit", + "check": 6, + "family": "flux2_klein", + "script": "scripts/image_oracle/check6_flux2_klein_edit.py", + "argv": [ + "check6_flux2_klein_edit.py", + "--reference", + "src", + "--reference-commit", + "50fe5162777813d869182b139e83b10743caef15", + "--dit", + "flux-2-klein-4b-Q4_K_M.gguf", + "--variant", + "distilled", + "--autoencoder", + "ae.safetensors", + "--features", + "check2_flux2_klein.npz" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": { + "dit": { + "name": "flux-2-klein-4b-Q4_K_M.gguf", + "size": 2604311104, + "sha256": "0b25d143c8469b342bc5af3bce92b783bf6b0636d285f7b2f75e38af63af9a15" + }, + "autoencoder": { + "name": "ae.safetensors", + "size": 336211292, + "sha256": "868fe7b343cc8f3a19dbcfcafbc3d5f888802be3f89bd81b65b3621a066ce8f3" + }, + "features": { + "name": "check2_flux2_klein.npz", + "size": 157354382, + "sha256": "207834c4c3c183edee80e865e3c8f6c445654fbb29862589f0778673b4c43613" + } + }, + "inputs": { + "prepared": { + "one_wide": { + "size": [ + 592, + 400 + ] + }, + "one_square": { + "size": [ + 400, + 400 + ] + }, + "one_large": { + "size": [ + 2336, + 1744 + ] + }, + "one_odd": { + "size": [ + 1024, + 768 + ] + }, + "one_narrow": { + "size": [ + 512, + 64 + ] + }, + "one_small": { + "error": "Skipping due to minimal sidelength underschritten h 40 w 64" + }, + "one_long": { + "error": "Skipping due to maximal ar overschritten h 64 w 513" + }, + "several_wide": { + "size": [ + 592, + 400 + ] + }, + "several_large": { + "size": [ + 1168, + 880 + ] + }, + "several_many": { + "size": [ + 1280, + 800 + ] + }, + "several_odd": { + "size": [ + 1024, + 768 + ] + } + }, + "variant": "distilled", + "model_info": "flux.2-klein-4b", + "steps": 4, + "guidance": 1.0, + "seed": 6, + "kept_steps": [ + 1, + 2, + 3 + ], + "case": [ + "wide" + ], + "sources": { + "wide": [ + 600, + 400, + 3 + ], + "square": [ + 400, + 400, + 4 + ], + "large": [ + 2400, + 1800, + 3 + ], + "many": [ + 1600, + 1000, + 3 + ], + "odd": [ + 1031, + 777, + 3 + ], + "narrow": [ + 512, + 64, + 3 + ], + "small": [ + 64, + 40, + 3 + ], + "long": [ + 513, + 64, + 3 + ] + }, + "limits": { + "one": 4096576, + "several": 1048576 + }, + "bf16": true, + "noise": "numpy Generator(PCG64(seed)).standard_normal(shape, dtype=float32), NCHW, (1, 128, height / 16, width / 16) of the first prepared reference; the CLI's noise is bf16, so it is rounded", + "sources_rule": "numpy Generator(PCG64(seed)) in SOURCES order: gradients, 12 rectangles, normal noise of 6, and a random alpha for 4 channels", + "ref_tokens": "encode_image_refs' bf16 tokens as float32, (L, 128)", + "ref_ids": "encode_image_refs' ids, (L, 4)", + "ref_latents": "the float32 encode of each reference, (1, 128, height / 16, width / 16), before encode_image_refs rounds its tokens to bf16", + "reference_commit": "50fe5162777813d869182b139e83b10743caef15", + "gguf_codecs": { + "F32": 60, + "Q5_K": 30, + "Q4_K": 50, + "BF16": 9 + } + }, + "results": { + "oracle": { + "device": "cpu", + "threads": 16, + "dequant": "exact", + "bf16_matmul": "bf16 operands, float32 GEMM, one bf16 rounding", + "autoencoder": "float32" + }, + "run": { + "sources": [ + "wide" + ], + "size": [ + 592, + 400 + ], + "fp32_s": 39.4, + "bf16_s": 121.0, + "latents_bf16_vs_fp32": { + "rel_l2": 0.05705238677869343, + "cosine": 0.9983726746169832, + "max_abs": 1.1833462715148926 + }, + "bf16_vs_fp32_by_step": [ + 0.002194774105633942, + 0.004565392234670243, + 0.014565087264044641, + 0.05705238677869343 + ] + } + }, + "tolerances": { + "by_step_rel_l2": [ + 0.004389548211267884, + 0.009130784469340486, + 0.029130174528089282, + 0.11410477355738687 + ], + "rule": "latents after a kept step and after the last: relative L2 at twice the oracle's own bf16 against fp32 relative L2 after that step, on the run's own size" + }, + "notes": [], + "created": "2026-10-16T15:24:31Z", + "npz": "check6_flux2_klein_edit.npz", + "tensors": { + "features": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "d826e5b160e0d8ed351f4fa73c61332506de8c02987d73ab1a215b694316469e" + }, + "latents": { + "shape": [ + 1, + 128, + 25, + 37 + ], + "dtype": "float32", + "sha256": "f0bb066d3c278211c4254c330b93e10d15b80a99ef4cc9a8f3682e75c6ad6009" + }, + "latents_bf16": { + "shape": [ + 1, + 128, + 25, + 37 + ], + "dtype": "float32", + "sha256": "dedf9531301e820a99d3f058d68fd78511ff8dca75e6d870c122f0cdf18de7d7" + }, + "latents_step1": { + "shape": [ + 1, + 128, + 25, + 37 + ], + "dtype": "float32", + "sha256": "e10e95293ecfcf6a95ac6c92ebf87b15fb64cc478ba5c2e8dde846bfe2bd3d6f" + }, + "latents_step2": { + "shape": [ + 1, + 128, + 25, + 37 + ], + "dtype": "float32", + "sha256": "4d6ec58c13ed7b1bd59097dfb3782405f06344f4ec2f0c50c47187fe10b8ad5e" + }, + "latents_step3": { + "shape": [ + 1, + 128, + 25, + 37 + ], + "dtype": "float32", + "sha256": "fda492cbde61cb484cd05e99293fd761de369de5a889d40cd2b37d7ef09e1b6e" + }, + "noise": { + "shape": [ + 1, + 128, + 25, + 37 + ], + "dtype": "float32", + "sha256": "f1b56c835aacdae6d32e4f7c475ca533495b555b7cc09634a49af0991f9a14a7" + }, + "prepared_one_large": { + "shape": [ + 1744, + 2336, + 3 + ], + "dtype": "uint8", + "sha256": "40909525a370d662ad1e9f717703b0d36ce6bf40b07e15634845336ae483f636" + }, + "prepared_one_narrow": { + "shape": [ + 64, + 512, + 3 + ], + "dtype": "uint8", + "sha256": "e6ce8e812d779a9227fc36b067eb3082e17c1af7cfd64c93b5857450572979c7" + }, + "prepared_one_odd": { + "shape": [ + 768, + 1024, + 3 + ], + "dtype": "uint8", + "sha256": "29b92ee0f1b487c0d986c0157f28cdb39da2dd39c9e2d8e86bf56344d9b02163" + }, + "prepared_one_square": { + "shape": [ + 400, + 400, + 3 + ], + "dtype": "uint8", + "sha256": "3a639096e3202f623cba7d6d807ad843600dc2bd67b599117415fc751e7fb869" + }, + "prepared_one_wide": { + "shape": [ + 400, + 592, + 3 + ], + "dtype": "uint8", + "sha256": "350274f340353614bf98ebddb387809359b027677b754288d99e589d22259863" + }, + "prepared_several_large": { + "shape": [ + 880, + 1168, + 3 + ], + "dtype": "uint8", + "sha256": "07693d147f34e7348974987aa665f6e01861faec9614dbf3d9ef42b89e0a5741" + }, + "prepared_several_many": { + "shape": [ + 800, + 1280, + 3 + ], + "dtype": "uint8", + "sha256": "c502e237d28035842e33d451437c2ebfaa5f58bcfbf377dfe385df237240d205" + }, + "prepared_several_odd": { + "shape": [ + 768, + 1024, + 3 + ], + "dtype": "uint8", + "sha256": "29b92ee0f1b487c0d986c0157f28cdb39da2dd39c9e2d8e86bf56344d9b02163" + }, + "prepared_several_wide": { + "shape": [ + 400, + 592, + 3 + ], + "dtype": "uint8", + "sha256": "350274f340353614bf98ebddb387809359b027677b754288d99e589d22259863" + }, + "ref_ids": { + "shape": [ + 925, + 4 + ], + "dtype": "float32", + "sha256": "5e0d4890ce626788ee9a441770b5baf846c8ecaf5af9f1ca22a8a43ab4e082ec" + }, + "ref_latents_0": { + "shape": [ + 1, + 128, + 25, + 37 + ], + "dtype": "float32", + "sha256": "4a67675f16738a5e210985825ad3f0cc6be79e8c04fea2a92277518f69235bba" + }, + "ref_tokens": { + "shape": [ + 925, + 128 + ], + "dtype": "float32", + "sha256": "52cda1e7f76c68717a7e738854a2fdc452f6e0368d2d49fef5d0f6c6066e5f86" + }, + "schedule": { + "shape": [ + 5 + ], + "dtype": "float32", + "sha256": "46e03699ff1f86e70294a441e3c3d0b13165a3369e54280d7d53dc104308e548" + }, + "source_large": { + "shape": [ + 1800, + 2400, + 3 + ], + "dtype": "uint8", + "sha256": "068e72306f1324aadefca43e9f14a3bc1a66f18faefacc684595be557b9c14dd" + }, + "source_long": { + "shape": [ + 64, + 513, + 3 + ], + "dtype": "uint8", + "sha256": "292ba25b082fe4f5b6c77ae9314b1e2c6f21c741fb6a8a457f86367a8304a35e" + }, + "source_many": { + "shape": [ + 1000, + 1600, + 3 + ], + "dtype": "uint8", + "sha256": "1ffa0102994f59a6507f3afd9d241c94727a6de1abe22e9a0a2bf7aeae135417" + }, + "source_narrow": { + "shape": [ + 64, + 512, + 3 + ], + "dtype": "uint8", + "sha256": "e6ce8e812d779a9227fc36b067eb3082e17c1af7cfd64c93b5857450572979c7" + }, + "source_odd": { + "shape": [ + 777, + 1031, + 3 + ], + "dtype": "uint8", + "sha256": "634557786f931f5b26799300cbc3cc03fba166702f4939b05426403a2758f4ed" + }, + "source_small": { + "shape": [ + 40, + 64, + 3 + ], + "dtype": "uint8", + "sha256": "4e53117237dcc7b7a5c088e080b747007c35b4bc520f02d385c27b5a1fccf2ea" + }, + "source_square": { + "shape": [ + 400, + 400, + 4 + ], + "dtype": "uint8", + "sha256": "cb75bc8006d262b351b324bc92cf68d6db365eeb6f649177c052ca03754de317" + }, + "source_wide": { + "shape": [ + 400, + 600, + 3 + ], + "dtype": "uint8", + "sha256": "a8d722626e69e4c389e62ee2435b2f7fb15125ebfa437504adea0f85ef6ed991" + }, + "times": { + "shape": [ + 4 + ], + "dtype": "float32", + "sha256": "6c45c9fe05e6716c8be5b5a02baa7175435c41c4e36988dc547e4eec7b14d116" + } + } +} diff --git a/tests/image/test_image_check6_flux2_klein_edit.py b/tests/image/test_image_check6_flux2_klein_edit.py new file mode 100644 index 000000000..e21e1a668 --- /dev/null +++ b/tests/image/test_image_check6_flux2_klein_edit.py @@ -0,0 +1,205 @@ +"""Check 6 of the image acceptance gate for FLUX.2 klein edits: a whole +sampling run with one reference image, on injected noise, against BFL's +own encode_image_refs and denoise. + +The preparation of a reference, its size check, pixel cap and grid crop, +equals the reference's for every source the oracle prepared, bit for +bit, and refuses what the reference refuses. The reference tokens the +DiT reads, their bf16 rounding and their ids, are those the reference's +DiT read. The reference latents of gmlx's VAE are held to the oracle's +float32 encode by the gate check 5 sets for an encode of that dtype at +512 pixels. From the oracle's conditioning, its features and reference +latents, the latents after each kept step and after the last stay within +twice the oracle's own bf16 against fp32 gap after that step. The run +without its reference misses those gates. + +Skipped unless the manifest of scripts/image_oracle/check6_flux2_klein_edit.py +is committed and GMLX_IMAGE_FIXTURES holds its arrays, and, for the runs, +KQUANT_TEST_GGUF_DIR the DiT GGUF the oracle read and GMLX_TEST_IMAGE_DIR +the FLUX.2 VAE.""" +from __future__ import annotations + +import os +from pathlib import Path + +import mlx.core as mx +import numpy as np +import pytest +from image_dir import vae_files +from image_fixtures import image_dits +from oracle_fixture import ORACLE, committed, fixture, fx + +NAME = "check6_flux2_klein_edit" +FAMILY = "flux2_klein" +CHECK5 = "check5_flux3_klein_vae" + + +@pytest.fixture(scope="module") +def check6(): + if not (ORACLE / f"{NAME}.manifest.json").is_file(): + pytest.skip(f"{NAME}.manifest.json is not committed: run " + "scripts/image_oracle/check6_flux2_klein_edit.py on the " + "FLUX.2 klein GGUF and commit the manifest") + arrays, _ = fixture(NAME) + return arrays, committed(NAME) + + +@pytest.mark.parametrize("rule", ["one", "several"]) +def test_the_references_are_prepared_as_the_reference_prepares_them( + check6, rule): + from gmlx.image.families.flux2_klein import edit + + arrays, m = check6 + rows = {k: r for k, r in m["inputs"]["prepared"].items() + if k.split("_", 1)[0] == rule} + assert len(rows) >= 4 + count = 1 if rule == "one" else 2 + for key, row in rows.items(): + src = arrays[f"source_{key.split('_', 1)[1]}"] + if "error" in row: + with pytest.raises(edit.BadReference): + edit.prepare([src] * count) + continue + got = edit.prepare([src] * count) + assert got.crop is None + assert edit.default_size(got) == tuple(row["size"]), key + for ref in got: + assert (ref.pixels[..., 3] == 255).all() + assert np.array_equal(ref.pixels[..., :3], + arrays[f"prepared_{key}"]), key + assert any("error" in r for r in rows.values()) == (rule == "one") + + +def test_the_run_takes_the_size_of_its_reference(check6): + from gmlx.image.families.flux2_klein import edit + + arrays, m = check6 + row = m["results"]["run"] + refs = edit.prepare([arrays[f"source_{k}"] for k in row["sources"]]) + assert list(edit.default_size(refs)) == row["size"] + width, height = row["size"] + assert arrays["noise"].shape == (1, 128, height // 16, width // 16) + assert arrays["ref_latents_0"].shape == (1, 128, refs[0].height // 16, + refs[0].width // 16) + + +def test_the_reference_rows_are_the_ones_the_dit_read(check6): + """The tokens of the oracle's latents in bf16, with the ids of index + 0, are the reference rows its DiT read.""" + from gmlx.image.families.flux2_klein import model as fm + + arrays, _ = check6 + got = fm.Flux2KleinDiT.references(None, [mx.array(arrays["ref_latents_0"])]) + assert np.array_equal(np.array(got.tokens[0].astype(mx.float32)), + arrays["ref_tokens"]) + assert np.array_equal(np.asarray(got.ids, np.float32), arrays["ref_ids"]) + assert set(arrays["ref_ids"][:, 0].tolist()) == {10.0} + + +def _files(gguf_dir, m): + want = m["files"]["dit"] + for p in image_dits(gguf_dir, FAMILY): + if Path(p).name == want["name"] and os.path.getsize(p) == want["size"]: + break + else: + pytest.skip(f"{want['name']} is not under KQUANT_TEST_GGUF_DIR") + if fx.file_identity(p)["sha256"] != want["sha256"]: + pytest.fail(f"{p} is not the file the oracle read") + vaes = sorted(vae_files(FAMILY), key=lambda p: p.suffix != ".gguf") + if not vaes: + pytest.skip("needs the FLUX.2 VAE under GMLX_TEST_IMAGE_DIR") + return p, str(vaes[0]) + + +@pytest.fixture(scope="module") +def pipe(check6, gguf_dir): + from gmlx.image import api + + dit, vae = _files(gguf_dir, check6[1]) + return api.load(dit, vae=vae, log=lambda *_: None) + + +def _encode_gate(pipe) -> tuple: + """(metric, gate) of check 5 for an encode in the VAE's dtype at 512 + pixels, the size of check 5 nearest the reference. The VAE is FLUX.3 + klein's, so its check 5 is this one's.""" + t = committed(CHECK5)["tolerances"]["sizes"]["512x512"] + if pipe.vae.dtype == mx.float32: + return "max abs", float(t["encode_fp32_max_abs"]) + return "rel L2", float(t["encode_bf16_rel_l2"]) + + +# A Mac of 16 GB, as most users run (tests/host_box.py). +@pytest.mark.integration +@pytest.mark.host_gb(16) +def test_reference_latents_of_the_vae_against_the_oracle(check6, pipe): + from gmlx.image import api + from gmlx.image.families.flux2_klein import edit + + arrays, m = check6 + (ref,) = edit.prepare([arrays[f"source_{k}"] + for k in m["results"]["run"]["sources"]]) + metric, gate = _encode_gate(pipe) + got = np.array(api._reference_latents(pipe, ref, None))[None] + want = arrays["ref_latents_0"] + err = (fx.max_abs(got, want) if metric == "max abs" + else fx.rel_l2(got, want)) + print(f"flux2 edit reference: {metric} {err:.2e} of gate {gate:.2e}") + assert err <= gate + + +def _run(pipe, arrays, m, refs: bool = True) -> dict: + from gmlx.image import api + from gmlx.image.conditioning import Conditioning + + steps = m["inputs"]["steps"] + row = m["results"]["run"] + lats = (mx.array(arrays["ref_latents_0"][0]),) if refs else () + cond = Conditioning(mx.array(arrays["features"]), "check6 flux2 edit", + ref_latents=lats) + want = {k: arrays[f"latents_step{k}"] for k in m["inputs"]["kept_steps"]} + want[steps] = arrays["latents"] + got = {} + + def on_step(i, x): + if i + 1 in want: + got[i + 1] = fx.rel_l2(np.array(x), want[i + 1]) + + width, height = row["size"] + sigmas = pipe.sigmas(steps, (height // 16) * (width // 16)) + api.sample(pipe, cond, height=height, width=width, sigmas=sigmas, + noise=mx.array(arrays["noise"]), on_step=on_step) + return got + + +def _gates(m) -> dict: + by = m["tolerances"]["by_step_rel_l2"] + steps = m["inputs"]["steps"] + assert len(by) == steps + return {k: by[k - 1] for k in m["inputs"]["kept_steps"] + [steps]} + + +@pytest.mark.integration +@pytest.mark.host_gb(16) +def test_check6_edit_latents_from_the_conditioning_of_the_oracle(check6, + pipe): + arrays, m = check6 + gates = _gates(m) + got = _run(pipe, arrays, m) + print("flux2 check6 edit: " + + ", ".join(f"step {k} {v:.2e} ({v / gates[k]:.2f} of its gate)" + for k, v in sorted(got.items()))) + assert sorted(got) == sorted(gates) + over = {k: (v, gates[k]) for k, v in got.items() if v > gates[k]} + assert not over, over + + +@pytest.mark.integration +@pytest.mark.host_gb(16) +def test_check6_edit_fails_without_its_reference(check6, pipe): + arrays, m = check6 + gates = _gates(m) + got = _run(pipe, arrays, m, refs=False) + share = {k: v / gates[k] for k, v in got.items()} + print(f"flux2 check6 edit without its reference: {share}") + assert min(share.values()) > 1.0, share From 9125342264b096efb79a7d55afae0bad9a4b3811 Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 08:54:46 -0700 Subject: [PATCH 016/101] fix(image): flux2 klein 9b refused by name until it runs --- gmlx/image/families/flux2_klein/family.py | 6 +++++ tests/image/test_image_flux2_family.py | 29 +++++++++++++++-------- tests/image/test_image_flux2_model.py | 12 ++++++---- tests/image/test_image_flux3_family.py | 7 +++++- 4 files changed, 38 insertions(+), 16 deletions(-) diff --git a/gmlx/image/families/flux2_klein/family.py b/gmlx/image/families/flux2_klein/family.py index 06737fd3d..4d5a92766 100644 --- a/gmlx/image/families/flux2_klein/family.py +++ b/gmlx/image/families/flux2_klein/family.py @@ -45,6 +45,9 @@ # Klein4BParams and Klein9BParams. The text width is that of three # stacked layers of the Qwen3 encoder of each size. SIZES = {"4B": (3072, 5, 20, 7680), "9B": (4096, 8, 24, 12288)} +# The sizes gmlx image runs. A 9B file is told apart and refused, since +# the encoder and the memory rows gmlx image has are the 4B's. +RUN_SIZES = ("4B",) _HEAD, _LATENT, _T, _MLP_RATIO = 128, 128, 256, 3 # (img_in, txt_in) of FLUX.2 dev (Flux2Params) and of FLUX.1. _FLUX2_DEV = ((128, 6144), (15360, 6144)) @@ -285,6 +288,9 @@ def fingerprint(view: HeaderView) -> Match | Refusal | None: more = f" (+{len(diffs) - 8} more)" if len(diffs) > 8 else "" return Refusal(f"a {TITLE} relative that gmlx image does not " f"support: {shown}{more}") + if size not in RUN_SIZES: + return Refusal(f"{title} is not supported yet. gmlx image runs " + f"{TITLE} 4B and base 4B.") return Match() diff --git a/tests/image/test_image_flux2_family.py b/tests/image/test_image_flux2_family.py index 35981ff07..b52a91613 100644 --- a/tests/image/test_image_flux2_family.py +++ b/tests/image/test_image_flux2_family.py @@ -1,7 +1,8 @@ -"""The FLUX.2 klein registry row: the 4B and 9B files, the config against -the official transformer/config.json of both 4B checkpoints (check 1), -the variant from the identity hash, relatives refused with the reason, -and the line between FLUX.2 klein and the other FLUX models. CPU-only. +"""The FLUX.2 klein registry row: the 4B files and the 9B told apart and +refused, the config against the official transformer/config.json of both +4B checkpoints (check 1), the variant from the identity hash, relatives +refused with the reason, and the line between FLUX.2 klein and the other +FLUX models. CPU-only. Header fixtures hold names, shapes and codecs, no weights. The rows on the real files read their headers and the identity tensor, and skip without them.""" @@ -53,14 +54,22 @@ def test_the_4b_file_gives_the_official_config_of_both_checkpoints(config, assert got.config == official_config(config) -def test_the_9b_file_is_flux2_klein_9b(): - """The 9B widths and depths of Klein9BParams. The official 9B config - is gated, so check 1 at 9B waits for it.""" - got = fp.identify(fixture_view(KLEIN_9B)) - assert got.family.name == "flux2_klein" +NOT_YET = ("FLUX.2 klein 9B is not supported yet. gmlx image runs FLUX.2 " + "klein 4B and base 4B.") + + +def test_the_9b_file_is_flux2_klein_9b_and_refused_by_name(): + """The 9B widths and depths of Klein9BParams, told apart from the 4B + and refused by name, pointing to the 4B. The official 9B config is + gated, so check 1 at 9B waits for it.""" + view = fixture_view(KLEIN_9B) + assert f2.size_of(view) == "9B" and f2.RUN_SIZES == ("4B",) + assert f2.fingerprint(view) == fp.Refusal(NOT_YET) + assert _refused(view) == NOT_YET + assert _refused(view, family="flux2_klein") == NOT_YET want = dict(official_config(CONFIG_4B), joint_attention_dim=12288, num_attention_heads=32, num_layers=8, num_single_layers=24) - assert got.config == want + assert f2.synth_config(view) == want def test_the_config_fixtures_are_the_official_files_in_bytes(): diff --git a/tests/image/test_image_flux2_model.py b/tests/image/test_image_flux2_model.py index d1857b1c4..0e19a925c 100644 --- a/tests/image/test_image_flux2_model.py +++ b/tests/image/test_image_flux2_model.py @@ -22,7 +22,6 @@ from image_fixtures import fixture_view from oracle_fixture import committed_fixture -from gmlx.image import fingerprint as fp from gmlx.image import ops from gmlx.image.dtypes import ImageDtypeError from gmlx.image.families.flux2_klein import model as fm @@ -50,11 +49,14 @@ def tiny(): def test_the_module_tree_names_every_tensor_of_the_file(name): """Strict name equality and the torch shape of every tensor, on the real config. Nothing is evaluated.""" - got = fp.identify(fixture_view(name)) - model = get_family("flux2_klein").build(got.config) - check_names(model, got.view.tensors, "FLUX.2 klein") + # The 9B is refused by its fingerprint, so its config is the one the + # family synthesizes from the header. + view = fixture_view(name) + fam = get_family("flux2_klein") + model = fam.build(fam.synth_config(view)) + check_names(model, view.tensors, "FLUX.2 klein") params = dict(tree_flatten(model.parameters())) - for n, t in got.view.tensors.items(): + for n, t in view.tensors.items(): assert params[n].shape == tuple(reversed(t.shape)), n diff --git a/tests/image/test_image_flux3_family.py b/tests/image/test_image_flux3_family.py index d21429f8c..eda3f037d 100644 --- a/tests/image/test_image_flux3_family.py +++ b/tests/image/test_image_flux3_family.py @@ -116,7 +116,12 @@ def test_the_encoder_constants_follow_the_reference_code(): def test_flux2_klein_given_as_flux3_is_refused_by_name(name, title, arch): view = fixture_view(name, kv={"general.architecture": arch} if arch else {}) - assert fp.identify(view).family.name == "flux2_klein" + if title.endswith("9B"): + assert _refused(view) == ( + "FLUX.2 klein 9B is not supported yet. gmlx image runs FLUX.2 " + "klein 4B and base 4B.") + else: + assert fp.identify(view).family.name == "flux2_klein" assert _refused(view, family="flux3_klein") == ( f"this is a {title} GGUF, not a FLUX.3 klein one") From 3000160bd957f5d0aacefac12faa516b7a49e8b9 Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 08:55:04 -0700 Subject: [PATCH 017/101] feat(image): flux2 klein reads the flux.2 vae and prices its 4b steps by measured cells --- gmlx/image/memfit.py | 32 +++ gmlx/image/vae/packer.py | 4 +- gmlx/image/vae/reader.py | 6 + .../image/flux2_klein_vae.header.json | 259 ++++++++++++++++++ tests/fixtures/image/manifest.json | 7 + .../image/memfit/flux2_klein_cells.json | 194 +++++++++++++ tests/image/test_image_flux2_family.py | 123 ++++++++- tests/image/test_image_memfit.py | 85 +++++- tests/image/test_image_qwen_vae.py | 7 +- tests/image/test_image_vae.py | 4 +- tests/image/test_image_vae_rows.py | 6 +- 11 files changed, 713 insertions(+), 14 deletions(-) create mode 100644 tests/fixtures/image/flux2_klein_vae.header.json create mode 100644 tests/fixtures/image/memfit/flux2_klein_cells.json diff --git a/gmlx/image/memfit.py b/gmlx/image/memfit.py index 541af626a..8391b9662 100644 --- a/gmlx/image/memfit.py +++ b/gmlx/image/memfit.py @@ -183,6 +183,20 @@ def bytes(self, formula: float, rows: int = 1, read: float = 0) -> int: # above every guided cell where 0.5 does not. FLUX3_KLEIN_STEP = StepFit(base=2.45 * GiB, k=3.0, row_k=1.0) +# One FLUX.2 klein 4B Q4_K_M step through ``api.sample`` under +# bounded_cache on an M5 Max, in fresh processes, over the settled process. +# The cells are in tests/fixtures/image/memfit/flux2_klein_cells.json: 256 +# to 2048 pixels, one, two and four 1024 pixel references at 1024, and +# three guided steps of the Base file, each with the 512 text rows the +# encoder always gives. The cache term reaches its bound by 768 pixels, +# where a step reads 2.57 GiB. The slope of 3.3 and the base of 2.62 GiB +# leave the least room over the cells: 0.25 GiB at 2048 pixels, and at +# most 1.12 GiB, at 256 pixels and at four references. The second row of +# a guided step reads up to 0.32 GiB, 0.92 times the formula, above one +# row of its size, so it takes the slope of 1.0. The 9B is refused by +# its fingerprint, so these rows price the 4B alone. +FLUX2_KLEIN_4B_STEP = StepFit(base=2.62 * GiB, k=3.3, row_k=1.0) + # Measured footprint of one 512-token Qwen3-4B Q4_K_M encode on an M5 Max: # 0.35 GiB above the weights, 12.5 times the per-token formula, rounded up. ENCODE_LIVE = 16.0 @@ -480,6 +494,8 @@ def _qwen_image_vae_crop(op: str, config=None) -> int: whole={"decode": VAE_DECODE, "encode": VAE_ENCODE}, tiled=VAE_TILED, overlap=128, scale=8), } +# FLUX.2 klein reads the file the FLUX.3 klein row was measured on. +VAE_ROWS["flux2_klein"] = VAE_ROWS["flux3_klein"] @dataclass(frozen=True) @@ -597,6 +613,22 @@ def step_peak(self, step: int, prefill: int, rows: int = 1, encode_row_bytes=28 * 1024, encode_base=int(0.6 * GiB), text_rows=4096, ref_token_px=16), + # FLUX.2 klein 4B joins the 512 text rows of every prompt to the image + # rows in every block, and the tokens of each reference image too. A + # single block's linear1 output, its query, key and value and the + # MLP's gate and up, and the MLP's gated half are the widest outputs: + # 3072 wide, a 9216 MLP. An encode of the encoder alone, Qwen3-4B with + # its tap of three layers in float32 over 512 rows, reads 0.52 to 0.53 + # GiB over the settled process on the Q8_0 file and 0.61 on the + # Q4_K_M one, whatever the prompt: a base of 0.65 GiB and the three + # float32 rows of the tap times ENCODE_LIVE leave 0.27 GiB above every + # cell. + "flux2_klein": PeakRow(token_px=16, row_multiple=1, caption_rows=512, + width=3 * 3072 + 2 * 9216 + 9216, + step=FLUX2_KLEIN_4B_STEP, + encode_row_bytes=3 * 2560 * 4, + encode_base=int(0.65 * GiB), ref_token_px=16, + prices_prompt=False), } LEVERS = ("sequential rows", "release the encoder", "tiled decode", diff --git a/gmlx/image/vae/packer.py b/gmlx/image/vae/packer.py index 1fb2f95f4..1724dcfd9 100644 --- a/gmlx/image/vae/packer.py +++ b/gmlx/image/vae/packer.py @@ -57,7 +57,9 @@ def _sha256_file(path: str) -> str: def _family(header, family: str | None) -> str: - names = [family] if family else sorted(VAES) + # A VAE that several families read, as FLUX.3 klein and FLUX.2 klein + # read the FLUX.2 autoencoder, packs for the first row that names it. + names = [family] if family else list(VAES) errors = [] for name in names: try: diff --git a/gmlx/image/vae/reader.py b/gmlx/image/vae/reader.py index 0db4d162c..b0d7d29dc 100644 --- a/gmlx/image/vae/reader.py +++ b/gmlx/image/vae/reader.py @@ -105,6 +105,12 @@ def _own_space(c: dict) -> dict: flux2_ae.Flux2AE, 32, _own_space, flux2_ae.expected_unused, config_disagreements=flux2_ae.config_disagreements, fp32_keep=flux2_ae.BN_STATS), + # FLUX.2 klein's own autoencoder, the one FLUX.3 klein reads. + "flux2_klein": VaeRow( + "the FLUX.2 autoencoder", flux2_ae.config_from_shapes, + flux2_ae.Flux2AE, 32, _own_space, flux2_ae.expected_unused, + config_disagreements=flux2_ae.config_disagreements, + fp32_keep=flux2_ae.BN_STATS), } diff --git a/tests/fixtures/image/flux2_klein_vae.header.json b/tests/fixtures/image/flux2_klein_vae.header.json new file mode 100644 index 000000000..695b320dc --- /dev/null +++ b/tests/fixtures/image/flux2_klein_vae.header.json @@ -0,0 +1,259 @@ +{ + "format": "safetensors", + "header_bytes": 28120, + "payload_bytes": 168092750, + "n_tensors": 251, + "tensors": [ + ["bn.num_batches_tracked", [], "I64"], + ["bn.running_mean", [128], "BF16"], + ["bn.running_var", [128], "BF16"], + ["decoder.conv_in.bias", [512], "BF16"], + ["decoder.conv_in.weight", [512, 32, 3, 3], "BF16"], + ["decoder.conv_norm_out.bias", [128], "BF16"], + ["decoder.conv_norm_out.weight", [128], "BF16"], + ["decoder.conv_out.bias", [3], "BF16"], + ["decoder.conv_out.weight", [3, 128, 3, 3], "BF16"], + ["decoder.mid_block.attentions.0.group_norm.bias", [512], "BF16"], + ["decoder.mid_block.attentions.0.group_norm.weight", [512], "BF16"], + ["decoder.mid_block.attentions.0.to_k.bias", [512], "BF16"], + ["decoder.mid_block.attentions.0.to_k.weight", [512, 512], "BF16"], + ["decoder.mid_block.attentions.0.to_out.0.bias", [512], "BF16"], + ["decoder.mid_block.attentions.0.to_out.0.weight", [512, 512], "BF16"], + ["decoder.mid_block.attentions.0.to_q.bias", [512], "BF16"], + ["decoder.mid_block.attentions.0.to_q.weight", [512, 512], "BF16"], + ["decoder.mid_block.attentions.0.to_v.bias", [512], "BF16"], + ["decoder.mid_block.attentions.0.to_v.weight", [512, 512], "BF16"], + ["decoder.mid_block.resnets.0.conv1.bias", [512], "BF16"], + ["decoder.mid_block.resnets.0.conv1.weight", [512, 512, 3, 3], "BF16"], + ["decoder.mid_block.resnets.0.conv2.bias", [512], "BF16"], + ["decoder.mid_block.resnets.0.conv2.weight", [512, 512, 3, 3], "BF16"], + ["decoder.mid_block.resnets.0.norm1.bias", [512], "BF16"], + ["decoder.mid_block.resnets.0.norm1.weight", [512], "BF16"], + ["decoder.mid_block.resnets.0.norm2.bias", [512], "BF16"], + ["decoder.mid_block.resnets.0.norm2.weight", [512], "BF16"], + ["decoder.mid_block.resnets.1.conv1.bias", [512], "BF16"], + ["decoder.mid_block.resnets.1.conv1.weight", [512, 512, 3, 3], "BF16"], + ["decoder.mid_block.resnets.1.conv2.bias", [512], "BF16"], + ["decoder.mid_block.resnets.1.conv2.weight", [512, 512, 3, 3], "BF16"], + ["decoder.mid_block.resnets.1.norm1.bias", [512], "BF16"], + ["decoder.mid_block.resnets.1.norm1.weight", [512], "BF16"], + ["decoder.mid_block.resnets.1.norm2.bias", [512], "BF16"], + ["decoder.mid_block.resnets.1.norm2.weight", [512], "BF16"], + ["decoder.up_blocks.0.resnets.0.conv1.bias", [512], "BF16"], + ["decoder.up_blocks.0.resnets.0.conv1.weight", [512, 512, 3, 3], "BF16"], + ["decoder.up_blocks.0.resnets.0.conv2.bias", [512], "BF16"], + ["decoder.up_blocks.0.resnets.0.conv2.weight", [512, 512, 3, 3], "BF16"], + ["decoder.up_blocks.0.resnets.0.norm1.bias", [512], "BF16"], + ["decoder.up_blocks.0.resnets.0.norm1.weight", [512], "BF16"], + ["decoder.up_blocks.0.resnets.0.norm2.bias", [512], "BF16"], + ["decoder.up_blocks.0.resnets.0.norm2.weight", [512], "BF16"], + ["decoder.up_blocks.0.resnets.1.conv1.bias", [512], "BF16"], + ["decoder.up_blocks.0.resnets.1.conv1.weight", [512, 512, 3, 3], "BF16"], + ["decoder.up_blocks.0.resnets.1.conv2.bias", [512], "BF16"], + ["decoder.up_blocks.0.resnets.1.conv2.weight", [512, 512, 3, 3], "BF16"], + ["decoder.up_blocks.0.resnets.1.norm1.bias", [512], "BF16"], + ["decoder.up_blocks.0.resnets.1.norm1.weight", [512], "BF16"], + ["decoder.up_blocks.0.resnets.1.norm2.bias", [512], "BF16"], + ["decoder.up_blocks.0.resnets.1.norm2.weight", [512], "BF16"], + ["decoder.up_blocks.0.resnets.2.conv1.bias", [512], "BF16"], + ["decoder.up_blocks.0.resnets.2.conv1.weight", [512, 512, 3, 3], "BF16"], + ["decoder.up_blocks.0.resnets.2.conv2.bias", [512], "BF16"], + ["decoder.up_blocks.0.resnets.2.conv2.weight", [512, 512, 3, 3], "BF16"], + ["decoder.up_blocks.0.resnets.2.norm1.bias", [512], "BF16"], + ["decoder.up_blocks.0.resnets.2.norm1.weight", [512], "BF16"], + ["decoder.up_blocks.0.resnets.2.norm2.bias", [512], "BF16"], + ["decoder.up_blocks.0.resnets.2.norm2.weight", [512], "BF16"], + ["decoder.up_blocks.0.upsamplers.0.conv.bias", [512], "BF16"], + ["decoder.up_blocks.0.upsamplers.0.conv.weight", [512, 512, 3, 3], "BF16"], + ["decoder.up_blocks.1.resnets.0.conv1.bias", [512], "BF16"], + ["decoder.up_blocks.1.resnets.0.conv1.weight", [512, 512, 3, 3], "BF16"], + ["decoder.up_blocks.1.resnets.0.conv2.bias", [512], "BF16"], + ["decoder.up_blocks.1.resnets.0.conv2.weight", [512, 512, 3, 3], "BF16"], + ["decoder.up_blocks.1.resnets.0.norm1.bias", [512], "BF16"], + ["decoder.up_blocks.1.resnets.0.norm1.weight", [512], "BF16"], + ["decoder.up_blocks.1.resnets.0.norm2.bias", [512], "BF16"], + ["decoder.up_blocks.1.resnets.0.norm2.weight", [512], "BF16"], + ["decoder.up_blocks.1.resnets.1.conv1.bias", [512], "BF16"], + ["decoder.up_blocks.1.resnets.1.conv1.weight", [512, 512, 3, 3], "BF16"], + ["decoder.up_blocks.1.resnets.1.conv2.bias", [512], "BF16"], + ["decoder.up_blocks.1.resnets.1.conv2.weight", [512, 512, 3, 3], "BF16"], + ["decoder.up_blocks.1.resnets.1.norm1.bias", [512], "BF16"], + ["decoder.up_blocks.1.resnets.1.norm1.weight", [512], "BF16"], + ["decoder.up_blocks.1.resnets.1.norm2.bias", [512], "BF16"], + ["decoder.up_blocks.1.resnets.1.norm2.weight", [512], "BF16"], + ["decoder.up_blocks.1.resnets.2.conv1.bias", [512], "BF16"], + ["decoder.up_blocks.1.resnets.2.conv1.weight", [512, 512, 3, 3], "BF16"], + ["decoder.up_blocks.1.resnets.2.conv2.bias", [512], "BF16"], + ["decoder.up_blocks.1.resnets.2.conv2.weight", [512, 512, 3, 3], "BF16"], + ["decoder.up_blocks.1.resnets.2.norm1.bias", [512], "BF16"], + ["decoder.up_blocks.1.resnets.2.norm1.weight", [512], "BF16"], + ["decoder.up_blocks.1.resnets.2.norm2.bias", [512], "BF16"], + ["decoder.up_blocks.1.resnets.2.norm2.weight", [512], "BF16"], + ["decoder.up_blocks.1.upsamplers.0.conv.bias", [512], "BF16"], + ["decoder.up_blocks.1.upsamplers.0.conv.weight", [512, 512, 3, 3], "BF16"], + ["decoder.up_blocks.2.resnets.0.conv1.bias", [256], "BF16"], + ["decoder.up_blocks.2.resnets.0.conv1.weight", [256, 512, 3, 3], "BF16"], + ["decoder.up_blocks.2.resnets.0.conv2.bias", [256], "BF16"], + ["decoder.up_blocks.2.resnets.0.conv2.weight", [256, 256, 3, 3], "BF16"], + ["decoder.up_blocks.2.resnets.0.conv_shortcut.bias", [256], "BF16"], + ["decoder.up_blocks.2.resnets.0.conv_shortcut.weight", [256, 512, 1, 1], "BF16"], + ["decoder.up_blocks.2.resnets.0.norm1.bias", [512], "BF16"], + ["decoder.up_blocks.2.resnets.0.norm1.weight", [512], "BF16"], + ["decoder.up_blocks.2.resnets.0.norm2.bias", [256], "BF16"], + ["decoder.up_blocks.2.resnets.0.norm2.weight", [256], "BF16"], + ["decoder.up_blocks.2.resnets.1.conv1.bias", [256], "BF16"], + ["decoder.up_blocks.2.resnets.1.conv1.weight", [256, 256, 3, 3], "BF16"], + ["decoder.up_blocks.2.resnets.1.conv2.bias", [256], "BF16"], + ["decoder.up_blocks.2.resnets.1.conv2.weight", [256, 256, 3, 3], "BF16"], + ["decoder.up_blocks.2.resnets.1.norm1.bias", [256], "BF16"], + ["decoder.up_blocks.2.resnets.1.norm1.weight", [256], "BF16"], + ["decoder.up_blocks.2.resnets.1.norm2.bias", [256], "BF16"], + ["decoder.up_blocks.2.resnets.1.norm2.weight", [256], "BF16"], + ["decoder.up_blocks.2.resnets.2.conv1.bias", [256], "BF16"], + ["decoder.up_blocks.2.resnets.2.conv1.weight", [256, 256, 3, 3], "BF16"], + ["decoder.up_blocks.2.resnets.2.conv2.bias", [256], "BF16"], + ["decoder.up_blocks.2.resnets.2.conv2.weight", [256, 256, 3, 3], "BF16"], + ["decoder.up_blocks.2.resnets.2.norm1.bias", [256], "BF16"], + ["decoder.up_blocks.2.resnets.2.norm1.weight", [256], "BF16"], + ["decoder.up_blocks.2.resnets.2.norm2.bias", [256], "BF16"], + ["decoder.up_blocks.2.resnets.2.norm2.weight", [256], "BF16"], + ["decoder.up_blocks.2.upsamplers.0.conv.bias", [256], "BF16"], + ["decoder.up_blocks.2.upsamplers.0.conv.weight", [256, 256, 3, 3], "BF16"], + ["decoder.up_blocks.3.resnets.0.conv1.bias", [128], "BF16"], + ["decoder.up_blocks.3.resnets.0.conv1.weight", [128, 256, 3, 3], "BF16"], + ["decoder.up_blocks.3.resnets.0.conv2.bias", [128], "BF16"], + ["decoder.up_blocks.3.resnets.0.conv2.weight", [128, 128, 3, 3], "BF16"], + ["decoder.up_blocks.3.resnets.0.conv_shortcut.bias", [128], "BF16"], + ["decoder.up_blocks.3.resnets.0.conv_shortcut.weight", [128, 256, 1, 1], "BF16"], + ["decoder.up_blocks.3.resnets.0.norm1.bias", [256], "BF16"], + ["decoder.up_blocks.3.resnets.0.norm1.weight", [256], "BF16"], + ["decoder.up_blocks.3.resnets.0.norm2.bias", [128], "BF16"], + ["decoder.up_blocks.3.resnets.0.norm2.weight", [128], "BF16"], + ["decoder.up_blocks.3.resnets.1.conv1.bias", [128], "BF16"], + ["decoder.up_blocks.3.resnets.1.conv1.weight", [128, 128, 3, 3], "BF16"], + ["decoder.up_blocks.3.resnets.1.conv2.bias", [128], "BF16"], + ["decoder.up_blocks.3.resnets.1.conv2.weight", [128, 128, 3, 3], "BF16"], + ["decoder.up_blocks.3.resnets.1.norm1.bias", [128], "BF16"], + ["decoder.up_blocks.3.resnets.1.norm1.weight", [128], "BF16"], + ["decoder.up_blocks.3.resnets.1.norm2.bias", [128], "BF16"], + ["decoder.up_blocks.3.resnets.1.norm2.weight", [128], "BF16"], + ["decoder.up_blocks.3.resnets.2.conv1.bias", [128], "BF16"], + ["decoder.up_blocks.3.resnets.2.conv1.weight", [128, 128, 3, 3], "BF16"], + ["decoder.up_blocks.3.resnets.2.conv2.bias", [128], "BF16"], + ["decoder.up_blocks.3.resnets.2.conv2.weight", [128, 128, 3, 3], "BF16"], + ["decoder.up_blocks.3.resnets.2.norm1.bias", [128], "BF16"], + ["decoder.up_blocks.3.resnets.2.norm1.weight", [128], "BF16"], + ["decoder.up_blocks.3.resnets.2.norm2.bias", [128], "BF16"], + ["decoder.up_blocks.3.resnets.2.norm2.weight", [128], "BF16"], + ["encoder.conv_in.bias", [128], "BF16"], + ["encoder.conv_in.weight", [128, 3, 3, 3], "BF16"], + ["encoder.conv_norm_out.bias", [512], "BF16"], + ["encoder.conv_norm_out.weight", [512], "BF16"], + ["encoder.conv_out.bias", [64], "BF16"], + ["encoder.conv_out.weight", [64, 512, 3, 3], "BF16"], + ["encoder.down_blocks.0.downsamplers.0.conv.bias", [128], "BF16"], + ["encoder.down_blocks.0.downsamplers.0.conv.weight", [128, 128, 3, 3], "BF16"], + ["encoder.down_blocks.0.resnets.0.conv1.bias", [128], "BF16"], + ["encoder.down_blocks.0.resnets.0.conv1.weight", [128, 128, 3, 3], "BF16"], + ["encoder.down_blocks.0.resnets.0.conv2.bias", [128], "BF16"], + ["encoder.down_blocks.0.resnets.0.conv2.weight", [128, 128, 3, 3], "BF16"], + ["encoder.down_blocks.0.resnets.0.norm1.bias", [128], "BF16"], + ["encoder.down_blocks.0.resnets.0.norm1.weight", [128], "BF16"], + ["encoder.down_blocks.0.resnets.0.norm2.bias", [128], "BF16"], + ["encoder.down_blocks.0.resnets.0.norm2.weight", [128], "BF16"], + ["encoder.down_blocks.0.resnets.1.conv1.bias", [128], "BF16"], + ["encoder.down_blocks.0.resnets.1.conv1.weight", [128, 128, 3, 3], "BF16"], + ["encoder.down_blocks.0.resnets.1.conv2.bias", [128], "BF16"], + ["encoder.down_blocks.0.resnets.1.conv2.weight", [128, 128, 3, 3], "BF16"], + ["encoder.down_blocks.0.resnets.1.norm1.bias", [128], "BF16"], + ["encoder.down_blocks.0.resnets.1.norm1.weight", [128], "BF16"], + ["encoder.down_blocks.0.resnets.1.norm2.bias", [128], "BF16"], + ["encoder.down_blocks.0.resnets.1.norm2.weight", [128], "BF16"], + ["encoder.down_blocks.1.downsamplers.0.conv.bias", [256], "BF16"], + ["encoder.down_blocks.1.downsamplers.0.conv.weight", [256, 256, 3, 3], "BF16"], + ["encoder.down_blocks.1.resnets.0.conv1.bias", [256], "BF16"], + ["encoder.down_blocks.1.resnets.0.conv1.weight", [256, 128, 3, 3], "BF16"], + ["encoder.down_blocks.1.resnets.0.conv2.bias", [256], "BF16"], + ["encoder.down_blocks.1.resnets.0.conv2.weight", [256, 256, 3, 3], "BF16"], + ["encoder.down_blocks.1.resnets.0.conv_shortcut.bias", [256], "BF16"], + ["encoder.down_blocks.1.resnets.0.conv_shortcut.weight", [256, 128, 1, 1], "BF16"], + ["encoder.down_blocks.1.resnets.0.norm1.bias", [128], "BF16"], + ["encoder.down_blocks.1.resnets.0.norm1.weight", [128], "BF16"], + ["encoder.down_blocks.1.resnets.0.norm2.bias", [256], "BF16"], + ["encoder.down_blocks.1.resnets.0.norm2.weight", [256], "BF16"], + ["encoder.down_blocks.1.resnets.1.conv1.bias", [256], "BF16"], + ["encoder.down_blocks.1.resnets.1.conv1.weight", [256, 256, 3, 3], "BF16"], + ["encoder.down_blocks.1.resnets.1.conv2.bias", [256], "BF16"], + ["encoder.down_blocks.1.resnets.1.conv2.weight", [256, 256, 3, 3], "BF16"], + ["encoder.down_blocks.1.resnets.1.norm1.bias", [256], "BF16"], + ["encoder.down_blocks.1.resnets.1.norm1.weight", [256], "BF16"], + ["encoder.down_blocks.1.resnets.1.norm2.bias", [256], "BF16"], + ["encoder.down_blocks.1.resnets.1.norm2.weight", [256], "BF16"], + ["encoder.down_blocks.2.downsamplers.0.conv.bias", [512], "BF16"], + ["encoder.down_blocks.2.downsamplers.0.conv.weight", [512, 512, 3, 3], "BF16"], + ["encoder.down_blocks.2.resnets.0.conv1.bias", [512], "BF16"], + ["encoder.down_blocks.2.resnets.0.conv1.weight", [512, 256, 3, 3], "BF16"], + ["encoder.down_blocks.2.resnets.0.conv2.bias", [512], "BF16"], + ["encoder.down_blocks.2.resnets.0.conv2.weight", [512, 512, 3, 3], "BF16"], + ["encoder.down_blocks.2.resnets.0.conv_shortcut.bias", [512], "BF16"], + ["encoder.down_blocks.2.resnets.0.conv_shortcut.weight", [512, 256, 1, 1], "BF16"], + ["encoder.down_blocks.2.resnets.0.norm1.bias", [256], "BF16"], + ["encoder.down_blocks.2.resnets.0.norm1.weight", [256], "BF16"], + ["encoder.down_blocks.2.resnets.0.norm2.bias", [512], "BF16"], + ["encoder.down_blocks.2.resnets.0.norm2.weight", [512], "BF16"], + ["encoder.down_blocks.2.resnets.1.conv1.bias", [512], "BF16"], + ["encoder.down_blocks.2.resnets.1.conv1.weight", [512, 512, 3, 3], "BF16"], + ["encoder.down_blocks.2.resnets.1.conv2.bias", [512], "BF16"], + ["encoder.down_blocks.2.resnets.1.conv2.weight", [512, 512, 3, 3], "BF16"], + ["encoder.down_blocks.2.resnets.1.norm1.bias", [512], "BF16"], + ["encoder.down_blocks.2.resnets.1.norm1.weight", [512], "BF16"], + ["encoder.down_blocks.2.resnets.1.norm2.bias", [512], "BF16"], + ["encoder.down_blocks.2.resnets.1.norm2.weight", [512], "BF16"], + ["encoder.down_blocks.3.resnets.0.conv1.bias", [512], "BF16"], + ["encoder.down_blocks.3.resnets.0.conv1.weight", [512, 512, 3, 3], "BF16"], + ["encoder.down_blocks.3.resnets.0.conv2.bias", [512], "BF16"], + ["encoder.down_blocks.3.resnets.0.conv2.weight", [512, 512, 3, 3], "BF16"], + ["encoder.down_blocks.3.resnets.0.norm1.bias", [512], "BF16"], + ["encoder.down_blocks.3.resnets.0.norm1.weight", [512], "BF16"], + ["encoder.down_blocks.3.resnets.0.norm2.bias", [512], "BF16"], + ["encoder.down_blocks.3.resnets.0.norm2.weight", [512], "BF16"], + ["encoder.down_blocks.3.resnets.1.conv1.bias", [512], "BF16"], + ["encoder.down_blocks.3.resnets.1.conv1.weight", [512, 512, 3, 3], "BF16"], + ["encoder.down_blocks.3.resnets.1.conv2.bias", [512], "BF16"], + ["encoder.down_blocks.3.resnets.1.conv2.weight", [512, 512, 3, 3], "BF16"], + ["encoder.down_blocks.3.resnets.1.norm1.bias", [512], "BF16"], + ["encoder.down_blocks.3.resnets.1.norm1.weight", [512], "BF16"], + ["encoder.down_blocks.3.resnets.1.norm2.bias", [512], "BF16"], + ["encoder.down_blocks.3.resnets.1.norm2.weight", [512], "BF16"], + ["encoder.mid_block.attentions.0.group_norm.bias", [512], "BF16"], + ["encoder.mid_block.attentions.0.group_norm.weight", [512], "BF16"], + ["encoder.mid_block.attentions.0.to_k.bias", [512], "BF16"], + ["encoder.mid_block.attentions.0.to_k.weight", [512, 512], "BF16"], + ["encoder.mid_block.attentions.0.to_out.0.bias", [512], "BF16"], + ["encoder.mid_block.attentions.0.to_out.0.weight", [512, 512], "BF16"], + ["encoder.mid_block.attentions.0.to_q.bias", [512], "BF16"], + ["encoder.mid_block.attentions.0.to_q.weight", [512, 512], "BF16"], + ["encoder.mid_block.attentions.0.to_v.bias", [512], "BF16"], + ["encoder.mid_block.attentions.0.to_v.weight", [512, 512], "BF16"], + ["encoder.mid_block.resnets.0.conv1.bias", [512], "BF16"], + ["encoder.mid_block.resnets.0.conv1.weight", [512, 512, 3, 3], "BF16"], + ["encoder.mid_block.resnets.0.conv2.bias", [512], "BF16"], + ["encoder.mid_block.resnets.0.conv2.weight", [512, 512, 3, 3], "BF16"], + ["encoder.mid_block.resnets.0.norm1.bias", [512], "BF16"], + ["encoder.mid_block.resnets.0.norm1.weight", [512], "BF16"], + ["encoder.mid_block.resnets.0.norm2.bias", [512], "BF16"], + ["encoder.mid_block.resnets.0.norm2.weight", [512], "BF16"], + ["encoder.mid_block.resnets.1.conv1.bias", [512], "BF16"], + ["encoder.mid_block.resnets.1.conv1.weight", [512, 512, 3, 3], "BF16"], + ["encoder.mid_block.resnets.1.conv2.bias", [512], "BF16"], + ["encoder.mid_block.resnets.1.conv2.weight", [512, 512, 3, 3], "BF16"], + ["encoder.mid_block.resnets.1.norm1.bias", [512], "BF16"], + ["encoder.mid_block.resnets.1.norm1.weight", [512], "BF16"], + ["encoder.mid_block.resnets.1.norm2.bias", [512], "BF16"], + ["encoder.mid_block.resnets.1.norm2.weight", [512], "BF16"], + ["post_quant_conv.bias", [32], "BF16"], + ["post_quant_conv.weight", [32, 32, 1, 1], "BF16"], + ["quant_conv.bias", [64], "BF16"], + ["quant_conv.weight", [64, 64, 1, 1], "BF16"] + ] +} diff --git a/tests/fixtures/image/manifest.json b/tests/fixtures/image/manifest.json index dff314be0..7ff3738bf 100644 --- a/tests/fixtures/image/manifest.json +++ b/tests/fixtures/image/manifest.json @@ -204,5 +204,12 @@ "file": "vae/config.json", "size": 808, "sha256": "66564b3cd3f3f3ce5ce3cd4df72f1de883b242c7f338e27d420fe5ddcb0a6ed9" + }, + "flux2_klein_vae.header.json": { + "repo": "black-forest-labs/FLUX.2-klein-4B", + "revision": "e7b7dc27f91deacad38e78976d1f2b499d76a294", + "file": "vae/diffusion_pytorch_model.safetensors", + "size": 168120878, + "sha256": "ca70d2202afe6415bdbcb8793ba8cd99fd159cfe6192381504d6c4d3036e0f04" } } diff --git a/tests/fixtures/image/memfit/flux2_klein_cells.json b/tests/fixtures/image/memfit/flux2_klein_cells.json new file mode 100644 index 000000000..849e662b8 --- /dev/null +++ b/tests/fixtures/image/memfit/flux2_klein_cells.json @@ -0,0 +1,194 @@ +{ + "what": "FLUX.2 klein 4B distilled Q4_K_M (unsloth flux-2-klein-4b), or the Base Q4_K_M a cell names, on an M5 Max, one fresh process per cell, through api.sample under the bounded cache, with random features of text_rows rows and random reference latents of refs images of ref_px pixels. steps_gib is the footprint of each of three steps over the settled process, the DiT loaded. A guided cell runs cfg 4, its two rows together. encode holds one prompt encode of the Qwen3-4B encoder alone, a prompt of ids tokens in the template padded to rows rows, the footprint over the settled process.", + "cells": [ + { + "size": 256, + "text_rows": 512, + "guided": false, + "steps_gib": [ + 1.6743, + 1.6753, + 1.6755 + ] + }, + { + "size": 512, + "text_rows": 512, + "guided": false, + "steps_gib": [ + 2.0477, + 2.0491, + 2.0492 + ] + }, + { + "size": 768, + "text_rows": 512, + "guided": false, + "steps_gib": [ + 2.5411, + 2.5411, + 2.5686 + ] + }, + { + "size": 1024, + "text_rows": 512, + "guided": false, + "steps_gib": [ + 2.9777, + 3.0128, + 3.0012 + ] + }, + { + "size": 1280, + "text_rows": 512, + "guided": false, + "steps_gib": [ + 3.6085, + 3.4449, + 3.5074 + ] + }, + { + "size": 1536, + "text_rows": 512, + "guided": false, + "steps_gib": [ + 4.1774, + 3.7859, + 3.7861 + ] + }, + { + "size": 2048, + "text_rows": 512, + "guided": false, + "steps_gib": [ + 6.1942, + 6.1487, + 6.1418 + ] + }, + { + "size": 1024, + "text_rows": 512, + "guided": false, + "refs": 1, + "ref_px": 1024, + "steps_gib": [ + 4.1896, + 3.6218, + 3.6571 + ] + }, + { + "size": 1024, + "text_rows": 512, + "guided": false, + "refs": 2, + "ref_px": 1024, + "steps_gib": [ + 4.9206, + 4.9027, + 4.8769 + ] + }, + { + "size": 1024, + "text_rows": 512, + "guided": false, + "refs": 4, + "ref_px": 1024, + "steps_gib": [ + 6.1714, + 6.1311, + 6.2534 + ] + }, + { + "size": 512, + "text_rows": 512, + "guided": true, + "dit": "Base Q4_K_M", + "steps_gib": [ + 2.0616, + 2.0629, + 2.063 + ] + }, + { + "size": 1024, + "text_rows": 512, + "guided": true, + "dit": "Base Q4_K_M", + "steps_gib": [ + 3.2981, + 3.2746, + 3.2749 + ] + }, + { + "size": 1536, + "text_rows": 512, + "guided": true, + "dit": "Base Q4_K_M", + "steps_gib": [ + 4.5008, + 4.3408, + 4.2882 + ] + } + ], + "encode": [ + { + "encoder": "Qwen3-4B-Q8_0.gguf", + "ids": 21, + "rows": 512, + "gib": 0.5249 + }, + { + "encoder": "Qwen3-4B-Q8_0.gguf", + "ids": 80, + "rows": 512, + "gib": 0.5255 + }, + { + "encoder": "Qwen3-4B-Q8_0.gguf", + "ids": 300, + "rows": 512, + "gib": 0.5252 + }, + { + "encoder": "Qwen3-4B-Q8_0.gguf", + "ids": 500, + "rows": 512, + "gib": 0.5224 + }, + { + "encoder": "Qwen3-4B-Q4_K_M.gguf", + "ids": 21, + "rows": 512, + "gib": 0.6139 + }, + { + "encoder": "Qwen3-4B-Q4_K_M.gguf", + "ids": 80, + "rows": 512, + "gib": 0.6146 + }, + { + "encoder": "Qwen3-4B-Q4_K_M.gguf", + "ids": 300, + "rows": 512, + "gib": 0.6119 + }, + { + "encoder": "Qwen3-4B-Q4_K_M.gguf", + "ids": 500, + "rows": 512, + "gib": 0.6144 + } + ] +} diff --git a/tests/image/test_image_flux2_family.py b/tests/image/test_image_flux2_family.py index b52a91613..3da311b27 100644 --- a/tests/image/test_image_flux2_family.py +++ b/tests/image/test_image_flux2_family.py @@ -1,14 +1,15 @@ """The FLUX.2 klein registry row: the 4B files and the 9B told apart and -refused, the config against the official transformer/config.json of both -4B checkpoints (check 1), the variant from the identity hash, relatives -refused with the reason, and the line between FLUX.2 klein and the other -FLUX models. CPU-only. +refused, the VAE sources, the config against the official +transformer/config.json of both 4B checkpoints (check 1), the variant +from the identity hash, relatives refused with the reason, and the line +between FLUX.2 klein and the other FLUX models. CPU-only. Header fixtures hold names, shapes and codecs, no weights. The rows on the real files read their headers and the identity tensor, and skip without them.""" from __future__ import annotations import hashlib +from types import SimpleNamespace import numpy as np import pytest @@ -72,6 +73,120 @@ def test_the_9b_file_is_flux2_klein_9b_and_refused_by_name(): assert f2.synth_config(view) == want +def _header_gguf(path, name: str) -> str: + """A GGUF of the header fixture ``name``: its names, shapes and + codecs, and no tensor bytes.""" + import gguf + + w = gguf.GGUFWriter(str(path), "flux") + for tname, shape, codec in load_json(name)["tensors"]: + raw = getattr(gguf.GGMLQuantizationType, codec) + block, size = gguf.GGML_QUANT_SIZES[raw] + n = int(np.prod(shape)) // block * size + # The fixture holds GGUF dims, innermost first, and gguf-py takes + # numpy order. Any dtype but uint8 keeps the shape in elements. + w.add_tensor_info(tname, list(reversed(shape)), np.dtype(np.float32), + n, raw_dtype=raw) + w.write_header_to_file() + w.write_kv_data_to_file() + w.write_ti_data_to_file() + w.close() + return str(path) + + +def test_a_9b_file_gets_no_memory_plan(tmp_path, monkeypatch): + """The memory rows of the family are measured on the 4B files: the + preflight of a 9B file refuses it by name and prices no plan, while + the same request on a 4B header is priced.""" + from gmlx.commands import image_preflight + from gmlx.load.headerscan import scan_gguf + + monkeypatch.setenv("GMLX_TOOL_PREFLIGHT", "1") + # The price, not the fit on this host. + monkeypatch.setenv("GMLX_OVERCOMMIT", "1") + kw = dict(height=1024, width=1024, cfg=1.0) + paths = {n: _header_gguf(tmp_path / f"{i}.gguf", n) + for i, n in enumerate((KLEIN_4B, KLEIN_9B))} + for name, path in paths.items(): + got = [[t.name, list(t.shape), t.type_name] + for t in scan_gguf(path).tensors] + assert sorted(got) == sorted(load_json(name)["tensors"]) + plan = image_preflight.check(paths[KLEIN_4B], None, None, **kw) + assert plan is not None and plan.terms["step_peak"] > 0 + with pytest.raises(fp.ImageModelError) as ei: + image_preflight.check(paths[KLEIN_9B], None, None, **kw) + assert str(ei.value) == NOT_YET + + +# The files a FLUX.2 klein VAE source can be: Comfy-Org's flux2-vae and +# BFL's 4B VAE, both in diffusers names, F32 and BF16, and BFL's original +# ae.safetensors, F32. +VAE_SOURCES = {"flux3_klein_vae.header.json": ("diffusers", "F32"), + "flux2_klein_vae.header.json": ("diffusers", "BF16"), + "flux3_klein_ae.header.json": ("original", "F32")} + + +@pytest.mark.parametrize("name", list(VAE_SOURCES)) +def test_each_vae_source_reads_as_the_flux2_klein_vae(name): + """Names and shapes alone identify the VAE, so any of the sources is + the one FLUX.3 klein reads, at the same config, and its price in the + memory plan comes from its shapes, not its dtype.""" + from gmlx.image import memfit + from gmlx.image.vae import reader + + head = load_json(name) + manifest = load_json("manifest.json")[name] + assert head["n_tensors"] == len(head["tensors"]) == 251 + assert len(manifest["sha256"]) == 64 and manifest["size"] == ( + 8 + head["header_bytes"] + head["payload_bytes"]) + shapes = {n: tuple(s) for n, s, _ in head["tensors"]} + dtypes = {n: d for n, _, d in head["tensors"]} + layout, names = reader.diffusers_names({n: n for n in shapes}) + want_layout, codec = VAE_SOURCES[name] + assert layout == want_layout + assert {d for n, d in dtypes.items() + if n != "bn.num_batches_tracked"} == {codec} + mapped = {} + for n, f in names.items(): + s = shapes[f] + if layout == "original" and ".attentions.0.to_" in n and len(s) == 4: + s = s[:2] + mapped[n] = s + header = reader.VaeHeader(name, "safetensors", layout, names, mapped, + {n: dtypes[f] for n, f in names.items()}, {}) + cfg = reader.identify(header, "flux2_klein") + assert cfg == reader.identify(header, "flux3_klein") + assert (cfg.latent_channels, cfg.block_out_channels) == ( + 32, (128, 256, 512, 512)) + assert memfit.VAE_ROWS["flux2_klein"] is memfit.VAE_ROWS["flux3_klein"] + comfy = load_json("flux3_klein_vae.header.json") + assert memfit.vae_bytes(header, 2) == memfit.vae_bytes( + SimpleNamespace(shapes={n: tuple(s) for n, s, _ in comfy["tensors"]}), + 2) + + +def test_the_shared_vae_packs_for_flux3_klein_unless_told(tmp_path): + """A packed VAE names one family. The FLUX.2 autoencoder packs for + FLUX.3 klein, which registered it first, as before FLUX.2 klein read + it, and for FLUX.2 klein when told. FLUX.2 klein loads either.""" + from oracle_fixture import committed_fixture + from test_image_check5_flux3_klein import TINY, _tiny_tensors, _write_st + + from gmlx.image import catalog + from gmlx.image.vae import load_vae, pack_vae + + src = _write_st(tmp_path / "vae.safetensors", + _tiny_tensors(committed_fixture(TINY))) + kw = dict(source_repo="r", source_revision="v", config_json="{}") + shared = pack_vae(src, tmp_path / "shared.gguf", **kw) + own = pack_vae(src, tmp_path / "own.gguf", family="flux2_klein", **kw) + assert (shared.family, own.family) == ("flux3_klein", "flux2_klein") + for rep in (shared, own): + assert catalog.vae_identity(rep.path)[0] == rep.family + assert load_vae(rep.path, family="flux2_klein", + dtype="fp32").family == "flux2_klein" + + def test_the_config_fixtures_are_the_official_files_in_bytes(): manifest = load_json("manifest.json") for name in (CONFIG_4B, CONFIG_BASE_4B): diff --git a/tests/image/test_image_memfit.py b/tests/image/test_image_memfit.py index 8d7a3fe0a..28562cb0f 100644 --- a/tests/image/test_image_memfit.py +++ b/tests/image/test_image_memfit.py @@ -574,8 +574,8 @@ class _TinyVae: def test_unknown_family_is_refused(z_view): - with pytest.raises(ValueError, match="known: flux3_klein, krea2, " - "qwen_image21, z_image"): + with pytest.raises(ValueError, match="known: flux2_klein, flux3_klein, " + "krea2, qwen_image21, z_image"): plan_memory(z_view, 0, 0, family="flux", height=8, width=8, budget=1e12, overcommit=False) @@ -962,6 +962,87 @@ def test_the_flux3_encode_term_covers_every_measured_encode(): encodes[0]["gib"] * GiB +FLUX2_CELLS = QWEN_CELLS.with_name("flux2_klein_cells.json") + + +def test_the_flux2_row_covers_every_measured_step(): + """The 4B cells: the 512 text rows of every prompt, sizes to 2048 + pixels, one, two and four 1024 pixel references and guided Base + steps. Their rows count as FLUX.3 klein's do.""" + row = memfit.PEAKS["flux2_klein"] + assert row.step is memfit.FLUX2_KLEIN_4B_STEP + assert row.width == 36864 and row.caption_rows == row.text_rows == 512 + assert not memfit.prices_prompt("flux2_klein") + cells = json.loads(FLUX2_CELLS.read_text())["cells"] + assert {c["size"] for c in cells} == {256, 512, 768, 1024, 1280, 1536, + 2048} + assert {c["text_rows"] for c in cells} == {512} + assert {c["size"] for c in cells if c["guided"]} == {512, 1024, 1536} + assert sorted(c["refs"] for c in cells if c.get("refs")) == [1, 2, 4] + assert {c["ref_px"] for c in cells if c.get("refs")} == {1024} + room = [_flux3_room(row, c) for c in cells] + assert min(room) >= ROOM + # A fit, not a ceiling: the closest cell is within 0.35 GiB, and none + # is priced more than 1.25 GiB above its reading. + assert min(room) <= 0.35 * GiB and max(room) <= 1.25 * GiB + + +def test_a_thinner_flux2_row_misses_a_measured_cell(): + row = memfit.PEAKS["flux2_klein"] + cells = json.loads(FLUX2_CELLS.read_text())["cells"] + + def worst(**change) -> float: + thin = dataclasses.replace(row, step=dataclasses.replace( + row.step, **change)) + return min(_flux3_room(thin, c) for c in cells) + + assert worst() >= ROOM + assert worst(base=2.52 * GiB) < ROOM + assert worst(k=3.0) < ROOM + # Without the reference tokens in the rows, two 1024 pixel references + # are priced under their reading. + two = next(c for c in cells if c.get("refs") == 2) + alone = dataclasses.replace(row, ref_token_px=10 ** 9) + assert _flux3_room(alone, two) < ROOM + + +def test_the_flux2_plan_counts_the_references_and_its_text_rows(): + """Every prompt is 512 text rows, so the plan prices them whatever the + caller knows, and each reference's tokens in every step.""" + row = memfit.PEAKS["flux2_klein"] + kw = dict(family="flux2_klein", height=1024, width=768, + budget=BUDGET_128, overcommit=False) + + def step(rows, conds=1): + return row.step.bytes(rows * row.width * 2, conds) + + text = 64 * 48 + 512 + assert plan_memory(0, 0, 0, **kw).terms["step_peak"] == step(text) + p = plan_memory(0, 0, 0, ref_sizes=[(1024, 1024), (512, 768)], **kw) + assert p.terms["step_peak"] == step(text + 64 * 64 + 32 * 48) + p = plan_memory(0, 0, 0, refs=2, ref_px=512, cfg=4.0, **kw) + assert p.rows == 2 and p.terms["step_peak"] == step(text + 2 * 32 * 32, + 2) + + +def test_the_flux2_encode_term_covers_every_measured_encode(): + """An encode is 512 rows whatever the prompt, on either encoder file.""" + row = memfit.PEAKS["flux2_klein"] + encodes = json.loads(FLUX2_CELLS.read_text())["encode"] + assert {e["rows"] for e in encodes} == {512} + assert {e["encoder"] for e in encodes} == {"Qwen3-4B-Q8_0.gguf", + "Qwen3-4B-Q4_K_M.gguf"} + p = plan_memory(0, ENCODER, 0, family="flux2_klein", height=512, + width=512, budget=BUDGET_128, overcommit=False) + assert p.terms["encode_peak"] == int( + row.encode_base + 512 * row.encode_row_bytes * memfit.ENCODE_LIVE) + room = [p.terms["encode_peak"] - e["gib"] * GiB for e in encodes] + assert min(room) >= ROOM + # Without the base every encode is priced under its reading. + assert 512 * row.encode_row_bytes * memfit.ENCODE_LIVE < min( + e["gib"] for e in encodes) * GiB + + def test_a_thinner_qwen_row_misses_a_measured_cell(): row = memfit.PEAKS["qwen_image21"] cells = _qwen_cells() diff --git a/tests/image/test_image_qwen_vae.py b/tests/image/test_image_qwen_vae.py index 051a2c7ca..dab0a000c 100644 --- a/tests/image/test_image_qwen_vae.py +++ b/tests/image/test_image_qwen_vae.py @@ -936,8 +936,8 @@ def test_other_files_and_families_are_refused(tmp_path, st_file): with pytest.raises(reader.VAEError, match="not a VAE gmlx image reads"): reader.load_vae(path, family=FAMILY, dtype=mx.float32) with pytest.raises(reader.VAEError, - match="known: flux3_klein, krea2, qwen_image21, " - "z_image"): + match="known: flux2_klein, flux3_klein, krea2, " + "qwen_image21, z_image"): reader.load_vae(st_file, family="sd15", dtype=mx.float32) # A file with another number of levels has no official time flags. for i, config in enumerate((OTHER_FLAGS["three_levels"], @@ -1023,10 +1023,11 @@ def test_the_packer_gives_a_refusal_once_when_the_families_share_it( pack_vae(video, tmp_path / "video.gguf", **kw) text = str(e.value) assert text.startswith(f"{video} matches no image family's VAE: ") - assert text.count("holds a video VAE in the Wan 2.2 layout") == 4 + assert text.count("holds a video VAE in the Wan 2.2 layout") == 5 assert "qwen_image21 decodes with" in text assert "z_image decodes with" in text assert "flux3_klein decodes with" in text + assert "flux2_klein decodes with" in text def test_pack_vae_on_the_command_line_picks_the_family(st_dir, st_file, diff --git a/tests/image/test_image_vae.py b/tests/image/test_image_vae.py index 7546e49b3..d36950cda 100644 --- a/tests/image/test_image_vae.py +++ b/tests/image/test_image_vae.py @@ -398,8 +398,8 @@ def test_other_files_and_families_are_refused(tmp_path): junk.write_bytes(b"\xff" * 64) with pytest.raises(reader.VAEError, match="neither a GGUF"): reader.load_vae(junk, family="z_image", dtype=mx.float32) - with pytest.raises(reader.VAEError, match="known: flux3_klein, krea2, " - "qwen_image21, z_image"): + with pytest.raises(reader.VAEError, match="known: flux2_klein, flux3_klein, " + "krea2, qwen_image21, z_image"): reader.load_vae(path, family="sd15", dtype=mx.float32) diff --git a/tests/image/test_image_vae_rows.py b/tests/image/test_image_vae_rows.py index cacd613d0..d9cf54869 100644 --- a/tests/image/test_image_vae_rows.py +++ b/tests/image/test_image_vae_rows.py @@ -100,8 +100,8 @@ def test_every_family_has_a_vae_row(): assert not hasattr(memfit.PEAKS[FAMILY], "vae_channels") for price in (memfit.vae_peak, memfit.vae_tiling): with pytest.raises(ValueError, match="no VAE memory row for image " - "family 'flux'; known: flux3_klein, krea2, " - "qwen_image21, z_image"): + "family 'flux'; known: flux2_klein, flux3_klein, " + "krea2, qwen_image21, z_image"): price("decode", 512, 512, family="flux", itemsize=2) @@ -137,6 +137,8 @@ def _official_vaes() -> dict: out = {"z_image": flux1_ae.Flux1AEConfig(latent_channels=16, **flux), "flux3_klein": flux2_ae.Flux2AEConfig(latent_channels=32, **flux), "krea2": qm.OFFICIAL, "qwen_image21": mem.OFFICIAL} + # FLUX.2 klein reads the autoencoder FLUX.3 klein reads. + out["flux2_klein"] = out["flux3_klein"] assert set(out) == set(reader.VAES) return out From c1c2b1d4bbaebe5bb195faa1ce4e7f3665e4d952 Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 09:23:48 -0700 Subject: [PATCH 018/101] feat(image): flux2 klein lora key map, with the stems comfyui reads named in full --- gmlx/image/families/flux2_klein/family.py | 7 + gmlx/image/families/flux2_klein/lora_map.py | 144 ++++ gmlx/image/lora/reader.py | 18 +- .../image/flux2_klein_diffusers_names.json | 793 ++++++++++++++++++ tests/fixtures/image/lora_rules_digest.json | 330 ++++++++ tests/fixtures/image/manifest.json | 8 + tests/image/test_image_flux2_lora_map.py | 555 ++++++++++++ .../image/test_image_lora_rules_unchanged.py | 165 ++++ 8 files changed, 2018 insertions(+), 2 deletions(-) create mode 100644 gmlx/image/families/flux2_klein/lora_map.py create mode 100644 tests/fixtures/image/flux2_klein_diffusers_names.json create mode 100644 tests/fixtures/image/lora_rules_digest.json create mode 100644 tests/image/test_image_flux2_lora_map.py create mode 100644 tests/image/test_image_lora_rules_unchanged.py diff --git a/gmlx/image/families/flux2_klein/family.py b/gmlx/image/families/flux2_klein/family.py index 4d5a92766..1641e25d5 100644 --- a/gmlx/image/families/flux2_klein/family.py +++ b/gmlx/image/families/flux2_klein/family.py @@ -311,6 +311,12 @@ def build(config: dict): return Flux2KleinDiT(config) +def lora_map(config: dict): + from .lora_map import lora_map as build_map + + return build_map(config) + + def synth_config(view: HeaderView) -> dict: """The keys of the official transformer/config.json, from shapes and constants.""" @@ -387,6 +393,7 @@ def _size(refs): synth_config=synth_config, constants=CONSTANTS, build=build, + lora_map=lora_map, # The q and k norm scales, F32 in the file, stay fp32: the norm then # runs in fp32 and rounds once with the rotation. fp32_keep=("norm.query_norm.scale", "norm.key_norm.scale"), diff --git a/gmlx/image/families/flux2_klein/lora_map.py b/gmlx/image/families/flux2_klein/lora_map.py new file mode 100644 index 000000000..e41438c90 --- /dev/null +++ b/gmlx/image/families/flux2_klein/lora_map.py @@ -0,0 +1,144 @@ +"""FLUX.2 klein LoRA key map. + +The GGUF keeps the names of BFL's transformer, and an adapter trained on +that transformer, such as an AI-Toolkit or a kohya file, names the same +layers: in each double block ``img_attn.qkv``, ``img_attn.proj``, +``img_mlp.0`` and ``img_mlp.2`` and the same four of ``txt_``, in each +single block ``linear1`` and ``linear2``, and outside the blocks +``img_in``, ``txt_in``, ``time_in.in_layer``, ``time_in.out_layer``, the +``lin`` of ``double_stream_modulation_img``, +``double_stream_modulation_txt`` and ``single_stream_modulation``, +``final_layer.linear`` and ``final_layer.adaLN_modulation.1``. Each name +maps to itself. ``img_mlp.0`` holds the gate rows, then the up rows, and +``linear1`` the q, k and v rows, then the gate and up rows of its MLP: +a pair on either is one delta over all of its rows. + +An adapter in the diffusers layout names the layers of +Flux2Transformer2DModel, which splits the fused q, k and v weight of a +double block. ``attn.to_q``, ``attn.to_k`` and ``attn.to_v`` are bands 0, +1 and 2 of ``img_attn.qkv``, each of the width in rows, and +``attn.add_q_proj``, ``attn.add_k_proj`` and ``attn.add_v_proj`` the +bands of ``txt_attn.qkv``. ``attn.to_out.0`` is ``img_attn.proj``, also +spelled ``attn.to_out``, and ``attn.to_add_out`` is ``txt_attn.proj``. +``ff.linear_in``, ``ff.linear_out`` and their ``ff_context`` twins are +the MLPs. In a single block ``attn.to_qkv_mlp_proj`` is ``linear1`` and +``attn.to_out`` is ``linear2``. Outside the blocks the names are +``x_embedder``, ``context_embedder``, +``time_guidance_embed.timestep_embedder.linear_1`` and ``linear_2``, the +``linear`` of each modulation, ``norm_out.linear`` and ``proj_out``. +diffusers' converter swaps the shift and the scale halves of the final +modulation, so ``norm_out.linear`` holds the scale rows first, and the +halves of the up rows of a pair on it are swapped back. ComfyUI also +reads ``diffusion_model.single_blocks.N.linear1_qkv`` as the q, k and v +rows of ``linear1``, and so does gmlx. + +ComfyUI reads the GGUF names under ``diffusion_model.`` and +``lora_unet_``, and the diffusers names of its FLUX table under +``transformer.``, under no prefix, and with underscores under +``lycoris_`` and ``lora_transformer_``. That table has no diffusers name +for the three modulations or for the time embedder of FLUX.2, so ComfyUI +drops those pairs, and the reader warns of each stem that ComfyUI drops. + +The diffusers loader converts a file of GGUF names only when every key +starts with ``diffusion_model.``. It maps a pair on +``final_layer.adaLN_modulation.1`` to ``norm_out.linear`` without the +swap, so such a pair gives another image there than in gmlx and in +ComfyUI. Its kohya converter skips the modulation and final modulation +pairs with a warning. No text encoder key resolves: the map has no +encoder targets. +""" + +from __future__ import annotations + +from gmlx.image.lora.reader import LoraKeyMap + +# The leaves of a double block, by GGUF name and diffusers name. +_DOUBLE = (("img_attn.proj", "attn.to_out.0"), + ("txt_attn.proj", "attn.to_add_out"), + ("img_mlp.0", "ff.linear_in"), ("img_mlp.2", "ff.linear_out"), + ("txt_mlp.0", "ff_context.linear_in"), + ("txt_mlp.2", "ff_context.linear_out")) +# The bands of each fused q, k and v weight, in the order of its rows. +_QKV = (("img_attn.qkv", ("attn.to_q", "attn.to_k", "attn.to_v")), + ("txt_attn.qkv", ("attn.add_q_proj", "attn.add_k_proj", + "attn.add_v_proj"))) +_SINGLE = (("linear1", "attn.to_qkv_mlp_proj"), ("linear2", "attn.to_out")) +NORM_OUT = "norm_out.linear" +_TOP = (("img_in", "x_embedder"), ("txt_in", "context_embedder"), + ("final_layer.linear", "proj_out"), + ("final_layer.adaLN_modulation.1", NORM_OUT)) +# The layers outside the blocks that ComfyUI reads by GGUF name alone. +_TOP_GGUF_ONLY = ( + ("time_in.in_layer", "time_guidance_embed.timestep_embedder.linear_1"), + ("time_in.out_layer", "time_guidance_embed.timestep_embedder.linear_2"), + *((f"{m}.lin", f"{m}.linear") + for m in ("double_stream_modulation_img", + "double_stream_modulation_txt", "single_stream_modulation"))) +COMFY_GGUF = ("diffusion_model.", "lora_unet_") +COMFY_DIFFUSERS = ("transformer.", "", "lycoris_", "lora_transformer_") +COMFY_READS = ("the GGUF names under diffusion_model. or lora_unet_, and " + "the diffusers names of its FLUX table, which has none for " + "the modulations or the time embedder") + + +def _shape(config: dict) -> tuple[int, int, int]: + """Double blocks, single blocks and the width. ``config`` is the + config synthesized from a header, which a file is checked with before + a model loads, or the fields of a built model's config.""" + if "num_layers" in config: + return (int(config["num_layers"]), int(config["num_single_layers"]), + int(config["num_attention_heads"]) + * int(config["attention_head_dim"])) + return (int(config["depth"]), int(config["depth_single"]), + int(config["dim"])) + + +def _spell(prefix: str, name: str) -> str: + return prefix + (name.replace(".", "_") if prefix.endswith("_") + else name) + + +def lora_map(config: dict) -> LoraKeyMap: + depth, single, dim = _shape(config) + targets: dict = {} + diffusers_only = set() + comfy: set = set() + + def add(native: str, diffusers: str | None, band=None, + module: str | None = None, comfy_diffusers: bool = True) -> None: + module = module or native + if native: + targets[native] = (module, band) + comfy.update(_spell(p, native) for p in COMFY_GGUF) + if diffusers: + targets[diffusers] = (module, band) + diffusers_only.add(diffusers) + if comfy_diffusers: + comfy.update(_spell(p, diffusers) for p in COMFY_DIFFUSERS) + + for i in range(depth): + x, d = f"double_blocks.{i}", f"transformer_blocks.{i}" + for leaf, dname in _DOUBLE: + add(f"{x}.{leaf}", f"{d}.{dname}") + add("", f"{d}.attn.to_out", module=f"{x}.img_attn.proj", + comfy_diffusers=False) + for leaf, names in _QKV: + add(f"{x}.{leaf}", None) + for band, dname in enumerate(names): + add("", f"{d}.{dname}", band=(0, band * dim, dim), + module=f"{x}.{leaf}") + for i in range(single): + x, d = f"single_blocks.{i}", f"single_transformer_blocks.{i}" + for leaf, dname in _SINGLE: + add(f"{x}.{leaf}", f"{d}.{dname}") + targets[f"{x}.linear1_qkv"] = (f"{x}.linear1", (0, 0, 3 * dim)) + comfy.add(f"diffusion_model.{x}.linear1_qkv") + for native, dname in _TOP: + add(native, dname) + for native, dname in _TOP_GGUF_ONLY: + add(native, dname, comfy_diffusers=False) + return LoraKeyMap(family="flux2_klein", title="FLUX.2 klein", + targets=targets, + diffusers_only=frozenset(diffusers_only), + swapped=frozenset({NORM_OUT}), + comfy_stems=frozenset(comfy), comfy_reads=COMFY_READS) diff --git a/gmlx/image/lora/reader.py b/gmlx/image/lora/reader.py index aa9b93233..90fca63ac 100644 --- a/gmlx/image/lora/reader.py +++ b/gmlx/image/lora/reader.py @@ -185,7 +185,11 @@ class LoraKeyMap: the up rows of a pair on such a target are swapped back. ``comfy_prefixes``, when set, are the only stem prefixes under which ComfyUI finds the family's targets, and only those that are not - ``diffusers_only``: ComfyUI drops every other spelling.""" + ``diffusers_only``: ComfyUI drops every other spelling. + ``comfy_stems``, when not None, is every DiT stem that ComfyUI's key + map reads for the family, and ComfyUI drops every other stem; + ``comfy_reads`` says which stems those are, for the warning. None + keeps the prefix rules above.""" family: str title: str targets: Mapping @@ -195,6 +199,8 @@ class LoraKeyMap: absent: Mapping = field(default_factory=dict) swapped: frozenset = frozenset() comfy_prefixes: tuple = () + comfy_stems: frozenset | None = None + comfy_reads: str = "" @dataclass(frozen=True) @@ -776,6 +782,8 @@ def _comfy_drops(stem: str, name: str, underscored: bool, keymap: LoraKeyMap) -> bool: """Whether ComfyUI's key map lacks the DiT stem ``stem`` of target ``name``.""" + if keymap.comfy_stems is not None: + return stem not in keymap.comfy_stems if keymap.comfy_prefixes: if name in keymap.diffusers_only: return True @@ -852,7 +860,13 @@ def resolve(raw: RawLora, keymap: LoraKeyMap, *, f"adapter header that is not their rank ({_listed(scaled)}). " "gmlx applies it as the diffusers loader does, and ComfyUI " "does not read the header, so the image differs from ComfyUI's") - if dropped and keymap.comfy_prefixes: + if dropped and keymap.comfy_stems is not None: + warnings.append( + f"{raw.path}: {len(dropped)} keys have a spelling that ComfyUI " + f"does not read for {keymap.title} ({_listed(dropped)}). " + f"ComfyUI reads {keymap.comfy_reads}. gmlx applies them and " + "ComfyUI drops them, so the image differs from ComfyUI's") + elif dropped and keymap.comfy_prefixes: warnings.append( f"{raw.path}: {len(dropped)} keys have a spelling that ComfyUI " f"does not read for {keymap.title} ({_listed(dropped)}). " diff --git a/tests/fixtures/image/flux2_klein_diffusers_names.json b/tests/fixtures/image/flux2_klein_diffusers_names.json new file mode 100644 index 000000000..a7eb1e48c --- /dev/null +++ b/tests/fixtures/image/flux2_klein_diffusers_names.json @@ -0,0 +1,793 @@ +{ + "source": "black-forest-labs/FLUX.2-klein-4B transformer/diffusion_pytorch_model.safetensors, the names and shapes of its header", + "class": "Flux2Transformer2DModel", + "names": [ + "context_embedder.weight", + "double_stream_modulation_img.linear.weight", + "double_stream_modulation_txt.linear.weight", + "norm_out.linear.weight", + "proj_out.weight", + "single_stream_modulation.linear.weight", + "single_transformer_blocks.0.attn.norm_k.weight", + "single_transformer_blocks.0.attn.norm_q.weight", + "single_transformer_blocks.0.attn.to_out.weight", + "single_transformer_blocks.0.attn.to_qkv_mlp_proj.weight", + "single_transformer_blocks.1.attn.norm_k.weight", + "single_transformer_blocks.1.attn.norm_q.weight", + "single_transformer_blocks.1.attn.to_out.weight", + "single_transformer_blocks.1.attn.to_qkv_mlp_proj.weight", + "single_transformer_blocks.10.attn.norm_k.weight", + "single_transformer_blocks.10.attn.norm_q.weight", + "single_transformer_blocks.10.attn.to_out.weight", + "single_transformer_blocks.10.attn.to_qkv_mlp_proj.weight", + "single_transformer_blocks.11.attn.norm_k.weight", + "single_transformer_blocks.11.attn.norm_q.weight", + "single_transformer_blocks.11.attn.to_out.weight", + "single_transformer_blocks.11.attn.to_qkv_mlp_proj.weight", + "single_transformer_blocks.12.attn.norm_k.weight", + "single_transformer_blocks.12.attn.norm_q.weight", + "single_transformer_blocks.12.attn.to_out.weight", + "single_transformer_blocks.12.attn.to_qkv_mlp_proj.weight", + "single_transformer_blocks.13.attn.norm_k.weight", + "single_transformer_blocks.13.attn.norm_q.weight", + "single_transformer_blocks.13.attn.to_out.weight", + "single_transformer_blocks.13.attn.to_qkv_mlp_proj.weight", + "single_transformer_blocks.14.attn.norm_k.weight", + "single_transformer_blocks.14.attn.norm_q.weight", + "single_transformer_blocks.14.attn.to_out.weight", + "single_transformer_blocks.14.attn.to_qkv_mlp_proj.weight", + "single_transformer_blocks.15.attn.norm_k.weight", + "single_transformer_blocks.15.attn.norm_q.weight", + "single_transformer_blocks.15.attn.to_out.weight", + "single_transformer_blocks.15.attn.to_qkv_mlp_proj.weight", + "single_transformer_blocks.16.attn.norm_k.weight", + "single_transformer_blocks.16.attn.norm_q.weight", + "single_transformer_blocks.16.attn.to_out.weight", + "single_transformer_blocks.16.attn.to_qkv_mlp_proj.weight", + "single_transformer_blocks.17.attn.norm_k.weight", + "single_transformer_blocks.17.attn.norm_q.weight", + "single_transformer_blocks.17.attn.to_out.weight", + "single_transformer_blocks.17.attn.to_qkv_mlp_proj.weight", + "single_transformer_blocks.18.attn.norm_k.weight", + "single_transformer_blocks.18.attn.norm_q.weight", + "single_transformer_blocks.18.attn.to_out.weight", + "single_transformer_blocks.18.attn.to_qkv_mlp_proj.weight", + "single_transformer_blocks.19.attn.norm_k.weight", + "single_transformer_blocks.19.attn.norm_q.weight", + "single_transformer_blocks.19.attn.to_out.weight", + "single_transformer_blocks.19.attn.to_qkv_mlp_proj.weight", + "single_transformer_blocks.2.attn.norm_k.weight", + "single_transformer_blocks.2.attn.norm_q.weight", + "single_transformer_blocks.2.attn.to_out.weight", + "single_transformer_blocks.2.attn.to_qkv_mlp_proj.weight", + "single_transformer_blocks.3.attn.norm_k.weight", + "single_transformer_blocks.3.attn.norm_q.weight", + "single_transformer_blocks.3.attn.to_out.weight", + "single_transformer_blocks.3.attn.to_qkv_mlp_proj.weight", + "single_transformer_blocks.4.attn.norm_k.weight", + "single_transformer_blocks.4.attn.norm_q.weight", + "single_transformer_blocks.4.attn.to_out.weight", + "single_transformer_blocks.4.attn.to_qkv_mlp_proj.weight", + "single_transformer_blocks.5.attn.norm_k.weight", + "single_transformer_blocks.5.attn.norm_q.weight", + "single_transformer_blocks.5.attn.to_out.weight", + "single_transformer_blocks.5.attn.to_qkv_mlp_proj.weight", + "single_transformer_blocks.6.attn.norm_k.weight", + "single_transformer_blocks.6.attn.norm_q.weight", + "single_transformer_blocks.6.attn.to_out.weight", + "single_transformer_blocks.6.attn.to_qkv_mlp_proj.weight", + "single_transformer_blocks.7.attn.norm_k.weight", + "single_transformer_blocks.7.attn.norm_q.weight", + "single_transformer_blocks.7.attn.to_out.weight", + "single_transformer_blocks.7.attn.to_qkv_mlp_proj.weight", + "single_transformer_blocks.8.attn.norm_k.weight", + "single_transformer_blocks.8.attn.norm_q.weight", + "single_transformer_blocks.8.attn.to_out.weight", + "single_transformer_blocks.8.attn.to_qkv_mlp_proj.weight", + "single_transformer_blocks.9.attn.norm_k.weight", + "single_transformer_blocks.9.attn.norm_q.weight", + "single_transformer_blocks.9.attn.to_out.weight", + "single_transformer_blocks.9.attn.to_qkv_mlp_proj.weight", + "time_guidance_embed.timestep_embedder.linear_1.weight", + "time_guidance_embed.timestep_embedder.linear_2.weight", + "transformer_blocks.0.attn.add_k_proj.weight", + "transformer_blocks.0.attn.add_q_proj.weight", + "transformer_blocks.0.attn.add_v_proj.weight", + "transformer_blocks.0.attn.norm_added_k.weight", + "transformer_blocks.0.attn.norm_added_q.weight", + "transformer_blocks.0.attn.norm_k.weight", + "transformer_blocks.0.attn.norm_q.weight", + "transformer_blocks.0.attn.to_add_out.weight", + "transformer_blocks.0.attn.to_k.weight", + "transformer_blocks.0.attn.to_out.0.weight", + "transformer_blocks.0.attn.to_q.weight", + "transformer_blocks.0.attn.to_v.weight", + "transformer_blocks.0.ff.linear_in.weight", + "transformer_blocks.0.ff.linear_out.weight", + "transformer_blocks.0.ff_context.linear_in.weight", + "transformer_blocks.0.ff_context.linear_out.weight", + "transformer_blocks.1.attn.add_k_proj.weight", + "transformer_blocks.1.attn.add_q_proj.weight", + "transformer_blocks.1.attn.add_v_proj.weight", + "transformer_blocks.1.attn.norm_added_k.weight", + "transformer_blocks.1.attn.norm_added_q.weight", + "transformer_blocks.1.attn.norm_k.weight", + "transformer_blocks.1.attn.norm_q.weight", + "transformer_blocks.1.attn.to_add_out.weight", + "transformer_blocks.1.attn.to_k.weight", + "transformer_blocks.1.attn.to_out.0.weight", + "transformer_blocks.1.attn.to_q.weight", + "transformer_blocks.1.attn.to_v.weight", + "transformer_blocks.1.ff.linear_in.weight", + "transformer_blocks.1.ff.linear_out.weight", + "transformer_blocks.1.ff_context.linear_in.weight", + "transformer_blocks.1.ff_context.linear_out.weight", + "transformer_blocks.2.attn.add_k_proj.weight", + "transformer_blocks.2.attn.add_q_proj.weight", + "transformer_blocks.2.attn.add_v_proj.weight", + "transformer_blocks.2.attn.norm_added_k.weight", + "transformer_blocks.2.attn.norm_added_q.weight", + "transformer_blocks.2.attn.norm_k.weight", + "transformer_blocks.2.attn.norm_q.weight", + "transformer_blocks.2.attn.to_add_out.weight", + "transformer_blocks.2.attn.to_k.weight", + "transformer_blocks.2.attn.to_out.0.weight", + "transformer_blocks.2.attn.to_q.weight", + "transformer_blocks.2.attn.to_v.weight", + "transformer_blocks.2.ff.linear_in.weight", + "transformer_blocks.2.ff.linear_out.weight", + "transformer_blocks.2.ff_context.linear_in.weight", + "transformer_blocks.2.ff_context.linear_out.weight", + "transformer_blocks.3.attn.add_k_proj.weight", + "transformer_blocks.3.attn.add_q_proj.weight", + "transformer_blocks.3.attn.add_v_proj.weight", + "transformer_blocks.3.attn.norm_added_k.weight", + "transformer_blocks.3.attn.norm_added_q.weight", + "transformer_blocks.3.attn.norm_k.weight", + "transformer_blocks.3.attn.norm_q.weight", + "transformer_blocks.3.attn.to_add_out.weight", + "transformer_blocks.3.attn.to_k.weight", + "transformer_blocks.3.attn.to_out.0.weight", + "transformer_blocks.3.attn.to_q.weight", + "transformer_blocks.3.attn.to_v.weight", + "transformer_blocks.3.ff.linear_in.weight", + "transformer_blocks.3.ff.linear_out.weight", + "transformer_blocks.3.ff_context.linear_in.weight", + "transformer_blocks.3.ff_context.linear_out.weight", + "transformer_blocks.4.attn.add_k_proj.weight", + "transformer_blocks.4.attn.add_q_proj.weight", + "transformer_blocks.4.attn.add_v_proj.weight", + "transformer_blocks.4.attn.norm_added_k.weight", + "transformer_blocks.4.attn.norm_added_q.weight", + "transformer_blocks.4.attn.norm_k.weight", + "transformer_blocks.4.attn.norm_q.weight", + "transformer_blocks.4.attn.to_add_out.weight", + "transformer_blocks.4.attn.to_k.weight", + "transformer_blocks.4.attn.to_out.0.weight", + "transformer_blocks.4.attn.to_q.weight", + "transformer_blocks.4.attn.to_v.weight", + "transformer_blocks.4.ff.linear_in.weight", + "transformer_blocks.4.ff.linear_out.weight", + "transformer_blocks.4.ff_context.linear_in.weight", + "transformer_blocks.4.ff_context.linear_out.weight", + "x_embedder.weight" + ], + "shapes": { + "context_embedder.weight": [ + 3072, + 7680 + ], + "double_stream_modulation_img.linear.weight": [ + 18432, + 3072 + ], + "double_stream_modulation_txt.linear.weight": [ + 18432, + 3072 + ], + "norm_out.linear.weight": [ + 6144, + 3072 + ], + "proj_out.weight": [ + 128, + 3072 + ], + "single_stream_modulation.linear.weight": [ + 9216, + 3072 + ], + "single_transformer_blocks.0.attn.norm_k.weight": [ + 128 + ], + "single_transformer_blocks.0.attn.norm_q.weight": [ + 128 + ], + "single_transformer_blocks.0.attn.to_out.weight": [ + 3072, + 12288 + ], + "single_transformer_blocks.0.attn.to_qkv_mlp_proj.weight": [ + 27648, + 3072 + ], + "single_transformer_blocks.1.attn.norm_k.weight": [ + 128 + ], + "single_transformer_blocks.1.attn.norm_q.weight": [ + 128 + ], + "single_transformer_blocks.1.attn.to_out.weight": [ + 3072, + 12288 + ], + "single_transformer_blocks.1.attn.to_qkv_mlp_proj.weight": [ + 27648, + 3072 + ], + "single_transformer_blocks.10.attn.norm_k.weight": [ + 128 + ], + "single_transformer_blocks.10.attn.norm_q.weight": [ + 128 + ], + "single_transformer_blocks.10.attn.to_out.weight": [ + 3072, + 12288 + ], + "single_transformer_blocks.10.attn.to_qkv_mlp_proj.weight": [ + 27648, + 3072 + ], + "single_transformer_blocks.11.attn.norm_k.weight": [ + 128 + ], + "single_transformer_blocks.11.attn.norm_q.weight": [ + 128 + ], + "single_transformer_blocks.11.attn.to_out.weight": [ + 3072, + 12288 + ], + "single_transformer_blocks.11.attn.to_qkv_mlp_proj.weight": [ + 27648, + 3072 + ], + "single_transformer_blocks.12.attn.norm_k.weight": [ + 128 + ], + "single_transformer_blocks.12.attn.norm_q.weight": [ + 128 + ], + "single_transformer_blocks.12.attn.to_out.weight": [ + 3072, + 12288 + ], + "single_transformer_blocks.12.attn.to_qkv_mlp_proj.weight": [ + 27648, + 3072 + ], + "single_transformer_blocks.13.attn.norm_k.weight": [ + 128 + ], + "single_transformer_blocks.13.attn.norm_q.weight": [ + 128 + ], + "single_transformer_blocks.13.attn.to_out.weight": [ + 3072, + 12288 + ], + "single_transformer_blocks.13.attn.to_qkv_mlp_proj.weight": [ + 27648, + 3072 + ], + "single_transformer_blocks.14.attn.norm_k.weight": [ + 128 + ], + "single_transformer_blocks.14.attn.norm_q.weight": [ + 128 + ], + "single_transformer_blocks.14.attn.to_out.weight": [ + 3072, + 12288 + ], + "single_transformer_blocks.14.attn.to_qkv_mlp_proj.weight": [ + 27648, + 3072 + ], + "single_transformer_blocks.15.attn.norm_k.weight": [ + 128 + ], + "single_transformer_blocks.15.attn.norm_q.weight": [ + 128 + ], + "single_transformer_blocks.15.attn.to_out.weight": [ + 3072, + 12288 + ], + "single_transformer_blocks.15.attn.to_qkv_mlp_proj.weight": [ + 27648, + 3072 + ], + "single_transformer_blocks.16.attn.norm_k.weight": [ + 128 + ], + "single_transformer_blocks.16.attn.norm_q.weight": [ + 128 + ], + "single_transformer_blocks.16.attn.to_out.weight": [ + 3072, + 12288 + ], + "single_transformer_blocks.16.attn.to_qkv_mlp_proj.weight": [ + 27648, + 3072 + ], + "single_transformer_blocks.17.attn.norm_k.weight": [ + 128 + ], + "single_transformer_blocks.17.attn.norm_q.weight": [ + 128 + ], + "single_transformer_blocks.17.attn.to_out.weight": [ + 3072, + 12288 + ], + "single_transformer_blocks.17.attn.to_qkv_mlp_proj.weight": [ + 27648, + 3072 + ], + "single_transformer_blocks.18.attn.norm_k.weight": [ + 128 + ], + "single_transformer_blocks.18.attn.norm_q.weight": [ + 128 + ], + "single_transformer_blocks.18.attn.to_out.weight": [ + 3072, + 12288 + ], + "single_transformer_blocks.18.attn.to_qkv_mlp_proj.weight": [ + 27648, + 3072 + ], + "single_transformer_blocks.19.attn.norm_k.weight": [ + 128 + ], + "single_transformer_blocks.19.attn.norm_q.weight": [ + 128 + ], + "single_transformer_blocks.19.attn.to_out.weight": [ + 3072, + 12288 + ], + "single_transformer_blocks.19.attn.to_qkv_mlp_proj.weight": [ + 27648, + 3072 + ], + "single_transformer_blocks.2.attn.norm_k.weight": [ + 128 + ], + "single_transformer_blocks.2.attn.norm_q.weight": [ + 128 + ], + "single_transformer_blocks.2.attn.to_out.weight": [ + 3072, + 12288 + ], + "single_transformer_blocks.2.attn.to_qkv_mlp_proj.weight": [ + 27648, + 3072 + ], + "single_transformer_blocks.3.attn.norm_k.weight": [ + 128 + ], + "single_transformer_blocks.3.attn.norm_q.weight": [ + 128 + ], + "single_transformer_blocks.3.attn.to_out.weight": [ + 3072, + 12288 + ], + "single_transformer_blocks.3.attn.to_qkv_mlp_proj.weight": [ + 27648, + 3072 + ], + "single_transformer_blocks.4.attn.norm_k.weight": [ + 128 + ], + "single_transformer_blocks.4.attn.norm_q.weight": [ + 128 + ], + "single_transformer_blocks.4.attn.to_out.weight": [ + 3072, + 12288 + ], + "single_transformer_blocks.4.attn.to_qkv_mlp_proj.weight": [ + 27648, + 3072 + ], + "single_transformer_blocks.5.attn.norm_k.weight": [ + 128 + ], + "single_transformer_blocks.5.attn.norm_q.weight": [ + 128 + ], + "single_transformer_blocks.5.attn.to_out.weight": [ + 3072, + 12288 + ], + "single_transformer_blocks.5.attn.to_qkv_mlp_proj.weight": [ + 27648, + 3072 + ], + "single_transformer_blocks.6.attn.norm_k.weight": [ + 128 + ], + "single_transformer_blocks.6.attn.norm_q.weight": [ + 128 + ], + "single_transformer_blocks.6.attn.to_out.weight": [ + 3072, + 12288 + ], + "single_transformer_blocks.6.attn.to_qkv_mlp_proj.weight": [ + 27648, + 3072 + ], + "single_transformer_blocks.7.attn.norm_k.weight": [ + 128 + ], + "single_transformer_blocks.7.attn.norm_q.weight": [ + 128 + ], + "single_transformer_blocks.7.attn.to_out.weight": [ + 3072, + 12288 + ], + "single_transformer_blocks.7.attn.to_qkv_mlp_proj.weight": [ + 27648, + 3072 + ], + "single_transformer_blocks.8.attn.norm_k.weight": [ + 128 + ], + "single_transformer_blocks.8.attn.norm_q.weight": [ + 128 + ], + "single_transformer_blocks.8.attn.to_out.weight": [ + 3072, + 12288 + ], + "single_transformer_blocks.8.attn.to_qkv_mlp_proj.weight": [ + 27648, + 3072 + ], + "single_transformer_blocks.9.attn.norm_k.weight": [ + 128 + ], + "single_transformer_blocks.9.attn.norm_q.weight": [ + 128 + ], + "single_transformer_blocks.9.attn.to_out.weight": [ + 3072, + 12288 + ], + "single_transformer_blocks.9.attn.to_qkv_mlp_proj.weight": [ + 27648, + 3072 + ], + "time_guidance_embed.timestep_embedder.linear_1.weight": [ + 3072, + 256 + ], + "time_guidance_embed.timestep_embedder.linear_2.weight": [ + 3072, + 3072 + ], + "transformer_blocks.0.attn.add_k_proj.weight": [ + 3072, + 3072 + ], + "transformer_blocks.0.attn.add_q_proj.weight": [ + 3072, + 3072 + ], + "transformer_blocks.0.attn.add_v_proj.weight": [ + 3072, + 3072 + ], + "transformer_blocks.0.attn.norm_added_k.weight": [ + 128 + ], + "transformer_blocks.0.attn.norm_added_q.weight": [ + 128 + ], + "transformer_blocks.0.attn.norm_k.weight": [ + 128 + ], + "transformer_blocks.0.attn.norm_q.weight": [ + 128 + ], + "transformer_blocks.0.attn.to_add_out.weight": [ + 3072, + 3072 + ], + "transformer_blocks.0.attn.to_k.weight": [ + 3072, + 3072 + ], + "transformer_blocks.0.attn.to_out.0.weight": [ + 3072, + 3072 + ], + "transformer_blocks.0.attn.to_q.weight": [ + 3072, + 3072 + ], + "transformer_blocks.0.attn.to_v.weight": [ + 3072, + 3072 + ], + "transformer_blocks.0.ff.linear_in.weight": [ + 18432, + 3072 + ], + "transformer_blocks.0.ff.linear_out.weight": [ + 3072, + 9216 + ], + "transformer_blocks.0.ff_context.linear_in.weight": [ + 18432, + 3072 + ], + "transformer_blocks.0.ff_context.linear_out.weight": [ + 3072, + 9216 + ], + "transformer_blocks.1.attn.add_k_proj.weight": [ + 3072, + 3072 + ], + "transformer_blocks.1.attn.add_q_proj.weight": [ + 3072, + 3072 + ], + "transformer_blocks.1.attn.add_v_proj.weight": [ + 3072, + 3072 + ], + "transformer_blocks.1.attn.norm_added_k.weight": [ + 128 + ], + "transformer_blocks.1.attn.norm_added_q.weight": [ + 128 + ], + "transformer_blocks.1.attn.norm_k.weight": [ + 128 + ], + "transformer_blocks.1.attn.norm_q.weight": [ + 128 + ], + "transformer_blocks.1.attn.to_add_out.weight": [ + 3072, + 3072 + ], + "transformer_blocks.1.attn.to_k.weight": [ + 3072, + 3072 + ], + "transformer_blocks.1.attn.to_out.0.weight": [ + 3072, + 3072 + ], + "transformer_blocks.1.attn.to_q.weight": [ + 3072, + 3072 + ], + "transformer_blocks.1.attn.to_v.weight": [ + 3072, + 3072 + ], + "transformer_blocks.1.ff.linear_in.weight": [ + 18432, + 3072 + ], + "transformer_blocks.1.ff.linear_out.weight": [ + 3072, + 9216 + ], + "transformer_blocks.1.ff_context.linear_in.weight": [ + 18432, + 3072 + ], + "transformer_blocks.1.ff_context.linear_out.weight": [ + 3072, + 9216 + ], + "transformer_blocks.2.attn.add_k_proj.weight": [ + 3072, + 3072 + ], + "transformer_blocks.2.attn.add_q_proj.weight": [ + 3072, + 3072 + ], + "transformer_blocks.2.attn.add_v_proj.weight": [ + 3072, + 3072 + ], + "transformer_blocks.2.attn.norm_added_k.weight": [ + 128 + ], + "transformer_blocks.2.attn.norm_added_q.weight": [ + 128 + ], + "transformer_blocks.2.attn.norm_k.weight": [ + 128 + ], + "transformer_blocks.2.attn.norm_q.weight": [ + 128 + ], + "transformer_blocks.2.attn.to_add_out.weight": [ + 3072, + 3072 + ], + "transformer_blocks.2.attn.to_k.weight": [ + 3072, + 3072 + ], + "transformer_blocks.2.attn.to_out.0.weight": [ + 3072, + 3072 + ], + "transformer_blocks.2.attn.to_q.weight": [ + 3072, + 3072 + ], + "transformer_blocks.2.attn.to_v.weight": [ + 3072, + 3072 + ], + "transformer_blocks.2.ff.linear_in.weight": [ + 18432, + 3072 + ], + "transformer_blocks.2.ff.linear_out.weight": [ + 3072, + 9216 + ], + "transformer_blocks.2.ff_context.linear_in.weight": [ + 18432, + 3072 + ], + "transformer_blocks.2.ff_context.linear_out.weight": [ + 3072, + 9216 + ], + "transformer_blocks.3.attn.add_k_proj.weight": [ + 3072, + 3072 + ], + "transformer_blocks.3.attn.add_q_proj.weight": [ + 3072, + 3072 + ], + "transformer_blocks.3.attn.add_v_proj.weight": [ + 3072, + 3072 + ], + "transformer_blocks.3.attn.norm_added_k.weight": [ + 128 + ], + "transformer_blocks.3.attn.norm_added_q.weight": [ + 128 + ], + "transformer_blocks.3.attn.norm_k.weight": [ + 128 + ], + "transformer_blocks.3.attn.norm_q.weight": [ + 128 + ], + "transformer_blocks.3.attn.to_add_out.weight": [ + 3072, + 3072 + ], + "transformer_blocks.3.attn.to_k.weight": [ + 3072, + 3072 + ], + "transformer_blocks.3.attn.to_out.0.weight": [ + 3072, + 3072 + ], + "transformer_blocks.3.attn.to_q.weight": [ + 3072, + 3072 + ], + "transformer_blocks.3.attn.to_v.weight": [ + 3072, + 3072 + ], + "transformer_blocks.3.ff.linear_in.weight": [ + 18432, + 3072 + ], + "transformer_blocks.3.ff.linear_out.weight": [ + 3072, + 9216 + ], + "transformer_blocks.3.ff_context.linear_in.weight": [ + 18432, + 3072 + ], + "transformer_blocks.3.ff_context.linear_out.weight": [ + 3072, + 9216 + ], + "transformer_blocks.4.attn.add_k_proj.weight": [ + 3072, + 3072 + ], + "transformer_blocks.4.attn.add_q_proj.weight": [ + 3072, + 3072 + ], + "transformer_blocks.4.attn.add_v_proj.weight": [ + 3072, + 3072 + ], + "transformer_blocks.4.attn.norm_added_k.weight": [ + 128 + ], + "transformer_blocks.4.attn.norm_added_q.weight": [ + 128 + ], + "transformer_blocks.4.attn.norm_k.weight": [ + 128 + ], + "transformer_blocks.4.attn.norm_q.weight": [ + 128 + ], + "transformer_blocks.4.attn.to_add_out.weight": [ + 3072, + 3072 + ], + "transformer_blocks.4.attn.to_k.weight": [ + 3072, + 3072 + ], + "transformer_blocks.4.attn.to_out.0.weight": [ + 3072, + 3072 + ], + "transformer_blocks.4.attn.to_q.weight": [ + 3072, + 3072 + ], + "transformer_blocks.4.attn.to_v.weight": [ + 3072, + 3072 + ], + "transformer_blocks.4.ff.linear_in.weight": [ + 18432, + 3072 + ], + "transformer_blocks.4.ff.linear_out.weight": [ + 3072, + 9216 + ], + "transformer_blocks.4.ff_context.linear_in.weight": [ + 18432, + 3072 + ], + "transformer_blocks.4.ff_context.linear_out.weight": [ + 3072, + 9216 + ], + "x_embedder.weight": [ + 3072, + 128 + ] + } +} diff --git a/tests/fixtures/image/lora_rules_digest.json b/tests/fixtures/image/lora_rules_digest.json new file mode 100644 index 000000000..cf1d7a3f6 --- /dev/null +++ b/tests/fixtures/image/lora_rules_digest.json @@ -0,0 +1,330 @@ +{ + "files": { + "Comfy-Org__Krea-2/loras/krea2_kidsdrawing.safetensors": { + "maps": { + "flux3_klein": { + "cases": 2, + "refused": 2, + "sha256": "05608533205af7ff059372d79733ab5f913fa651df9c28ae17bb649650de7b4c", + "warned": 0 + }, + "flux3_klein base": { + "cases": 2, + "refused": 2, + "sha256": "036abd21c5f559728feb945d0d67dcb90588df7983e4c87c3df325f57aa1a498", + "warned": 0 + }, + "krea2": { + "cases": 2, + "refused": 0, + "sha256": "6b9ef1fcba9823e5ab3f528d783c95a05a8de56704792c6615add37ac00cdc7b", + "warned": 0 + }, + "qwen_image21": { + "cases": 2, + "refused": 1, + "sha256": "bca2fd92b251597f7c6b8434ac3012c8d55039838329b3990695dfed40fa0abb", + "warned": 1 + }, + "qwen_image21 unfused": { + "cases": 2, + "refused": 1, + "sha256": "2335e1f6e0f3db2494277851b774dae01d02513eca4267bc53a98c06da02b10a", + "warned": 1 + }, + "z_image": { + "cases": 2, + "refused": 1, + "sha256": "e587c4a74282b2eca819b003dbf69c2847317885fe4708458e812c66020437c1", + "warned": 1 + } + }, + "size": 469291992 + }, + "Limbicnation__pixel-art-lora/pytorch_lora_weights.safetensors": { + "maps": { + "flux3_klein": { + "cases": 2, + "refused": 2, + "sha256": "df661b30f5a62edfb08689392bf7bbd1cd1fd960d24eb41e34fc45e49c49ecfc", + "warned": 0 + }, + "flux3_klein base": { + "cases": 2, + "refused": 2, + "sha256": "134b49448bcb0fb2f06aa955fbb362e9a1f8e798c1a35c4ae727ecd9924df0ce", + "warned": 0 + }, + "krea2": { + "cases": 2, + "refused": 2, + "sha256": "a87ed5378e420dde4dec37a2118b1dfae38c596e624dbbb604ca95c325960051", + "warned": 0 + }, + "qwen_image21": { + "cases": 2, + "refused": 2, + "sha256": "65819b18f8ff3a653e80f38a78c56215b1cedafe7be6ac2f0c958f302b6f0f0e", + "warned": 0 + }, + "qwen_image21 unfused": { + "cases": 2, + "refused": 2, + "sha256": "f16068b68e19a94fb9077bd4e35b93eaec764e6580d969ac905ff3579edac865", + "warned": 0 + }, + "z_image": { + "cases": 2, + "refused": 2, + "sha256": "c5c17742b411495bc9d7b37721d3b335ddb86bd48593c6f4c0072ce12603b4fb", + "warned": 0 + } + }, + "size": 325280664 + }, + "bdsqlsz__qinglong_DetailedEyes_Z-Image/qinglong_detailedeye_z-image.safetensors": { + "maps": { + "flux3_klein": { + "cases": 2, + "refused": 2, + "sha256": "f51f08cc6d88616853f83f63b8031726769095437aa744f98b661b010bcfc4ce", + "warned": 0 + }, + "flux3_klein base": { + "cases": 2, + "refused": 2, + "sha256": "3f8e1046b99a6a8819a5e2b7d803c428b444ac99238785a8603255c6327eb859", + "warned": 0 + }, + "krea2": { + "cases": 2, + "refused": 2, + "sha256": "3e4c81999f2fd9ee44129ca2e12fc3b0d7404484c7ce0bb93fd58a459fab3143", + "warned": 0 + }, + "qwen_image21": { + "cases": 2, + "refused": 2, + "sha256": "3022f8bb7ef5cae82719b3821f522624f7b2e3dd995b923d726aafd06ea71b13", + "warned": 0 + }, + "qwen_image21 unfused": { + "cases": 2, + "refused": 2, + "sha256": "5b8cd6a4797a5b816230e1b4c2cb4d5370658fc1a596814cda85fda2b684be6d", + "warned": 0 + }, + "z_image": { + "cases": 2, + "refused": 0, + "sha256": "86a54d35785d4b21ae0c37d694fb757a535e1d4d24862335a31cd449c98972d5", + "warned": 2 + } + }, + "size": 381587708 + }, + "mikkoph__mikkoani-klein4b/klein4b-mikkoani.safetensors": { + "maps": { + "flux3_klein": { + "cases": 2, + "refused": 2, + "sha256": "7c616ff97c070aa4325a9dbd0c0371a1b0b35a0e1f3bbfa4519834d6e78d838a", + "warned": 0 + }, + "flux3_klein base": { + "cases": 2, + "refused": 2, + "sha256": "dcfc6ee15270773c2ee3a500eeb64624bb522e909c542b12579434ddd92a5054", + "warned": 0 + }, + "krea2": { + "cases": 2, + "refused": 2, + "sha256": "0904c9aa004b3719949705889bde32f304554f8719fcedc6059c78429bae69c9", + "warned": 0 + }, + "qwen_image21": { + "cases": 2, + "refused": 2, + "sha256": "f3287c0718ef989c21261da0f34caf292dcdc640e69dab582644921292b8f254", + "warned": 0 + }, + "qwen_image21 unfused": { + "cases": 2, + "refused": 2, + "sha256": "c7c02f6d329fff1cf045d8f9ef737ea6e6cd20605f6b521b30b313a9bae1aef9", + "warned": 0 + }, + "z_image": { + "cases": 2, + "refused": 2, + "sha256": "fa1b4fc2e11aab553be8fbab9282fda7c330d91483d303690e1b617d22d70462", + "warned": 0 + } + }, + "size": 92436112 + }, + "ostris__sketch_to_image_klein_4b/sketch_to_image_klein_4b.safetensors": { + "maps": { + "flux3_klein": { + "cases": 2, + "refused": 2, + "sha256": "b4330013ed4f84e68caf48ad66295086a3e01a4cbd9b8409d1e0b4a6c7789540", + "warned": 0 + }, + "flux3_klein base": { + "cases": 2, + "refused": 2, + "sha256": "a2263832579dcd9e3f73d21919b200b128b99c3e082ded785f9dd24cda19d9cf", + "warned": 0 + }, + "krea2": { + "cases": 2, + "refused": 2, + "sha256": "4314afe89b8a7d5fe5a8f721331343bff6f0b65dbfd12fde2be10f6b2f4bf444", + "warned": 0 + }, + "qwen_image21": { + "cases": 2, + "refused": 2, + "sha256": "18dd69239a47a594e9cecc724d011135bb74bfef0475e8b53721326cbcfbd7ec", + "warned": 0 + }, + "qwen_image21 unfused": { + "cases": 2, + "refused": 2, + "sha256": "770ec3aaaab43bd335ec13fda2d12f3fd5f611d24e9e4fc581dc62f539cdeea8", + "warned": 0 + }, + "z_image": { + "cases": 2, + "refused": 2, + "sha256": "d5ad6f057ec8a15a257dd9f45e0eb3f0ef033de473ed3b0f37ca01bf68f890ef", + "warned": 0 + } + }, + "size": 92426712 + }, + "ostris__z_image_turbo_childrens_drawings/z_image_turbo_childrens_drawings.safetensors": { + "maps": { + "flux3_klein": { + "cases": 2, + "refused": 2, + "sha256": "d04d3971f853b6335d72835bf482dd5698903e5d25e8a2439da43875b225be43", + "warned": 0 + }, + "flux3_klein base": { + "cases": 2, + "refused": 2, + "sha256": "f2d4a53cbd4c89958091aacd30a8bd71c4c29e076b2df33252d273299e5fa935", + "warned": 0 + }, + "krea2": { + "cases": 2, + "refused": 2, + "sha256": "d484134b689930e1a1dd89ec62904e91fefaeed5c20bdf4192a92d041112bce6", + "warned": 0 + }, + "qwen_image21": { + "cases": 2, + "refused": 2, + "sha256": "2faa109ddb36dc172f8994bfc52521728523fce1637eeb0793617bed21323daf", + "warned": 0 + }, + "qwen_image21 unfused": { + "cases": 2, + "refused": 2, + "sha256": "8e8bb8ef73b13e3e88290785406fa75a54d94a2674ca6317797c9b55fbcd63a5", + "warned": 0 + }, + "z_image": { + "cases": 2, + "refused": 0, + "sha256": "a27736f05f84c94a05058afa4d7088759a990cc47f2fed6a74fd4692a3db3bb4", + "warned": 0 + } + }, + "size": 170128264 + }, + "suayptalha__Z-Image-Turbo-Realism-LoRA/pytorch_lora_weights.safetensors": { + "maps": { + "flux3_klein": { + "cases": 2, + "refused": 2, + "sha256": "8075bc4c858dab04c650b6b14d4859ddfac4dc42178cf7c4a33b8f6ba606a7cd", + "warned": 0 + }, + "flux3_klein base": { + "cases": 2, + "refused": 2, + "sha256": "66cef56c277fb0ff926630f56252a2d2e38d8b90080ada5559bf3b5566e0d5b7", + "warned": 0 + }, + "krea2": { + "cases": 2, + "refused": 2, + "sha256": "7a54fe543382130a53cbf650f62ab1769778a838ec51a783e498be97d7c5efda", + "warned": 0 + }, + "qwen_image21": { + "cases": 2, + "refused": 2, + "sha256": "122850429658c2da29bc871b46b5e35082020aca4cea6c3def86b3276da35c35", + "warned": 0 + }, + "qwen_image21 unfused": { + "cases": 2, + "refused": 2, + "sha256": "92239fd51a6ab4a842427d728441b91d37b0fd539fe8b64af5a278648ac3f571", + "warned": 0 + }, + "z_image": { + "cases": 2, + "refused": 0, + "sha256": "961e8771718bd7344409d5a59b42de57fad913b0750c90800efa5d25cb5f6f8d", + "warned": 0 + } + }, + "size": 85094800 + } + }, + "source": "the spelling and file digests of test_image_lora_rules_unchanged.py, from the reader before LoraKeyMap.comfy_stems", + "spellings": { + "flux3_klein": { + "cases": 14080, + "refused": 3478, + "sha256": "e53e6b35a727fd3e74b38a3c95665876bd71f5b27199abf49d861ceb938a6123", + "warned": 9510 + }, + "flux3_klein base": { + "cases": 14080, + "refused": 3550, + "sha256": "6567e198a5cede421e2e575ed4275e2cd8dfd26a56643470d319a08742d9a391", + "warned": 9446 + }, + "krea2": { + "cases": 12400, + "refused": 2320, + "sha256": "9dfb2ea32797e5a4d311eaffa36cff70889c42bd3f26e212630255021dd27c09", + "warned": 1184 + }, + "qwen_image21": { + "cases": 6720, + "refused": 1968, + "sha256": "bc7c3e65ad7fc41c4f0b73c703deb88bd1fbc93655d638ea39283e9c94ee4a69", + "warned": 0 + }, + "qwen_image21 unfused": { + "cases": 6720, + "refused": 2544, + "sha256": "3348b856d8e8a7595c472f0401593d43f1526d6cee25de5962022bad3de7cc47", + "warned": 0 + }, + "z_image": { + "cases": 13460, + "refused": 6710, + "sha256": "9e8b01ac09abcd445722481a2bdcdaca0379ad17fda87740c09c8df562e236af", + "warned": 556 + } + } +} \ No newline at end of file diff --git a/tests/fixtures/image/manifest.json b/tests/fixtures/image/manifest.json index 7ff3738bf..2d8c547f5 100644 --- a/tests/fixtures/image/manifest.json +++ b/tests/fixtures/image/manifest.json @@ -211,5 +211,13 @@ "file": "vae/diffusion_pytorch_model.safetensors", "size": 168120878, "sha256": "ca70d2202afe6415bdbcb8793ba8cd99fd159cfe6192381504d6c4d3036e0f04" + }, + "flux2_klein_diffusers_names.json": { + "repo": "black-forest-labs/FLUX.2-klein-4B", + "revision": "e7b7dc27f91deacad38e78976d1f2b499d76a294", + "file": "transformer/diffusion_pytorch_model.safetensors", + "size": 7751109744, + "sha256": "9f29f9edcfdae452a653ffb51a534ca4decd389952c225724ff3b94042612a6e", + "sha256_source": "The hub's LFS record of the file whose header the fixture's names and shapes come from. The base 4B file has the same names and shapes." } } diff --git a/tests/image/test_image_flux2_lora_map.py b/tests/image/test_image_flux2_lora_map.py new file mode 100644 index 000000000..787d32b5a --- /dev/null +++ b/tests/image/test_image_flux2_lora_map.py @@ -0,0 +1,555 @@ +"""The FLUX.2 klein LoRA key map and the delta half of acceptance check 7: +every spelling of every target, in the GGUF names and in the diffusers +names, resolves to its leaf or to its band of a fused q, k and v weight, +the placed factors equal a float64 reference per dialect, the final +modulation of the diffusers layout lands with its halves swapped back, +the ComfyUI warning names each spelling that ComfyUI v0.41.1 drops, and +a step of the tiny model under a patch table equals the step on merged +weights. CPU.""" +from __future__ import annotations + +import dataclasses + +import mlx.core as mx +import mlx.nn as nn +import numpy as np +import pytest + +import flux2_gates as fg +from image_fixtures import fixture_view, load_json +from lora_fixtures import (DIALECTS, dialect_keys, make_pair, + reference_delta, rel_l2, write_adapter, + write_keys) +from oracle_fixture import committed_fixture + +from gmlx.image import api, lora +from gmlx.image import fingerprint as fp +from gmlx.image.families.flux2_klein.lora_map import NORM_OUT, lora_map +from gmlx.image.families.flux2_klein.model import Flux2KleinDiT +from gmlx.image.lora import install, plan, reader +from gmlx.image.registry import get_family + +DELTA_TOL = 1e-6 +# The live step against merged fp32 weights on the CPU, relative L2 of +# each row of the step. +STEP_TOL = 2e-5 +HEADERS = ("flux2_klein_4b_q4_k_m.header.json", + "flux2_klein_4b_f16.header.json") +# The tensor names and shapes of Flux2Transformer2DModel, from the header +# of BFL's diffusers transformer file. +DIFFUSERS_NAMES = "flux2_klein_diffusers_names.json" +ADALN = "final_layer.adaLN_modulation.1" +# The GGUF names under the model prefixes that ComfyUI and the diffusers +# loader strip, and under the underscore prefixes of kohya and LyCORIS. +SPELLINGS = { + "comfy": ("diffusion_model.", False, ".lora_A.weight", ".lora_B.weight", + False), + "comfy_model": ("model.diffusion_model.", False, ".lora_down.weight", + ".lora_up.weight", True), + "bare": ("", False, ".lora_A.weight", ".lora_B.weight", False), + "lycoris": ("lycoris_", True, ".lora_down.weight", ".lora_up.weight", + True), + "transformer_kohya": ("lora_transformer_", True, ".lora_down.weight", + ".lora_up.weight", True), +} +TINY = "selftest_flux2_klein_tiny" +NOREFS = "selftest_flux2_klein_tiny_norefs" + + +def tiny_config() -> dict: + _, wm = committed_fixture(TINY + "_weights") + return dict(wm["inputs"]["config"]) + + +def dims_of(cfg: dict) -> dict: + """Module path to (out, in) of every linear leaf of the built + model.""" + return {p: tuple(m.weight.shape) + for p, m in Flux2KleinDiT(cfg).named_modules() + if isinstance(m, nn.Linear)} + + +def swap_halves(a: np.ndarray) -> np.ndarray: + h = a.shape[0] // 2 + return np.concatenate([a[h:], a[:h]], axis=0) + + +def diffusers_targets(km) -> list: + """The diffusers names of the map, one per module or band: every + diffusers name but the spelling of a double block's attn.to_out + without its .0.""" + return sorted(n for n in km.diffusers_only + if not (n.startswith("transformer_blocks.") + and n.endswith(".attn.to_out"))) + + +def target_dims(km, dims: dict, name: str) -> tuple: + """(out, in) of the pair a target takes: its band's rows, or the + module's.""" + module, band = km.targets[name] + out, inp = dims[module] + return (band[2] if band else out, inp) + + +def comfy_reads(prefix: str, name: str, km) -> bool: + """Whether ComfyUI v0.41.1 loads the stem of target ``name`` under + ``prefix``, by the table below.""" + if name.endswith(".linear1_qkv"): + return prefix == "diffusion_model." + if name in km.diffusers_only: + return (prefix in COMFY_DIFFUSERS and not name.endswith(NOT_IN_TABLE) + and not (name.startswith("transformer_blocks.") + and name.endswith(".attn.to_out"))) + return prefix in COMFY_GGUF + + +# What ComfyUI v0.41.1 loads of a FLUX.2 klein adapter, from the key map +# of comfy.lora.model_lora_keys_unet on a weightless FLUX.2 klein 4B +# model built from the header fixture: the GGUF names under two +# prefixes, the q, k and v rows of linear1 under diffusion_model., and +# the diffusers names of its FLUX table under four prefixes. The table +# has no name for the three modulations or the time embedder of FLUX.2, +# and none for a double block's attn.to_out without its .0. +COMFY_GGUF = ("diffusion_model.", "lora_unet_") +COMFY_DIFFUSERS = ("transformer.", "", "lycoris_", "lora_transformer_") +NOT_IN_TABLE = ("_modulation_img.linear", "_modulation_txt.linear", + "single_stream_modulation.linear", + "timestep_embedder.linear_1", "timestep_embedder.linear_2") + + +def test_the_key_map_covers_every_linear_leaf_and_only_those(): + cfg = tiny_config() + km = lora_map(cfg) + dims = dims_of(cfg) + dim = cfg["num_attention_heads"] * cfg["attention_head_dim"] + assert km.family == "flux2_klein" and km.title == "FLUX.2 klein" + assert {m for m, _ in km.targets.values()} == set(dims) + for path in dims: + assert km.targets[path] == (path, None) + # 8 leaves in a double block, 2 in a single one and 9 outside. + assert len(dims) == (8 * cfg["num_layers"] + + 2 * cfg["num_single_layers"] + 9) + for i in range(cfg["num_layers"]): + x, d = f"double_blocks.{i}", f"transformer_blocks.{i}.attn" + for j, (q, k, v) in enumerate([("to_q", "to_k", "to_v"), + ("add_q_proj", "add_k_proj", + "add_v_proj")]): + qkv = f"{x}.{('img_attn', 'txt_attn')[j]}.qkv" + for band, n in enumerate((q, k, v)): + assert km.targets[f"{d}.{n}"] == (qkv, (0, band * dim, dim)) + assert km.targets[f"{d}.to_out.0"] == km.targets[f"{d}.to_out"] == ( + f"{x}.img_attn.proj", None) + for i in range(cfg["num_single_layers"]): + assert km.targets[f"single_blocks.{i}.linear1_qkv"] == ( + f"single_blocks.{i}.linear1", (0, 0, 3 * dim)) + whole = [n for n in diffusers_targets(km) if km.targets[n][1] is None] + assert sorted(km.targets[n][0] for n in whole) == sorted( + p for p in dims if not p.endswith(".qkv")) + assert km.swapped == frozenset({NORM_OUT}) + assert km.targets[NORM_OUT] == (ADALN, None) + assert km.absent == {} and km.comfy_prefixes == () + assert km.text_names == () and km.text_targets == () + built = dataclasses.asdict(Flux2KleinDiT(cfg).cfg) + assert lora_map(built) == km + assert get_family("flux2_klein").lora_map(cfg) == km + assert len({n.replace(".", "_") for n in km.targets}) == len(km.targets) + + +@pytest.mark.parametrize("name", HEADERS) +def test_the_key_map_names_every_linear_weight_of_the_real_header(name): + ident = fp.identify(fixture_view(name)) + km = lora_map(ident.config) + assert ident.family.name == "flux2_klein" + linear = {n[:-len(".weight")] for n, t in ident.view.tensors.items() + if n.endswith(".weight") and len(t.shape) == 2} + assert linear == {m for m, _ in km.targets.values()} + assert len(linear) == 8 * 5 + 2 * 20 + 9 + assert km.targets["transformer_blocks.4.attn.add_v_proj"] == ( + "double_blocks.4.txt_attn.qkv", (0, 6144, 3072)) + assert km.targets["single_blocks.19.linear1_qkv"] == ( + "single_blocks.19.linear1", (0, 0, 9216)) + assert "double_blocks.5.img_attn.qkv" not in km.targets + assert "single_transformer_blocks.20.attn.to_out" not in km.targets + + +def test_the_key_map_names_every_linear_weight_of_the_diffusers_model(): + """Every weight of Flux2Transformer2DModel that is a matrix, which is + every one but the q and k norms, names a target of its shape: a band + of a fused q, k and v weight for the split projections, else the + module of the same weight, one per module of the GGUF.""" + fx = load_json(DIFFUSERS_NAMES) + names, shapes = fx["names"], fx["shapes"] + assert len(names) == 169 and fx["class"] == "Flux2Transformer2DModel" + ident = fp.identify(fixture_view(HEADERS[0])) + km = lora_map(ident.config) + norms = [n for n in names if ".norm_" in n] + linear = [n[:-len(".weight")] for n in names if n not in norms] + assert len(norms) == 4 * 5 + 2 * 20 + assert sorted(linear) == diffusers_targets(km) + gguf = {n[:-len(".weight")]: tuple(reversed(t.shape)) + for n, t in ident.view.tensors.items() + if n.endswith(".weight") and len(t.shape) == 2} + placed = {} + for n in linear: + module, band = km.targets[n] + out, inp = gguf[module] + assert tuple(shapes[n + ".weight"]) == ( + band[2] if band else out, inp), n + placed.setdefault(module, []).append(band) + assert set(placed) == set(gguf) + for module, bands in placed.items(): + assert bands == [None] or sorted(b[1] for b in bands) == [ + 0, 3072, 6144], module + + +def _stem(row: tuple, target: str) -> str: + prefix, under, _, _, _ = row + return prefix + (target.replace(".", "_") if under else target) + + +SPELLED = [*(f"{d} diffusers" for d in sorted(DIALECTS)), + *(f"{d} gguf" for d in sorted(DIALECTS)), + *(f"{s} {n}" for s in sorted(SPELLINGS) + for n in ("gguf", "diffusers"))] + + +@pytest.mark.parametrize("case", SPELLED) +def test_every_spelling_of_every_target_resolves(tmp_path, case): + """One pair on every linear layer, in the diffusers names with a band + for each split projection or in the GGUF names, as each dialect spells + them, lands on its leaf and band. The pair on the diffusers final + modulation lands with its up halves swapped. The warning counts the + stems that ComfyUI drops.""" + dialect, names = case.split(" ") + row = DIALECTS.get(dialect) or SPELLINGS[dialect] + cfg = tiny_config() + km, dims = lora_map(cfg), dims_of(cfg) + rng = np.random.default_rng(4) + targets = diffusers_targets(km) if names == "diffusers" else sorted(dims) + named = {t: make_pair(rng, *target_dims(km, dims, t), 2, + 4.0 if row[4] else None) for t in targets} + _, _, down_s, up_s, _ = row + keys = {} + for target, (down, up, alpha) in named.items(): + stem = _stem(row, target) + keys[stem + down_s], keys[stem + up_s] = down, up + if alpha is not None: + keys[stem + ".alpha"] = np.asarray(alpha, np.float32) + if dialect in DIALECTS: + assert keys.keys() == dialect_keys(dialect, named).keys() + res = reader.resolve(reader.read_lora( + write_keys(tmp_path / "all.safetensors", keys)), km) + assert res.text == () and res.unmatched == () + dropped = sum(not comfy_reads(row[0], t, km) for t in targets) + if dropped: + assert len(res.warnings) == 1, res.warnings + assert "ComfyUI drops them" in res.warnings[0] + assert f": {dropped} keys " in res.warnings[0] + else: + assert res.warnings == () + assert len(res.dit) == len(targets) + by_stem = {_stem(row, t): t for t in targets} + for t in res.dit: + target = by_stem[t.pair.stem] + down, up, alpha = named[target] + assert (t.module, t.band) == km.targets[target] + want = swap_halves(up) if target == NORM_OUT else up + assert np.array_equal(np.array(t.pair.down), down) + assert np.array_equal(np.array(t.pair.up), want) + assert t.pair.alpha == alpha + + +# Four targets by GGUF name and by diffusers name. The stem of each under +# each prefix is loaded by ComfyUI v0.41.1 or not as COMFY_LOADS says. +COMFY_TARGETS = { + "norm_out": (ADALN, NORM_OUT), + "q band": ("double_blocks.1.img_attn.qkv", + "transformer_blocks.1.attn.to_q"), + "text v band": ("double_blocks.0.txt_attn.qkv", + "transformer_blocks.0.attn.add_v_proj"), + "linear1": ("single_blocks.1.linear1", + "single_transformer_blocks.1.attn.to_qkv_mlp_proj"), + "modulation": ("double_stream_modulation_txt.lin", + "double_stream_modulation_txt.linear"), + "time": ("time_in.out_layer", + "time_guidance_embed.timestep_embedder.linear_2"), +} +PREFIXES = ("lora_unet_", "lycoris_", "lora_transformer_", + "diffusion_model.", "model.diffusion_model.", "transformer.", + "", "unet.", "base_model.model.") + + +def _loads(prefix: str, which: str, label: str) -> bool: + if which == "gguf": + return prefix in COMFY_GGUF + return prefix in COMFY_DIFFUSERS and label not in ("modulation", "time") + + +def test_the_comfyui_warning_names_every_spelling_comfyui_drops(): + km = lora_map(fp.identify(fixture_view(HEADERS[0])).config) + zeros = reader.RawPair("", mx.zeros((1, 4)), mx.zeros((4, 1)), None) + seen = 0 + for label, names in COMFY_TARGETS.items(): + for which, name in zip(("gguf", "diffusers"), names): + for prefix in PREFIXES: + stem = prefix + (name.replace(".", "_") + if prefix.endswith("_") else name) + raw = reader.RawLora( + "a.safetensors", + {stem: dataclasses.replace(zeros, stem=stem)}, {}) + res = reader.resolve(raw, km) + assert [(t.module, t.band) for t in res.dit] == [ + km.targets[name]], stem + warned = [w for w in res.warnings if "ComfyUI drops them" + in w] + loads = _loads(prefix, which, label) + assert len(warned) == (0 if loads else 1), stem + assert loads == comfy_reads(prefix, name, km), stem + if warned: + assert stem in warned[0] + assert "ComfyUI reads the GGUF names under " \ + "diffusion_model. or lora_unet_" in warned[0] + seen += 1 + assert seen == len(COMFY_TARGETS) * 2 * len(PREFIXES) + for prefix, loads in (("diffusion_model.", True), ("lora_unet_", False), + ("", False)): + stem = prefix + ("single_blocks_0_linear1_qkv" if prefix.endswith( + "_") else "single_blocks.0.linear1_qkv") + res = reader.resolve(reader.RawLora( + "a.safetensors", {stem: dataclasses.replace(zeros, stem=stem)}, + {}), km) + assert [(t.module, t.band) for t in res.dit] == [ + ("single_blocks.0.linear1", (0, 0, 9216))] + assert bool(res.warnings) == (not loads), stem + + +def _adapter(km, dims: dict, seed: int, alpha, targets) -> dict: + """Pairs on ``targets`` at ranks 2 to 4.""" + rng = np.random.default_rng(seed) + return {t: make_pair(rng, *target_dims(km, dims, t), 2 + i % 3, alpha) + for i, t in enumerate(targets)} + + +def _placed(km, dims: dict, stack) -> tuple[dict, dict]: + """The placed delta of each module of the (path, pairs, strength) + rows of ``stack``, and its float64 reference in the GGUF's order: a + band's rows of its module, and the diffusers final modulation's + halves turned back.""" + got: dict = {} + want: dict = {} + for path, pairs, strength in stack: + res = reader.resolve(reader.read_lora(str(path)), km) + for t in res.dit: + got.setdefault(t.module, []).append(plan.Part( + t.pair.down, t.pair.up, t.pair.alpha, t.band, strength)) + for target, (down, up, alpha) in pairs.items(): + module, band = km.targets[target] + ref = reference_delta([(down, up, alpha, band, strength)], + dims[module]) + if target == NORM_OUT: + ref = swap_halves(ref) + want[module] = want.get(module, 0) + ref + placed = {} + for module, parts in got.items(): + lm = plan.block_diagonal(module, parts, dims[module]) + placed[module] = (np.array(lm.b, np.float64) + @ np.array(lm.a, np.float64)) + return placed, want + + +@pytest.mark.parametrize("names", ["diffusers", "gguf"]) +@pytest.mark.parametrize("dialect", sorted(DIALECTS)) +def test_check7_delta_half_per_dialect(tmp_path, dialect, names): + """Strengths 0.5 and 1.0 and a stacked pair with a negative strength, + against float64, over the whole weight and over each third of every + fused q, k and v weight. A dialect that stores no alpha takes the + factor 1.0. Every q, k and v band and the final modulation take a pair + of both adapters.""" + cfg = tiny_config() + km, dims = lora_map(cfg), dims_of(cfg) + dim = cfg["num_attention_heads"] * cfg["attention_head_dim"] + has_alpha = DIALECTS[dialect][4] + targets = diffusers_targets(km) if names == "diffusers" else sorted(dims) + both = {t for t in targets if km.targets[t][0].endswith(".qkv")} | { + NORM_OUT if names == "diffusers" else ADALN} + one = _adapter(km, dims, 1, 3.0 if has_alpha else None, + sorted(set(targets[::2]) | both)) + two = _adapter(km, dims, 2, 1.0 if has_alpha else None, + sorted(set(targets[::3]) | both)) + p1 = write_adapter(tmp_path / "one.safetensors", dialect, one) + p2 = write_adapter(tmp_path / "two.safetensors", dialect, two) + cases = [([(p1, one, 0.5)], "0.5"), ([(p1, one, 1.0)], "1.0"), + ([(p1, one, 0.75), (p2, two, -0.4)], "stacked")] + worst = 0.0 + for stack, label in cases: + placed, want = _placed(km, dims, stack) + assert set(placed) == set(want), label + for module, delta in placed.items(): + ref = want[module] + errs = [rel_l2(delta, ref)] + if module.endswith(".qkv"): + errs += [rel_l2(delta[i * dim:(i + 1) * dim], + ref[i * dim:(i + 1) * dim]) + for i in range(3)] + worst = max(worst, *errs) + assert max(errs) <= DELTA_TOL, (dialect, label, module, errs) + print(f"flux2 check7 delta {dialect} {names}: worst relative L2 " + f"{worst:.3e}") + + +def test_the_diffusers_final_modulation_is_swapped_back(tmp_path): + """A pair on norm_out.linear that moves only its first half of rows, + the scale rows in diffusers, moves only the scale rows of the GGUF's + adaLN_modulation.1, its second half. The weight it gives is the one + the diffusers loader gives its own model, turned back by the + converter's swap. Without the swap it misses the delta gate.""" + cfg = tiny_config() + km, dims = lora_map(cfg), dims_of(cfg) + out, inp = dims[ADALN] + h = out // 2 + rng = np.random.default_rng(9) + w = rng.standard_normal((out, inp)) + down, up, _ = make_pair(rng, out, inp, 4) + up[h:] = 0 + path = write_adapter(tmp_path / "n.safetensors", "diffusers", + {NORM_OUT: (down, up, None)}) + + def merged(keymap): + res = reader.resolve(reader.read_lora(path), keymap) + (t,) = res.dit + lm = plan.block_diagonal(t.module, [plan.Part( + t.pair.down, t.pair.up, t.pair.alpha, t.band, 1.0)], (out, inp)) + return w + np.array(lm.b, np.float64) @ np.array(lm.a, np.float64) + + # The diffusers side: its converter's weight, the PEFT delta of the + # pair on it, and the converter's swap back. + diffusers = swap_halves(swap_halves(w) + up.astype(np.float64) + @ down.astype(np.float64)) + got = merged(km) + assert rel_l2(got - w, diffusers - w) <= DELTA_TOL + assert np.array_equal(got[:h], w[:h]) and not np.allclose(got[h:], + w[h:]) + unswapped = dataclasses.replace(km, swapped=frozenset()) + assert rel_l2(merged(unswapped) - w, diffusers - w) > 1.0 + + +def _tiny_pipe(merged=None) -> api.ImagePipeline: + """The tiny DiT in fp32, with (module, delta) rows added to its + weights in float64 for ``merged``.""" + weights, _ = committed_fixture(TINY + "_weights") + weights = dict(weights) + for module, delta in (merged or {}).items(): + key = f"{module}.weight" + weights[key] = (np.asarray(weights[key], np.float64) + + delta).astype(np.float32) + model = fg.tiny_model(weights, tiny_config()) + return api.ImagePipeline(dit=model, family=get_family("flux2_klein"), + variant="distilled") + + +def _request(pipe, arrays: dict, tid) -> np.ndarray: + refs = tuple(mx.array(arrays[f"refs.{i}"])[0] + for i in range(fg.n_refs(arrays))) + # A key, so that the pipeline keeps the caption rows. + cond = api.Conditioning(mx.array(arrays["features"]), "tiny", + ref_latents=refs) + return np.array(api.denoise_step( + pipe, mx.array(arrays["latents"]), float(arrays["sigma"]), cond, + patch_table=tid)) + + +@pytest.mark.parametrize("name", [TINY, NOREFS]) +def test_a_step_under_a_table_equals_the_step_on_merged_weights(tmp_path, + name): + """A stacked pair of adapters over every linear leaf, one in the + diffusers names with the split projections and one in the GGUF names, + applied live on the tiny model: every row of the step and the + velocity, with two reference images and with text alone, and the + request path, whose time vectors, modulations and caption rows a + pipeline keeps per table.""" + arrays, _ = committed_fixture(name) + cfg = tiny_config() + km, dims = lora_map(cfg), dims_of(cfg) + one = _adapter(km, dims, 11, 2.0, diffusers_targets(km)) + two = _adapter(km, dims, 12, None, sorted(dims)[1::2]) + pipe = _tiny_pipe() + rows, stack = [], [] + for i, (pairs, strength, dialect) in enumerate( + [(one, 0.6, "kohya"), (two, -0.3, "diffusers")]): + path = write_adapter(tmp_path / f"a{i}.safetensors", dialect, pairs) + rows.append((lora.load_adapter(pipe, path), strength)) + stack.append((path, pairs, strength)) + _, want = _placed(km, dims, stack) + tid = api.define_patch_table(pipe, lora.table_entries(rows)) + merged = _tiny_pipe(want) + with mx.stream(mx.cpu): + prev = install.activate(pipe, tid) + try: + got = fg.free_rows(pipe.dit, arrays) + finally: + install.restore(pipe, prev) + ref = fg.free_rows(merged.dit, arrays) + base = fg.free_rows(pipe.dit, arrays) + # The base step first, so a memo that ignored the table would + # serve the base rows to the next. + first = _request(pipe, arrays, None) + live = _request(pipe, arrays, tid) + again = _request(pipe, arrays, None) + whole = _request(merged, arrays, None) + assert got.keys() == ref.keys() + errs = {k: fg.rel(got[k], ref[k]) for k in ref} + errs["request velocity"] = fg.rel(live, whole) + moved = fg.rel(base["velocity"], ref["velocity"]) + top = max(errs, key=errs.get) + print(f"flux2 check7 tiny {name}: {len(errs)} rows, worst " + f"{errs[top]:.2e} at {top}; the adapter moves the velocity " + f"{moved:.2e}") + assert errs[top] <= STEP_TOL, (top, errs[top]) + assert moved > 100 * STEP_TOL + assert np.array_equal(first, again) + assert fg.rel(first, base["velocity"]) <= STEP_TOL + + +def test_a_key_that_names_no_module_is_refused(tmp_path): + """A block past the last, a norm scale in both layouts, a layer that + FLUX.3 klein has, and a FLUX.1 diffusers name that ComfyUI's table + also holds.""" + cfg = tiny_config() + km = lora_map(cfg) + rng = np.random.default_rng(5) + good = {"single_blocks.0.linear2": make_pair(rng, 64, 256, 2)} + for i, name in enumerate(("single_blocks.2.linear1", + "transformer_blocks.2.attn.to_q", + "double_blocks.0.img_attn.norm.query_norm", + "transformer_blocks.0.attn.norm_q", + "single_blocks.0.mlp_in", + "transformer_blocks.0.ff.net.0.proj")): + mixed = {**good, name: make_pair(rng, 64, 64, 2)} + path = write_adapter(tmp_path / f"s{i}.safetensors", "diffusers", + mixed) + with pytest.raises(reader.UnmatchedKeysError, + match="1 of 2 targets name no FLUX.2 klein " + "module"): + reader.resolve(reader.read_lora(path), km) + + +def test_a_split_projection_and_its_fused_weight_both_apply(tmp_path): + """A pair on to_q is the first band of img_attn.qkv and a pair on the + whole qkv is the whole weight, so a file with both applies both, and + two spellings of one band are refused.""" + cfg = tiny_config() + km, dims = lora_map(cfg), dims_of(cfg) + rng = np.random.default_rng(6) + pairs = _adapter(km, dims, 7, None, ["transformer_blocks.0.attn.to_q", + "double_blocks.0.img_attn.qkv"]) + path = write_adapter(tmp_path / "b.safetensors", "diffusers", pairs) + placed, want = _placed(km, dims, [(path, pairs, 1.0)]) + qkv = "double_blocks.0.img_attn.qkv" + assert rel_l2(placed[qkv], want[qkv]) <= DELTA_TOL + keys = {**dialect_keys("diffusers", pairs), + **dialect_keys("kohya", {"transformer_blocks.0.attn.to_q": + make_pair(rng, 64, 64, 2, 2.0)})} + with pytest.raises(reader.AdapterError, match="both target " + "double_blocks.0.img_attn.qkv band"): + reader.resolve(reader.read_lora( + write_keys(tmp_path / "two.safetensors", keys)), km) diff --git a/tests/image/test_image_lora_rules_unchanged.py b/tests/image/test_image_lora_rules_unchanged.py new file mode 100644 index 000000000..019561498 --- /dev/null +++ b/tests/image/test_image_lora_rules_unchanged.py @@ -0,0 +1,165 @@ +"""The reader's ComfyUI rules for the families whose maps set no +``comfy_stems``: every spelling of every target and every other layout's +name of each map under every prefix the reader strips, resolved on its +own, and every LoRA file under GMLX_TEST_LORA_DIR resolved under every +map, give the targets, refusals and warnings that the reader gave before +``comfy_stems`` existed. lora_rules_digest.json records the sha256 of +those results, written from the reader of the commit before the field. +The spellings run on the CPU; the files half skips without the +directory.""" +from __future__ import annotations + +import dataclasses +import hashlib +import json +import os +from pathlib import Path + +import pytest + +from image_fixtures import fixture_view, load_json + +DIGEST = "lora_rules_digest.json" +ENV = "GMLX_TEST_LORA_DIR" +# Each family's map on the config of a header fixture, and Qwen-Image's +# on the layout that stores its MLP pair apart too. +MAPS = {"z_image": ("z_image_turbo_q4_k_m.header.json", {}), + "qwen_image21": ("qwen_image21_q4_k_m.header.json", {}), + "qwen_image21 unfused": ("qwen_image21_q4_k_m.header.json", + {"mlp_layout": "unfused"}), + "krea2": ("krea2_turbo_q4_k_m.header.json", {}), + "flux3_klein": ("flux3_klein_q4_k_m.header.json", {}), + "flux3_klein base": ("flux3_klein_base_q4_k_m.header.json", {})} +PREFIXES = ("lora_unet_", "lycoris_", "lora_transformer_", + "diffusion_model.", "model.diffusion_model.", "transformer.", + "", "unet.", "base_model.model.", "text_encoders.") + + +def keymaps() -> dict: + from gmlx.image import fingerprint as fp + + out = {} + for label, (header, over) in MAPS.items(): + ident = fp.identify(fixture_view(header)) + out[label] = ident.family.lora_map(dict(ident.config, **over)) + return out + + +def _outcome(fn, path: str, name: str) -> list: + """The targets and warnings of ``fn()``, or the refusal, with the + file's path as ``name``.""" + from gmlx.image.lora import reader + + try: + res = fn() + except reader.AdapterError as e: + return ["refused", type(e).__name__, str(e).replace(path, name)] + rows = sorted([t.module, list(t.band) if t.band else None, t.pair.stem, + t.pair.rank, t.pair.alpha] for t in res.dit + res.text) + return [rows, [w.replace(path, name) for w in res.warnings], + sorted(res.unmatched)] + + +def _digest(cases: list) -> dict: + h = hashlib.sha256() + for case in cases: + h.update(json.dumps(case, sort_keys=True).encode() + b"\n") + return {"cases": len(cases), "sha256": h.hexdigest(), + "refused": sum(c[1][0] == "refused" for c in cases), + "warned": sum(c[1][0] != "refused" and bool(c[1][1]) + for c in cases)} + + +def spelling_digests() -> dict: + """For each map: every stem of its targets, its other layouts' names + and the first targets of every other map, under every prefix, as one + pair on its own.""" + import mlx.core as mx + + from gmlx.image.lora import reader + + maps = keymaps() + zeros = reader.RawPair("", mx.zeros((1, 4)), mx.zeros((4, 1)), None) + out = {} + for label, km in maps.items(): + names = sorted({*km.targets, *km.absent, *km.text_targets, + *(n for other in maps.values() + for n in sorted(other.targets)[:24])}) + cases = [] + for name in names: + for prefix in PREFIXES: + stem = prefix + (name.replace(".", "_") + if prefix.endswith("_") else name) + raw = reader.RawLora("a.safetensors", { + stem: dataclasses.replace(zeros, stem=stem)}, {}) + for allow in (False, True): + cases.append([stem, _outcome( + lambda: reader.resolve(raw, km, + allow_unmatched=allow), + "a.safetensors", "a.safetensors"), allow]) + out[label] = _digest(cases) + return out + + +def lora_files(root) -> list: + return sorted(p for p in Path(root).expanduser().rglob("*.safetensors") + if p.is_file()) + + +def file_digests(root) -> dict: + """For each file under ``root``, by its path there, and each map: the + file resolved with the reader's defaults and with unmatched keys + allowed.""" + from gmlx.image.lora import reader + + maps = keymaps() + root = Path(root).expanduser() + out = {} + for p in lora_files(root): + path, name = str(p), str(p.relative_to(root)) + try: + raw = reader.read_lora(path, allow_unmatched=True) + except reader.AdapterError as e: + out[name] = {"size": p.stat().st_size, + "read": str(e).replace(path, name)} + continue + out[name] = { + "size": p.stat().st_size, + "maps": {label: _digest([[label, _outcome( + lambda: reader.resolve(raw, km, allow_unmatched=allow), + path, name), allow] for allow in (False, True)]) + for label, km in maps.items()}} + return out + + +def test_no_older_map_sets_comfy_stems(): + for label, km in keymaps().items(): + assert km.comfy_stems is None and km.comfy_reads == "", label + + +def test_every_spelling_resolves_as_before(): + want = load_json(DIGEST)["spellings"] + got = spelling_digests() + assert set(got) == set(want) + for label in want: + assert got[label] == want[label], label + maps = keymaps() + assert all(got[label]["warned"] for label, km in maps.items() + if km.comfy_prefixes) + + +def test_every_lora_file_resolves_as_before(): + root = os.environ.get(ENV) + if not root: + pytest.skip(f"set {ENV} to the directory of the community LoRA " + "files") + want = load_json(DIGEST)["files"] + got = file_digests(root) + seen = [n for n in got if n in want and got[n].get("size") == + want[n].get("size")] + if not seen: + pytest.skip(f"none of the recorded files is under {ENV}") + for name in seen: + assert got[name] == want[name], name + print(f"lora rules: {len(seen)} files under every older map as " + f"before: {', '.join(seen)}") From 55e6a2b938197693e906970a3033ed64ea494a90 Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 09:32:19 -0700 Subject: [PATCH 019/101] feat(image): lora files with a rank-stabilized peft header load, scaled as peft scales them --- CHANGELOG.md | 3 + docs/cli.md | 13 +- gmlx/image/lora/reader.py | 96 +- .../flux2_klein_pixel_art_lora.header.json | 1385 +++++++++++++++++ tests/fixtures/image/lora_rules_digest.json | 375 ++++- tests/fixtures/image/manifest.json | 9 + tests/image/test_image_flux2_lora_map.py | 51 + tests/image/test_image_lora_map.py | 2 +- tests/image/test_image_lora_reader.py | 72 +- .../image/test_image_lora_rules_unchanged.py | 122 +- tests/image/test_image_qwen_lora_map.py | 2 +- 11 files changed, 2029 insertions(+), 101 deletions(-) create mode 100644 tests/fixtures/image/flux2_klein_pixel_art_lora.header.json diff --git a/CHANGELOG.md b/CHANGELOG.md index d76a94017..75b440128 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,9 @@ adhere to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Muse Spark (GGUF arch `muse-spark`), with reasoning effort intents, tool calls and image and audio input through its `--mmproj` companion. +- An image LoRA whose PEFT header sets `use_rslora` loads, scaled as PEFT + scales it, where it was refused. + ### Changed - A speculative batch wider than the drafter's width cap keeps speculating on diff --git a/docs/cli.md b/docs/cli.md index 57ca0cad6..1d6605753 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -1001,11 +1001,14 @@ references by this rule, and `--ref-size` exits 2 on it. `--adapter` applies a LoRA safetensors file to the DiT, live beside the quantized weights, so the file is read once and nothing is merged. The -kohya, diffusers, PEFT and OneTrainer key spellings are read. The strength -follows the path after a colon and defaults to 1, and it may be negative. -Repeat the flag to stack adapters, whose deltas add. A LoHa, LoKr, DoRA, -full-weight or Tucker LoCon file is refused by name from its header, before -any model loads. So is a file for another model family or one with keys +kohya, diffusers, PEFT and OneTrainer key spellings are read. The rank and +alpha in a diffusers file's PEFT header scale each pair as the diffusers +loader scales it, rank-stabilized LoRA included. ComfyUI does not read that +header, so such a file runs at another strength there, and gmlx warns of +it. The strength follows the path after a colon and defaults to 1, and it +may be negative. Repeat the flag to stack adapters, whose deltas add. A +LoHa, LoKr, DoRA, full-weight or Tucker LoCon file is refused by name from +its header, before any model loads. So is a file for another model family or one with keys that match no module of the DiT, which its GGUF header names. An adapter's text encoder pairs are applied to the text encoder at the same strength. diff --git a/gmlx/image/lora/reader.py b/gmlx/image/lora/reader.py index 90fca63ac..0194b698a 100644 --- a/gmlx/image/lora/reader.py +++ b/gmlx/image/lora/reader.py @@ -16,8 +16,9 @@ diffusers' ``save_lora_weights`` wrote has no alpha tensors: its header holds the PEFT config of each component under ``lora_adapter_metadata``, and ``header_configs`` reads the rank and the alpha of every pair from it. -A config field that would change the delta in another way is refused by -name. An alpha that is not finite and a factor with a value that is not +A rank-stabilized config scales a pair by its alpha over the square root +of its rank, as PEFT does. A config field that would change the delta in +another way is refused by name. An alpha that is not finite and a factor with a value that is not finite are refused at the read. """ @@ -112,7 +113,7 @@ def __init__(self, message: str, keys: tuple): # Config fields that give the rank and the alpha of a pair and the # modules that have one. _HEADER_READ = frozenset({"r", "lora_alpha", "rank_pattern", "alpha_pattern", - "target_modules", "exclude_modules"}) + "target_modules", "exclude_modules", "use_rslora"}) # Config fields that leave the delta of a stored pair as it is: settings # of training and of initialization, and labels. _HEADER_INERT = frozenset({ @@ -125,7 +126,6 @@ def __init__(self, message: str, keys: tuple): # the refusal names. _HEADER_REFUSED = { "use_dora": "DoRA", - "use_rslora": "rank-stabilized LoRA", "lora_bias": "LoRA with a bias", "bias": "LoRA with trained base biases", "use_qalora": "QALoRA", @@ -284,13 +284,16 @@ def _first(rows: tuple, name: str, default): class HeaderConfig: """The LoRA config of one component from a file's header: the rank and the alpha of its pairs, the patterns that give some modules - another rank or alpha, and the modules that it names.""" + another rank or alpha, the modules that it names, and whether its + pairs are rank-stabilized, scaled by the alpha over the square root + of the rank.""" rank: int alpha: float rank_pattern: tuple = () alpha_pattern: tuple = () targets: object = None excluded: object = None + rslora: bool = False def of(self, name: str) -> tuple[int, float]: """(rank, alpha) of the module ``name``: those of the first @@ -333,6 +336,10 @@ def _header_config(path: str, comp: str, fields: dict) -> HeaderConfig: f"{where}: {comp}.target_modules") if targets is None: raise AdapterError(f"{where} gives no {comp}.target_modules") + rslora = fields.get("use_rslora") or False + if rslora is not False and rslora is not True: + raise AdapterError(f"{where} gives {comp}.use_rslora as {rslora!r}, " + "which is neither true nor false") return HeaderConfig( rank=int(rank), alpha=float(alpha), rank_pattern=tuple((p, int(v)) for p, v in _patterns( @@ -342,7 +349,8 @@ def _header_config(path: str, comp: str, fields: dict) -> HeaderConfig: f"{where}: {comp}.alpha_pattern", _number), targets=targets, excluded=_selector(fields.get("exclude_modules"), - f"{where}: {comp}.exclude_modules")) + f"{where}: {comp}.exclude_modules"), + rslora=rslora) def header_configs(metadata: Mapping | None, @@ -354,12 +362,13 @@ def header_configs(metadata: Mapping | None, The diffusers loader passes the fields of a component to PEFT's ``LoraConfig`` in place of what it reads from the tensors. Of those fields gmlx applies ``r``, ``lora_alpha``, ``rank_pattern`` and - ``alpha_pattern``, which scale a pair by its alpha over its rank, and + ``alpha_pattern``, which scale a pair by its alpha over its rank, or + over the square root of its rank when ``use_rslora`` is set, and holds every pair to ``target_modules`` and ``exclude_modules``. A field that changes the delta in another way and is set raises - ``UnsupportedAdapterError`` by its name: ``use_rslora``, - ``use_dora``, ``lora_bias``, ``bias``, ``fan_in_fan_out`` and the - others of ``_HEADER_REFUSED``. So does a field gmlx does not know, + ``UnsupportedAdapterError`` by its name: ``use_dora``, + ``lora_bias``, ``bias``, ``fan_in_fan_out`` and the others of + ``_HEADER_REFUSED``. So does a field gmlx does not know, when it is set. An entry gmlx cannot read raises ``AdapterError``.""" raw = (metadata or {}).get(HEADER_ENTRY) if not raw: @@ -406,29 +415,41 @@ def _header_covers(path: str, configs: Mapping, comp: str, name: str, def _under_header(path: str, configs: Mapping, comp: str, name: str, - pair: RawPair) -> tuple[RawPair, bool]: + pair: RawPair) -> tuple[RawPair, bool, float | None]: """``pair`` with the alpha that the header gives the module ``name`` - of component ``comp``, and whether that alpha is not the pair's rank. - A pair without an alpha tensor takes the header's. Raises - ``AdapterError`` for a pair whose rank is not the header's, and for - an alpha tensor that is not the header's alpha in the tensor's - dtype.""" + of component ``comp``, whether its scale is not the one ComfyUI gives + it, which reads no header, and for a rank-stabilized config the + factor of the one over the other. A pair without an alpha tensor + takes the header's. A rank-stabilized pair is scaled by the alpha + over the square root of its rank, and carries the alpha times that + root. Raises ``AdapterError`` for a pair whose rank is not the + header's, and for an alpha tensor that is not the header's alpha in + the tensor's dtype.""" cfg = _header_covers(path, configs, comp, name, pair.stem) if cfg is None: - return pair, False + return pair, False, None rank, alpha = cfg.of(name) if rank != pair.rank: raise AdapterError( f"{path}: {pair.stem} has rank {pair.rank}, and the adapter " f"header gives {name} the rank {rank}") - if pair.alpha is None: - return replace(pair, alpha=alpha), alpha != rank - same = mx.array(alpha, pair.alpha_dtype or mx.float32).astype(mx.float32) - if float(same.item()) != pair.alpha: - raise AdapterError( - f"{path}: {pair.stem} has an alpha tensor of {pair.alpha:g}, " - f"and the adapter header gives {name} the alpha {alpha:g}") - return pair, False + if pair.alpha is not None: + same = mx.array(alpha, pair.alpha_dtype or mx.float32).astype( + mx.float32) + if float(same.item()) != pair.alpha: + raise AdapterError( + f"{path}: {pair.stem} has an alpha tensor of " + f"{pair.alpha:g}, and the adapter header gives {name} the " + f"alpha {alpha:g}") + if not cfg.rslora: + if pair.alpha is None: + return replace(pair, alpha=alpha), alpha != rank, None + return pair, False, None + ours = alpha / math.sqrt(rank) + comfy = 1.0 if pair.alpha is None else pair.alpha / rank + moved = ours != comfy + factor = (ours / comfy if comfy else math.inf) if moved else None + return replace(pair, alpha=alpha * math.sqrt(rank)), moved, factor # The key part PEFT writes two places before the end, as @@ -798,6 +819,14 @@ def is_text_stem(stem: str) -> bool: return stem.startswith(TEXT_DOTTED + TEXT_UNDERSCORE) +def _factors(values: list) -> str: + """The distinct factors of ``values``, the first few, for a warning.""" + got = sorted(set(values)) + shown = [f"{v:.4g}" for v in got[:_LISTED]] + more = len(got) - len(shown) + return " or ".join(shown) + (f" and {more} more" if more else "") + + def _halves_swapped(pair: RawPair) -> RawPair: """The pair with the two halves of its up rows in the other order. An odd count of rows is left as it is, for the shape check of the load @@ -823,16 +852,18 @@ def resolve(raw: RawLora, keymap: LoraKeyMap, *, under = _underscore_index(keymap.targets) text_under = _underscore_index(keymap.text_targets) dit, text, unmatched, dropped, other, scaled = [], [], [], [], [], [] + stable: list = [] for stem, pair in raw.pairs.items(): if is_text_stem(stem): path = _text_target(stem, keymap, text_under) if path is None: unmatched.append(stem) continue - pair, moved = _under_header(raw.path, configs, TEXT_COMPONENT, - path, pair) + pair, moved, factor = _under_header( + raw.path, configs, TEXT_COMPONENT, path, pair) text.append(Target(path, None, pair)) scaled += [stem] * moved + stable += [factor] * (factor is not None) continue hit = _dit_target(stem, keymap.targets, under) if hit is None: @@ -842,12 +873,13 @@ def resolve(raw: RawLora, keymap: LoraKeyMap, *, continue name, underscored = hit module, band = keymap.targets[name] - pair, moved = _under_header(raw.path, configs, DIT_COMPONENT, name, - pair) + pair, moved, factor = _under_header(raw.path, configs, + DIT_COMPONENT, name, pair) if name in keymap.swapped: pair = _halves_swapped(pair) dit.append(Target(module, band, pair)) scaled += [stem] * moved + stable += [factor] * (factor is not None) if _comfy_drops(stem, name, underscored, keymap): dropped.append(stem) skipped = _need_targets(raw.path, keymap, len(raw.pairs), @@ -859,7 +891,11 @@ def resolve(raw: RawLora, keymap: LoraKeyMap, *, f"{raw.path}: {len(scaled)} pairs take an alpha from the " f"adapter header that is not their rank ({_listed(scaled)}). " "gmlx applies it as the diffusers loader does, and ComfyUI " - "does not read the header, so the image differs from ComfyUI's") + "does not read the header, so the image differs from ComfyUI's" + + (f". The header makes {len(stable)} of them rank-stabilized, " + "scaled by the alpha over the square root of the rank, and " + f"gmlx applies those at {_factors(stable)} times the " + "strength that ComfyUI gives them" if stable else "")) if dropped and keymap.comfy_stems is not None: warnings.append( f"{raw.path}: {len(dropped)} keys have a spelling that ComfyUI " diff --git a/tests/fixtures/image/flux2_klein_pixel_art_lora.header.json b/tests/fixtures/image/flux2_klein_pixel_art_lora.header.json new file mode 100644 index 000000000..3101bc536 --- /dev/null +++ b/tests/fixtures/image/flux2_klein_pixel_art_lora.header.json @@ -0,0 +1,1385 @@ +{ + "source": "the safetensors header of the adapter, read by range: tensor names, shapes and dtypes, and the PEFT config diffusers saved beside them", + "metadata": { + "format": "pt", + "lora_adapter_metadata": "{\n \"transformer.alora_invocation_tokens\": null,\n \"transformer.alpha_pattern\": {},\n \"transformer.arrow_config\": null,\n \"transformer.auto_mapping\": null,\n \"transformer.base_model_name_or_path\": null,\n \"transformer.bias\": \"none\",\n \"transformer.corda_config\": null,\n \"transformer.ensure_weight_tying\": false,\n \"transformer.eva_config\": null,\n \"transformer.exclude_modules\": null,\n \"transformer.fan_in_fan_out\": false,\n \"transformer.inference_mode\": false,\n \"transformer.init_lora_weights\": true,\n \"transformer.layer_replication\": null,\n \"transformer.layers_pattern\": null,\n \"transformer.layers_to_transform\": null,\n \"transformer.loftq_config\": {},\n \"transformer.lora_alpha\": 128,\n \"transformer.lora_bias\": false,\n \"transformer.lora_dropout\": 0.0,\n \"transformer.megatron_config\": null,\n \"transformer.megatron_core\": \"megatron.core\",\n \"transformer.modules_to_save\": null,\n \"transformer.peft_type\": \"LORA\",\n \"transformer.peft_version\": \"0.18.1\",\n \"transformer.qalora_group_size\": 16,\n \"transformer.r\": 64,\n \"transformer.rank_pattern\": {},\n \"transformer.revision\": null,\n \"transformer.target_modules\": [\n \"linear_out\",\n \"to_qkv_mlp_proj\",\n \"add_q_proj\",\n \"context_embedder\",\n \"single_stream_modulation.linear\",\n \"proj_out\",\n \"double_stream_modulation_img.linear\",\n \"add_k_proj\",\n \"double_stream_modulation_txt.linear\",\n \"to_k\",\n \"to_q\",\n \"to_v\",\n \"to_add_out\",\n \"linear_in\",\n \"to_out.0\",\n \"add_v_proj\",\n \"x_embedder\"\n ],\n \"transformer.target_parameters\": null,\n \"transformer.task_type\": null,\n \"transformer.trainable_token_indices\": null,\n \"transformer.use_dora\": false,\n \"transformer.use_qalora\": false,\n \"transformer.use_rslora\": true\n}" + }, + "tensors": [ + [ + "transformer.context_embedder.lora_A.weight", + [ + 64, + 7680 + ], + "F32" + ], + [ + "transformer.context_embedder.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.double_stream_modulation_img.linear.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.double_stream_modulation_img.linear.lora_B.weight", + [ + 18432, + 64 + ], + "F32" + ], + [ + "transformer.double_stream_modulation_txt.linear.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.double_stream_modulation_txt.linear.lora_B.weight", + [ + 18432, + 64 + ], + "F32" + ], + [ + "transformer.proj_out.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.proj_out.lora_B.weight", + [ + 128, + 64 + ], + "F32" + ], + [ + "transformer.single_stream_modulation.linear.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.single_stream_modulation.linear.lora_B.weight", + [ + 9216, + 64 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.0.attn.to_qkv_mlp_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.0.attn.to_qkv_mlp_proj.lora_B.weight", + [ + 27648, + 64 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.1.attn.to_qkv_mlp_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.1.attn.to_qkv_mlp_proj.lora_B.weight", + [ + 27648, + 64 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.10.attn.to_qkv_mlp_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.10.attn.to_qkv_mlp_proj.lora_B.weight", + [ + 27648, + 64 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.11.attn.to_qkv_mlp_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.11.attn.to_qkv_mlp_proj.lora_B.weight", + [ + 27648, + 64 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.12.attn.to_qkv_mlp_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.12.attn.to_qkv_mlp_proj.lora_B.weight", + [ + 27648, + 64 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.13.attn.to_qkv_mlp_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.13.attn.to_qkv_mlp_proj.lora_B.weight", + [ + 27648, + 64 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.14.attn.to_qkv_mlp_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.14.attn.to_qkv_mlp_proj.lora_B.weight", + [ + 27648, + 64 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.15.attn.to_qkv_mlp_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.15.attn.to_qkv_mlp_proj.lora_B.weight", + [ + 27648, + 64 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.16.attn.to_qkv_mlp_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.16.attn.to_qkv_mlp_proj.lora_B.weight", + [ + 27648, + 64 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.17.attn.to_qkv_mlp_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.17.attn.to_qkv_mlp_proj.lora_B.weight", + [ + 27648, + 64 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.18.attn.to_qkv_mlp_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.18.attn.to_qkv_mlp_proj.lora_B.weight", + [ + 27648, + 64 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.19.attn.to_qkv_mlp_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.19.attn.to_qkv_mlp_proj.lora_B.weight", + [ + 27648, + 64 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.2.attn.to_qkv_mlp_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.2.attn.to_qkv_mlp_proj.lora_B.weight", + [ + 27648, + 64 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.3.attn.to_qkv_mlp_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.3.attn.to_qkv_mlp_proj.lora_B.weight", + [ + 27648, + 64 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.4.attn.to_qkv_mlp_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.4.attn.to_qkv_mlp_proj.lora_B.weight", + [ + 27648, + 64 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.5.attn.to_qkv_mlp_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.5.attn.to_qkv_mlp_proj.lora_B.weight", + [ + 27648, + 64 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.6.attn.to_qkv_mlp_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.6.attn.to_qkv_mlp_proj.lora_B.weight", + [ + 27648, + 64 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.7.attn.to_qkv_mlp_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.7.attn.to_qkv_mlp_proj.lora_B.weight", + [ + 27648, + 64 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.8.attn.to_qkv_mlp_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.8.attn.to_qkv_mlp_proj.lora_B.weight", + [ + 27648, + 64 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.9.attn.to_qkv_mlp_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.single_transformer_blocks.9.attn.to_qkv_mlp_proj.lora_B.weight", + [ + 27648, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.attn.add_k_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.attn.add_k_proj.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.attn.add_q_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.attn.add_q_proj.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.attn.add_v_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.attn.add_v_proj.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.attn.to_add_out.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.attn.to_add_out.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.attn.to_k.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.attn.to_k.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.attn.to_out.0.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.attn.to_out.0.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.attn.to_q.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.attn.to_q.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.attn.to_v.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.attn.to_v.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.ff.linear_in.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.ff.linear_in.lora_B.weight", + [ + 18432, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.ff.linear_out.lora_A.weight", + [ + 64, + 9216 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.ff.linear_out.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.ff_context.linear_in.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.ff_context.linear_in.lora_B.weight", + [ + 18432, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.ff_context.linear_out.lora_A.weight", + [ + 64, + 9216 + ], + "F32" + ], + [ + "transformer.transformer_blocks.0.ff_context.linear_out.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.attn.add_k_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.attn.add_k_proj.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.attn.add_q_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.attn.add_q_proj.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.attn.add_v_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.attn.add_v_proj.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.attn.to_add_out.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.attn.to_add_out.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.attn.to_k.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.attn.to_k.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.attn.to_out.0.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.attn.to_out.0.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.attn.to_q.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.attn.to_q.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.attn.to_v.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.attn.to_v.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.ff.linear_in.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.ff.linear_in.lora_B.weight", + [ + 18432, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.ff.linear_out.lora_A.weight", + [ + 64, + 9216 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.ff.linear_out.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.ff_context.linear_in.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.ff_context.linear_in.lora_B.weight", + [ + 18432, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.ff_context.linear_out.lora_A.weight", + [ + 64, + 9216 + ], + "F32" + ], + [ + "transformer.transformer_blocks.1.ff_context.linear_out.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.attn.add_k_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.attn.add_k_proj.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.attn.add_q_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.attn.add_q_proj.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.attn.add_v_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.attn.add_v_proj.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.attn.to_add_out.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.attn.to_add_out.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.attn.to_k.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.attn.to_k.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.attn.to_out.0.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.attn.to_out.0.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.attn.to_q.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.attn.to_q.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.attn.to_v.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.attn.to_v.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.ff.linear_in.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.ff.linear_in.lora_B.weight", + [ + 18432, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.ff.linear_out.lora_A.weight", + [ + 64, + 9216 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.ff.linear_out.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.ff_context.linear_in.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.ff_context.linear_in.lora_B.weight", + [ + 18432, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.ff_context.linear_out.lora_A.weight", + [ + 64, + 9216 + ], + "F32" + ], + [ + "transformer.transformer_blocks.2.ff_context.linear_out.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.attn.add_k_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.attn.add_k_proj.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.attn.add_q_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.attn.add_q_proj.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.attn.add_v_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.attn.add_v_proj.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.attn.to_add_out.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.attn.to_add_out.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.attn.to_k.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.attn.to_k.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.attn.to_out.0.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.attn.to_out.0.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.attn.to_q.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.attn.to_q.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.attn.to_v.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.attn.to_v.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.ff.linear_in.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.ff.linear_in.lora_B.weight", + [ + 18432, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.ff.linear_out.lora_A.weight", + [ + 64, + 9216 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.ff.linear_out.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.ff_context.linear_in.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.ff_context.linear_in.lora_B.weight", + [ + 18432, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.ff_context.linear_out.lora_A.weight", + [ + 64, + 9216 + ], + "F32" + ], + [ + "transformer.transformer_blocks.3.ff_context.linear_out.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.attn.add_k_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.attn.add_k_proj.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.attn.add_q_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.attn.add_q_proj.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.attn.add_v_proj.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.attn.add_v_proj.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.attn.to_add_out.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.attn.to_add_out.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.attn.to_k.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.attn.to_k.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.attn.to_out.0.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.attn.to_out.0.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.attn.to_q.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.attn.to_q.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.attn.to_v.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.attn.to_v.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.ff.linear_in.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.ff.linear_in.lora_B.weight", + [ + 18432, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.ff.linear_out.lora_A.weight", + [ + 64, + 9216 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.ff.linear_out.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.ff_context.linear_in.lora_A.weight", + [ + 64, + 3072 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.ff_context.linear_in.lora_B.weight", + [ + 18432, + 64 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.ff_context.linear_out.lora_A.weight", + [ + 64, + 9216 + ], + "F32" + ], + [ + "transformer.transformer_blocks.4.ff_context.linear_out.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ], + [ + "transformer.x_embedder.lora_A.weight", + [ + 64, + 128 + ], + "F32" + ], + [ + "transformer.x_embedder.lora_B.weight", + [ + 3072, + 64 + ], + "F32" + ] + ] +} \ No newline at end of file diff --git a/tests/fixtures/image/lora_rules_digest.json b/tests/fixtures/image/lora_rules_digest.json index cf1d7a3f6..37279b3c7 100644 --- a/tests/fixtures/image/lora_rules_digest.json +++ b/tests/fixtures/image/lora_rules_digest.json @@ -5,40 +5,72 @@ "flux3_klein": { "cases": 2, "refused": 2, - "sha256": "05608533205af7ff059372d79733ab5f913fa651df9c28ae17bb649650de7b4c", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "bcd73b3fabe0819b8db67ab696f53fe9cf473ad6b4c13490e97ffb8ac4191f26", "warned": 0 }, "flux3_klein base": { "cases": 2, "refused": 2, - "sha256": "036abd21c5f559728feb945d0d67dcb90588df7983e4c87c3df325f57aa1a498", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "fced27296d5dbfa9bb9abbaadbdbc8bbd841a1feed1a9835da83df5aa6bda409", "warned": 0 }, "krea2": { "cases": 2, "refused": 0, + "refused_kinds": [], "sha256": "6b9ef1fcba9823e5ab3f528d783c95a05a8de56704792c6615add37ac00cdc7b", "warned": 0 }, "qwen_image21": { "cases": 2, "refused": 1, - "sha256": "bca2fd92b251597f7c6b8434ac3012c8d55039838329b3990695dfed40fa0abb", + "refused_kinds": [ + [ + "UnmatchedKeysError", + "" + ] + ], + "sha256": "7ceb25fcbb7b3f6d48b3c554d2dea22e512ebfcc170f78f2ea6abb8430e9cf57", "warned": 1 }, "qwen_image21 unfused": { "cases": 2, "refused": 1, - "sha256": "2335e1f6e0f3db2494277851b774dae01d02513eca4267bc53a98c06da02b10a", + "refused_kinds": [ + [ + "UnmatchedKeysError", + "" + ] + ], + "sha256": "f0fbd35c7c4c772c24c0815acca29d86af321a5584e00867325990ac229923bb", "warned": 1 }, "z_image": { "cases": 2, "refused": 1, - "sha256": "e587c4a74282b2eca819b003dbf69c2847317885fe4708458e812c66020437c1", + "refused_kinds": [ + [ + "UnmatchedKeysError", + "" + ] + ], + "sha256": "2d0cd826174e4742e3c8adf8087c64d473de859fff4a95849191e8b2ab8f0e1e", "warned": 1 } }, + "rslora": false, "size": 469291992 }, "Limbicnation__pixel-art-lora/pytorch_lora_weights.safetensors": { @@ -46,40 +78,77 @@ "flux3_klein": { "cases": 2, "refused": 2, - "sha256": "df661b30f5a62edfb08689392bf7bbd1cd1fd960d24eb41e34fc45e49c49ecfc", + "refused_kinds": [ + [ + "UnsupportedAdapterError", + "rank-stabilized LoRA" + ] + ], + "sha256": "a65dfd57311f6f95e4e83fc4168e88fe9b8854573f2615f2d7487c6abb1ca2c1", "warned": 0 }, "flux3_klein base": { "cases": 2, "refused": 2, - "sha256": "134b49448bcb0fb2f06aa955fbb362e9a1f8e798c1a35c4ae727ecd9924df0ce", + "refused_kinds": [ + [ + "UnsupportedAdapterError", + "rank-stabilized LoRA" + ] + ], + "sha256": "145ba4a7dcf0e757932b5446880b8c309fb8fe07ffaf6634088ede2a9dde5d50", "warned": 0 }, "krea2": { "cases": 2, "refused": 2, - "sha256": "a87ed5378e420dde4dec37a2118b1dfae38c596e624dbbb604ca95c325960051", + "refused_kinds": [ + [ + "UnsupportedAdapterError", + "rank-stabilized LoRA" + ] + ], + "sha256": "e73fa38d01b2c9b32248ae94460b4f76c8c8aa6a82a8381b1fb93da4f2147886", "warned": 0 }, "qwen_image21": { "cases": 2, "refused": 2, - "sha256": "65819b18f8ff3a653e80f38a78c56215b1cedafe7be6ac2f0c958f302b6f0f0e", + "refused_kinds": [ + [ + "UnsupportedAdapterError", + "rank-stabilized LoRA" + ] + ], + "sha256": "f81ed0df44dc1c0cc074264b41bcca2e052769f5b8c7b4b2a8778df902d53a92", "warned": 0 }, "qwen_image21 unfused": { "cases": 2, "refused": 2, - "sha256": "f16068b68e19a94fb9077bd4e35b93eaec764e6580d969ac905ff3579edac865", + "refused_kinds": [ + [ + "UnsupportedAdapterError", + "rank-stabilized LoRA" + ] + ], + "sha256": "6cd1c0a28faa7f27c1c3d41a16832fcfad6057b37944431f2be32aee1ab4efb5", "warned": 0 }, "z_image": { "cases": 2, "refused": 2, - "sha256": "c5c17742b411495bc9d7b37721d3b335ddb86bd48593c6f4c0072ce12603b4fb", + "refused_kinds": [ + [ + "UnsupportedAdapterError", + "rank-stabilized LoRA" + ] + ], + "sha256": "cdd55c019a7ae17a0e93c61b5edac32f0f76ad1186dfdd9d9bfa1e6df1e3f2db", "warned": 0 } }, + "rslora": true, "size": 325280664 }, "bdsqlsz__qinglong_DetailedEyes_Z-Image/qinglong_detailedeye_z-image.safetensors": { @@ -87,40 +156,72 @@ "flux3_klein": { "cases": 2, "refused": 2, - "sha256": "f51f08cc6d88616853f83f63b8031726769095437aa744f98b661b010bcfc4ce", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "55ea1a2d8909b30b7f5de48dd49c797860b8017ef2e58f2624a0b2b3bfdd544a", "warned": 0 }, "flux3_klein base": { "cases": 2, "refused": 2, - "sha256": "3f8e1046b99a6a8819a5e2b7d803c428b444ac99238785a8603255c6327eb859", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "5a16d4f242035c5b7220c9738838d023bed2ba77092fbc0572bef564766b1304", "warned": 0 }, "krea2": { "cases": 2, "refused": 2, - "sha256": "3e4c81999f2fd9ee44129ca2e12fc3b0d7404484c7ce0bb93fd58a459fab3143", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "6c1c2ec4c2924f460eea4aa15d4b75815fcf52e9babd39bcb1ec8e584e80dbcb", "warned": 0 }, "qwen_image21": { "cases": 2, "refused": 2, - "sha256": "3022f8bb7ef5cae82719b3821f522624f7b2e3dd995b923d726aafd06ea71b13", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "873c5e14b56e1ebc68708a215ca41873b21a351894fa2dbe972c6087fa22336c", "warned": 0 }, "qwen_image21 unfused": { "cases": 2, "refused": 2, - "sha256": "5b8cd6a4797a5b816230e1b4c2cb4d5370658fc1a596814cda85fda2b684be6d", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "afe0eedd59908d9b7a11e48f67f5e5697b471a364c05a68a3c4d1c985fcb2e67", "warned": 0 }, "z_image": { "cases": 2, "refused": 0, + "refused_kinds": [], "sha256": "86a54d35785d4b21ae0c37d694fb757a535e1d4d24862335a31cd449c98972d5", "warned": 2 } }, + "rslora": false, "size": 381587708 }, "mikkoph__mikkoani-klein4b/klein4b-mikkoani.safetensors": { @@ -128,40 +229,77 @@ "flux3_klein": { "cases": 2, "refused": 2, - "sha256": "7c616ff97c070aa4325a9dbd0c0371a1b0b35a0e1f3bbfa4519834d6e78d838a", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "9ab21a306f510dadf00adde40b7ae33f7be72aaf517e25e784db94b0c77ec7fb", "warned": 0 }, "flux3_klein base": { "cases": 2, "refused": 2, - "sha256": "dcfc6ee15270773c2ee3a500eeb64624bb522e909c542b12579434ddd92a5054", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "6c42f79259ce8f3bf4999c6bdd2117bd01c2d77fffe302e065b9fa1aa64ac48b", "warned": 0 }, "krea2": { "cases": 2, "refused": 2, - "sha256": "0904c9aa004b3719949705889bde32f304554f8719fcedc6059c78429bae69c9", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "ad578334a003c7bd44852fc596706bc6c9f255fb384223c1cafa0f21487c19f5", "warned": 0 }, "qwen_image21": { "cases": 2, "refused": 2, - "sha256": "f3287c0718ef989c21261da0f34caf292dcdc640e69dab582644921292b8f254", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "df11e3fd941a31f34d167ff26dc0f62ed642b7d9a5855b9e79829c40f1da7f60", "warned": 0 }, "qwen_image21 unfused": { "cases": 2, "refused": 2, - "sha256": "c7c02f6d329fff1cf045d8f9ef737ea6e6cd20605f6b521b30b313a9bae1aef9", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "df52fa1bb09fba95bd9a7709a862baadb632ae0e0102dd77e0da8c83b7158c07", "warned": 0 }, "z_image": { "cases": 2, "refused": 2, - "sha256": "fa1b4fc2e11aab553be8fbab9282fda7c330d91483d303690e1b617d22d70462", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "a38b46dc8280ba4126074bbcf59681b3c2eef3eca5cdbdd792a75b749b6a3b86", "warned": 0 } }, + "rslora": false, "size": 92436112 }, "ostris__sketch_to_image_klein_4b/sketch_to_image_klein_4b.safetensors": { @@ -169,40 +307,77 @@ "flux3_klein": { "cases": 2, "refused": 2, - "sha256": "b4330013ed4f84e68caf48ad66295086a3e01a4cbd9b8409d1e0b4a6c7789540", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "b3c5a8e40933e4ce1942c22f82868e7f0b755c23ce9a8c7731219361eb6b247d", "warned": 0 }, "flux3_klein base": { "cases": 2, "refused": 2, - "sha256": "a2263832579dcd9e3f73d21919b200b128b99c3e082ded785f9dd24cda19d9cf", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "81883203334c24b369fd16e42487922064fe14918bc757f245e4301e4971019d", "warned": 0 }, "krea2": { "cases": 2, "refused": 2, - "sha256": "4314afe89b8a7d5fe5a8f721331343bff6f0b65dbfd12fde2be10f6b2f4bf444", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "bee12e638818ea91c1d8245915c81692a7af818d3591403baf8ed5e2e46e29de", "warned": 0 }, "qwen_image21": { "cases": 2, "refused": 2, - "sha256": "18dd69239a47a594e9cecc724d011135bb74bfef0475e8b53721326cbcfbd7ec", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "f03d2963e59151e928a54c9329b12bd52fef6e1cc840b0dd19ecec87e350ed0f", "warned": 0 }, "qwen_image21 unfused": { "cases": 2, "refused": 2, - "sha256": "770ec3aaaab43bd335ec13fda2d12f3fd5f611d24e9e4fc581dc62f539cdeea8", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "2cfba1038ab26de6f15c33793d61184b57798a3eece18908bc8c1fcf5ffecd77", "warned": 0 }, "z_image": { "cases": 2, "refused": 2, - "sha256": "d5ad6f057ec8a15a257dd9f45e0eb3f0ef033de473ed3b0f37ca01bf68f890ef", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "ab8480b6cfeb80d2e49875c850952e2c7f76c3223b245cabbb4ba1bb87d13e28", "warned": 0 } }, + "rslora": false, "size": 92426712 }, "ostris__z_image_turbo_childrens_drawings/z_image_turbo_childrens_drawings.safetensors": { @@ -210,40 +385,72 @@ "flux3_klein": { "cases": 2, "refused": 2, - "sha256": "d04d3971f853b6335d72835bf482dd5698903e5d25e8a2439da43875b225be43", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "0bb9b9b8a2cec117e1f4c3efaa67dabe803bce1d2de4f60ca81d76c2df799838", "warned": 0 }, "flux3_klein base": { "cases": 2, "refused": 2, - "sha256": "f2d4a53cbd4c89958091aacd30a8bd71c4c29e076b2df33252d273299e5fa935", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "27f1c6e6ac9201d1f3796d4ff6691a2eaa7bf31a93f8a39de0a597c40c05f5b7", "warned": 0 }, "krea2": { "cases": 2, "refused": 2, - "sha256": "d484134b689930e1a1dd89ec62904e91fefaeed5c20bdf4192a92d041112bce6", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "d5c8475925ecb5ba5fe664c94dd3ec40726ac197ea456ea46f1bf175215dbf4e", "warned": 0 }, "qwen_image21": { "cases": 2, "refused": 2, - "sha256": "2faa109ddb36dc172f8994bfc52521728523fce1637eeb0793617bed21323daf", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "c6a523d406ed64bec85b74025bc6cc014f493bac52e78c760d80d0c162dc1fcf", "warned": 0 }, "qwen_image21 unfused": { "cases": 2, "refused": 2, - "sha256": "8e8bb8ef73b13e3e88290785406fa75a54d94a2674ca6317797c9b55fbcd63a5", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "a772b7e5702adb5887ba82fdd3e34b8594fa8eed875655f35fad0fb55788f839", "warned": 0 }, "z_image": { "cases": 2, "refused": 0, + "refused_kinds": [], "sha256": "a27736f05f84c94a05058afa4d7088759a990cc47f2fed6a74fd4692a3db3bb4", "warned": 0 } }, + "rslora": false, "size": 170128264 }, "suayptalha__Z-Image-Turbo-Realism-LoRA/pytorch_lora_weights.safetensors": { @@ -251,40 +458,72 @@ "flux3_klein": { "cases": 2, "refused": 2, - "sha256": "8075bc4c858dab04c650b6b14d4859ddfac4dc42178cf7c4a33b8f6ba606a7cd", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "bb7064ae2ae16332e45545e741fd032fbd01947baccbedc7f2d96244bcbdf7b4", "warned": 0 }, "flux3_klein base": { "cases": 2, "refused": 2, - "sha256": "66cef56c277fb0ff926630f56252a2d2e38d8b90080ada5559bf3b5566e0d5b7", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "9fb84d861359af9cecac0c4795caa8b8c3fb26cfd1ce1a73d8ce56f0c3108075", "warned": 0 }, "krea2": { "cases": 2, "refused": 2, - "sha256": "7a54fe543382130a53cbf650f62ab1769778a838ec51a783e498be97d7c5efda", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "70ce137ed013673a4b71133971a979ef17ed8bae6450be4cceeb3773687c1265", "warned": 0 }, "qwen_image21": { "cases": 2, "refused": 2, - "sha256": "122850429658c2da29bc871b46b5e35082020aca4cea6c3def86b3276da35c35", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "5b65e6644db629b0c98dadf235c30724db1f6031eed130c743dd2aaf522b97f2", "warned": 0 }, "qwen_image21 unfused": { "cases": 2, "refused": 2, - "sha256": "92239fd51a6ab4a842427d728441b91d37b0fd539fe8b64af5a278648ac3f571", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "afe1a88b8e827108481eda3cd144e37994504627c4d408fd279d1645ac6a0db4", "warned": 0 }, "z_image": { "cases": 2, "refused": 0, + "refused_kinds": [], "sha256": "961e8771718bd7344409d5a59b42de57fad913b0750c90800efa5d25cb5f6f8d", "warned": 0 } }, + "rslora": false, "size": 85094800 } }, @@ -293,37 +532,85 @@ "flux3_klein": { "cases": 14080, "refused": 3478, - "sha256": "e53e6b35a727fd3e74b38a3c95665876bd71f5b27199abf49d861ceb938a6123", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ], + [ + "UnmatchedKeysError", + "" + ] + ], + "sha256": "1f8090057ef31736bef9499bf39b5f4bd794a61b3e0c78d7d28a37c2eb230a00", "warned": 9510 }, "flux3_klein base": { "cases": 14080, "refused": 3550, - "sha256": "6567e198a5cede421e2e575ed4275e2cd8dfd26a56643470d319a08742d9a391", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ], + [ + "UnmatchedKeysError", + "" + ] + ], + "sha256": "4400f73f02768916fe73348cbadf763cad4a699a58fd456fe019d441e431d2e3", "warned": 9446 }, "krea2": { "cases": 12400, "refused": 2320, - "sha256": "9dfb2ea32797e5a4d311eaffa36cff70889c42bd3f26e212630255021dd27c09", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "39338cceedaa04a315fdac3dd96d78871907bd4ab4a37e5471fc369329e94485", "warned": 1184 }, "qwen_image21": { "cases": 6720, "refused": 1968, - "sha256": "bc7c3e65ad7fc41c4f0b73c703deb88bd1fbc93655d638ea39283e9c94ee4a69", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "cc2758fde7b62a2982503042da29ca4bf37b046508cbffb55f7e8bef52cb8dac", "warned": 0 }, "qwen_image21 unfused": { "cases": 6720, "refused": 2544, - "sha256": "3348b856d8e8a7595c472f0401593d43f1526d6cee25de5962022bad3de7cc47", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ], + [ + "UnmatchedKeysError", + "" + ] + ], + "sha256": "be794c3acb3102673b3636e440a593afc90e0f94ad8f577fd4c29c132eb7e3dc", "warned": 0 }, "z_image": { "cases": 13460, "refused": 6710, - "sha256": "9e8b01ac09abcd445722481a2bdcdaca0379ad17fda87740c09c8df562e236af", + "refused_kinds": [ + [ + "AdapterFamilyError", + "" + ] + ], + "sha256": "2dd55f6f68725c1489b18e4180869117f7cd6a655990b7cbc2bcfba6c97a77d4", "warned": 556 } } diff --git a/tests/fixtures/image/manifest.json b/tests/fixtures/image/manifest.json index 2d8c547f5..916603397 100644 --- a/tests/fixtures/image/manifest.json +++ b/tests/fixtures/image/manifest.json @@ -219,5 +219,14 @@ "size": 7751109744, "sha256": "9f29f9edcfdae452a653ffb51a534ca4decd389952c225724ff3b94042612a6e", "sha256_source": "The hub's LFS record of the file whose header the fixture's names and shapes come from. The base 4B file has the same names and shapes." + }, + "flux2_klein_pixel_art_lora.header.json": { + "repo": "Limbicnation/pixel-art-lora", + "revision": "0ac8e5c3400af68228811edc324721e25fc26777", + "file": "pytorch_lora_weights.safetensors", + "size": 325280664, + "sha256": "72ac6e652196cd9f450d4d3256d197978d3fa690e22dc21361d3bd4fb4e8250e", + "license": "apache-2.0", + "sha256_source": "The hub's LFS record of the file whose header the fixture holds, which the downloaded file matches." } } diff --git a/tests/image/test_image_flux2_lora_map.py b/tests/image/test_image_flux2_lora_map.py index 787d32b5a..073753dfb 100644 --- a/tests/image/test_image_flux2_lora_map.py +++ b/tests/image/test_image_flux2_lora_map.py @@ -323,6 +323,57 @@ def test_the_comfyui_warning_names_every_spelling_comfyui_drops(): assert bool(res.warnings) == (not loads), stem +# The header of Limbicnation/pixel-art-lora: diffusers names under +# transformer., rank 64, and a rank-stabilized PEFT config of alpha 128. +PIXEL_ART = "flux2_klein_pixel_art_lora.header.json" +PIXEL_ART_MODULATIONS = ("transformer.double_stream_modulation_img.linear", + "transformer.double_stream_modulation_txt.linear", + "transformer.single_stream_modulation.linear") + + +def header_pairs(name: str) -> reader.RawLora: + """The pairs of a header fixture with their stems and ranks and empty + rows, and the header's metadata.""" + doc = load_json(name) + parts: dict = {} + for key, shape, _ in doc["tensors"]: + stem, _, role = key.rpartition(".lora_") + parts.setdefault(stem, {})[role] = shape + pairs = {stem: reader.RawPair(stem, mx.zeros((p["A.weight"][0], 1)), + mx.zeros((1, p["B.weight"][1])), None) + for stem, p in parts.items()} + return reader.RawLora(name, pairs, doc["metadata"]) + + +def test_the_pixel_art_adapter_warns_of_its_modulations_and_its_scale(): + """The pixel-art adapter resolves whole. Its three modulation pairs + have diffusers names that ComfyUI's FLUX table lacks, and the warning + names all three and no other. Its rank-stabilized header scales each + pair by 128 over the root of 64, 16 times the scale 1 that ComfyUI + gives a pair without an alpha tensor, and the header warning says + so.""" + km = lora_map(fp.identify(fixture_view(HEADERS[0])).config) + raw = header_pairs(PIXEL_ART) + res = reader.resolve(raw, km) + assert len(res.dit) == len(raw.pairs) == 86 and res.unmatched == () + assert {t.pair.alpha / t.pair.rank for t in res.dit} == {16.0} + dropped = [w for w in res.warnings if "ComfyUI drops them" in w] + assert len(dropped) == 1 + assert (f"3 keys have a spelling that ComfyUI does not read for FLUX.2 " + f"klein ({', '.join(PIXEL_ART_MODULATIONS)})") in dropped[0] + scaled = [w for w in res.warnings if "rank-stabilized" in w] + assert len(scaled) == 1 and len(res.warnings) == 2 + assert "86 pairs take an alpha from the adapter header" in scaled[0] + assert ("The header makes 86 of them rank-stabilized, scaled by the " + "alpha over the square root of the rank, and gmlx applies those " + "at 16 times the strength that ComfyUI gives them") in scaled[0] + # The modulations land on the GGUF modules. + mods = {t.pair.stem: t.module for t in res.dit + if t.pair.stem in PIXEL_ART_MODULATIONS} + assert mods == {s: s.removeprefix("transformer.").replace( + ".linear", ".lin") for s in PIXEL_ART_MODULATIONS} + + def _adapter(km, dims: dict, seed: int, alpha, targets) -> dict: """Pairs on ``targets`` at ranks 2 to 4.""" rng = np.random.default_rng(seed) diff --git a/tests/image/test_image_lora_map.py b/tests/image/test_image_lora_map.py index 13e988f66..0c1093a62 100644 --- a/tests/image/test_image_lora_map.py +++ b/tests/image/test_image_lora_map.py @@ -243,7 +243,7 @@ def test_check7_delta_half_of_a_file_with_a_header_config(tmp_path): assert rel_l2(delta, reference_delta(scale_1[module], dims[module])) <= DELTA_TOL # A field that would change the delta in another way is refused. - for name, kind in (("use_rslora", "rank-stabilized LoRA"), + for name, kind in (("fan_in_fan_out", "LoRA on a transposed weight"), ("use_dora", "DoRA"), ("lora_bias", "LoRA with a " "bias")): bad = write_keys(tmp_path / f"{name}.safetensors", keys, diff --git a/tests/image/test_image_lora_reader.py b/tests/image/test_image_lora_reader.py index 9adb05797..319c9abf1 100644 --- a/tests/image/test_image_lora_reader.py +++ b/tests/image/test_image_lora_reader.py @@ -3,6 +3,7 @@ from __future__ import annotations import json +import math import mlx.core as mx import numpy as np @@ -567,7 +568,6 @@ def test_a_header_pattern_matches_a_module_as_peft_matches_it(patterns, REFUSED = [ ("use_dora", True, "DoRA"), - ("use_rslora", True, "rank-stabilized LoRA"), ("lora_bias", True, "LoRA with a bias"), ("bias", "all", "LoRA with trained base biases"), ("bias", "lora_only", "LoRA with trained base biases"), @@ -612,6 +612,76 @@ def test_a_header_field_that_changes_the_delta_is_refused_by_name( assert _alphas(_resolved(keys, {**CONFIG, name: off})) == {ATT_Q: 1.5} +def test_every_refused_header_field_has_its_refusal_row(): + """Each field of ``_HEADER_REFUSED`` is refused in REFUSED with the + kind the reader names, and use_rslora is read, not refused.""" + rows = {name: kind for name, _, kind in REFUSED + if kind != "adapter header"} + assert rows == reader._HEADER_REFUSED + assert "use_rslora" in reader._HEADER_READ + assert "use_rslora" not in reader._HEADER_REFUSED + + +def _scales(res) -> dict: + """The scale each pair runs at, by target.""" + return {t.pair.stem.removeprefix("transformer."): + t.pair.alpha / t.pair.rank for t in res.dit} + + +def test_a_rank_stabilized_header_scales_by_the_root_of_the_rank(): + """use_rslora scales a pair by its alpha over the square root of its + rank, as PEFT's LoraLayer does, with the rank and the alpha that + rank_pattern and alpha_pattern give a module, and the warning gives + the factor of gmlx's scale over ComfyUI's, which reads no header and + runs a pair without an alpha tensor at 1.""" + keys = _saved({ATT_Q: 2, ATT_K: 3, FF_W1: 2}) + fields = {**CONFIG, "use_rslora": True, "rank_pattern": {ATT_K: 3}, + "alpha_pattern": {"w1": 4.0, "attention.to_k": 6.0}} + res = _resolved(keys, fields) + want = {ATT_Q: 1.5 / math.sqrt(2), ATT_K: 6.0 / math.sqrt(3), + FF_W1: 4.0 / math.sqrt(2)} + got = _scales(res) + assert got.keys() == want.keys() + for k, v in want.items(): + assert got[k] == pytest.approx(v, rel=1e-12), k + # The same fields without the flag scale by the alpha over the rank. + plain = _scales(_resolved(keys, {**fields, "use_rslora": False})) + assert plain == {ATT_Q: 1.5 / 2, ATT_K: 6.0 / 3, FF_W1: 4.0 / 2} + assert len(res.warnings) == 1 + w = res.warnings[0] + assert "3 pairs take an alpha from the adapter header" in w + assert ("The header makes 3 of them rank-stabilized, scaled by the " + "alpha over the square root of the rank, and gmlx applies " + "those at 1.061 or 2.828 or 3.464 times the strength that " + "ComfyUI gives them") in w + # A config whose alpha is the root of the rank runs at the scale 1 + # that ComfyUI gives a pair without an alpha tensor, with no warning. + root = _resolved(_saved({ATT_Q: 4}), {**CONFIG, "r": 4, + "lora_alpha": 2.0, + "use_rslora": True}) + assert _scales(root) == {ATT_Q: 1.0} and root.warnings == () + + +def test_a_rank_stabilized_pair_with_an_alpha_tensor(): + """An alpha tensor that is the header's alpha takes the rank-stabilized + scale too. ComfyUI reads the tensor and scales by it over the rank, so + gmlx's scale is the root of the rank times ComfyUI's.""" + keys = _saved({ATT_Q: 4}, alphas={ATT_Q: 3.0}) + fields = {**CONFIG, "r": 4, "lora_alpha": 3.0, "use_rslora": True} + res = _resolved(keys, fields) + assert _scales(res) == {ATT_Q: pytest.approx(3.0 / 2.0, rel=1e-12)} + assert len(res.warnings) == 1 + assert "gmlx applies those at 2 times the strength" in res.warnings[0] + assert _resolved(keys, {**fields, "use_rslora": False}).warnings == () + + +@pytest.mark.parametrize("value", [1, "true", [True], {"on": 1}]) +def test_a_use_rslora_that_is_not_true_or_false_is_refused(value): + with pytest.raises(AdapterError, match="use_rslora as .*neither true " + "nor false"): + reader.header_configs(header({**CONFIG, "use_rslora": value}), "f") + + def test_a_header_config_is_read_whole_or_refused(): keys = _saved({ATT_Q: 2}) assert reader.header_configs(None) == {} diff --git a/tests/image/test_image_lora_rules_unchanged.py b/tests/image/test_image_lora_rules_unchanged.py index 019561498..28b17c148 100644 --- a/tests/image/test_image_lora_rules_unchanged.py +++ b/tests/image/test_image_lora_rules_unchanged.py @@ -1,17 +1,20 @@ -"""The reader's ComfyUI rules for the families whose maps set no -``comfy_stems``: every spelling of every target and every other layout's -name of each map under every prefix the reader strips, resolved on its -own, and every LoRA file under GMLX_TEST_LORA_DIR resolved under every -map, give the targets, refusals and warnings that the reader gave before -``comfy_stems`` existed. lora_rules_digest.json records the sha256 of -those results, written from the reader of the commit before the field. -The spellings run on the CPU; the files half skips without the -directory.""" +"""The reader's rules for the families whose maps set no ``comfy_stems``: +every spelling of every target and every other layout's name of each map +under every prefix the reader strips, resolved on its own, and every LoRA +file under GMLX_TEST_LORA_DIR resolved under every map, give the targets, +refusals and warnings that the reader gave before ``comfy_stems`` +existed and before it applied rank-stabilized LoRA. +lora_rules_digest.json records the sha256 of those results, written from +the reader of the commit before both. A file whose header sets +use_rslora was refused then, and it may change only to the outcome of +the same pairs under a plain header with the rank-stabilized scale. The +spellings run on the CPU; the files half skips without the directory.""" from __future__ import annotations import dataclasses import hashlib import json +import math import os from pathlib import Path @@ -53,7 +56,8 @@ def _outcome(fn, path: str, name: str) -> list: try: res = fn() except reader.AdapterError as e: - return ["refused", type(e).__name__, str(e).replace(path, name)] + return ["refused", type(e).__name__, str(e).replace(path, name), + getattr(e, "kind", None)] rows = sorted([t.module, list(t.band) if t.band else None, t.pair.stem, t.pair.rank, t.pair.alpha] for t in res.dit + res.text) return [rows, [w.replace(path, name) for w in res.warnings], @@ -64,12 +68,25 @@ def _digest(cases: list) -> dict: h = hashlib.sha256() for case in cases: h.update(json.dumps(case, sort_keys=True).encode() + b"\n") + refused = [c[1] for c in cases if c[1][0] == "refused"] return {"cases": len(cases), "sha256": h.hexdigest(), - "refused": sum(c[1][0] == "refused" for c in cases), + "refused": len(refused), + "refused_kinds": [list(k) for k in sorted( + {(r[1], r[3] or "") for r in refused})], "warned": sum(c[1][0] != "refused" and bool(c[1][1]) for c in cases)} +def sets_rslora(metadata) -> bool: + """Whether a file's PEFT header sets use_rslora for a component, read + from the JSON without the reader.""" + raw = (metadata or {}).get("lora_adapter_metadata") + if not raw: + return False + doc = json.loads(raw) + return any(k.endswith(".use_rslora") and bool(v) for k, v in doc.items()) + + def spelling_digests() -> dict: """For each map: every stem of its targets, its other layouts' names and the first targets of every other map, under every prefix, as one @@ -124,14 +141,39 @@ def file_digests(root) -> dict: "read": str(e).replace(path, name)} continue out[name] = { - "size": p.stat().st_size, - "maps": {label: _digest([[label, _outcome( - lambda: reader.resolve(raw, km, allow_unmatched=allow), - path, name), allow] for allow in (False, True)]) - for label, km in maps.items()}} + "size": p.stat().st_size, "rslora": sets_rslora(raw.metadata), + "maps": {label: _digest(_file_cases(raw, km, label, path, name)) + for label, km in maps.items()}} return out +def _file_cases(raw, km, label: str, path: str, name: str) -> list: + from gmlx.image.lora import reader + + return [[label, _outcome( + lambda: reader.resolve(raw, km, allow_unmatched=allow), + path, name), allow] for allow in (False, True)] + + +def plain_twin(raw): + """``raw`` under a header without use_rslora, whose alpha is the + header's alpha times the root of its rank: the scale the reader gives + a rank-stabilized pair, as a plain one.""" + doc = json.loads(raw.metadata["lora_adapter_metadata"]) + out = {} + for key, value in doc.items(): + comp, _, field = key.partition(".") + if field in ("rank_pattern", "alpha_pattern") and value: + pytest.skip(f"{raw.path} sets {key}: the plain twin reads none") + if field == "use_rslora": + continue + out[key] = value + if field == "lora_alpha" and doc.get(f"{comp}.use_rslora"): + out[key] = value * math.sqrt(doc[f"{comp}.r"]) + meta = dict(raw.metadata, lora_adapter_metadata=json.dumps(out)) + return dataclasses.replace(raw, metadata=meta) + + def test_no_older_map_sets_comfy_stems(): for label, km in keymaps().items(): assert km.comfy_stems is None and km.comfy_reads == "", label @@ -159,7 +201,49 @@ def test_every_lora_file_resolves_as_before(): want[n].get("size")] if not seen: pytest.skip(f"none of the recorded files is under {ENV}") - for name in seen: + same = [n for n in seen if not want[n].get("rslora")] + for name in same: assert got[name] == want[name], name - print(f"lora rules: {len(seen)} files under every older map as " - f"before: {', '.join(seen)}") + print(f"lora rules: {len(same)} files under every older map as " + f"before: {', '.join(same)}; rank-stabilized, checked apart: " + f"{', '.join(n for n in seen if n not in same) or 'none'}") + + +def test_a_rank_stabilized_file_changes_only_by_its_scale(): + """A recorded file whose header sets use_rslora was refused by name + under every older map, and now gives under each the outcome of the + same pairs under a plain header with the rank-stabilized scale, apart + from the sentence of the header warning on that scale.""" + from gmlx.image.lora import reader + + root = os.environ.get(ENV) + if not root: + pytest.skip(f"set {ENV} to the directory of the community LoRA " + "files") + want = load_json(DIGEST)["files"] + root = Path(root).expanduser() + files = [p for p in lora_files(root) + if want.get(str(p.relative_to(root)), {}).get("rslora") + and want[str(p.relative_to(root))]["size"] == p.stat().st_size] + if not files: + pytest.skip(f"no recorded rank-stabilized file is under {ENV}") + maps = keymaps() + for p in files: + path, name = str(p), str(p.relative_to(root)) + raw = reader.read_lora(path, allow_unmatched=True) + assert sets_rslora(raw.metadata) + twin = plain_twin(raw) + for label, km in maps.items(): + old = want[name]["maps"][label] + assert old["refused"] == old["cases"] and old[ + "refused_kinds"] == [["UnsupportedAdapterError", + "rank-stabilized LoRA"]], (name, label) + for (_, got, _), (_, plain, _) in zip( + _file_cases(raw, km, label, path, name), + _file_cases(twin, km, label, path, name)): + if got[0] != "refused": + got = [got[0], [w.split(". The header makes")[0] + for w in got[1]], got[2]] + assert got == plain, (name, label) + print(f"lora rules: {name} under {len(maps)} older maps as its " + "plain twin") diff --git a/tests/image/test_image_qwen_lora_map.py b/tests/image/test_image_qwen_lora_map.py index b560f0f6a..1c0e9bf1d 100644 --- a/tests/image/test_image_qwen_lora_map.py +++ b/tests/image/test_image_qwen_lora_map.py @@ -400,7 +400,7 @@ def test_check7_delta_half_of_a_file_with_a_header_config(tmp_path, layout): assert rel_l2(delta, reference_delta(want[module], dims[module])) <= DELTA_TOL assert reader.vet_header(path, keymap=km) == 18 - for name, kind in (("use_rslora", "rank-stabilized LoRA"), + for name, kind in (("fan_in_fan_out", "LoRA on a transposed weight"), ("use_dora", "DoRA"), ("lora_bias", "LoRA with a " "bias")): bad = write_keys(tmp_path / f"{name}.safetensors", keys, From bf35181147d956ce86bba4f68c24a346b479500f Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 10:06:37 -0700 Subject: [PATCH 020/101] fix(image): flux2 klein distilled refuses guidance, an unsized edit scales into the image limits, and edits schedule by image tokens alone --- CHANGELOG.md | 1 - docs/cli.md | 6 ++ docs/troubleshooting.md | 6 ++ gmlx/commands/image.py | 13 ++- gmlx/image/api.py | 38 +++++-- gmlx/image/families/flux2_klein/family.py | 4 + gmlx/image/registry.py | 42 +++++++- gmlx/serve/image_service.py | 52 +++++---- tests/image/test_image_cli.py | 125 ++++++++++++++++++++++ tests/image/test_image_flux2_edit.py | 89 ++++++++++++++- tests/serve/test_image_job.py | 87 ++++++++++++++- tests/serve/test_image_service.py | 102 +++++++++++++++--- 12 files changed, 514 insertions(+), 51 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75b440128..110477aff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,6 @@ adhere to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). output repeats it, which speeds up edits and quotes. - Muse Spark (GGUF arch `muse-spark`), with reasoning effort intents, tool calls and image and audio input through its `--mmproj` companion. - - An image LoRA whose PEFT header sets `use_rslora` loads, scaled as PEFT scales it, where it was refused. diff --git a/docs/cli.md b/docs/cli.md index 1d6605753..c4e477064 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -958,11 +958,17 @@ the weights load. | Qwen-Image 2.1 | Qwen3-VL-8B, its text GGUF | The Qwen-Image 2.1 autoencoder | 40 steps and guidance 1. Turbo: 8 steps and guidance 1. | | Krea 2 | Qwen3-VL-4B-Instruct, its text GGUF | The Qwen-Image autoencoder | Turbo: 8 steps and guidance 1. | | FLUX.3 klein | Qwen3-VL-4B-Instruct, its text GGUF | The FLUX.2 autoencoder | 16 steps and guidance 1. Base: 50 steps and guidance 3.5. | +| FLUX.2 klein | Qwen3-4B | The FLUX.2 autoencoder | 4 steps and guidance 1, which is the only guidance it takes. Base: 50 steps and guidance 4. | FLUX.3 klein Base shares the distilled model's architecture, encoder and VAE, and gmlx tells the two apart by their tensors. The distilled model runs any step count on its own schedule. +FLUX.2 klein Base and the distilled model are told apart the same way. +The distilled model refuses `--guidance` other than 1 before any file +loads, as BFL's command line does, and names Base as the checkpoint that +takes guidance. + Qwen-Image 2.1 Turbo shares the base model's architecture, encoder and VAE. gmlx tells the two apart by their weights. Turbo samples on the eight sigmas it was distilled to, and refuses any other step count, on the command diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 9b543a42e..91ac590fe 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -320,6 +320,12 @@ sampler alone. Leave out `--guidance` and `--sampler`, or the request's `guidance` and `sampler`, or set them to 1 and `euler`. FLUX.3 klein Base takes other values of both. +### `distilled DiT samples without guidance: drop guidance ...` + +FLUX.2 klein is distilled to sample without guidance. Leave out +`--guidance`, the request's `guidance` and the entry's +`defaults.guidance`, or set them to 1. FLUX.2 klein Base takes guidance. + ### `gmlx image does not apply` or `is not a ... adapter` The LoRA is of a kind gmlx does not apply, or it was made for another diff --git a/gmlx/commands/image.py b/gmlx/commands/image.py index 380c59de3..5e3499c24 100644 --- a/gmlx/commands/image.py +++ b/gmlx/commands/image.py @@ -659,9 +659,13 @@ def _generate(a) -> int: stride = _stride(fam) refs = _references(a, fam) edit = fam.edit - # A family that sizes a request by its references names that size. - ref_size = (edit.size(refs) if refs and edit is not None - and edit.size is not None else None) + # A family that sizes a request by its references names that size, + # scaled into the image limits. + ref_size = None + if a.size is None and a.init_image is None: + from gmlx.image.registry import edit_size + + ref_size = edit_size(fam, refs, stride) init = crop = None if a.init_image is not None: init = read_image(a.init_image, a.size, stride) @@ -978,8 +982,7 @@ def encode(): return [np.array(f) for f in feats] def schedule(): - token_px = pipe.vae_scale * pipe.dit.cfg.patch - s = pipe.sigmas(steps, (height // token_px) * (width // token_px)) + s = api.image_sigmas(pipe, steps, height, width) shape = (1, pipe.dit.cfg.in_channels, height // pipe.vae_scale, width // pipe.vae_scale) return np.asarray(s, np.float32), make_sampler(sampler, s), shape diff --git a/gmlx/image/api.py b/gmlx/image/api.py index 2a5ad7b1e..2278ac587 100644 --- a/gmlx/image/api.py +++ b/gmlx/image/api.py @@ -98,11 +98,23 @@ def check_steps(family, variant: str, steps: int) -> None: f"distilled to, not {steps}") +def check_guidance(family, variant: str, cfg: float) -> None: + """Refuse guidance on a variant the family declares distilled to + sample without it, naming the variant that takes it.""" + other = family.unguided.get(variant) + if other is not None and cfg != 1.0: + raise ValueError( + f"the {family.title} {variant} DiT samples without guidance: " + f"drop guidance {cfg:g}, or run the {family.title} {other} " + f"checkpoint, which takes guidance") + + def check_sampling(family, variant: str, flow_map: bool, cfg: float, sampler: str = "euler") -> None: - """Refuse guidance and samplers a flow map DiT does not sample with. - ``flow_map`` is the flag of the DiT's config, which its header - gives.""" + """Refuse guidance and samplers a flow map DiT does not sample with, + and guidance on a variant distilled to sample without it. ``flow_map`` + is the flag of the DiT's config, which its header gives.""" + check_guidance(family, variant, cfg) if flow_map and cfg != 1.0: raise ValueError(f"the {family.title} {variant} DiT is a flow map, " f"which samples without guidance: drop cfg {cfg}") @@ -1095,6 +1107,21 @@ def _latent_mask(mask, shape: tuple, scale: int) -> mx.array: return mx.array(m) +def image_tokens(pipe: ImagePipeline, height: int, width: int) -> int: + """The DiT tokens of the image a request makes, without the tokens of + its references.""" + token_px = pipe.vae_scale * pipe.dit.cfg.patch + return (height // token_px) * (width // token_px) + + +def image_sigmas(pipe: ImagePipeline, steps: int, height: int, + width: int) -> np.ndarray: + """The schedule of ``steps`` for an image of ``height`` by ``width``. + A dynamic shift reads the image's own tokens, as the reference + pipelines do, and never those of the references of an edit.""" + return pipe.sigmas(steps, image_tokens(pipe, height, width)) + + def sample(pipe: ImagePipeline, cond: Conditioning, *, neg: Conditioning | None = None, cfg: float | None = None, height: int, width: int, steps: int | None = None, @@ -1131,9 +1158,8 @@ def sample(pipe: ImagePipeline, cond: Conditioning, *, raise ValueError("denoise below 1 and mask need init_latents") if sigmas is None: - token_px = pipe.vae_scale * pipe.dit.cfg.patch - s = pipe.sigmas(pipe.defaults.steps if steps is None else steps, - (height // token_px) * (width // token_px)) + s = image_sigmas(pipe, pipe.defaults.steps if steps is None + else steps, height, width) else: s = check_sigmas(sigmas) if steps is not None and steps != len(s) - 1: diff --git a/gmlx/image/families/flux2_klein/family.py b/gmlx/image/families/flux2_klein/family.py index 1641e25d5..1fb1b5d65 100644 --- a/gmlx/image/families/flux2_klein/family.py +++ b/gmlx/image/families/flux2_klein/family.py @@ -82,6 +82,9 @@ "distilled": SamplingRow(4, 1.0, 1.0, *_BFL), "base": SamplingRow(50, 4.0, 1.0, *_BFL), } +# The distilled checkpoints fix their guidance at 1 in fixed_params, and +# scripts/cli.py refuses any other: Base takes guidance. +UNGUIDED = {"distilled": "base"} # The loop of denoise and denoise_cfg in src/flux2/sampling.py, on the bf16 # noise of scripts/cli.py: the latents, the velocity, its guidance and the @@ -401,6 +404,7 @@ def _size(refs): identity_tensors=IDENTITY_TENSORS, variants=VARIANTS, sampling=SAMPLING, + unguided=UNGUIDED, schedule=schedule, loop=LOOP, edit=EditParts(max_refs=REFERENCES.values["max_refs"], diff --git a/gmlx/image/registry.py b/gmlx/image/registry.py index 5d8b21812..3fe1f1f2d 100644 --- a/gmlx/image/registry.py +++ b/gmlx/image/registry.py @@ -102,7 +102,7 @@ class EditParts: a tuple with ``crop``, the (left, top, right, bottom) box the output is cropped to when the request gives no size, or None. ``size(refs)`` is then the (width, height) of a request with references and no - size of its own. + size of its own, which ``edit_size`` scales into the image limits. """ max_refs: int area: int = 0 @@ -120,6 +120,43 @@ def text_only(self) -> bool: return self.encode is None +# The image limits: the pixels and the longer side of the largest image a +# served request asks for, and of the size an edit without one takes. +MAX_PIXELS = 2048 * 2048 +MAX_SIDE = 4096 + + +def fit_size(width: int, height: int, unit: int) -> tuple: + """(width, height) scaled down at its shape to the largest size in the + image limits, each side floored to a multiple of ``unit``. A side + that floors to nothing is 0.""" + scale = min(1.0, (MAX_PIXELS / (width * height)) ** 0.5, + MAX_SIDE / max(width, height)) + return (int(width * scale) // unit * unit, + int(height * scale) // unit * unit) + + +def edit_size(family, refs, unit: int) -> tuple | None: + """(width, height) of an edit of ``family`` with the prepared ``refs`` + and no size of its own: the size the family gives them, scaled into + the image limits on the ``unit`` grid when it is past them. None for + a family without that rule. Raises ValueError when a side scales to + nothing.""" + edit = family.edit + if not refs or edit is None or edit.size is None: + return None + w, h = edit.size(refs) + if w * h <= MAX_PIXELS and max(w, h) <= MAX_SIDE: + return w, h + fit = fit_size(w, h, unit) + if min(fit) <= 0: + raise ValueError( + f"the first reference sizes the edit at {w}x{h}, which keeps " + f"no side of {unit} pixels in the limit of {MAX_PIXELS} pixels " + f"(2048x2048) and a side of {MAX_SIDE}: give the edit a size") + return fit + + @dataclass(frozen=True) class Family: name: str # "z_image" @@ -137,6 +174,9 @@ class Family: # hash -> why gmlx image refuses a file of known weights refused: dict = field(default_factory=dict) sampling: dict = field(default_factory=dict) # variant -> SamplingRow + # variant -> the variant that takes guidance, for a variant distilled + # to sample without it, which then refuses guidance by name. + unguided: dict = field(default_factory=dict) # The sampling row of a variant without one, such as a file whose # identity matches no row; None leaves it without defaults. unknown_variant: str | None = None diff --git a/gmlx/serve/image_service.py b/gmlx/serve/image_service.py index 308415a3d..bcca99c8e 100644 --- a/gmlx/serve/image_service.py +++ b/gmlx/serve/image_service.py @@ -27,6 +27,9 @@ from dataclasses import dataclass, field from typing import Any +# The largest image a request makes: its pixels and its longer side. +from gmlx.image.registry import MAX_PIXELS, MAX_SIDE + from .subservice import SingleWorker _log = logging.getLogger(__name__) @@ -160,7 +163,8 @@ def entry_plan(spec) -> EntryPlan: model, a family the config does not name, and an entry that cannot hold one image of its default size in the working budget.""" from gmlx.image import memfit - from gmlx.image.api import _header_bytes, check_steps, sampler_defaults + from gmlx.image.api import (_header_bytes, check_guidance, check_steps, + sampler_defaults) from gmlx.image.dtypes import image_activation from gmlx.image.loader import identify_dit @@ -193,6 +197,11 @@ def entry_plan(spec) -> EntryPlan: cfg = (spec.defaults or {}).get("guidance") if cfg is None: cfg = defaults.cfg if defaults is not None else 1.0 + try: + check_guidance(fam, ident.variant, float(cfg)) + except ValueError as e: + raise ImageModelError( + f"image model {spec.id!r}: defaults.guidance: {e}") from None act = image_activation(fam.name) tensor_cache, adapter_cache = cache_bytes() own = [2 * os.path.getsize(p) for p, _ in spec.adapters] @@ -469,9 +478,6 @@ def release_on_worker(box: list) -> None: MAX_N = 10 MAX_PARTIALS = 3 MAX_REFS = 16 -# The largest image a request makes: its pixels and its longer side. -MAX_PIXELS = 2048 * 2048 -MAX_SIDE = 4096 # Model names an OpenAI client sends that mean the default image model. _ALIAS_PREFIXES = ("gpt-image-", "dall-e-", "chatgpt-image") # Accepted and ignored, with one warning line. @@ -949,7 +955,10 @@ def _stride(pipe) -> int: def target_size(req: ImageRequest, served: ServedImage) -> tuple: """(width, height) of the request: its size, else the size the family gives its prepared references, else the first image's for an edit or - a variation, else the entry's default.""" + a variation, else the entry's default. A size the request does not + give is scaled into the image limits.""" + from gmlx.image.registry import edit_size + pipe = served.pipe unit = _stride(pipe) if req.size is not None: @@ -959,14 +968,12 @@ def target_size(req: ImageRequest, served: ServedImage) -> tuple: f"of {unit}", "size") return w, h if req.refs and req.mask is None and pipe.family.edit.size is not None: - w, h = pipe.family.edit.size(req.refs) - # Several references are each kept at their own shape, so a thin - # first one can give a size past the limits of a size asked for. - if not _in_limits((w, h)): - raise _bad(f"the first image sizes the request at {w}x{h}, over " - f"the limit of {MAX_PIXELS} pixels (2048x2048) and a " - f"side of {MAX_SIDE}: pass a size", "size") - return w, h + # Each reference of a request can keep its own shape, so a thin + # first one gives a size that is scaled into the limits. + try: + return edit_size(pipe.family, req.refs, unit) + except ValueError as e: + raise _bad(str(e), "size") from None if req.images: h, w = req.images[0].shape[:2] # A large image gives the largest size of its shape in the limits. @@ -1000,10 +1007,11 @@ def check_family(req: ImageRequest, served: ServedImage) -> None: """Refuse what the family cannot do: transparency without an alpha VAE, a step count other than the one a variant with a fixed schedule runs, more images than an edit takes, and edits without a vision - tower. The references of a family that prepares them together are - prepared here into ``req.refs``, and an image its rules refuse gets - a 400 that names it.""" - from gmlx.image.api import fixed_steps + tower, and guidance on a variant distilled to sample without it. The + references of a family that prepares them together are prepared here + into ``req.refs``, and an image its rules refuse gets a 400 that + names it.""" + from gmlx.image.api import check_guidance, fixed_steps pipe = served.pipe fam = pipe.family @@ -1011,6 +1019,11 @@ def check_family(req: ImageRequest, served: ServedImage) -> None: if n is not None and req.steps is not None and req.steps != n: raise _bad(f"steps: {fam.title} {pipe.variant} runs {n} steps, the " f"schedule it was distilled to, not {req.steps}", "steps") + if pipe.variant in fam.unguided: + try: + check_guidance(fam, pipe.variant, _guided(req, served)) + except ValueError as e: + raise _bad(f"guidance: {e}", "guidance") from None if req.background == "transparent": from gmlx.image.vae.reader import VAES @@ -1426,8 +1439,7 @@ def should_stop() -> bool: timeout_s and time.monotonic() - last[0] > timeout_s) denoise = 1.0 if strength is None else float(strength) - token_px = pipe.vae_scale * pipe.dit.cfg.patch - sigmas = pipe.sigmas(steps, (height // token_px) * (width // token_px)) + sigmas = api.image_sigmas(pipe, steps, height, width) if init_latents is not None: sigmas = sigmas[img2img_start(len(sigmas) - 1, denoise):] run_steps = len(sigmas) - 1 @@ -1497,7 +1509,7 @@ def on_step(i, x, _prev=prev, _pi=partial_index): del x mx.clear_cache() - tokens = (height // token_px) * (width // token_px) + tokens = api.image_tokens(pipe, height, width) text_tokens = int(cond.features.shape[0]) - len(cond.image_slots) + ( 0 if neg is None else int(neg.features.shape[0]) - len(neg.image_slots)) image_tokens = 0 diff --git a/tests/image/test_image_cli.py b/tests/image/test_image_cli.py index b25282191..bdf327924 100644 --- a/tests/image/test_image_cli.py +++ b/tests/image/test_image_cli.py @@ -1781,3 +1781,128 @@ def test_the_preflight_counts_the_mmproj_and_the_references(monkeypatch): assert re.search(r"; the largest that fit are \d of the 2 reference " r"images at this reference area, or all 2 at a " r"reference area of \d+ x \d+ px\. ", str(e.value)) + + +# FLUX.2 klein. + +@pytest.fixture +def flux2_edit(env, monkeypatch, tmp_path): + """The env on the FLUX.2 klein family, of the variant ``env.variant`` + names, over a DiT that reads the references and keeps the prompt + tokens and the reference count of each row it runs. A reference's + latents are zeros of its token grid.""" + import dataclasses + + state = _edit_env(env, monkeypatch, tmp_path, + get_family("flux2_klein").edit) + fam = get_family("flux2_klein") + state.rows = [] + + class Dit: + cfg = SimpleNamespace(in_channels=4, patch=1, flow_map=False) + act_dtype = mx.float32 + + def references(self, latents): + return [np.array(z) for z in latents] + + def __call__(self, latents, sigma, cap_feats, refs=None): + state.rows.append((int(cap_feats.shape[1]), + 0 if refs is None else len(refs))) + return mx.zeros_like(latents) + + def load(dit, *, text_encoder=None, vae=None, mmproj=None, log=print, + **kw): + state.loads.append(mmproj) + pipe = api.ImagePipeline(dit=Dit(), family=fam, variant=state.variant, + encoder=_OwnedEncoder(), vae=object(), + load_seconds={"dit": 0.0}, log=log) + pipe.decoded, pipe.encoded_images = [], [] + state.pipes.append(pipe) + return pipe + + def encode_references(pipe, cond, *, plan=None): + state.calls.append(("vae", cond.refs, plan, pipe.encoder.released)) + return dataclasses.replace(cond, ref_latents=tuple( + mx.zeros((4, r.height // 16, r.width // 16)) for r in cond.refs)) + + def decode(pipe, x, tiled=None, alpha=False, plan=None): + b, _, h, w = x.shape + return mx.zeros((b, h * 16, w * 16, 3)) + + view = state.view = SimpleNamespace(tensors={}) + monkeypatch.setattr(api, "load", load) + monkeypatch.setattr(api, "encode_references", encode_references) + monkeypatch.setattr(api, "vae_decode", decode) + monkeypatch.setattr(image_preflight, "identify_dit", + lambda p, **k: SimpleNamespace(family=fam, view=view, + variant=state.variant, + config={})) + state.variant = "distilled" + return state + + +@pytest.mark.parametrize("command", ["generate", "bench"]) +def test_a_distilled_flux2_dit_refuses_guidance_before_the_loads( + flux2_edit, tmp_path, capsys, command): + """BFL fixes the guidance of the distilled checkpoints at 1, and the + refusal names Base as the checkpoint that takes guidance, before the + memory preflight and before any file loads.""" + if command == "generate": + args = flux2_edit.base + ["--prompt", "p", "--size", "32x32", + "--output", str(tmp_path / "a.png")] + else: + args = ["image", "bench"] + flux2_edit.base[2:] + ["--sizes", + "32x32"] + assert umbrella_main(args + ["--guidance", "4"]) == 1 + assert ("the FLUX.2 klein distilled DiT samples without guidance: drop " + "guidance 4, or run the FLUX.2 klein base checkpoint, which " + "takes guidance") in capsys.readouterr().err + assert flux2_edit.checks == [] and flux2_edit.pipes == [] + assert umbrella_main(args + ["--guidance", "1"]) == 0 + flux2_edit.variant = "base" + assert umbrella_main(args + ["--guidance", "4"]) == 0 + + +def test_both_rows_of_a_guided_flux2_base_edit_take_the_references( + flux2_edit, tmp_path): + """Base guides the prompt's row by the empty prompt's, and each row of + every step runs with the references, as the reference's denoise_cfg + gives img_cond_seq to both.""" + flux2_edit.variant = "base" + assert umbrella_main(flux2_edit.base + [ + "--prompt", "make it red", "--negative-prompt", "blurry", "--size", + "32x32", "--steps", "3", "--ref", flux2_edit.refs[0], "--output", + str(tmp_path / "o.png")]) == 0 + refs = flux2_edit.calls[0][2] + assert len(refs) == 1 + assert [c[:3] for c in flux2_edit.calls] == [ + ("encode", "make it red", refs), ("encode", "blurry", refs), + ("vae", refs, flux2_edit.plan), ("vae", refs, flux2_edit.plan)] + # The prompt's row and the negative prompt's, each with the reference. + assert flux2_edit.rows == [(11, 1), (6, 1)] * 3 + + +@pytest.mark.parametrize("family, sizes, want", [ + ("flux2_klein", [(5000, 625)], "4096x512"), + ("flux2_klein", [(512, 64)], "512x64"), + ("flux3_klein", [(8192, 128), (512, 512)], "4096x64")]) +def test_an_unsized_edit_scales_a_thin_first_reference_into_the_limits( + env, monkeypatch, tmp_path, capsys, family, sizes, want): + """The size the first prepared reference gives an edit without one is + scaled into the limits of a served request, as serve scales it. A + size given is kept.""" + from PIL import Image + + e = _edit_env(env, monkeypatch, tmp_path, get_family(family).edit) + refs = [] + for i, (w, h) in enumerate(sizes): + p = tmp_path / f"r{i}.png" + Image.fromarray(np.zeros((h, w, 3), np.uint8)).save(p) + refs += ["--ref", str(p)] + args = e.base + ["--prompt", "p", *refs, "--output", + str(tmp_path / "o.png"), "--json"] + assert umbrella_main(args) == 0 + rec = json.loads(capsys.readouterr().out) + assert rec["settings"]["size"] == want + assert umbrella_main(args + ["--size", "64x48"]) == 0 + assert json.loads(capsys.readouterr().out)["settings"]["size"] == "64x48" diff --git a/tests/image/test_image_flux2_edit.py b/tests/image/test_image_flux2_edit.py index af233b5d0..40d31dc86 100644 --- a/tests/image/test_image_flux2_edit.py +++ b/tests/image/test_image_flux2_edit.py @@ -2,12 +2,14 @@ crop of the reference's encode_image_refs, the refusals, and the conditioning a pipeline makes of a prompt with references, whose encoder reads the prompt alone and whose references reach the DiT as VAE latents -in bf16. CPU tier.""" +in bf16, normalized by the VAE's batch norm. The schedule of an edit +counts the image's tokens alone. CPU tier.""" from __future__ import annotations import dataclasses import io import math +from types import SimpleNamespace import mlx.core as mx import numpy as np @@ -16,6 +18,7 @@ from test_image_flux3_edit import _RefDit, _Vae from gmlx.image import api +from gmlx.image.conditioning import Conditioning from gmlx.image.families.flux2_klein import edit from gmlx.image.families.flux2_klein import family as ff from gmlx.image.families.flux2_klein import model as fm @@ -205,3 +208,87 @@ def test_references_take_no_area_and_prepared_ones_pass_through(pipe): api.references(pipe, [a], area=512 * 512) with pytest.raises(ValueError, match="at most 10 reference images"): api.references(pipe, [a] * 11) + + +class _Rows: + """A zero velocity that keeps the sigma and the reference count of + each row it runs.""" + + def __init__(self): + self.cfg = SimpleNamespace(in_channels=4, patch=1, flow_map=False) + self.act_dtype = mx.float32 + self.rows = [] + + def references(self, latents): + return [np.array(z) for z in latents] + + def __call__(self, latents, sigma, cap_feats, refs=None): + self.rows.append((float(np.asarray(sigma)[0]), + 0 if refs is None else len(refs))) + return mx.zeros_like(latents) + + +def test_the_schedule_of_an_edit_counts_the_image_tokens_alone(): + """get_schedule reads the image's tokens, as the reference's + denoise does, and never the tokens of its references.""" + fam = get_family("flux2_klein") + dit = _Rows() + pipe = api.ImagePipeline(dit=dit, family=fam, variant="distilled") + ref = mx.zeros((4, 64, 64)) + cond = Conditioning(mx.zeros((3, 4)), ref_latents=(ref,)) + with mx.stream(mx.cpu): + api.sample(pipe, cond, height=256, width=256, steps=4, seed=0) + image = fam.schedule(4, tokens=16 * 16) + counted = fam.schedule(4, tokens=16 * 16 + 64 * 64) + assert not np.allclose(image, counted) + assert [s for s, _ in dit.rows] == [float(s) for s in image[:-1]] + assert {n for _, n in dit.rows} == {1} + assert np.array_equal(api.image_sigmas(pipe, 4, 256, 256), image) + + +def _tiny_flux2_vae(): + """A tiny FLUX.2 autoencoder on its initial weights, in float32, with + batch norm statistics far from 0 and 1.""" + from gmlx.image.vae import flux2_ae + + vae = flux2_ae.Flux2AE(flux2_ae.Flux2AEConfig( + in_channels=3, out_channels=3, latent_channels=8, + block_out_channels=(32, 64), layers_per_block=1, + norm_num_groups=32, eps=1e-6)) + rng = np.random.default_rng(5) + n = vae.config.model_channels + vae.bn.running_mean = mx.array(rng.standard_normal(n), mx.float32) + vae.bn.running_var = mx.array(rng.uniform(0.5, 2.0, n), mx.float32) + return vae + + +def test_reference_latents_are_normalized_by_the_batch_norm(monkeypatch): + """A reference's latents are the mean of the encode, patchified 2 x 2 + channel first and normalized by the batch norm statistics, as the + reference's encode does, and not the patchified mean alone.""" + from gmlx.image.vae import tiling + + monkeypatch.setattr(tiling, "_plan", lambda *a, **k: False) + vae = _tiny_flux2_vae() + pipe = api.ImagePipeline(dit=_Rows(), family=get_family("flux2_klein"), + variant="distilled", vae=vae) + (ref,) = edit.prepare([_picture(96, 64, 7)]) + cond = Conditioning(mx.zeros((3, 4)), refs=(ref,)) + with mx.stream(mx.cpu): + (got,) = api.encode_references(pipe, cond).ref_latents + x = mx.array(ref.pixels[..., :3].astype(np.float32) / 255.0)[None] + mean, _ = vae.encode(x * 2 - 1) + mx.eval(got, mean) + m = np.array(mean.astype(mx.float32)) + b, hh, ww, c = m.shape + patched = (m.reshape(b, hh // 2, 2, ww // 2, 2, c) + .transpose(0, 5, 2, 4, 1, 3) + .reshape(b, c * 4, hh // 2, ww // 2))[0] + mu = np.array(vae.bn.running_mean)[:, None, None] + sd = np.sqrt(np.array(vae.bn.running_var) + vae.config.bn_eps)[:, None, + None] + want = (patched - mu) / sd + got = np.array(got) + assert got.shape == want.shape == (32, 64 // 4, 96 // 4) + assert np.allclose(got, want, rtol=1e-5, atol=1e-5) + assert not np.allclose(got, patched, atol=0.1) diff --git a/tests/serve/test_image_job.py b/tests/serve/test_image_job.py index 5f96567ba..eb86db9b9 100644 --- a/tests/serve/test_image_job.py +++ b/tests/serve/test_image_job.py @@ -1,7 +1,9 @@ #!/usr/bin/env python3 """The image job of the serve routes over a stub pipeline: the stop event -ends the sampler, and each image of a request takes its own seed. The -sampler and the VAE are stubs, so nothing heavy runs.""" +ends the sampler, and each image of a request takes its own seed. An +edit's schedule counts the image's tokens alone, and the negative row of +a guided edit takes the references. The sampler and the VAE are stubs, +so nothing heavy runs.""" from __future__ import annotations import json @@ -192,3 +194,84 @@ def vae_decode(pipe, x, *, alpha, plan): assert im.size == want # The metadata records the size written, not the canvas. assert json.loads(im.text["gmlx"])["size"] == "%dx%d" % want + + +def _flux2_job(monkeypatch, variant, fields, shape=(256, 256, 3)): + """A FLUX.2 klein edit of one image through check_family, target_size + and the job, with the encode of the serve path and stub primitives + under it. Returns the sizes the schedule was asked for, the encodes, + and the conditionings the sampler got.""" + import dataclasses + + import numpy as np + + from gmlx.image.conditioning import Conditioning + + rec = SimpleNamespace(sigmas=[], encoded=[], sampled=[]) + served = _served() + pipe = served.pipe + pipe.family = get_family("flux2_klein") + pipe.variant = variant + pipe.size_multiple = 16 + pipe.vae_scale, pipe.dit.cfg.patch = 16, 1 + pipe.sigmas = lambda steps, n: rec.sigmas.append((steps, n)) or [ + 1.0 - i / steps for i in range(steps + 1)] + served.spec.encoder_mmproj = None + served.plan.cfg = 4.0 if variant == "base" else 1.0 + + def encode_text(pipe, prompt, *, images=(), ref_latents=True): + rec.encoded.append((prompt, tuple(images))) + return Conditioning(mx.zeros((5, 4)), refs=tuple(images)) + + def encode_references(pipe, c, plan=None): + return dataclasses.replace(c, ref_latents=tuple( + mx.zeros((128, r.height // 16, r.width // 16)) for r in c.refs)) + + def sample(pipe, cond, *, neg, cfg, height, width, seed, steps, + should_stop, on_step, **kw): + rec.sampled.append((cond, neg, cfg)) + return mx.zeros((1, 128, height // 16, width // 16)) + + monkeypatch.setattr(api, "encode_text", encode_text) + monkeypatch.setattr(api, "encode_references", encode_references) + monkeypatch.setattr(api, "sample", sample) + monkeypatch.setattr(api, "plan_request", + lambda *a, **k: SimpleNamespace(release_encoder=False)) + monkeypatch.setattr(api, "vae_decode", lambda pipe, x, *, alpha, plan: + mx.zeros((1, x.shape[2] * 16, x.shape[3] * 16, 3))) + req = svc.parse_request("edits", fields) + req.images = [np.full(shape, 9, np.uint8)] + svc.check_family(req, served) + size = svc.target_size(req, served) + out = svc.run_job(served, req, size=size, budget=None, + stop=threading.Event()) + return rec, req, size, out + + +def test_a_flux2_edit_schedules_by_the_image_tokens_alone(monkeypatch): + """A 256 x 256 reference holds 256 tokens beside the 16 of a 64 x 64 + image: the schedule reads the 16.""" + rec, req, size, out = _flux2_job( + monkeypatch, "distilled", {"prompt": "make it red", "size": "64x64", + "steps": "4"}) + assert size == (64, 64) + (cond, _, _), = rec.sampled + assert [z.shape for z in cond.ref_latents] == [(128, 16, 16)] + assert rec.sigmas == [(4, 16)] + assert out.usage["output_tokens"] == 16 + + +def test_the_negative_row_of_a_guided_flux2_base_edit_takes_the_references( + monkeypatch): + """Base guides the prompt's row by the empty prompt's, and both rows + carry the references, as the reference's denoise_cfg gives img_cond_seq + to both.""" + rec, req, _, _ = _flux2_job(monkeypatch, "base", + {"prompt": "make it red"}) + refs = tuple(req.refs) + assert rec.encoded == [("make it red", refs), ("", refs)] + (cond, neg, cfg), = rec.sampled + assert cfg == 4.0 and neg is not None + assert neg.refs == cond.refs == refs + assert [z.shape for z in neg.ref_latents] == [ + z.shape for z in cond.ref_latents] == [(128, 16, 16)] diff --git a/tests/serve/test_image_service.py b/tests/serve/test_image_service.py index f559208ef..ffaf599c0 100644 --- a/tests/serve/test_image_service.py +++ b/tests/serve/test_image_service.py @@ -347,6 +347,52 @@ def test_a_request_on_turbo_takes_only_its_own_step_count(variant, steps, assert e.value.param == "steps" +@pytest.mark.parametrize("variant,guidance,default,refused", [ + ("distilled", None, 1.0, False), ("distilled", 1.0, 1.0, False), + ("distilled", 4.0, 1.0, True), ("distilled", None, 4.0, True), + ("base", 4.0, 4.0, False), ("base", None, 1.0, False)]) +def test_a_distilled_flux2_request_refuses_guidance(variant, guidance, + default, refused): + from gmlx.image.registry import get_family + + fam = get_family("flux2_klein") + served = SimpleNamespace(pipe=SimpleNamespace(family=fam, variant=variant), + spec=SimpleNamespace(id="f2"), + plan=SimpleNamespace(cfg=default)) + req = image_service.parse_request("generations", { + "prompt": "p", **({} if guidance is None else {"guidance": guidance})}) + if not refused: + image_service.check_family(req, served) + return + with pytest.raises(image_service.ImageRequestError) as e: + image_service.check_family(req, served) + assert e.value.param == "guidance" and e.value.status == 400 + assert str(e.value) == ( + "guidance: the FLUX.2 klein distilled DiT samples without guidance: " + f"drop guidance {guidance or default:g}, or run the FLUX.2 klein " + "base checkpoint, which takes guidance") + + +def test_a_distilled_flux2_entry_refuses_a_guidance_default(plan_stubs, + monkeypatch): + from gmlx.image import loader + from gmlx.image.fingerprint import ImageModelError + from gmlx.image.registry import get_family + + fam = get_family("flux2_klein") + for variant in ("distilled", "base"): + monkeypatch.setattr(loader, "identify_dit", lambda path, _v=variant, + **k: SimpleNamespace(family=fam, variant=_v)) + assert image_service.entry_plan(_spec(defaults={"guidance": 1.0})) + assert image_service.entry_plan(_spec(defaults={"guidance": 4.0})) + monkeypatch.setattr(loader, "identify_dit", lambda path, **k: + SimpleNamespace(family=fam, variant="distilled")) + with pytest.raises(ImageModelError, match="defaults.guidance: the FLUX.2 " + "klein distilled DiT samples without guidance: drop " + "guidance 4, or run the FLUX.2 klein base checkpoint"): + image_service.entry_plan(_spec(defaults={"guidance": 4.0})) + + def test_an_entry_books_both_caches_at_twice_their_bound(plan_stubs, monkeypatch): from gmlx.image import memfit @@ -858,12 +904,33 @@ def test_several_flux3_references_are_cropped_and_the_first_sizes_it(): assert image_service.target_size(req, served) == (96, 64) -@pytest.mark.parametrize("width, refused", [(4096, False), (4112, True), - (20000, True)]) -def test_a_thin_first_flux3_reference_meets_the_side_limit(width, refused): - """Each of several references keeps its shape, so the size the first - gives a request without one is held to the limits of a size asked - for.""" +@pytest.mark.parametrize("family, images, ref, want", [ + ("flux3_klein", [(128, 8192), (512, 512)], (8192, 128), (4096, 64)), + ("flux3_klein", [(30, 4096), (512, 512)], (4096, 16), (4096, 16)), + ("flux2_klein", [(625, 5000)], (4992, 624), (4096, 512)), + ("flux2_klein", [(64, 512)], (512, 64), (512, 64))]) +def test_an_unsized_edit_scales_a_thin_first_reference_into_the_limits( + family, images, ref, want): + """Each reference can keep its shape, so the size the first gives a + request without one is scaled into the limits of a size asked for, + as the first image of a family without that rule is. A size the + request gives is kept.""" + import numpy as np + + served = _edit_served(family, mmproj=False) + req = _edit_req(1) + req.images = [np.zeros(s + (3,), np.uint8) for s in images] + image_service.check_family(req, served) + assert (req.refs[0].width, req.refs[0].height) == ref + assert image_service.target_size(req, served) == want + sized = _edit_req(1, size="512x512") + sized.images = req.images + image_service.check_family(sized, served) + assert image_service.target_size(sized, served) == (512, 512) + + +@pytest.mark.parametrize("width", [4112, 20000]) +def test_a_first_reference_too_thin_to_scale_is_refused(width): import numpy as np served = _edit_served("flux3_klein", mmproj=False) @@ -872,18 +939,23 @@ def test_a_thin_first_flux3_reference_meets_the_side_limit(width, refused): np.zeros((512, 512, 3), np.uint8)] image_service.check_family(req, served) assert (req.refs[0].width, req.refs[0].height) == (width, 16) - if not refused: - assert image_service.target_size(req, served) == (width, 16) - return with pytest.raises(image_service.ImageRequestError, - match=f"the first image sizes the request at " - f"{width}x16, over the limit") as e: + match=f"the first reference sizes the edit at " + f"{width}x16, which keeps no side of 16 " + f"pixels") as e: image_service.target_size(req, served) assert e.value.param == "size" and e.value.status == 400 - sized = _edit_req(1, size="512x512") - sized.images = req.images - image_service.check_family(sized, served) - assert image_service.target_size(sized, served) == (512, 512) + + +def test_the_canvas_of_one_padded_flux3_reference_is_in_the_limits(): + """The output of one padded reference is cropped by a box on its + canvas, so the canvas is never scaled: its rule keeps it in the + limits.""" + from gmlx.image.families.flux3_klein.family import REFERENCES + from gmlx.image.registry import MAX_PIXELS, MAX_SIDE + + r = REFERENCES.values + assert r["match_max_pixels"] <= MAX_PIXELS and r["max_side"] <= MAX_SIDE def test_a_flux3_reference_the_rules_refuse_is_named(): From f3bae8370ae6f0d1c9cf684a9d4a443796f27b23 Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 10:45:14 -0700 Subject: [PATCH 021/101] fix(serve): a streamed image job refused while it runs gets the error of the plain path, and a flux3 klein flow map refuses guidance before its job --- CHANGELOG.md | 2 + gmlx/serve/image_service.py | 18 ++++-- gmlx/serve/patches/images.py | 48 ++++++++++---- tests/serve/test_image_routes.py | 100 ++++++++++++++++++++++++++++++ tests/serve/test_image_service.py | 38 ++++++++++++ 5 files changed, 190 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 110477aff..d437b1a0a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,8 @@ adhere to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ### Fixed +- A streamed image request refused while it ran, such as one too large for + memory, got a server error frame where the same request unstreamed got a 400. - A DFlash drafter that took speculation back up after a batch shrank within the width cap drafted from stale context, so almost no draft was accepted. - A sampled request whose structured output allowed fewer tokens than its diff --git a/gmlx/serve/image_service.py b/gmlx/serve/image_service.py index bcca99c8e..9a1ec4a9b 100644 --- a/gmlx/serve/image_service.py +++ b/gmlx/serve/image_service.py @@ -1007,11 +1007,13 @@ def check_family(req: ImageRequest, served: ServedImage) -> None: """Refuse what the family cannot do: transparency without an alpha VAE, a step count other than the one a variant with a fixed schedule runs, more images than an edit takes, and edits without a vision - tower, and guidance on a variant distilled to sample without it. The + tower, and guidance on a variant distilled to sample without it or on + a flow map DiT, and a flow map's sampler other than euler, the rules + of ``api.check_sampling``, which ``api.sample`` holds too. The references of a family that prepares them together are prepared here into ``req.refs``, and an image its rules refuse gets a 400 that names it.""" - from gmlx.image.api import check_guidance, fixed_steps + from gmlx.image.api import check_sampling, fixed_steps pipe = served.pipe fam = pipe.family @@ -1019,11 +1021,19 @@ def check_family(req: ImageRequest, served: ServedImage) -> None: if n is not None and req.steps is not None and req.steps != n: raise _bad(f"steps: {fam.title} {pipe.variant} runs {n} steps, the " f"schedule it was distilled to, not {req.steps}", "steps") - if pipe.variant in fam.unguided: + dit_cfg = getattr(getattr(pipe, "dit", None), "cfg", None) + flow_map = bool(getattr(dit_cfg, "flow_map", False)) + if flow_map or pipe.variant in fam.unguided: try: - check_guidance(fam, pipe.variant, _guided(req, served)) + check_sampling(fam, pipe.variant, flow_map, _guided(req, served)) except ValueError as e: raise _bad(f"guidance: {e}", "guidance") from None + defaults = getattr(served.spec, "defaults", None) or {} + sampler = req.sampler or defaults.get("sampler") or "euler" + try: + check_sampling(fam, pipe.variant, flow_map, 1.0, sampler) + except ValueError as e: + raise _bad(f"sampler: {e}", "sampler") from None if req.background == "transparent": from gmlx.image.vae.reader import VAES diff --git a/gmlx/serve/patches/images.py b/gmlx/serve/patches/images.py index 9235af54c..abd76450e 100644 --- a/gmlx/serve/patches/images.py +++ b/gmlx/serve/patches/images.py @@ -562,6 +562,8 @@ def settle(f): finish("timeout" if e.timed_out else "cancelled") elif isinstance(e, ImageRequestError): finish("refused", error=str(e)) + elif (refusal := _job_refusal(e)) is not None: + finish("refused", error=refusal[2]) else: _log.error("%s: image job failed", path, exc_info=e) finish("failed", error=type(e).__name__) @@ -603,13 +605,7 @@ async def stream(): "type": "timeout", "message": "the image job timed out"}}) return except Exception as e: # noqa: BLE001 - an error frame, then close - status = 400 if isinstance(e, ImageRequestError) else 500 - yield _sse("error", {"error": { - "type": ("invalid_request_error" if status == 400 - else "server_error"), - "message": (str(e) if status == 400 else - f"{path} failed ({type(e).__name__}); " - "see the server log")}}) + yield _sse("error", _stream_error(path, e)) return body = {"type": f"{event_prefix}.completed", "created_at": int(time.time()), "usage": result.usage, @@ -643,22 +639,50 @@ def _retrieved(f) -> None: f.exception() -def _job_failure(path: str, e: Exception, finish) -> JSONResponse: +def _job_refusal(e: Exception) -> tuple | None: + """``(message, param, logged error)`` of an error a job raised that + refuses the request, which both paths answer as a 400, or None for a + job that failed.""" from gmlx.image.memfit import ImageMemoryError if isinstance(e, ImageMemoryError): - finish("refused", error="ImageMemoryError") - return _error(path, 400, str(e), param="size") + return str(e), "size", "ImageMemoryError" if isinstance(e, ValueError): # The primitives refuse a request they cannot run by name. - finish("refused", error=str(e)) - return _error(path, 400, str(e)) + return str(e), None, str(e) + return None + + +def _job_failure(path: str, e: Exception, finish) -> JSONResponse: + refusal = _job_refusal(e) + if refusal is not None: + message, param, logged = refusal + finish("refused", error=logged) + return _error(path, 400, message, param=param) finish("failed", error=type(e).__name__) _log.error("%s: image job failed", path, exc_info=e) return _error(path, 500, f"{path} failed ({type(e).__name__}); see the " "server log", err_type="server_error") +def _stream_error(path: str, e: Exception) -> dict: + """The error frame of a streamed job that raised ``e``: the error the + non-streamed path answers with.""" + from ..image_service import ImageRequestError + + if isinstance(e, ImageRequestError): + return _error_content(path, e.status, e.err_type, str(e), + param=e.param, code=e.code) + refusal = _job_refusal(e) + if refusal is not None: + message, param, _ = refusal + return _error_content(path, 400, "invalid_request_error", message, + param=param, code=None) + return _error_content(path, 500, "server_error", + f"{path} failed ({type(e).__name__}); see the " + "server log", param=None, code=None) + + async def file_endpoint(name: str): from ..image_service import mime_type diff --git a/tests/serve/test_image_routes.py b/tests/serve/test_image_routes.py index e1b4282f8..9657684ee 100644 --- a/tests/serve/test_image_routes.py +++ b/tests/serve/test_image_routes.py @@ -57,6 +57,7 @@ def release(self): _SERVED = SimpleNamespace(spec=SimpleNamespace(id="zit", encoder_model=None), pipe=None) +_REAL_CHECK_FAMILY = svc.check_family @pytest.fixture @@ -279,6 +280,105 @@ def test_a_generations_form_is_refused(served): assert r.status_code == 400 +def _frames(text: str) -> list: + out = [] + for f in (f for f in text.split("\n\n") if f.strip()): + head, data = f.splitlines()[:2] + out.append((head.removeprefix("event: "), + json.loads(data.removeprefix("data: ")))) + return out + + +@pytest.mark.parametrize("stream", [False, True]) +def test_a_flux3_flow_map_with_guidance_is_a_400_before_any_stream( + served, monkeypatch, stream): + """check_family refuses guidance on a flow map DiT, so the streamed + request gets the same 400 as the plain one, before the stream opens + and before the job.""" + from gmlx.image.registry import get_family + + flux3 = SimpleNamespace( + spec=SimpleNamespace(id="zit", encoder_model=None, defaults={}), + pipe=SimpleNamespace(family=get_family("flux3_klein"), + variant="distilled", + dit=SimpleNamespace(cfg=SimpleNamespace( + flow_map=True))), + plan=SimpleNamespace(cfg=1.0)) + hold = _Hold(served.released) + hold._entry = SimpleNamespace(footprint=0, pipeline=flux3) + monkeypatch.setattr(residency, "acquire_image_model", lambda m: hold) + monkeypatch.setattr(svc, "check_family", _REAL_CHECK_FAMILY) + images.install_image_routes(build_config(_DOC)) + r = _client().post("/v1/images/generations", json={ + "prompt": "x", "guidance": 3.5, "stream": stream}) + assert r.status_code == 400, r.text + assert r.headers["content-type"].startswith("application/json") + err = r.json()["error"] + assert err["type"] == "invalid_request_error" + assert err["param"] == "guidance" + assert "flow map, which samples without guidance" in err["message"] + assert served.jobs == [] and served.released == [1] + + +@pytest.mark.parametrize("raised, param", [ + (ValueError("the DiT is a flow map, which samples without guidance"), + None), ("memory", "size")]) +def test_a_refusal_raised_in_a_streamed_job_is_the_plain_paths_400( + served, monkeypatch, caplog, capsys, raised, param): + """api.sample's own refusal, or a plan that does not fit, raised inside + the job: the stream's error frame is the body the plain request gets + as its 400, and the job is logged as refused, not failed.""" + from gmlx.image.memfit import ImageMemoryError + + if raised == "memory": + raised = ImageMemoryError("the image needs 9 GiB of 4") + monkeypatch.setattr(images.STATE, "counts", dict.fromkeys( + ("jobs", "failed", "cancelled", "images", "steps"), 0)) + served.job = lambda req, kw: (_ for _ in ()).throw(raised) + plain = _client().post("/v1/images/generations", json={"prompt": "x"}) + assert plain.status_code == 400 + capsys.readouterr() + with caplog.at_level(logging.INFO): + r = _client().post("/v1/images/generations", + json={"prompt": "x", "stream": True}) + assert r.status_code == 200 + assert _frames(r.text) == [("error", plain.json())] + assert plain.json()["error"] == { + "type": "invalid_request_error", "message": str(raised), + "param": param, "code": None} + assert images.STATE.metrics()["jobs_failed_total"] == 0 + assert not [rec for rec in caplog.records if rec.levelno >= logging.ERROR] + line = [ln for ln in capsys.readouterr().out.splitlines() + if ln.startswith("[req]")] + assert len(line) == 1 and " refused " in line[0], line + assert served.released == [1, 1] + + +def test_a_failed_streamed_job_is_the_plain_paths_500(served, monkeypatch): + monkeypatch.setattr(images.STATE, "counts", dict.fromkeys( + ("jobs", "failed", "cancelled", "images", "steps"), 0)) + served.job = lambda req, kw: (_ for _ in ()).throw(RuntimeError("boom")) + plain = _client().post("/v1/images/generations", json={"prompt": "x"}) + r = _client().post("/v1/images/generations", + json={"prompt": "x", "stream": True}) + assert plain.status_code == 500 and r.status_code == 200 + assert _frames(r.text) == [("error", plain.json())] + assert plain.json()["error"]["type"] == "server_error" + assert "boom" not in r.text + assert images.STATE.metrics()["jobs_failed_total"] == 2 + + +def test_a_request_error_raised_in_a_streamed_job_keeps_its_type(served): + served.job = lambda req, kw: (_ for _ in ()).throw(svc._bad( + "the shared encoder is not loaded", "model", err_type="server_error")) + plain = _client().post("/v1/images/generations", json={"prompt": "x"}) + r = _client().post("/v1/images/generations", + json={"prompt": "x", "stream": True}) + assert _frames(r.text) == [("error", plain.json())] + assert plain.json()["error"]["type"] == "server_error" + assert plain.json()["error"]["param"] == "model" + + def test_a_cancelled_job_answers_499_and_a_timeout_504(served): served.job = lambda req, kw: (_ for _ in ()).throw(svc.JobStopped(False)) assert _client().post("/v1/images/generations", diff --git a/tests/serve/test_image_service.py b/tests/serve/test_image_service.py index ffaf599c0..44f0a7433 100644 --- a/tests/serve/test_image_service.py +++ b/tests/serve/test_image_service.py @@ -373,6 +373,44 @@ def test_a_distilled_flux2_request_refuses_guidance(variant, guidance, "base checkpoint, which takes guidance") +def _flux3_served(flow_map: bool, cfg: float = 1.0, defaults=None): + from gmlx.image.registry import get_family + + return SimpleNamespace( + pipe=SimpleNamespace( + family=get_family("flux3_klein"), + variant="distilled" if flow_map else "base", + dit=SimpleNamespace(cfg=SimpleNamespace(flow_map=flow_map))), + spec=SimpleNamespace(id="f3", defaults=defaults), + plan=SimpleNamespace(cfg=cfg)) + + +@pytest.mark.parametrize("fields,default,param", [ + ({"guidance": 3.5}, 1.0, "guidance"), ({}, 3.5, "guidance"), + ({"sampler": "uni_pc_bh2"}, 1.0, "sampler")]) +def test_a_flux3_flow_map_request_is_refused_before_its_job(fields, default, + param): + """The rules api.sample holds for a flow map DiT refuse the request in + check_family, so a streamed request gets its 400 before the stream.""" + req = image_service.parse_request("generations", {"prompt": "p", + **fields}) + with pytest.raises(image_service.ImageRequestError) as e: + image_service.check_family(req, _flux3_served(True, cfg=default)) + assert e.value.param == param and e.value.status == 400 + assert str(e.value).startswith( + f"{param}: the FLUX.3 klein distilled DiT is a flow map") + # Base is no flow map: it takes guidance and any sampler. + image_service.check_family(req, _flux3_served(False, cfg=default)) + + +def test_a_flux3_flow_map_takes_the_sampler_of_its_entry_defaults(): + req = image_service.parse_request("generations", {"prompt": "p"}) + with pytest.raises(image_service.ImageRequestError, match="euler only"): + image_service.check_family(req, _flux3_served( + True, defaults={"sampler": "uni_pc_bh2"})) + image_service.check_family(req, _flux3_served(True)) + + def test_a_distilled_flux2_entry_refuses_a_guidance_default(plan_stubs, monkeypatch): from gmlx.image import loader From f847926d3a9b48d6b91decce6df6804ee7efffd0 Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 10:56:59 -0700 Subject: [PATCH 022/101] test(image): flux2 klein check 7 gates three community lora files against bfl's reference dit --- .../check7_flux2_klein_community.py | 496 ++++++ ...ck7_flux2_klein_mikkoani_512.manifest.json | 1338 +++++++++++++++ ...k7_flux2_klein_pixel_art_512.manifest.json | 1505 +++++++++++++++++ ...heck7_flux2_klein_sketch_512.manifest.json | 1346 +++++++++++++++ tests/image/test_image_check7_flux2_klein.py | 377 +++++ 5 files changed, 5062 insertions(+) create mode 100644 scripts/image_oracle/check7_flux2_klein_community.py create mode 100644 tests/fixtures/image/oracle/check7_flux2_klein_mikkoani_512.manifest.json create mode 100644 tests/fixtures/image/oracle/check7_flux2_klein_pixel_art_512.manifest.json create mode 100644 tests/fixtures/image/oracle/check7_flux2_klein_sketch_512.manifest.json create mode 100644 tests/image/test_image_check7_flux2_klein.py diff --git a/scripts/image_oracle/check7_flux2_klein_community.py b/scripts/image_oracle/check7_flux2_klein_community.py new file mode 100644 index 000000000..8de3458c6 --- /dev/null +++ b/scripts/image_oracle/check7_flux2_klein_community.py @@ -0,0 +1,496 @@ +#!/usr/bin/env python3 +"""Check 7 oracle for FLUX.2 klein on community LoRA files, step half: +check 3's step at 512 with an adapter file applied to BFL's reference DiT. + +Each adapter is a LoRA file from a public repository, listed in --spec +with its repository, revision, license, strength, the DiT GGUF it is for +and the check 3 fixture whose step it takes. The oracle reads the file's +keys with the parser below, which knows the three spellings these files +use: + + transformer..lora_A.weight, .lora_B.weight + (diffusers' save_lora_weights, with a PEFT config in the header) + lora_unet_.lora_down.weight, + .lora_up.weight, .alpha (kohya) + diffusion_model..lora_A.weight, .lora_B.weight + (AI-Toolkit) + +A reference name is a linear layer of the reference's Flux2 class, which +the GGUF names. A diffusers name is a layer of diffusers' +Flux2Transformer2DModel, and ``diffusers_table`` maps it to the reference +layer and the rows of that layer it is: to_q, to_k and to_v are the +thirds of a double block's img_attn.qkv, add_q_proj, add_k_proj and +add_v_proj those of txt_attn.qkv, and norm_out.linear is +final_layer.adaLN_modulation.1 with its two halves in the other order. A +key that names no such layer stops the run. The table is checked against +diffusers' own converter of the reference names, which the manifest +records. + +The scale of a pair is ``strength * scale``. For a file with a PEFT config +in its header, ``scale`` is PEFT's own: the config goes to peft's +LoraConfig, the adapter is injected into a stand-in tree of the file's +module names, and the ``scaling`` of each LoRA layer is read, so r, +lora_alpha, rank_pattern, alpha_pattern and use_rslora count as PEFT +counts them. Otherwise ``scale`` is the alpha over the rank with an alpha +tensor, and 1 without. The manifest records peft's version. + +Each pair is applied unmerged, as PEFT applies it: a forward hook on the +reference layer adds ``strength * scale * linear(linear(x, down), up)`` to +the layer's rows of the pair in the mode's dtype. In bf16 the two products +run as the base layers do, as float32 products over bfloat16 operands with +one bfloat16 rounding. + +The step is the source fixture's: its latents, features, reference +latents and sigma, every row in fp32 and the bf16 gaps that set the +tolerances, with check 3's rule. The manifest also records the adapter's +effect, the relative L2 of each fp32 row against the same row of the +source fixture, and the products of the pairs that diffusers' FLUX.2 LoRA +loader gives against the oracle's. The adapter file stays outside the +fixture: the manifest records its name, size, sha256, repository, revision +and license, and the gmlx test finds it under GMLX_TEST_LORA_DIR. + +The spec is a JSON file: + + {"adapters": [{"id": "name", "path": "file.safetensors", + "repo": "owner/repo", "revision": "sha", + "license": "apache-2.0", "strength": 1.0, + "dit": "flux-2-klein-4b-Q4_K_M.gguf", + "source": "check3_flux2_klein_512"}]} + +A relative path is taken from the spec file's directory. Each adapter +writes the fixture __512. + + python scripts/image_oracle/run.py --python --threads 16 \\ + check7_flux2_klein_community.py --reference /src \\ + --spec adapters.json --only pixel_art +""" + +from __future__ import annotations + +import argparse +import gc +import json +import sys +from pathlib import Path + +# Under -I the script's directory is not on the path. +sys.path.insert(0, str(Path(__file__).resolve().parent)) + +import numpy as np # noqa: E402 + +import check3_flux2_klein as c3 # noqa: E402 +import fixtures # noqa: E402 +import oracle # noqa: E402 + +NAME = "check7_flux2_klein" +SCRIPT = "scripts/image_oracle/check7_flux2_klein_community.py" +SUFFIXES = {".lora_down.weight": "down", ".lora_up.weight": "up", + ".lora_A.weight": "down", ".lora_B.weight": "up", + ".alpha": "alpha"} +PREFIXES = {"transformer.": "diffusers", "lora_unet_": "kohya", + "diffusion_model.": "reference"} +HEADER_ENTRY = "lora_adapter_metadata" + + +def diffusers_table(model) -> dict: + """diffusers name -> (reference layer, third of its rows or None, + whether the two halves of its rows are in the other order).""" + out = {} + for i in range(len(model.double_blocks)): + d, b = f"transformer_blocks.{i}", f"double_blocks.{i}" + for j, n in enumerate(("to_q", "to_k", "to_v")): + out[f"{d}.attn.{n}"] = (f"{b}.img_attn.qkv", j, False) + for j, n in enumerate(("add_q_proj", "add_k_proj", "add_v_proj")): + out[f"{d}.attn.{n}"] = (f"{b}.txt_attn.qkv", j, False) + out[f"{d}.attn.to_out.0"] = (f"{b}.img_attn.proj", None, False) + out[f"{d}.attn.to_add_out"] = (f"{b}.txt_attn.proj", None, False) + for ff, mlp in (("ff", "img_mlp"), ("ff_context", "txt_mlp")): + out[f"{d}.{ff}.linear_in"] = (f"{b}.{mlp}.0", None, False) + out[f"{d}.{ff}.linear_out"] = (f"{b}.{mlp}.2", None, False) + for i in range(len(model.single_blocks)): + d, b = f"single_transformer_blocks.{i}", f"single_blocks.{i}" + out[f"{d}.attn.to_qkv_mlp_proj"] = (f"{b}.linear1", None, False) + out[f"{d}.attn.to_out"] = (f"{b}.linear2", None, False) + emb = "time_guidance_embed.timestep_embedder" + out.update({ + "x_embedder": ("img_in", None, False), + "context_embedder": ("txt_in", None, False), + f"{emb}.linear_1": ("time_in.in_layer", None, False), + f"{emb}.linear_2": ("time_in.out_layer", None, False), + "proj_out": ("final_layer.linear", None, False), + "norm_out.linear": ("final_layer.adaLN_modulation.1", None, True)}) + for m in c3.MODS: + out[f"{m}.linear"] = (f"{m}.lin", None, False) + return out + + +def linear_layers(model) -> dict: + """Reference name -> (out, in) of each linear layer.""" + return {n: (m.out_features, m.in_features) + for n, m in model.named_modules() + if hasattr(m, "out_features") and hasattr(m, "in_features")} + + +def swap_halves(a: np.ndarray) -> np.ndarray: + h = a.shape[0] // 2 + return np.concatenate([a[h:], a[:h]], axis=0) + + +def peft_scales(torch, metadata: dict, shapes: dict) -> tuple[dict, str]: + """diffusers module name -> PEFT's scaling of its LoRA layer, from the + header's transformer config, and peft's version.""" + import peft + from peft import LoraConfig, inject_adapter_in_model + + doc = json.loads(metadata[HEADER_ENTRY]) + fields = {k.split(".", 1)[1]: v for k, v in doc.items() + if k.startswith("transformer.")} + if set(doc) != {f"transformer.{k}" for k in fields}: + raise SystemExit("error: the adapter header has a LoRA config for " + "a component other than transformer") + known = set(LoraConfig.__dataclass_fields__) + extra = sorted(set(fields) - known) + if extra: + raise SystemExit(f"error: peft {peft.__version__} LoraConfig has no " + f"field {extra}") + cfg = LoraConfig(**fields) + root = torch.nn.Module() + for name in shapes: + parent = root + *path, leaf = name.split(".") + for part in path: + if not hasattr(parent, part): + parent.add_module(part, torch.nn.Module()) + parent = getattr(parent, part) + parent.add_module(leaf, torch.nn.Linear(1, 1)) + inject_adapter_in_model(cfg, root) + out = {} + for name in shapes: + layer = root.get_submodule(name) + scaling = getattr(layer, "scaling", None) + if not scaling: + raise SystemExit(f"error: the header's config puts no LoRA " + f"layer on {name}") + out[name] = float(scaling["default"]) + return out, peft.__version__ + + +def read_pairs(torch, path: Path, model) -> tuple[dict, dict]: + """Pair key -> {module, band, down, up, scale, stem} in float32, the + up rows in the reference's order, and the facts of the file. Stops on + a key that names no linear layer or is not part of a plain pair.""" + from safetensors import safe_open + + layers = linear_layers(model) + table = diffusers_table(model) + flat = {n.replace(".", "_"): n for n in layers} + parts: dict = {} + bad, spelled, dtypes = [], set(), set() + with safe_open(str(path), framework="pt") as f: + metadata = f.metadata() or {} + for key in f.keys(): + suffix = next((s for s in SUFFIXES if key.endswith(s)), None) + stem = key[:-len(suffix)] if suffix else key + prefix = next((p for p in PREFIXES if stem.startswith(p)), None) + name = None + if suffix and prefix: + rest = stem[len(prefix):] + kind = PREFIXES[prefix] + name = (rest if kind == "diffusers" and rest in table + else flat.get(rest) if kind == "kohya" + else rest if kind == "reference" and rest in layers + else None) + if name is None: + bad.append(key) + continue + spelled.add(PREFIXES[prefix]) + t = f.get_tensor(key) + dtypes.add(str(t.dtype).rsplit(".", 1)[-1]) + parts.setdefault((PREFIXES[prefix], name), {"stem": stem})[ + SUFFIXES[suffix]] = (float(t) if suffix == ".alpha" else + t.to(torch.float32).numpy()) + if bad: + raise SystemExit(f"error: {path.name}: {len(bad)} keys name no " + f"linear layer or pair part: {bad[:8]}") + if len(spelled) != 1: + raise SystemExit(f"error: {path.name} mixes spellings {spelled}") + kind = spelled.pop() + for (_, name), p in parts.items(): + if "down" not in p or "up" not in p or p["down"].ndim != 2 \ + or p["up"].ndim != 2: + raise SystemExit(f"error: {path.name}: {name} is not a plain " + "pair of matrices") + scales, peft_version = {}, None + if HEADER_ENTRY in metadata: + if kind != "diffusers": + raise SystemExit(f"error: {path.name} has a PEFT config and " + f"{kind} names") + scales, peft_version = peft_scales(torch, metadata, { + name: p["up"].shape for (_, name), p in parts.items()}) + pairs = {} + for (_, name), p in sorted(parts.items()): + down, up = p["down"], p["up"] + rank = down.shape[0] + if kind == "diffusers": + module, third, swapped = table[name] + else: + module, third, swapped = name, None, False + out, inp = layers[module] + band = None + if third is not None: + band = (third * out // 3, out // 3) + if swapped: + up = swap_halves(up) + if down.shape[1] != inp or up.shape != ( + band[1] if band else out, rank): + raise SystemExit(f"error: {path.name}: {name} has down " + f"{down.shape} and up {up.shape} for " + f"{module} of {out} x {inp}, rows {band}") + if name in scales: + scale = scales[name] + elif "alpha" in p: + scale = p["alpha"] / rank + else: + scale = 1.0 + pairs[name] = {"module": module, "band": band, "down": down, + "up": up, "scale": scale, "stem": p["stem"], + "alpha": p.get("alpha")} + facts = {"pairs": len(pairs), "spelling": kind, + "ranks": sorted({int(p["down"].shape[0]) + for p in pairs.values()}), + "alphas": sorted({p["alpha"] for p in pairs.values() + if p["alpha"] is not None}) or None, + "scales": sorted({p["scale"] for p in pairs.values()}), + "scale_source": (f"peft {peft_version} LoraConfig from the " + "header" if peft_version else + "alpha over rank, 1 without an alpha"), + "peft": peft_version, + "tensor_dtypes": sorted(dtypes), + "header_config": (json.loads(metadata[HEADER_ENTRY]) + if HEADER_ENTRY in metadata else None)} + return pairs, facts + + +def install(torch, model, pairs: dict, strength: float, mode: str) -> list: + """A forward hook per pair that adds its product to its rows.""" + dtype = oracle.torch_dtype(mode) + handles = [] + for p in pairs.values(): + mod = model.get_submodule(p["module"]) + d = torch.from_numpy(p["down"]).to(dtype) + u = torch.from_numpy(p["up"]).to(dtype) + scale = strength * p["scale"] + start = p["band"][0] if p["band"] else None + + def hook(_mod, args, out, d=d, u=u, scale=scale, start=start): + import torch.nn.functional as F + + x = args[0].to(dtype) + delta = (F.linear(F.linear(x, d), u) * scale).to(out.dtype) + if start is None: + return out + delta + out = out.clone() + out[..., start:start + delta.shape[-1]] += delta + return out + + handles.append(mod.register_forward_hook(hook)) + return handles + + +def table_check(torch, model) -> dict: + """diffusers' converter of the reference names on one pair per linear + layer against ``diffusers_table``: every name it gives is in the + table, on the same layer and rows. A layer whose rows the table holds + in the other order is recorded when the converter leaves them as they + are.""" + from diffusers.loaders.lora_conversion_utils import ( + _convert_non_diffusers_flux2_lora_to_diffusers) + + layers = linear_layers(model) + names = sorted(layers) + sd = {} + for i, name in enumerate(names): + out, inp = layers[name] + sd[f"diffusion_model.{name}.lora_A.weight"] = torch.full( + (1, inp), float(i + 1)) + sd[f"diffusion_model.{name}.lora_B.weight"] = torch.arange( + out, dtype=torch.float32)[:, None] + 1000 * i + conv = _convert_non_diffusers_flux2_lora_to_diffusers(dict(sd)) + table = diffusers_table(model) + bad, unswapped, seen = [], [], set() + for key, b in sorted(conv.items()): + if not key.endswith(".lora_B.weight"): + continue + name = key.removeprefix("transformer.")[:-len(".lora_B.weight")] + if name not in table: + bad.append(f"{name} is not in the table") + continue + module, third, swapped = table[name] + i = int(conv[key.replace(".lora_B.", ".lora_A.")][0, 0].item()) - 1 + out = layers[module][0] + rows = torch.arange(out, dtype=torch.float32) + 1000 * i + if third is not None: + rows = rows[third * out // 3:(third + 1) * out // 3] + got = b[:, 0] + flipped = torch.from_numpy(swap_halves(rows.numpy())) + if names[i] != module: + bad.append(f"{name}: the converter puts {names[i]} there") + elif swapped and torch.equal(got, rows): + unswapped.append(name) + elif not torch.equal(got, flipped if swapped else rows): + bad.append(f"{name}: other rows of {module}") + seen.add(module) + dropped = sorted(set(layers) - seen) + if bad or dropped: + raise SystemExit(f"error: diffusers_table and diffusers' converter " + f"differ: {bad[:6]}, layers it drops {dropped[:4]}") + return {"layers": len(layers), + "converter_names": sum(k.endswith(".lora_B.weight") + for k in conv), + "same_layer_and_rows": True, + "halves_the_converter_leaves_unswapped": unswapped} + + +def lowrank_rel(torch, b1, a1, b2, a2) -> float: + """Relative L2 of b1 @ a1 against b2 @ a2 from the factors, in the + precision of the factors: the square norm of a product of rank r is + the trace of an r by r product.""" + def sq(b, a): + return float(torch.trace((a @ a.T) @ (b.T @ b))) + num = sq(torch.cat([b1, -b2], 1), torch.cat([a1, a2], 0)) + return (max(num, 0.0) / sq(b2, a2)) ** 0.5 + + +def converter_check(torch, path: Path, pairs: dict, model) -> dict: + """The products of diffusers' FLUX.2 LoRA loader against the oracle's, + per diffusers name, as the worst relative L2 in float64. The loader + folds a kohya alpha into the factors and leaves a PEFT scale to PEFT, + which the oracle's scale stands in for.""" + try: + from diffusers.loaders.lora_pipeline import Flux2LoraLoaderMixin + + sd = Flux2LoraLoaderMixin.lora_state_dict(str(path)) + except Exception as e: # noqa: BLE001 - a loader that fails is a note + return {"ran": False, "why": f"{type(e).__name__}: {e}"[:300]} + table = diffusers_table(model) + by_rows = {(p["module"], p["band"]): p for p in pairs.values()} + out_of = {m: o for m, (o, _) in linear_layers(model).items()} + worst, missing, folded = 0.0, [], None + for key in sd: + if not key.endswith(".lora_A.weight"): + continue + name = key.removeprefix("transformer.")[:-len(".lora_A.weight")] + module, third, swapped = table[name] + o = out_of[module] + band = None if third is None else (third * o // 3, o // 3) + p = by_rows.get((module, band)) + whole = by_rows.get((module, None)) + if p is None and whole is not None and band is not None: + up = whole["up"][band[0]:band[0] + band[1]] + p = dict(whole, up=up) + if p is None: + missing.append(name) + continue + a = sd[key].double() + b = sd[key.replace(".lora_A.", ".lora_B.")].double() + up = p["up"] if not swapped else swap_halves(p["up"]) + kohya = p["alpha"] is not None + if not kohya and p["scale"] != 1.0: + folded = False + mine_b = torch.from_numpy(up).double() * ( + p["scale"] if kohya else 1.0) + worst = max(worst, lowrank_rel( + torch, b, a, mine_b, torch.from_numpy(p["down"]).double())) + return {"ran": True, "names": len([k for k in sd + if k.endswith(".lora_A.weight")]), + "names_without_an_oracle_pair": missing[:8], + "count_without_an_oracle_pair": len(missing), + "worst_product_rel_l2": worst, + "peft_scale_left_to_peft": folded is False} + + +def c3_inputs(src: dict) -> set: + return {k for k in src if k in ("latents", "features", "sigma", + "velocity_bf16") + or k.startswith(("refs.", "ids.", "in."))} + + +def main(argv=None) -> int: + ap = argparse.ArgumentParser(description=__doc__.split("\n\n")[0]) + ap.add_argument("--reference", type=Path, required=True, + help="src directory of BFL's flux2") + ap.add_argument("--spec", type=Path, required=True, + help="JSON list of the adapters, see the module text") + ap.add_argument("--gguf", type=Path, required=True, nargs="+", + help="the DiT GGUFs the spec names") + ap.add_argument("--only", nargs="+", default=None, metavar="ID", + help="run these adapters of the spec only") + ap.add_argument("--dequant", choices=oracle.DEQUANT, default="exact") + ap.add_argument("--name", default=NAME) + a = ap.parse_args(argv) + torch = oracle.setup() + oracle.set_dequant(a.dequant) + fm, sampling = c3.reference(a.reference.expanduser()) + root = fixtures.fixture_root() + dits = {p.name: p for p in a.gguf} + spec = json.loads(a.spec.read_text())["adapters"] + if a.only: + spec = [s for s in spec if s["id"] in a.only] + for row in spec: + aid, strength = row["id"], float(row.get("strength", 1.0)) + path = Path(row["path"]).expanduser() + if not path.is_absolute(): + path = a.spec.parent / path + m3 = fixtures.read_manifest(row["source"], root=root) + dit = dits[row["dit"]] + want = m3["files"]["dit"] + if fixtures.file_identity(dit) != want: + raise SystemExit(f"error: {dit} is not the DiT {row['source']} " + "read") + with np.load(root / m3["npz"], allow_pickle=False) as z: + src = {k: z[k] for k in z.files} + state, census = c3.gguf_state(torch, dit) + models = {m: c3.build(torch, fm, state, m) for m in ("fp32", "bf16")} + pairs, facts = read_pairs(torch, path, models["fp32"]) + tcheck = table_check(torch, models["fp32"]) + ccheck = converter_check(torch, path, pairs, models["fp32"]) + print(f"[check7] {aid}: {facts['pairs']} pairs, {facts['spelling']}" + f", ranks {facts['ranks']}, scales {facts['scales']} " + f"({facts['scale_source']}); table {tcheck}; diffusers " + f"loader {ccheck}", flush=True) + for mode, model in models.items(): + install(torch, model, pairs, strength, mode) + refs = [src[f"refs.{i}"] for i in range(m3["inputs"]["refs"])] + inputs = dict(m3["inputs"]) + inputs.update( + source=row["source"], strength=strength, + adapter={"id": aid, "repo": row["repo"], + "revision": row["revision"], "license": row["license"], + **facts}, + lora_pairs=len(pairs), + targets=sorted([p["module"], list(p["band"]) if p["band"] + else None] for p in pairs.values()), + application="unmerged: strength * scale * up(down(x)) added " + "to each pair's rows of its layer's output in the " + "mode's dtype") + + def more(fx, _vel, src=src, tcheck=tcheck, ccheck=ccheck): + fx.results["adapter_effect"] = { + k: fixtures.rel_l2(fx.arrays[k], src[k]) + for k in fx.arrays if k in src and k not in c3_inputs(src)} + fx.results["key_table"] = tcheck + fx.results["diffusers_loader"] = ccheck + + c3.run_case(torch, sampling, models, src["latents"], src["features"], + refs, float(src["sigma"]), True, f"{a.name}_{aid}_512", + inputs, {"dit": dit, "lora": path}, [ + "the adapter is applied unmerged as PEFT applies " + "it; the gmlx side runs it under a patch table"], + check=7, script=SCRIPT, more=more) + del models, state, pairs, src + gc.collect() + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tests/fixtures/image/oracle/check7_flux2_klein_mikkoani_512.manifest.json b/tests/fixtures/image/oracle/check7_flux2_klein_mikkoani_512.manifest.json new file mode 100644 index 000000000..f07d344f3 --- /dev/null +++ b/tests/fixtures/image/oracle/check7_flux2_klein_mikkoani_512.manifest.json @@ -0,0 +1,1338 @@ +{ + "schema": 1, + "name": "check7_flux2_klein_mikkoani_512", + "check": 7, + "family": "flux2_klein", + "script": "scripts/image_oracle/check7_flux2_klein_community.py", + "argv": [ + "check7_flux2_klein_community.py", + "--reference", + "src", + "--spec", + "adapters.json", + "--gguf", + "flux-2-klein-4b-Q4_K_M.gguf", + "flux-2-klein-base-4b-Q4_K_M.gguf", + "--only", + "mikkoani" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": { + "dit": { + "name": "flux-2-klein-4b-Q4_K_M.gguf", + "size": 2604311104, + "sha256": "0b25d143c8469b342bc5af3bce92b783bf6b0636d285f7b2f75e38af63af9a15" + }, + "lora": { + "name": "klein4b-mikkoani.safetensors", + "size": 92436112, + "sha256": "221bed696fde877082fa1e264d633082577ca49810a060b5baf330e128169fb4" + } + }, + "inputs": { + "size": 512, + "sigma": 1.0, + "step": 0, + "schedule": "get_schedule(4, 1024)", + "seed": 512, + "latents": "seeded normal, rounded to bf16", + "features": "seeded normal, std 4.0, rounded to bf16", + "text_rows": 512, + "refs": 0, + "ref_size": 0, + "dequant": "exact", + "matmul_bf16": "bf16 operands, float32 GEMM, one bf16 rounding", + "timestep": "bf16 as the reference's denoise fills it, in both modes", + "reference_commit": "50fe5162777813d869182b139e83b10743caef15", + "gguf_codecs": { + "F32": 60, + "Q5_K": 30, + "Q4_K": 50, + "BF16": 9 + }, + "source": "check3_flux2_klein_512", + "strength": 1.0, + "adapter": { + "id": "mikkoani", + "repo": "mikkoph/mikkoani-klein4b", + "revision": "2429707d188e1c366fc9fad14a88516b931c4b30", + "license": "apache-2.0", + "pairs": 80, + "spelling": "kohya", + "ranks": [ + 32 + ], + "alphas": [ + 16.0 + ], + "scales": [ + 0.5 + ], + "scale_source": "alpha over rank, 1 without an alpha", + "peft": null, + "tensor_dtypes": [ + "bfloat16" + ], + "header_config": null + }, + "lora_pairs": 80, + "targets": [ + [ + "double_blocks.0.img_attn.proj", + null + ], + [ + "double_blocks.0.img_attn.qkv", + null + ], + [ + "double_blocks.0.img_mlp.0", + null + ], + [ + "double_blocks.0.img_mlp.2", + null + ], + [ + "double_blocks.0.txt_attn.proj", + null + ], + [ + "double_blocks.0.txt_attn.qkv", + null + ], + [ + "double_blocks.0.txt_mlp.0", + null + ], + [ + "double_blocks.0.txt_mlp.2", + null + ], + [ + "double_blocks.1.img_attn.proj", + null + ], + [ + "double_blocks.1.img_attn.qkv", + null + ], + [ + "double_blocks.1.img_mlp.0", + null + ], + [ + "double_blocks.1.img_mlp.2", + null + ], + [ + "double_blocks.1.txt_attn.proj", + null + ], + [ + "double_blocks.1.txt_attn.qkv", + null + ], + [ + "double_blocks.1.txt_mlp.0", + null + ], + [ + "double_blocks.1.txt_mlp.2", + null + ], + [ + "double_blocks.2.img_attn.proj", + null + ], + [ + "double_blocks.2.img_attn.qkv", + null + ], + [ + "double_blocks.2.img_mlp.0", + null + ], + [ + "double_blocks.2.img_mlp.2", + null + ], + [ + "double_blocks.2.txt_attn.proj", + null + ], + [ + "double_blocks.2.txt_attn.qkv", + null + ], + [ + "double_blocks.2.txt_mlp.0", + null + ], + [ + "double_blocks.2.txt_mlp.2", + null + ], + [ + "double_blocks.3.img_attn.proj", + null + ], + [ + "double_blocks.3.img_attn.qkv", + null + ], + [ + "double_blocks.3.img_mlp.0", + null + ], + [ + "double_blocks.3.img_mlp.2", + null + ], + [ + "double_blocks.3.txt_attn.proj", + null + ], + [ + "double_blocks.3.txt_attn.qkv", + null + ], + [ + "double_blocks.3.txt_mlp.0", + null + ], + [ + "double_blocks.3.txt_mlp.2", + null + ], + [ + "double_blocks.4.img_attn.proj", + null + ], + [ + "double_blocks.4.img_attn.qkv", + null + ], + [ + "double_blocks.4.img_mlp.0", + null + ], + [ + "double_blocks.4.img_mlp.2", + null + ], + [ + "double_blocks.4.txt_attn.proj", + null + ], + [ + "double_blocks.4.txt_attn.qkv", + null + ], + [ + "double_blocks.4.txt_mlp.0", + null + ], + [ + "double_blocks.4.txt_mlp.2", + null + ], + [ + "single_blocks.0.linear1", + null + ], + [ + "single_blocks.0.linear2", + null + ], + [ + "single_blocks.1.linear1", + null + ], + [ + "single_blocks.1.linear2", + null + ], + [ + "single_blocks.10.linear1", + null + ], + [ + "single_blocks.10.linear2", + null + ], + [ + "single_blocks.11.linear1", + null + ], + [ + "single_blocks.11.linear2", + null + ], + [ + "single_blocks.12.linear1", + null + ], + [ + "single_blocks.12.linear2", + null + ], + [ + "single_blocks.13.linear1", + null + ], + [ + "single_blocks.13.linear2", + null + ], + [ + "single_blocks.14.linear1", + null + ], + [ + "single_blocks.14.linear2", + null + ], + [ + "single_blocks.15.linear1", + null + ], + [ + "single_blocks.15.linear2", + null + ], + [ + "single_blocks.16.linear1", + null + ], + [ + "single_blocks.16.linear2", + null + ], + [ + "single_blocks.17.linear1", + null + ], + [ + "single_blocks.17.linear2", + null + ], + [ + "single_blocks.18.linear1", + null + ], + [ + "single_blocks.18.linear2", + null + ], + [ + "single_blocks.19.linear1", + null + ], + [ + "single_blocks.19.linear2", + null + ], + [ + "single_blocks.2.linear1", + null + ], + [ + "single_blocks.2.linear2", + null + ], + [ + "single_blocks.3.linear1", + null + ], + [ + "single_blocks.3.linear2", + null + ], + [ + "single_blocks.4.linear1", + null + ], + [ + "single_blocks.4.linear2", + null + ], + [ + "single_blocks.5.linear1", + null + ], + [ + "single_blocks.5.linear2", + null + ], + [ + "single_blocks.6.linear1", + null + ], + [ + "single_blocks.6.linear2", + null + ], + [ + "single_blocks.7.linear1", + null + ], + [ + "single_blocks.7.linear2", + null + ], + [ + "single_blocks.8.linear1", + null + ], + [ + "single_blocks.8.linear2", + null + ], + [ + "single_blocks.9.linear1", + null + ], + [ + "single_blocks.9.linear2", + null + ] + ], + "application": "unmerged: strength * scale * up(down(x)) added to each pair's rows of its layer's output in the mode's dtype" + }, + "results": { + "velocity_bf16_vs_fp32": { + "rel_l2": 0.029307830535495828, + "cosine": 0.9995707008229212, + "max_abs": 0.1688159704208374 + }, + "rows_bf16_vs_fp32": { + "vec": { + "rel_l2": 0.0017350471821734716, + "cosine": 0.9999985048596156, + "max_abs": 0.007456779479980469, + "teacher_forced": false + }, + "double_stream_modulation_img": { + "rel_l2": 0.0017075999965016557, + "cosine": 0.9999985477892043, + "max_abs": 0.039051055908203125, + "teacher_forced": false + }, + "double_stream_modulation_txt": { + "rel_l2": 0.001656781628104715, + "cosine": 0.9999986362054634, + "max_abs": 0.019323348999023438, + "teacher_forced": false + }, + "single_stream_modulation": { + "rel_l2": 0.0016003666594017491, + "cosine": 0.9999987212076318, + "max_abs": 0.093231201171875, + "teacher_forced": false + }, + "img_in": { + "rel_l2": 0.0016575440299538614, + "cosine": 0.999998626273488, + "max_abs": 0.03107452392578125, + "teacher_forced": false + }, + "txt_in": { + "rel_l2": 0.0016583942242231634, + "cosine": 0.9999986248639099, + "max_abs": 0.06249237060546875, + "teacher_forced": false + }, + "double_blocks.0.img": { + "rel_l2": 0.006480278156343211, + "cosine": 0.9999795370497068, + "max_abs": 1.405975341796875, + "teacher_forced": true + }, + "double_blocks.0.txt": { + "rel_l2": 0.005213977113593052, + "cosine": 0.999988278634058, + "max_abs": 14.8870849609375, + "teacher_forced": true + }, + "double_blocks.1.img": { + "rel_l2": 0.00435693236368939, + "cosine": 0.999991577864122, + "max_abs": 1.1839370727539062, + "teacher_forced": true + }, + "double_blocks.1.txt": { + "rel_l2": 0.003700628792034029, + "cosine": 0.9999931784257696, + "max_abs": 9.71142578125, + "teacher_forced": true + }, + "double_blocks.2.img": { + "rel_l2": 0.005130636164117703, + "cosine": 0.9999872681858829, + "max_abs": 0.72357177734375, + "teacher_forced": true + }, + "double_blocks.2.txt": { + "rel_l2": 0.004073995242995489, + "cosine": 0.9999917359766609, + "max_abs": 7.8880615234375, + "teacher_forced": true + }, + "double_blocks.3.img": { + "rel_l2": 0.005654270821870361, + "cosine": 0.9999842880820081, + "max_abs": 0.7419204711914062, + "teacher_forced": true + }, + "double_blocks.3.txt": { + "rel_l2": 0.0043567550937656085, + "cosine": 0.9999905479019913, + "max_abs": 9.3017578125, + "teacher_forced": true + }, + "double_blocks.4.img": { + "rel_l2": 0.0036348218321264154, + "cosine": 0.9999934927673771, + "max_abs": 3.488067626953125, + "teacher_forced": true + }, + "double_blocks.4.txt": { + "rel_l2": 0.004973030635419143, + "cosine": 0.9999877559681692, + "max_abs": 9.3958740234375, + "teacher_forced": true + }, + "single_blocks.0": { + "rel_l2": 0.0036930464612865686, + "cosine": 0.9999931860987716, + "max_abs": 5.7489013671875, + "teacher_forced": true + }, + "single_blocks.1": { + "rel_l2": 0.00409951921903727, + "cosine": 0.9999916342997273, + "max_abs": 6.3297119140625, + "teacher_forced": true + }, + "single_blocks.2": { + "rel_l2": 0.004700234398717361, + "cosine": 0.9999889600400723, + "max_abs": 4.305419921875, + "teacher_forced": true + }, + "single_blocks.3": { + "rel_l2": 0.004758994532109948, + "cosine": 0.9999887872259577, + "max_abs": 6.651611328125, + "teacher_forced": true + }, + "single_blocks.4": { + "rel_l2": 0.004303882607924451, + "cosine": 0.9999908439176274, + "max_abs": 5.1455078125, + "teacher_forced": true + }, + "single_blocks.5": { + "rel_l2": 0.0034415404553212276, + "cosine": 0.9999941101681041, + "max_abs": 6.6031494140625, + "teacher_forced": true + }, + "single_blocks.6": { + "rel_l2": 0.0037672183267763123, + "cosine": 0.9999931654271855, + "max_abs": 5.32122802734375, + "teacher_forced": true + }, + "single_blocks.7": { + "rel_l2": 0.004020122871373444, + "cosine": 0.999992358774848, + "max_abs": 5.21502685546875, + "teacher_forced": true + }, + "single_blocks.8": { + "rel_l2": 0.003967540876661122, + "cosine": 0.9999923460306102, + "max_abs": 6.6895751953125, + "teacher_forced": true + }, + "single_blocks.9": { + "rel_l2": 0.00420044564091736, + "cosine": 0.9999913249366204, + "max_abs": 4.714599609375, + "teacher_forced": true + }, + "single_blocks.10": { + "rel_l2": 0.004483714328663639, + "cosine": 0.9999899484768227, + "max_abs": 7.815185546875, + "teacher_forced": true + }, + "single_blocks.11": { + "rel_l2": 0.0056705589651153, + "cosine": 0.9999840131503269, + "max_abs": 4.70703125, + "teacher_forced": true + }, + "single_blocks.12": { + "rel_l2": 0.005666636806049475, + "cosine": 0.9999840326898141, + "max_abs": 4.38995361328125, + "teacher_forced": true + }, + "single_blocks.13": { + "rel_l2": 0.005425019060682431, + "cosine": 0.9999853173092957, + "max_abs": 3.56634521484375, + "teacher_forced": true + }, + "single_blocks.14": { + "rel_l2": 0.005692473797251044, + "cosine": 0.9999838004438901, + "max_abs": 6.0572509765625, + "teacher_forced": true + }, + "single_blocks.15": { + "rel_l2": 0.005834226700506925, + "cosine": 0.9999829814574047, + "max_abs": 5.9976806640625, + "teacher_forced": true + }, + "single_blocks.16": { + "rel_l2": 0.0058586570995573595, + "cosine": 0.9999828437333339, + "max_abs": 4.8284912109375, + "teacher_forced": true + }, + "single_blocks.17": { + "rel_l2": 0.005975394154351966, + "cosine": 0.9999821495261253, + "max_abs": 4.3291015625, + "teacher_forced": true + }, + "single_blocks.18": { + "rel_l2": 0.005482700409630454, + "cosine": 0.9999849903712547, + "max_abs": 10.7200927734375, + "teacher_forced": true + }, + "single_blocks.19": { + "rel_l2": 0.004615022817926425, + "cosine": 0.9999893656104647, + "max_abs": 16.7601318359375, + "teacher_forced": true + }, + "final_layer.adaLN_modulation": { + "rel_l2": 0.0013852935633001928, + "cosine": 0.9999990845155656, + "max_abs": 0.06572341918945312, + "teacher_forced": false + }, + "final_layer": { + "rel_l2": 0.0038829103024362703, + "cosine": 0.9999924735795612, + "max_abs": 0.018672943115234375, + "teacher_forced": true + } + }, + "free_bf16_vs_fp32": { + "double_blocks.0.img": 0.006445208527205601, + "double_blocks.0.txt": 0.005247655143999412, + "double_blocks.1.img": 0.007123902140391059, + "double_blocks.1.txt": 0.007337946239964609, + "double_blocks.2.img": 0.00906283749162603, + "double_blocks.2.txt": 0.0096699618229675, + "double_blocks.3.img": 0.010235807181544106, + "double_blocks.3.txt": 0.011247245823276785, + "double_blocks.4.img": 0.005281548811664963, + "double_blocks.4.txt": 0.011662739980612229, + "single_blocks.0": 0.010786662678542006, + "single_blocks.1": 0.012149427905840764, + "single_blocks.2": 0.013995894980441683, + "single_blocks.3": 0.014056801725098477, + "single_blocks.4": 0.012973299079585315, + "single_blocks.5": 0.011185189274617589, + "single_blocks.6": 0.011779490285775272, + "single_blocks.7": 0.012955558126475116, + "single_blocks.8": 0.01431499268773135, + "single_blocks.9": 0.015579163986482694, + "single_blocks.10": 0.01874439150527691, + "single_blocks.11": 0.02176604752031654, + "single_blocks.12": 0.023229933716204368, + "single_blocks.13": 0.026021122054437188, + "single_blocks.14": 0.028705726078125736, + "single_blocks.15": 0.03127268322117637, + "single_blocks.16": 0.033363515031493686, + "single_blocks.17": 0.03461677553698293, + "single_blocks.18": 0.031105060171957525, + "single_blocks.19": 0.028977971517078652, + "final_layer": 0.029307830535495828 + }, + "times": { + "fp32_s": 7.2, + "bf16_s": 16.7, + "bf16_teacher_forced_s": 17.4 + }, + "adapter_effect": { + "velocity": 0.19121256424923905, + "vec": 0.0, + "double_stream_modulation_img": 0.0, + "double_stream_modulation_txt": 0.0, + "single_stream_modulation": 0.0, + "img_in": 0.0, + "txt_in": 0.0, + "double_blocks.0.img": 0.02319169458740291, + "double_blocks.0.txt": 0.026584911987097788, + "double_blocks.1.img": 0.03182530680252067, + "double_blocks.1.txt": 0.03370552556371863, + "double_blocks.2.img": 0.03518513660244692, + "double_blocks.2.txt": 0.036863341966301685, + "double_blocks.3.img": 0.03841444214743019, + "double_blocks.3.txt": 0.03890528588754207, + "double_blocks.4.img": 0.019108025529268866, + "double_blocks.4.txt": 0.03855584345218499, + "single_blocks.0": 0.04042440774004124, + "single_blocks.1": 0.04859524790318254, + "single_blocks.2": 0.06006209440922764, + "single_blocks.3": 0.0651463319500195, + "single_blocks.4": 0.07181168613349578, + "single_blocks.5": 0.0621590306144396, + "single_blocks.6": 0.062206899059075935, + "single_blocks.7": 0.06598529728861227, + "single_blocks.8": 0.07065197141291095, + "single_blocks.9": 0.07395654547265432, + "single_blocks.10": 0.08671887303754995, + "single_blocks.11": 0.10307012861114555, + "single_blocks.12": 0.11424128237683866, + "single_blocks.13": 0.1294825484551073, + "single_blocks.14": 0.14614650852447772, + "single_blocks.15": 0.16670164285112932, + "single_blocks.16": 0.18962819455017813, + "single_blocks.17": 0.20390521127337963, + "single_blocks.18": 0.1879226162632534, + "single_blocks.19": 0.17097262089435478, + "final_layer.adaLN_modulation": 0.0, + "final_layer": 0.19121256424923908 + }, + "key_table": { + "layers": 89, + "converter_names": 109, + "same_layer_and_rows": true, + "halves_the_converter_leaves_unswapped": [ + "norm_out.linear" + ] + }, + "diffusers_loader": { + "ran": true, + "names": 100, + "names_without_an_oracle_pair": [], + "count_without_an_oracle_pair": 0, + "worst_product_rel_l2": 7.185482959828048e-17, + "peft_scale_left_to_peft": false + }, + "exact_free_floor": { + "rel_l2": 8.421528572301216e-06, + "row": "free single_blocks.17", + "measured": "gmlx's exact step on the GPU against the same step on the CPU stream, worst free row; tests/image/flux2_gates.py exact_free_floor on flux2-klein, Apple M5 Max" + }, + "exact_velocity_floor": { + "rel_l2": 6.972038964945999e-06, + "measured": "gmlx's exact step on the GPU against the same step on the CPU stream, velocity; tests/image/flux2_gates.py exact_free_floor on flux2-klein, Apple M5 Max" + } + }, + "tolerances": { + "velocity": { + "rel_l2": 0.058615661070991656, + "cosine_min": 0.9982828032916848 + }, + "vec": { + "rel_l2": 0.003470094364346943, + "teacher_forced": false + }, + "double_stream_modulation_img": { + "rel_l2": 0.0034151999930033114, + "teacher_forced": false + }, + "double_stream_modulation_txt": { + "rel_l2": 0.00331356325620943, + "teacher_forced": false + }, + "single_stream_modulation": { + "rel_l2": 0.0032007333188034982, + "teacher_forced": false + }, + "img_in": { + "rel_l2": 0.0033150880599077228, + "teacher_forced": false + }, + "txt_in": { + "rel_l2": 0.0033167884484463267, + "teacher_forced": false + }, + "double_blocks.0.img": { + "rel_l2": 0.012960556312686422, + "teacher_forced": true + }, + "double_blocks.0.txt": { + "rel_l2": 0.010427954227186105, + "teacher_forced": true + }, + "double_blocks.1.img": { + "rel_l2": 0.00871386472737878, + "teacher_forced": true + }, + "double_blocks.1.txt": { + "rel_l2": 0.007401257584068058, + "teacher_forced": true + }, + "double_blocks.2.img": { + "rel_l2": 0.010261272328235406, + "teacher_forced": true + }, + "double_blocks.2.txt": { + "rel_l2": 0.008147990485990977, + "teacher_forced": true + }, + "double_blocks.3.img": { + "rel_l2": 0.011308541643740722, + "teacher_forced": true + }, + "double_blocks.3.txt": { + "rel_l2": 0.008713510187531217, + "teacher_forced": true + }, + "double_blocks.4.img": { + "rel_l2": 0.007269643664252831, + "teacher_forced": true + }, + "double_blocks.4.txt": { + "rel_l2": 0.009946061270838287, + "teacher_forced": true + }, + "single_blocks.0": { + "rel_l2": 0.007386092922573137, + "teacher_forced": true + }, + "single_blocks.1": { + "rel_l2": 0.00819903843807454, + "teacher_forced": true + }, + "single_blocks.2": { + "rel_l2": 0.009400468797434723, + "teacher_forced": true + }, + "single_blocks.3": { + "rel_l2": 0.009517989064219896, + "teacher_forced": true + }, + "single_blocks.4": { + "rel_l2": 0.008607765215848903, + "teacher_forced": true + }, + "single_blocks.5": { + "rel_l2": 0.006883080910642455, + "teacher_forced": true + }, + "single_blocks.6": { + "rel_l2": 0.007534436653552625, + "teacher_forced": true + }, + "single_blocks.7": { + "rel_l2": 0.008040245742746888, + "teacher_forced": true + }, + "single_blocks.8": { + "rel_l2": 0.007935081753322243, + "teacher_forced": true + }, + "single_blocks.9": { + "rel_l2": 0.00840089128183472, + "teacher_forced": true + }, + "single_blocks.10": { + "rel_l2": 0.008967428657327277, + "teacher_forced": true + }, + "single_blocks.11": { + "rel_l2": 0.0113411179302306, + "teacher_forced": true + }, + "single_blocks.12": { + "rel_l2": 0.01133327361209895, + "teacher_forced": true + }, + "single_blocks.13": { + "rel_l2": 0.010850038121364862, + "teacher_forced": true + }, + "single_blocks.14": { + "rel_l2": 0.011384947594502088, + "teacher_forced": true + }, + "single_blocks.15": { + "rel_l2": 0.01166845340101385, + "teacher_forced": true + }, + "single_blocks.16": { + "rel_l2": 0.011717314199114719, + "teacher_forced": true + }, + "single_blocks.17": { + "rel_l2": 0.011950788308703933, + "teacher_forced": true + }, + "single_blocks.18": { + "rel_l2": 0.010965400819260908, + "teacher_forced": true + }, + "single_blocks.19": { + "rel_l2": 0.00923004563585285, + "teacher_forced": true + }, + "final_layer.adaLN_modulation": { + "rel_l2": 0.0027705871266003857, + "teacher_forced": false + }, + "final_layer": { + "rel_l2": 0.007765820604872541, + "teacher_forced": true + }, + "rule": "tolerance = 2 x the oracle's own bf16 against fp32 relative L2: teacher-forced for each block and the final layer, free running for the time vector, modulations and embeddings and for the velocity", + "exact_free": { + "rel_l2": 5e-05 + }, + "exact_velocity": { + "rel_l2": 5e-05 + } + }, + "notes": [ + "the adapter is applied unmerged as PEFT applies it; the gmlx side runs it under a patch table" + ], + "created": "2026-10-16T17:30:28Z", + "npz": "check7_flux2_klein_mikkoani_512.npz", + "tensors": { + "double_blocks.0.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "61390c70ee4159e046235a88b8da56fdfde80d36131ec9785eed83b4e742dd49" + }, + "double_blocks.0.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "bf755109254f402de2ff1665b549040fd9f23661e4ff9943e9cf6bd19004c4d2" + }, + "double_blocks.1.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "798987ca3626738e6575cc30a353fb4160a3ce2fd00590087fd9665879880ef9" + }, + "double_blocks.1.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "ed71e79ffa84c524bfcdbcdce852dfc353f4d53e9d50b0c0a1e193ed913cfa1e" + }, + "double_blocks.2.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "d26ddb113557c162e505fdc6d4d3f00268bc87649fb7b880e32570fc5850e4ab" + }, + "double_blocks.2.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "460b09e201b810bbce40f268d8114a111288d65340918a069a9f4479049a7845" + }, + "double_blocks.3.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "b4083262cadc23b6ce87b41f35682ab333110c385b324f1934424d8db1e5dfa5" + }, + "double_blocks.3.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "08a9d64e743a9dc3a4d3d10bf75c6749a3c8402b16ca94541bee9eb3f9f7e4af" + }, + "double_blocks.4.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "579969292855aef7f661cbe6c85508b6f158c6ee976bc5a4a4a7bc7f5945f0c9" + }, + "double_blocks.4.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "6409862a6184416d6d930dca26806974c838cc9583f7eac5d9662d117a82951d" + }, + "double_stream_modulation_img": { + "shape": [ + 1, + 18432 + ], + "dtype": "float32", + "sha256": "4ee30047b3e6dae420119278ff22bcabbbc4e81caff9cacc931d6772b941c0a3" + }, + "double_stream_modulation_txt": { + "shape": [ + 1, + 18432 + ], + "dtype": "float32", + "sha256": "482250b40d35864c8f72a097dfcd531b74e17bba04f14241142ab357056bd2c9" + }, + "features": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "3482cc3e89168264731155ce529cc5ff9299b09f9e6ade75b1a420d631896802" + }, + "final_layer": { + "shape": [ + 1024, + 128 + ], + "dtype": "float32", + "sha256": "e2c4642189a0879fff04cfa228bea730a7d5e052b6386ba4b9cae848b4f63e4a" + }, + "final_layer.adaLN_modulation": { + "shape": [ + 1, + 6144 + ], + "dtype": "float32", + "sha256": "0ebb63d3a29bea2dafbbdad9050417c53dcd46ce81c8461ac79056aa81f95cb5" + }, + "ids.image": { + "shape": [ + 1024, + 4 + ], + "dtype": "float32", + "sha256": "8e6ca6477f8b787a44f1d3a6c05641319299ae79d0c43802e3396b7e9558fe8d" + }, + "ids.text": { + "shape": [ + 512, + 4 + ], + "dtype": "float32", + "sha256": "914a4d07f258895514e1b52023c57a677aa4925531d34e54831414224030a0f8" + }, + "img_in": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "153bc3dbdbb4160fc7d556e7684ca601f9337aa6c6a02121f481623438140035" + }, + "in.final_layer": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "c5d1dfbfcea111839df953a88dedd6184c05dfbe3cd01641b949823b39dcb56b" + }, + "in.single_blocks.0": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "d3c012f0b1c7ed79175a00a45b366bcd5b718b30979bd2986fd0898b44bbfe5f" + }, + "in.time_in": { + "shape": [ + 1, + 256 + ], + "dtype": "float32", + "sha256": "cbacd50d6ddae5179d08ae5986820a7baaecca4b2a9962dd856fc80aa62707e4" + }, + "latents": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "2cb3e62b5bb6a58f5b08f360ba95db386349bd0b4fe4128bd931125c8cceae04" + }, + "sigma": { + "shape": [], + "dtype": "float32", + "sha256": "e00e5eb9444182f352323374ef4e08ebcb784725fdd4fd612d7730540b3e0c8c" + }, + "single_blocks.0": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "1d3cb4b1a00092f5d28dd2b47863312439d6ffa16aed64c0d79948f8c4ab5ffa" + }, + "single_blocks.1": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "acf4fe2f34f9a33abbd380500058c270cea5012f7f6eaa0de9968557e11a7c01" + }, + "single_blocks.10": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "0db69d32d440c252d0e5e5891417c69c9a72c4435e94c4596b4802c5ea1ecb95" + }, + "single_blocks.11": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "2e9023b7aff279ea75f1a4fb9e1577c94af5df1adb74387e8cd8a7e5887fb118" + }, + "single_blocks.12": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "4f287814845294a2f697cd692284f66f253ee52700923265444c718106d442ca" + }, + "single_blocks.13": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "78b73eca05ce1b18632d9f43bd4abe992150e6963739cb9516f40408d7a1740d" + }, + "single_blocks.14": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "a3f6905486c2cbd637d7925fa2462a8ad693f8d54cb28ec744c9148f79855c09" + }, + "single_blocks.15": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "84019e5d2174556e716f72e4397caf5e9cd67b8bf448c22d6761e63a089ff5d2" + }, + "single_blocks.16": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "f4e46afaea9fbddba3fc2ebb586835c3a1b1c592969ebbe781f66357801b8964" + }, + "single_blocks.17": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "90400d1bfe0c86b61321fb8e82736b3a61f56efb95ac50cc2e127b5fcc4f7986" + }, + "single_blocks.18": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "382ba6d7cb983d58199cd326719ea82f96a105b674f83781e730d9eb5720b1b2" + }, + "single_blocks.19": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "a288d039b755682809068012ceb3bd294a55e5a455742ac88c2ab82ba7c56ec4" + }, + "single_blocks.2": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "151ad73235142a2e8259757f02aa4d929a794994775e1a23819435137ba6fcd3" + }, + "single_blocks.3": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "361b42bc6bd24f3baa7774beb82b4072b474ec2f907dd92cd7a1986a390fa100" + }, + "single_blocks.4": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "ba25ab2763d4c4fc6250881b7a3211861e82162754110d0495c5cef54a45ae87" + }, + "single_blocks.5": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "4cba6a34153b36115445670986ef8794476651e36d27a5e7f6e1d074b2f0942a" + }, + "single_blocks.6": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "ce8e5fafc81ea1121f5fbb1a3a3424044ed9c78857bc2a10a3f07fb14fdf37ec" + }, + "single_blocks.7": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "870f96f6487f3a37aa22461b4a9acabd9fd468a4dbc37e278dae8e886ed93dbc" + }, + "single_blocks.8": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "7da841ba72435970dd876e731c558ce48196c349c4503b77627c72bac505aa34" + }, + "single_blocks.9": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "7add625af710b23d36f94956d5d2e2a2f8951c8eb1eb3343300cb53374c70528" + }, + "single_stream_modulation": { + "shape": [ + 1, + 9216 + ], + "dtype": "float32", + "sha256": "120948198c29b521754b6b39454864e82f32161adede73d939cd14cfade6c3d4" + }, + "txt_in": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "3d69d3571d1fe732cd193fe97eae90834a65320a47a3f06c6566031b17fe79ff" + }, + "vec": { + "shape": [ + 1, + 3072 + ], + "dtype": "float32", + "sha256": "1f669d07af0ecb908139d999eb12e9dfffa7216d21ec7ae4cc9fc56d1335f3b2" + }, + "velocity": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "6a2e6186dc9af23d3e72b323e96a6d5496f6dafec383d74c58dd7123e4e051ba" + }, + "velocity_bf16": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "eea46184506cc12813bbc35de2951c9255d44304954e9408729e9f73d3f70e43" + } + } +} diff --git a/tests/fixtures/image/oracle/check7_flux2_klein_pixel_art_512.manifest.json b/tests/fixtures/image/oracle/check7_flux2_klein_pixel_art_512.manifest.json new file mode 100644 index 000000000..8a13b3d61 --- /dev/null +++ b/tests/fixtures/image/oracle/check7_flux2_klein_pixel_art_512.manifest.json @@ -0,0 +1,1505 @@ +{ + "schema": 1, + "name": "check7_flux2_klein_pixel_art_512", + "check": 7, + "family": "flux2_klein", + "script": "scripts/image_oracle/check7_flux2_klein_community.py", + "argv": [ + "check7_flux2_klein_community.py", + "--reference", + "src", + "--spec", + "adapters.json", + "--gguf", + "flux-2-klein-4b-Q4_K_M.gguf", + "flux-2-klein-base-4b-Q4_K_M.gguf", + "--only", + "pixel_art" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": { + "dit": { + "name": "flux-2-klein-4b-Q4_K_M.gguf", + "size": 2604311104, + "sha256": "0b25d143c8469b342bc5af3bce92b783bf6b0636d285f7b2f75e38af63af9a15" + }, + "lora": { + "name": "pytorch_lora_weights.safetensors", + "size": 325280664, + "sha256": "72ac6e652196cd9f450d4d3256d197978d3fa690e22dc21361d3bd4fb4e8250e" + } + }, + "inputs": { + "size": 512, + "sigma": 1.0, + "step": 0, + "schedule": "get_schedule(4, 1024)", + "seed": 512, + "latents": "seeded normal, rounded to bf16", + "features": "seeded normal, std 4.0, rounded to bf16", + "text_rows": 512, + "refs": 0, + "ref_size": 0, + "dequant": "exact", + "matmul_bf16": "bf16 operands, float32 GEMM, one bf16 rounding", + "timestep": "bf16 as the reference's denoise fills it, in both modes", + "reference_commit": "50fe5162777813d869182b139e83b10743caef15", + "gguf_codecs": { + "F32": 60, + "Q5_K": 30, + "Q4_K": 50, + "BF16": 9 + }, + "source": "check3_flux2_klein_512", + "strength": 1.0, + "adapter": { + "id": "pixel_art", + "repo": "Limbicnation/pixel-art-lora", + "revision": "0ac8e5c3400af68228811edc324721e25fc26777", + "license": "apache-2.0", + "pairs": 86, + "spelling": "diffusers", + "ranks": [ + 64 + ], + "alphas": null, + "scales": [ + 16.0 + ], + "scale_source": "peft 0.18.1 LoraConfig from the header", + "peft": "0.18.1", + "tensor_dtypes": [ + "float32" + ], + "header_config": { + "transformer.alora_invocation_tokens": null, + "transformer.alpha_pattern": {}, + "transformer.arrow_config": null, + "transformer.auto_mapping": null, + "transformer.base_model_name_or_path": null, + "transformer.bias": "none", + "transformer.corda_config": null, + "transformer.ensure_weight_tying": false, + "transformer.eva_config": null, + "transformer.exclude_modules": null, + "transformer.fan_in_fan_out": false, + "transformer.inference_mode": false, + "transformer.init_lora_weights": true, + "transformer.layer_replication": null, + "transformer.layers_pattern": null, + "transformer.layers_to_transform": null, + "transformer.loftq_config": {}, + "transformer.lora_alpha": 128, + "transformer.lora_bias": false, + "transformer.lora_dropout": 0.0, + "transformer.megatron_config": null, + "transformer.megatron_core": "megatron.core", + "transformer.modules_to_save": null, + "transformer.peft_type": "LORA", + "transformer.peft_version": "0.18.1", + "transformer.qalora_group_size": 16, + "transformer.r": 64, + "transformer.rank_pattern": {}, + "transformer.revision": null, + "transformer.target_modules": [ + "linear_out", + "to_qkv_mlp_proj", + "add_q_proj", + "context_embedder", + "single_stream_modulation.linear", + "proj_out", + "double_stream_modulation_img.linear", + "add_k_proj", + "double_stream_modulation_txt.linear", + "to_k", + "to_q", + "to_v", + "to_add_out", + "linear_in", + "to_out.0", + "add_v_proj", + "x_embedder" + ], + "transformer.target_parameters": null, + "transformer.task_type": null, + "transformer.trainable_token_indices": null, + "transformer.use_dora": false, + "transformer.use_qalora": false, + "transformer.use_rslora": true + } + }, + "lora_pairs": 86, + "targets": [ + [ + "double_blocks.0.img_attn.proj", + null + ], + [ + "double_blocks.0.img_attn.qkv", + [ + 0, + 3072 + ] + ], + [ + "double_blocks.0.img_attn.qkv", + [ + 3072, + 3072 + ] + ], + [ + "double_blocks.0.img_attn.qkv", + [ + 6144, + 3072 + ] + ], + [ + "double_blocks.0.img_mlp.0", + null + ], + [ + "double_blocks.0.img_mlp.2", + null + ], + [ + "double_blocks.0.txt_attn.proj", + null + ], + [ + "double_blocks.0.txt_attn.qkv", + [ + 0, + 3072 + ] + ], + [ + "double_blocks.0.txt_attn.qkv", + [ + 3072, + 3072 + ] + ], + [ + "double_blocks.0.txt_attn.qkv", + [ + 6144, + 3072 + ] + ], + [ + "double_blocks.0.txt_mlp.0", + null + ], + [ + "double_blocks.0.txt_mlp.2", + null + ], + [ + "double_blocks.1.img_attn.proj", + null + ], + [ + "double_blocks.1.img_attn.qkv", + [ + 0, + 3072 + ] + ], + [ + "double_blocks.1.img_attn.qkv", + [ + 3072, + 3072 + ] + ], + [ + "double_blocks.1.img_attn.qkv", + [ + 6144, + 3072 + ] + ], + [ + "double_blocks.1.img_mlp.0", + null + ], + [ + "double_blocks.1.img_mlp.2", + null + ], + [ + "double_blocks.1.txt_attn.proj", + null + ], + [ + "double_blocks.1.txt_attn.qkv", + [ + 0, + 3072 + ] + ], + [ + "double_blocks.1.txt_attn.qkv", + [ + 3072, + 3072 + ] + ], + [ + "double_blocks.1.txt_attn.qkv", + [ + 6144, + 3072 + ] + ], + [ + "double_blocks.1.txt_mlp.0", + null + ], + [ + "double_blocks.1.txt_mlp.2", + null + ], + [ + "double_blocks.2.img_attn.proj", + null + ], + [ + "double_blocks.2.img_attn.qkv", + [ + 0, + 3072 + ] + ], + [ + "double_blocks.2.img_attn.qkv", + [ + 3072, + 3072 + ] + ], + [ + "double_blocks.2.img_attn.qkv", + [ + 6144, + 3072 + ] + ], + [ + "double_blocks.2.img_mlp.0", + null + ], + [ + "double_blocks.2.img_mlp.2", + null + ], + [ + "double_blocks.2.txt_attn.proj", + null + ], + [ + "double_blocks.2.txt_attn.qkv", + [ + 0, + 3072 + ] + ], + [ + "double_blocks.2.txt_attn.qkv", + [ + 3072, + 3072 + ] + ], + [ + "double_blocks.2.txt_attn.qkv", + [ + 6144, + 3072 + ] + ], + [ + "double_blocks.2.txt_mlp.0", + null + ], + [ + "double_blocks.2.txt_mlp.2", + null + ], + [ + "double_blocks.3.img_attn.proj", + null + ], + [ + "double_blocks.3.img_attn.qkv", + [ + 0, + 3072 + ] + ], + [ + "double_blocks.3.img_attn.qkv", + [ + 3072, + 3072 + ] + ], + [ + "double_blocks.3.img_attn.qkv", + [ + 6144, + 3072 + ] + ], + [ + "double_blocks.3.img_mlp.0", + null + ], + [ + "double_blocks.3.img_mlp.2", + null + ], + [ + "double_blocks.3.txt_attn.proj", + null + ], + [ + "double_blocks.3.txt_attn.qkv", + [ + 0, + 3072 + ] + ], + [ + "double_blocks.3.txt_attn.qkv", + [ + 3072, + 3072 + ] + ], + [ + "double_blocks.3.txt_attn.qkv", + [ + 6144, + 3072 + ] + ], + [ + "double_blocks.3.txt_mlp.0", + null + ], + [ + "double_blocks.3.txt_mlp.2", + null + ], + [ + "double_blocks.4.img_attn.proj", + null + ], + [ + "double_blocks.4.img_attn.qkv", + [ + 0, + 3072 + ] + ], + [ + "double_blocks.4.img_attn.qkv", + [ + 3072, + 3072 + ] + ], + [ + "double_blocks.4.img_attn.qkv", + [ + 6144, + 3072 + ] + ], + [ + "double_blocks.4.img_mlp.0", + null + ], + [ + "double_blocks.4.img_mlp.2", + null + ], + [ + "double_blocks.4.txt_attn.proj", + null + ], + [ + "double_blocks.4.txt_attn.qkv", + [ + 0, + 3072 + ] + ], + [ + "double_blocks.4.txt_attn.qkv", + [ + 3072, + 3072 + ] + ], + [ + "double_blocks.4.txt_attn.qkv", + [ + 6144, + 3072 + ] + ], + [ + "double_blocks.4.txt_mlp.0", + null + ], + [ + "double_blocks.4.txt_mlp.2", + null + ], + [ + "double_stream_modulation_img.lin", + null + ], + [ + "double_stream_modulation_txt.lin", + null + ], + [ + "final_layer.linear", + null + ], + [ + "img_in", + null + ], + [ + "single_blocks.0.linear1", + null + ], + [ + "single_blocks.1.linear1", + null + ], + [ + "single_blocks.10.linear1", + null + ], + [ + "single_blocks.11.linear1", + null + ], + [ + "single_blocks.12.linear1", + null + ], + [ + "single_blocks.13.linear1", + null + ], + [ + "single_blocks.14.linear1", + null + ], + [ + "single_blocks.15.linear1", + null + ], + [ + "single_blocks.16.linear1", + null + ], + [ + "single_blocks.17.linear1", + null + ], + [ + "single_blocks.18.linear1", + null + ], + [ + "single_blocks.19.linear1", + null + ], + [ + "single_blocks.2.linear1", + null + ], + [ + "single_blocks.3.linear1", + null + ], + [ + "single_blocks.4.linear1", + null + ], + [ + "single_blocks.5.linear1", + null + ], + [ + "single_blocks.6.linear1", + null + ], + [ + "single_blocks.7.linear1", + null + ], + [ + "single_blocks.8.linear1", + null + ], + [ + "single_blocks.9.linear1", + null + ], + [ + "single_stream_modulation.lin", + null + ], + [ + "txt_in", + null + ] + ], + "application": "unmerged: strength * scale * up(down(x)) added to each pair's rows of its layer's output in the mode's dtype" + }, + "results": { + "velocity_bf16_vs_fp32": { + "rel_l2": 0.013536398813508743, + "cosine": 0.9999143257523193, + "max_abs": 0.04905778169631958 + }, + "rows_bf16_vs_fp32": { + "vec": { + "rel_l2": 0.0017350471821734716, + "cosine": 0.9999985048596156, + "max_abs": 0.007456779479980469, + "teacher_forced": false + }, + "double_stream_modulation_img": { + "rel_l2": 0.0024023852904091975, + "cosine": 0.9999971188376952, + "max_abs": 0.05836772918701172, + "teacher_forced": false + }, + "double_stream_modulation_txt": { + "rel_l2": 0.002405700720141712, + "cosine": 0.9999971200827823, + "max_abs": 0.0465850830078125, + "teacher_forced": false + }, + "single_stream_modulation": { + "rel_l2": 0.0022493570518245104, + "cosine": 0.9999974838121755, + "max_abs": 0.11832046508789062, + "teacher_forced": false + }, + "img_in": { + "rel_l2": 0.0025827917655852654, + "cosine": 0.999996664587781, + "max_abs": 0.045083045959472656, + "teacher_forced": false + }, + "txt_in": { + "rel_l2": 0.0023775059506648292, + "cosine": 0.99999717373, + "max_abs": 0.12336540222167969, + "teacher_forced": false + }, + "double_blocks.0.img": { + "rel_l2": 0.009066891483088426, + "cosine": 0.9999625429811837, + "max_abs": 4.7531890869140625, + "teacher_forced": true + }, + "double_blocks.0.txt": { + "rel_l2": 0.0063236405492546124, + "cosine": 0.9999805248241067, + "max_abs": 11.92498779296875, + "teacher_forced": true + }, + "double_blocks.1.img": { + "rel_l2": 0.005251546512025374, + "cosine": 0.9999863639458676, + "max_abs": 2.0895233154296875, + "teacher_forced": true + }, + "double_blocks.1.txt": { + "rel_l2": 0.005076028129194513, + "cosine": 0.9999871767311865, + "max_abs": 6.364501953125, + "teacher_forced": true + }, + "double_blocks.2.img": { + "rel_l2": 0.004439586116081042, + "cosine": 0.9999901665969705, + "max_abs": 2.727569580078125, + "teacher_forced": true + }, + "double_blocks.2.txt": { + "rel_l2": 0.005409743637828448, + "cosine": 0.9999853740108752, + "max_abs": 6.4749755859375, + "teacher_forced": true + }, + "double_blocks.3.img": { + "rel_l2": 0.0040607679395793924, + "cosine": 0.9999917587078981, + "max_abs": 3.2374725341796875, + "teacher_forced": true + }, + "double_blocks.3.txt": { + "rel_l2": 0.004834883248126186, + "cosine": 0.999988346845167, + "max_abs": 7.44970703125, + "teacher_forced": true + }, + "double_blocks.4.img": { + "rel_l2": 0.003951942360842936, + "cosine": 0.9999922082977613, + "max_abs": 9.6468505859375, + "teacher_forced": true + }, + "double_blocks.4.txt": { + "rel_l2": 0.00492553529270278, + "cosine": 0.9999878785073548, + "max_abs": 20.419921875, + "teacher_forced": true + }, + "single_blocks.0": { + "rel_l2": 0.006459193070758815, + "cosine": 0.9999791418716076, + "max_abs": 64.26220703125, + "teacher_forced": true + }, + "single_blocks.1": { + "rel_l2": 0.003714315711763221, + "cosine": 0.9999932219734186, + "max_abs": 50.49609375, + "teacher_forced": true + }, + "single_blocks.2": { + "rel_l2": 0.003731034595041395, + "cosine": 0.9999930756334725, + "max_abs": 58.0791015625, + "teacher_forced": true + }, + "single_blocks.3": { + "rel_l2": 0.0032969954179710285, + "cosine": 0.9999945649026657, + "max_abs": 67.33984375, + "teacher_forced": true + }, + "single_blocks.4": { + "rel_l2": 0.0030078490521352106, + "cosine": 0.9999954787850301, + "max_abs": 50.947265625, + "teacher_forced": true + }, + "single_blocks.5": { + "rel_l2": 0.003271884319255211, + "cosine": 0.9999946672248491, + "max_abs": 58.31884765625, + "teacher_forced": true + }, + "single_blocks.6": { + "rel_l2": 0.003206284649286899, + "cosine": 0.9999951012505188, + "max_abs": 72.27587890625, + "teacher_forced": true + }, + "single_blocks.7": { + "rel_l2": 0.002988829024524078, + "cosine": 0.9999957163185282, + "max_abs": 87.15625, + "teacher_forced": true + }, + "single_blocks.8": { + "rel_l2": 0.0031814188451880438, + "cosine": 0.9999953296443099, + "max_abs": 124.759765625, + "teacher_forced": true + }, + "single_blocks.9": { + "rel_l2": 0.0031175662923267865, + "cosine": 0.9999956207919286, + "max_abs": 173.861328125, + "teacher_forced": true + }, + "single_blocks.10": { + "rel_l2": 0.0037366273887775962, + "cosine": 0.9999949254058902, + "max_abs": 269.4453125, + "teacher_forced": true + }, + "single_blocks.11": { + "rel_l2": 0.003388743596452772, + "cosine": 0.9999957774097583, + "max_abs": 306.7734375, + "teacher_forced": true + }, + "single_blocks.12": { + "rel_l2": 0.003066545493739528, + "cosine": 0.9999962185587512, + "max_abs": 342.9765625, + "teacher_forced": true + }, + "single_blocks.13": { + "rel_l2": 0.0028957664255676715, + "cosine": 0.999996404081617, + "max_abs": 354.8828125, + "teacher_forced": true + }, + "single_blocks.14": { + "rel_l2": 0.002641931729971722, + "cosine": 0.9999970199865598, + "max_abs": 400.40625, + "teacher_forced": true + }, + "single_blocks.15": { + "rel_l2": 0.002312364679981499, + "cosine": 0.9999973893104228, + "max_abs": 451.3359375, + "teacher_forced": true + }, + "single_blocks.16": { + "rel_l2": 0.0021808201767870863, + "cosine": 0.9999976772162418, + "max_abs": 440.71875, + "teacher_forced": true + }, + "single_blocks.17": { + "rel_l2": 0.002256233353157606, + "cosine": 0.9999975141055466, + "max_abs": 389.4921875, + "teacher_forced": true + }, + "single_blocks.18": { + "rel_l2": 0.0025234377061141553, + "cosine": 0.9999968468096572, + "max_abs": 505.71875, + "teacher_forced": true + }, + "single_blocks.19": { + "rel_l2": 0.0035707364528466726, + "cosine": 0.9999936378937351, + "max_abs": 660.5390625, + "teacher_forced": true + }, + "final_layer.adaLN_modulation": { + "rel_l2": 0.0013852935633001928, + "cosine": 0.9999990845155656, + "max_abs": 0.06572341918945312, + "teacher_forced": false + }, + "final_layer": { + "rel_l2": 0.004884579650181091, + "cosine": 0.9999881456688691, + "max_abs": 0.013737797737121582, + "teacher_forced": true + } + }, + "free_bf16_vs_fp32": { + "double_blocks.0.img": 0.010426510738937746, + "double_blocks.0.txt": 0.006362023918135157, + "double_blocks.1.img": 0.011498339497577689, + "double_blocks.1.txt": 0.009331922857949742, + "double_blocks.2.img": 0.012214108156160225, + "double_blocks.2.txt": 0.011528958096289992, + "double_blocks.3.img": 0.012549986691095485, + "double_blocks.3.txt": 0.012446273118581739, + "double_blocks.4.img": 0.009853321414700775, + "double_blocks.4.txt": 0.01011603615708327, + "single_blocks.0": 0.010256224195229235, + "single_blocks.1": 0.009355785840512302, + "single_blocks.2": 0.009504925230500706, + "single_blocks.3": 0.009784559915551683, + "single_blocks.4": 0.010146890335910945, + "single_blocks.5": 0.010015381656711547, + "single_blocks.6": 0.010383277019959393, + "single_blocks.7": 0.01098133173106759, + "single_blocks.8": 0.011972873617297382, + "single_blocks.9": 0.013372927770690077, + "single_blocks.10": 0.014953566256709854, + "single_blocks.11": 0.01577588471873614, + "single_blocks.12": 0.016197239725271137, + "single_blocks.13": 0.0162063299668735, + "single_blocks.14": 0.016026611385533168, + "single_blocks.15": 0.016180111809350403, + "single_blocks.16": 0.015861315691250363, + "single_blocks.17": 0.01522821101255471, + "single_blocks.18": 0.013817162929011915, + "single_blocks.19": 0.01473672236301598, + "final_layer": 0.013536398813508743 + }, + "times": { + "fp32_s": 7.1, + "bf16_s": 15.3, + "bf16_teacher_forced_s": 16.3 + }, + "adapter_effect": { + "velocity": 1.0735832091146214, + "vec": 0.0, + "double_stream_modulation_img": 0.6674604390630596, + "double_stream_modulation_txt": 0.20450086299769818, + "single_stream_modulation": 0.12031543519543221, + "img_in": 0.438134054769638, + "txt_in": 0.12846044026581682, + "double_blocks.0.img": 4.315663757954018, + "double_blocks.0.txt": 0.5821637003909693, + "double_blocks.1.img": 6.8694932769336825, + "double_blocks.1.txt": 0.7377320545445446, + "double_blocks.2.img": 9.1751695733963, + "double_blocks.2.txt": 1.0006279804443317, + "double_blocks.3.img": 8.804394804883987, + "double_blocks.3.txt": 1.1113765677365992, + "double_blocks.4.img": 2.935981483473098, + "double_blocks.4.txt": 1.5858481603560697, + "single_blocks.0": 6.239824149011029, + "single_blocks.1": 8.879957484112944, + "single_blocks.2": 11.18228144806267, + "single_blocks.3": 11.585019674486201, + "single_blocks.4": 11.31425048557007, + "single_blocks.5": 9.520982962662066, + "single_blocks.6": 11.270685296787672, + "single_blocks.7": 13.92144745562332, + "single_blocks.8": 16.65419607054486, + "single_blocks.9": 20.080696825524875, + "single_blocks.10": 30.154914005371886, + "single_blocks.11": 38.92829138332495, + "single_blocks.12": 42.4844099189593, + "single_blocks.13": 49.50883929731555, + "single_blocks.14": 56.002431975720114, + "single_blocks.15": 58.836180902670286, + "single_blocks.16": 56.702519102425384, + "single_blocks.17": 48.54970870388869, + "single_blocks.18": 31.68416091291786, + "single_blocks.19": 23.337476165495705, + "final_layer.adaLN_modulation": 0.0, + "final_layer": 1.0735832091146216 + }, + "key_table": { + "layers": 89, + "converter_names": 109, + "same_layer_and_rows": true, + "halves_the_converter_leaves_unswapped": [ + "norm_out.linear" + ] + }, + "diffusers_loader": { + "ran": true, + "names": 86, + "names_without_an_oracle_pair": [], + "count_without_an_oracle_pair": 0, + "worst_product_rel_l2": 1.9767487652213764e-16, + "peft_scale_left_to_peft": true + }, + "exact_free_floor": { + "rel_l2": 2.3101336017825216e-06, + "row": "free double_blocks.3.img", + "measured": "gmlx's exact step on the GPU against the same step on the CPU stream, worst free row; tests/image/flux2_gates.py exact_free_floor on flux2-klein, Apple M5 Max" + }, + "exact_velocity_floor": { + "rel_l2": 1.97036963813378e-06, + "measured": "gmlx's exact step on the GPU against the same step on the CPU stream, velocity; tests/image/flux2_gates.py exact_free_floor on flux2-klein, Apple M5 Max" + } + }, + "tolerances": { + "velocity": { + "rel_l2": 0.027072797627017486, + "cosine_min": 0.9996573030092772 + }, + "vec": { + "rel_l2": 0.003470094364346943, + "teacher_forced": false + }, + "double_stream_modulation_img": { + "rel_l2": 0.004804770580818395, + "teacher_forced": false + }, + "double_stream_modulation_txt": { + "rel_l2": 0.004811401440283424, + "teacher_forced": false + }, + "single_stream_modulation": { + "rel_l2": 0.004498714103649021, + "teacher_forced": false + }, + "img_in": { + "rel_l2": 0.005165583531170531, + "teacher_forced": false + }, + "txt_in": { + "rel_l2": 0.0047550119013296584, + "teacher_forced": false + }, + "double_blocks.0.img": { + "rel_l2": 0.01813378296617685, + "teacher_forced": true + }, + "double_blocks.0.txt": { + "rel_l2": 0.012647281098509225, + "teacher_forced": true + }, + "double_blocks.1.img": { + "rel_l2": 0.010503093024050747, + "teacher_forced": true + }, + "double_blocks.1.txt": { + "rel_l2": 0.010152056258389027, + "teacher_forced": true + }, + "double_blocks.2.img": { + "rel_l2": 0.008879172232162084, + "teacher_forced": true + }, + "double_blocks.2.txt": { + "rel_l2": 0.010819487275656896, + "teacher_forced": true + }, + "double_blocks.3.img": { + "rel_l2": 0.008121535879158785, + "teacher_forced": true + }, + "double_blocks.3.txt": { + "rel_l2": 0.009669766496252372, + "teacher_forced": true + }, + "double_blocks.4.img": { + "rel_l2": 0.007903884721685872, + "teacher_forced": true + }, + "double_blocks.4.txt": { + "rel_l2": 0.00985107058540556, + "teacher_forced": true + }, + "single_blocks.0": { + "rel_l2": 0.01291838614151763, + "teacher_forced": true + }, + "single_blocks.1": { + "rel_l2": 0.007428631423526442, + "teacher_forced": true + }, + "single_blocks.2": { + "rel_l2": 0.00746206919008279, + "teacher_forced": true + }, + "single_blocks.3": { + "rel_l2": 0.006593990835942057, + "teacher_forced": true + }, + "single_blocks.4": { + "rel_l2": 0.006015698104270421, + "teacher_forced": true + }, + "single_blocks.5": { + "rel_l2": 0.006543768638510422, + "teacher_forced": true + }, + "single_blocks.6": { + "rel_l2": 0.006412569298573798, + "teacher_forced": true + }, + "single_blocks.7": { + "rel_l2": 0.005977658049048156, + "teacher_forced": true + }, + "single_blocks.8": { + "rel_l2": 0.0063628376903760876, + "teacher_forced": true + }, + "single_blocks.9": { + "rel_l2": 0.006235132584653573, + "teacher_forced": true + }, + "single_blocks.10": { + "rel_l2": 0.0074732547775551925, + "teacher_forced": true + }, + "single_blocks.11": { + "rel_l2": 0.006777487192905544, + "teacher_forced": true + }, + "single_blocks.12": { + "rel_l2": 0.006133090987479056, + "teacher_forced": true + }, + "single_blocks.13": { + "rel_l2": 0.005791532851135343, + "teacher_forced": true + }, + "single_blocks.14": { + "rel_l2": 0.005283863459943444, + "teacher_forced": true + }, + "single_blocks.15": { + "rel_l2": 0.004624729359962998, + "teacher_forced": true + }, + "single_blocks.16": { + "rel_l2": 0.0043616403535741725, + "teacher_forced": true + }, + "single_blocks.17": { + "rel_l2": 0.004512466706315212, + "teacher_forced": true + }, + "single_blocks.18": { + "rel_l2": 0.005046875412228311, + "teacher_forced": true + }, + "single_blocks.19": { + "rel_l2": 0.007141472905693345, + "teacher_forced": true + }, + "final_layer.adaLN_modulation": { + "rel_l2": 0.0027705871266003857, + "teacher_forced": false + }, + "final_layer": { + "rel_l2": 0.009769159300362183, + "teacher_forced": true + }, + "rule": "tolerance = 2 x the oracle's own bf16 against fp32 relative L2: teacher-forced for each block and the final layer, free running for the time vector, modulations and embeddings and for the velocity", + "exact_free": { + "rel_l2": 5e-05 + }, + "exact_velocity": { + "rel_l2": 5e-05 + } + }, + "notes": [ + "the adapter is applied unmerged as PEFT applies it; the gmlx side runs it under a patch table" + ], + "created": "2026-10-16T17:29:41Z", + "npz": "check7_flux2_klein_pixel_art_512.npz", + "tensors": { + "double_blocks.0.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "490745f2362bf01518bfde92b21ec88a5c231458a59e0c5e61bb9913f2e90968" + }, + "double_blocks.0.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "0df7561ecf80f433e1ba77b888fba89b7604a0de50f52b226a7a14c09221bb26" + }, + "double_blocks.1.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "9bb73ba51984ad87c4a0877e4af4d7c900979995b5a3c6e9f0b1a2568e032c1e" + }, + "double_blocks.1.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "fab9bdf016b55e80abdf54d374c918736c65304cae2945c35bf46317589ed579" + }, + "double_blocks.2.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "d5ce8934901ea16740f5cf9c28a8e03cf9409ae543a6c75e49465c296565e0ce" + }, + "double_blocks.2.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "3ed8fe5c455f50d36f36a9e860276157754c12dfd1cca4febc6dd92b45cbc241" + }, + "double_blocks.3.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "da0a4d81fc98d8e00491edce316becd77811206dcbbb0c0e0332dbd59017bf14" + }, + "double_blocks.3.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "912d7eef25e2e45649008abd5906ed910cf1e1a3502b8128a31e58f0cf2e2902" + }, + "double_blocks.4.img": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "44a1acaf28c96ee43e0e5f378ce75aed11b35f3cffbab423db9c0ee22d2cddbd" + }, + "double_blocks.4.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "339f4e1eafd6fa1f9e80a01ccdd4feff34d212158a00c1279842ec044e18ddbb" + }, + "double_stream_modulation_img": { + "shape": [ + 1, + 18432 + ], + "dtype": "float32", + "sha256": "d36b99943619f14b82f4cdb29059c0008f485bf8b2612b33a54d130660d62b09" + }, + "double_stream_modulation_txt": { + "shape": [ + 1, + 18432 + ], + "dtype": "float32", + "sha256": "78d382e2fe03dace8c0893772a97267c9dbafa36b3c9eac8a7cded9c9a7758eb" + }, + "features": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "3482cc3e89168264731155ce529cc5ff9299b09f9e6ade75b1a420d631896802" + }, + "final_layer": { + "shape": [ + 1024, + 128 + ], + "dtype": "float32", + "sha256": "1b5cc56e7ad8c535489663cbbffd858aad77bb972851c5aed284b422b2c0456f" + }, + "final_layer.adaLN_modulation": { + "shape": [ + 1, + 6144 + ], + "dtype": "float32", + "sha256": "0ebb63d3a29bea2dafbbdad9050417c53dcd46ce81c8461ac79056aa81f95cb5" + }, + "ids.image": { + "shape": [ + 1024, + 4 + ], + "dtype": "float32", + "sha256": "8e6ca6477f8b787a44f1d3a6c05641319299ae79d0c43802e3396b7e9558fe8d" + }, + "ids.text": { + "shape": [ + 512, + 4 + ], + "dtype": "float32", + "sha256": "914a4d07f258895514e1b52023c57a677aa4925531d34e54831414224030a0f8" + }, + "img_in": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "65f4f9feb991e311bea90a1cf131c0d7e6e1b42687c8a2e332654452c13bdc6d" + }, + "in.final_layer": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "0b201cda9f9a24622daa96795af62da6980e8a245a635ffbe78434135433c82b" + }, + "in.single_blocks.0": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "45ddce8d3a77fd40943576a08e4d0059cac0c328c713e9a47c7160e2c05a10ef" + }, + "in.time_in": { + "shape": [ + 1, + 256 + ], + "dtype": "float32", + "sha256": "cbacd50d6ddae5179d08ae5986820a7baaecca4b2a9962dd856fc80aa62707e4" + }, + "latents": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "2cb3e62b5bb6a58f5b08f360ba95db386349bd0b4fe4128bd931125c8cceae04" + }, + "sigma": { + "shape": [], + "dtype": "float32", + "sha256": "e00e5eb9444182f352323374ef4e08ebcb784725fdd4fd612d7730540b3e0c8c" + }, + "single_blocks.0": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "a8d2b5697be01adf9f44a715cb9ceaf44895e456cd2aab6f5cf725b88ccd3ab7" + }, + "single_blocks.1": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "7ab1cdefd4cd94707d4e2d7519e1a93aec5518e83553c40167f9664e2a516015" + }, + "single_blocks.10": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "9dad45bf3bb9c0668e4bc1b4af71d4531ed9a6b0651143aa6d5e1cca39a762b4" + }, + "single_blocks.11": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "c07fbcfb53dfe1761a2566503d3eb5de8c5215760d6e1019461868a9fcc9a327" + }, + "single_blocks.12": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "662a4d3fedd30119b6f183b5a860738ce9b10577f02d1426ae25c432169258c7" + }, + "single_blocks.13": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "011586e893b4b01c8350ac253c1b676542103b1fc0674c32f615eb3c80b9ae6c" + }, + "single_blocks.14": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "a9e54ae2206eddd72a01f3b96cdd014bd67eb06d7729a9f938b7025e1f5ce484" + }, + "single_blocks.15": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "0967cf3505a9d9f9b9b80e96fb86b3430862ac29e3d3b015defd7259fa789b6b" + }, + "single_blocks.16": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "5693fab217b0ea41913f4c5e2017b3964d1ef7fbdb171ceef85aded2b5bb7bd3" + }, + "single_blocks.17": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "b3cc983b4a004753184564f9addc498e0f3753f2e05df65f9cb2f4ab67500b08" + }, + "single_blocks.18": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "3da6b87f0aa88d077b79fc49584a478a24e2ce3f909c94e2681ad4306964f8d6" + }, + "single_blocks.19": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "a9319e2ee957770995e62fcc4e2c3bc711b23645d716095c4f57344212fe75e5" + }, + "single_blocks.2": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "f4a34a335bd17341eec3ff0ada91a56043f314d27428353f0868f5432d63415d" + }, + "single_blocks.3": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "7c2f343dbeb2c70e47eafcadb9f64706d9fd5edfcde434f5d75b0df986ecad36" + }, + "single_blocks.4": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "7b3769364ce48897d291500eb520ba7c34bd736c66e738fdf9694bf9d511e2dc" + }, + "single_blocks.5": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "812caacb5b234a5545c75438aca2f2052ac79cbf25dc8690775837e0dc03f89a" + }, + "single_blocks.6": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "06174c7d27185f159aa86a7aba1018f78f494f5f9f7a37adc8ffba44bf432f5b" + }, + "single_blocks.7": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "20547b8222c23c08492680d323f8845798f28ab0bd8941be81f23286d36668e1" + }, + "single_blocks.8": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "cdc93624b305c511170d5bd77650a11d3f849fbae57f05ece46b2d0e40f8cbe0" + }, + "single_blocks.9": { + "shape": [ + 1536, + 3072 + ], + "dtype": "float32", + "sha256": "7ed7b00d7b44000f46e2c90e1e27be8c6cb0fbea1d339b5c6732289d53d081fa" + }, + "single_stream_modulation": { + "shape": [ + 1, + 9216 + ], + "dtype": "float32", + "sha256": "8abb1072b6cd9430991d8a69aad28aa095b1f2b70890f860fb349b0fba4b0df9" + }, + "txt_in": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "7e7b7c8a16b7f081d8a8a067a12a1250b06a310d3e524acb3531d437e7116604" + }, + "vec": { + "shape": [ + 1, + 3072 + ], + "dtype": "float32", + "sha256": "1f669d07af0ecb908139d999eb12e9dfffa7216d21ec7ae4cc9fc56d1335f3b2" + }, + "velocity": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "ee92975cecc614d840447f0f0644e0f2fa95cc15e734d146b251a3d38414ec76" + }, + "velocity_bf16": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "81a5e98bbfd4edfd0e81937657bdeb02938b4aa60e20cc13a30261b381db75c7" + } + } +} diff --git a/tests/fixtures/image/oracle/check7_flux2_klein_sketch_512.manifest.json b/tests/fixtures/image/oracle/check7_flux2_klein_sketch_512.manifest.json new file mode 100644 index 000000000..0b08a753a --- /dev/null +++ b/tests/fixtures/image/oracle/check7_flux2_klein_sketch_512.manifest.json @@ -0,0 +1,1346 @@ +{ + "schema": 1, + "name": "check7_flux2_klein_sketch_512", + "check": 7, + "family": "flux2_klein", + "script": "scripts/image_oracle/check7_flux2_klein_community.py", + "argv": [ + "check7_flux2_klein_community.py", + "--reference", + "src", + "--spec", + "adapters.json", + "--gguf", + "flux-2-klein-4b-Q4_K_M.gguf", + "flux-2-klein-base-4b-Q4_K_M.gguf", + "--only", + "sketch" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": { + "dit": { + "name": "flux-2-klein-base-4b-Q4_K_M.gguf", + "size": 2604311104, + "sha256": "8348ff1f2b3ac3cf9eb62f38322fcbb6d92811d39aa036d0671cf7bef9411266" + }, + "lora": { + "name": "sketch_to_image_klein_4b.safetensors", + "size": 92426712, + "sha256": "6e84275b88b602b352201231e9147c8947b63385f313c1c875467850fb36bbfd" + } + }, + "inputs": { + "size": 512, + "sigma": 1.0, + "step": 0, + "schedule": "get_schedule(50, 1024)", + "seed": 512, + "latents": "seeded normal, rounded to bf16", + "features": "seeded normal, std 4.0, rounded to bf16", + "text_rows": 512, + "refs": 1, + "ref_size": 512, + "dequant": "exact", + "matmul_bf16": "bf16 operands, float32 GEMM, one bf16 rounding", + "timestep": "bf16 as the reference's denoise fills it, in both modes", + "reference_commit": "50fe5162777813d869182b139e83b10743caef15", + "gguf_codecs": { + "F32": 60, + "Q5_K": 30, + "Q4_K": 50, + "BF16": 9 + }, + "source": "check3_flux2_klein_base_r1_512", + "strength": 1.0, + "adapter": { + "id": "sketch", + "repo": "ostris/sketch_to_image_klein_4b", + "revision": "898fa73df3c60b8f7d83ec667345690b31c4d5da", + "license": "apache-2.0", + "pairs": 80, + "spelling": "reference", + "ranks": [ + 32 + ], + "alphas": null, + "scales": [ + 1.0 + ], + "scale_source": "alpha over rank, 1 without an alpha", + "peft": null, + "tensor_dtypes": [ + "bfloat16" + ], + "header_config": null + }, + "lora_pairs": 80, + "targets": [ + [ + "double_blocks.0.img_attn.proj", + null + ], + [ + "double_blocks.0.img_attn.qkv", + null + ], + [ + "double_blocks.0.img_mlp.0", + null + ], + [ + "double_blocks.0.img_mlp.2", + null + ], + [ + "double_blocks.0.txt_attn.proj", + null + ], + [ + "double_blocks.0.txt_attn.qkv", + null + ], + [ + "double_blocks.0.txt_mlp.0", + null + ], + [ + "double_blocks.0.txt_mlp.2", + null + ], + [ + "double_blocks.1.img_attn.proj", + null + ], + [ + "double_blocks.1.img_attn.qkv", + null + ], + [ + "double_blocks.1.img_mlp.0", + null + ], + [ + "double_blocks.1.img_mlp.2", + null + ], + [ + "double_blocks.1.txt_attn.proj", + null + ], + [ + "double_blocks.1.txt_attn.qkv", + null + ], + [ + "double_blocks.1.txt_mlp.0", + null + ], + [ + "double_blocks.1.txt_mlp.2", + null + ], + [ + "double_blocks.2.img_attn.proj", + null + ], + [ + "double_blocks.2.img_attn.qkv", + null + ], + [ + "double_blocks.2.img_mlp.0", + null + ], + [ + "double_blocks.2.img_mlp.2", + null + ], + [ + "double_blocks.2.txt_attn.proj", + null + ], + [ + "double_blocks.2.txt_attn.qkv", + null + ], + [ + "double_blocks.2.txt_mlp.0", + null + ], + [ + "double_blocks.2.txt_mlp.2", + null + ], + [ + "double_blocks.3.img_attn.proj", + null + ], + [ + "double_blocks.3.img_attn.qkv", + null + ], + [ + "double_blocks.3.img_mlp.0", + null + ], + [ + "double_blocks.3.img_mlp.2", + null + ], + [ + "double_blocks.3.txt_attn.proj", + null + ], + [ + "double_blocks.3.txt_attn.qkv", + null + ], + [ + "double_blocks.3.txt_mlp.0", + null + ], + [ + "double_blocks.3.txt_mlp.2", + null + ], + [ + "double_blocks.4.img_attn.proj", + null + ], + [ + "double_blocks.4.img_attn.qkv", + null + ], + [ + "double_blocks.4.img_mlp.0", + null + ], + [ + "double_blocks.4.img_mlp.2", + null + ], + [ + "double_blocks.4.txt_attn.proj", + null + ], + [ + "double_blocks.4.txt_attn.qkv", + null + ], + [ + "double_blocks.4.txt_mlp.0", + null + ], + [ + "double_blocks.4.txt_mlp.2", + null + ], + [ + "single_blocks.0.linear1", + null + ], + [ + "single_blocks.0.linear2", + null + ], + [ + "single_blocks.1.linear1", + null + ], + [ + "single_blocks.1.linear2", + null + ], + [ + "single_blocks.10.linear1", + null + ], + [ + "single_blocks.10.linear2", + null + ], + [ + "single_blocks.11.linear1", + null + ], + [ + "single_blocks.11.linear2", + null + ], + [ + "single_blocks.12.linear1", + null + ], + [ + "single_blocks.12.linear2", + null + ], + [ + "single_blocks.13.linear1", + null + ], + [ + "single_blocks.13.linear2", + null + ], + [ + "single_blocks.14.linear1", + null + ], + [ + "single_blocks.14.linear2", + null + ], + [ + "single_blocks.15.linear1", + null + ], + [ + "single_blocks.15.linear2", + null + ], + [ + "single_blocks.16.linear1", + null + ], + [ + "single_blocks.16.linear2", + null + ], + [ + "single_blocks.17.linear1", + null + ], + [ + "single_blocks.17.linear2", + null + ], + [ + "single_blocks.18.linear1", + null + ], + [ + "single_blocks.18.linear2", + null + ], + [ + "single_blocks.19.linear1", + null + ], + [ + "single_blocks.19.linear2", + null + ], + [ + "single_blocks.2.linear1", + null + ], + [ + "single_blocks.2.linear2", + null + ], + [ + "single_blocks.3.linear1", + null + ], + [ + "single_blocks.3.linear2", + null + ], + [ + "single_blocks.4.linear1", + null + ], + [ + "single_blocks.4.linear2", + null + ], + [ + "single_blocks.5.linear1", + null + ], + [ + "single_blocks.5.linear2", + null + ], + [ + "single_blocks.6.linear1", + null + ], + [ + "single_blocks.6.linear2", + null + ], + [ + "single_blocks.7.linear1", + null + ], + [ + "single_blocks.7.linear2", + null + ], + [ + "single_blocks.8.linear1", + null + ], + [ + "single_blocks.8.linear2", + null + ], + [ + "single_blocks.9.linear1", + null + ], + [ + "single_blocks.9.linear2", + null + ] + ], + "application": "unmerged: strength * scale * up(down(x)) added to each pair's rows of its layer's output in the mode's dtype" + }, + "results": { + "velocity_bf16_vs_fp32": { + "rel_l2": 0.009828753446642344, + "cosine": 0.9999525578822632, + "max_abs": 0.05103349685668945 + }, + "rows_bf16_vs_fp32": { + "vec": { + "rel_l2": 0.0017382974193546016, + "cosine": 0.9999984963979891, + "max_abs": 0.01546478271484375, + "teacher_forced": false + }, + "double_stream_modulation_img": { + "rel_l2": 0.0016464845265631162, + "cosine": 0.999998656706599, + "max_abs": 0.2581787109375, + "teacher_forced": false + }, + "double_stream_modulation_txt": { + "rel_l2": 0.0017673264060670969, + "cosine": 0.9999984496291131, + "max_abs": 0.08278656005859375, + "teacher_forced": false + }, + "single_stream_modulation": { + "rel_l2": 0.0016693167013436423, + "cosine": 0.9999987328209464, + "max_abs": 0.25644683837890625, + "teacher_forced": false + }, + "img_in": { + "rel_l2": 0.0016577882596413905, + "cosine": 0.9999986258688389, + "max_abs": 0.030887603759765625, + "teacher_forced": false + }, + "txt_in": { + "rel_l2": 0.0016594420810833153, + "cosine": 0.9999986231333832, + "max_abs": 0.06241798400878906, + "teacher_forced": false + }, + "double_blocks.0.img": { + "rel_l2": 0.011226165923119856, + "cosine": 0.99993760693589, + "max_abs": 4.503021240234375, + "teacher_forced": true + }, + "double_blocks.0.txt": { + "rel_l2": 0.007611734615602991, + "cosine": 0.9999722470127489, + "max_abs": 33.69677734375, + "teacher_forced": true + }, + "double_blocks.1.img": { + "rel_l2": 0.006610060130130708, + "cosine": 0.9999793428146428, + "max_abs": 3.537200927734375, + "teacher_forced": true + }, + "double_blocks.1.txt": { + "rel_l2": 0.0047497351905966, + "cosine": 0.9999887208351715, + "max_abs": 18.768798828125, + "teacher_forced": true + }, + "double_blocks.2.img": { + "rel_l2": 0.005764109914240751, + "cosine": 0.9999837919040537, + "max_abs": 2.142364501953125, + "teacher_forced": true + }, + "double_blocks.2.txt": { + "rel_l2": 0.0050498585820023985, + "cosine": 0.9999872508321308, + "max_abs": 17.6634521484375, + "teacher_forced": true + }, + "double_blocks.3.img": { + "rel_l2": 0.006928010572655159, + "cosine": 0.9999761260995654, + "max_abs": 3.2081298828125, + "teacher_forced": true + }, + "double_blocks.3.txt": { + "rel_l2": 0.005006017275929405, + "cosine": 0.9999874703222607, + "max_abs": 18.4591064453125, + "teacher_forced": true + }, + "double_blocks.4.img": { + "rel_l2": 0.004385733684957633, + "cosine": 0.9999914626212175, + "max_abs": 9.620849609375, + "teacher_forced": true + }, + "double_blocks.4.txt": { + "rel_l2": 0.005320042591254249, + "cosine": 0.9999859065853988, + "max_abs": 24.90576171875, + "teacher_forced": true + }, + "single_blocks.0": { + "rel_l2": 0.004493673848790981, + "cosine": 0.9999899053016779, + "max_abs": 13.206787109375, + "teacher_forced": true + }, + "single_blocks.1": { + "rel_l2": 0.005892057347073427, + "cosine": 0.9999826679524435, + "max_abs": 18.28662109375, + "teacher_forced": true + }, + "single_blocks.2": { + "rel_l2": 0.007705619847546442, + "cosine": 0.9999705688190557, + "max_abs": 15.06298828125, + "teacher_forced": true + }, + "single_blocks.3": { + "rel_l2": 0.005961844216917569, + "cosine": 0.999982233425186, + "max_abs": 15.01953125, + "teacher_forced": true + }, + "single_blocks.4": { + "rel_l2": 0.005987315698465062, + "cosine": 0.9999820918114736, + "max_abs": 13.252227783203125, + "teacher_forced": true + }, + "single_blocks.5": { + "rel_l2": 0.0036115601672907544, + "cosine": 0.9999936488199876, + "max_abs": 38.70703125, + "teacher_forced": true + }, + "single_blocks.6": { + "rel_l2": 0.0037520812879051476, + "cosine": 0.9999935953823185, + "max_abs": 30.98193359375, + "teacher_forced": true + }, + "single_blocks.7": { + "rel_l2": 0.0036333580123873613, + "cosine": 0.9999935355284093, + "max_abs": 18.50244140625, + "teacher_forced": true + }, + "single_blocks.8": { + "rel_l2": 0.003828439473780301, + "cosine": 0.9999929967571527, + "max_abs": 18.962890625, + "teacher_forced": true + }, + "single_blocks.9": { + "rel_l2": 0.003932271025778958, + "cosine": 0.9999924225966825, + "max_abs": 18.633544921875, + "teacher_forced": true + }, + "single_blocks.10": { + "rel_l2": 0.006854829781106258, + "cosine": 0.9999791591397392, + "max_abs": 31.2432861328125, + "teacher_forced": true + }, + "single_blocks.11": { + "rel_l2": 0.006272106401085473, + "cosine": 0.9999808474756363, + "max_abs": 17.00982666015625, + "teacher_forced": true + }, + "single_blocks.12": { + "rel_l2": 0.005955820764889298, + "cosine": 0.9999822978807673, + "max_abs": 9.473876953125, + "teacher_forced": true + }, + "single_blocks.13": { + "rel_l2": 0.006722756826660885, + "cosine": 0.9999779564818261, + "max_abs": 15.56793212890625, + "teacher_forced": true + }, + "single_blocks.14": { + "rel_l2": 0.007188072438839192, + "cosine": 0.9999744375531868, + "max_abs": 9.6982421875, + "teacher_forced": true + }, + "single_blocks.15": { + "rel_l2": 0.007353466847667942, + "cosine": 0.9999738147143078, + "max_abs": 12.701416015625, + "teacher_forced": true + }, + "single_blocks.16": { + "rel_l2": 0.006701254161536666, + "cosine": 0.9999782740627157, + "max_abs": 14.18896484375, + "teacher_forced": true + }, + "single_blocks.17": { + "rel_l2": 0.006525710055498059, + "cosine": 0.9999789334086551, + "max_abs": 11.47650146484375, + "teacher_forced": true + }, + "single_blocks.18": { + "rel_l2": 0.006296346436129634, + "cosine": 0.9999829714971823, + "max_abs": 42.576171875, + "teacher_forced": true + }, + "single_blocks.19": { + "rel_l2": 0.003235760647976584, + "cosine": 0.9999947943314311, + "max_abs": 23.71630859375, + "teacher_forced": true + }, + "final_layer.adaLN_modulation": { + "rel_l2": 0.0019135450516302758, + "cosine": 0.9999981870803879, + "max_abs": 0.26091766357421875, + "teacher_forced": false + }, + "final_layer": { + "rel_l2": 0.0036446164849403065, + "cosine": 0.9999933584811138, + "max_abs": 0.021755456924438477, + "teacher_forced": true + } + }, + "free_bf16_vs_fp32": { + "double_blocks.0.img": 0.011890333782742468, + "double_blocks.0.txt": 0.008102745408883555, + "double_blocks.1.img": 0.014145091028240634, + "double_blocks.1.txt": 0.011889779178614666, + "double_blocks.2.img": 0.014894889846542332, + "double_blocks.2.txt": 0.015830086102734193, + "double_blocks.3.img": 0.01560937928171479, + "double_blocks.3.txt": 0.01829422927512054, + "double_blocks.4.img": 0.00906750877739114, + "double_blocks.4.txt": 0.01755079076886759, + "single_blocks.0": 0.015236504300667836, + "single_blocks.1": 0.01606696558439662, + "single_blocks.2": 0.018071751922401683, + "single_blocks.3": 0.01766927842862362, + "single_blocks.4": 0.01657760682271945, + "single_blocks.5": 0.0105390785731913, + "single_blocks.6": 0.01258891318607564, + "single_blocks.7": 0.01360358410619145, + "single_blocks.8": 0.015089811743791346, + "single_blocks.9": 0.01692476493107564, + "single_blocks.10": 0.023744244172545084, + "single_blocks.11": 0.02783171051643576, + "single_blocks.12": 0.02840291161770397, + "single_blocks.13": 0.02970586998069493, + "single_blocks.14": 0.030042161287898248, + "single_blocks.15": 0.030433569436256774, + "single_blocks.16": 0.03142300227557739, + "single_blocks.17": 0.03033722983664555, + "single_blocks.18": 0.02207976151451134, + "single_blocks.19": 0.017799842071348892, + "final_layer": 0.009828753446642344 + }, + "times": { + "fp32_s": 12.4, + "bf16_s": 39.0, + "bf16_teacher_forced_s": 39.0 + }, + "adapter_effect": { + "velocity": 0.08327376948072711, + "vec": 0.0, + "double_stream_modulation_img": 0.0, + "double_stream_modulation_txt": 0.0, + "single_stream_modulation": 0.0, + "img_in": 0.0, + "txt_in": 0.0, + "double_blocks.0.img": 0.14189036477175845, + "double_blocks.0.txt": 0.10145380433109595, + "double_blocks.1.img": 0.24899588958245997, + "double_blocks.1.txt": 0.19196900027552616, + "double_blocks.2.img": 0.44078484986419403, + "double_blocks.2.txt": 0.26515685845742437, + "double_blocks.3.img": 0.3626533580276314, + "double_blocks.3.txt": 0.32246088405743134, + "double_blocks.4.img": 0.271617290287723, + "double_blocks.4.txt": 0.31635192228751113, + "single_blocks.0": 0.28526586896863, + "single_blocks.1": 0.306519126368331, + "single_blocks.2": 0.34895426686769043, + "single_blocks.3": 0.3463719445379663, + "single_blocks.4": 0.3863032752144754, + "single_blocks.5": 0.22837574295189403, + "single_blocks.6": 0.24546844904271709, + "single_blocks.7": 0.2656996586908621, + "single_blocks.8": 0.2784626636727947, + "single_blocks.9": 0.29243629609936733, + "single_blocks.10": 0.3343202453200887, + "single_blocks.11": 0.39442855022970136, + "single_blocks.12": 0.4004573144122595, + "single_blocks.13": 0.4212461139309411, + "single_blocks.14": 0.4379437594408135, + "single_blocks.15": 0.4293792929063022, + "single_blocks.16": 0.4474172697955388, + "single_blocks.17": 0.41583781681397086, + "single_blocks.18": 0.3211043305897948, + "single_blocks.19": 0.2604064889265671, + "final_layer.adaLN_modulation": 0.0, + "final_layer": 0.08327376948072711 + }, + "key_table": { + "layers": 89, + "converter_names": 109, + "same_layer_and_rows": true, + "halves_the_converter_leaves_unswapped": [ + "norm_out.linear" + ] + }, + "diffusers_loader": { + "ran": true, + "names": 100, + "names_without_an_oracle_pair": [], + "count_without_an_oracle_pair": 0, + "worst_product_rel_l2": 7.748437777049826e-17, + "peft_scale_left_to_peft": false + }, + "exact_free_floor": { + "rel_l2": 7.34459965407668e-06, + "row": "free single_blocks.16", + "measured": "gmlx's exact step on the GPU against the same step on the CPU stream, worst free row; tests/image/flux2_gates.py exact_free_floor on flux2-klein, Apple M5 Max" + }, + "exact_velocity_floor": { + "rel_l2": 1.4384673284816472e-06, + "measured": "gmlx's exact step on the GPU against the same step on the CPU stream, velocity; tests/image/flux2_gates.py exact_free_floor on flux2-klein, Apple M5 Max" + } + }, + "tolerances": { + "velocity": { + "rel_l2": 0.019657506893284687, + "cosine_min": 0.9998102315290529 + }, + "vec": { + "rel_l2": 0.003476594838709203, + "teacher_forced": false + }, + "double_stream_modulation_img": { + "rel_l2": 0.0032929690531262323, + "teacher_forced": false + }, + "double_stream_modulation_txt": { + "rel_l2": 0.0035346528121341938, + "teacher_forced": false + }, + "single_stream_modulation": { + "rel_l2": 0.0033386334026872847, + "teacher_forced": false + }, + "img_in": { + "rel_l2": 0.003315576519282781, + "teacher_forced": false + }, + "txt_in": { + "rel_l2": 0.0033188841621666306, + "teacher_forced": false + }, + "double_blocks.0.img": { + "rel_l2": 0.022452331846239713, + "teacher_forced": true + }, + "double_blocks.0.txt": { + "rel_l2": 0.015223469231205981, + "teacher_forced": true + }, + "double_blocks.1.img": { + "rel_l2": 0.013220120260261417, + "teacher_forced": true + }, + "double_blocks.1.txt": { + "rel_l2": 0.0094994703811932, + "teacher_forced": true + }, + "double_blocks.2.img": { + "rel_l2": 0.011528219828481501, + "teacher_forced": true + }, + "double_blocks.2.txt": { + "rel_l2": 0.010099717164004797, + "teacher_forced": true + }, + "double_blocks.3.img": { + "rel_l2": 0.013856021145310317, + "teacher_forced": true + }, + "double_blocks.3.txt": { + "rel_l2": 0.01001203455185881, + "teacher_forced": true + }, + "double_blocks.4.img": { + "rel_l2": 0.008771467369915267, + "teacher_forced": true + }, + "double_blocks.4.txt": { + "rel_l2": 0.010640085182508498, + "teacher_forced": true + }, + "single_blocks.0": { + "rel_l2": 0.008987347697581962, + "teacher_forced": true + }, + "single_blocks.1": { + "rel_l2": 0.011784114694146855, + "teacher_forced": true + }, + "single_blocks.2": { + "rel_l2": 0.015411239695092884, + "teacher_forced": true + }, + "single_blocks.3": { + "rel_l2": 0.011923688433835138, + "teacher_forced": true + }, + "single_blocks.4": { + "rel_l2": 0.011974631396930124, + "teacher_forced": true + }, + "single_blocks.5": { + "rel_l2": 0.007223120334581509, + "teacher_forced": true + }, + "single_blocks.6": { + "rel_l2": 0.007504162575810295, + "teacher_forced": true + }, + "single_blocks.7": { + "rel_l2": 0.0072667160247747225, + "teacher_forced": true + }, + "single_blocks.8": { + "rel_l2": 0.007656878947560602, + "teacher_forced": true + }, + "single_blocks.9": { + "rel_l2": 0.007864542051557916, + "teacher_forced": true + }, + "single_blocks.10": { + "rel_l2": 0.013709659562212515, + "teacher_forced": true + }, + "single_blocks.11": { + "rel_l2": 0.012544212802170947, + "teacher_forced": true + }, + "single_blocks.12": { + "rel_l2": 0.011911641529778597, + "teacher_forced": true + }, + "single_blocks.13": { + "rel_l2": 0.01344551365332177, + "teacher_forced": true + }, + "single_blocks.14": { + "rel_l2": 0.014376144877678384, + "teacher_forced": true + }, + "single_blocks.15": { + "rel_l2": 0.014706933695335885, + "teacher_forced": true + }, + "single_blocks.16": { + "rel_l2": 0.013402508323073332, + "teacher_forced": true + }, + "single_blocks.17": { + "rel_l2": 0.013051420110996118, + "teacher_forced": true + }, + "single_blocks.18": { + "rel_l2": 0.012592692872259267, + "teacher_forced": true + }, + "single_blocks.19": { + "rel_l2": 0.006471521295953168, + "teacher_forced": true + }, + "final_layer.adaLN_modulation": { + "rel_l2": 0.0038270901032605516, + "teacher_forced": false + }, + "final_layer": { + "rel_l2": 0.007289232969880613, + "teacher_forced": true + }, + "rule": "tolerance = 2 x the oracle's own bf16 against fp32 relative L2: teacher-forced for each block and the final layer, free running for the time vector, modulations and embeddings and for the velocity", + "exact_free": { + "rel_l2": 5e-05 + }, + "exact_velocity": { + "rel_l2": 5e-05 + } + }, + "notes": [ + "the adapter is applied unmerged as PEFT applies it; the gmlx side runs it under a patch table" + ], + "created": "2026-10-16T17:32:04Z", + "npz": "check7_flux2_klein_sketch_512.npz", + "tensors": { + "double_blocks.0.img": { + "shape": [ + 2048, + 3072 + ], + "dtype": "float32", + "sha256": "9add21de090ceb536f4851f2ce2d68606cc6318323bb002b78bba348c5a24016" + }, + "double_blocks.0.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "fe7c4982f60fe04df22a18962d3443075ddef08023876c47981cef35fdc93b24" + }, + "double_blocks.1.img": { + "shape": [ + 2048, + 3072 + ], + "dtype": "float32", + "sha256": "d8a74d7319a7023b265a352e8ce15211a955772b7b572b3eb6603ce8dce29227" + }, + "double_blocks.1.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "2ef6b7cbdbde3353b5e0f052b49855b4aab0c148f4f21ff7e715ce640caec421" + }, + "double_blocks.2.img": { + "shape": [ + 2048, + 3072 + ], + "dtype": "float32", + "sha256": "e7379155390ef33f76b2d4b992db3332c14f042d6fac2de055e826bc2e27a241" + }, + "double_blocks.2.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "a74e9a8a70c6ed6b5a2ec2fae820fb4f7fd4e75d02ad940db1812d2f58d1c314" + }, + "double_blocks.3.img": { + "shape": [ + 2048, + 3072 + ], + "dtype": "float32", + "sha256": "927dd7f6be7efa8f266c5f67a429cde23c073314d4bad14a793bb518f7bec2e4" + }, + "double_blocks.3.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "1b3c83e3c978e0d90bd16bd560d7480a4135565f834bd1c8e381604c25c451ca" + }, + "double_blocks.4.img": { + "shape": [ + 2048, + 3072 + ], + "dtype": "float32", + "sha256": "2d2fc830a0ff09ebd0b40149c5c5eabebd7c9ab95be705f05f217f67fb9c29ad" + }, + "double_blocks.4.txt": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "4cf1b61ab919f73e6a12239fb9bd847d0070ffe7a630fb1ffa09dc9a898ddb19" + }, + "double_stream_modulation_img": { + "shape": [ + 1, + 18432 + ], + "dtype": "float32", + "sha256": "73ed5c97924695b232328c26d9968306beb41131318d34e04add56f47fed5bc2" + }, + "double_stream_modulation_txt": { + "shape": [ + 1, + 18432 + ], + "dtype": "float32", + "sha256": "4cb1969d5f3e07e8ddbd78ca42ee82cadc492cbbb73105d3dad5e151de73cfa0" + }, + "features": { + "shape": [ + 512, + 7680 + ], + "dtype": "float32", + "sha256": "3482cc3e89168264731155ce529cc5ff9299b09f9e6ade75b1a420d631896802" + }, + "final_layer": { + "shape": [ + 1024, + 128 + ], + "dtype": "float32", + "sha256": "b0953fcc70fe0643b1f5e69307508af5da20c99531964b5e1db0a2d7722cd544" + }, + "final_layer.adaLN_modulation": { + "shape": [ + 1, + 6144 + ], + "dtype": "float32", + "sha256": "db554a26f26b73dc7dde6a883f3cee2ffefa601ea9d7fc41870508e3dfb7eda0" + }, + "ids.image": { + "shape": [ + 2048, + 4 + ], + "dtype": "float32", + "sha256": "1ae78fae8f1e1ee5b47214b5e0de11d0874c7576615c41d9d733793abe84ffdc" + }, + "ids.text": { + "shape": [ + 512, + 4 + ], + "dtype": "float32", + "sha256": "914a4d07f258895514e1b52023c57a677aa4925531d34e54831414224030a0f8" + }, + "img_in": { + "shape": [ + 2048, + 3072 + ], + "dtype": "float32", + "sha256": "5dac051397f3eb1993a7fd2ae0153a5b37d7dd1055b196a9417e1dd6fea152ff" + }, + "in.final_layer": { + "shape": [ + 1024, + 3072 + ], + "dtype": "float32", + "sha256": "8a7504bc7355ef33d62891ec1d25aa5c0152f6c731f8e392a444aa51242fdbc0" + }, + "in.single_blocks.0": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "4a26b2315fd74bae08bd2dc214f75ffedcef65369a3d2141fb294a032a63f4e5" + }, + "in.time_in": { + "shape": [ + 1, + 256 + ], + "dtype": "float32", + "sha256": "cbacd50d6ddae5179d08ae5986820a7baaecca4b2a9962dd856fc80aa62707e4" + }, + "latents": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "2cb3e62b5bb6a58f5b08f360ba95db386349bd0b4fe4128bd931125c8cceae04" + }, + "refs.0": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "7097102f2f785e6b17e40c748de6f47327eef79637c255a6c7b18a57c0fdf0e6" + }, + "sigma": { + "shape": [], + "dtype": "float32", + "sha256": "e00e5eb9444182f352323374ef4e08ebcb784725fdd4fd612d7730540b3e0c8c" + }, + "single_blocks.0": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "31cddb723ed68450fe8e2b29cce247a814db3bcd73e6168f0651cf90c16e6c3b" + }, + "single_blocks.1": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "7b784b5782b8eeb5121bc72a59dc1cafbd6894f31877a5adaff7c0465afab8ef" + }, + "single_blocks.10": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "05c14ecb78bbaae70fae7dfe861b73f8dbe12719c6a4255f0f0915a5271daeee" + }, + "single_blocks.11": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "5e497391391ca15dc9bd379950fe789e619ce6a563fcdcf88493b664f48a0db5" + }, + "single_blocks.12": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "64b50e3dc6dfbc8e1e7c826c291fad671f9ed28ae59587954d9504df4e225125" + }, + "single_blocks.13": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "adfb0840a93514086576a100cddffb9ce8d4dd571ed71a6d13dcd80bfe306212" + }, + "single_blocks.14": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "bf2b7b0b32dfd6e3003ce11fb4d25ce32a47069c4f0a35fafe995f7fa4ba81c9" + }, + "single_blocks.15": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "3121a04b62b3bc17d8e487d5331f261b68bb09835741f85d60932119737c3fbc" + }, + "single_blocks.16": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "a6d3b461adcec6fd6563aa61169f4b1f1435f597178cafaf3b9f0e95945754d1" + }, + "single_blocks.17": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "97e1cebbfb61e33875985ef4cb435cd3da7b439baf849bd48bcb465f95974eba" + }, + "single_blocks.18": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "0afc7b7e7c66e7c8c6152f0fb51b93e184e02e7271d90447596ed22f75380e66" + }, + "single_blocks.19": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "158837db80f77f5bdc867868cd994496c40182f35647550ca43c3478406f7b42" + }, + "single_blocks.2": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "1a814a98b4c210759f6302808131495499cb01d3f40438e334c542868cd83755" + }, + "single_blocks.3": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "b8ca187420ebdac9d8df2971cc85b3222ec92798f6e9cefe5956d604bb6832d2" + }, + "single_blocks.4": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "86195cbbab379fbd28986e86c29930a7ae879fbd1ef2ae03771293b0fdccbdd4" + }, + "single_blocks.5": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "4c98418c3bdffcbcda458e249e8093f38670d20db53649d71244eb9f0f42cfa4" + }, + "single_blocks.6": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "6a1815178db933faf29f9990eb2a2466415971d3ba07475349727df2b3c61a7f" + }, + "single_blocks.7": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "416dbd6804d7d7b09401081d8e378fd4e03ec99eb359b913a367dd21e8f67862" + }, + "single_blocks.8": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "d0415510f636c84af3eb695becbe70af56ea8f7afa0ce7a3e50bf54548f9a0eb" + }, + "single_blocks.9": { + "shape": [ + 2560, + 3072 + ], + "dtype": "float32", + "sha256": "9a6fa7a0163641a4130bfbdb5baffdc258442bf236bdeade58816778d5b0738a" + }, + "single_stream_modulation": { + "shape": [ + 1, + 9216 + ], + "dtype": "float32", + "sha256": "12e97e1d2a61989d6d32edbeec2485cb063a4c2ca33404c16c60e7e63ddf45b8" + }, + "txt_in": { + "shape": [ + 512, + 3072 + ], + "dtype": "float32", + "sha256": "cccd06d66c0ffe480a988fe4d99ce37026e9904f57fb9c6dba9b0c5fac7cc7a8" + }, + "vec": { + "shape": [ + 1, + 3072 + ], + "dtype": "float32", + "sha256": "973469ca17446ade003cb24507a4c35e9c26b4312dc4e396f2b92860455cdeba" + }, + "velocity": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "f84ac32b01f06cf177b6f850f168b660d1047d9a67ff8b0dff8711b7b46563ce" + }, + "velocity_bf16": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "713af9af9b6554f996888027ef949fc876daa1fc7a2793555e72efe498680e2d" + } + } +} diff --git a/tests/image/test_image_check7_flux2_klein.py b/tests/image/test_image_check7_flux2_klein.py new file mode 100644 index 000000000..95179d2fc --- /dev/null +++ b/tests/image/test_image_check7_flux2_klein.py @@ -0,0 +1,377 @@ +"""Check 7 of the image acceptance gate for FLUX.2 klein on community LoRA +files, step half: check 3's step at 512 with a file applied live under a +patch table, against BFL's reference DiT with the same file applied as +PEFT applies it, under check 3's gates. + +scripts/image_oracle/check7_flux2_klein_community.py writes one fixture +per file, on the check 3 fixture of the checkpoint the file is for: the +distilled 4B step for the pixel-art file, in the diffusers spelling with +a rank-stabilized PEFT header, and for the mikkoani file, in the kohya +spelling with an alpha, and Base 4B's step with one reference image for +the sketch file, in AI-Toolkit's reference names without an alpha. The +oracle reads each file with its own parser and takes a PEFT header's +scale from peft itself. Every row is in fp32, with the oracle's own bf16 +against fp32 gap of each and check 3's rule. + +The files are public adapters that stay outside the repository. The +committed manifest names each by file name, size, sha256, repository, +revision and license, and the tests find the file under +GMLX_TEST_LORA_DIR and skip without it. The reader runs with its +defaults, so a key the FLUX.2 map does not cover fails the test. + +The product gate holds each row to twice the oracle's gap, on the model +as it ships with its own time embedding. The base model misses it, and +so does the file at 0.8 of its strength where a fifth of the file's move +of the velocity is over twice the gate. The velocity of the request path passes its gate too, +after a step of the base model on the same conditioning. The exact gate +runs the step in the oracle's fp32 arithmetic in a child process and +holds the teacher-forced rows to EXACT_TOL, and the free rows and the +velocity to the gates from the floors the manifest records; each wrong +table of ``wrong_tables`` must miss it. + +Skipped unless the manifests are committed, GMLX_IMAGE_FIXTURES holds +their arrays, KQUANT_TEST_GGUF_DIR the DiT GGUFs and GMLX_TEST_LORA_DIR +the files.""" +from __future__ import annotations + +import functools +import os +from pathlib import Path + +import mlx.core as mx +import numpy as np +import pytest + +import flux2_gates as fg +from block_gates import exact_process, rerun_exact +from image_fixtures import image_dits +from oracle_fixture import ORACLE, committed, fixture, fx + +# A Mac of 16 GB, as most users run (tests/host_box.py). +pytestmark = pytest.mark.host_gb(16) + +ENV = "GMLX_TEST_LORA_DIR" +# id: (the check 3 fixture of the file's checkpoint, the pairs it holds, +# its spelling) +ADAPTERS = {"pixel_art": ("check3_flux2_klein_512", 86, "diffusers"), + "mikkoani": ("check3_flux2_klein_512", 80, "kohya"), + "sketch": ("check3_flux2_klein_base_r1_512", 80, "reference")} +# The pixel-art file's three modulation pairs, which ComfyUI does not read. +MODULATIONS = ("double_stream_modulation_img.lin", + "double_stream_modulation_txt.lin", + "single_stream_modulation.lin") + + +def _name(aid: str) -> str: + return f"check7_flux2_klein_{aid}_512" + + +def _manifest(aid: str) -> dict: + name = _name(aid) + if not (ORACLE / f"{name}.manifest.json").is_file(): + pytest.skip(f"{name}.manifest.json is not committed: run " + "scripts/image_oracle/check7_flux2_klein_community.py " + "and commit the manifest it writes") + return committed(name) + + +@functools.lru_cache(maxsize=None) +def _file(aid: str) -> str: + """The adapter file under GMLX_TEST_LORA_DIR, checked by sha256.""" + root = os.environ.get(ENV) + if not root: + pytest.skip(f"set {ENV} to a directory of the community LoRA files") + want = _manifest(aid)["files"]["lora"] + for p in sorted(Path(root).expanduser().rglob(want["name"])): + if p.stat().st_size == want["size"]: + if fx.file_identity(p)["sha256"] != want["sha256"]: + pytest.fail(f"{p} is not the file the oracle read") + return str(p) + pytest.skip(f"{want['name']} is not under {ENV}") + + +# The float tensors the exact gate's process put in float32, by DiT path. +_EXACT: dict = {} + + +class _Pipes: + """The pipeline of a fixture's DiT, one loaded at a time.""" + + def __init__(self, root): + self.root, self.path, self.pipe = root, None, None + + def __call__(self, m: dict): + from gmlx.image import api + + want = m["files"]["dit"] + if self.path is not None and Path(self.path).name == want["name"]: + return self.pipe + self.pipe = self.path = None + mx.clear_cache() + for p in image_dits(self.root, "flux2_klein"): + if Path(p).name == want["name"] and \ + os.path.getsize(p) == want["size"]: + break + else: + pytest.skip(f"{want['name']} is not under KQUANT_TEST_GGUF_DIR") + if fx.file_identity(p)["sha256"] != want["sha256"]: + pytest.fail(f"{p} is not the file the oracle read") + self.pipe = api.load(p, log=lambda *_: None) + if exact_process(): + # The exact gate's process: the file's float tensors in + # float32, before a table wraps the leaves. + _EXACT[p] = fg.exact_floats(self.pipe.dit, p) + self.path = p + return self.pipe + + +@pytest.fixture(scope="module") +def pipes(gguf_dir): + return _Pipes(gguf_dir) + + +def _adapter(pipe, aid: str): + from gmlx.image import lora + + ad = lora.load_adapter(pipe, _file(aid)) + assert len(ad.dit) == ADAPTERS[aid][1] and ad.text == () + return ad + + +def _entries(ad, strength: float) -> list: + from gmlx.image import lora + + return lora.table_entries([(ad, strength)]) + + +def _under(pipe, tid: str | None, read, arrays: dict): + """``read(dit, arrays)`` with the table ``tid`` active.""" + from gmlx.image.lora import install + + if tid is None: + return read(pipe.dit, arrays) + prev = install.activate(pipe, tid) + try: + return read(pipe.dit, arrays) + finally: + install.restore(pipe, prev) + + +def _shipped(dit, arrays): + return fg.measures(dit, arrays, own_time=True) + + +def test_the_manifests_read_the_step_and_follow_the_rule(): + """The committed manifests alone: each fixture takes the check 3 step + of its file's checkpoint on the same DiT, names a public file under + Apache-2.0, holds every row tolerance at twice the gap beside it, and + the exact gate's tolerances follow their floors.""" + for aid, (source, pairs, spelling) in ADAPTERS.items(): + src, m = committed(source), _manifest(aid) + ins = m["inputs"] + assert ins["source"] == source, aid + for k in ("step", "sigma", "refs", "seed", "size", "text_rows", + "reference_commit"): + assert ins[k] == src["inputs"][k], (aid, k) + assert m["files"]["dit"] == src["files"]["dit"], aid + assert m["check"] == 7 and ins["lora_pairs"] == pairs, aid + row = ins["adapter"] + assert row["id"] == aid and row["license"] == "apache-2.0", aid + assert row["spelling"] == spelling and row["pairs"] == pairs, aid + assert len(row["revision"]) == 40, aid + for k, g in m["results"]["rows_bf16_vs_fp32"].items(): + assert m["tolerances"][k]["rel_l2"] == 2 * g["rel_l2"], (aid, k) + fg.exact_tols(m) + assert m["results"]["key_table"]["same_layer_and_rows"], aid + # The rank-stabilized header: alpha 128 over the root of rank 64. + px = _manifest("pixel_art")["inputs"]["adapter"] + assert px["header_config"]["transformer.use_rslora"] is True + assert px["scales"] == [16.0] and px["peft"] + assert _manifest("mikkoani")["inputs"]["adapter"]["scales"] == [0.5] + assert _manifest("sketch")["inputs"]["adapter"]["scales"] == [1.0] + + +# The product gate. + +def _product(pipe, arrays, m, tid, label: str) -> dict: + got = _under(pipe, tid, _shipped, arrays) + ratio = {k: v / fg.gate(k, m) for k, v in got.items()} + top = max(ratio, key=ratio.get) + print(f"{label}: {len(ratio)} measures, worst {got[top]:.2e} at {top}, " + f"{ratio[top]:.2f} of its gate; velocity {got['velocity']:.2e} of " + f"gate {m['tolerances']['velocity']['rel_l2']:.2e}") + return got + + +@pytest.mark.integration +@pytest.mark.parametrize("aid", list(ADAPTERS)) +def test_check7_community_step_rows_at_512(pipes, aid): + from gmlx.image import api + + m = _manifest(aid) + arrays, _ = fixture(_name(aid)) + pipe = pipes(m) + ad = _adapter(pipe, aid) + if aid == "pixel_art": + assert {t for t, _, _ in ad.dit} >= set(MODULATIONS) + tid = api.define_patch_table(pipe, _entries(ad, m["inputs"]["strength"])) + got = _product(pipe, arrays, m, tid, f"flux2 check7 512 {aid}, " + f"{len(ad.dit)} pairs") + out = fg.missed(got, m) + assert not out, out + + +@pytest.mark.integration +@pytest.mark.parametrize("wrong", ["base", "strength 0.8"]) +@pytest.mark.parametrize("aid", list(ADAPTERS)) +def test_check7_community_rows_see_the_file_and_its_strength(pipes, aid, + wrong): + """The base model misses the gate. The file at 0.8 of its strength + moves the step by a fifth of the file's effect, and misses the gate + where that fifth is over the velocity's gate.""" + from gmlx.image import api + + m = _manifest(aid) + arrays, _ = fixture(_name(aid)) + pipe = pipes(m) + tid, part = None, 1.0 + if wrong != "base": + part = 0.2 + tid = api.define_patch_table(pipe, _entries( + _adapter(pipe, aid), 0.8 * m["inputs"]["strength"])) + out = fg.missed(_under(pipe, tid, _shipped, arrays), m) + worst = max(out, key=lambda k: out[k][0] / out[k][1]) if out else None + effect = part * m["results"]["adapter_effect"]["velocity"] + gate = m["tolerances"]["velocity"]["rel_l2"] + print(f"flux2 check7 {aid} {wrong}: {len(out)} measures miss" + + (f", worst {worst} at {out[worst][0] / out[worst][1]:.1f} of " + "its gate" if worst else "") + + f"; its move of the velocity {effect:.2e}, gate {gate:.2e}") + if effect > 2 * gate: + assert out + + +@pytest.mark.integration +@pytest.mark.parametrize("aid", list(ADAPTERS)) +def test_check7_community_velocity_of_the_request_path(pipes, aid): + """api.denoise_step with the kernel routes at their default, after a + step of the base model on the same conditioning, whose modulations + and caption rows the pipeline keeps per table.""" + from gmlx.image import api + + m = _manifest(aid) + arrays, _ = fixture(_name(aid)) + pipe = pipes(m) + tid = api.define_patch_table(pipe, _entries(_adapter(pipe, aid), + m["inputs"]["strength"])) + refs = tuple(mx.array(arrays[f"refs.{i}"])[0] + for i in range(fg.n_refs(arrays))) + cond = api.Conditioning(mx.array(arrays["features"]), f"check7 {aid}", + ref_latents=refs) + + def step(table): + return np.array(api.denoise_step( + pipe, mx.array(arrays["latents"]), float(arrays["sigma"]), cond, + patch_table=table)) + + base = step(None) + v = step(tid) + got = fx.compare(v, arrays["velocity"]) + tol = m["tolerances"]["velocity"] + moved = fg.rel(base, arrays["velocity"]) + print(f"flux2 check7 {aid} request velocity: rel L2 {got['rel_l2']:.3e} " + f"of {tol['rel_l2']:.3e}, cosine {got['cosine']:.6f} of " + f"{tol['cosine_min']:.6f}; the base step is {moved:.2e} away") + assert got["rel_l2"] <= tol["rel_l2"] + assert got["cosine"] >= tol["cosine_min"] + assert moved > tol["rel_l2"] + + +# The exact gate. + +def _block(path: str) -> tuple | None: + parts = path.split(".") + if parts[0] in ("double_blocks", "single_blocks"): + return parts[0], int(parts[1]) + return None + + +def _thirds_turned(entries: list) -> list: + """Each pair on a third of a fused qkv on the next third's rows.""" + out = [] + for p, band, patches in entries: + if band is not None: + axis, start, n = band + band = (axis, (start + n) % (3 * n), n) + out.append((p, band, patches)) + return out + + +def wrong_tables(entries: list, strength: float) -> dict: + """Wrong tables of a file's ``entries`` at ``strength``: the strength + a tenth low, the pairs of the middle single block and of the first + double block left out, the pairs on a third of a fused qkv on the + next third's rows, and the pairs outside the blocks left out.""" + singles = sorted({b[1] for p, _, _ in entries + if (b := _block(p)) and b[0] == "single_blocks"}) + doubles = sorted({b[1] for p, _, _ in entries + if (b := _block(p)) and b[0] == "double_blocks"}) + mid = singles[len(singles) // 2] + + def scaled(k): + return [(p, band, [(key, s * k) for key, s in patches]) + for p, band, patches in entries] + + out = {"strength a tenth low": scaled(0.9), + f"single block {mid} left out": [ + e for e in entries if _block(e[0]) != ("single_blocks", mid)], + f"double block {doubles[0]} left out": [ + e for e in entries + if _block(e[0]) != ("double_blocks", doubles[0])]} + if any(band is not None for _, band, _ in entries): + out["qkv thirds turned"] = _thirds_turned(entries) + if any(_block(p) is None for p, _, _ in entries): + out["pairs outside the blocks left out"] = [ + e for e in entries if _block(e[0]) is not None] + return out + + +@pytest.mark.integration +@pytest.mark.parametrize("aid", list(ADAPTERS)) +def test_check7_community_exact_gate_at_512(pipes, request, aid): + """Every measure within its exact gate under the file's table, the + free-row and velocity gates from the floors measured now, and each + wrong table of ``wrong_tables`` over the gate.""" + from gmlx.image import api + + m = _manifest(aid) + arrays, _ = fixture(_name(aid)) + _file(aid) + if not exact_process(): + return rerun_exact(request, "flux2 check7 exact") + pipe = pipes(m) + floats = _EXACT.get(pipes.path, 0) + assert floats > 0 + ad = _adapter(pipe, aid) + strength = m["inputs"]["strength"] + entries = _entries(ad, strength) + tid = api.define_patch_table(pipe, entries) + label = f"flux2 check7 exact {aid}" + tol = fg.check_floor(m, _under(pipe, tid, fg.exact_free_floor, arrays), + label) + got = _under(pipe, tid, fg.exact_measures, arrays) + print(fg.exact_line(f"{label}, {len(ad.dit)} pairs, {floats} float " + "tensors in fp32", got, tol)) + over = fg.exact_over(got, tol) + weakest = None + for fault, table in wrong_tables(entries, strength).items(): + bad = _under(pipe, api.define_patch_table(pipe, table), + fg.exact_measures, arrays) + line, top = fg.fault_line(f"{label}, {fault}", bad, tol) + print(line) + assert top > 10, (fault, top) + if weakest is None or top < weakest[0]: + weakest = (top, fault) + print(f"{label}: the weakest wrong table is {weakest[1]} at " + f"{weakest[0]:.0f} of the gate") + assert not over, over From 483938116ef8194e26e91250f6463da27e29f3e3 Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 11:10:09 -0700 Subject: [PATCH 023/101] feat(comfyui): the step contract and the pack run flux2 klein, its guidance input unread and other reference methods refused --- gmlx/comfyui_pack/clip.py | 3 +- gmlx/comfyui_pack/model.py | 20 ++- gmlx/comfyui_pack/patches.py | 22 ++- gmlx/comfyui_pack/vae.py | 4 +- gmlx/serve/image_steps.py | 21 ++- .../fixtures/manifest-flux2_klein.json | 1 + tests/comfyui_pack/stub_server.py | 9 +- tests/comfyui_pack/support.py | 39 +++++ tests/comfyui_pack/test_client.py | 2 +- tests/comfyui_pack/test_comfy.py | 151 +++++++++++++++- tests/serve/test_image_steps.py | 163 ++++++++++++++++-- 11 files changed, 403 insertions(+), 32 deletions(-) create mode 100644 tests/comfyui_pack/fixtures/manifest-flux2_klein.json diff --git a/gmlx/comfyui_pack/clip.py b/gmlx/comfyui_pack/clip.py index c2951b391..e85feb60c 100644 --- a/gmlx/comfyui_pack/clip.py +++ b/gmlx/comfyui_pack/clip.py @@ -28,7 +28,8 @@ # The families whose stock ComfyUI tokenizer encodes an empty prompt as a # space under prevent_empty_text: QwenImageTokenizer, and Qwen3VLTokenizer # under Qwen-Image 2.1, Krea 2 and FLUX.3. ZImageTokenizer ignores the -# option. +# option, and FLUX.2's KleinTokenizer applies its chat template first, so +# the prompt it encodes is never empty. _SPACE_FOR_EMPTY = frozenset({"qwen_image", "qwen_image21", "krea2", "flux3_klein"}) diff --git a/gmlx/comfyui_pack/model.py b/gmlx/comfyui_pack/model.py index 237cd7b69..d7c527359 100644 --- a/gmlx/comfyui_pack/model.py +++ b/gmlx/comfyui_pack/model.py @@ -56,7 +56,8 @@ IN_FORWARD_CLASSES = {"PerturbedAttentionGuidance", "SkipLayerGuidanceDiT", "SkipLayerGuidanceSD3", "SkipLayerGuidanceDiTSimple", "ControlNetApply", "ControlNetApplyAdvanced", "ControlNetApplySD3", "SetUnionControlNetType", "QwenImageDiffsynthControlnet", - "TomePatchModel", "FreeU", "FreeU_V2", "ScaleROPE"} + "TomePatchModel", "FreeU", "FreeU_V2", "ScaleROPE", + "FluxKontextMultiReferenceLatentMethod"} LAST_PROMPT: dict = {} STRICT_KEYS = False @@ -200,6 +201,14 @@ def __init__(self, base_model, binding: GmlxBinding): # A flow map DiT, FLUX.3's distilled one, reads the schedule the # sampler runs on, which each step carries. self.flow_map = bool(getattr(base_model.diffusion_model, "flow_map", False)) + params = getattr(base_model.diffusion_model, "params", None) + # ComfyUI's Flux DiT reads the guidance input only through a guidance + # embedder, which FLUX.2 klein has none of, and Flux.extra_conds + # hands it on every call. + self.reads_guidance = bool(getattr(params, "guidance_embed", True)) + # The reference rule of a DiT that reads ref_latents_method, which + # the server's DiT follows; None for a DiT that reads no method. + self.ref_method = getattr(params, "default_ref_method", None) self.warned: set = set() self.memo: dict = {} self.calls = collections.deque(maxlen=512) @@ -222,9 +231,18 @@ def _check(self, control, to: dict, kwargs: dict): for k, v in kwargs.items(): if k in INPUTS or v is None or (isinstance(v, (list, tuple, dict)) and not v): continue + if k == "guidance" and not self.reads_guidance: + continue _refuse(f"the DiT input {k!r}") if kwargs.get("ref_latents") and not self.b.edit_capable: _refuse(f"reference latents on {self.b.model_id!r}, which takes none") + method = kwargs.get("ref_latents_method") + if (kwargs.get("ref_latents") and self.ref_method is not None and method is not None + and method != self.ref_method): + hits = _upstream_names() + where = f"; upstream node(s): {', '.join(hits)}" if hits else "" + raise GmlxRefusal(f"gmlx: {self.b.model_id!r} places its reference latents by the " + f"{self.ref_method!r} method, and this call asks for {method!r}{where}") cache = to.get("qwen_image21_cache") or {} if cache.get("dtype", "default") not in ("default", None): raise GmlxRefusal(f"gmlx: a {cache['dtype']} prefix cache is not supported on a " diff --git a/gmlx/comfyui_pack/patches.py b/gmlx/comfyui_pack/patches.py index e768f10b2..ce656431d 100644 --- a/gmlx/comfyui_pack/patches.py +++ b/gmlx/comfyui_pack/patches.py @@ -6,7 +6,10 @@ ``(strength_patch, adapter, strength_model, offset, function)`` per weight key. A table entry carries the key, the offset as a band, and the adapter pairs by hash with their strengths. Plain LoRA pairs are applied; every -other kind is refused by name. +other kind is refused by name. ComfyUI's key map swaps the two halves of +the rows of a diffusers ``norm_out.linear`` pair's product, through +``swap_scale_shift``; such a pair goes with the halves of its up rows +swapped, which gives the same product. """ from __future__ import annotations @@ -48,6 +51,18 @@ def _carried(t: torch.Tensor) -> torch.Tensor: return t if t.dtype in _CARRIED else t.float() +def _swaps_halves(function) -> bool: + """Whether ``function`` is ComfyUI's ``swap_scale_shift``.""" + import comfy.utils + + return function is not None and function is getattr(comfy.utils, "swap_scale_shift", None) + + +def _swap_halves(t: torch.Tensor) -> torch.Tensor: + first, second = t.chunk(2, dim=0) + return torch.cat([second, first], dim=0) + + def _alpha(a): if a is None: return None @@ -72,7 +87,8 @@ def build_table(model_id: str, patches: dict, client: StepClient | None = None): if kind != "lora": raise GmlxRefusal(f"gmlx: {kind} on {key} is not supported on a gmlx model; " "only plain LoRA pairs apply") - if function is not None: + swap = offset is None and _swaps_halves(function) + if function is not None and not swap: raise GmlxRefusal(f"gmlx: a patch function on {key} is not supported on a " "gmlx model") if float(strength_model) != 1.0: @@ -81,6 +97,8 @@ def build_table(model_id: str, patches: dict, client: StepClient | None = None): if float(strength) == 0.0: continue up, down = _carried(adapter.weights[0]), _carried(adapter.weights[1]) + if swap: + up = _swap_halves(up) if client is not None: hu, hd = client.ensure_adapter(up), client.ensure_adapter(down) else: diff --git a/gmlx/comfyui_pack/vae.py b/gmlx/comfyui_pack/vae.py index bb44ffdf0..5656f983e 100644 --- a/gmlx/comfyui_pack/vae.py +++ b/gmlx/comfyui_pack/vae.py @@ -2,8 +2,8 @@ """A ComfyUI VAE that encodes and decodes on the gmlx server. It sets the attributes stock nodes read and sends latents in the space -ComfyUI's LATENT carries, the raw VAE space or, for FLUX.3, the DiT's own -model space, and images as (B, H, W, C) floats in [0, 1]. The server tiles +ComfyUI's LATENT carries, the raw VAE space or, for FLUX.2 and FLUX.3, the +DiT's own model space, and images as (B, H, W, C) floats in [0, 1]. The server tiles large images itself, so the tiled calls are the plain ones. """ diff --git a/gmlx/serve/image_steps.py b/gmlx/serve/image_steps.py index e8b4eb896..0ed423aa9 100644 --- a/gmlx/serve/image_steps.py +++ b/gmlx/serve/image_steps.py @@ -20,18 +20,18 @@ ComfyUI expects, which ``CONVENTIONS`` holds per family. ComfyUI's Lumina2 forward, which runs Z-Image, takes ``1 - timestep`` as the time of the native model and negates its output; its Qwen-Image 2.1 forward takes -the timestep as it is and returns the native output, as its Krea 2 and -FLUX.3 forwards do. All give, for the flow schedule, the velocity -``d x / d sigma`` at ``sigma = timestep``, which ``denoise_step`` -returns. +the timestep as it is and returns the native output, as its Krea 2, +FLUX.2 and FLUX.3 forwards do. All give, for the flow schedule, the +velocity ``d x / d sigma`` at ``sigma = timestep``, which +``denoise_step`` returns. A FLUX.3 flow map DiT also reads the time its step goes to. ComfyUI's forward takes it from the schedule its sampler runs on: the entry after the one nearest the timestep, the last at most. A step on a flow map holds that schedule as ``sample_sigmas`` and the route takes the target -of each row by the same rule. ComfyUI's FLUX.3 latents are the DiT's -own model space, the VAE's latents in 2x2 patches and normalized, so its -VAE routes take and give model-space latents. +of each row by the same rule. ComfyUI's FLUX.2 and FLUX.3 latents are +the DiT's own model space, the VAE's latents in 2x2 patches and +normalized, so their VAE routes take and give model-space latents. """ from __future__ import annotations @@ -72,7 +72,8 @@ class Convention: CONVENTIONS = { "comfy": {"z_image": Convention(), "qwen_image21": Convention(), - "krea2": Convention(), "flux3_klein": Convention()}, + "krea2": Convention(), "flux2_klein": Convention(), + "flux3_klein": Convention()}, } # What a client builds its model from, per family: ComfyUI's model class @@ -90,6 +91,10 @@ class Convention: "krea2": {"model_class": "Krea2", "image_model": "krea2", "latent": {"channels": 16, "stride": 8, "patch": 2}, "vae": {"channels_out": 3, "stride": 8}}, + "flux2_klein": {"model_class": "Flux2", "image_model": "flux2", + "latent": {"channels": 128, "stride": 16, "patch": 1}, + "vae": {"channels_out": 3, "stride": 16, + "space": "model"}}, "flux3_klein": {"model_class": "Flux3", "image_model": "flux3", "latent": {"channels": 128, "stride": 16, "patch": 1}, "vae": {"channels_out": 3, "stride": 16, diff --git a/tests/comfyui_pack/fixtures/manifest-flux2_klein.json b/tests/comfyui_pack/fixtures/manifest-flux2_klein.json new file mode 100644 index 000000000..9c56ad9bf --- /dev/null +++ b/tests/comfyui_pack/fixtures/manifest-flux2_klein.json @@ -0,0 +1 @@ +{"arch":"flux","count":149,"family":"flux2_klein","inline":{},"model":"flux-2-klein","naming":"gguf","tensors":[{"dtype":"f32","ggml_type":"F32","name":"double_blocks.0.img_attn.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"double_blocks.0.img_attn.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q5_K","name":"double_blocks.0.img_attn.proj.weight","shape":[3072,3072]},{"dtype":"quant","ggml_type":"Q5_K","name":"double_blocks.0.img_attn.qkv.weight","shape":[9216,3072]},{"dtype":"quant","ggml_type":"Q5_K","name":"double_blocks.0.img_mlp.0.weight","shape":[18432,3072]},{"dtype":"quant","ggml_type":"Q5_K","name":"double_blocks.0.img_mlp.2.weight","shape":[3072,9216]},{"dtype":"f32","ggml_type":"F32","name":"double_blocks.0.txt_attn.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"double_blocks.0.txt_attn.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q5_K","name":"double_blocks.0.txt_attn.proj.weight","shape":[3072,3072]},{"dtype":"quant","ggml_type":"Q5_K","name":"double_blocks.0.txt_attn.qkv.weight","shape":[9216,3072]},{"dtype":"quant","ggml_type":"Q5_K","name":"double_blocks.0.txt_mlp.0.weight","shape":[18432,3072]},{"dtype":"quant","ggml_type":"Q5_K","name":"double_blocks.0.txt_mlp.2.weight","shape":[3072,9216]},{"dtype":"f32","ggml_type":"F32","name":"double_blocks.1.img_attn.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"double_blocks.1.img_attn.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q4_K","name":"double_blocks.1.img_attn.proj.weight","shape":[3072,3072]},{"dtype":"quant","ggml_type":"Q5_K","name":"double_blocks.1.img_attn.qkv.weight","shape":[9216,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"double_blocks.1.img_mlp.0.weight","shape":[18432,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"double_blocks.1.img_mlp.2.weight","shape":[3072,9216]},{"dtype":"f32","ggml_type":"F32","name":"double_blocks.1.txt_attn.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"double_blocks.1.txt_attn.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q4_K","name":"double_blocks.1.txt_attn.proj.weight","shape":[3072,3072]},{"dtype":"quant","ggml_type":"Q5_K","name":"double_blocks.1.txt_attn.qkv.weight","shape":[9216,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"double_blocks.1.txt_mlp.0.weight","shape":[18432,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"double_blocks.1.txt_mlp.2.weight","shape":[3072,9216]},{"dtype":"f32","ggml_type":"F32","name":"double_blocks.2.img_attn.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"double_blocks.2.img_attn.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q4_K","name":"double_blocks.2.img_attn.proj.weight","shape":[3072,3072]},{"dtype":"quant","ggml_type":"Q5_K","name":"double_blocks.2.img_attn.qkv.weight","shape":[9216,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"double_blocks.2.img_mlp.0.weight","shape":[18432,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"double_blocks.2.img_mlp.2.weight","shape":[3072,9216]},{"dtype":"f32","ggml_type":"F32","name":"double_blocks.2.txt_attn.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"double_blocks.2.txt_attn.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q4_K","name":"double_blocks.2.txt_attn.proj.weight","shape":[3072,3072]},{"dtype":"quant","ggml_type":"Q5_K","name":"double_blocks.2.txt_attn.qkv.weight","shape":[9216,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"double_blocks.2.txt_mlp.0.weight","shape":[18432,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"double_blocks.2.txt_mlp.2.weight","shape":[3072,9216]},{"dtype":"f32","ggml_type":"F32","name":"double_blocks.3.img_attn.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"double_blocks.3.img_attn.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q4_K","name":"double_blocks.3.img_attn.proj.weight","shape":[3072,3072]},{"dtype":"quant","ggml_type":"Q5_K","name":"double_blocks.3.img_attn.qkv.weight","shape":[9216,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"double_blocks.3.img_mlp.0.weight","shape":[18432,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"double_blocks.3.img_mlp.2.weight","shape":[3072,9216]},{"dtype":"f32","ggml_type":"F32","name":"double_blocks.3.txt_attn.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"double_blocks.3.txt_attn.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q4_K","name":"double_blocks.3.txt_attn.proj.weight","shape":[3072,3072]},{"dtype":"quant","ggml_type":"Q5_K","name":"double_blocks.3.txt_attn.qkv.weight","shape":[9216,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"double_blocks.3.txt_mlp.0.weight","shape":[18432,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"double_blocks.3.txt_mlp.2.weight","shape":[3072,9216]},{"dtype":"f32","ggml_type":"F32","name":"double_blocks.4.img_attn.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"double_blocks.4.img_attn.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q5_K","name":"double_blocks.4.img_attn.proj.weight","shape":[3072,3072]},{"dtype":"quant","ggml_type":"Q5_K","name":"double_blocks.4.img_attn.qkv.weight","shape":[9216,3072]},{"dtype":"quant","ggml_type":"Q5_K","name":"double_blocks.4.img_mlp.0.weight","shape":[18432,3072]},{"dtype":"quant","ggml_type":"Q5_K","name":"double_blocks.4.img_mlp.2.weight","shape":[3072,9216]},{"dtype":"f32","ggml_type":"F32","name":"double_blocks.4.txt_attn.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"double_blocks.4.txt_attn.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q5_K","name":"double_blocks.4.txt_attn.proj.weight","shape":[3072,3072]},{"dtype":"quant","ggml_type":"Q5_K","name":"double_blocks.4.txt_attn.qkv.weight","shape":[9216,3072]},{"dtype":"quant","ggml_type":"Q5_K","name":"double_blocks.4.txt_mlp.0.weight","shape":[18432,3072]},{"dtype":"quant","ggml_type":"Q5_K","name":"double_blocks.4.txt_mlp.2.weight","shape":[3072,9216]},{"dtype":"bf16","ggml_type":"BF16","name":"double_stream_modulation_img.lin.weight","shape":[18432,3072]},{"dtype":"bf16","ggml_type":"BF16","name":"double_stream_modulation_txt.lin.weight","shape":[18432,3072]},{"dtype":"bf16","ggml_type":"BF16","name":"final_layer.adaLN_modulation.1.weight","shape":[6144,3072]},{"dtype":"bf16","ggml_type":"BF16","name":"final_layer.linear.weight","shape":[128,3072]},{"dtype":"bf16","ggml_type":"BF16","name":"img_in.weight","shape":[3072,128]},{"dtype":"quant","ggml_type":"Q5_K","name":"single_blocks.0.linear1.weight","shape":[27648,3072]},{"dtype":"quant","ggml_type":"Q5_K","name":"single_blocks.0.linear2.weight","shape":[3072,12288]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.0.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.0.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q5_K","name":"single_blocks.1.linear1.weight","shape":[27648,3072]},{"dtype":"quant","ggml_type":"Q5_K","name":"single_blocks.1.linear2.weight","shape":[3072,12288]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.1.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.1.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.10.linear1.weight","shape":[27648,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.10.linear2.weight","shape":[3072,12288]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.10.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.10.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.11.linear1.weight","shape":[27648,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.11.linear2.weight","shape":[3072,12288]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.11.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.11.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.12.linear1.weight","shape":[27648,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.12.linear2.weight","shape":[3072,12288]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.12.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.12.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.13.linear1.weight","shape":[27648,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.13.linear2.weight","shape":[3072,12288]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.13.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.13.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.14.linear1.weight","shape":[27648,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.14.linear2.weight","shape":[3072,12288]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.14.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.14.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.15.linear1.weight","shape":[27648,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.15.linear2.weight","shape":[3072,12288]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.15.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.15.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.16.linear1.weight","shape":[27648,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.16.linear2.weight","shape":[3072,12288]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.16.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.16.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.17.linear1.weight","shape":[27648,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.17.linear2.weight","shape":[3072,12288]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.17.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.17.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q5_K","name":"single_blocks.18.linear1.weight","shape":[27648,3072]},{"dtype":"quant","ggml_type":"Q5_K","name":"single_blocks.18.linear2.weight","shape":[3072,12288]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.18.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.18.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q5_K","name":"single_blocks.19.linear1.weight","shape":[27648,3072]},{"dtype":"quant","ggml_type":"Q5_K","name":"single_blocks.19.linear2.weight","shape":[3072,12288]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.19.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.19.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.2.linear1.weight","shape":[27648,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.2.linear2.weight","shape":[3072,12288]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.2.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.2.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.3.linear1.weight","shape":[27648,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.3.linear2.weight","shape":[3072,12288]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.3.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.3.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.4.linear1.weight","shape":[27648,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.4.linear2.weight","shape":[3072,12288]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.4.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.4.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.5.linear1.weight","shape":[27648,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.5.linear2.weight","shape":[3072,12288]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.5.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.5.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.6.linear1.weight","shape":[27648,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.6.linear2.weight","shape":[3072,12288]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.6.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.6.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.7.linear1.weight","shape":[27648,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.7.linear2.weight","shape":[3072,12288]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.7.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.7.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.8.linear1.weight","shape":[27648,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.8.linear2.weight","shape":[3072,12288]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.8.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.8.norm.query_norm.scale","shape":[128]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.9.linear1.weight","shape":[27648,3072]},{"dtype":"quant","ggml_type":"Q4_K","name":"single_blocks.9.linear2.weight","shape":[3072,12288]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.9.norm.key_norm.scale","shape":[128]},{"dtype":"f32","ggml_type":"F32","name":"single_blocks.9.norm.query_norm.scale","shape":[128]},{"dtype":"bf16","ggml_type":"BF16","name":"single_stream_modulation.lin.weight","shape":[9216,3072]},{"dtype":"bf16","ggml_type":"BF16","name":"time_in.in_layer.weight","shape":[3072,256]},{"dtype":"bf16","ggml_type":"BF16","name":"time_in.out_layer.weight","shape":[3072,3072]},{"dtype":"bf16","ggml_type":"BF16","name":"txt_in.weight","shape":[3072,7680]}]} \ No newline at end of file diff --git a/tests/comfyui_pack/stub_server.py b/tests/comfyui_pack/stub_server.py index 7a3f808e7..2f311aaa0 100755 --- a/tests/comfyui_pack/stub_server.py +++ b/tests/comfyui_pack/stub_server.py @@ -45,7 +45,12 @@ "latent": {"channels": 16, "stride": 8, "patch": 2}, "vae": {"channels_out": 3, "stride": 8}, "edit": False, "context": ("txtfusion.layerwise_blocks.0.prenorm.scale", 0, 12)}, - # FLUX.3's LATENT is the DiT's model space, which its VAE routes carry. + # FLUX.2's and FLUX.3's LATENT is the DiT's model space, which their VAE + # routes carry. + "flux2_klein": {"model_class": "Flux2", "image_model": "flux2", + "latent": {"channels": 128, "stride": 16, "patch": 1}, + "vae": {"channels_out": 3, "stride": 16, "space": "model"}, "edit": True, + "context": ("txt_in.weight", 1)}, "flux3_klein": {"model_class": "Flux3", "image_model": "flux3", "latent": {"channels": 128, "stride": 16, "patch": 1}, "vae": {"channels_out": 3, "stride": 16, "space": "model"}, "edit": True, @@ -58,6 +63,8 @@ "qwen-image-2.1-turbo": ("qwen_image21", "turbo", {"steps": 8, "cfg": 1.0, "shift": 1.0, "sigmas": TURBO_SIGMAS}), "krea-2-turbo": ("krea2", "turbo", {"steps": 8, "cfg": 1.0, "shift": 1.0, "sigmas": None}), + "flux-2-klein": ("flux2_klein", "distilled", {"steps": 4, "cfg": 1.0, "shift": 1.0, "sigmas": None}), + "flux-2-klein-base": ("flux2_klein", "base", {"steps": 50, "cfg": 4.0, "shift": 1.0, "sigmas": None}), "flux-3-klein": ("flux3_klein", "distilled", {"steps": 16, "cfg": 1.0, "shift": 6.93, "sigmas": None}), "flux-3-klein-base": ("flux3_klein", "base", {"steps": 50, "cfg": 3.5, "shift": 6.93, "sigmas": None}), } diff --git a/tests/comfyui_pack/support.py b/tests/comfyui_pack/support.py index c61842c27..60c94ae5f 100644 --- a/tests/comfyui_pack/support.py +++ b/tests/comfyui_pack/support.py @@ -182,6 +182,45 @@ def write_flux3_lora(path: str, manifest: dict, rank: int = 4, alpha: float = 2. return stems +# The pairs of write_flux2_lora: the file's key, the GGUF layer ComfyUI's +# key map puts it on and the third of a fused q, k and v it is, if any. +FLUX2_PAIRS = ( + ("transformer.transformer_blocks.0.attn.to_q", "double_blocks.0.img_attn.qkv", 0), + ("transformer.transformer_blocks.0.attn.to_k", "double_blocks.0.img_attn.qkv", 1), + ("transformer.transformer_blocks.0.attn.to_v", "double_blocks.0.img_attn.qkv", 2), + ("transformer.transformer_blocks.1.attn.add_k_proj", "double_blocks.1.txt_attn.qkv", 1), + ("transformer.single_transformer_blocks.0.attn.to_qkv_mlp_proj", "single_blocks.0.linear1", None), + ("transformer.norm_out.linear", "final_layer.adaLN_modulation.1", None), + ("lora_unet_single_blocks_1_linear2", "single_blocks.1.linear2", None), + ("diffusion_model.double_blocks.2.txt_mlp.2", "double_blocks.2.txt_mlp.2", None), + ("diffusion_model.double_stream_modulation_img.lin", "double_stream_modulation_img.lin", None), + ("diffusion_model.txt_in", "txt_in", None), +) + + +def write_flux2_lora(path: str, manifest: dict, rank: int = 4, alpha: float = 2.0, + seed: int = 0) -> list: + """A small FLUX.2 LoRA in the three spellings ComfyUI's key map reads: + diffusers names, which put q, k and v on thirds of a fused weight and + norm_out.linear on the final modulation with its halves swapped, the + kohya ``lora_unet_`` form and the dotted ``diffusion_model`` form. + Returns the GGUF layer of each pair, in the order of ``FLUX2_PAIRS``.""" + import torch + from safetensors.torch import save_file + shapes = {t["name"]: t["shape"] for t in manifest["tensors"]} + g = torch.Generator().manual_seed(seed) + sd = {} + for key, layer, third in FLUX2_PAIRS: + dout, dn = shapes[f"{layer}.weight"] + if third is not None: + dout //= 3 + sd[f"{key}.lora_down.weight"] = (torch.randn(rank, dn, generator=g) * 0.01).to(torch.bfloat16) + sd[f"{key}.lora_up.weight"] = (torch.randn(dout, rank, generator=g) * 0.01).to(torch.bfloat16) + sd[f"{key}.alpha"] = torch.tensor(alpha) + save_file(sd, path) + return [layer for _, layer, _ in FLUX2_PAIRS] + + def manifest(family: str) -> dict: with open(os.path.join(FIXTURES, f"manifest-{family}.json")) as f: return json.load(f) diff --git a/tests/comfyui_pack/test_client.py b/tests/comfyui_pack/test_client.py index c2bb07356..228326cd1 100644 --- a/tests/comfyui_pack/test_client.py +++ b/tests/comfyui_pack/test_client.py @@ -43,7 +43,7 @@ def test_every_versioned_request_names_the_contract(self): s, _, d = self.c.request("GET", C.PREFIX + "/models", versioned=False) self.assertEqual(s, 400) self.assertIn(b"X-Gmlx-Steps-Contract", d) - self.assertEqual(len(self.c.models()), 6) + self.assertEqual(len(self.c.models()), 8) def test_status_and_manifest(self): st = self.c.status("z-image-turbo") diff --git a/tests/comfyui_pack/test_comfy.py b/tests/comfyui_pack/test_comfy.py index ee373f624..dc95df4fa 100644 --- a/tests/comfyui_pack/test_comfy.py +++ b/tests/comfyui_pack/test_comfy.py @@ -43,6 +43,7 @@ C = P.client ZID, QID, QTID = "z-image-turbo", "qwen-image-2.1", "qwen-image-2.1-turbo" KID = "krea-2-turbo" +F2ID, F2BID = "flux-2-klein", "flux-2-klein-base" F3ID, F3BID = "flux-3-klein", "flux-3-klein-base" STEPS = 4 LORAS = tempfile.mkdtemp(prefix="gmlx-pack-loras-") @@ -52,6 +53,9 @@ LORA_F3 = "flux3-test-lora.safetensors" LORA_F3_KEYS = {f"diffusion_model.{s}.weight" for s in support.write_flux3_lora(os.path.join(LORAS, LORA_F3), support.manifest("flux3_klein"))} +LORA_F2 = "flux2-test-lora.safetensors" +LORA_F2_KEYS = {f"diffusion_model.{s}.weight" for s in + support.write_flux2_lora(os.path.join(LORAS, LORA_F2), support.manifest("flux2_klein"))} # FLUX.3 came to ComfyUI after the pinned checkout; there its models are # refused by name. HAS_FLUX3 = hasattr(comfy.supported_models, "Flux3") @@ -246,6 +250,24 @@ def test_a_class_mismatch_names_both(self): self.assertIn("ZImage", str(e.exception)) self.assertIn("QwenImage21", str(e.exception)) + def test_flux2_builds_on_meta_and_reads_the_reference_rule_of_its_dit(self): + for mid in (F2ID, F2BID): + with self.subTest(mid): + gc.collect() + r0 = rss() + m = self.model(mid) + gc.collect() + grew = (rss() - r0) / 2 ** 20 + uc = m.model.model_config.unet_config + self.assertEqual(type(m.model.model_config).__name__, "Flux2") + self.assertEqual((uc["guidance_embed"], uc["depth"], uc["depth_single_blocks"]), + (False, 5, 20)) + f = m.model.diffusion_model.forward + self.assertEqual((f.reads_guidance, f.ref_method, f.flow_map), (False, "index", False)) + self.assertTrue(all(p.device.type == "meta" for p in m.model.parameters())) + self.assertLess(grew, 200.0) + self.assertEqual(m.model.get_dtype(), torch.float32) + @needs_flux3 def test_flux3_builds_on_meta_with_its_flow_map_from_the_manifest(self): for mid, flow in ((F3ID, True), (F3BID, False)): @@ -417,6 +439,30 @@ def test_a_flux3_lora_on_native_keys_becomes_a_table(self): b = LL.load_lora_model_only(self.model(F3BID), LORA_F3, 0.8)[0] self.assertEqual(set(b.patches), LORA_F3_KEYS - {"diffusion_model.ref_time_in.in_layer.weight"}) + def test_a_flux2_lora_in_three_spellings_becomes_a_table(self): + """ComfyUI's FLUX.2 key map puts diffusers q, k and v on thirds of the + fused weight and norm_out.linear on the final modulation with the + halves of its product swapped, and the kohya and native names on their + layers.""" + m = comfy_nodes.LoraLoaderModelOnly().load_lora_model_only(self.model(F2ID), LORA_F2, 0.8)[0] + self.assertEqual(set(m.patches), LORA_F2_KEYS) + qkv = m.patches["diffusion_model.double_blocks.0.img_attn.qkv.weight"] + self.assertEqual(sorted(t[3] for t in qkv), [(0, 0, 3072), (0, 3072, 3072), (0, 6144, 3072)]) + tid = m.sync_patches() + table, tensors = P.patches.build_table(F2ID, m.patches) + self.assertEqual(tid, C.table_id(table)[0]) + (put,) = self.stub.events("put_table") + self.assertEqual((put["id"], put["entries"], put["bands"], put["strengths"]), + (tid, len(support.FLUX2_PAIRS), 4, [0.8])) + self.assertEqual(len(self.stub.events("put_adapter")), 2 * len(support.FLUX2_PAIRS)) + sd = comfy.utils.load_torch_file(os.path.join(LORAS, LORA_F2), safe_load=True) + up = sd["transformer.norm_out.linear.lora_up.weight"] + (e,) = [e for e in table["entries"] + if e["key"] == "diffusion_model.final_layer.adaLN_modulation.1.weight"] + (pp,) = e["patches"] + self.assertTrue(torch.equal(tensors[pp["up"]], torch.cat([up[3072:], up[:3072]]))) + self.assertTrue(torch.equal(tensors[pp["down"]], sd["transformer.norm_out.linear.lora_down.weight"])) + def test_a_dropped_adapter_is_uploaded_again_on_409(self): m = comfy_nodes.LoraLoaderModelOnly().load_lora_model_only(self.model(), LORA, 0.7)[0] # The client believes the server holds every pair; the server holds none. @@ -498,6 +544,7 @@ def test_forward_time_refusals_name_what_reached_the_forward(self): "DIFFUSION_MODEL wrapper": dict(transformer_options={"wrappers": { comfy.patcher_extension.WrappersMP.DIFFUSION_MODEL: {"k": [lambda *a: a]}}}), "'siglip_feats'": dict(siglip_feats=[torch.zeros(1, 2, 2, 8)]), + "the DiT input 'guidance'": dict(guidance=torch.tensor([3.5])), "reference latents": dict(ref_latents=[torch.zeros(1, 16, 4, 4)])} for name, kw in cases.items(): with self.subTest(name): @@ -508,6 +555,29 @@ def test_forward_time_refusals_name_what_reached_the_forward(self): finally: m.model.current_patcher = None + def test_a_flux2_forward_reads_no_guidance_and_refuses_another_reference_method(self): + """ComfyUI hands a FLUX.2 forward the guidance on every call, which its + DiT reads only through a guidance embedder klein has none of. The + server places the references by the DiT's own index rule, so another + method, which FluxKontextMultiReferenceLatentMethod sets, is refused by + name.""" + f = self.model(F2ID).model.diffusion_model.forward + cond = self.cond(F2ID, "x")[0][0] + x, t, g = torch.zeros(1, 128, 4, 4), torch.tensor([1.0]), torch.tensor([3.5]) + ref = torch.zeros(1, 128, 2, 2) + f(x, t, context=cond, guidance=g) + f(x, t, context=cond, guidance=g, ref_latents=[ref], ref_latents_method="index") + self.assertEqual([s["refs"] for s in self.stub.events("step")], [[0], [1]]) + for method in ("offset", "uxo", "index_timestep_zero"): + with self.subTest(method): + with self.assertRaises(C.GmlxRefusal) as e: + f(x, t, context=cond, guidance=g, ref_latents=[ref], ref_latents_method=method) + self.assertIn(f"{F2ID!r} places its reference latents by the 'index' method, and " + f"this call asks for {method!r}", str(e.exception)) + # Without references the stock DiT reads no method either. + f(x, t, context=cond, guidance=g, ref_latents_method="offset") + self.assertEqual(len(self.stub.events("step")), 3) + @needs_flux3 def test_flux3_refusals_name_what_reached_the_forward(self): m = self.model(F3ID) @@ -597,6 +667,25 @@ def test_a_frame_axis_of_more_than_one_frame_is_refused(self): fwd(torch.zeros(1, 16, 2, 8, 8), torch.ones(1), context=torch.zeros(1, 4, 30720)) self.assertIn("(B, C, h, w)", str(e.exception)) + def test_a_flux2_sample_sends_its_512_text_rows_and_no_schedule(self): + """ComfyUI's Flux2 model pads the text rows at the front to 512 and + hands the forward a guidance the step does not carry. The DiT is no + flow map, so no schedule goes.""" + for mid, cfg, rows in ((F2ID, 1.0, 1), (F2BID, 4.0, 2)): + with self.subTest(mid): + self.stub.reset() + with torch.inference_mode(): + out = self.sample(self.model(mid), mid, cfg=cfg) + steps = self.stub.events("step") + self.assertEqual(len(steps), STEPS) + self.assertEqual({s["rows"] for s in steps}, {rows}) + self.assertEqual({tuple(s["tensors"]) for s in steps}, {("timestep", "x")}) + self.assertEqual({tuple(s["row_keys"]) for s in steps}, {("cond", "num_tokens")}) + self.assertEqual({tuple(s["num_tokens"]) for s in steps}, {(512,) * rows}) + self.assertEqual({tuple(s["x_shape"]) for s in steps}, {(rows, 128, 4, 4)}) + self.assertEqual(tuple(out.shape), (1, 128, 4, 4)) + self.assertTrue(bool(torch.isfinite(out).all())) + @needs_flux3 def test_a_flux3_flow_map_step_carries_the_sampler_schedule(self): """Each step holds ComfyUI's sample_sigmas, so the server's target is @@ -831,6 +920,61 @@ def test_qwen_edit_with_two_references_reaches_the_step(self): self.assertEqual(steps[0]["x_shape"], [2, 64, 6, 4]) self.assertEqual(tuple(res["samples"].shape), (1, 64, 6, 4)) + def test_flux2_clip_and_vae_carry_its_features_and_model_space_latents(self): + clip = P.nodes.GmlxCLIPLoader().load(F2ID, self.stub.url, False)[0] + (cond,) = comfy_nodes.CLIPTextEncode().encode(clip, "a lighthouse") + self.assertEqual(tuple(cond[0][0].shape), (1, 32, 7680)) + # KleinTokenizer applies its chat template before prevent_empty_text + # reads the prompt, so an empty prompt goes as it is. + clip.encode_from_tokens_scheduled(clip.tokenize("", prevent_empty_text=True)) + self.assertEqual([e["text"] for e in self.stub.events("encode")], ["a lighthouse", ""]) + vae = P.nodes.GmlxVAELoader().load(F2ID, self.stub.url, False)[0] + (img,) = comfy_nodes.VAEDecode().decode(vae, {"samples": torch.zeros(1, 128, 4, 6)}) + self.assertEqual(tuple(img.shape), (1, 64, 96, 3)) + (lat,) = comfy_nodes.VAEEncode().encode(vae, torch.rand(1, 70, 100, 3)) + self.assertEqual(tuple(lat["samples"].shape), (1, 128, 4, 6)) + self.assertEqual(self.stub.events("vae_encode")[-1]["shape"], [1, 64, 96, 3]) + + def test_a_flux2_edit_through_reference_latent_reaches_the_step(self): + """ComfyUI's FLUX.2 klein edit template: the text encode, its zeroed + negative, and the reference's VAEEncode put on both by + ReferenceLatent. FluxKontextMultiReferenceLatentMethod at the DiT's + own rule passes, and another method is refused by name.""" + from comfy_extras.nodes_edit_model import ReferenceLatent + from comfy_extras.nodes_flux import FluxKontextMultiReferenceLatentMethod + clip = P.nodes.GmlxCLIPLoader().load(F2ID, self.stub.url, False)[0] + vae = P.nodes.GmlxVAELoader().load(F2ID, self.stub.url, False)[0] + (pos,) = comfy_nodes.CLIPTextEncode().encode(clip, "make it blue") + (neg,) = comfy_nodes.ConditioningZeroOut().zero_out(pos) + (lat,) = comfy_nodes.VAEEncode().encode(vae, torch.rand(1, 96, 64, 3)) + pos, neg = ReferenceLatent.execute(pos, lat)[0], ReferenceLatent.execute(neg, lat)[0] + latent = {"samples": torch.zeros(1, 128, 4, 4)} + for method in (None, "index"): + with self.subTest(method): + self.stub.reset() + p = pos if method is None else FluxKontextMultiReferenceLatentMethod.execute(pos, method)[0] + with torch.inference_mode(): + (res,) = comfy_nodes.common_ksampler(self.model(F2ID), 1, 2, 2.0, "euler", "simple", + p, neg, latent) + steps = self.stub.events("step") + self.assertEqual(sum(s["rows"] for s in steps), 4) + for s in steps: + self.assertEqual(s["ref_shapes"], [[[1, 128, 6, 4]]] * s["rows"]) + self.assertEqual(s["row_keys"], ["cond", "num_tokens", "ref_latents"]) + self.assertEqual(tuple(res["samples"].shape), (1, 128, 4, 4)) + p = FluxKontextMultiReferenceLatentMethod.execute(pos, "offset")[0] + with self.assertRaises(C.GmlxRefusal) as e, torch.inference_mode(): + comfy_nodes.common_ksampler(self.model(F2ID), 1, 2, 2.0, "euler", "simple", p, neg, latent) + self.assertIn("by the 'index' method, and this call asks for 'offset'", str(e.exception)) + + def test_stock_lora_loader_with_the_gmlx_flux2_clip(self): + model = self.model(F2ID) + clip = P.nodes.GmlxCLIPLoader().load(F2ID, self.stub.url, False)[0] + m2, c2 = comfy_nodes.LoraLoader().load_lora(model, clip, LORA_F2, 0.8, 1.0) + self.assertIsInstance(m2, P.patcher.GmlxModelPatcher) + self.assertIsInstance(c2, P.clip.GmlxCLIP) + self.assertEqual(set(m2.patches), LORA_F2_KEYS) + def test_flux3_clip_and_vae_carry_its_features_and_model_space_latents(self): clip = P.nodes.GmlxCLIPLoader().load(F3ID, self.stub.url, False)[0] (cond,) = comfy_nodes.CLIPTextEncode().encode(clip, "a lighthouse") @@ -958,7 +1102,7 @@ def tearDown(self): os.environ[k] = v def test_the_loaders_list_the_server_models_default_first(self): - want = [QID, ZID, QTID, KID, F3ID, F3BID] + want = [QID, ZID, QTID, KID, F2ID, F2BID, F3ID, F3BID] for name in ("GmlxModelLoader", "GmlxCLIPLoader", "GmlxVAELoader", "GmlxServerStatus"): node = P.NODE_CLASS_MAPPINGS[name] req = node.INPUT_TYPES()["required"] @@ -977,7 +1121,7 @@ def test_the_server_default_image_model_comes_first(self): os.environ.pop("GMLX_DEFAULT_IMAGE_MODEL") self.probed() names, opts = P.nodes.GmlxModelLoader.INPUT_TYPES()["required"]["model_name"] - self.assertEqual(names, [KID, ZID, QID, QTID, F3ID, F3BID]) + self.assertEqual(names, [KID, ZID, QID, QTID, F2ID, F2BID, F3ID, F3BID]) self.assertEqual(opts["default"], KID) finally: stub.close() @@ -1065,6 +1209,9 @@ class AgainstComfyGGUF(Base): def test_unet_config_and_patches_equal_comfyui_gguf(self): self.against("GMLX_TEST_ZIMAGE_GGUF", ZID, LORA) + def test_flux2_unet_config_and_patches_equal_comfyui_gguf(self): + self.against("GMLX_TEST_FLUX2_GGUF", F2ID, LORA_F2) + @needs_flux3 def test_flux3_unet_config_and_patches_equal_comfyui_gguf(self): self.against("GMLX_TEST_FLUX3_GGUF", F3ID, LORA_F3) diff --git a/tests/serve/test_image_steps.py b/tests/serve/test_image_steps.py index c2782463f..52a0e171d 100644 --- a/tests/serve/test_image_steps.py +++ b/tests/serve/test_image_steps.py @@ -170,8 +170,8 @@ def test_capabilities_answer_without_the_version_header(host): assert r.status_code == 200 caps = r.json() assert caps["contract"] == {"major": 1, "minor": 0} - assert caps["families"] == ["flux3_klein", "krea2", "qwen_image21", - "z_image"] + assert caps["families"] == ["flux2_klein", "flux3_klein", "krea2", + "qwen_image21", "z_image"] assert caps["conventions"] == ["comfy"] assert caps["wire"]["container"] == "safetensors" @@ -380,7 +380,8 @@ def test_the_convention_maps_the_timestep_and_signs_the_output( host, pipe, monkeypatch): # ComfyUI hands every family sigma as the timestep and wants the # velocity back, so every convention is the identity. - for fam in ("z_image", "qwen_image21", "krea2", "flux3_klein"): + for fam in ("z_image", "qwen_image21", "krea2", "flux2_klein", + "flux3_klein"): assert steps.CONVENTIONS["comfy"][fam] == steps.Convention() monkeypatch.setitem(steps.CONVENTIONS["comfy"], "z_image", steps.Convention(scale=-1.0, shift=1.0, sign=-1.0)) @@ -578,13 +579,18 @@ def test_the_flux3_vae_routes_carry_model_space_latents(host, fpipes, """ComfyUI's FLUX.3 latents are the model's: the routes hand them to the core VAE passes as they are, where the other families map them to and from the VAE's own space.""" + _model_space_vae_routes(host, fpipes[True], "f3d", monkeypatch) + + +def _model_space_vae_routes(host, pipe, mid, monkeypatch): def no_map(_z): - raise AssertionError("FLUX.3 latents are mapped to no other space") + raise AssertionError(f"{pipe.family.title} latents are mapped to no " + "other space") - pipe = dataclasses.replace(fpipes[True], vae=SimpleNamespace( + pipe = dataclasses.replace(pipe, vae=SimpleNamespace( config=SimpleNamespace(in_channels=3), to_model_space=no_map, to_vae_space=no_map)) - _serve(host, "f3d", pipe) + _serve(host, mid, pipe) seen = [] def decode(p, z, *, alpha=False, **kw): @@ -597,13 +603,13 @@ def decode(p, z, *, alpha=False, **kw): monkeypatch.setattr(api, "vae_encode", lambda p, img, **kw: mx.array( lat[:1])) c = _client() - got, _, _ = c.container("vae/decode", {"latents": lat}, {"model": "f3d"}) + got, _, _ = c.container("vae/decode", {"latents": lat}, {"model": mid}) assert got["image"].shape == (2, 32, 48, 3) assert [z.shape for z in seen] == [(1, 128, 2, 3)] * 2 assert np.array_equal(np.concatenate(seen), lat) got, _, _ = c.container("vae/encode", {"image": np.zeros((1, 32, 48, 3), np.float32)}, - {"model": "f3d"}) + {"model": mid}) assert np.array_equal(got["latents"], lat[:1]) @@ -615,6 +621,132 @@ def test_flow_targets_follow_comfyuis_rule(): assert steps.flow_targets(s, [0.625]) == [0.5] + + +# FLUX.2 klein: ComfyUI's Flux2 forward takes sigma as the timestep and +# returns the native velocity, reads the reference latents of a row in +# its order, and its VAE routes carry model-space latents, as FLUX.3's do. + +@pytest.fixture(scope="module") +def f2pipe(): + """The tiny FLUX.2 klein DiT of the check 3 self-test.""" + def build(): + import flux2_gates as fg + from oracle_fixture import committed_fixture + + weights, m = committed_fixture("selftest_flux2_klein_tiny_weights") + return api.ImagePipeline( + dit=fg.tiny_model(weights, m["inputs"]["config"]), + family=get_family("flux2_klein"), variant="distilled") + return _on_worker(build) + + +def _f2_cond(feats, *refs, key="k"): + return api.Conditioning(mx.array(feats[0]), key, ref_latents=tuple( + mx.array(r[0]) for r in refs)) + + +def test_a_flux2_step_is_the_core_step_with_and_without_references( + host, f2pipe): + """Each step equals denoise_step at the timestep as sigma, with no + schedule read, with a reference and with two rows.""" + _serve(host, "f2d", f2pipe) + c = _client() + rng = np.random.default_rng(7) + feats = rng.standard_normal((1, 10, 24)).astype(np.float32) + ref = rng.standard_normal((1, 8, 2, 3)).astype(np.float32) + x = noise_from_seed(5, F3_SHAPE) + rows = _rows(c, feats) + for t in SIGMAS[:-1]: + for sched in (None, SIGMAS): + out = c.step("f2d", None, x, [t], rows, sample_sigmas=sched) + assert np.array_equal(out, _f3_velocity( + f2pipe, x, t, _f2_cond(feats))), t + with_ref = [{"cond": rows[0]["cond"], "ref_latents": [c.put(ref)]}] + out = c.step("f2d", None, x, [0.75], with_ref) + assert np.array_equal(out, _f3_velocity(f2pipe, x, 0.75, + _f2_cond(feats, ref))) + assert not np.array_equal(out, _f3_velocity(f2pipe, x, 0.75, + _f2_cond(feats))) + two = c.step("f2d", None, np.concatenate([x, x]), [0.75, 0.75], + rows + with_ref) + assert np.array_equal(two[1:], out) + assert host.held == 0 + + +def test_a_flux2_step_takes_its_references_in_the_order_of_the_row( + host, f2pipe): + _serve(host, "f2d", f2pipe) + c = _client() + rng = np.random.default_rng(11) + feats = rng.standard_normal((1, 10, 24)).astype(np.float32) + a = rng.standard_normal((1, 8, 2, 3)).astype(np.float32) + b = rng.standard_normal((1, 8, 3, 2)).astype(np.float32) + x = noise_from_seed(5, F3_SHAPE) + row = {"cond": _rows(c, feats)[0]["cond"], + "ref_latents": [c.put(a), c.put(b)]} + out = c.step("f2d", None, x, [0.75], [row]) + want = _f3_velocity(f2pipe, x, 0.75, _f2_cond(feats, a, b, key="")) + assert np.array_equal(out, want) + assert not np.array_equal(out, _f3_velocity( + f2pipe, x, 0.75, _f2_cond(feats, b, a, key=""))) + assert host.held == 0 + + +def test_a_flux2_table_on_comfyuis_native_keys_steps_as_the_core_table( + host, f2pipe): + """ComfyUI names a FLUX.2 pair by the GGUF name under diffusion_model., + a diffusers q, k or v pair as a band of the fused qkv, and the core + table of those keys gives the same step.""" + from lora_fixtures import make_pair + + _serve(host, "f2d", f2pipe) + c = _client() + rng = np.random.default_rng(10) + feats = rng.standard_normal((1, 10, 24)).astype(np.float32) + x = noise_from_seed(5, F3_SHAPE) + plain = _f3_velocity(f2pipe, x, 0.75, _f2_cond(feats)) + for name, band, (dout, din) in ( + ("double_blocks.0.img_attn.qkv", [0, 64, 64], (64, 64)), + ("double_blocks.1.txt_attn.qkv", None, (192, 64)), + ("single_blocks.0.linear1", None, (576, 64)), + ("txt_in", None, (64, 24))): + down, up, _ = make_pair(rng, dout, din, 2) + tid = c.define_table("f2d", {"entries": [{ + "key": f"diffusion_model.{name}.weight", "band": band, + "patches": [{"up": c.put(up, kind="adapters"), + "down": c.put(down, kind="adapters"), "alpha": 2.0, + "strength": 0.8}]}]}) + core = steps.STATE.tables_of("f2d", f2pipe)[tid] + out = c.step("f2d", None, x, [0.75], _rows(c, feats), + patch_table=tid) + want = _on_worker(lambda: np.array(api.denoise_step( + f2pipe, mx.array(x), 0.75, _f2_cond(feats), patch_table=core))) + assert np.array_equal(out, want), name + assert not np.array_equal(out, plain), name + + +def test_the_flux2_status_names_comfyuis_flux2_on_model_space_latents( + host, f2pipe, monkeypatch): + monkeypatch.setattr(steps, "family_of", lambda spec: ( + get_family("flux2_klein"), "distilled")) + monkeypatch.setattr(api, "_header_bytes", lambda path, part: 7) + _serve(host, "f2d", f2pipe) + st = _client().status("f2d") + assert st["comfy"] == {"model_class": "Flux2", "image_model": "flux2"} + assert st["edit_capable"] + assert st["latent"] == {"channels": 128, "stride": 16, "patch": 1} + assert st["vae"] == {"channels_out": 3, "stride": 16, "space": "model"} + assert st["sampling"] == {"steps": 4, "cfg": 1.0, "shift": 1.0, + "sigmas": None} + + +def test_the_flux2_vae_routes_carry_model_space_latents(host, f2pipe, + monkeypatch): + """ComfyUI's FLUX.2 latents are the model's, as FLUX.3's are.""" + _model_space_vae_routes(host, f2pipe, "f2d", monkeypatch) + + # Patch tables. def _table_body(c, scale=0.2, strength=0.8): @@ -1046,14 +1178,17 @@ def test_step_encode_keeps_each_reference_at_its_own_size(monkeypatch): assert e.value.status == 400 -def test_a_flux3_step_encode_takes_the_prompt_and_no_images(monkeypatch): - """FLUX.3 klein's encoder reads the prompt alone, and its steps take - the reference latents of the VAE route, so images on the encode are - refused by that rule.""" +@pytest.mark.parametrize("fam, title", [("flux2_klein", "FLUX.2 klein"), + ("flux3_klein", "FLUX.3 klein")]) +def test_a_klein_step_encode_takes_the_prompt_and_no_images(monkeypatch, fam, + title): + """The FLUX.2 and FLUX.3 klein encoders read the prompt alone, and + their steps take the reference latents of the VAE route, so images on + the encode are refused by that rule.""" served, seen, _ = _stub_step_encode(monkeypatch) - served.pipe.family = get_family("flux3_klein") + served.pipe.family = get_family(fam) img = np.zeros((256, 256, 3), np.uint8) - with pytest.raises(steps.StepError, match="the FLUX.3 klein encoder " + with pytest.raises(steps.StepError, match=f"the {title} encoder " "reads the prompt alone; a step takes the reference " "latents the VAE route encodes") as e: _on_worker(lambda: steps.encode(served, "a", [img])) From 788db0c054b353c9fe651a4473475f3b29bca35e Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 11:28:08 -0700 Subject: [PATCH 024/101] fix(serve): a flux2 klein step on comfyui's convention embeds the fp32 time as comfyui's flux2 does --- gmlx/image/api.py | 39 +++++++++++++----- gmlx/image/families/flux2_klein/model.py | 44 +++++++++++++++++---- gmlx/serve/image_steps.py | 20 ++++++---- gmlx/serve/patches/image_steps.py | 2 +- tests/image/test_image_flux2_model.py | 50 ++++++++++++++++++++++++ tests/serve/test_image_steps.py | 44 +++++++++++++-------- 6 files changed, 157 insertions(+), 42 deletions(-) diff --git a/gmlx/image/api.py b/gmlx/image/api.py index 2278ac587..550757dc3 100644 --- a/gmlx/image/api.py +++ b/gmlx/image/api.py @@ -812,12 +812,18 @@ def _table_id(pipe: ImagePipeline, patch_table) -> str: def denoise_step(pipe: ImagePipeline, latents, sigma, conds, *, - patch_table=None, target=None) -> mx.array: + patch_table=None, target=None, + time: str = "reference") -> mx.array: """The velocity of every row of ``latents`` at ``sigma``, a scalar or one value per row, under ``conds``, one Conditioning or one per row. ``target`` is the sigma the step goes to, likewise, which a flow map - DiT takes and every other DiT refuses. Outside a ``state_scope`` the + DiT takes and every other DiT refuses. ``time`` names how the DiT + embeds the time, one of its ``time_rules``: "reference", the rule + gmlx samples on, which every DiT takes. Outside a ``state_scope`` the conditionings of the call are its scope.""" + if time not in getattr(pipe.dit, "time_rules", ("reference",)): + raise ValueError(f"the {pipe.family.title} DiT has no time rule " + f"{time!r}") table = _table_id(pipe, patch_table) x = mx.array(latents).astype(mx.float32) if x.ndim != 4: @@ -837,7 +843,7 @@ def per_row(v, what): raise ValueError(f"{len(rows)} conditionings for {b} rows") with state_scope(pipe, rows): out = [_row(pipe, x[i:i + 1], sig[i], rows[i], table, - None if tgt is None else tgt[i]) for i in range(b)] + None if tgt is None else tgt[i], time) for i in range(b)] return out[0] if b == 1 else mx.concatenate(out, axis=0) @@ -1007,11 +1013,18 @@ def _parts_row(pipe: ImagePipeline, parts, x: mx.array, sigma: np.float32, def _row(pipe: ImagePipeline, x: mx.array, sigma: np.float32, - cond: Conditioning, table, target=None) -> mx.array: + cond: Conditioning, table, target=None, + time: str = "reference") -> mx.array: """One row. A DiT that takes reference images gets the tokens of the conditioning's reference latents from its ``references``, and a flow - map the ``target`` its modulation reads.""" + map the ``target`` its modulation reads. A time rule other than the + reference's reaches the DiT through its modulation.""" dit = pipe.dit + modulated = hasattr(dit, "modulation") and hasattr(dit, "caption") + if time != "reference" and (pipe.family.step is not None + or not modulated): + raise ValueError(f"the {pipe.family.title} DiT takes the time rule " + f"{time!r} through no modulation") if pipe.family.step is not None: if target is not None: raise ValueError(f"the {pipe.family.title} DiT takes no target " @@ -1025,12 +1038,12 @@ def _row(pipe: ImagePipeline, x: mx.array, sigma: np.float32, f"reference images") kw["refs"] = dit.references([mx.array(z)[None] for z in cond.ref_latents]) - if not (hasattr(dit, "modulation") and hasattr(dit, "caption")): + if not modulated: if target is not None: kw["target"] = np.reshape(np.float32(target), (1,)) return _under(pipe, table, lambda: dit( x, np.reshape(sigma, (1,)), cond.features[None], **kw)) - mod = _modulation(pipe, sigma, table, target) + mod = _modulation(pipe, sigma, table, target, time) caption = _caption(pipe, cond, table) return _under(pipe, table, lambda: dit( x, np.reshape(sigma, (1,)), None, mod=mod, caption=caption, **kw)) @@ -1050,10 +1063,18 @@ def _memo(cache: ByteLRU, key, make): return hit -def _modulation(pipe: ImagePipeline, sigma: np.float32, table, target=None): +def _modulation(pipe: ImagePipeline, sigma: np.float32, table, target=None, + time: str = "reference"): """The modulation of ``sigma``, and of ``target`` for a flow map, kept - under their float32 bits and the patch table.""" + under their float32 bits and the patch table, and under the time rule + when it is not the reference's.""" s = np.float32(sigma) + if time != "reference": + if target is not None: + raise ValueError("a flow map takes the reference's time rule") + return _memo(pipe.modulations, (s.tobytes(), table, "time", time), + lambda: _under(pipe, table, lambda: pipe.dit.modulation( + np.reshape(s, (1,)), 1, time=time))) if target is None: return _memo(pipe.modulations, (s.tobytes(), table), lambda: _under(pipe, table, lambda: pipe.dit.modulation( diff --git a/gmlx/image/families/flux2_klein/model.py b/gmlx/image/families/flux2_klein/model.py index 348021fea..9c2bf262f 100644 --- a/gmlx/image/families/flux2_klein/model.py +++ b/gmlx/image/families/flux2_klein/model.py @@ -31,8 +31,10 @@ The time embedding follows the reference pipeline, which holds the time in bf16: the embedder multiplies by 1000 in bf16 and returns the embedding -in bf16, in every activation dtype. The time vector and the modulations -then run in fp32 and round once. +in bf16, in every activation dtype. A step on ComfyUI's convention takes +the "fp32" time rule instead, the embedding of the fp32 time rounded to +the activation dtype, as ComfyUI's Flux2 forms it. The time vector and +the modulations then run in fp32 and round once. RoPE has four axes of 32 dims at theta 2000. An image token sits at (0, row, column, 0), a token of reference image i at (10 + 10 i, row, column, @@ -118,6 +120,22 @@ def time_embedding(t, dim: int) -> mx.array: return emb.astype(mx.bfloat16).astype(mx.float32) +def fp32_time_embedding(t, dim: int, act: mx.Dtype) -> mx.array: + """The embedding (B, dim) of fp32 times ``t`` as ComfyUI's Flux2 forms + it: 1000 times the time in fp32, the cosines and sines in fp32, and + the embedding rounded to the activation dtype ``act``. Returned in + float32.""" + t1000 = np.float32(1000) * np.asarray(np.reshape(t, (-1,)), np.float32) + emb = ops.timestep_embedding(t1000, dim) + return emb.astype(act).astype(mx.float32) + + +# How the DiT embeds the time of a step: "reference", the bf16 time of the +# reference pipeline, which gmlx samples on, or "fp32", the fp32 time a +# client such as ComfyUI embeds. +TIME_RULES = ("reference", "fp32") + + def rope_tables(ids: np.ndarray, axes_dims, theta: float) -> tuple: """cos and sin tables (L, sum(axes_dims) // 2) for integer position ids (L, n_axes). The reference forms each frequency as 1 / theta ** @@ -434,18 +452,28 @@ def act_dtype(self, dtype: mx.Dtype) -> None: def _lin(self): return precise if self.act_dtype != mx.float32 else own - def vector(self, sigma, batch: int) -> mx.array: - """The time vector (B, dim) fp32 of ``sigma``.""" + time_rules = TIME_RULES + + def vector(self, sigma, batch: int, time: str = "reference") -> mx.array: + """The time vector (B, dim) fp32 of ``sigma``, its time embedded + by the rule ``time`` of TIME_RULES.""" lin = self._lin() - e = time_embedding(np.broadcast_to(np.asarray(sigma, np.float32), - (batch,)), self.cfg.t_dim) + t = np.broadcast_to(np.asarray(sigma, np.float32), (batch,)) + if time == "reference": + e = time_embedding(t, self.cfg.t_dim) + elif time == "fp32": + e = fp32_time_embedding(t, self.cfg.t_dim, self.act_dtype) + else: + raise ValueError(f"the FLUX.2 klein DiT has no time rule " + f"{time!r}") return lin(self.time_in.out_layer, nn.silu(lin(self.time_in.in_layer, e))) - def modulation(self, sigma, batch: int) -> StepModulation: + def modulation(self, sigma, batch: int, + time: str = "reference") -> StepModulation: lin = self._lin() act = self.act_dtype - v = nn.silu(self.vector(sigma, batch)) + v = nn.silu(self.vector(sigma, batch, time)) def chunks(mod, n): y = lin(mod, v).astype(act)[:, None, :] diff --git a/gmlx/serve/image_steps.py b/gmlx/serve/image_steps.py index 0ed423aa9..5f67eac6b 100644 --- a/gmlx/serve/image_steps.py +++ b/gmlx/serve/image_steps.py @@ -23,7 +23,10 @@ the timestep as it is and returns the native output, as its Krea 2, FLUX.2 and FLUX.3 forwards do. All give, for the flow schedule, the velocity ``d x / d sigma`` at ``sigma = timestep``, which -``denoise_step`` returns. +``denoise_step`` returns. ComfyUI's FLUX.2 forward embeds the fp32 time, +where BFL's pipeline, which gmlx samples on, embeds its bf16 time, so a +FLUX.2 step takes the DiT's "fp32" time rule. ComfyUI's FLUX.3 forward +embeds the time in the model's dtype, as BFL's does. A FLUX.3 flow map DiT also reads the time its step goes to. ComfyUI's forward takes it from the schedule its sampler runs on: the entry after @@ -63,16 +66,17 @@ @dataclass(frozen=True) class Convention: """How a step reads a timestep and returns its output under one - client convention: ``sigma = scale * timestep + shift`` and - ``out = sign * velocity``.""" + client convention: ``sigma = scale * timestep + shift``, the DiT's + time rule ``time`` (``denoise_step``) and ``out = sign * velocity``.""" scale: float = 1.0 shift: float = 0.0 sign: float = 1.0 + time: str = "reference" CONVENTIONS = { "comfy": {"z_image": Convention(), "qwen_image21": Convention(), - "krea2": Convention(), "flux2_klein": Convention(), + "krea2": Convention(), "flux2_klein": Convention(time="fp32"), "flux3_klein": Convention()}, } @@ -741,10 +745,10 @@ def fn(arrays): def run_step(served, x, sigmas, conds, table, run, gen, - targets=None) -> tuple: + targets=None, time_rule: str = "reference") -> tuple: """One ``denoise_step`` over the rows on the image worker, to the - ``targets`` of a flow map DiT. Returns (velocity f32 evaluated, - forward seconds, prefix cache answer).""" + ``targets`` of a flow map DiT, on the DiT's ``time_rule``. Returns + (velocity f32 evaluated, forward seconds, prefix cache answer).""" import mlx.core as mx from gmlx.image import api @@ -757,7 +761,7 @@ def run_step(served, x, sigmas, conds, table, run, gen, t0 = time.perf_counter() with paced(step_pacer(run, gen)): v = api.denoise_step(pipe, x, sigmas, conds, patch_table=table, - target=targets) + target=targets, time=time_rule) v = v.astype(mx.float32) mx.eval(v) # Without chat the step is one evaluation, which an interrupt or an end diff --git a/gmlx/serve/patches/image_steps.py b/gmlx/serve/patches/image_steps.py index 2f231ead5..88f14aa16 100644 --- a/gmlx/serve/patches/image_steps.py +++ b/gmlx/serve/patches/image_steps.py @@ -565,7 +565,7 @@ def work(): x = x_w.mx().astype(mx.float32) with api.state_scope(served.pipe, scope): v, fwd_s, cache = run_step(served, x, sig, conds, table, run, - gen, targets) + gen, targets, conv.time) return _host(v), fwd_s, cache v, fwd_s, cache = await _on_worker(work) diff --git a/tests/image/test_image_flux2_model.py b/tests/image/test_image_flux2_model.py index 0e19a925c..796b1a92f 100644 --- a/tests/image/test_image_flux2_model.py +++ b/tests/image/test_image_flux2_model.py @@ -154,6 +154,56 @@ def test_the_time_embedding_follows_the_bf16_time(t, t1000): assert not np.array_equal(got, _embedded(unrounded)) +@pytest.mark.parametrize("act", [mx.bfloat16, mx.float32]) +def test_the_fp32_time_rule_embeds_the_fp32_time(act): + """ComfyUI's Flux2 embeds 1000 times the fp32 time and rounds the + embedding to the activation dtype: 0.9580853, the second time of the + 4 step schedule at 512, gives 958.0853, where the reference's rule + gives 956.""" + t = np.float32(0.9580853) + got = np.array(fm.fp32_time_embedding(t, 8, act)) + want = ops.timestep_embedding(np.float32(1000) * np.reshape(t, (1,)), 8) + assert np.array_equal(got, np.array(want.astype(act).astype(mx.float32))) + assert not np.array_equal(got, np.array(fm.time_embedding(t, 8))) + + +def test_the_dit_takes_the_fp32_time_rule_through_its_modulation( + tiny, monkeypatch): + """The fp32 rule moves the time vector and the step, the reference's + is the default, and a rule the DiT does not have is refused, as + denoise_step refuses a rule on a DiT without it.""" + from gmlx.image import api + + weights, cfg = tiny + arrays, _ = committed_fixture(TINY) + model = fg.tiny_model(weights, cfg, act=mx.bfloat16) + lat, feats, refs, _ = fg.inputs(model, arrays) + sigma = np.reshape(np.float32(0.9580853), (1,)) + ref = model(lat, sigma, feats, refs=refs) + assert mx.array_equal(ref, model(lat, sigma, feats, refs=refs, + mod=model.modulation(sigma, 1))).item() + fp32 = model(lat, sigma, feats, refs=refs, + mod=model.modulation(sigma, 1, time="fp32")) + assert not mx.array_equal(ref, fp32).item() + assert not mx.array_equal(model.vector(sigma, 1), + model.vector(sigma, 1, "fp32")).item() + with pytest.raises(ValueError, match="no time rule 'bf16'"): + model.vector(sigma, 1, "bf16") + pipe = api.ImagePipeline(dit=model, family=get_family("flux2_klein"), + variant="distilled") + cond = api.Conditioning(feats[0], "") + step = api.denoise_step(pipe, lat, sigma, cond, time="fp32") + assert mx.array_equal(step, model( + lat, sigma, feats, mod=model.modulation(sigma, 1, time="fp32"))).item() + assert not mx.array_equal(step, api.denoise_step(pipe, lat, sigma, + cond)).item() + with pytest.raises(ValueError, match="no time rule 'bf16'"): + api.denoise_step(pipe, lat, sigma, cond, time="bf16") + monkeypatch.setattr(fm.Flux2KleinDiT, "time_rules", ("reference",)) + with pytest.raises(ValueError, match="no time rule 'fp32'"): + api.denoise_step(pipe, lat, sigma, cond, time="fp32") + + def test_the_reference_tokens_run_in_the_activation_dtype(tiny): """float32 reference latents enter the image stream as the bf16 of the activations, as the image's latents do.""" diff --git a/tests/serve/test_image_steps.py b/tests/serve/test_image_steps.py index 52a0e171d..b1a742947 100644 --- a/tests/serve/test_image_steps.py +++ b/tests/serve/test_image_steps.py @@ -379,10 +379,12 @@ def test_num_tokens_and_an_attention_mask_trim_the_cond(host, pipe): def test_the_convention_maps_the_timestep_and_signs_the_output( host, pipe, monkeypatch): # ComfyUI hands every family sigma as the timestep and wants the - # velocity back, so every convention is the identity. - for fam in ("z_image", "qwen_image21", "krea2", "flux2_klein", - "flux3_klein"): + # velocity back, so every convention maps the identity. Its FLUX.2 + # forward alone embeds the fp32 time. + for fam in ("z_image", "qwen_image21", "krea2", "flux3_klein"): assert steps.CONVENTIONS["comfy"][fam] == steps.Convention() + assert steps.CONVENTIONS["comfy"]["flux2_klein"] == steps.Convention( + time="fp32") monkeypatch.setitem(steps.CONVENTIONS["comfy"], "z_image", steps.Convention(scale=-1.0, shift=1.0, sign=-1.0)) c = _client() @@ -623,9 +625,10 @@ def test_flow_targets_follow_comfyuis_rule(): -# FLUX.2 klein: ComfyUI's Flux2 forward takes sigma as the timestep and -# returns the native velocity, reads the reference latents of a row in -# its order, and its VAE routes carry model-space latents, as FLUX.3's do. +# FLUX.2 klein: ComfyUI's Flux2 forward takes sigma as the timestep, +# embeds it in fp32 and returns the native velocity, reads the reference +# latents of a row in its order, and its VAE routes carry model-space +# latents, as FLUX.3's do. @pytest.fixture(scope="module") def f2pipe(): @@ -646,10 +649,17 @@ def _f2_cond(feats, *refs, key="k"): mx.array(r[0]) for r in refs)) +def _f2_velocity(pipe, x, sigma, cond, table=None, time="fp32"): + return _on_worker(lambda: np.array(api.denoise_step( + pipe, mx.array(x), sigma, cond, patch_table=table, time=time))) + + def test_a_flux2_step_is_the_core_step_with_and_without_references( host, f2pipe): - """Each step equals denoise_step at the timestep as sigma, with no - schedule read, with a reference and with two rows.""" + """Each step equals denoise_step at the timestep as sigma on the fp32 + time rule, with no schedule read, with a reference and with two rows. + At 0.75 the reference's rule embeds 752, the bf16 of 750, and the + step embeds 750.""" _serve(host, "f2d", f2pipe) c = _client() rng = np.random.default_rng(7) @@ -660,13 +670,16 @@ def test_a_flux2_step_is_the_core_step_with_and_without_references( for t in SIGMAS[:-1]: for sched in (None, SIGMAS): out = c.step("f2d", None, x, [t], rows, sample_sigmas=sched) - assert np.array_equal(out, _f3_velocity( + assert np.array_equal(out, _f2_velocity( f2pipe, x, t, _f2_cond(feats))), t with_ref = [{"cond": rows[0]["cond"], "ref_latents": [c.put(ref)]}] + assert not np.array_equal(c.step("f2d", None, x, [0.75], rows), + _f2_velocity(f2pipe, x, 0.75, _f2_cond(feats), + time="reference")) out = c.step("f2d", None, x, [0.75], with_ref) - assert np.array_equal(out, _f3_velocity(f2pipe, x, 0.75, + assert np.array_equal(out, _f2_velocity(f2pipe, x, 0.75, _f2_cond(feats, ref))) - assert not np.array_equal(out, _f3_velocity(f2pipe, x, 0.75, + assert not np.array_equal(out, _f2_velocity(f2pipe, x, 0.75, _f2_cond(feats))) two = c.step("f2d", None, np.concatenate([x, x]), [0.75, 0.75], rows + with_ref) @@ -686,9 +699,9 @@ def test_a_flux2_step_takes_its_references_in_the_order_of_the_row( row = {"cond": _rows(c, feats)[0]["cond"], "ref_latents": [c.put(a), c.put(b)]} out = c.step("f2d", None, x, [0.75], [row]) - want = _f3_velocity(f2pipe, x, 0.75, _f2_cond(feats, a, b, key="")) + want = _f2_velocity(f2pipe, x, 0.75, _f2_cond(feats, a, b, key="")) assert np.array_equal(out, want) - assert not np.array_equal(out, _f3_velocity( + assert not np.array_equal(out, _f2_velocity( f2pipe, x, 0.75, _f2_cond(feats, b, a, key=""))) assert host.held == 0 @@ -705,7 +718,7 @@ def test_a_flux2_table_on_comfyuis_native_keys_steps_as_the_core_table( rng = np.random.default_rng(10) feats = rng.standard_normal((1, 10, 24)).astype(np.float32) x = noise_from_seed(5, F3_SHAPE) - plain = _f3_velocity(f2pipe, x, 0.75, _f2_cond(feats)) + plain = _f2_velocity(f2pipe, x, 0.75, _f2_cond(feats)) for name, band, (dout, din) in ( ("double_blocks.0.img_attn.qkv", [0, 64, 64], (64, 64)), ("double_blocks.1.txt_attn.qkv", None, (192, 64)), @@ -720,8 +733,7 @@ def test_a_flux2_table_on_comfyuis_native_keys_steps_as_the_core_table( core = steps.STATE.tables_of("f2d", f2pipe)[tid] out = c.step("f2d", None, x, [0.75], _rows(c, feats), patch_table=tid) - want = _on_worker(lambda: np.array(api.denoise_step( - f2pipe, mx.array(x), 0.75, _f2_cond(feats), patch_table=core))) + want = _f2_velocity(f2pipe, x, 0.75, _f2_cond(feats), core) assert np.array_equal(out, want), name assert not np.array_equal(out, plain), name From d1cd3177d3341f26d4182da7f4e1af88cf4f318e Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 11:12:10 -0700 Subject: [PATCH 025/101] test(image): check 2 oracles keep the rotary frequencies of their bf16 runs in fp32 --- scripts/image_oracle/check2_flux3_klein.py | 10 +++++++++- scripts/image_oracle/check2_krea2.py | 11 ++++++++++- scripts/image_oracle/check2_z_image.py | 8 ++++++-- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/scripts/image_oracle/check2_flux3_klein.py b/scripts/image_oracle/check2_flux3_klein.py index be01c0465..2a2c1254f 100644 --- a/scripts/image_oracle/check2_flux3_klein.py +++ b/scripts/image_oracle/check2_flux3_klein.py @@ -30,7 +30,8 @@ at twice that gap, and a per-token cosine floor of 1 - 4 (1 - c), c the oracle's own smallest per-token cosine of the prompt. A prompt of --ids-only keeps its ids and mask alone, without a forward: the prompt -past the 4096-token cap. +past the 4096-token cap. The bf16 run casts the model to bf16 and keeps +its rotary frequencies in fp32, as a model loaded in bf16 keeps them. python scripts/image_oracle/run.py --python --threads 16 \\ check2_flux3_klein.py --reference /src \\ @@ -271,7 +272,12 @@ def main(argv=None) -> int: runs = {} for mode in ("fp32", "bf16"): if mode == "bf16": + # A model loaded in bf16 keeps its rotary frequencies in fp32, + # which the cast rounds. + rot = te.model.language_model.rotary_emb + inv = rot.inv_freq.clone() te = te.to(torch.bfloat16) + rot.inv_freq = inv enc = encoder(text_encoder, te, proc) oracle.emulate_bf16_matmul(True) runs[mode] = {k: features(torch, text_encoder, enc, v) @@ -303,6 +309,8 @@ def main(argv=None) -> int: fx.results["pad_rows_rel_l2_to_the_first"] = pads fx.results["seconds"] = secs fx.tolerances.update(rel_l2=rel, token_cosine_min=cos, rule=RULE) + fx.note("The bf16 model is the float32 one cast to bfloat16, with its " + "rotary frequencies left in float32.") print(f"[check2] wrote {fx.write()}", flush=True) return 0 diff --git a/scripts/image_oracle/check2_krea2.py b/scripts/image_oracle/check2_krea2.py index 5cb1dbca6..0ad743a1e 100644 --- a/scripts/image_oracle/check2_krea2.py +++ b/scripts/image_oracle/check2_krea2.py @@ -22,7 +22,9 @@ fp32 and bf16 features. The manifest records the bf16 against fp32 gap of each prompt and sets the tolerances: relative L2 at twice that gap, and a per-token cosine floor of 1 - 4 (1 - c), c the oracle's own smallest -per-token cosine of the prompt. +per-token cosine of the prompt. The bf16 run casts the model to bf16 and +keeps its rotary frequencies in fp32, as a model loaded in bf16 keeps +them. python scripts/image_oracle/run.py --python --threads 16 \\ check2_krea2.py --encoder Qwen3-VL-4B-Instruct-Q8_0.gguf \\ @@ -179,7 +181,12 @@ def main(argv=None) -> int: runs = {} for mode in ("fp32", "bf16"): if mode == "bf16": + # A model loaded in bf16 keeps its rotary frequencies in fp32, + # which the cast rounds. + rot = te.model.language_model.rotary_emb + inv = rot.inv_freq.clone() te = te.to(torch.bfloat16) + rot.inv_freq = inv oracle.emulate_bf16_matmul(True) runs[mode] = {k: features(torch, te, tok, v) for k, v in prompts.items()} @@ -205,6 +212,8 @@ def main(argv=None) -> int: fx.inputs["rows"] = rows fx.results["seconds"] = secs fx.tolerances.update(rel_l2=rel, token_cosine_min=cos, rule=RULE) + fx.note("The bf16 model is the float32 one cast to bfloat16, with its " + "rotary frequencies left in float32.") print(f"[check2] wrote {fx.write()}", flush=True) return 0 diff --git a/scripts/image_oracle/check2_z_image.py b/scripts/image_oracle/check2_z_image.py index 02e72b33c..5f678fc6b 100644 --- a/scripts/image_oracle/check2_z_image.py +++ b/scripts/image_oracle/check2_z_image.py @@ -18,7 +18,8 @@ The bf16 run computes each linear product as a float32 GEMM over the bfloat16 operands, rounded once to bfloat16, since torch's CPU bfloat16 GEMM is single threaded. That differs from a native bfloat16 GEMM with -float32 accumulation only in summation order. +float32 accumulation only in summation order. The bf16 copy keeps its +rotary frequencies in fp32, as a model loaded in bf16 keeps them. python scripts/image_oracle/run.py --python --threads 16 \\ check2_z_image.py --encoder Qwen3-4B-Q4_K_M.gguf \\ @@ -138,6 +139,9 @@ def load_encoder(torch, a): torch_dtype=torch.float32, device_map="cpu", local_files_only=True).eval() te16 = copy.deepcopy(te).to(torch.bfloat16).eval() + # A model loaded in bf16 keeps its rotary frequencies in fp32, which + # the cast rounds. + te16.rotary_emb.inv_freq = te.rotary_emb.inv_freq.clone() for m, want in ((te, torch.float32), (te16, torch.bfloat16)): where = {str(p.device) for p in m.parameters()} kinds = {p.dtype for p in m.parameters()} @@ -305,7 +309,7 @@ def main(argv=None) -> int: config_revision=a.config_revision, encoder="transformers Qwen3Model from GGUF through its legacy loader," " gguf-py float32 dequantization; the bf16 model is a bfloat16 copy " - "of the float32 one") + "of the float32 one, with its rotary frequencies left in float32") fx.results.update( oracle={"device": "cpu", "threads": torch.get_num_threads(), "bf16_matmul": "bf16 operands, float32 GEMM, one bf16 " From 7730225467d966535020b9d49a9bfc03c708a645 Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 11:21:17 -0700 Subject: [PATCH 026/101] test(image): check 2 manifests of z-image, krea 2 and flux3 klein recalibrated on fp32 rotary frequencies --- .../oracle/check2_flux3_klein.manifest.json | 68 ++++++++++--------- .../image/oracle/check2_krea2.manifest.json | 56 +++++++-------- .../image/oracle/check2_z_image.manifest.json | 62 ++++++++--------- 3 files changed, 95 insertions(+), 91 deletions(-) diff --git a/tests/fixtures/image/oracle/check2_flux3_klein.manifest.json b/tests/fixtures/image/oracle/check2_flux3_klein.manifest.json index 8e2370824..c1da8efa9 100644 --- a/tests/fixtures/image/oracle/check2_flux3_klein.manifest.json +++ b/tests/fixtures/image/oracle/check2_flux3_klein.manifest.json @@ -130,29 +130,29 @@ }, "results": { "bf16_vs_fp32_plain": { - "rel_l2": 0.007822406730904214, - "token_cosine_min": 0.999748968477626, - "worst_token": 27 + "rel_l2": 0.00786274229546384, + "token_cosine_min": 0.9997946677914857, + "worst_token": 20 }, "bf16_vs_fp32_empty": { - "rel_l2": 0.007953722124583123, - "token_cosine_min": 0.9998159694562012, + "rel_l2": 0.007945563645181536, + "token_cosine_min": 0.9997163054454107, "worst_token": 4 }, "bf16_vs_fp32_non_ascii": { - "rel_l2": 0.007817399699833538, - "token_cosine_min": 0.999885160397759, - "worst_token": 42 + "rel_l2": 0.0078097172356746715, + "token_cosine_min": 0.999865123045158, + "worst_token": 40 }, "bf16_vs_fp32_long": { - "rel_l2": 0.008882231532171245, - "token_cosine_min": 0.9950630473877229, - "worst_token": 625 + "rel_l2": 0.007960977419229163, + "token_cosine_min": 0.9979840969987929, + "worst_token": 390 }, "bf16_vs_fp32_eighty": { - "rel_l2": 0.007791383823938165, - "token_cosine_min": 0.9998381816927617, - "worst_token": 76 + "rel_l2": 0.007789555375257415, + "token_cosine_min": 0.9998847400959485, + "worst_token": 78 }, "pad_rows_rel_l2_to_the_first": { "plain": 0.0, @@ -175,8 +175,8 @@ "bf16": 0.9 }, "long": { - "fp32": 3.1, - "bf16": 7.7 + "fp32": 3.2, + "bf16": 8.4 }, "eighty": { "fp32": 0.7, @@ -186,23 +186,25 @@ }, "tolerances": { "rel_l2": { - "plain": 0.01564481346180843, - "empty": 0.015907444249166246, - "non_ascii": 0.015634799399667075, - "long": 0.01776446306434249, - "eighty": 0.01558276764787633 + "plain": 0.01572548459092768, + "empty": 0.015891127290363072, + "non_ascii": 0.015619434471349343, + "long": 0.015921954838458326, + "eighty": 0.01557911075051483 }, "token_cosine_min": { - "plain": 0.9989958739105038, - "empty": 0.9992638778248049, - "non_ascii": 0.999540641591036, - "long": 0.9802521895508916, - "eighty": 0.9993527267710469 + "plain": 0.9991786711659429, + "empty": 0.9988652217816427, + "non_ascii": 0.9994604921806318, + "long": 0.9919363879951715, + "eighty": 0.9995389603837941 }, "rule": "relative L2 = 2 x the oracle's own bf16 against fp32 relative L2 of the same prompt; per-token cosine at least 1 - 4 (1 - c), c the oracle's own smallest per-token cosine of the same prompt" }, - "notes": [], - "created": "2026-10-15T21:24:21Z", + "notes": [ + "The bf16 model is the float32 one cast to bfloat16, with its rotary frequencies left in float32." + ], + "created": "2026-10-16T18:13:50Z", "npz": "check2_flux3_klein.npz", "tensors": { "features_eighty": { @@ -219,7 +221,7 @@ 20480 ], "dtype": "float32", - "sha256": "2c15bedb799007cdb11348956f8256717646eb61372735abc6cd71ebfc1199ab" + "sha256": "034742d5a42a20b04a74890b549b70fa2bdf7edab4afb28208831f3770578837" }, "features_empty": { "shape": [ @@ -235,7 +237,7 @@ 20480 ], "dtype": "float32", - "sha256": "4d173cbcff5fcca397dc181eb3a0731c20e7ec54243629560c3c080e9cbd8949" + "sha256": "16f3971afc7d694e5452ae5c79e0eed51f4ab5931cd343fcf309e8ebf0e19355" }, "features_long": { "shape": [ @@ -251,7 +253,7 @@ 20480 ], "dtype": "float32", - "sha256": "1d45080c4a7c1617b7d94182a2f012720c60818bbf6238bc1ee1f41468d8a504" + "sha256": "4647501ea7558355c01b849c19222679725e27a0eaa1d692dfd5ccd656c72bb0" }, "features_non_ascii": { "shape": [ @@ -267,7 +269,7 @@ 20480 ], "dtype": "float32", - "sha256": "241b8b1e81492784430986e0b23a6c6b697f20d9a0f4559a2e39594e8dc0b3e4" + "sha256": "51397d1f09eed7952d6ad7b11cc33d00ca00342a7349ce038c7402da7a2cb7a8" }, "features_plain": { "shape": [ @@ -283,7 +285,7 @@ 20480 ], "dtype": "float32", - "sha256": "6967afa1e794124bee844b0198d9938f8a4c6c943890affdd8b5407b7d2d4a76" + "sha256": "b20b15f478f519cc2f9a18e794a8b97a22a0759273b02dcc4db93a02d815b586" }, "ids_cap": { "shape": [ diff --git a/tests/fixtures/image/oracle/check2_krea2.manifest.json b/tests/fixtures/image/oracle/check2_krea2.manifest.json index 5fe58ed74..34dd2afb0 100644 --- a/tests/fixtures/image/oracle/check2_krea2.manifest.json +++ b/tests/fixtures/image/oracle/check2_krea2.manifest.json @@ -93,61 +93,63 @@ }, "results": { "bf16_vs_fp32_plain": { - "rel_l2": 0.010774379973786606, - "token_cosine_min": 0.999734016379737, + "rel_l2": 0.010757301009925498, + "token_cosine_min": 0.9996794634301444, "worst_token": 29 }, "bf16_vs_fp32_empty": { - "rel_l2": 0.018908368113602237, - "token_cosine_min": 0.999726437880724, - "worst_token": 3 + "rel_l2": 0.022579539577013065, + "token_cosine_min": 0.9991686807814586, + "worst_token": 2 }, "bf16_vs_fp32_non_ascii": { - "rel_l2": 0.011917093336829583, - "token_cosine_min": 0.9997476082496803, + "rel_l2": 0.011323564105340796, + "token_cosine_min": 0.9997927884976834, "worst_token": 40 }, "bf16_vs_fp32_long": { - "rel_l2": 0.010095176733751574, - "token_cosine_min": 0.99840026942934, + "rel_l2": 0.010045001030807098, + "token_cosine_min": 0.9969202927206706, "worst_token": 387 }, "seconds": { "plain": { "fp32": 2.8, - "bf16": 4.9 + "bf16": 5.1 }, "empty": { "fp32": 2.8, - "bf16": 4.9 + "bf16": 5.1 }, "non_ascii": { "fp32": 2.8, - "bf16": 5.1 + "bf16": 5.2 }, "long": { "fp32": 2.8, - "bf16": 5.0 + "bf16": 5.1 } } }, "tolerances": { "rel_l2": { - "plain": 0.02154875994757321, - "empty": 0.037816736227204474, - "non_ascii": 0.023834186673659167, - "long": 0.02019035346750315 + "plain": 0.021514602019850997, + "empty": 0.04515907915402613, + "non_ascii": 0.022647128210681593, + "long": 0.020090002061614196 }, "token_cosine_min": { - "plain": 0.9989360655189481, - "empty": 0.9989057515228961, - "non_ascii": 0.9989904329987214, - "long": 0.9936010777173601 + "plain": 0.9987178537205774, + "empty": 0.9966747231258344, + "non_ascii": 0.9991711539907335, + "long": 0.9876811708826825 }, "rule": "relative L2 = 2 x the oracle's own bf16 against fp32 relative L2 of the same prompt; per-token cosine at least 1 - 4 (1 - c), c the oracle's own smallest per-token cosine of the same prompt" }, - "notes": [], - "created": "2026-10-10T06:44:37Z", + "notes": [ + "The bf16 model is the float32 one cast to bfloat16, with its rotary frequencies left in float32." + ], + "created": "2026-10-16T18:15:03Z", "npz": "check2_krea2.npz", "tensors": { "features_empty": { @@ -164,7 +166,7 @@ 30720 ], "dtype": "float32", - "sha256": "c22faead016fb62041f2ad75b04233817d8d79359c249e713ba3a0284b14498f" + "sha256": "042c8f141637eef2a0d989279757079f2ac9317ffab87899ab4817fb0103e067" }, "features_long": { "shape": [ @@ -180,7 +182,7 @@ 30720 ], "dtype": "float32", - "sha256": "12c17769be1fe420f8ca8de3f45d6a7bf2d222aeb12f63c9d1f7f0446597915c" + "sha256": "c89124c31cb45921a3bba2b29daee14446f17a62079f047c3916f3ff53c1e21d" }, "features_non_ascii": { "shape": [ @@ -196,7 +198,7 @@ 30720 ], "dtype": "float32", - "sha256": "675f65546cc96789740e2e22399639d9db7e3b67aa01a2bf76bb792e47f8b320" + "sha256": "f0ab9d723a195363d599dbacfc109fc29fab205cd14e5efc7a365f589ba222ae" }, "features_plain": { "shape": [ @@ -212,7 +214,7 @@ 30720 ], "dtype": "float32", - "sha256": "de95c7b6368ba2a8bf8cc3b538a0bb804b9b339549edbf7c09749ed439264d32" + "sha256": "e4560c619473f6146d28f17285d94dbb840f5c5d64ffdee84f18cab55b03b0cd" }, "ids_empty": { "shape": [ diff --git a/tests/fixtures/image/oracle/check2_z_image.manifest.json b/tests/fixtures/image/oracle/check2_z_image.manifest.json index d1bdf4d47..bc84682d2 100644 --- a/tests/fixtures/image/oracle/check2_z_image.manifest.json +++ b/tests/fixtures/image/oracle/check2_z_image.manifest.json @@ -83,7 +83,7 @@ "template": "tokenizer.apply_chat_template, add_generation_prompt=True, enable_thinking=True", "padding": "max_length 512, right, masked", "config_revision": "f332072aa78be7aecdf3ee76d5c247082da564a6", - "encoder": "transformers Qwen3Model from GGUF through its legacy loader, gguf-py float32 dequantization; the bf16 model is a bfloat16 copy of the float32 one" + "encoder": "transformers Qwen3Model from GGUF through its legacy loader, gguf-py float32 dequantization; the bf16 model is a bfloat16 copy of the float32 one, with its rotary frequencies left in float32" }, "results": { "oracle": { @@ -135,28 +135,28 @@ }, "bf16_vs_fp32": { "plain": { - "rel_l2": 0.010895698965534991, - "cosine": 0.9999860148882215, + "rel_l2": 0.010904591653558074, + "cosine": 0.9999869740577002, "max_abs": 152.9033203125, - "token_cosine_min": 0.9996531978097521 + "token_cosine_min": 0.9996042693980746 }, "empty": { - "rel_l2": 0.010907148225127004, - "cosine": 0.9999903319274931, + "rel_l2": 0.010935165636526273, + "cosine": 0.9999900417465841, "max_abs": 152.9033203125, - "token_cosine_min": 0.9997101500097612 + "token_cosine_min": 0.9996042693980746 }, "non_ascii": { - "rel_l2": 0.01097607485385548, - "cosine": 0.9999844282695636, + "rel_l2": 0.010938011696113012, + "cosine": 0.9999847101288731, "max_abs": 152.9033203125, - "token_cosine_min": 0.9997101500097612 + "token_cosine_min": 0.9996042693980746 }, "long": { - "rel_l2": 0.010273015374210085, - "cosine": 0.99996126762898, + "rel_l2": 0.010108721313616514, + "cosine": 0.9999638808623529, "max_abs": 152.9033203125, - "token_cosine_min": 0.9990977976370308 + "token_cosine_min": 0.9996042693980746 } }, "unpadded_vs_padded": { @@ -186,22 +186,22 @@ } }, "seconds": { - "load_s": 17.8, + "load_s": 15.2, "plain": { - "fp32_s": 5.4, - "bf16_s": 9.3 + "fp32_s": 2.5, + "bf16_s": 4.8 }, "empty": { - "fp32_s": 6.2, - "bf16_s": 10.3 + "fp32_s": 2.5, + "bf16_s": 4.8 }, "non_ascii": { - "fp32_s": 6.7, - "bf16_s": 11.2 + "fp32_s": 2.5, + "bf16_s": 4.9 }, "long": { - "fp32_s": 6.8, - "bf16_s": 12.9 + "fp32_s": 2.5, + "bf16_s": 5.0 } } }, @@ -212,17 +212,17 @@ "token_cosine_min": 0.999 }, "rel_l2": { - "plain": 0.021791397931069982, - "empty": 0.021814296450254008, - "non_ascii": 0.02195214970771096, - "long": 0.02054603074842017 + "plain": 0.021809183307116148, + "empty": 0.021870331273052546, + "non_ascii": 0.021876023392226024, + "long": 0.020217442627233028 }, "token_cosine_min": 0.999 }, "notes": [ "The unpadded rows run at batch 1 with no mask, as gmlx encodes a prompt. Their gap to the padded reference is rounding only, since a causal layer never reads a later pad." ], - "created": "2026-10-01T00:48:58Z", + "created": "2026-10-16T18:17:56Z", "npz": "check2_z_image.npz", "tensors": { "ids_empty": { @@ -259,7 +259,7 @@ 2560 ], "dtype": "float32", - "sha256": "9e2508a7a8ddab9ae25b9e98e132d3b83b34c989d29dcd31f0331527a1b4f422" + "sha256": "2361ecce93dfb27f2d6740b3a865778e853ab94d4228d16f2f2bbc3b87914619" }, "tap_bf16_long": { "shape": [ @@ -267,7 +267,7 @@ 2560 ], "dtype": "float32", - "sha256": "a1aeb955a4a125ffa13121108c23b745e0bec0b89eaed96f18aa0d898086792f" + "sha256": "2304a03e9c258dffb7ea7e71379419275dbb5c40048bc43458a7bfda16f84382" }, "tap_bf16_non_ascii": { "shape": [ @@ -275,7 +275,7 @@ 2560 ], "dtype": "float32", - "sha256": "6a75b1b3981c0901cd5d9a42508b6d83d5921ed825a59a8882ef27735f04d971" + "sha256": "c2482f743579a3666805c0aeef4fda1c5d58cf3679acd24d40435393b3de6799" }, "tap_bf16_plain": { "shape": [ @@ -283,7 +283,7 @@ 2560 ], "dtype": "float32", - "sha256": "612b762a521164ac933643046f0ef77ddd50a52bdb05041bc88cb2c7f781dec3" + "sha256": "e916de9a6d4f29979ec365790be755d838b8f09b12b9ee34415e9e79052417f0" }, "tap_empty": { "shape": [ From f2e2572eb378afd51f383eb991438b6e49f46619 Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 11:45:36 -0700 Subject: [PATCH 027/101] test(image): flux3 klein check 6 manifests name the recalibrated check 2 features file --- .../image/oracle/check6_flux3_klein_1024.manifest.json | 5 +++-- .../image/oracle/check6_flux3_klein_512.manifest.json | 6 ++++-- .../image/oracle/check6_flux3_klein_base_1024.manifest.json | 5 +++-- .../image/oracle/check6_flux3_klein_base_512.manifest.json | 6 ++++-- .../image/oracle/check6_flux3_klein_edit.manifest.json | 6 ++++-- 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/tests/fixtures/image/oracle/check6_flux3_klein_1024.manifest.json b/tests/fixtures/image/oracle/check6_flux3_klein_1024.manifest.json index 20b87b20e..ca70aa773 100644 --- a/tests/fixtures/image/oracle/check6_flux3_klein_1024.manifest.json +++ b/tests/fixtures/image/oracle/check6_flux3_klein_1024.manifest.json @@ -62,7 +62,7 @@ "features": { "name": "check2_flux3_klein.npz", "size": 157437070, - "sha256": "fc087b917e2c1614738e24f9b0ba467bae4882efeeb02798264ac1e94c601bea" + "sha256": "cf38d06f13f1907955be37d7691919b750b8e5b7984a02b32aa1828f2264f25a" } }, "inputs": { @@ -152,7 +152,8 @@ "rule": "latents after a kept step and after the last. At 512: gmlx's bf16 run at relative L2 twice the oracle's own bf16 against fp32 relative L2 after that step. At any other size: gmlx's exact fp32 run against the fp32 latents at exact_rel_l2, and its bf16 run read as a share of the 512 gate of the step, not gated" }, "notes": [ - "results.gmlx_bf16: gmlx's bf16 latents at 1024, kernel routes at their default, against the fp32 latents after each kept step and the last, and as a share of the 512 gate of that step, as tests/image/test_image_check6_flux3_klein.py prints them. A reading, not a gate." + "results.gmlx_bf16: gmlx's bf16 latents at 1024, kernel routes at their default, against the fp32 latents after each kept step and the last, and as a share of the 512 gate of that step, as tests/image/test_image_check6_flux3_klein.py prints them. A reading, not a gate.", + "files.features is check2_flux3_klein.npz as recalibrated with fp32 rotary frequencies in its bf16 run; the fp32 features this run read are bit equal to those of the file it ran on." ], "created": "2026-10-16T00:11:33Z", "npz": "check6_flux3_klein_1024.npz", diff --git a/tests/fixtures/image/oracle/check6_flux3_klein_512.manifest.json b/tests/fixtures/image/oracle/check6_flux3_klein_512.manifest.json index 842c45f3d..d8f5e50ee 100644 --- a/tests/fixtures/image/oracle/check6_flux3_klein_512.manifest.json +++ b/tests/fixtures/image/oracle/check6_flux3_klein_512.manifest.json @@ -62,7 +62,7 @@ "features": { "name": "check2_flux3_klein.npz", "size": 157437070, - "sha256": "fc087b917e2c1614738e24f9b0ba467bae4882efeeb02798264ac1e94c601bea" + "sha256": "cf38d06f13f1907955be37d7691919b750b8e5b7984a02b32aa1828f2264f25a" } }, "inputs": { @@ -153,7 +153,9 @@ ], "rule": "latents after a kept step and after the last. At 512: gmlx's bf16 run at relative L2 twice the oracle's own bf16 against fp32 relative L2 after that step. At any other size: gmlx's exact fp32 run against the fp32 latents at exact_rel_l2, and its bf16 run read as a share of the 512 gate of the step, not gated" }, - "notes": [], + "notes": [ + "files.features is check2_flux3_klein.npz as recalibrated with fp32 rotary frequencies in its bf16 run; the fp32 features this run read are bit equal to those of the file it ran on." + ], "created": "2026-10-15T23:55:57Z", "npz": "check6_flux3_klein_512.npz", "tensors": { diff --git a/tests/fixtures/image/oracle/check6_flux3_klein_base_1024.manifest.json b/tests/fixtures/image/oracle/check6_flux3_klein_base_1024.manifest.json index 009ed87e8..e2956c768 100644 --- a/tests/fixtures/image/oracle/check6_flux3_klein_base_1024.manifest.json +++ b/tests/fixtures/image/oracle/check6_flux3_klein_base_1024.manifest.json @@ -61,7 +61,7 @@ "features": { "name": "check2_flux3_klein.npz", "size": 157437070, - "sha256": "fc087b917e2c1614738e24f9b0ba467bae4882efeeb02798264ac1e94c601bea" + "sha256": "cf38d06f13f1907955be37d7691919b750b8e5b7984a02b32aa1828f2264f25a" } }, "inputs": { @@ -131,7 +131,8 @@ "rule": "latents after a kept step and after the last. At 512: gmlx's bf16 run at relative L2 twice the oracle's own bf16 against fp32 relative L2 after that step. At any other size: gmlx's exact fp32 run against the fp32 latents at exact_rel_l2, and its bf16 run read as a share of the 512 gate of the step, not gated" }, "notes": [ - "results.gmlx_bf16: gmlx's bf16 latents at 1024, kernel routes at their default, against the fp32 latents after each kept step and the last, and as a share of the 512 gate of that step, as tests/image/test_image_check6_flux3_klein.py prints them. A reading, not a gate." + "results.gmlx_bf16: gmlx's bf16 latents at 1024, kernel routes at their default, against the fp32 latents after each kept step and the last, and as a share of the 512 gate of that step, as tests/image/test_image_check6_flux3_klein.py prints them. A reading, not a gate.", + "files.features is check2_flux3_klein.npz as recalibrated with fp32 rotary frequencies in its bf16 run; the fp32 features this run read are bit equal to those of the file it ran on." ], "created": "2026-10-16T01:43:13Z", "npz": "check6_flux3_klein_base_1024.npz", diff --git a/tests/fixtures/image/oracle/check6_flux3_klein_base_512.manifest.json b/tests/fixtures/image/oracle/check6_flux3_klein_base_512.manifest.json index 1bddce802..021587ae5 100644 --- a/tests/fixtures/image/oracle/check6_flux3_klein_base_512.manifest.json +++ b/tests/fixtures/image/oracle/check6_flux3_klein_base_512.manifest.json @@ -62,7 +62,7 @@ "features": { "name": "check2_flux3_klein.npz", "size": 157437070, - "sha256": "fc087b917e2c1614738e24f9b0ba467bae4882efeeb02798264ac1e94c601bea" + "sha256": "cf38d06f13f1907955be37d7691919b750b8e5b7984a02b32aa1828f2264f25a" } }, "inputs": { @@ -223,7 +223,9 @@ ], "rule": "latents after a kept step and after the last. At 512: gmlx's bf16 run at relative L2 twice the oracle's own bf16 against fp32 relative L2 after that step. At any other size: gmlx's exact fp32 run against the fp32 latents at exact_rel_l2, and its bf16 run read as a share of the 512 gate of the step, not gated" }, - "notes": [], + "notes": [ + "files.features is check2_flux3_klein.npz as recalibrated with fp32 rotary frequencies in its bf16 run; the fp32 features this run read are bit equal to those of the file it ran on." + ], "created": "2026-10-16T00:34:04Z", "npz": "check6_flux3_klein_base_512.npz", "tensors": { diff --git a/tests/fixtures/image/oracle/check6_flux3_klein_edit.manifest.json b/tests/fixtures/image/oracle/check6_flux3_klein_edit.manifest.json index da0c11cc6..aa90b6516 100644 --- a/tests/fixtures/image/oracle/check6_flux3_klein_edit.manifest.json +++ b/tests/fixtures/image/oracle/check6_flux3_klein_edit.manifest.json @@ -68,7 +68,7 @@ "features": { "name": "check2_flux3_klein.npz", "size": 157437070, - "sha256": "fc087b917e2c1614738e24f9b0ba467bae4882efeeb02798264ac1e94c601bea" + "sha256": "cf38d06f13f1907955be37d7691919b750b8e5b7984a02b32aa1828f2264f25a" } }, "inputs": { @@ -371,7 +371,9 @@ ], "rule": "latents after a kept step and after the last: relative L2 at twice the oracle's own bf16 against fp32 relative L2 after that step, on the run's own size" }, - "notes": [], + "notes": [ + "files.features is check2_flux3_klein.npz as recalibrated with fp32 rotary frequencies in its bf16 run; the fp32 features this run read are bit equal to those of the file it ran on." + ], "created": "2026-10-16T04:07:57Z", "npz": "check6_flux3_klein_edit.npz", "tensors": { From 4045eff51ff8dbdd2466166158348886d4a50df0 Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 12:48:52 -0700 Subject: [PATCH 028/101] feat(image): flux2 klein pull recipes and memory classes on bfl's bf16 vae, which serves both klein families --- gmlx/comfyui_pack/README.md | 11 +- gmlx/comfyui_pack/discovery.py | 4 + .../flux-2-klein-edit-two-references.json | 1287 +++++++++++++++++ .../example_workflows/flux-2-klein-t2i.json | 640 ++++++++ gmlx/commands/doctor.py | 2 +- gmlx/commands/image.py | 26 +- gmlx/commands/image_pull.py | 4 +- gmlx/commands/manage.py | 6 +- gmlx/image/catalog.py | 71 +- gmlx/image/vae/packer.py | 2 +- gmlx/image/vae/reader.py | 23 +- gmlx/load/discovery.py | 4 +- .../image_oracle/check5_flux3_klein_vae.py | 11 +- tests/comfyui_pack/headless.py | 95 ++ .../flux-2-klein-edit-two-references.json | 346 +++++ .../workflows/flux-2-klein-t2i.json | 178 +++ tests/commands/test_image_pull.py | 153 +- tests/e2e/run_image_api_e2e.py | 47 +- .../image/flux2_klein_4b_q8_0.header.json | 156 ++ .../image/flux2_klein_vae_config.json | 40 + tests/fixtures/image/manifest.json | 15 + .../check5_flux2_klein_vae.manifest.json | 362 +++++ tests/image/test_image_catalog.py | 139 +- tests/image/test_image_check5_flux2_klein.py | 467 ++++++ tests/image/test_image_flux2_family.py | 31 +- tests/serve/test_patches_routes.py | 7 +- tests/test_comfyui_pack.py | 15 +- 27 files changed, 4031 insertions(+), 111 deletions(-) create mode 100644 gmlx/comfyui_pack/example_workflows/flux-2-klein-edit-two-references.json create mode 100644 gmlx/comfyui_pack/example_workflows/flux-2-klein-t2i.json create mode 100644 tests/comfyui_pack/workflows/flux-2-klein-edit-two-references.json create mode 100644 tests/comfyui_pack/workflows/flux-2-klein-t2i.json create mode 100644 tests/fixtures/image/flux2_klein_4b_q8_0.header.json create mode 100644 tests/fixtures/image/flux2_klein_vae_config.json create mode 100644 tests/fixtures/image/oracle/check5_flux2_klein_vae.manifest.json create mode 100644 tests/image/test_image_check5_flux2_klein.py diff --git a/gmlx/comfyui_pack/README.md b/gmlx/comfyui_pack/README.md index 8aa594738..d8a4d5524 100644 --- a/gmlx/comfyui_pack/README.md +++ b/gmlx/comfyui_pack/README.md @@ -10,6 +10,7 @@ Supported model families: - Z-Image (Z-Image-Turbo), text to image. - Qwen-Image 2.1 and Qwen-Image 2.1 Turbo, text to image and editing with up to 10 reference images. - Krea 2 Turbo, text to image. +- FLUX.2 klein 4B and FLUX.2 klein Base 4B, text to image and editing with up to 10 reference images. ## Install @@ -37,11 +38,13 @@ At startup it checks the ComfyUI internals it uses. When one is missing, the nod 2. Add `gmlx Model Loader`, `gmlx CLIP Loader` and `gmlx VAE Loader`, and pick the model in `model_name` on each. The list holds the image models of the gmlx server, the default first, or only the default model's name when it has none. A model the server does not have stops the run with the `gmlx pull` command that adds it. 3. Connect them to stock nodes as you would any checkpoint: `CLIPTextEncode`, `KSampler`, `VAEDecode`, `LoraLoader`, `ModelSamplingAuraFlow` and so on. -The `example_workflows` folder has five graphs, which ComfyUI's template browser lists under the pack: +The `example_workflows` folder has seven graphs, which ComfyUI's template browser lists under the pack: - `z-image-turbo-t2i.json`: Z-Image-Turbo text to image. - `z-image-turbo-lora-t2i.json`: Z-Image-Turbo text to image through a stock `LoraLoader`. Put a Z-Image LoRA named `z-image-turbo-style.safetensors` in `models/loras`, or pick another one in the node. - `qwen-image-2.1-edit-two-references.json`: Qwen-Image 2.1 editing with two reference images through the stock `TextEncodeQwenImage21` node. Put `reference-1.png` and `reference-2.png` in ComfyUI's `input` folder, or pick other images. +- `flux-2-klein-t2i.json`: FLUX.2 klein text to image through the stock `Flux2Scheduler`, `CFGGuider` and `SamplerCustomAdvanced`. `Flux2Scheduler` gives the schedule FLUX.2 klein samples on, which follows the image size, so keep its width and height those of the latent. +- `flux-2-klein-edit-two-references.json`: FLUX.2 klein editing with two reference images, each encoded by `VAEEncode` and put on the prompt and its zeroed negative by the stock `ReferenceLatent`. The first reference sets the image size. Put `reference-1.png` and `reference-2.png` in ComfyUI's `input` folder, or pick other images. - `flux-3-klein-t2i.json`: FLUX.3 klein text to image through the stock `EmptyFlux2LatentImage`. It needs ComfyUI 0.41 or newer. - `flux-3-klein-edit-two-references.json`: FLUX.3 klein editing with two reference images through the stock `ReferenceMultiLatent` node. Put `reference-1.png` and `reference-2.png` in ComfyUI's `input` folder, or pick other images. It needs ComfyUI 0.41 or newer. @@ -110,7 +113,7 @@ That runs the wire, client and in-process ComfyUI suites on the cpu device, then ### Parity with the stock loaders -Three checks hold a gmlx MODEL against ComfyUI's own model on the same graph, noise, sigmas and conditioning: ComfyUI-GGUF for Z-Image Turbo and for Krea 2 Turbo, and ComfyUI's Qwen-Image 2.1 model on a GGUF with its arch key set. They need the model files and both loaders, so they are not part of `run_tests.py`. +Four checks hold a gmlx MODEL against ComfyUI's own model on the same graph, noise, sigmas and conditioning: ComfyUI-GGUF for Z-Image Turbo, Krea 2 Turbo and FLUX.2 klein, and ComfyUI's Qwen-Image 2.1 model on a GGUF with its arch key set. They need the model files and both loaders, so they are not part of `run_tests.py`. The step check is the gate. The stock model in bf16 samples and records, at each step, the latent it is fed and the denoised output it returns. The gmlx MODEL and the stock model in fp32 are then fed the same latents and sigmas. At every step the relative L2 of the gmlx output from the stock bf16 output must be at most 1.5 times that of the stock fp32 output, or at most 2e-2 where that is larger. A fixed 2e-2 cannot hold on its own: the stock fp32 output is 0.11 from the stock bf16 output at the first step of Z-Image Turbo. @@ -119,8 +122,9 @@ The step check is the gate. The stock model in bf16 samples and records, at each | Z-Image Turbo | 1024x1024, 8 steps, stock LoRA loader | 0.115 | 0.111 | 1.14 | pass | | Qwen-Image 2.1 | 512x512, 30 steps, cfg 4, two references | 0.106 | 0.113 | 1.27 | pass | | Krea 2 Turbo | 1024x1024, 8 steps, cfg 1 | 0.055 | 0.095 | 0.72 | pass | +| FLUX.2 klein 4B | 512x512, 4 steps, cfg 1, `Flux2Scheduler` | 0.037 | 0.041 | 1.20 | pass | -On Z-Image Turbo the gmlx output is closer to the stock fp32 output than the stock bf16 output is, at every step. The Qwen-Image 2.1 and Krea 2 checks run ComfyUI with `--use-pytorch-cross-attention`. Without it, ComfyUI's attention on the Mac adds the text mask as a bias, so the stock model departs from the reference implementation at high sigma, and the ratio at the first step is about 3. +On Z-Image Turbo the gmlx output is closer to the stock fp32 output than the stock bf16 output is, at every step. The Qwen-Image 2.1, Krea 2 and FLUX.2 klein checks run ComfyUI with `--use-pytorch-cross-attention`. Without it, ComfyUI's attention on the Mac adds the text mask as a bias, so the stock model departs from the reference implementation at high sigma, and the ratio at the first step is about 3. The final image check is reported beside it: the gmlx image must be at least as close to the stock fp32 image as the stock bf16 image is, within 6 dB. @@ -129,6 +133,7 @@ The final image check is reported beside it: the gmlx image must be at least as | Z-Image Turbo, 1024x1024, 8 steps | 25.25 dB | 20.30 dB | pass | | Qwen-Image 2.1, 256x256, 30 steps, cfg 4, two references | 19.99 dB | 16.68 dB | pass | | Krea 2 Turbo, 1024x1024, 8 steps | 21.61 dB | 22.10 dB | pass | +| FLUX.2 klein 4B, 512x512, 4 steps | 25.49 dB | 27.58 dB | pass | A fault planted in the Z-Image step convention shows why the step check is the gate. With the velocity sign dropped, the worst step ratio is 188 and the final image reads 8.35 dB. With the timestep read 3% low, the worst step ratio is 7.1, while the final image reads 13.49 dB against a bound of 14.30 dB and fails by only 0.8 dB, so a smaller timestep fault would pass the final image check. diff --git a/gmlx/comfyui_pack/discovery.py b/gmlx/comfyui_pack/discovery.py index c6697c470..75f9bf31d 100644 --- a/gmlx/comfyui_pack/discovery.py +++ b/gmlx/comfyui_pack/discovery.py @@ -44,6 +44,8 @@ "qwen-image": ("qwen-image-2.1",), "qwen-image-turbo": ("qwen-image-2.1-turbo",), "krea-2-turbo": (), + "flux-2-klein": (), + "flux-2-klein-base": (), "flux-3-klein": (), "flux-3-klein-base": (), } @@ -52,6 +54,8 @@ "qwen-image": ("qwen_image21", "base"), "qwen-image-turbo": ("qwen_image21", "turbo"), "krea-2-turbo": ("krea2", "turbo"), + "flux-2-klein": ("flux2_klein", "distilled"), + "flux-2-klein-base": ("flux2_klein", "base"), "flux-3-klein": ("flux3_klein", "distilled"), "flux-3-klein-base": ("flux3_klein", "base"), } diff --git a/gmlx/comfyui_pack/example_workflows/flux-2-klein-edit-two-references.json b/gmlx/comfyui_pack/example_workflows/flux-2-klein-edit-two-references.json new file mode 100644 index 000000000..eebb439f8 --- /dev/null +++ b/gmlx/comfyui_pack/example_workflows/flux-2-klein-edit-two-references.json @@ -0,0 +1,1287 @@ +{ + "id": "99e855f1-b04f-5237-8d99-18b9b308641d", + "revision": 0, + "last_node_id": 25, + "last_link_id": 32, + "nodes": [ + { + "id": 25, + "type": "Note", + "pos": [ + -440, + 80 + ], + "size": [ + 400, + 450 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [], + "title": "gmlx nodes: install", + "properties": {}, + "widgets_values": [ + "These gmlx nodes run the image model on a gmlx server on your Mac (Apple Silicon, M3 or newer). Flux2Scheduler gives FLUX.2 klein's schedule for the image size, so keep its width and height those of the latent.\n\n1. Install gmlx: https://asher.github.io/gmlx/installation.html\n2. Put the nodes into ComfyUI, then restart ComfyUI:\n\n gmlx comfyui install\n\n3. Download the model:\n\n gmlx pull flux-2-klein\n\nPut reference-1.png and reference-2.png in ComfyUI's input folder, or pick other images in the Reference nodes. The first reference sets the image size.\n\nGuide: https://asher.github.io/gmlx/comfyui.html" + ], + "color": "#432", + "bgcolor": "#653" + }, + { + "id": 1, + "type": "GmlxModelLoader", + "pos": [ + 0, + 80 + ], + "size": [ + 300, + 130 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 22 + ] + } + ], + "title": "gmlx Model Loader", + "properties": { + "Node name for S&R": "GmlxModelLoader" + }, + "widgets_values": [ + "flux-2-klein", + "http://127.0.0.1:8080", + true + ] + }, + { + "id": 2, + "type": "GmlxCLIPLoader", + "pos": [ + 0, + 250 + ], + "size": [ + 300, + 130 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 7 + ] + } + ], + "title": "gmlx CLIP Loader", + "properties": { + "Node name for S&R": "GmlxCLIPLoader" + }, + "widgets_values": [ + "flux-2-klein", + "http://127.0.0.1:8080", + true + ] + }, + { + "id": 3, + "type": "GmlxVAELoader", + "pos": [ + 0, + 420 + ], + "size": [ + 300, + 130 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 4, + 6, + 31 + ] + } + ], + "title": "gmlx VAE Loader", + "properties": { + "Node name for S&R": "GmlxVAELoader" + }, + "widgets_values": [ + "flux-2-klein", + "http://127.0.0.1:8080", + true + ] + }, + { + "id": 4, + "type": "LoadImage", + "pos": [ + 340, + 80 + ], + "size": [ + 300, + 320 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1 + ] + }, + { + "name": "MASK", + "type": "MASK", + "links": [] + } + ], + "title": "Reference 1", + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "reference-1.png", + "image" + ] + }, + { + "id": 5, + "type": "LoadImage", + "pos": [ + 340, + 440 + ], + "size": [ + 300, + 320 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 2 + ] + }, + { + "name": "MASK", + "type": "MASK", + "links": [] + } + ], + "title": "Reference 2", + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "reference-2.png", + "image" + ] + }, + { + "id": 6, + "type": "ImageScaleToTotalPixels", + "pos": [ + 680, + 80 + ], + "size": [ + 300, + 110 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 1 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 3, + 17 + ] + } + ], + "title": "Scale reference 1", + "properties": { + "Node name for S&R": "ImageScaleToTotalPixels" + }, + "widgets_values": [ + "nearest-exact", + 1.0, + 1 + ] + }, + { + "id": 7, + "type": "ImageScaleToTotalPixels", + "pos": [ + 680, + 230 + ], + "size": [ + 300, + 110 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 2 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 5 + ] + } + ], + "title": "Scale reference 2", + "properties": { + "Node name for S&R": "ImageScaleToTotalPixels" + }, + "widgets_values": [ + "nearest-exact", + 1.0, + 1 + ] + }, + { + "id": 8, + "type": "VAEEncode", + "pos": [ + 680, + 380 + ], + "size": [ + 210, + 50 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "pixels", + "type": "IMAGE", + "link": 3 + }, + { + "name": "vae", + "type": "VAE", + "link": 4 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 10, + 14 + ] + } + ], + "title": "Encode reference 1", + "properties": { + "Node name for S&R": "VAEEncode" + }, + "widgets_values": [] + }, + { + "id": 9, + "type": "VAEEncode", + "pos": [ + 680, + 470 + ], + "size": [ + 210, + 50 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "pixels", + "type": "IMAGE", + "link": 5 + }, + { + "name": "vae", + "type": "VAE", + "link": 6 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 12, + 16 + ] + } + ], + "title": "Encode reference 2", + "properties": { + "Node name for S&R": "VAEEncode" + }, + "widgets_values": [] + }, + { + "id": 10, + "type": "CLIPTextEncode", + "pos": [ + 1020, + 80 + ], + "size": [ + 400, + 160 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 7 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 8, + 9 + ] + } + ], + "title": "Positive prompt", + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "Put the cat from the second image on the sofa in the first image" + ] + }, + { + "id": 11, + "type": "ConditioningZeroOut", + "pos": [ + 1020, + 280 + ], + "size": [ + 300, + 30 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "conditioning", + "type": "CONDITIONING", + "link": 8 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 13 + ] + } + ], + "title": "Negative (unused at cfg 1)", + "properties": { + "Node name for S&R": "ConditioningZeroOut" + }, + "widgets_values": [] + }, + { + "id": 12, + "type": "ReferenceLatent", + "pos": [ + 1020, + 360 + ], + "size": [ + 300, + 50 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "conditioning", + "type": "CONDITIONING", + "link": 9 + }, + { + "name": "latent", + "type": "LATENT", + "link": 10, + "shape": 7 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 11 + ] + } + ], + "title": "Reference 1 on the prompt", + "properties": { + "Node name for S&R": "ReferenceLatent" + }, + "widgets_values": [] + }, + { + "id": 13, + "type": "ReferenceLatent", + "pos": [ + 1020, + 450 + ], + "size": [ + 300, + 50 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "conditioning", + "type": "CONDITIONING", + "link": 11 + }, + { + "name": "latent", + "type": "LATENT", + "link": 12, + "shape": 7 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 23 + ] + } + ], + "title": "Reference 2 on the prompt", + "properties": { + "Node name for S&R": "ReferenceLatent" + }, + "widgets_values": [] + }, + { + "id": 14, + "type": "ReferenceLatent", + "pos": [ + 1020, + 540 + ], + "size": [ + 300, + 50 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "conditioning", + "type": "CONDITIONING", + "link": 13 + }, + { + "name": "latent", + "type": "LATENT", + "link": 14, + "shape": 7 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 15 + ] + } + ], + "title": "Reference 1 on the negative", + "properties": { + "Node name for S&R": "ReferenceLatent" + }, + "widgets_values": [] + }, + { + "id": 15, + "type": "ReferenceLatent", + "pos": [ + 1020, + 630 + ], + "size": [ + 300, + 50 + ], + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "conditioning", + "type": "CONDITIONING", + "link": 15 + }, + { + "name": "latent", + "type": "LATENT", + "link": 16, + "shape": 7 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 24 + ] + } + ], + "title": "Reference 2 on the negative", + "properties": { + "Node name for S&R": "ReferenceLatent" + }, + "widgets_values": [] + }, + { + "id": 16, + "type": "GetImageSize", + "pos": [ + 680, + 560 + ], + "size": [ + 210, + 90 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 17 + } + ], + "outputs": [ + { + "name": "width", + "type": "INT", + "links": [ + 18, + 20 + ] + }, + { + "name": "height", + "type": "INT", + "links": [ + 19, + 21 + ] + }, + { + "name": "batch_size", + "type": "INT", + "links": [] + } + ], + "title": "Size of reference 1", + "properties": { + "Node name for S&R": "GetImageSize" + }, + "widgets_values": [] + }, + { + "id": 17, + "type": "EmptyFlux2LatentImage", + "pos": [ + 1020, + 720 + ], + "size": [ + 300, + 110 + ], + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": 18 + }, + { + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": 19 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 29 + ] + } + ], + "title": "Empty latent", + "properties": { + "Node name for S&R": "EmptyFlux2LatentImage" + }, + "widgets_values": [ + 1024, + 1024, + 1 + ] + }, + { + "id": 18, + "type": "Flux2Scheduler", + "pos": [ + 1460, + 80 + ], + "size": [ + 300, + 110 + ], + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": 20 + }, + { + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": 21 + } + ], + "outputs": [ + { + "name": "SIGMAS", + "type": "SIGMAS", + "links": [ + 28 + ] + } + ], + "title": "Schedule", + "properties": { + "Node name for S&R": "Flux2Scheduler" + }, + "widgets_values": [ + 4, + 1024, + 1024 + ] + }, + { + "id": 19, + "type": "RandomNoise", + "pos": [ + 1460, + 230 + ], + "size": [ + 300, + 90 + ], + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "NOISE", + "type": "NOISE", + "links": [ + 25 + ] + } + ], + "title": "Noise", + "properties": { + "Node name for S&R": "RandomNoise" + }, + "widgets_values": [ + 42, + "fixed" + ] + }, + { + "id": 20, + "type": "KSamplerSelect", + "pos": [ + 1460, + 360 + ], + "size": [ + 300, + 60 + ], + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "SAMPLER", + "type": "SAMPLER", + "links": [ + 27 + ] + } + ], + "title": "Sampler", + "properties": { + "Node name for S&R": "KSamplerSelect" + }, + "widgets_values": [ + "euler" + ] + }, + { + "id": 21, + "type": "CFGGuider", + "pos": [ + 1460, + 460 + ], + "size": [ + 300, + 100 + ], + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 22 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 23 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 24 + } + ], + "outputs": [ + { + "name": "GUIDER", + "type": "GUIDER", + "links": [ + 26 + ] + } + ], + "title": "Guider", + "properties": { + "Node name for S&R": "CFGGuider" + }, + "widgets_values": [ + 1.0 + ] + }, + { + "id": 22, + "type": "SamplerCustomAdvanced", + "pos": [ + 1800, + 80 + ], + "size": [ + 300, + 130 + ], + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "noise", + "type": "NOISE", + "link": 25 + }, + { + "name": "guider", + "type": "GUIDER", + "link": 26 + }, + { + "name": "sampler", + "type": "SAMPLER", + "link": 27 + }, + { + "name": "sigmas", + "type": "SIGMAS", + "link": 28 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 29 + } + ], + "outputs": [ + { + "name": "output", + "type": "LATENT", + "links": [ + 30 + ] + }, + { + "name": "denoised_output", + "type": "LATENT", + "links": [] + } + ], + "title": "Sample", + "properties": { + "Node name for S&R": "SamplerCustomAdvanced" + }, + "widgets_values": [] + }, + { + "id": 23, + "type": "VAEDecode", + "pos": [ + 2140, + 80 + ], + "size": [ + 210, + 50 + ], + "flags": {}, + "order": 23, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 30 + }, + { + "name": "vae", + "type": "VAE", + "link": 31 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 32 + ] + } + ], + "title": "VAE Decode", + "properties": { + "Node name for S&R": "VAEDecode" + }, + "widgets_values": [] + }, + { + "id": 24, + "type": "SaveImage", + "pos": [ + 2140, + 170 + ], + "size": [ + 420, + 470 + ], + "flags": {}, + "order": 24, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 32 + } + ], + "outputs": [], + "title": "Save Image", + "properties": { + "Node name for S&R": "SaveImage" + }, + "widgets_values": [ + "gmlx/flux-2-klein-edit" + ] + } + ], + "links": [ + [ + 1, + 4, + 0, + 6, + 0, + "IMAGE" + ], + [ + 2, + 5, + 0, + 7, + 0, + "IMAGE" + ], + [ + 3, + 6, + 0, + 8, + 0, + "IMAGE" + ], + [ + 4, + 3, + 0, + 8, + 1, + "VAE" + ], + [ + 5, + 7, + 0, + 9, + 0, + "IMAGE" + ], + [ + 6, + 3, + 0, + 9, + 1, + "VAE" + ], + [ + 7, + 2, + 0, + 10, + 0, + "CLIP" + ], + [ + 8, + 10, + 0, + 11, + 0, + "CONDITIONING" + ], + [ + 9, + 10, + 0, + 12, + 0, + "CONDITIONING" + ], + [ + 10, + 8, + 0, + 12, + 1, + "LATENT" + ], + [ + 11, + 12, + 0, + 13, + 0, + "CONDITIONING" + ], + [ + 12, + 9, + 0, + 13, + 1, + "LATENT" + ], + [ + 13, + 11, + 0, + 14, + 0, + "CONDITIONING" + ], + [ + 14, + 8, + 0, + 14, + 1, + "LATENT" + ], + [ + 15, + 14, + 0, + 15, + 0, + "CONDITIONING" + ], + [ + 16, + 9, + 0, + 15, + 1, + "LATENT" + ], + [ + 17, + 6, + 0, + 16, + 0, + "IMAGE" + ], + [ + 18, + 16, + 0, + 17, + 0, + "INT" + ], + [ + 19, + 16, + 1, + 17, + 1, + "INT" + ], + [ + 20, + 16, + 0, + 18, + 0, + "INT" + ], + [ + 21, + 16, + 1, + 18, + 1, + "INT" + ], + [ + 22, + 1, + 0, + 21, + 0, + "MODEL" + ], + [ + 23, + 13, + 0, + 21, + 1, + "CONDITIONING" + ], + [ + 24, + 15, + 0, + 21, + 2, + "CONDITIONING" + ], + [ + 25, + 19, + 0, + 22, + 0, + "NOISE" + ], + [ + 26, + 21, + 0, + 22, + 1, + "GUIDER" + ], + [ + 27, + 20, + 0, + 22, + 2, + "SAMPLER" + ], + [ + 28, + 18, + 0, + 22, + 3, + "SIGMAS" + ], + [ + 29, + 17, + 0, + 22, + 4, + "LATENT" + ], + [ + 30, + 22, + 0, + 23, + 0, + "LATENT" + ], + [ + 31, + 3, + 0, + 23, + 1, + "VAE" + ], + [ + 32, + 23, + 0, + 24, + 0, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": { + "ds": { + "scale": 0.75, + "offset": [ + 480, + 40 + ] + } + }, + "version": 0.4 +} diff --git a/gmlx/comfyui_pack/example_workflows/flux-2-klein-t2i.json b/gmlx/comfyui_pack/example_workflows/flux-2-klein-t2i.json new file mode 100644 index 000000000..1b9c8faed --- /dev/null +++ b/gmlx/comfyui_pack/example_workflows/flux-2-klein-t2i.json @@ -0,0 +1,640 @@ +{ + "id": "e780544a-7301-50b5-a1b6-1c10107f7661", + "revision": 0, + "last_node_id": 14, + "last_link_id": 13, + "nodes": [ + { + "id": 14, + "type": "Note", + "pos": [ + -440, + 80 + ], + "size": [ + 400, + 400 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [], + "title": "gmlx nodes: install", + "properties": {}, + "widgets_values": [ + "These gmlx nodes run the image model on a gmlx server on your Mac (Apple Silicon, M3 or newer). Flux2Scheduler gives FLUX.2 klein's schedule for the image size, so keep its width and height those of the latent.\n\n1. Install gmlx: https://asher.github.io/gmlx/installation.html\n2. Put the nodes into ComfyUI, then restart ComfyUI:\n\n gmlx comfyui install\n\n3. Download the model:\n\n gmlx pull flux-2-klein\n\nGuide: https://asher.github.io/gmlx/comfyui.html" + ], + "color": "#432", + "bgcolor": "#653" + }, + { + "id": 1, + "type": "GmlxModelLoader", + "pos": [ + 0, + 80 + ], + "size": [ + 300, + 130 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 3 + ] + } + ], + "title": "gmlx Model Loader", + "properties": { + "Node name for S&R": "GmlxModelLoader" + }, + "widgets_values": [ + "flux-2-klein", + "http://127.0.0.1:8080", + true + ] + }, + { + "id": 2, + "type": "GmlxCLIPLoader", + "pos": [ + 0, + 250 + ], + "size": [ + 300, + 130 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 1 + ] + } + ], + "title": "gmlx CLIP Loader", + "properties": { + "Node name for S&R": "GmlxCLIPLoader" + }, + "widgets_values": [ + "flux-2-klein", + "http://127.0.0.1:8080", + true + ] + }, + { + "id": 3, + "type": "GmlxVAELoader", + "pos": [ + 0, + 420 + ], + "size": [ + 300, + 130 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 12 + ] + } + ], + "title": "gmlx VAE Loader", + "properties": { + "Node name for S&R": "GmlxVAELoader" + }, + "widgets_values": [ + "flux-2-klein", + "http://127.0.0.1:8080", + true + ] + }, + { + "id": 4, + "type": "CLIPTextEncode", + "pos": [ + 340, + 80 + ], + "size": [ + 400, + 160 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 1 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 2, + 4 + ] + } + ], + "title": "Positive prompt", + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "A lighthouse on a rocky coast at dawn, waves breaking on the rocks, soft golden light, photograph" + ] + }, + { + "id": 5, + "type": "ConditioningZeroOut", + "pos": [ + 340, + 280 + ], + "size": [ + 300, + 30 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "conditioning", + "type": "CONDITIONING", + "link": 2 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 5 + ] + } + ], + "title": "Negative (unused at cfg 1)", + "properties": { + "Node name for S&R": "ConditioningZeroOut" + }, + "widgets_values": [] + }, + { + "id": 6, + "type": "EmptyFlux2LatentImage", + "pos": [ + 340, + 360 + ], + "size": [ + 300, + 110 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 10 + ] + } + ], + "title": "Empty latent", + "properties": { + "Node name for S&R": "EmptyFlux2LatentImage" + }, + "widgets_values": [ + 1024, + 1024, + 1 + ] + }, + { + "id": 7, + "type": "Flux2Scheduler", + "pos": [ + 340, + 510 + ], + "size": [ + 300, + 110 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "SIGMAS", + "type": "SIGMAS", + "links": [ + 9 + ] + } + ], + "title": "Schedule", + "properties": { + "Node name for S&R": "Flux2Scheduler" + }, + "widgets_values": [ + 4, + 1024, + 1024 + ] + }, + { + "id": 8, + "type": "RandomNoise", + "pos": [ + 780, + 80 + ], + "size": [ + 300, + 90 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "NOISE", + "type": "NOISE", + "links": [ + 6 + ] + } + ], + "title": "Noise", + "properties": { + "Node name for S&R": "RandomNoise" + }, + "widgets_values": [ + 42, + "fixed" + ] + }, + { + "id": 9, + "type": "KSamplerSelect", + "pos": [ + 780, + 210 + ], + "size": [ + 300, + 60 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "SAMPLER", + "type": "SAMPLER", + "links": [ + 8 + ] + } + ], + "title": "Sampler", + "properties": { + "Node name for S&R": "KSamplerSelect" + }, + "widgets_values": [ + "euler" + ] + }, + { + "id": 10, + "type": "CFGGuider", + "pos": [ + 780, + 310 + ], + "size": [ + 300, + 100 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 3 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 4 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 5 + } + ], + "outputs": [ + { + "name": "GUIDER", + "type": "GUIDER", + "links": [ + 7 + ] + } + ], + "title": "Guider", + "properties": { + "Node name for S&R": "CFGGuider" + }, + "widgets_values": [ + 1.0 + ] + }, + { + "id": 11, + "type": "SamplerCustomAdvanced", + "pos": [ + 1120, + 80 + ], + "size": [ + 300, + 130 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "noise", + "type": "NOISE", + "link": 6 + }, + { + "name": "guider", + "type": "GUIDER", + "link": 7 + }, + { + "name": "sampler", + "type": "SAMPLER", + "link": 8 + }, + { + "name": "sigmas", + "type": "SIGMAS", + "link": 9 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 10 + } + ], + "outputs": [ + { + "name": "output", + "type": "LATENT", + "links": [ + 11 + ] + }, + { + "name": "denoised_output", + "type": "LATENT", + "links": [] + } + ], + "title": "Sample", + "properties": { + "Node name for S&R": "SamplerCustomAdvanced" + }, + "widgets_values": [] + }, + { + "id": 12, + "type": "VAEDecode", + "pos": [ + 1460, + 80 + ], + "size": [ + 210, + 50 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 11 + }, + { + "name": "vae", + "type": "VAE", + "link": 12 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 13 + ] + } + ], + "title": "VAE Decode", + "properties": { + "Node name for S&R": "VAEDecode" + }, + "widgets_values": [] + }, + { + "id": 13, + "type": "SaveImage", + "pos": [ + 1460, + 170 + ], + "size": [ + 420, + 470 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 13 + } + ], + "outputs": [], + "title": "Save Image", + "properties": { + "Node name for S&R": "SaveImage" + }, + "widgets_values": [ + "gmlx/flux-2-klein" + ] + } + ], + "links": [ + [ + 1, + 2, + 0, + 4, + 0, + "CLIP" + ], + [ + 2, + 4, + 0, + 5, + 0, + "CONDITIONING" + ], + [ + 3, + 1, + 0, + 10, + 0, + "MODEL" + ], + [ + 4, + 4, + 0, + 10, + 1, + "CONDITIONING" + ], + [ + 5, + 5, + 0, + 10, + 2, + "CONDITIONING" + ], + [ + 6, + 8, + 0, + 11, + 0, + "NOISE" + ], + [ + 7, + 10, + 0, + 11, + 1, + "GUIDER" + ], + [ + 8, + 9, + 0, + 11, + 2, + "SAMPLER" + ], + [ + 9, + 7, + 0, + 11, + 3, + "SIGMAS" + ], + [ + 10, + 6, + 0, + 11, + 4, + "LATENT" + ], + [ + 11, + 11, + 0, + 12, + 0, + "LATENT" + ], + [ + 12, + 3, + 0, + 12, + 1, + "VAE" + ], + [ + 13, + 12, + 0, + 13, + 0, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": { + "ds": { + "scale": 0.75, + "offset": [ + 480, + 40 + ] + } + }, + "version": 0.4 +} diff --git a/gmlx/commands/doctor.py b/gmlx/commands/doctor.py index 581ef0879..7ff301bc6 100644 --- a/gmlx/commands/doctor.py +++ b/gmlx/commands/doctor.py @@ -239,7 +239,7 @@ def rp(p): vae = rp(m.vae) if vae is not None and vae.endswith(".gguf"): v = catalog.vae_identity(vae) - if v is None or v[0] != fam: + if v is None or fam not in catalog.vae_families(v[0]): bad.append(f"{iid}: the VAE is not the {fam} VAE") shared = cfg.models.get(m.encoder) enc = rp(shared.path if shared is not None else m.encoder) diff --git a/gmlx/commands/image.py b/gmlx/commands/image.py index 5e3499c24..58517b79d 100644 --- a/gmlx/commands/image.py +++ b/gmlx/commands/image.py @@ -169,10 +169,11 @@ def _generate_parser(prog: str) -> argparse.ArgumentParser: p.add_argument("--size", type=_size, default=None, metavar="WxH", help="Image width and height, multiples of 16, or of 32 " "on Qwen-Image 2.1 (default: the init image's, else " - "on FLUX.3 klein the first reference's, else the " - "entry's defaults.size, else the variant's). On " - "FLUX.3 klein without it, the image of one reference " - "is cropped to that reference's own aspect.") + "on FLUX.2 klein and FLUX.3 klein the first " + "reference's, else the entry's defaults.size, else " + "the variant's). On FLUX.3 klein without it, the " + "image of one reference is cropped to that " + "reference's own aspect.") p.add_argument("--steps", type=_positive, default=None, metavar="N", help="Sampling steps (default: the variant's).") p.add_argument("--seed", type=_seed, default=None, metavar="N", @@ -195,13 +196,13 @@ def _generate_parser(prog: str) -> argparse.ArgumentParser: p.add_argument("--ref", action="append", default=None, metavar="PATH", help="Edit from this reference image. Repeat the flag for " "several, in the order the prompt names them. Needs " - "--encoder-mmproj, except on FLUX.3 klein, whose " - "encoder reads the prompt alone.") + "--encoder-mmproj, except on FLUX.2 klein and FLUX.3 " + "klein, whose encoders read the prompt alone.") p.add_argument("--ref-size", type=_positive, default=None, metavar="N", help="Resize each reference to about N x N pixels at its " - "own aspect ratio (default 1024). FLUX.3 klein sizes " - "its references by its own rule and takes no " - "--ref-size.") + "own aspect ratio (default 1024). FLUX.2 klein and " + "FLUX.3 klein size their references by their own " + "rules and take no --ref-size.") p.add_argument("--count", type=_positive, default=1, metavar="N", help="Generate N images (default 1).") p.add_argument("--output", default=None, metavar="PATH", @@ -1224,9 +1225,10 @@ def _pack_vae_parser(prog: str) -> argparse.ArgumentParser: "and the file records that.") p.add_argument("--family", default=None, metavar="NAME", help="The image family whose VAE this is, such as " - "z-image, qwen-image-2.1, krea-2 or flux-3-klein " - "(default: the one family whose VAE the file " - "fills).") + "z-image, qwen-image-2.1, krea-2, flux-3-klein or " + "flux-2-klein (default: the family whose VAE the " + "file fills, the first one for the FLUX.2 " + "autoencoder, which serves both klein families).") p.add_argument("--source-repo", default="unknown", metavar="ID", help="Record this repository as the source (default " "unknown).") diff --git a/gmlx/commands/image_pull.py b/gmlx/commands/image_pull.py index f84ead668..54753dcf8 100644 --- a/gmlx/commands/image_pull.py +++ b/gmlx/commands/image_pull.py @@ -325,8 +325,9 @@ def _print_plan(plan: Plan, *, ram: int | None, free: int | None, print(f" the entry gets defaults.size {plan.size}, the largest image " f"this DiT makes on a {plan.memory_class} GB Mac") note = f", {r.license_note}" if r.license_note else "" + vae = f"; VAE {r.vae_license}" if r.vae_license else "" print(f" license: {r.title} {r.license}{note} ({r.license_url}); " - f"encoder {r.encoder_license}") + f"encoder {r.encoder_license}{vae}") def _cast(plan: Plan) -> int: @@ -582,6 +583,7 @@ def pull_recipe(a, r: catalog.Recipe) -> int: "free_bytes": free, "license": r.license, "license_note": r.license_note or None, "encoder_license": r.encoder_license, + "vae_license": r.vae_license or None, "parts": [{"role": p.role, "name": p.name, "path": p.path, "size_bytes": p.size, "download": p.download and p.wanted, "on_disk": not p.download, diff --git a/gmlx/commands/manage.py b/gmlx/commands/manage.py index 078396e08..7a8eac224 100644 --- a/gmlx/commands/manage.py +++ b/gmlx/commands/manage.py @@ -1106,7 +1106,8 @@ def _planned_download_bytes(ref: remote.Ref, dest_dir: str, config and served immediately. Refuses an unloadable GGUF unless --force. An image model name (z-image-turbo, qwen-image, qwen-image-turbo, -krea-2-turbo, flux-3-klein, flux-3-klein-base) pulls the DiT, its text +krea-2-turbo, flux-2-klein, flux-2-klein-base, flux-3-klein, +flux-3-klein-base) pulls the DiT, its text encoder and its VAE, uses the parts your model folders already hold, and adds the model under image_models: in the config. """ @@ -1156,7 +1157,8 @@ def cmd_pull(argv: list | None = None, prog: str = "gmlx pull") -> int: "Additional bare filenames are fetched from the first " "ref's repo. An image model name (z-image-turbo, " "qwen-image, qwen-image-turbo, krea-2-turbo, " - "flux-3-klein, flux-3-klein-base) " + "flux-2-klein, flux-2-klein-base, flux-3-klein, " + "flux-3-klein-base) " "pulls the model with its text encoder and VAE. See " "the examples below.") ap.add_argument("--to", "--out", default=None, metavar="DIR", diff --git a/gmlx/image/catalog.py b/gmlx/image/catalog.py index 8dfda852d..f626073dd 100644 --- a/gmlx/image/catalog.py +++ b/gmlx/image/catalog.py @@ -48,6 +48,8 @@ class Recipe: vae_bytes: int = 0 # the packed VAE's size, for a fit aliases: tuple = () license_note: str = "" # what the license allows, if limited + vae_license: str = "" # the VAE's license, when it has its + # own def dit_name(self, quant: str) -> str: return self.dit_file.format(quant=quant) @@ -73,19 +75,35 @@ def encoder_name(self, quant: str) -> str: _KREA2_NOTE = ("free commercial use only under $1M annual revenue, " "affiliates counted, and a deployer must filter content") -# FLUX.3 klein's VAE is the FLUX.2 autoencoder, which Comfy-Org's FLUX.2 -# repository holds in the diffusers layout and without a config.json. Both -# checkpoints share the encoder file of Krea 2. +# The FLUX.2 autoencoder, which FLUX.2 klein and FLUX.3 klein decode with: +# BFL's file in the FLUX.2 klein 4B repository, BF16 in the diffusers +# layout with its config.json, packed in its own dtype. One pack serves the +# four recipes. +_FLUX2_VAE = dict( + vae_repo="black-forest-labs/FLUX.2-klein-4B", + vae_revision="e7b7dc27f91deacad38e78976d1f2b499d76a294", + vae_file="vae/diffusion_pytorch_model.safetensors", + vae_config="vae/config.json", + vae_sha256="ca70d2202afe6415bdbcb8793ba8cd99fd159cfe6192381504d6c4d3036e0f04", + vae_pack="flux2-vae-BF16.gguf", vae_license="apache-2.0", + vae_bytes=168_114_016) + +# FLUX.2 klein 4B: unsloth's GGUFs of BFL's checkpoints, conditioned on +# Qwen3-4B, the encoder file of Z-Image. +_FLUX2 = dict( + family="flux2_klein", dit_quants=("Q4_K_M", "Q8_0"), + encoder_repo="unsloth/Qwen3-4B-GGUF", encoder_file="Qwen3-4B-{quant}.gguf", + encoder_quants=("Q8_0",), **_FLUX2_VAE, + license="apache-2.0", encoder_license="apache-2.0", + encoder_bytes=4_280_405_792) + +# Both FLUX.3 klein checkpoints share the encoder file of Krea 2. _FLUX3 = dict( family="flux3_klein", dit_repo="realrebelai/FLUX-3-Image-Klein_GGUFs", dit_quants=("Q4_K_M", "Q8_0"), encoder_repo=_KREA2_ENCODER, encoder_file="Qwen3-VL-4B-Instruct-{quant}.gguf", encoder_quants=("Q8_0",), - vae_repo="Comfy-Org/flux2-dev", - vae_revision="ed33133cd56476eac818c0943b6f9419b3e4a3a1", - vae_file="split_files/vae/flux2-vae.safetensors", vae_config="", - vae_sha256="d64f3a68e1cc4f9f4e29b6e0da38a0204fe9a49f2d4053f0ec1fa1ca02f9c4b5", - vae_pack="flux2-vae-F32.gguf", + **_FLUX2_VAE, license="flux-kommunity", license_url="https://huggingface.co/black-forest-labs/flux-3-image-klein/" "blob/main/LICENSE.md", @@ -95,8 +113,7 @@ def encoder_name(self, quant: str) -> str: "filters or a review of each image for unlawful or " "infringing content before it is shared, and a disclosure " "that it is made with AI where the law requires one"), - encoder_license="apache-2.0", - encoder_bytes=4_280_406_816, vae_bytes=336_205_920) + encoder_license="apache-2.0", encoder_bytes=4_280_406_816) RECIPES = {r.name: r for r in ( Recipe( @@ -168,6 +185,18 @@ def encoder_name(self, quant: str) -> str: license="krea-2-community", license_url=_KREA2_LICENSE, license_note=_KREA2_NOTE, encoder_license="apache-2.0", encoder_bytes=4_280_406_816, vae_bytes=253_807_712), + Recipe( + name="flux-2-klein", title="FLUX.2 klein", variant="distilled", + dit_repo="unsloth/FLUX.2-klein-4B-GGUF", + dit_file="flux-2-klein-4b-{quant}.gguf", + license_url="https://huggingface.co/black-forest-labs/FLUX.2-klein-4B/" + "blob/main/LICENSE.md", **_FLUX2), + Recipe( + name="flux-2-klein-base", title="FLUX.2 klein Base", variant="base", + dit_repo="unsloth/FLUX.2-klein-base-4B-GGUF", + dit_file="flux-2-klein-base-4b-{quant}.gguf", + license_url="https://huggingface.co/black-forest-labs/" + "FLUX.2-klein-base-4B/blob/main/LICENSE.md", **_FLUX2), Recipe( name="flux-3-klein", title="FLUX.3 klein", variant="distilled", dit_file="DISTILLED/flux3_image_klein_sd-{quant}.gguf", **_FLUX3), @@ -191,6 +220,14 @@ def encoder_name(self, quant: str) -> str: # the staged load. Q8_0 needs the 32 GB class. "krea-2-turbo": {16: ("Q3_K_M", "Q8_0"), 24: ("Q6_K", "Q8_0"), 32: ("Q8_0", "Q8_0"), 64: ("Q8_0", "Q8_0")}, + # On 16 GB a Q4_K_M FLUX.2 klein DiT makes a 1024 pixel image from up + # to two 1024 pixel references with the encoder released, and Base runs + # its two guided rows one at a time. A Q8_0 DiT fits there only with + # the staged load and a tiled decode, and takes no reference. + "flux-2-klein": {16: ("Q4_K_M", "Q8_0"), 24: ("Q8_0", "Q8_0"), + 32: ("Q8_0", "Q8_0"), 64: ("Q8_0", "Q8_0")}, + "flux-2-klein-base": {16: ("Q4_K_M", "Q8_0"), 24: ("Q8_0", "Q8_0"), + 32: ("Q8_0", "Q8_0"), 64: ("Q8_0", "Q8_0")}, # A Q8_0 DiT fits a 1024 pixel image from the 24 GB class up, with the # encoder released on 24 GB, where Base also runs its two guided rows # one at a time. @@ -321,6 +358,17 @@ def vae_identity(path: str) -> tuple[str, str | None] | None: return str(fam), (str(sha) if sha else None) +def vae_families(label: str) -> tuple: + """The families a VAE packed for the family ``label`` serves: + ``label`` first, then each family that decodes with the same + autoencoder, as FLUX.2 klein and FLUX.3 klein do.""" + from .vae.reader import VAES + + row = VAES.get(label) + return (label, *(f for f, r in VAES.items() + if row is not None and r is row and f != label)) + + def _shape_matches(kv: dict, spec) -> bool: arch = kv.get("general.architecture") return (arch == spec.arch @@ -396,7 +444,8 @@ def classify(path: str, *, families: tuple | None = None) -> list: kind = str(kv.get("general.type") or "").lower() if kind == "vae" or arch == "autoencoder": got = vae_identity(path) - return [ImageFile(path, "vae", got[0], sha256=got[1])] if got else [] + return [ImageFile(path, "vae", f, sha256=got[1]) + for f in vae_families(got[0])] if got else [] if kind == "mmproj" or arch == "clip": return [ImageFile(path, "mmproj", f) for f in names if mmproj_matches(path, f)] diff --git a/gmlx/image/vae/packer.py b/gmlx/image/vae/packer.py index 1724dcfd9..035b24990 100644 --- a/gmlx/image/vae/packer.py +++ b/gmlx/image/vae/packer.py @@ -108,7 +108,7 @@ def pack_vae(src, dst, *, source_repo: str, source_revision: str, dtype: str | None = None, overwrite: bool = False) -> PackReport: """Pack the safetensors VAE ``src`` into the GGUF ``dst``. - ``family`` defaults to the one family whose VAE the file fills. + ``family`` defaults to the first family whose VAE the file fills. ``dtype`` is None for the source dtype, or "F32", "F16" or "BF16". """ src, dst = str(src), str(dst) diff --git a/gmlx/image/vae/reader.py b/gmlx/image/vae/reader.py index b0d7d29dc..745f90d9b 100644 --- a/gmlx/image/vae/reader.py +++ b/gmlx/image/vae/reader.py @@ -79,6 +79,15 @@ def _own_space(c: dict) -> dict: return {} +# The FLUX.2 autoencoder, which FLUX.2 klein and FLUX.3 klein both decode +# with: one row, so a VAE packed for either family serves the other. The +# latent BatchNorm statistics come with the VAE and stay float32. +_FLUX2_AE = VaeRow( + "the FLUX.2 autoencoder", flux2_ae.config_from_shapes, + flux2_ae.Flux2AE, 32, _own_space, flux2_ae.expected_unused, + config_disagreements=flux2_ae.config_disagreements, + fp32_keep=flux2_ae.BN_STATS) + VAES = { "z_image": VaeRow("the FLUX.1 autoencoder", flux1_ae.config_from_shapes, flux1_ae.Flux1AE, 16, _flux1_space), @@ -99,18 +108,8 @@ def _own_space(c: dict) -> dict: qwen_image_vae.expected_unused, image_channels=qwen_image_vae.IMAGE_CHANNELS, config_disagreements=qwen_image_vae.config_disagreements), - # The latent BatchNorm statistics come with the VAE and stay float32. - "flux3_klein": VaeRow( - "the FLUX.2 autoencoder", flux2_ae.config_from_shapes, - flux2_ae.Flux2AE, 32, _own_space, flux2_ae.expected_unused, - config_disagreements=flux2_ae.config_disagreements, - fp32_keep=flux2_ae.BN_STATS), - # FLUX.2 klein's own autoencoder, the one FLUX.3 klein reads. - "flux2_klein": VaeRow( - "the FLUX.2 autoencoder", flux2_ae.config_from_shapes, - flux2_ae.Flux2AE, 32, _own_space, flux2_ae.expected_unused, - config_disagreements=flux2_ae.config_disagreements, - fp32_keep=flux2_ae.BN_STATS), + "flux3_klein": _FLUX2_AE, + "flux2_klein": _FLUX2_AE, } diff --git a/gmlx/load/discovery.py b/gmlx/load/discovery.py index 8d8120dcb..0de5315ed 100644 --- a/gmlx/load/discovery.py +++ b/gmlx/load/discovery.py @@ -769,8 +769,8 @@ def _pair_images(classified, chat, used_ids: set, images, if c.kind == "image-vae": got = catalog.vae_identity(c.path) if got is not None: - vaes.append(catalog.ImageFile(c.path, "vae", got[0], - sha256=got[1])) + vaes += [catalog.ImageFile(c.path, "vae", f, sha256=got[1]) + for f in catalog.vae_families(got[0])] chat_ids = {os.path.abspath(m.path): m.id for m in chat} towered = {m.id for m in chat if m.mmproj} | set(tower_ids) chat_ids.update({os.path.abspath(p): i for p, i in encoder_ids.items()}) diff --git a/scripts/image_oracle/check5_flux3_klein_vae.py b/scripts/image_oracle/check5_flux3_klein_vae.py index 2e71b1d5c..0e4a4b85d 100644 --- a/scripts/image_oracle/check5_flux3_klein_vae.py +++ b/scripts/image_oracle/check5_flux3_klein_vae.py @@ -32,6 +32,11 @@ so a run at 512 and 1024 pixels with float64 peaked at 32.8 GiB on an M5 Max, and the oracle runs no larger size. +FLUX.2 klein reads the same autoencoder, which gmlx pulls from BFL's +FLUX.2 klein 4B repository in BF16. ``--vae`` that file, ``--config`` a +copy of that repository and ``--name check5_flux2_klein_vae`` write its +fixture, the fp32 and float64 runs reading the bf16 weights upcast. + --self-test builds the class at a tiny config with seeded weights and BatchNorm statistics, which the fixture holds by diffusers name, and runs one 48x64 image through it. @@ -428,9 +433,11 @@ def main(argv=None) -> int: extra = {"source_dtypes": dtypes, "config_revision": a.config_revision, "load": "AutoencoderKLFlux2.from_config(vae/config.json), " "then the file strict, in float32"} + held = ("bfloat16 weights, which the fp32 and float64 runs read " + "upcast" if "torch.bfloat16" in dtypes else "float32 weights") results_extra, bfl, notes = {}, None, [ - "The file holds float32 weights. The bf16 VAE is a bfloat16 copy " - "with its BatchNorm statistics kept float32."] + f"The file holds {held}. The bf16 VAE is a bfloat16 copy with its " + "BatchNorm statistics kept float32."] if a.original is not None: files["vae_original"] = a.original bfl_state = None diff --git a/tests/comfyui_pack/headless.py b/tests/comfyui_pack/headless.py index 0b4bd7006..a34465c79 100755 --- a/tests/comfyui_pack/headless.py +++ b/tests/comfyui_pack/headless.py @@ -17,6 +17,7 @@ import copy import hashlib import json +import math import os import re import shutil @@ -49,6 +50,20 @@ def comfy_version(comfy_dir: str) -> tuple: return tuple(int(p) for p in m.group(1).split(".")) if m else (0,) +def flux2_sigmas(steps: int, width: int, height: int) -> list: + """Flux2Scheduler's schedule, the sigmas a FLUX.2 klein step sees.""" + n = round(width * height / 256) + a1, b1, a2, b2 = 8.73809524e-05, 1.89833333, 0.00016927, 0.45666666 + if n > 4300: + mu = a2 * n + b2 + else: + m200, m10 = a2 * n + b2, a1 * n + b1 + a = (m200 - m10) / 190.0 + mu = a * steps + m200 - 200.0 * a + t = np.linspace(1.0, 0.0, steps + 1, dtype=np.float32)[:-1].astype(np.float64) + return [float(math.exp(mu) / (math.exp(mu) + (1 / x - 1))) for x in t] + + def free_port() -> int: with socket.socket() as s: s.bind(("127.0.0.1", 0)) @@ -406,6 +421,82 @@ async def flux3_edit(self): self.check("decoded", len(kinds(log, "vae_decode")) == 1, len(kinds(log, "vae_decode"))) self.check("latent saved", latent_sha(self.work, "latents/flux3-edit") is not None, None) + async def flux2_t2i(self): + wf = workflow("flux-2-klein-t2i.json") + wf["6"]["inputs"].update(width=256, height=192) + wf["7"]["inputs"].update(steps=3, width=256, height=192) + wf["14"] = {"class_type": "SaveLatent", "inputs": {"samples": ["11", 0], + "filename_prefix": "latents/flux2-t2i"}} + r = await self.s.run(wf) + log = self.stub.log() + self.check("success", r["status"] == "success", r.get("error")) + enc = kinds(log, "encode") + self.check("one encode of the prompt", [e["text"] for e in enc] == [wf["4"]["inputs"]["text"]], + [e["text"] for e in enc]) + steps = kinds(log, "step") + self.check("steps", len(steps) == 3, len(steps)) + self.check("one row a step at cfg 1, its 512 text rows, no references", + {(e["rows"], tuple(e["num_tokens"]), tuple(e["refs"])) for e in steps} == {(1, (512,), (0,))}, + [(e["rows"], e["num_tokens"], e["refs"]) for e in steps]) + self.check("model space latent", {tuple(e["x_shape"]) for e in steps} == {(1, 128, 12, 16)}, + [e["x_shape"] for e in steps][:1]) + got = [e["timestep"][0] for e in steps] + want = flux2_sigmas(3, 256, 192) + self.check("timesteps of Flux2Scheduler", np.allclose(got, want, atol=1e-5), {"got": got, "want": want}) + self.check("no schedule sent", not any(e["sample_sigmas"] for e in steps), None) + self.check("decoded", len(kinds(log, "vae_decode")) == 1, len(kinds(log, "vae_decode"))) + self.check("latent saved", latent_sha(self.work, "latents/flux2-t2i") is not None, None) + + def flux2_edit_workflow(self, steps=2) -> dict: + wf = workflow("flux-2-klein-edit-two-references.json") + for scale in ("6", "7"): + wf[scale]["inputs"]["megapixels"] = 0.25 + wf["18"]["inputs"]["steps"] = steps + return wf + + async def flux2_edit(self): + wf = self.flux2_edit_workflow() + wf["25"] = {"class_type": "SaveLatent", "inputs": {"samples": ["22", 0], + "filename_prefix": "latents/flux2-edit"}} + r = await self.s.run(wf) + log = self.stub.log() + self.check("success", r["status"] == "success", r.get("error")) + enc = kinds(log, "vae_encode") + shapes = [e["shape"] for e in enc] + # reference-1.png is 512 wide and 768 high, reference-2.png square. + # ComfyUI runs the two encodes of this graph in either order. + tall = [s for s in shapes if s[1] > s[2]] + square = [s for s in shapes if s[1] == s[2]] + self.check("each reference encoded once", len(shapes) == 2 and len(tall) == len(square) == 1, shapes) + steps = kinds(log, "step") + lat = [[1, 128, h // 16, w // 16] for _, h, w, _ in tall + square] + self.check("steps", len(steps) == 2, len(steps)) + self.check("one row a step carries both references in order", + all(e["rows"] == 1 and e["ref_shapes"] == [lat] for e in steps), + [(e["rows"], e["ref_shapes"]) for e in steps][:1]) + self.check("the first reference sizes the latent", + {tuple(e["x_shape"]) for e in steps} == {tuple(lat[0]) if lat else None}, + [e["x_shape"] for e in steps][:1]) + self.check("decoded", len(kinds(log, "vae_decode")) == 1, len(kinds(log, "vae_decode"))) + self.check("latent saved", latent_sha(self.work, "latents/flux2-edit") is not None, None) + + async def flux2_reference_method(self): + """FLUX.2 klein places its references by the index method, and + FluxKontextMultiReferenceLatentMethod asks for another.""" + wf = self.flux2_edit_workflow() + wf["30"] = {"class_type": "FluxKontextMultiReferenceLatentMethod", + "inputs": {"conditioning": ["13", 0], "reference_latents_method": "offset"}} + wf["21"]["inputs"]["positive"] = ["30", 0] + r = await self.s.run(wf) + err = r.get("error") or {} + self.check("error", r["status"] == "error", r["status"]) + self.check("on the sampler", str(err.get("node_id")) == "22", err.get("node_id")) + msg = str(err.get("exception_message")) + self.check("names the method and the node", all(w in msg for w in ( + "'index' method", "'offset'", "FluxKontextMultiReferenceLatentMethod")), msg) + n = len(kinds(self.stub.log(), "step")) + self.check("no step served", n == 0, n) + async def turbo_sigmas(self): wf = { "1": {"class_type": "GmlxModelLoader", "inputs": {"model_name": "qwen-image-2.1-turbo", @@ -483,6 +574,10 @@ async def amain(a) -> dict: await c.case("version mismatch names the side to upgrade", c.version) await c.case("qwen-image-2.1 edit with two references", c.qwen_edit) await c.case("fixed sigmas through GmlxSigmas and SamplerCustom", c.turbo_sigmas) + await c.case("flux-2-klein t2i through Flux2Scheduler", c.flux2_t2i) + await c.case("flux-2-klein edit with two references", c.flux2_edit) + await c.case("FluxKontextMultiReferenceLatentMethod refused on flux-2-klein, naming it", + c.flux2_reference_method) if comfy_version(a.comfy) >= (0, 41, 0): await c.case("flux-3-klein t2i", c.flux3_t2i) await c.case("flux-3-klein edit with two references", c.flux3_edit) diff --git a/tests/comfyui_pack/workflows/flux-2-klein-edit-two-references.json b/tests/comfyui_pack/workflows/flux-2-klein-edit-two-references.json new file mode 100644 index 000000000..4874971ff --- /dev/null +++ b/tests/comfyui_pack/workflows/flux-2-klein-edit-two-references.json @@ -0,0 +1,346 @@ +{ + "1": { + "inputs": { + "model_name": "flux-2-klein", + "server_url": "http://127.0.0.1:8080", + "start_server": true + }, + "class_type": "GmlxModelLoader", + "_meta": { + "title": "gmlx Model Loader" + } + }, + "2": { + "inputs": { + "model_name": "flux-2-klein", + "server_url": "http://127.0.0.1:8080", + "start_server": true + }, + "class_type": "GmlxCLIPLoader", + "_meta": { + "title": "gmlx CLIP Loader" + } + }, + "3": { + "inputs": { + "model_name": "flux-2-klein", + "server_url": "http://127.0.0.1:8080", + "start_server": true + }, + "class_type": "GmlxVAELoader", + "_meta": { + "title": "gmlx VAE Loader" + } + }, + "4": { + "inputs": { + "image": "reference-1.png" + }, + "class_type": "LoadImage", + "_meta": { + "title": "Reference 1" + } + }, + "5": { + "inputs": { + "image": "reference-2.png" + }, + "class_type": "LoadImage", + "_meta": { + "title": "Reference 2" + } + }, + "6": { + "inputs": { + "image": [ + "4", + 0 + ], + "upscale_method": "nearest-exact", + "megapixels": 1.0, + "resolution_steps": 1 + }, + "class_type": "ImageScaleToTotalPixels", + "_meta": { + "title": "Scale reference 1" + } + }, + "7": { + "inputs": { + "image": [ + "5", + 0 + ], + "upscale_method": "nearest-exact", + "megapixels": 1.0, + "resolution_steps": 1 + }, + "class_type": "ImageScaleToTotalPixels", + "_meta": { + "title": "Scale reference 2" + } + }, + "8": { + "inputs": { + "pixels": [ + "6", + 0 + ], + "vae": [ + "3", + 0 + ] + }, + "class_type": "VAEEncode", + "_meta": { + "title": "Encode reference 1" + } + }, + "9": { + "inputs": { + "pixels": [ + "7", + 0 + ], + "vae": [ + "3", + 0 + ] + }, + "class_type": "VAEEncode", + "_meta": { + "title": "Encode reference 2" + } + }, + "10": { + "inputs": { + "clip": [ + "2", + 0 + ], + "text": "Put the cat from the second image on the sofa in the first image" + }, + "class_type": "CLIPTextEncode", + "_meta": { + "title": "Positive prompt" + } + }, + "11": { + "inputs": { + "conditioning": [ + "10", + 0 + ] + }, + "class_type": "ConditioningZeroOut", + "_meta": { + "title": "Negative (unused at cfg 1)" + } + }, + "12": { + "inputs": { + "conditioning": [ + "10", + 0 + ], + "latent": [ + "8", + 0 + ] + }, + "class_type": "ReferenceLatent", + "_meta": { + "title": "Reference 1 on the prompt" + } + }, + "13": { + "inputs": { + "conditioning": [ + "12", + 0 + ], + "latent": [ + "9", + 0 + ] + }, + "class_type": "ReferenceLatent", + "_meta": { + "title": "Reference 2 on the prompt" + } + }, + "14": { + "inputs": { + "conditioning": [ + "11", + 0 + ], + "latent": [ + "8", + 0 + ] + }, + "class_type": "ReferenceLatent", + "_meta": { + "title": "Reference 1 on the negative" + } + }, + "15": { + "inputs": { + "conditioning": [ + "14", + 0 + ], + "latent": [ + "9", + 0 + ] + }, + "class_type": "ReferenceLatent", + "_meta": { + "title": "Reference 2 on the negative" + } + }, + "16": { + "inputs": { + "image": [ + "6", + 0 + ] + }, + "class_type": "GetImageSize", + "_meta": { + "title": "Size of reference 1" + } + }, + "17": { + "inputs": { + "width": [ + "16", + 0 + ], + "height": [ + "16", + 1 + ], + "batch_size": 1 + }, + "class_type": "EmptyFlux2LatentImage", + "_meta": { + "title": "Empty latent" + } + }, + "18": { + "inputs": { + "width": [ + "16", + 0 + ], + "height": [ + "16", + 1 + ], + "steps": 4 + }, + "class_type": "Flux2Scheduler", + "_meta": { + "title": "Schedule" + } + }, + "19": { + "inputs": { + "noise_seed": 42 + }, + "class_type": "RandomNoise", + "_meta": { + "title": "Noise" + } + }, + "20": { + "inputs": { + "sampler_name": "euler" + }, + "class_type": "KSamplerSelect", + "_meta": { + "title": "Sampler" + } + }, + "21": { + "inputs": { + "model": [ + "1", + 0 + ], + "positive": [ + "13", + 0 + ], + "negative": [ + "15", + 0 + ], + "cfg": 1.0 + }, + "class_type": "CFGGuider", + "_meta": { + "title": "Guider" + } + }, + "22": { + "inputs": { + "noise": [ + "19", + 0 + ], + "guider": [ + "21", + 0 + ], + "sampler": [ + "20", + 0 + ], + "sigmas": [ + "18", + 0 + ], + "latent_image": [ + "17", + 0 + ] + }, + "class_type": "SamplerCustomAdvanced", + "_meta": { + "title": "Sample" + } + }, + "23": { + "inputs": { + "samples": [ + "22", + 0 + ], + "vae": [ + "3", + 0 + ] + }, + "class_type": "VAEDecode", + "_meta": { + "title": "VAE Decode" + } + }, + "24": { + "inputs": { + "images": [ + "23", + 0 + ], + "filename_prefix": "gmlx/flux-2-klein-edit" + }, + "class_type": "SaveImage", + "_meta": { + "title": "Save Image" + } + } +} diff --git a/tests/comfyui_pack/workflows/flux-2-klein-t2i.json b/tests/comfyui_pack/workflows/flux-2-klein-t2i.json new file mode 100644 index 000000000..07ac0d020 --- /dev/null +++ b/tests/comfyui_pack/workflows/flux-2-klein-t2i.json @@ -0,0 +1,178 @@ +{ + "1": { + "inputs": { + "model_name": "flux-2-klein", + "server_url": "http://127.0.0.1:8080", + "start_server": true + }, + "class_type": "GmlxModelLoader", + "_meta": { + "title": "gmlx Model Loader" + } + }, + "2": { + "inputs": { + "model_name": "flux-2-klein", + "server_url": "http://127.0.0.1:8080", + "start_server": true + }, + "class_type": "GmlxCLIPLoader", + "_meta": { + "title": "gmlx CLIP Loader" + } + }, + "3": { + "inputs": { + "model_name": "flux-2-klein", + "server_url": "http://127.0.0.1:8080", + "start_server": true + }, + "class_type": "GmlxVAELoader", + "_meta": { + "title": "gmlx VAE Loader" + } + }, + "4": { + "inputs": { + "clip": [ + "2", + 0 + ], + "text": "A lighthouse on a rocky coast at dawn, waves breaking on the rocks, soft golden light, photograph" + }, + "class_type": "CLIPTextEncode", + "_meta": { + "title": "Positive prompt" + } + }, + "5": { + "inputs": { + "conditioning": [ + "4", + 0 + ] + }, + "class_type": "ConditioningZeroOut", + "_meta": { + "title": "Negative (unused at cfg 1)" + } + }, + "6": { + "inputs": { + "width": 1024, + "height": 1024, + "batch_size": 1 + }, + "class_type": "EmptyFlux2LatentImage", + "_meta": { + "title": "Empty latent" + } + }, + "7": { + "inputs": { + "steps": 4, + "width": 1024, + "height": 1024 + }, + "class_type": "Flux2Scheduler", + "_meta": { + "title": "Schedule" + } + }, + "8": { + "inputs": { + "noise_seed": 42 + }, + "class_type": "RandomNoise", + "_meta": { + "title": "Noise" + } + }, + "9": { + "inputs": { + "sampler_name": "euler" + }, + "class_type": "KSamplerSelect", + "_meta": { + "title": "Sampler" + } + }, + "10": { + "inputs": { + "model": [ + "1", + 0 + ], + "positive": [ + "4", + 0 + ], + "negative": [ + "5", + 0 + ], + "cfg": 1.0 + }, + "class_type": "CFGGuider", + "_meta": { + "title": "Guider" + } + }, + "11": { + "inputs": { + "noise": [ + "8", + 0 + ], + "guider": [ + "10", + 0 + ], + "sampler": [ + "9", + 0 + ], + "sigmas": [ + "7", + 0 + ], + "latent_image": [ + "6", + 0 + ] + }, + "class_type": "SamplerCustomAdvanced", + "_meta": { + "title": "Sample" + } + }, + "12": { + "inputs": { + "samples": [ + "11", + 0 + ], + "vae": [ + "3", + 0 + ] + }, + "class_type": "VAEDecode", + "_meta": { + "title": "VAE Decode" + } + }, + "13": { + "inputs": { + "images": [ + "12", + 0 + ], + "filename_prefix": "gmlx/flux-2-klein" + }, + "class_type": "SaveImage", + "_meta": { + "title": "Save Image" + } + } +} diff --git a/tests/commands/test_image_pull.py b/tests/commands/test_image_pull.py index 3ea06bb71..59cc6d226 100644 --- a/tests/commands/test_image_pull.py +++ b/tests/commands/test_image_pull.py @@ -477,16 +477,23 @@ def test_image_flags_need_an_image_model_name(capsys): assert "go with an image model name" in capsys.readouterr().err -def test_json_prints_the_plan(lib, monkeypatch, capsys): +@pytest.mark.parametrize("name, vae_license", [("z-image-turbo", None), + ("flux-2-klein", "apache-2.0")]) +def test_json_prints_the_plan(lib, monkeypatch, capsys, name, vae_license): root, cfg = lib + r = catalog.recipe(name) Disk(monkeypatch, root) _downloads(monkeypatch) - _packs(monkeypatch) - assert manage.cmd_pull(["z-image-turbo", "--config", str(cfg), + _packs(monkeypatch, sha=r.vae_sha256) + monkeypatch.setattr(catalog, "vae_identity", + lambda p: (r.family, r.vae_sha256)) + assert manage.cmd_pull([name, "--config", str(cfg), "--json", "--no-register"]) == 0 out = capsys.readouterr().out plan = json.loads(out[:out.index("\n}\n") + 2]) assert plan["memory_class"] == 32 and plan["license"] == "apache-2.0" + assert (plan["encoder_license"], plan["vae_license"]) == ( + "apache-2.0", vae_license) assert [p["role"] for p in plan["parts"]] == ["dit", "encoder", "vae"] assert _cfg(cfg).image_models == {} @@ -595,12 +602,18 @@ def test_the_json_plan_names_the_size_the_entry_gets(lib, monkeypatch, F = catalog.RECIPES["flux-3-klein"] FB = catalog.RECIPES["flux-3-klein-base"] +F2 = catalog.RECIPES["flux-2-klein"] +F2B = catalog.RECIPES["flux-2-klein-base"] K = catalog.RECIPES["krea-2-turbo"] +# The family each pack of the FLUX.2 autoencoder names: the pull's. +_PACKED_FOR: dict = {} def _shared_scan(roots, *, recursive=True, families=None): - """What catalog.scan sees of Krea 2 and FLUX.3 files: the Qwen3-VL-4B - file is the encoder of both families.""" + """What catalog.scan sees of Krea 2, FLUX.2 and FLUX.3 files: the + Qwen3-VL-4B file is the encoder of Krea 2 and FLUX.3, and the pack of + the FLUX.2 autoencoder serves both klein families, whichever it + names.""" out = [] for r in roots: for d, _s, files in os.walk(r): @@ -612,14 +625,24 @@ def _shared_scan(roots, *, recursive=True, families=None): elif f.startswith("flux3_image_klein-"): out.append(catalog.ImageFile(p, "dit", "flux3_klein", "base")) + elif f.startswith("flux-2-klein-base-4b-"): + out.append(catalog.ImageFile(p, "dit", "flux2_klein", + "base")) + elif f.startswith("flux-2-klein-4b-"): + out.append(catalog.ImageFile(p, "dit", "flux2_klein", + "distilled")) elif f.startswith("Krea-2-Turbo-"): out.append(catalog.ImageFile(p, "dit", "krea2", "turbo")) elif f.startswith("Qwen3-VL-4B-Instruct-"): out += [catalog.ImageFile(p, "encoder", fam) for fam in ("krea2", "flux3_klein")] + elif f.startswith("Qwen3-4B-"): + out.append(catalog.ImageFile(p, "encoder", "flux2_klein")) elif f == F.vae_pack: - out.append(catalog.ImageFile(p, "vae", "flux3_klein", - sha256=F.vae_sha256)) + label = _PACKED_FOR.get(p, "flux3_klein") + out += [catalog.ImageFile(p, "vae", fam, + sha256=F.vae_sha256) + for fam in catalog.vae_families(label)] elif f == K.vae_pack: out.append(catalog.ImageFile(p, "vae", "krea2", sha256=K.vae_sha256)) @@ -642,6 +665,7 @@ def _shared_pull(lib, monkeypatch, name, ram_gb=32): def pack(src, dst, **kw): with open(dst, "wb") as f: f.write(b"g") + _PACKED_FOR[str(dst)] = kw["family"] packed.append((src, kw)) monkeypatch.setattr(vae_pkg, "pack_vae", pack) @@ -655,7 +679,7 @@ def pack(src, dst, **kw): (FB, 24, "Q8_0", "BASE/flux3_image_klein-"), (FB, 16, "Q4_K_M", "BASE/flux3_image_klein-"), ]) -def test_a_flux3_pull_takes_its_variant_folder_and_packs_the_comfy_vae( +def test_a_flux3_pull_takes_its_variant_folder_and_packs_bfls_vae( lib, monkeypatch, capsys, r, ram_gb, quant, folder): root, cfg = lib got, packed, m = _shared_pull(lib, monkeypatch, r.name, ram_gb) @@ -663,17 +687,9 @@ def test_a_flux3_pull_takes_its_variant_folder_and_packs_the_comfy_vae( ram_gb << 30)][0] == quant assert (r.dit_repo, f"{folder}{quant}.gguf", "main") in got assert (r.encoder_repo, "Qwen3-VL-4B-Instruct-Q8_0.gguf", "main") in got - # The FLUX.2 VAE folder holds no config.json, so only the safetensors - # comes, and its folders go with it after the pack. - assert [g for g in got if g[0] == r.vae_repo] == [ - (r.vae_repo, r.vae_file, r.vae_revision)] - ((src, kw),) = packed - assert kw["config_json"] == "{}" and kw["family"] == "flux3_klein" - assert kw["source_revision"] == r.vae_revision - assert not (root / "Comfy-Org__flux2-dev" / "split_files").exists() + _bfls_vae(root, r, got, packed, m, "flux3_klein") assert m.path == f"realrebelai__FLUX-3-Image-Klein_GGUFs/{folder}{quant}.gguf" assert (root / m.path).is_file() - assert m.vae == "Comfy-Org__flux2-dev/flux2-vae-F32.gguf" assert m.encoder_mmproj is None and not m.defaults.get("size") assert (f"license: {r.title} flux-kommunity, non-commercial use, and " "commercial use of the images only under $5M annual revenue, " @@ -681,33 +697,92 @@ def test_a_flux3_pull_takes_its_variant_folder_and_packs_the_comfy_vae( "image for unlawful or infringing content before it is shared, " "and a disclosure that it is made with AI where the law requires " "one (https://huggingface.co/black-forest-labs/flux-3-image-klein/" - "blob/main/LICENSE.md); encoder apache-2.0" + "blob/main/LICENSE.md); encoder apache-2.0; VAE apache-2.0" in capsys.readouterr().out) +def _bfls_vae(root, r, got, packed, m, family): + """The FLUX.2 autoencoder comes from BFL's FLUX.2 klein 4B repo, the + safetensors and its config.json at the pinned revision, packs in its + own dtype for ``family``, and its folder goes after the pack.""" + assert (r.vae_repo, r.vae_revision) == ( + "black-forest-labs/FLUX.2-klein-4B", + "e7b7dc27f91deacad38e78976d1f2b499d76a294") + assert [g for g in got if g[0] == r.vae_repo] == [ + (r.vae_repo, "vae/diffusion_pytorch_model.safetensors", + r.vae_revision), + (r.vae_repo, "vae/config.json", r.vae_revision)] + ((_src, kw),) = packed + assert kw["config_json"] == "{}" and kw["family"] == family + assert kw["source_revision"] == r.vae_revision + assert kw.get("dtype") is None + assert not (root / "black-forest-labs__FLUX.2-klein-4B" / "vae").exists() + assert m.vae == "black-forest-labs__FLUX.2-klein-4B/flux2-vae-BF16.gguf" + + +@pytest.mark.parametrize("r, ram_gb, quant", [ + (F2, 32, "Q8_0"), (F2, 16, "Q4_K_M"), (F2B, 24, "Q8_0"), + (F2B, 16, "Q4_K_M")]) +def test_a_flux2_pull_takes_unsloths_dit_qwen3_4b_and_bfls_vae( + lib, monkeypatch, capsys, r, ram_gb, quant): + root, cfg = lib + got, packed, m = _shared_pull(lib, monkeypatch, r.name, ram_gb) + assert catalog.DEFAULT_QUANTS[r.name][catalog.memory_class( + ram_gb << 30)] == (quant, "Q8_0") + base = r.variant == "base" + stem = "flux-2-klein-base-4b" if base else "flux-2-klein-4b" + assert (r.dit_repo, f"{stem}-{quant}.gguf", "main") in got + assert ("unsloth/Qwen3-4B-GGUF", "Qwen3-4B-Q8_0.gguf", "main") in got + _bfls_vae(root, r, got, packed, m, "flux2_klein") + assert m.path == f"{r.dit_repo.replace('/', '__')}/{stem}-{quant}.gguf" + assert m.encoder == "unsloth__Qwen3-4B-GGUF/Qwen3-4B-Q8_0.gguf" + assert m.encoder_mmproj is None and not m.defaults.get("size") + repo = "FLUX.2-klein-base-4B" if base else "FLUX.2-klein-4B" + assert (f"license: {r.title} apache-2.0 (https://huggingface.co/" + f"black-forest-labs/{repo}/blob/main/LICENSE.md); encoder " + "apache-2.0; VAE apache-2.0" in capsys.readouterr().out) + + +@pytest.mark.parametrize("first, then", [("flux-3-klein", "flux-2-klein"), + ("flux-2-klein-base", + "flux-3-klein-base")]) +def test_a_klein_pull_takes_the_vae_the_other_klein_family_packed( + lib, monkeypatch, first, then): + """FLUX.2 klein and FLUX.3 klein decode with the FLUX.2 autoencoder, + so the pack one pulled serves the other, whichever family it names.""" + _PACKED_FOR.clear() + _got, packed, a = _shared_pull(lib, monkeypatch, first) + assert [kw["family"] for _s, kw in packed] == [ + catalog.recipe(first).family] + got, packed, b = _shared_pull(lib, monkeypatch, then) + assert catalog.recipe(then).vae_repo not in [g[0] for g in got] + assert packed == [] and b.vae == a.vae + + def test_a_flux3_pull_removes_only_the_vae_folders_it_empties( lib, monkeypatch): - """The other files of the VAE repo's folder, in split_files and beside - it, stay after the pack.""" + """The other files of the VAE repo's folder, in vae and beside it, + stay after the pack.""" root, cfg = lib - repo = root / "Comfy-Org__flux2-dev" - keep = [repo / "split_files" / "diffusion_models" / "flux2-dev.bin", - repo / "notes.txt"] + repo = root / "black-forest-labs__FLUX.2-klein-4B" + keep = [repo / "vae" / "notes.txt", repo / "transformer" / "config.json", + repo / "LICENSE.md"] for k in keep: k.parent.mkdir(parents=True, exist_ok=True) k.write_bytes(b"k") _shared_pull(lib, monkeypatch, "flux-3-klein") assert all(k.read_bytes() == b"k" for k in keep) - assert not (repo / "split_files" / "vae").exists() + assert not (repo / "vae" / "diffusion_pytorch_model.safetensors").exists() + assert not (repo / "vae" / "config.json").exists() assert (repo / F.vae_pack).is_file() def test_a_flux3_pull_after_krea_2_shares_its_encoder_file(lib, monkeypatch): got, _, krea = _shared_pull(lib, monkeypatch, "krea-2-turbo") got, _, flux = _shared_pull(lib, monkeypatch, "flux-3-klein") - # Only the DiT and the VAE download: the encoder Krea 2's pull fetched - # is FLUX.3's too, by its weights. - assert [g[0] for g in got] == [F.dit_repo, F.vae_repo] + # Only the DiT and the VAE with its config download: the encoder Krea + # 2's pull fetched is FLUX.3's too, by its weights. + assert [g[0] for g in got] == [F.dit_repo, F.vae_repo, F.vae_repo] assert flux.encoder == krea.encoder assert flux.encoder.endswith("Qwen3-VL-4B-Instruct-Q8_0.gguf") got, _, base = _shared_pull(lib, monkeypatch, "flux-3-klein-base") @@ -1178,6 +1253,30 @@ def test_doctor_flags_a_vae_of_another_family(images, monkeypatch): assert "qi:" not in row["detail"] +@pytest.mark.parametrize("fam, label, ok", [ + ("flux2_klein", "flux3_klein", True), ("flux3_klein", "flux2_klein", True), + ("flux2_klein", "krea2", False)]) +def test_doctor_takes_a_klein_vae_named_for_the_other_klein_family( + images, monkeypatch, fam, label, ok): + """FLUX.2 klein and FLUX.3 klein decode with the FLUX.2 autoencoder, + so a pack named for either passes for both.""" + import gmlx.commands.doctor as doctor + from gmlx.config import load_config + + _lib, cfg = images + monkeypatch.setattr(catalog, "dit_identity", lambda p: ( + (fam, "distilled") if os.path.basename(p) == "zit.gguf" + else ("qwen_image21", "base"))) + monkeypatch.setattr(catalog, "vae_identity", lambda p: ( + (label, None) if os.path.basename(p) == "zvae.gguf" + else ("qwen_image21", None))) + monkeypatch.setattr(catalog, "encoder_matches", lambda p, f, kv=None: True) + monkeypatch.setattr(catalog, "mmproj_matches", lambda p, f: True) + row = doctor.check_image(load_config(cfg)) + assert (row["status"] == "PASS") is ok + assert (f"zit: the VAE is not the {fam} VAE" in row["detail"]) is not ok + + def test_doctor_memory_counts_an_image_model_with_its_parts(images, monkeypatch): import gmlx.commands.doctor as doctor diff --git a/tests/e2e/run_image_api_e2e.py b/tests/e2e/run_image_api_e2e.py index f052e0f93..f9cdf5569 100644 --- a/tests/e2e/run_image_api_e2e.py +++ b/tests/e2e/run_image_api_e2e.py @@ -54,19 +54,28 @@ "DISTILLED", "flux3_image_klein_sd-Q4_K_M.gguf"), "f_encoder": os.path.join(_GGUF, "unsloth__Qwen3-VL-4B-Instruct-GGUF", "Qwen3-VL-4B-Instruct-Q8_0.gguf"), - "f_vae": os.path.join(_GGUF, "Comfy-Org__flux2-dev", - "flux2-vae-F32.gguf"), + "f_vae": os.path.join(_GGUF, "black-forest-labs__FLUX.2-klein-4B", + "flux2-vae-BF16.gguf"), + "f2_dit": os.path.join(_GGUF, "unsloth__FLUX.2-klein-4B-GGUF", + "flux-2-klein-4b-Q4_K_M.gguf"), + "f2_encoder": os.path.join(_GGUF, "unsloth__Qwen3-4B-GGUF", + "Qwen3-4B-Q8_0.gguf"), + "f2_vae": os.path.join(_GGUF, "black-forest-labs__FLUX.2-klein-4B", + "flux2-vae-BF16.gguf"), } FAMILIES = (("z", "z-image-turbo"), ("qwen", "qwen-image"), - ("flux", "flux-3-klein")) -# The --family choices: each family, both of the first two, and all three. + ("flux", "flux-3-klein"), ("flux2", "flux-2-klein")) +# The --family choices: each family, both of the first two, and all four. CHOICES = {"z": ("z",), "qwen": ("qwen",), "flux": ("flux",), - "both": ("z", "qwen"), "all": ("z", "qwen", "flux")} + "flux2": ("flux2",), "both": ("z", "qwen"), + "all": ("z", "qwen", "flux", "flux2")} # The DEFAULTS keys of each family's files. -PREFIX = {"z": "z_", "qwen": "q_", "flux": "f_"} +PREFIX = {"z": "z_", "qwen": "q_", "flux": "f_", "flux2": "f2_"} # How to make a file a pull packs rather than downloads. -MAKE = {"f_vae": "gmlx pull flux-3-klein packs the FLUX.2 VAE there, or " - "pass the GGUF that gmlx image pack-vae wrote"} +_PACK = ("packs the FLUX.2 VAE there, or pass the GGUF that gmlx image " + "pack-vae wrote") +MAKE = {"f_vae": f"gmlx pull flux-3-klein {_PACK}", + "f2_vae": f"gmlx pull flux-2-klein {_PACK}"} def missing_files(a) -> list: @@ -104,6 +113,10 @@ def _config(a) -> dict: # The encoder reads the prompt alone: no vision tower. image_models["flux-3-klein"] = { "path": a.f_dit, "encoder": a.f_encoder, "vae": a.f_vae} + if "flux2" in families: + # The encoder reads the prompt alone: no vision tower. + image_models["flux-2-klein"] = { + "path": a.f2_dit, "encoder": a.f2_encoder, "vae": a.f2_vae} return {"models": models, "image_models": image_models, "server": {"defaults": {"model": "chat", @@ -218,7 +231,7 @@ def stream(): def edit(): src = made["png"] - if family in ("qwen", "flux"): + if family in ("qwen", "flux", "flux2"): r = client.images.edit(model=model, image=[("a.png", src, "image/png"), ("b.png", src, "image/png")], prompt="put the two lighthouses side by side", @@ -230,8 +243,10 @@ def edit(): assert _decode(r.data[0].b64_json).size == (512, 512) def edit_unsized(): - # One reference off the 16 pixel grid is padded to its canvas, and - # the output is cropped back to the image's own size. + # FLUX.3 klein pads one reference off the 16 pixel grid to its + # canvas and crops the output back to the image's own size. FLUX.2 + # klein crops the reference to the grid, and the output keeps the + # cropped size. from PIL import Image buf = io.BytesIO() @@ -241,7 +256,7 @@ def edit_unsized(): "image/png"), prompt="the same lighthouse at night") got = _decode(r.data[0].b64_json).size - assert got == (500, 300), got + assert got == ((496, 288) if family == "flux2" else (500, 300)), got return f"{got[0]}x{got[1]}" def edit_stream(): @@ -285,8 +300,8 @@ def refusals(): except BadRequestError: continue raise AssertionError(f"no 400 for {kw}") - if family == "flux": - # The most references FLUX.3 klein takes. + if family in ("flux", "flux2"): + # The most references either klein takes. src = ("a.png", made["png"], "image/png") try: client.images.edit(model=model, image=[src] * 11, prompt="x") @@ -299,7 +314,7 @@ def refusals(): rep.check(f"{tag} generations url jpeg", gen_url) rep.check(f"{tag} stream partial_images=2", stream) rep.check(f"{tag} edits", edit) - if family == "flux": + if family in ("flux", "flux2"): rep.check(f"{tag} edits without a size", edit_unsized) rep.check(f"{tag} edits stream", edit_stream) rep.check(f"{tag} variations", variation) @@ -417,7 +432,7 @@ def main() -> int: ap.add_argument("--out", required=True) ap.add_argument("--family", choices=tuple(CHOICES), default="both", help="both is Z-Image and Qwen-Image, all adds FLUX.3 " - "klein") + "klein and FLUX.2 klein") for k, v in DEFAULTS.items(): ap.add_argument("--" + k.replace("_", "-"), dest=k, default=v) ap.add_argument("--with-chat", action="store_true", diff --git a/tests/fixtures/image/flux2_klein_4b_q8_0.header.json b/tests/fixtures/image/flux2_klein_4b_q8_0.header.json new file mode 100644 index 000000000..c722a0d7f --- /dev/null +++ b/tests/fixtures/image/flux2_klein_4b_q8_0.header.json @@ -0,0 +1,156 @@ +{ + "gguf_version": 3, + "kv": {"general.architecture": "flux"}, + "n_tensors": 149, + "tensors": [ + ["double_blocks.0.img_attn.norm.key_norm.scale", [128], "F32"], + ["double_blocks.0.img_attn.norm.query_norm.scale", [128], "F32"], + ["double_blocks.0.img_attn.proj.weight", [3072, 3072], "Q8_0"], + ["double_blocks.0.img_attn.qkv.weight", [3072, 9216], "Q8_0"], + ["double_blocks.0.img_mlp.0.weight", [3072, 18432], "Q8_0"], + ["double_blocks.0.img_mlp.2.weight", [9216, 3072], "Q8_0"], + ["double_blocks.0.txt_attn.norm.key_norm.scale", [128], "F32"], + ["double_blocks.0.txt_attn.norm.query_norm.scale", [128], "F32"], + ["double_blocks.0.txt_attn.proj.weight", [3072, 3072], "Q8_0"], + ["double_blocks.0.txt_attn.qkv.weight", [3072, 9216], "Q8_0"], + ["double_blocks.0.txt_mlp.0.weight", [3072, 18432], "Q8_0"], + ["double_blocks.0.txt_mlp.2.weight", [9216, 3072], "Q8_0"], + ["double_blocks.1.img_attn.norm.key_norm.scale", [128], "F32"], + ["double_blocks.1.img_attn.norm.query_norm.scale", [128], "F32"], + ["double_blocks.1.img_attn.proj.weight", [3072, 3072], "Q8_0"], + ["double_blocks.1.img_attn.qkv.weight", [3072, 9216], "Q8_0"], + ["double_blocks.1.img_mlp.0.weight", [3072, 18432], "Q8_0"], + ["double_blocks.1.img_mlp.2.weight", [9216, 3072], "Q8_0"], + ["double_blocks.1.txt_attn.norm.key_norm.scale", [128], "F32"], + ["double_blocks.1.txt_attn.norm.query_norm.scale", [128], "F32"], + ["double_blocks.1.txt_attn.proj.weight", [3072, 3072], "Q8_0"], + ["double_blocks.1.txt_attn.qkv.weight", [3072, 9216], "Q8_0"], + ["double_blocks.1.txt_mlp.0.weight", [3072, 18432], "Q8_0"], + ["double_blocks.1.txt_mlp.2.weight", [9216, 3072], "Q8_0"], + ["double_blocks.2.img_attn.norm.key_norm.scale", [128], "F32"], + ["double_blocks.2.img_attn.norm.query_norm.scale", [128], "F32"], + ["double_blocks.2.img_attn.proj.weight", [3072, 3072], "Q8_0"], + ["double_blocks.2.img_attn.qkv.weight", [3072, 9216], "Q8_0"], + ["double_blocks.2.img_mlp.0.weight", [3072, 18432], "Q8_0"], + ["double_blocks.2.img_mlp.2.weight", [9216, 3072], "Q8_0"], + ["double_blocks.2.txt_attn.norm.key_norm.scale", [128], "F32"], + ["double_blocks.2.txt_attn.norm.query_norm.scale", [128], "F32"], + ["double_blocks.2.txt_attn.proj.weight", [3072, 3072], "Q8_0"], + ["double_blocks.2.txt_attn.qkv.weight", [3072, 9216], "Q8_0"], + ["double_blocks.2.txt_mlp.0.weight", [3072, 18432], "Q8_0"], + ["double_blocks.2.txt_mlp.2.weight", [9216, 3072], "Q8_0"], + ["double_blocks.3.img_attn.norm.key_norm.scale", [128], "F32"], + ["double_blocks.3.img_attn.norm.query_norm.scale", [128], "F32"], + ["double_blocks.3.img_attn.proj.weight", [3072, 3072], "Q8_0"], + ["double_blocks.3.img_attn.qkv.weight", [3072, 9216], "Q8_0"], + ["double_blocks.3.img_mlp.0.weight", [3072, 18432], "Q8_0"], + ["double_blocks.3.img_mlp.2.weight", [9216, 3072], "Q8_0"], + ["double_blocks.3.txt_attn.norm.key_norm.scale", [128], "F32"], + ["double_blocks.3.txt_attn.norm.query_norm.scale", [128], "F32"], + ["double_blocks.3.txt_attn.proj.weight", [3072, 3072], "Q8_0"], + ["double_blocks.3.txt_attn.qkv.weight", [3072, 9216], "Q8_0"], + ["double_blocks.3.txt_mlp.0.weight", [3072, 18432], "Q8_0"], + ["double_blocks.3.txt_mlp.2.weight", [9216, 3072], "Q8_0"], + ["double_blocks.4.img_attn.norm.key_norm.scale", [128], "F32"], + ["double_blocks.4.img_attn.norm.query_norm.scale", [128], "F32"], + ["double_blocks.4.img_attn.proj.weight", [3072, 3072], "Q8_0"], + ["double_blocks.4.img_attn.qkv.weight", [3072, 9216], "Q8_0"], + ["double_blocks.4.img_mlp.0.weight", [3072, 18432], "Q8_0"], + ["double_blocks.4.img_mlp.2.weight", [9216, 3072], "Q8_0"], + ["double_blocks.4.txt_attn.norm.key_norm.scale", [128], "F32"], + ["double_blocks.4.txt_attn.norm.query_norm.scale", [128], "F32"], + ["double_blocks.4.txt_attn.proj.weight", [3072, 3072], "Q8_0"], + ["double_blocks.4.txt_attn.qkv.weight", [3072, 9216], "Q8_0"], + ["double_blocks.4.txt_mlp.0.weight", [3072, 18432], "Q8_0"], + ["double_blocks.4.txt_mlp.2.weight", [9216, 3072], "Q8_0"], + ["double_stream_modulation_img.lin.weight", [3072, 18432], "BF16"], + ["double_stream_modulation_txt.lin.weight", [3072, 18432], "BF16"], + ["final_layer.adaLN_modulation.1.weight", [3072, 6144], "BF16"], + ["final_layer.linear.weight", [3072, 128], "BF16"], + ["img_in.weight", [128, 3072], "BF16"], + ["single_blocks.0.linear1.weight", [3072, 27648], "Q8_0"], + ["single_blocks.0.linear2.weight", [12288, 3072], "Q8_0"], + ["single_blocks.0.norm.key_norm.scale", [128], "F32"], + ["single_blocks.0.norm.query_norm.scale", [128], "F32"], + ["single_blocks.1.linear1.weight", [3072, 27648], "Q8_0"], + ["single_blocks.1.linear2.weight", [12288, 3072], "Q8_0"], + ["single_blocks.1.norm.key_norm.scale", [128], "F32"], + ["single_blocks.1.norm.query_norm.scale", [128], "F32"], + ["single_blocks.10.linear1.weight", [3072, 27648], "Q8_0"], + ["single_blocks.10.linear2.weight", [12288, 3072], "Q8_0"], + ["single_blocks.10.norm.key_norm.scale", [128], "F32"], + ["single_blocks.10.norm.query_norm.scale", [128], "F32"], + ["single_blocks.11.linear1.weight", [3072, 27648], "Q8_0"], + ["single_blocks.11.linear2.weight", [12288, 3072], "Q8_0"], + ["single_blocks.11.norm.key_norm.scale", [128], "F32"], + ["single_blocks.11.norm.query_norm.scale", [128], "F32"], + ["single_blocks.12.linear1.weight", [3072, 27648], "Q8_0"], + ["single_blocks.12.linear2.weight", [12288, 3072], "Q8_0"], + ["single_blocks.12.norm.key_norm.scale", [128], "F32"], + ["single_blocks.12.norm.query_norm.scale", [128], "F32"], + ["single_blocks.13.linear1.weight", [3072, 27648], "Q8_0"], + ["single_blocks.13.linear2.weight", [12288, 3072], "Q8_0"], + ["single_blocks.13.norm.key_norm.scale", [128], "F32"], + ["single_blocks.13.norm.query_norm.scale", [128], "F32"], + ["single_blocks.14.linear1.weight", [3072, 27648], "Q8_0"], + ["single_blocks.14.linear2.weight", [12288, 3072], "Q8_0"], + ["single_blocks.14.norm.key_norm.scale", [128], "F32"], + ["single_blocks.14.norm.query_norm.scale", [128], "F32"], + ["single_blocks.15.linear1.weight", [3072, 27648], "Q8_0"], + ["single_blocks.15.linear2.weight", [12288, 3072], "Q8_0"], + ["single_blocks.15.norm.key_norm.scale", [128], "F32"], + ["single_blocks.15.norm.query_norm.scale", [128], "F32"], + ["single_blocks.16.linear1.weight", [3072, 27648], "Q8_0"], + ["single_blocks.16.linear2.weight", [12288, 3072], "Q8_0"], + ["single_blocks.16.norm.key_norm.scale", [128], "F32"], + ["single_blocks.16.norm.query_norm.scale", [128], "F32"], + ["single_blocks.17.linear1.weight", [3072, 27648], "Q8_0"], + ["single_blocks.17.linear2.weight", [12288, 3072], "Q8_0"], + ["single_blocks.17.norm.key_norm.scale", [128], "F32"], + ["single_blocks.17.norm.query_norm.scale", [128], "F32"], + ["single_blocks.18.linear1.weight", [3072, 27648], "Q8_0"], + ["single_blocks.18.linear2.weight", [12288, 3072], "Q8_0"], + ["single_blocks.18.norm.key_norm.scale", [128], "F32"], + ["single_blocks.18.norm.query_norm.scale", [128], "F32"], + ["single_blocks.19.linear1.weight", [3072, 27648], "Q8_0"], + ["single_blocks.19.linear2.weight", [12288, 3072], "Q8_0"], + ["single_blocks.19.norm.key_norm.scale", [128], "F32"], + ["single_blocks.19.norm.query_norm.scale", [128], "F32"], + ["single_blocks.2.linear1.weight", [3072, 27648], "Q8_0"], + ["single_blocks.2.linear2.weight", [12288, 3072], "Q8_0"], + ["single_blocks.2.norm.key_norm.scale", [128], "F32"], + ["single_blocks.2.norm.query_norm.scale", [128], "F32"], + ["single_blocks.3.linear1.weight", [3072, 27648], "Q8_0"], + ["single_blocks.3.linear2.weight", [12288, 3072], "Q8_0"], + ["single_blocks.3.norm.key_norm.scale", [128], "F32"], + ["single_blocks.3.norm.query_norm.scale", [128], "F32"], + ["single_blocks.4.linear1.weight", [3072, 27648], "Q8_0"], + ["single_blocks.4.linear2.weight", [12288, 3072], "Q8_0"], + ["single_blocks.4.norm.key_norm.scale", [128], "F32"], + ["single_blocks.4.norm.query_norm.scale", [128], "F32"], + ["single_blocks.5.linear1.weight", [3072, 27648], "Q8_0"], + ["single_blocks.5.linear2.weight", [12288, 3072], "Q8_0"], + ["single_blocks.5.norm.key_norm.scale", [128], "F32"], + ["single_blocks.5.norm.query_norm.scale", [128], "F32"], + ["single_blocks.6.linear1.weight", [3072, 27648], "Q8_0"], + ["single_blocks.6.linear2.weight", [12288, 3072], "Q8_0"], + ["single_blocks.6.norm.key_norm.scale", [128], "F32"], + ["single_blocks.6.norm.query_norm.scale", [128], "F32"], + ["single_blocks.7.linear1.weight", [3072, 27648], "Q8_0"], + ["single_blocks.7.linear2.weight", [12288, 3072], "Q8_0"], + ["single_blocks.7.norm.key_norm.scale", [128], "F32"], + ["single_blocks.7.norm.query_norm.scale", [128], "F32"], + ["single_blocks.8.linear1.weight", [3072, 27648], "Q8_0"], + ["single_blocks.8.linear2.weight", [12288, 3072], "Q8_0"], + ["single_blocks.8.norm.key_norm.scale", [128], "F32"], + ["single_blocks.8.norm.query_norm.scale", [128], "F32"], + ["single_blocks.9.linear1.weight", [3072, 27648], "Q8_0"], + ["single_blocks.9.linear2.weight", [12288, 3072], "Q8_0"], + ["single_blocks.9.norm.key_norm.scale", [128], "F32"], + ["single_blocks.9.norm.query_norm.scale", [128], "F32"], + ["single_stream_modulation.lin.weight", [3072, 9216], "BF16"], + ["time_in.in_layer.weight", [256, 3072], "BF16"], + ["time_in.out_layer.weight", [3072, 3072], "BF16"], + ["txt_in.weight", [7680, 3072], "BF16"] + ] +} diff --git a/tests/fixtures/image/flux2_klein_vae_config.json b/tests/fixtures/image/flux2_klein_vae_config.json new file mode 100644 index 000000000..c3f38eb4c --- /dev/null +++ b/tests/fixtures/image/flux2_klein_vae_config.json @@ -0,0 +1,40 @@ +{ + "_class_name": "AutoencoderKLFlux2", + "_diffusers_version": "0.37.0.dev0", + "_name_or_path": "black-forest-labs/FLUX.2-dev", + "act_fn": "silu", + "batch_norm_eps": 0.0001, + "batch_norm_momentum": 0.1, + "block_out_channels": [ + 128, + 256, + 512, + 512 + ], + "down_block_types": [ + "DownEncoderBlock2D", + "DownEncoderBlock2D", + "DownEncoderBlock2D", + "DownEncoderBlock2D" + ], + "force_upcast": true, + "in_channels": 3, + "latent_channels": 32, + "layers_per_block": 2, + "mid_block_add_attention": true, + "norm_num_groups": 32, + "out_channels": 3, + "patch_size": [ + 2, + 2 + ], + "sample_size": 1024, + "up_block_types": [ + "UpDecoderBlock2D", + "UpDecoderBlock2D", + "UpDecoderBlock2D", + "UpDecoderBlock2D" + ], + "use_post_quant_conv": true, + "use_quant_conv": true +} diff --git a/tests/fixtures/image/manifest.json b/tests/fixtures/image/manifest.json index 916603397..0306ba876 100644 --- a/tests/fixtures/image/manifest.json +++ b/tests/fixtures/image/manifest.json @@ -119,6 +119,14 @@ "sha256": "0b25d143c8469b342bc5af3bce92b783bf6b0636d285f7b2f75e38af63af9a15", "kv_kept": "general.architecture" }, + "flux2_klein_4b_q8_0.header.json": { + "repo": "unsloth/FLUX.2-klein-4B-GGUF", + "revision": "0084d1df98e2e2137fe776d55170bc4792ec1d66", + "file": "flux-2-klein-4b-Q8_0.gguf", + "size": 4300644928, + "sha256": "24a812e8f9b640e21c784164ea48571d8017ca22873696f4badeeabb006d509c", + "kv_kept": "general.architecture" + }, "flux2_klein_9b_q4_k_m.header.json": { "repo": "unsloth/FLUX.2-klein-9B-GGUF", "revision": "fde8634245fe6b749a221c25b34672b5b8fbd079", @@ -212,6 +220,13 @@ "size": 168120878, "sha256": "ca70d2202afe6415bdbcb8793ba8cd99fd159cfe6192381504d6c4d3036e0f04" }, + "flux2_klein_vae_config.json": { + "repo": "black-forest-labs/FLUX.2-klein-4B", + "revision": "e7b7dc27f91deacad38e78976d1f2b499d76a294", + "file": "vae/config.json", + "size": 821, + "sha256": "0d6dfb69ae95a5e2ac9836284bbb63d8b38ce67b25ba2dff380752b2a10ab948" + }, "flux2_klein_diffusers_names.json": { "repo": "black-forest-labs/FLUX.2-klein-4B", "revision": "e7b7dc27f91deacad38e78976d1f2b499d76a294", diff --git a/tests/fixtures/image/oracle/check5_flux2_klein_vae.manifest.json b/tests/fixtures/image/oracle/check5_flux2_klein_vae.manifest.json new file mode 100644 index 000000000..41331539b --- /dev/null +++ b/tests/fixtures/image/oracle/check5_flux2_klein_vae.manifest.json @@ -0,0 +1,362 @@ +{ + "schema": 1, + "name": "check5_flux2_klein_vae", + "check": 5, + "family": "flux3_klein", + "script": "scripts/image_oracle/check5_flux3_klein_vae.py", + "argv": [ + "check5_flux3_klein_vae.py", + "--vae", + "diffusion_pytorch_model.safetensors", + "--sizes", + "512", + "1024" + ], + "oracle": { + "python": "3.12.11", + "platform": "macOS-26.5-arm64-arm-64bit", + "machine": "arm64", + "packages": { + "torch": { + "version": "2.14.1" + }, + "diffusers": { + "version": "0.41.0.dev0", + "source": "https://github.com/huggingface/diffusers/archive/e0abab83b5df05de9e7abd788643c1a7c1e42e28.tar.gz" + }, + "transformers": { + "version": "5.18.0" + }, + "tokenizers": { + "version": "0.23.2" + }, + "accelerate": { + "version": "1.15.0" + }, + "huggingface-hub": { + "version": "1.33.0" + }, + "gguf": { + "version": "0.19.0" + }, + "safetensors": { + "version": "0.8.0" + }, + "numpy": { + "version": "2.5.3" + } + }, + "hf_hub_offline": "1" + }, + "files": { + "vae": { + "name": "diffusion_pytorch_model.safetensors", + "size": 168120878, + "sha256": "ca70d2202afe6415bdbcb8793ba8cd99fd159cfe6192381504d6c4d3036e0f04" + }, + "vae_config": { + "name": "config.json", + "size": 821, + "sha256": "0d6dfb69ae95a5e2ac9836284bbb63d8b38ce67b25ba2dff380752b2a10ab948" + } + }, + "inputs": { + "sizes": [ + [ + 512, + 512 + ], + [ + 1024, + 1024 + ] + ], + "seed": 5, + "image": "synthetic_image(height, width, seed) of check5_qwen_image21_vae.py, RGB, NCHW in [-1, 1]", + "batch_norm_eps": 0.0001, + "patch_size": [ + 2, + 2 + ], + "latents": "Flux2KleinPipeline._patchify_latents of the encoder mean, then (z - running_mean) / sqrt(running_var + batch_norm_eps), in float32 from each mode's mean", + "decode_input": "latents * sqrt(running_var + eps) + running_mean, then Flux2KleinPipeline._unpatchify_latents, in float32 from the fp32 latents, cast to the VAE dtype", + "decoded": "RGB, NCHW, unclamped as the VAE returns it", + "psnr": "on x / 2 + 0.5 clamped to [0, 1], peak 1", + "source_dtypes": [ + "torch.bfloat16", + "torch.int64" + ], + "config_revision": "e7b7dc27f91deacad38e78976d1f2b499d76a294", + "load": "AutoencoderKLFlux2.from_config(vae/config.json), then the file strict, in float32" + }, + "results": { + "oracle": { + "device": "cpu", + "threads": 16, + "bf16_products": "bf16 operands, float32 conv and linear, one bf16 rounding" + }, + "sizes": { + "512x512": { + "decode_bf16_vs_fp32": { + "rel_l2": 0.0037208575728741337, + "cosine": 0.9999931108294154, + "max_abs": 0.07782581448554993, + "psnr_db": 59.46044809994699 + }, + "encode_bf16_vs_fp32": { + "rel_l2": 0.01739012329408501, + "cosine": 0.9998490640077118, + "max_abs": 0.19057875871658325 + }, + "encode_fp32_vs_fp64": { + "rel_l2": 1.85394467142218e-06, + "cosine": 0.999999999998282, + "max_abs": 1.1787637656662797e-05 + }, + "encode_mean_fp32_vs_fp64": { + "rel_l2": 1.8462501499014103e-06, + "cosine": 0.9999999999982965, + "max_abs": 2.1508609541726065e-05 + }, + "decode_fp32_vs_fp64": { + "rel_l2": 1.290729409947131e-06, + "cosine": 0.9999999999991659, + "max_abs": 2.963936126654243e-05 + }, + "round_trip_fp32_psnr_db": 26.8682238506928, + "latents_std": 0.8341149687767029, + "peak_rss_gib": { + "encode": 8.67, + "decode": 14.15 + }, + "seconds": { + "fp32_encode_s": 1.2, + "bf16_encode_s": 1.7, + "fp32_decode_s": 2.4, + "bf16_decode_s": 3.0, + "float64_decode_s": 8.0 + } + }, + "1024x1024": { + "decode_bf16_vs_fp32": { + "rel_l2": 0.0038218185553775446, + "cosine": 0.9999927791916089, + "max_abs": 0.09549552202224731, + "psnr_db": 59.129745883502515 + }, + "encode_bf16_vs_fp32": { + "rel_l2": 0.029780096139354124, + "cosine": 0.9995578754429438, + "max_abs": 0.4994291365146637 + }, + "encode_fp32_vs_fp64": { + "rel_l2": 3.91706261461626e-06, + "cosine": 0.999999999992329, + "max_abs": 3.675377888912035e-05 + }, + "encode_mean_fp32_vs_fp64": { + "rel_l2": 3.887321914440507e-06, + "cosine": 0.9999999999924465, + "max_abs": 6.529417830059003e-05 + }, + "decode_fp32_vs_fp64": { + "rel_l2": 6.312469230535541e-06, + "cosine": 0.999999999980234, + "max_abs": 0.0001617857038869186 + }, + "round_trip_fp32_psnr_db": 26.891196346542486, + "latents_std": 0.7904156446456909, + "peak_rss_gib": { + "encode": 18.41, + "decode": 32.19 + }, + "seconds": { + "fp32_encode_s": 4.8, + "bf16_encode_s": 16.6, + "fp32_decode_s": 10.6, + "bf16_decode_s": 21.7, + "float64_decode_s": 34.5 + } + } + } + }, + "tolerances": { + "rule": "fp32 decode max abs at twice the oracle's own fp32 against float64 max abs; fp32 encode max abs, on the model space latents, at 1e-3, or at twice the oracle's own fp32 against float64 max abs where that is larger; bf16 decode PSNR at twice the oracle's own bf16 against fp32 RMS error, its PSNR less 20 log10(2) dB; bf16 encode relative L2, on the model space latents, at twice the oracle's own", + "fp32_max_abs": 0.001, + "sizes": { + "512x512": { + "decode_fp32_max_abs": 5.927872253308486e-05, + "decode_bf16_psnr_db": 53.43984818666736, + "encode_fp32_max_abs": 0.001, + "encode_bf16_rel_l2": 0.03478024658817002 + }, + "1024x1024": { + "decode_fp32_max_abs": 0.0003235714077738372, + "decode_bf16_psnr_db": 53.10914597022289, + "encode_fp32_max_abs": 0.001, + "encode_bf16_rel_l2": 0.05956019227870825 + } + } + }, + "notes": [ + "The file holds bfloat16 weights, which the fp32 and float64 runs read upcast. The bf16 VAE is a bfloat16 copy with its BatchNorm statistics kept float32." + ], + "created": "2026-10-16T19:02:48Z", + "npz": "check5_flux2_klein_vae.npz", + "tensors": { + "bn_running_mean": { + "shape": [ + 128 + ], + "dtype": "float32", + "sha256": "9027fac5727854f779ebbeae3032cfce0d47a11bc85f4329eb0a317c9ad90217" + }, + "bn_running_var": { + "shape": [ + 128 + ], + "dtype": "float32", + "sha256": "8b4656821cfe8827490068f768f0dba57e09423e900b8b018da097f0c4537009" + }, + "decoded_1024x1024": { + "shape": [ + 1, + 3, + 1024, + 1024 + ], + "dtype": "float32", + "sha256": "b877df123ac14c97784e85e19e449d37304548239ef8cd16380c5ce468854fe5" + }, + "decoded_512x512": { + "shape": [ + 1, + 3, + 512, + 512 + ], + "dtype": "float32", + "sha256": "35d5356b9353573fce7e50f5da6988b312cbb388f42277225a5d2081841f8df3" + }, + "decoded_bf16_1024x1024": { + "shape": [ + 1, + 3, + 1024, + 1024 + ], + "dtype": "float32", + "sha256": "60b21b15764cb3d46837a156883da6644e519a410b8b113dd8e26a7be22dbb3a" + }, + "decoded_bf16_512x512": { + "shape": [ + 1, + 3, + 512, + 512 + ], + "dtype": "float32", + "sha256": "fd9c89ebfa73f2e4873931ceeab9d1f7ea28bccb1797a9ecb8078350ea4a6ce2" + }, + "encode_mean_1024x1024": { + "shape": [ + 1, + 32, + 128, + 128 + ], + "dtype": "float32", + "sha256": "e25c0df3d5be4d976cb92dd01191ec0df279372b74bf5505844aeddb41dfa8ad" + }, + "encode_mean_512x512": { + "shape": [ + 1, + 32, + 64, + 64 + ], + "dtype": "float32", + "sha256": "72c807775e530a0c4fc07a96c4ebff86251dd839d93c135f5a5643050b4a86ad" + }, + "encode_mean_bf16_1024x1024": { + "shape": [ + 1, + 32, + 128, + 128 + ], + "dtype": "float32", + "sha256": "d91533b309cd78a00fb0c5dd0050b70ed397c30d3655e64f508a6a982c6aa4cc" + }, + "encode_mean_bf16_512x512": { + "shape": [ + 1, + 32, + 64, + 64 + ], + "dtype": "float32", + "sha256": "11a390e65832643f0e9a888bd14bae293bf0158dd705b5d9fb56e47b1287a578" + }, + "image_1024x1024": { + "shape": [ + 1, + 3, + 1024, + 1024 + ], + "dtype": "float32", + "sha256": "3930a02c0be88010b140dd1b6c71a1bf518c6f75d78d0ad2fa78942f998cb1a6" + }, + "image_512x512": { + "shape": [ + 1, + 3, + 512, + 512 + ], + "dtype": "float32", + "sha256": "4020c0997410077532d908bbecca27898c4c7b7cfb2d7ba29333177c2c44ee5e" + }, + "latents_1024x1024": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "c87fce5ec93e1ab0acb0d2e56d27af75dcc2d67eb2666abe43bbda04292c5e26" + }, + "latents_512x512": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "280deb3315669ad11024f79090922a6dab13f83fd043e665629eb5225c323811" + }, + "latents_bf16_1024x1024": { + "shape": [ + 1, + 128, + 64, + 64 + ], + "dtype": "float32", + "sha256": "91cedc4bfe75ab2aa1e4e0fc2fb846aa4a68af95eddf503df2149e916e6f2d8f" + }, + "latents_bf16_512x512": { + "shape": [ + 1, + 128, + 32, + 32 + ], + "dtype": "float32", + "sha256": "ce4a39f7da605086a42796276ec3c88a8ebc3d7013acf2b46dcb6d92ad942de0" + } + } +} diff --git a/tests/image/test_image_catalog.py b/tests/image/test_image_catalog.py index 889d6a5a4..c9f3ca182 100644 --- a/tests/image/test_image_catalog.py +++ b/tests/image/test_image_catalog.py @@ -29,6 +29,8 @@ def test_a_recipe_resolves_by_name_or_alias(): assert catalog.recipe_for("flux3_klein", "distilled").name == "flux-3-klein" assert catalog.recipe_for("flux3_klein", "base").name == "flux-3-klein-base" assert catalog.recipe("FLUX-3-Klein").variant == "distilled" + assert catalog.recipe_for("flux2_klein", "distilled").name == "flux-2-klein" + assert catalog.recipe_for("flux2_klein", "base").name == "flux-2-klein-base" @pytest.mark.parametrize("gb, cls", [(8, 16), (16, 16), (18, 16), (24, 24), @@ -153,6 +155,66 @@ def _scan(root, **kw): return chat, images +def test_the_klein_recipes_share_bfls_bf16_flux2_autoencoder(): + """FLUX.2 klein and FLUX.3 klein pull one VAE: BFL's BF16 file of the + FLUX.2 autoencoder at a pinned revision, with its config, packed in its + own dtype under an Apache-2.0 license line.""" + names = ("flux-2-klein", "flux-2-klein-base", "flux-3-klein", + "flux-3-klein-base") + rows = {(r.vae_repo, r.vae_revision, r.vae_file, r.vae_config, + r.vae_sha256, r.vae_pack, r.vae_license, r.vae_bytes) + for r in map(catalog.recipe, names)} + assert rows == {("black-forest-labs/FLUX.2-klein-4B", + "e7b7dc27f91deacad38e78976d1f2b499d76a294", + "vae/diffusion_pytorch_model.safetensors", + "vae/config.json", + "ca70d2202afe6415bdbcb8793ba8cd99fd159cfe6192381504d6c4d3036e0f04", + "flux2-vae-BF16.gguf", "apache-2.0", catalog.recipe( + "flux-2-klein").vae_bytes)} + for name in names[:2]: + r = catalog.recipe(name) + assert (r.family, r.license, r.encoder_license) == ( + "flux2_klein", "apache-2.0", "apache-2.0") + assert (r.encoder_repo, r.encoder_name("Q8_0")) == ( + "unsloth/Qwen3-4B-GGUF", "Qwen3-4B-Q8_0.gguf") + assert r.encoder_bytes == catalog.recipe( + "z-image-turbo").encoder_bytes + assert catalog.recipe("flux-2-klein").dit_name("Q8_0") == \ + "flux-2-klein-4b-Q8_0.gguf" + assert catalog.recipe("flux-2-klein-base").dit_name("Q4_K_M") == \ + "flux-2-klein-base-4b-Q4_K_M.gguf" + + +@pytest.mark.parametrize("label, other", [("flux3_klein", "flux2_klein"), + ("flux2_klein", "flux3_klein")]) +def test_a_pack_of_the_flux2_autoencoder_serves_both_klein_families( + tmp_path, monkeypatch, label, other): + """The scan offers a pack of the FLUX.2 autoencoder to FLUX.2 klein and + FLUX.3 klein whichever family it names, and a pull of either takes it + from disk. A VAE of another autoencoder serves its family alone.""" + from gmlx.commands import image_pull + + assert catalog.vae_families(label) == (label, other) + for fam in ("z_image", "qwen_image21", "krea2", "nonesuch"): + assert catalog.vae_families(fam) == (fam,) + sha = catalog.recipe("flux-2-klein").vae_sha256 + vae = _vae(tmp_path / "flux2-vae-BF16.gguf", family=label, sha=sha) + (tmp_path / "krea").mkdir() + _vae(tmp_path / "krea" / "qwen-image-vae-BF16.gguf", family="krea2") + got = {(f.role, f.family, f.path) for f in catalog.scan([tmp_path])} + assert {g for g in got if g[2] == vae} == {("vae", label, vae), + ("vae", other, vae)} + monkeypatch.setattr(image_pull, "_repo_sizes", lambda *a: {}) + for name in ("flux-2-klein", "flux-2-klein-base", "flux-3-klein", + "flux-3-klein-base"): + plan = image_pull.plan_pull( + catalog.recipe(name), dit_quant="Q8_0", encoder_quant="Q8_0", + encoder_quant_given=False, only=image_pull.PARTS, + roots=[str(tmp_path)], base_dir=str(tmp_path), nest=True) + part = plan.part("vae") + assert (part.path, part.download) == (vae, False), name + + def test_discovery_pairs_a_dit_with_its_encoder_and_vae(tmp_path, tiny_spec, capsys): (tmp_path / "enc").mkdir() @@ -171,6 +233,35 @@ def test_discovery_pairs_a_dit_with_its_encoder_and_vae(tmp_path, tiny_spec, assert "image model" in capsys.readouterr().err +@pytest.mark.parametrize("fam, label", [("flux2_klein", "flux3_klein"), + ("flux3_klein", "flux2_klein")]) +def test_discovery_pairs_a_klein_dit_with_the_other_klein_familys_vae( + tmp_path, tiny_spec, monkeypatch, fam, label): + """A pack of the FLUX.2 autoencoder named for one klein family pairs + with a DiT of the other, and a VAE of another autoencoder beside the + DiT does not.""" + # The klein registry rows give their encoder specs. + spec_of = te.encoder_spec + monkeypatch.setattr(te, "encoder_spec", + lambda f: tiny_spec if f == fam else spec_of(f)) + + def dit_identity(path): + with open(path, "rb") as f: + head = f.read(4096) + return (fam, "distilled") if b"lumina2" in head else None + + monkeypatch.setattr(catalog, "dit_identity", dit_identity) + (tmp_path / "dit").mkdir() + (tmp_path / "vae").mkdir() + _encoder(tmp_path / "Qwen3-4B-Q8_0.gguf") + _dit(tmp_path / "dit" / "klein-Q4_K_M.gguf") + _vae(tmp_path / "dit" / "qwen-image-vae-BF16.gguf", family="krea2") + vae = _vae(tmp_path / "vae" / "flux2-vae-BF16.gguf", family=label) + _chat, images = _scan(tmp_path) + (im,) = images + assert im.vae == vae + + def test_a_configured_chat_model_is_shared_as_the_encoder(tmp_path, tiny_spec): lib = tmp_path / "lib" @@ -293,12 +384,13 @@ def test_a_flux3_pull_takes_the_krea_2_encoder_file_by_its_weights( found = catalog.scan(roots, families=("flux3_klein", "krea2")) dits = [f.path for f in found if f.role == "dit" and f.family == "flux3_klein" and f.variant == r.variant] - vaes = [f for f in found if f.role == "vae" and f.family == "flux3_klein"] + vaes = [f for f in found if f.role == "vae" and f.family == "flux3_klein" + and f.sha256 == r.vae_sha256] encs = {f.family: f.path for f in found if f.role == "encoder"} if not dits or not vaes or "flux3_klein" not in encs: pytest.skip(f"a {r.title} DiT, the Qwen3-VL-4B encoder and the packed " - "FLUX.2 VAE are not all under KQUANT_TEST_GGUF_DIR and " - "GMLX_TEST_IMAGE_DIR") + "BF16 FLUX.2 VAE are not all under KQUANT_TEST_GGUF_DIR " + "and GMLX_TEST_IMAGE_DIR") # One encoder file serves both families. assert encs.get("krea2") == encs["flux3_klein"] plan = image_pull.plan_pull( @@ -308,12 +400,49 @@ def test_a_flux3_pull_takes_the_krea_2_encoder_file_by_its_weights( assert [(p.role, p.download) for p in plan.parts] == [ ("dit", False), ("encoder", False), ("vae", False)] assert plan.part("encoder").path == encs["flux3_klein"] - assert catalog.vae_identity(plan.part("vae").path) == ("flux3_klein", - r.vae_sha256) + label, sha = catalog.vae_identity(plan.part("vae").path) + assert sha == r.vae_sha256 and "flux3_klein" in catalog.vae_families(label) assert catalog.dit_identity(plan.part("dit").path) == ("flux3_klein", r.variant) +@pytest.mark.integration +@pytest.mark.parametrize("name", ["flux-2-klein", "flux-2-klein-base"]) +def test_a_flux2_pull_takes_the_z_image_encoder_and_the_klein_vae_on_disk( + gguf_dir, tmp_path, name): + """The Qwen3-4B file of Z-Image and the FLUX.2 VAE pack, whichever + klein family it names, serve the pull with nothing downloaded.""" + from image_dir import image_dir + + from gmlx.commands import image_pull + + r = catalog.RECIPES[name] + roots = [str(gguf_dir), str(image_dir())] + found = catalog.scan(roots, families=("flux2_klein", "z_image")) + dits = [f.path for f in found if f.role == "dit" + and f.family == "flux2_klein" and f.variant == r.variant] + vaes = [f for f in found if f.role == "vae" and f.family == "flux2_klein" + and f.sha256 == r.vae_sha256] + encs = {f.family: f.path for f in found if f.role == "encoder" + and Path(f.path).name == "Qwen3-4B-Q8_0.gguf"} + if not dits or not vaes or "flux2_klein" not in encs: + pytest.skip(f"a {r.title} DiT, the Qwen3-4B Q8_0 encoder and the " + "packed BF16 FLUX.2 VAE are not all under " + "KQUANT_TEST_GGUF_DIR and GMLX_TEST_IMAGE_DIR") + assert encs.get("z_image") == encs["flux2_klein"] + plan = image_pull.plan_pull( + r, dit_quant=image_pull._quant_of(dits[0]), encoder_quant="Q8_0", + encoder_quant_given=False, only=image_pull.PARTS, roots=roots, + base_dir=str(tmp_path), nest=True) + assert [(p.role, p.download) for p in plan.parts] == [ + ("dit", False), ("encoder", False), ("vae", False)] + assert plan.part("encoder").path == encs["flux2_klein"] + label, sha = catalog.vae_identity(plan.part("vae").path) + assert sha == r.vae_sha256 and "flux2_klein" in catalog.vae_families(label) + assert catalog.dit_identity(plan.part("dit").path) == ("flux2_klein", + r.variant) + + def test_a_32_gb_mac_pulls_qwen_image_at_q8_0_since_its_f16_load_does_not_fit(): assert catalog.default_quants(catalog.RECIPES["qwen-image"], 32 << 30) == ("Q8_0", "Q8_0") diff --git a/tests/image/test_image_check5_flux2_klein.py b/tests/image/test_image_check5_flux2_klein.py new file mode 100644 index 000000000..2fc6d5ad7 --- /dev/null +++ b/tests/image/test_image_check5_flux2_klein.py @@ -0,0 +1,467 @@ +"""Check 5 of the image acceptance gate for FLUX.2 klein: BFL's BF16 VAE. + +FLUX.2 klein and FLUX.3 klein decode with one autoencoder, whose module, +tiny fixture and wrong models test_image_check5_flux3_klein.py holds. gmlx +pulls it for both from BFL's FLUX.2 klein 4B repository, in BF16. Here the +tiny fixture written in BF16 packs losslessly in BF16 for either family and +loads for both, and its F32 file and BF16 rounding load the same bf16 VAE +but for the BatchNorm statistics, which a bf16 VAE keeps float32 from an F32 +file. + +The official rows read BFL's file under GMLX_TEST_IMAGE_DIR against the +oracle fixture at 512 and 1024 pixels, which the oracle wrote from that +file read upcast: the fp32 decode and model space latents to the +manifest's max abs, the bf16 decode PSNR and latents relative L2 to its +gates, a tiled bf16 decode at 1024 pixels to the bf16 PSNR gate of that +size, and a tiled bf16 encode at 1024 within 0.05 relative L2 of the whole +encode with a round trip at 50 dB PSNR against the whole round trip. A +GGUF packed from the file loads the same weights bit for bit and decodes +the same. Beside the Comfy-Org F32 file of FLUX.3's fixture, BFL's file is +its bf16 rounding, and the bf16 decodes of the two differ through the +BatchNorm statistics alone. scripts/image_oracle/check5_flux3_klein_vae.py +writes the fixture. +""" +from __future__ import annotations + +import json +import os +import subprocess +import sys + +import numpy as np +import pytest +from image_dir import sha256, vae_files +from image_fixtures import load_json, official_config +from oracle_fixture import ORACLE, committed, committed_fixture, fixture, fx + +import mlx.core as mx +from mlx.utils import tree_flatten + +# A Mac of 16 GB, as most users run (tests/host_box.py). +pytestmark = pytest.mark.host_gb(16) + +FAMILY = "flux2_klein" +OTHER = "flux3_klein" +NAME = "check5_flux2_klein_vae" +F32_NAME = "check5_flux3_klein_vae" +TINY = "selftest_flux3_klein_vae_tiny" +HEADER = "flux2_klein_vae.header.json" +COUNT = "bn.num_batches_tracked" +BN = ("bn.running_mean", "bn.running_var") +TILED_ENCODE_REL_L2 = 0.05 +TILED_ROUND_TRIP_DB = 50.0 + + +def to_unit(img: np.ndarray) -> np.ndarray: + return np.clip(img.astype(np.float64) / 2 + 0.5, 0.0, 1.0) + + +def bf16_bits(a) -> np.ndarray: + """The bfloat16 bits of ``a`` rounded to nearest even, as uint16.""" + u = np.ascontiguousarray(a, np.float32).view(np.uint32).astype(np.uint64) + return ((u + 0x7FFF + ((u >> 16) & 1)) >> 16).astype(np.uint16) + + +def _write_st(path, tensors: dict, *, bf16: bool) -> str: + """``tensors`` as a safetensors file, names sorted: int64 arrays as + I64, others as BF16 when ``bf16``, else F32.""" + head, blobs, off = {}, [], 0 + for k in sorted(tensors): + a = np.asarray(tensors[k]) + if a.dtype == np.int64: + kind = "I64" + elif bf16: + a, kind = bf16_bits(a), "BF16" + else: + a, kind = np.asarray(a, np.float32), "F32" + raw = np.ascontiguousarray(a).tobytes() + head[k] = {"dtype": kind, "shape": list(a.shape), + "data_offsets": [off, off + len(raw)]} + blobs.append(raw) + off += len(raw) + text = json.dumps(head, separators=(",", ":")).encode() + text += b" " * (-len(text) % 8) + with open(path, "wb") as f: + f.write(len(text).to_bytes(8, "little") + text + b"".join(blobs)) + return str(path) + + +@pytest.fixture(scope="module") +def tiny(): + return committed_fixture(TINY) + + +def _tiny_tensors(tiny) -> dict: + arrays, m = tiny + w = {k[len("weight."):]: v for k, v in arrays.items() + if k.startswith("weight.")} + w[COUNT] = np.array(m["inputs"]["num_batches_tracked"], np.int64) + return w + + +@pytest.fixture +def tiny_f32(tiny, tmp_path): + return _write_st(tmp_path / "f32.safetensors", _tiny_tensors(tiny), + bf16=False) + + +@pytest.fixture +def tiny_bf16(tiny, tmp_path): + return _write_st(tmp_path / "bf16.safetensors", _tiny_tensors(tiny), + bf16=True) + + +def _decode(vae, latents, **kw) -> np.ndarray: + from gmlx.image.vae import tiling + + return np.array(tiling.decode(vae, latents, **kw)).transpose(0, 3, 1, 2) + + +def _latents(vae, image, **kw) -> np.ndarray: + from gmlx.image.vae import tiling + + return np.array(tiling.encode(vae, image.transpose(0, 2, 3, 1), **kw)) + + +def _params(vae) -> dict: + return dict(tree_flatten(vae.parameters())) + + +def _differ(a: dict, b: dict) -> list: + assert a.keys() == b.keys() + return [k for k in a if not mx.array_equal(a[k], b[k]).item()] + + +def _bn_rounded(vae) -> None: + """The BatchNorm statistics of ``vae`` rounded to bfloat16, in float32, + as a bf16 VAE holds them from a BF16 file.""" + for n in ("running_mean", "running_var"): + v = getattr(vae.bn, n) + setattr(vae.bn, n, v.astype(mx.bfloat16).astype(mx.float32)) + + +def test_the_tiny_bf16_file_packs_losslessly_and_serves_both_families( + tiny_bf16, tmp_path): + """BF16 stays BF16 and the batch count I64. A pack for either klein + family loads for both, bit for bit with the file.""" + import gguf + + from gmlx.image import catalog, preflight + from gmlx.image.vae import load_vae, pack_vae, read_header + + assert read_header(tiny_bf16).dtypes["bn.running_var"] == "BF16" + src = {d: _params(load_vae(tiny_bf16, family=FAMILY, dtype=d)) + for d in ("fp32", "bf16")} + for fam in (FAMILY, OTHER): + dst = tmp_path / f"{fam}.gguf" + rep = pack_vae(tiny_bf16, dst, source_repo="r", source_revision="v", + config_json="{}", family=fam) + assert rep.family == fam and rep.lossless and rep.dtype == "source" + r = gguf.GGUFReader(str(dst)) + kinds = {t.name: t.tensor_type.name for t in r.tensors} + assert kinds.pop(COUNT) == "I64" and set(kinds.values()) == {"BF16"} + assert r.fields["gmlx.vae.family"].contents() == fam + assert "gmlx.vae.lossless" not in r.fields + assert preflight.classify(str(dst)) == "vae" + assert catalog.vae_families(fam) == ( + (FAMILY, OTHER) if fam == FAMILY else (OTHER, FAMILY)) + for use in (FAMILY, OTHER): + for d in ("fp32", "bf16"): + got = _params(load_vae(str(dst), family=use, dtype=d)) + assert _differ(src[d], got) == [], (fam, use, d) + + +def test_the_bf16_vae_of_an_f32_file_and_of_its_bf16_rounding( + tiny, tiny_f32, tiny_bf16): + """The bf16 VAE of each holds the same weights, the BatchNorm statistics + apart: full float32 from the F32 file, bf16 values from the BF16 one. + With those rounded the two decode bit for bit the same.""" + from gmlx.image.vae import load_vae + + arrays, _ = tiny + a = load_vae(tiny_f32, family=FAMILY, dtype="bf16") + b = load_vae(tiny_bf16, family=FAMILY, dtype="bf16") + pa, pb = _params(a), _params(b) + assert pa[BN[1]].dtype == pb[BN[1]].dtype == mx.float32 + assert sorted(_differ(pa, pb)) == list(BN) + with mx.stream(mx.cpu): + x = arrays["latents_48x64"] + before = _decode(a, x, tiled=False) + _bn_rounded(a) + assert _differ(_params(a), pb) == [] + after = _decode(a, x, tiled=False) + want = _decode(b, x, tiled=False) + assert not np.array_equal(before, want) + assert np.array_equal(after, want) + + +def test_bfls_config_agrees_with_the_constants(): + from gmlx.image.vae import flux2_ae + + config = load_json("flux2_klein_vae_config.json") + assert flux2_ae.config_disagreements(config) == [] + # FLUX.3 klein's copy, saved by a later diffusers, adds one key unset. + ours, other = (official_config(n) for n in ( + "flux2_klein_vae_config.json", "flux3_klein_vae_config.json")) + assert {k: other[k] for k in ours} == ours + assert {k: v for k, v in other.items() if k not in ours} == { + "decoder_block_out_channels": None} + + +def test_bfls_header_holds_the_flux3_files_tensors_in_bf16(): + """The names and shapes of the Comfy-Org F32 file, every float tensor + BF16, and every parameter of the module filled.""" + from gmlx.image.vae import flux2_ae, reader + + head = load_json(HEADER) + shapes = {n: tuple(s) for n, s, _ in head["tensors"]} + dtypes = {n: d for n, _, d in head["tensors"]} + other = load_json("flux3_klein_vae.header.json") + assert shapes == {n: tuple(s) for n, s, _ in other["tensors"]} + floats = {n: d for n, d in dtypes.items() if n != COUNT} + assert dtypes[COUNT] == "I64" and set(floats.values()) == {"BF16"} + got, names = reader.diffusers_names({n: n for n in shapes}) + assert got == "diffusers" and len(names) == 251 + header = reader.VaeHeader("x", "safetensors", got, names, shapes, dtypes, + {}) + cfg = reader.identify(header, FAMILY) + params = dict(tree_flatten(flux2_ae.Flux2AE(cfg).parameters())) + reader.check_names(header, params, reader.VAES[FAMILY], cfg) + assert set(shapes) - set(params) == {COUNT} + + +# The official files: need them under GMLX_TEST_IMAGE_DIR and the fixture of +# the committed manifest. + +official = pytest.mark.integration + + +@pytest.fixture(scope="module") +def check5(): + if not (ORACLE / f"{NAME}.manifest.json").is_file(): + pytest.skip(f"no committed {NAME} manifest") + return fixture(NAME) + + +@pytest.fixture(scope="module") +def sources(): + """The safetensors VAE files under GMLX_TEST_IMAGE_DIR by sha256.""" + return {sha256(p): p for p in vae_files(FAMILY) + if p.suffix == ".safetensors"} + + +def _source(sources, sha: str, what: str): + if sha not in sources: + pytest.skip(f"{what} is not under GMLX_TEST_IMAGE_DIR") + return sources[sha] + + +@pytest.fixture(scope="module") +def vaes(check5, sources): + """BFL's VAE in a dtype. One is held at a time, so a pass is priced + against the memory of one VAE.""" + import gc + + from gmlx.image.vae import load_vae + + held = {} + + def get(dtype): + path = _source(sources, check5[1]["files"]["vae"]["sha256"], + "the fixture's VAE") + if dtype not in held: + held.clear() + gc.collect() + mx.clear_cache() + held[dtype] = load_vae(path, family=FAMILY, dtype=dtype) + return held[dtype] + + return get + + +def _tf32() -> bool: + from block_gates import tf32 + + return tf32() + + +def _gate_without_tf32(request) -> None: + env = dict(os.environ, MLX_ENABLE_TF32="0") + r = subprocess.run( + [sys.executable, "-m", "pytest", "-q", "-s", "-p", "no:cacheprovider", + request.node.nodeid], cwd=request.config.rootpath, env=env, + capture_output=True, text=True) + for line in r.stdout.splitlines(): + if "[check5]" in line: + print(line[line.index("[check5]"):]) + assert r.returncode == 0, r.stdout[-4000:] + r.stderr[-2000:] + + +def _full(m) -> list: + return [f"{h}x{w}" for h, w in m["inputs"]["sizes"]] + + +@official +def test_the_file_is_the_inventoried_one(check5, vaes): + from gmlx.image import catalog + from gmlx.image.vae import read_header, reader + + path = vaes("bf16").source + want = load_json("manifest.json")[HEADER] + m = check5[1] + # The oracle script is FLUX.3 klein's, and the VAE serves both. + assert m["family"] in catalog.vae_families(FAMILY) + assert want["sha256"] == m["files"]["vae"]["sha256"] + assert m["files"]["vae_config"]["sha256"] == load_json("manifest.json")[ + "flux2_klein_vae_config.json"]["sha256"] + assert os.path.getsize(path) == want["size"] + assert m["inputs"]["config_revision"] == want["revision"] + assert m["inputs"]["source_dtypes"] == ["torch.bfloat16", "torch.int64"] + assert read_header(path).layout == "diffusers" + raw, _ = reader.safetensors_header(path) + raw.pop("__metadata__", None) + assert sorted([n, v["shape"], v["dtype"]] for n, v in raw.items()) \ + == load_json(HEADER)["tensors"] + + +# The fp32 decode at 1024 pixels is priced at 8.45 GiB, more than a 16 GB +# Mac has free beside the weights; users decode in bf16. +@official +@pytest.mark.host_gb(24) +def test_fp32_decode_and_encode_are_within_the_gates(check5, vaes, request): + arrays, m = check5 + vae = vaes("fp32") + failed = [] + for s in _full(m): + t = m["tolerances"]["sizes"][s] + dec = _decode(vae, arrays[f"latents_{s}"], tiled=False) + lat = _latents(vae, arrays[f"image_{s}"], tiled=False) + d = fx.max_abs(dec, arrays[f"decoded_{s}"]) + e = fx.max_abs(lat, arrays[f"latents_{s}"]) + print(f"[check5] flux2_klein {s} fp32, TF32 " + f"{'on' if _tf32() else 'off'}: decode max abs {d:.3e} of " + f"gate {t['decode_fp32_max_abs']:.3e}, latents max abs " + f"{e:.3e} of gate {t['encode_fp32_max_abs']:.3e}") + if d > t["decode_fp32_max_abs"] or e > t["encode_fp32_max_abs"]: + failed.append(s) + if _tf32(): + _gate_without_tf32(request) + else: + assert not failed + + +@official +def test_bf16_decode_psnr_and_encode(check5, vaes): + arrays, m = check5 + vae = vaes("bf16") + for s in _full(m): + t = m["tolerances"]["sizes"][s] + dec = _decode(vae, arrays[f"latents_{s}"], tiled=False) + db = fx.psnr(to_unit(dec), to_unit(arrays[f"decoded_{s}"]), 1.0) + rel = fx.rel_l2(_latents(vae, arrays[f"image_{s}"], tiled=False), + arrays[f"latents_{s}"]) + print(f"[check5] flux2_klein {s} bf16: decode PSNR {db:.2f} dB, " + f"gate {t['decode_bf16_psnr_db']:.2f} dB; latents rel L2 " + f"{rel:.3e}, gate {t['encode_bf16_rel_l2']:.3e}") + assert db >= t["decode_bf16_psnr_db"], s + assert rel <= t["encode_bf16_rel_l2"], s + + +@official +def test_a_tiled_bf16_decode_at_the_largest_size(check5, vaes): + arrays, m = check5 + s = _full(m)[-1] + dec = _decode(vaes("bf16"), arrays[f"latents_{s}"], tiled=True) + db = fx.psnr(to_unit(dec), to_unit(arrays[f"decoded_{s}"]), 1.0) + tol = m["tolerances"]["sizes"][s]["decode_bf16_psnr_db"] + print(f"[check5] flux2_klein {s} bf16 tiled decode PSNR {db:.2f} dB, " + f"gate {tol:.2f} dB") + assert s == "1024x1024" + assert db >= tol + + +@official +def test_a_tiled_bf16_encode_at_the_largest_full_size(check5, vaes): + arrays, m = check5 + s = _full(m)[-1] + vae = vaes("bf16") + whole = _latents(vae, arrays[f"image_{s}"], tiled=False) + tiled = _latents(vae, arrays[f"image_{s}"], tiled=True) + rel = fx.rel_l2(tiled, whole) + a = _decode(vae, whole, tiled=False) + b = _decode(vae, tiled, tiled=False) + db = fx.psnr(to_unit(b), to_unit(a), 1.0) + print(f"[check5] flux2_klein {s} bf16 tiled encode rel L2 {rel:.3e} " + f"against the whole encode, round trip {db:.2f} dB against the " + "whole round trip") + assert s == "1024x1024" + assert rel < TILED_ENCODE_REL_L2 + assert db >= TILED_ROUND_TRIP_DB + + +@official +def test_the_gguf_pack_loads_the_same_weights_and_decodes_the_same( + check5, vaes, tmp_path): + """BFL's file packs in BF16, lossless, and its pack decodes the 512 + latents bit for bit as the file does.""" + from gmlx.image.vae import load_vae, pack_vae + + arrays, m = check5 + a = vaes("bf16") + dst = tmp_path / "flux2-vae-BF16.gguf" + rep = pack_vae(a.source, dst, source_repo="black-forest-labs/" + "FLUX.2-klein-4B", source_revision=m["inputs"][ + "config_revision"], config_json="{}", family=FAMILY) + assert rep.lossless and rep.family == FAMILY + b = load_vae(str(dst), family=FAMILY, dtype="bf16") + assert _differ(_params(a), _params(b)) == [] + s = _full(m)[0] + assert np.array_equal(_decode(a, arrays[f"latents_{s}"], tiled=False), + _decode(b, arrays[f"latents_{s}"], tiled=False)) + + +@official +def test_the_bf16_file_is_the_f32_files_rounding_and_decodes_apart_by_bn( + check5, sources): + """BFL's BF16 file holds the bf16 rounding of each float tensor of the + Comfy-Org F32 file. The bf16 VAEs of the two hold the same weights but + the BatchNorm statistics, which stay full float32 from the F32 file, so + their bf16 decodes are not bit for bit the same; with the F32 file's + statistics rounded they are, at each size of the fixture.""" + import gc + + from gmlx.image.vae import load_vae + + arrays, m = check5 + want = committed(F32_NAME)["files"]["vae"] + f32 = _source(sources, want["sha256"], "the Comfy-Org F32 VAE") + bf16 = _source(sources, m["files"]["vae"]["sha256"], "BFL's BF16 VAE") + a = mx.load(str(f32)) + b = mx.load(str(bf16)) + assert a.keys() == b.keys() + floats = [k for k in a if a[k].dtype == mx.float32] + assert len(floats) == 250 and all(b[k].dtype == mx.bfloat16 + for k in floats) + off = [k for k in floats if not np.array_equal( + bf16_bits(np.array(a[k])), np.array(b[k].view(mx.uint16)))] + assert off == [] + del a, b + gc.collect() + va = load_vae(str(f32), family=FAMILY, dtype="bf16") + vb = load_vae(str(bf16), family=FAMILY, dtype="bf16") + assert sorted(_differ(_params(va), _params(vb))) == list(BN) + for s in _full(m): + x = arrays[f"latents_{s}"] + da = _decode(va, x, tiled=False) + db = _decode(vb, x, tiled=False) + psnr = fx.psnr(to_unit(da), to_unit(db), 1.0) + print(f"[check5] flux2_klein {s} bf16 decode, F32 file against BF16 " + f"file: max abs {fx.max_abs(da, db):.3e}, PSNR {psnr:.2f} dB, " + f"bit for bit {np.array_equal(da, db)}") + assert not np.array_equal(da, db), s + _bn_rounded(va) + assert _differ(_params(va), _params(vb)) == [] + for s in _full(m): + x = arrays[f"latents_{s}"] + assert np.array_equal(_decode(va, x, tiled=False), + _decode(vb, x, tiled=False)), s diff --git a/tests/image/test_image_flux2_family.py b/tests/image/test_image_flux2_family.py index 3da311b27..a78a77b42 100644 --- a/tests/image/test_image_flux2_family.py +++ b/tests/image/test_image_flux2_family.py @@ -23,6 +23,7 @@ from gmlx.image.registry import get_family KLEIN_4B = "flux2_klein_4b_q4_k_m.header.json" +KLEIN_4B_Q8 = "flux2_klein_4b_q8_0.header.json" KLEIN_9B = "flux2_klein_9b_q4_k_m.header.json" CONFIG_4B = "flux2_klein_4b_transformer_config.json" CONFIG_BASE_4B = "flux2_klein_base_4b_transformer_config.json" @@ -39,13 +40,15 @@ def _refused(view, **kw) -> str: return str(ei.value) +@pytest.mark.parametrize("header", [KLEIN_4B, KLEIN_4B_Q8]) @pytest.mark.parametrize("config", [CONFIG_4B, CONFIG_BASE_4B]) @pytest.mark.parametrize("arch", ["flux", None]) -def test_the_4b_file_gives_the_official_config_of_both_checkpoints(config, - arch): - """Check 1: the distilled and Base 4B files share the header, and the - config synthesized from it is each official transformer config.""" - view = fixture_view(KLEIN_4B, kv={"general.architecture": arch} if arch +def test_the_4b_file_gives_the_official_config_of_both_checkpoints( + header, config, arch): + """Check 1: the distilled and Base 4B files of a quant share the + header, and the config synthesized from the Q4_K_M and the Q8_0 one is + each official transformer config.""" + view = fixture_view(header, kv={"general.architecture": arch} if arch else {}) got = fp.identify(view) assert got.family.name == "flux2_klein" @@ -205,7 +208,7 @@ def test_the_config_fixtures_are_the_official_files_in_bytes(): def test_the_header_fixtures_are_pinned(): manifest = load_json("manifest.json") - for name, n in ((KLEIN_4B, 149), (KLEIN_9B, 201)): + for name, n in ((KLEIN_4B, 149), (KLEIN_4B_Q8, 149), (KLEIN_9B, 201)): d = load_json(name) assert d["n_tensors"] == len(d["tensors"]) == n assert d["kv"] == {"general.architecture": "flux"} @@ -213,7 +216,8 @@ def test_the_header_fixtures_are_pinned(): assert len(manifest[name]["sha256"]) == 64 -@pytest.mark.parametrize("name,size", [(KLEIN_4B, "4B"), (KLEIN_9B, "9B")]) +@pytest.mark.parametrize("name,size", [(KLEIN_4B, "4B"), (KLEIN_4B_Q8, "4B"), + (KLEIN_9B, "9B")]) def test_the_header_holds_exactly_the_expected_tensors(name, size): view = fixture_view(name) assert {n: t.shape for n, t in view.tensors.items()} == f2.expected(size) @@ -428,13 +432,20 @@ def _klein_files(root) -> list: return files +REAL_HEADERS = {("4b", "Q4_K_M"): KLEIN_4B, ("4b", "Q8_0"): KLEIN_4B_Q8, + ("9b", "Q4_K_M"): KLEIN_9B} + + def test_each_real_file_has_the_header_of_its_size(gguf_dir): - """Distilled and Base files of a size hold the same names, shapes and - codecs, those of the size's fixture. Headers only.""" + """Distilled and Base files of a size and quant hold the same names, + shapes and codecs, those of the fixture of that size and quant. + Headers only.""" from gmlx.load.headerscan import scan_gguf for p in _klein_files(gguf_dir): - fixture = KLEIN_9B if "-9b-" in p.name else KLEIN_4B + key = ("9b" if "-9b-" in p.name else "4b", p.stem.rsplit("-", 1)[1]) + assert key in REAL_HEADERS, f"{p.name} has no header fixture" + fixture = REAL_HEADERS[key] want = [list(t) for t in load_json(fixture)["tensors"]] scan = scan_gguf(str(p)) got = [[t.name, list(t.shape), t.type_name] for t in scan.tensors] diff --git a/tests/serve/test_patches_routes.py b/tests/serve/test_patches_routes.py index 24acf95ed..2263a869c 100644 --- a/tests/serve/test_patches_routes.py +++ b/tests/serve/test_patches_routes.py @@ -608,11 +608,12 @@ def test_keep_and_unload_take_an_image_model(monkeypatch): @pytest.mark.parametrize("family,tower,edit", [ ("qwen_image21", None, False), ("qwen_image21", "/mm.gguf", True), - ("flux3_klein", None, True), ("z_image", "/mm.gguf", False)]) + ("flux3_klein", None, True), ("flux2_klein", None, True), + ("z_image", "/mm.gguf", False)]) def test_a_models_entry_edits_with_the_vision_tower_its_family_needs( monkeypatch, tmp_path, family, tower, edit): - """Qwen-Image edits with its tower, FLUX.3 klein's encoder reads the - prompt alone, and Z-Image takes no references.""" + """Qwen-Image edits with its tower, the encoders of FLUX.3 klein and + FLUX.2 klein read the prompt alone, and Z-Image takes no references.""" from types import SimpleNamespace from gmlx.image import loader diff --git a/tests/test_comfyui_pack.py b/tests/test_comfyui_pack.py index 000fd814a..dce8c0aaf 100644 --- a/tests/test_comfyui_pack.py +++ b/tests/test_comfyui_pack.py @@ -90,7 +90,7 @@ def test_the_wheel_ships_every_pack_file(): for want in ("gmlx/comfyui_pack/LICENSE", "gmlx/comfyui_pack/__init__.py", "gmlx/comfyui_pack/version.py"): assert want in files - assert len([f for f in files if f.startswith("gmlx/comfyui_pack/example_workflows/")]) == 5 + assert len([f for f in files if f.startswith("gmlx/comfyui_pack/example_workflows/")]) == 7 def test_the_pack_keeps_its_apache_license(): @@ -160,6 +160,15 @@ def test_gmlx_pytest_collects_no_pack_suite(monkeypatch): "EmptyFlux2LatentImage": ["width", "height", "batch_size"], # A dynamic combo: the option, then the inputs of that option. "ReferenceMultiLatent": ["resolution", "resolution.megapixels"], + "Flux2Scheduler": ["steps", "width", "height"], + "RandomNoise": ["noise_seed", "control_after_generate"], + "KSamplerSelect": ["sampler_name"], + "CFGGuider": ["cfg"], + "SamplerCustomAdvanced": [], + "ImageScaleToTotalPixels": ["upscale_method", "megapixels", "resolution_steps"], + "VAEEncode": [], + "ReferenceLatent": [], + "GetImageSize": [], } _FRONTEND_ONLY = {"control_after_generate", "upload"} @@ -167,7 +176,7 @@ def test_gmlx_pytest_collects_no_pack_suite(monkeypatch): def to_api(ui: dict) -> dict: """The API-format prompt of a UI-format graph, as ComfyUI's frontend queues it: Note nodes drop out, links become [node id, slot] pairs and - widget values take their input names.""" + widget values take their input names, but for a widget a link feeds.""" links = {lk[0]: lk for lk in ui["links"]} out = {} for n in ui["nodes"]: @@ -182,7 +191,7 @@ def to_api(ui: dict) -> dict: values = n.get("widgets_values", []) assert len(values) == len(names), (n["type"], values) for name, value in zip(names, values): - if name not in _FRONTEND_ONLY: + if name not in _FRONTEND_ONLY and name not in inputs: inputs[name] = value out[str(n["id"])] = {"inputs": inputs, "class_type": n["type"], "_meta": {"title": n.get("title", n["type"])}} From 3eeee15ac12a69ef87db634ab2dae146890432a2 Mon Sep 17 00:00:00 2001 From: Asher Feldman <59994+asher@users.noreply.github.com> Date: Fri, 16 Oct 2026 12:49:10 -0700 Subject: [PATCH 029/101] docs(image): flux2 klein in the image guides, the image api, the cli, comfyui and troubleshooting pages --- CHANGELOG.md | 2 ++ README.md | 6 +++--- docs/cli.md | 32 ++++++++++++++++++++++---------- docs/comfyui-reference.md | 5 ++++- docs/comfyui.md | 21 ++++++++++++++++++++- docs/image-api.md | 19 +++++++++++++++---- docs/images.md | 35 ++++++++++++++++++++++++++--------- docs/troubleshooting.md | 11 +++++++---- 8 files changed, 99 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d437b1a0a..178f950db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ adhere to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - `gmlx pull`, `image generate`, `serve` and the ComfyUI pack run FLUX.3 klein and FLUX.3 klein Base GGUFs, with edits from up to 10 reference images. +- `gmlx pull`, `image generate`, `serve` and the ComfyUI pack run FLUX.2 klein + 4B and FLUX.2 klein Base 4B GGUFs, with edits from up to 10 reference images. - `context_copy: true` or `GMLX_CONTEXT_COPY=1` drafts from the prompt when the output repeats it, which speeds up edits and quotes. - Muse Spark (GGUF arch `muse-spark`), with reasoning effort intents, tool calls diff --git a/README.md b/README.md index 247e11203..f42f37437 100644 --- a/README.md +++ b/README.md @@ -98,9 +98,9 @@ The recording runs at true speed, with a 27B model in a local server. - Embeddings, rerank, speech-to-text and text-to-speech on the same server, for a local RAG and voice stack. See [Speech, embeddings and rerank](https://asher.github.io/gmlx/services.html). -- Image generation from Z-Image, Qwen-Image 2.1, Krea 2 Turbo and FLUX.3 - klein GGUFs, on the command line, on the OpenAI image routes and in - ComfyUI. It needs an M3 chip or newer. See +- Image generation from Z-Image, Qwen-Image 2.1, Krea 2 Turbo, FLUX.2 klein + and FLUX.3 klein GGUFs, on the command line, on the OpenAI image routes + and in ComfyUI. It needs an M3 chip or newer. See [Image generation](https://asher.github.io/gmlx/images.html). - A decision API at `/v1/systemone` that returns a probability for each answer to yes-or-no, choice and score questions about a text. See diff --git a/docs/cli.md b/docs/cli.md index c4e477064..61b0b047a 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -639,7 +639,8 @@ gmlx pull qwen-image --quant Q5_K_M ``` An image model name, `z-image-turbo`, `qwen-image`, `qwen-image-turbo`, -`krea-2-turbo`, `flux-3-klein` or `flux-3-klein-base`, pulls its DiT, text +`krea-2-turbo`, `flux-2-klein`, `flux-2-klein-base`, `flux-3-klein` or +`flux-3-klein-base`, pulls its DiT, text encoder and VAE, checks the VAE against its published sha256, packs it to GGUF, and adds an `image_models` entry. The quants default to @@ -1005,6 +1006,15 @@ the output has the first reference's size, and the output of a single reference is cropped back to the scaled image. FLUX.3 klein sizes its references by this rule, and `--ref-size` exits 2 on it. +`--ref` gives FLUX.2 klein up to 10 reference images as well, read as +FLUX.3 klein reads them, with no `--encoder-mmproj`. A single reference is +scaled down to at most the area of 2024x2024 pixels, and each of several +to at most the area of 1024x1024. Each is then cropped to sides that are +multiples of 16, around the center. A reference needs sides of at least 64 +pixels, and neither side more than 8 times the other. Without `--size` the +output has the first reference's size as prepared, and it is not cropped +back. `--ref-size` exits 2 on FLUX.2 klein too. + `--adapter` applies a LoRA safetensors file to the DiT, live beside the quantized weights, so the file is read once and nothing is merged. The kohya, diffusers, PEFT and OneTrainer key spellings are read. The rank and @@ -1039,7 +1049,7 @@ and `crop`, the left, top, right and bottom of the image in it. | `--prompt TEXT` | Required, or `--prompt-file` | Generate from this prompt. | | `--prompt-file FILE` | None | Read the prompt from this file. | | `--negative-prompt TEXT` | Empty | Guide away from this prompt, or from the empty prompt without it. It is unused when `--guidance` is 1. | -| `--size WxH` | The init image's, else a FLUX.3 klein reference's, else the entry's `defaults.size`, else the variant's | Set the width and height, each a multiple of 32 on Qwen-Image 2.1 and of 16 on the others. Another size exits 2 and names the multiple. | +| `--size WxH` | The init image's, else a FLUX.2 klein or FLUX.3 klein reference's, else the entry's `defaults.size`, else the variant's | Set the width and height, each a multiple of 32 on Qwen-Image 2.1 and of 16 on the others. Another size exits 2 and names the multiple. | | `--steps N` | The variant's | Sample for N steps. | | `--seed N` | Random, and printed | Seed the first image. | | `--guidance CFG` | The variant's | Set classifier-free guidance. 1 turns it off. | @@ -1047,7 +1057,7 @@ and `crop`, the left, top, right and bottom of the image in it. | `--init-image PATH` | None | Start from this image, resized to `--size` (img2img). | | `--mask PATH` | None | Change only where this mask is white (inpainting). It needs `--init-image`. | | `--strength F` | `0.6`, or `1` with `--mask` | Set how far img2img moves from the init image, from 0.01 to 1. | -| `--ref PATH` | None | Edit from this reference image, on Qwen-Image 2.1 and FLUX.3 klein. Repeat the flag for up to 10 images, in the order the prompt names them. | +| `--ref PATH` | None | Edit from this reference image, on Qwen-Image 2.1, FLUX.2 klein and FLUX.3 klein. Repeat the flag for up to 10 images, in the order the prompt names them. | | `--ref-size N` | `1024` | On Qwen-Image 2.1, resize each reference to about N x N pixels at its own aspect ratio, from 256 to 1024. It needs `--ref`. | | `--count N` | `1` | Generate N images. | | `--output PATH` | `./gmlx-