SearchingMan commited on
Commit
3c3ef46
·
verified ·
1 Parent(s): 139a7b6

Add model card, workflows, and verified release evidence

Browse files
.gitattributes CHANGED
@@ -1,35 +1,2 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
  *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  *.safetensors filter=lfs diff=lfs merge=lfs -text
2
+ *.png filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
LICENSE_NOTICE.md ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # License notice
2
+
3
+ The model weights in this repository are quantized derivatives of
4
+ `black-forest-labs/FLUX.1-dev`, source revision:
5
+
6
+ `3de623fc3c33e44ffbe2bad470d0f45bccf2eb21`
7
+
8
+ They are subject to the FLUX.1-dev Non-Commercial License and the upstream
9
+ acceptable-use terms. Review the exact license before downloading or using the
10
+ weights:
11
+
12
+ https://huggingface.co/black-forest-labs/FLUX.1-dev/blob/3de623fc3c33e44ffbe2bad470d0f45bccf2eb21/LICENSE.md
13
+
14
+ Nothing in the helper scripts, workflows, documentation, or repository
15
+ metadata grants rights beyond the upstream model license. Users are responsible
16
+ for determining whether their intended use complies with all applicable terms.
README.md ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: other
3
+ license_name: flux-1-dev-non-commercial-license
4
+ license_link: https://huggingface.co/black-forest-labs/FLUX.1-dev/blob/3de623fc3c33e44ffbe2bad470d0f45bccf2eb21/LICENSE.md
5
+ base_model: black-forest-labs/FLUX.1-dev
6
+ base_model_relation: quantized
7
+ pipeline_tag: text-to-image
8
+ library_name: comfyui
9
+ tags:
10
+ - flux
11
+ - flux.1-dev
12
+ - comfyui
13
+ - quantization
14
+ - convrot
15
+ - int8
16
+ - int4
17
+ - text-to-image
18
+ inference: false
19
+ ---
20
+
21
+ # FLUX.1-dev ConvRot for ComfyUI
22
+
23
+ Native ComfyUI ConvRot quantizations of **FLUX.1-dev**, with three diffusion-model choices and an optional INT8 ConvRot T5-XXL text encoder.
24
+
25
+ These are post-training quantized derivatives of [`black-forest-labs/FLUX.1-dev`](https://huggingface.co/black-forest-labs/FLUX.1-dev) at source revision `3de623fc3c33e44ffbe2bad470d0f45bccf2eb21`. They load with ComfyUI's core `UNETLoader`; no custom INT4 loader is required.
26
+
27
+ > **License:** The model weights are subject to the upstream FLUX.1-dev Non-Commercial License. Access and use require compliance with that license and the upstream acceptable-use terms. See [License](#license) before downloading.
28
+
29
+ ![Twenty-prompt comparison: Original BF16, Whole W8A8 + INT8 T5, Whole W8A8 + BF16 T5, Partial INT8 + BF16 T5, Paper W4A4 + BF16 T5](assets/overview_contact_sheet.png)
30
+
31
+ ## Files and recommended combinations
32
+
33
+ | File | Role | Size | Recommendation |
34
+ |---|---|---:|---|
35
+ | `FLUX.1-dev-w8a8-convrot.safetensors` | Whole-DiT ConvRot W8A8 | 11.981 GB | **Default DiT**: best storage/fidelity balance |
36
+ | `FLUX.1-dev-int8_convrot.safetensors` | Partial ConvRot INT8 with sensitive tensors preserved | 15.920 GB | **Quality-first DiT**: closest tested quantized variant to BF16 |
37
+ | `FLUX.1-dev-paper-w4a4-convrot.safetensors` | Paper-aligned whole-DiT ConvRot W4A4 | 6.248 GB | **Memory-first / experimental** |
38
+ | `t5xxl_flux1_int8_convrot.safetensors` | Experimental T5-XXL ConvRot W8A8 | 4.898 GB | Optional text-encoder companion |
39
+
40
+ The four uploadable files total 39.047 GB. The Original BF16 model shown in the comparison is a reference and is **not** included.
41
+
42
+ Recommended pipelines:
43
+
44
+ 1. Lowest combined storage: `FLUX.1-dev-w8a8-convrot.safetensors` + `t5xxl_flux1_int8_convrot.safetensors`.
45
+ 2. Default quality/storage balance: `FLUX.1-dev-w8a8-convrot.safetensors` + upstream BF16 T5-XXL.
46
+ 3. Quality-first: `FLUX.1-dev-int8_convrot.safetensors` + upstream BF16 T5-XXL.
47
+ 4. Memory-first: `FLUX.1-dev-paper-w4a4-convrot.safetensors` + upstream BF16 T5-XXL.
48
+
49
+ The optional INT8 T5 does not contain CLIP-L. FLUX still requires CLIP-L and a VAE.
50
+
51
+ ## What W8A8 and W4A4 mean
52
+
53
+ ConvRot stores rotated quantized weights plus per-layer metadata. At runtime, the quantized weight layout dispatches the matching ComfyUI/comfy-kitchen linear operator. The current BF16 activation is rotated and dynamically quantized for the matrix multiplication; activations are not stored in the checkpoint.
54
+
55
+ - **W8A8:** INT8 weights and dynamically quantized INT8 activations for selected linear layers.
56
+ - **W4A4:** packed INT4 weights and dynamically quantized INT4 activations for selected linear layers.
57
+ - Biases, norms, embeddings, and tensors outside each policy remain at their declared higher precision.
58
+
59
+ Rotation group size is 256. The W4A4 artifact uses quantization group size 64.
60
+
61
+ ## ComfyUI installation
62
+
63
+ Place the selected files as follows:
64
+
65
+ ```text
66
+ ComfyUI/models/diffusion_models/FLUX.1-dev-w8a8-convrot.safetensors
67
+ # or FLUX.1-dev-int8_convrot.safetensors
68
+ # or FLUX.1-dev-paper-w4a4-convrot.safetensors
69
+
70
+ ComfyUI/models/text_encoders/t5xxl_flux1_int8_convrot.safetensors # optional
71
+ ```
72
+
73
+ You must separately obtain the standard FLUX assets under their applicable licenses:
74
+
75
+ ```text
76
+ ComfyUI/models/text_encoders/clip_l_flux1.safetensors
77
+ ComfyUI/models/text_encoders/t5xxl_flux1_bf16.safetensors # unless using the INT8 T5 here
78
+ ComfyUI/models/vae/ae_flux1.safetensors
79
+ ```
80
+
81
+ Use a current ComfyUI and comfy-kitchen build with native ConvRot support. The validated environment was:
82
+
83
+ - ComfyUI `0.28.0`
84
+ - comfy-kitchen `0.2.20`
85
+ - comfy-cli `1.11.1`
86
+ - NVIDIA CUDA GPU
87
+
88
+ W4A4 requires SM 8.0 or newer. The first run may compile kernels and take longer.
89
+
90
+ Load the diffusion model with core `UNETLoader` and `weight_dtype=default`. Load CLIP-L and the chosen T5 with `DualCLIPLoader(type=flux)`.
91
+
92
+ A ready-to-use API/comfy-cli workflow is provided at
93
+ [`workflows/FLUX1_Dev_ConvRot_API.json`](workflows/FLUX1_Dev_ConvRot_API.json).
94
+ It defaults to Whole W8A8 + INT8 T5. Change the diffusion-model and/or T5
95
+ filename to test another combination.
96
+
97
+ ## Paired quality evaluation
98
+
99
+ Twenty 1024×1024 images were generated per pipeline with identical prompts, seeds, sampler, scheduler, guidance, steps, CLIP-L, and VAE. Metrics compare final 8-bit RGB images to Original BF16.
100
+
101
+ | Pipeline | Global PSNR vs BF16 | Mean per-pair PSNR | Low-VRAM maximum peak |
102
+ |---|---:|---:|---:|
103
+ | Whole W8A8 + INT8 T5 | 26.559 dB | 28.872 dB | 16,265 MiB |
104
+ | Whole W8A8 + BF16 T5 | 27.399 dB | 29.449 dB | 16,298 MiB |
105
+ | Partial INT8 + BF16 T5 | **27.888 dB** | **29.857 dB** | 20,351 MiB |
106
+ | Paper W4A4 + BF16 T5 | 17.926 dB | 19.041 dB | **10,797 MiB** |
107
+
108
+ The isolated T5 comparison—same Whole W8A8 DiT, BF16 T5 versus INT8 T5—measured 27.389 dB global PSNR and 30.054 dB mean per-pair PSNR.
109
+
110
+ PSNR measures paired pixel similarity, not aesthetics, prompt adherence, anatomy, typography, or human preference. Small spatial changes can sharply reduce PSNR. LPIPS and human-preference metrics were not computed.
111
+
112
+ Full records:
113
+
114
+ - [`assets/quality_metrics.json`](assets/quality_metrics.json)
115
+ - [`assets/VRAM_MATRIX.md`](assets/VRAM_MATRIX.md)
116
+ - [`assets/grid_verification.json`](assets/grid_verification.json)
117
+
118
+ ## VRAM methodology
119
+
120
+ Each benchmark cell used a fresh ComfyUI process. Total physical GPU memory was sampled every 20 ms under an exclusive GPU lock. Settings were 1024×1024, batch 1, 20 steps, Euler/simple, CFG 1.0, FLUX guidance 3.5. `--lowvram` is an offloading result; hardware, runtime versions, attention backend, and workflow can materially change memory use.
121
+
122
+ The no-offloading `--highvram` maximum peaks for the four publication pipelines were 19,998 MiB, 21,342 MiB, 21,342 MiB, and 18,974 MiB in the table's order. Original BF16 hit a capacity failure in that 24 GiB environment.
123
+
124
+ ## Quantization policies
125
+
126
+ - **Whole W8A8:** all 304 paper-scoped 2-D transformer-block linear weights use tensorwise INT8 ConvRot; 476 tensors remain BF16 or otherwise preserved.
127
+ - **Partial INT8:** profile-based selective INT8 ConvRot with a larger BF16-preserved set. This is the largest and highest-PSNR tested quantized DiT.
128
+ - **Paper W4A4:** 301 paper-scoped transformer-block linears use W4A4; 479 tensors remain BF16 or otherwise preserved. ComfyUI's fused `single_blocks.*.linear1` expands some paper component-level decisions to the fused tensor.
129
+ - **INT8 T5-XXL:** 168 encoder linear projections use W8A8; 51 embedding, relative-attention-bias, and normalization tensors remain BF16. This T5 policy is experimental and was not evaluated by the ConvRot paper.
130
+
131
+ See [`manifests/conversion_summaries.json`](manifests/conversion_summaries.json) and [`release_manifest.json`](release_manifest.json) for artifact-level provenance and hashes.
132
+
133
+ ## Limitations
134
+
135
+ - These are post-training quantizations, not fine-tuned models.
136
+ - The W4A4 result diverges substantially more from BF16 and is labeled experimental.
137
+ - INT8 T5 image similarity does not establish long-prompt comprehension equivalence.
138
+ - Results cover 20 fixed prompts and one validated runtime/hardware environment.
139
+ - No safety classifier or content filter is included.
140
+ - Quantized checkpoints do not remove the limitations or usage restrictions of FLUX.1-dev.
141
+
142
+ ## License
143
+
144
+ The quantized weights are derivatives of FLUX.1-dev and are provided under the **FLUX.1-dev Non-Commercial License**. Review and comply with the exact upstream license:
145
+
146
+ - License: https://huggingface.co/black-forest-labs/FLUX.1-dev/blob/3de623fc3c33e44ffbe2bad470d0f45bccf2eb21/LICENSE.md
147
+ - Base model: https://huggingface.co/black-forest-labs/FLUX.1-dev
148
+
149
+ The helper workflow/scripts do not grant additional rights to the model weights. See [`LICENSE_NOTICE.md`](LICENSE_NOTICE.md).
150
+
151
+ ## Credits
152
+
153
+ - Base model: Black Forest Labs, [`FLUX.1-dev`](https://huggingface.co/black-forest-labs/FLUX.1-dev)
154
+ - Quantized runtime: [ComfyUI](https://github.com/comfyanonymous/ComfyUI) and [comfy-kitchen](https://github.com/Comfy-Org/comfy-kitchen)
155
+ - Conversion tooling: [Starnodes Model Converter](https://github.com/Starnodes2024/comfyui-starnodes-modelconverter)
156
+ - Method reference: *ConvRot: Rotation-Based Plug-and-Play 4-bit Quantization for Diffusion Transformers*, arXiv:2512.03673
assets/VRAM_MATRIX.md ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # FLUX.1 offloading versus no-offloading VRAM matrix
2
+
3
+ Fresh ComfyUI process per cell; total physical-GPU memory sampled every 20 ms under the exclusive GPU lock.
4
+ `--highvram` is the no-model-offloading control; it is not `--gpu-only`.
5
+
6
+ | Policy | Pipeline | Status | Cold peak MiB | Warm peak MiB | Maximum peak MiB |
7
+ |---|---|---|---:|---:|---:|
8
+ | lowvram | Original BF16 | success | 24091 | 23650 | 24091 |
9
+ | lowvram | Partial INT8 | success | 20351 | 20016 | 20351 |
10
+ | lowvram | Partial INT4 | success | 16642 | 16604 | 16642 |
11
+ | lowvram | Paper Mixed | success | 12066 | 12050 | 12066 |
12
+ | lowvram | Paper W4A4 | success | 10765 | 10797 | 10797 |
13
+ | lowvram | Whole W8A8 | success | 16298 | 16298 | 16298 |
14
+ | lowvram | Whole W8A8 + INT8 T5 | success | 16265 | 16265 | 16265 |
15
+ | highvram | Original BF16 | capacity_failure | 23939 | | 23939 |
16
+ | highvram | Partial INT8 | success | 21342 | 21342 | 21342 |
17
+ | highvram | Partial INT4 | success | 21438 | 21438 | 21438 |
18
+ | highvram | Paper Mixed | success | 20062 | 20158 | 20158 |
19
+ | highvram | Paper W4A4 | success | 18942 | 18974 | 18974 |
20
+ | highvram | Whole W8A8 | success | 21342 | 21342 | 21342 |
21
+ | highvram | Whole W8A8 + INT8 T5 | success | 19966 | 19998 | 19998 |
22
+
23
+ GPU UUID: `GPU-27ff99d6-d77d-2226-a4b5-7a11b8ef6bdd`
24
+
25
+ Settings: 1024×1024, batch 1, 20 steps, Euler/simple, CFG 1.0, Flux guidance 3.5.
26
+
27
+ Source benchmark state: measurement complete, run `20260719T215033Z_1143248`. The benchmark used total physical-GPU memory because WSL did not expose per-process memory for compute rows.
assets/grid_verification.json ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "status": "PASS",
4
+ "grid_count": 20,
5
+ "source_image_count": 100,
6
+ "unique_grid_hashes": 20,
7
+ "unique_source_hashes": 100,
8
+ "grid_dimensions": {
9
+ "width": 5168,
10
+ "height": 1136
11
+ },
12
+ "labels": [
13
+ "Original BF16",
14
+ "Whole W8A8 + INT8 T5",
15
+ "Whole W8A8 + BF16 T5",
16
+ "Partial INT8 + BF16 T5",
17
+ "Paper W4A4 + BF16 T5"
18
+ ],
19
+ "pixel_identity_check": "PASS for all 100 rendered source regions",
20
+ "source_grid_manifest_sha256": "22354490f79e3126d129098ad14d4baa07fbba43d8f9f9d4a2862f4a385b914d",
21
+ "overview_contact_sheet": {
22
+ "path": "assets/overview_contact_sheet.png",
23
+ "bytes": 9961323,
24
+ "sha256": "3af42bd633bd813f806ff8652a23e21b133004b012ef509656ce336914e914d0",
25
+ "width": 2596,
26
+ "height": 2948
27
+ }
28
+ }
assets/overview_contact_sheet.png ADDED

Git LFS Details

  • SHA256: 3af42bd633bd813f806ff8652a23e21b133004b012ef509656ce336914e914d0
  • Pointer size: 132 Bytes
  • Size of remote file: 9.96 MB
assets/quality_metrics.json ADDED
@@ -0,0 +1,644 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "contract": {
3
+ "channels": "RGB",
4
+ "height": 1024,
5
+ "pixel_range": "8-bit [0,255]",
6
+ "prompt_count": 20,
7
+ "same_prompt_seed_sampler_and_settings": true,
8
+ "width": 1024
9
+ },
10
+ "created_at": "2026-07-20T16:42:54+00:00",
11
+ "limitations": [
12
+ "PSNR measures paired pixel similarity to the BF16 reference, not aesthetics or prompt adherence.",
13
+ "LPIPS and human-preference metrics were not computed."
14
+ ],
15
+ "reference": {
16
+ "label": "Original BF16",
17
+ "model_id": "original_bf16"
18
+ },
19
+ "results": [
20
+ {
21
+ "global_mae_rgb_8bit": 4.184344148635864,
22
+ "global_mse_rgb_8bit": 143.60905289649963,
23
+ "global_psnr_db": 26.55898542834396,
24
+ "label": "Whole W8A8 + INT8 T5",
25
+ "max_pair_psnr_db": 42.96481803223763,
26
+ "mean_pair_psnr_db": 28.871755201270258,
27
+ "median_pair_psnr_db": 29.34872857885429,
28
+ "min_pair_psnr_db": 20.67506469049193,
29
+ "model_id": "t5_int8_convrot",
30
+ "pair_count": 20,
31
+ "pairs": [
32
+ {
33
+ "mae_rgb_8bit": 1.8707882563273113,
34
+ "mse_rgb_8bit": 25.03745937347412,
35
+ "prompt_id": "prompt_01",
36
+ "psnr_db": 34.14490103264843,
37
+ "seed": 2737473617249173572
38
+ },
39
+ {
40
+ "mae_rgb_8bit": 0.6493326822916666,
41
+ "mse_rgb_8bit": 3.285477956136068,
42
+ "prompt_id": "prompt_02",
43
+ "psnr_db": 42.96481803223763,
44
+ "seed": 5636279213593584334
45
+ },
46
+ {
47
+ "mae_rgb_8bit": 5.9316714604695635,
48
+ "mse_rgb_8bit": 281.34023062388104,
49
+ "prompt_id": "prompt_03",
50
+ "psnr_db": 23.638485217397374,
51
+ "seed": 2337272915321693975
52
+ },
53
+ {
54
+ "mae_rgb_8bit": 4.219496726989746,
55
+ "mse_rgb_8bit": 117.22437000274658,
56
+ "prompt_id": "prompt_04",
57
+ "psnr_db": 27.44062453473368,
58
+ "seed": 5284037423569190479
59
+ },
60
+ {
61
+ "mae_rgb_8bit": 2.4964122772216797,
62
+ "mse_rgb_8bit": 54.10380299886068,
63
+ "prompt_id": "prompt_05",
64
+ "psnr_db": 30.798525677877432,
65
+ "seed": 6913066525750388688
66
+ },
67
+ {
68
+ "mae_rgb_8bit": 2.657512982686361,
69
+ "mse_rgb_8bit": 49.35343837738037,
70
+ "prompt_id": "prompt_06",
71
+ "psnr_db": 31.197629461863695,
72
+ "seed": 7394637781574154634
73
+ },
74
+ {
75
+ "mae_rgb_8bit": 8.83125114440918,
76
+ "mse_rgb_8bit": 497.9759298960368,
77
+ "prompt_id": "prompt_07",
78
+ "psnr_db": 21.158720096061163,
79
+ "seed": 8805682773639136733
80
+ },
81
+ {
82
+ "mae_rgb_8bit": 3.2949819564819336,
83
+ "mse_rgb_8bit": 72.90100193023682,
84
+ "prompt_id": "prompt_08",
85
+ "psnr_db": 29.503468636914594,
86
+ "seed": 8599963958067732996
87
+ },
88
+ {
89
+ "mae_rgb_8bit": 5.054506619771321,
90
+ "mse_rgb_8bit": 201.2291866938273,
91
+ "prompt_id": "prompt_09",
92
+ "psnr_db": 25.093893889533007,
93
+ "seed": 5673822435512390978
94
+ },
95
+ {
96
+ "mae_rgb_8bit": 3.1050949096679688,
97
+ "mse_rgb_8bit": 75.71082433064778,
98
+ "prompt_id": "prompt_10",
99
+ "psnr_db": 29.339223861101253,
100
+ "seed": 4537681100734872717
101
+ },
102
+ {
103
+ "mae_rgb_8bit": 2.4548552831014,
104
+ "mse_rgb_8bit": 44.98679256439209,
105
+ "prompt_id": "prompt_11",
106
+ "psnr_db": 31.59995330610588,
107
+ "seed": 6991054715693460219
108
+ },
109
+ {
110
+ "mae_rgb_8bit": 3.227843920389811,
111
+ "mse_rgb_8bit": 66.2210823694865,
112
+ "prompt_id": "prompt_12",
113
+ "psnr_db": 29.92084085943045,
114
+ "seed": 4444155078815147914
115
+ },
116
+ {
117
+ "mae_rgb_8bit": 10.309847195943197,
118
+ "mse_rgb_8bit": 556.6393340428671,
119
+ "prompt_id": "prompt_13",
120
+ "psnr_db": 20.67506469049193,
121
+ "seed": 6135808568015678407
122
+ },
123
+ {
124
+ "mae_rgb_8bit": 1.6483319600423176,
125
+ "mse_rgb_8bit": 23.638425827026367,
126
+ "prompt_id": "prompt_14",
127
+ "psnr_db": 34.39461809022444,
128
+ "seed": 713035478727730346
129
+ },
130
+ {
131
+ "mae_rgb_8bit": 4.416806221008301,
132
+ "mse_rgb_8bit": 114.49958451588948,
133
+ "prompt_id": "prompt_15",
134
+ "psnr_db": 27.542764501115137,
135
+ "seed": 248937108497645287
136
+ },
137
+ {
138
+ "mae_rgb_8bit": 9.364078839619955,
139
+ "mse_rgb_8bit": 304.6785605748494,
140
+ "prompt_id": "prompt_16",
141
+ "psnr_db": 23.292384657250743,
142
+ "seed": 5277644178537905334
143
+ },
144
+ {
145
+ "mae_rgb_8bit": 2.052689552307129,
146
+ "mse_rgb_8bit": 51.52497704823812,
147
+ "prompt_id": "prompt_17",
148
+ "psnr_db": 31.010625538727638,
149
+ "seed": 7635742545595743441
150
+ },
151
+ {
152
+ "mae_rgb_8bit": 4.981616973876953,
153
+ "mse_rgb_8bit": 159.03070195515951,
154
+ "prompt_id": "prompt_18",
155
+ "psnr_db": 26.11599384959113,
156
+ "seed": 300265456486907271
157
+ },
158
+ {
159
+ "mae_rgb_8bit": 3.245227813720703,
160
+ "mse_rgb_8bit": 97.41972096761067,
161
+ "prompt_id": "prompt_19",
162
+ "psnr_db": 28.244334795492247,
163
+ "seed": 5279743298653840878
164
+ },
165
+ {
166
+ "mae_rgb_8bit": 3.8745361963907876,
167
+ "mse_rgb_8bit": 75.38015588124593,
168
+ "prompt_id": "prompt_20",
169
+ "psnr_db": 29.358233296607324,
170
+ "seed": 533279967017145387
171
+ }
172
+ ],
173
+ "reference_model_id": "original_bf16"
174
+ },
175
+ {
176
+ "global_mae_rgb_8bit": 3.8457299709320067,
177
+ "global_mse_rgb_8bit": 118.34940997759502,
178
+ "global_psnr_db": 27.39914263741072,
179
+ "label": "Whole W8A8 + BF16 T5",
180
+ "max_pair_psnr_db": 45.70847505288416,
181
+ "mean_pair_psnr_db": 29.449424636693966,
182
+ "median_pair_psnr_db": 28.553903379427116,
183
+ "min_pair_psnr_db": 23.10766015887956,
184
+ "model_id": "whole_w8a8",
185
+ "pair_count": 20,
186
+ "pairs": [
187
+ {
188
+ "mae_rgb_8bit": 1.9576581319173176,
189
+ "mse_rgb_8bit": 29.332815806070965,
190
+ "prompt_id": "prompt_01",
191
+ "psnr_db": 33.45726605751621,
192
+ "seed": 2737473617249173572
193
+ },
194
+ {
195
+ "mae_rgb_8bit": 0.48685487111409503,
196
+ "mse_rgb_8bit": 1.7467584609985352,
197
+ "prompt_id": "prompt_02",
198
+ "psnr_db": 45.70847505288416,
199
+ "seed": 5636279213593584334
200
+ },
201
+ {
202
+ "mae_rgb_8bit": 6.599390983581543,
203
+ "mse_rgb_8bit": 317.9174343744914,
204
+ "prompt_id": "prompt_03",
205
+ "psnr_db": 23.10766015887956,
206
+ "seed": 2337272915321693975
207
+ },
208
+ {
209
+ "mae_rgb_8bit": 4.497992197672526,
210
+ "mse_rgb_8bit": 121.32832463582356,
211
+ "prompt_id": "prompt_04",
212
+ "psnr_db": 27.29118160190623,
213
+ "seed": 5284037423569190479
214
+ },
215
+ {
216
+ "mae_rgb_8bit": 4.595889409383138,
217
+ "mse_rgb_8bit": 152.80340512593588,
218
+ "prompt_id": "prompt_05",
219
+ "psnr_db": 26.289473285462584,
220
+ "seed": 6913066525750388688
221
+ },
222
+ {
223
+ "mae_rgb_8bit": 2.397451400756836,
224
+ "mse_rgb_8bit": 38.380432764689125,
225
+ "prompt_id": "prompt_06",
226
+ "psnr_db": 32.28970493484174,
227
+ "seed": 7394637781574154634
228
+ },
229
+ {
230
+ "mae_rgb_8bit": 4.228646278381348,
231
+ "mse_rgb_8bit": 191.70894972483316,
232
+ "prompt_id": "prompt_07",
233
+ "psnr_db": 25.3043797294873,
234
+ "seed": 8805682773639136733
235
+ },
236
+ {
237
+ "mae_rgb_8bit": 2.0582707722981772,
238
+ "mse_rgb_8bit": 24.999243418375652,
239
+ "prompt_id": "prompt_08",
240
+ "psnr_db": 34.151534955637366,
241
+ "seed": 8599963958067732996
242
+ },
243
+ {
244
+ "mae_rgb_8bit": 5.316611925760905,
245
+ "mse_rgb_8bit": 213.4386822382609,
246
+ "prompt_id": "prompt_09",
247
+ "psnr_db": 24.838072299396377,
248
+ "seed": 5673822435512390978
249
+ },
250
+ {
251
+ "mae_rgb_8bit": 3.1878668467203775,
252
+ "mse_rgb_8bit": 82.49698829650879,
253
+ "prompt_id": "prompt_10",
254
+ "psnr_db": 28.96642266743221,
255
+ "seed": 4537681100734872717
256
+ },
257
+ {
258
+ "mae_rgb_8bit": 2.101264317830404,
259
+ "mse_rgb_8bit": 36.28457514444987,
260
+ "prompt_id": "prompt_11",
261
+ "psnr_db": 32.53358318568201,
262
+ "seed": 6991054715693460219
263
+ },
264
+ {
265
+ "mae_rgb_8bit": 2.8856945037841797,
266
+ "mse_rgb_8bit": 55.548718770345054,
267
+ "prompt_id": "prompt_12",
268
+ "psnr_db": 30.684063144656623,
269
+ "seed": 4444155078815147914
270
+ },
271
+ {
272
+ "mae_rgb_8bit": 4.770760218302409,
273
+ "mse_rgb_8bit": 148.125763575236,
274
+ "prompt_id": "prompt_13",
275
+ "psnr_db": 26.424497587582426,
276
+ "seed": 6135808568015678407
277
+ },
278
+ {
279
+ "mae_rgb_8bit": 1.4494740168253581,
280
+ "mse_rgb_8bit": 19.55673948923747,
281
+ "prompt_id": "prompt_14",
282
+ "psnr_db": 35.217839102049666,
283
+ "seed": 713035478727730346
284
+ },
285
+ {
286
+ "mae_rgb_8bit": 4.08154296875,
287
+ "mse_rgb_8bit": 99.75667190551758,
288
+ "prompt_id": "prompt_15",
289
+ "psnr_db": 28.141384091422022,
290
+ "seed": 248937108497645287
291
+ },
292
+ {
293
+ "mae_rgb_8bit": 8.978434880574545,
294
+ "mse_rgb_8bit": 286.14463488260907,
295
+ "prompt_id": "prompt_16",
296
+ "psnr_db": 23.564947534252543,
297
+ "seed": 5277644178537905334
298
+ },
299
+ {
300
+ "mae_rgb_8bit": 2.162648836771647,
301
+ "mse_rgb_8bit": 46.40346622467041,
302
+ "prompt_id": "prompt_17",
303
+ "psnr_db": 31.46529938372888,
304
+ "seed": 7635742545595743441
305
+ },
306
+ {
307
+ "mae_rgb_8bit": 7.308785438537598,
308
+ "mse_rgb_8bit": 290.49807771046954,
309
+ "prompt_id": "prompt_18",
310
+ "psnr_db": 23.49937097953946,
311
+ "seed": 300265456486907271
312
+ },
313
+ {
314
+ "mae_rgb_8bit": 2.9200544357299805,
315
+ "mse_rgb_8bit": 81.00839010874431,
316
+ "prompt_id": "prompt_19",
317
+ "psnr_db": 29.045503594061852,
318
+ "seed": 5279743298653840878
319
+ },
320
+ {
321
+ "mae_rgb_8bit": 4.929306983947754,
322
+ "mse_rgb_8bit": 129.50812689463297,
323
+ "prompt_id": "prompt_20",
324
+ "psnr_db": 27.007833387459964,
325
+ "seed": 533279967017145387
326
+ }
327
+ ],
328
+ "reference_model_id": "original_bf16"
329
+ },
330
+ {
331
+ "global_mae_rgb_8bit": 3.529950507481893,
332
+ "global_mse_rgb_8bit": 105.74577018419902,
333
+ "global_psnr_db": 27.88817356191052,
334
+ "label": "Partial INT8 + BF16 T5",
335
+ "max_pair_psnr_db": 45.66462536442023,
336
+ "mean_pair_psnr_db": 29.856776264624564,
337
+ "median_pair_psnr_db": 29.571032038674957,
338
+ "min_pair_psnr_db": 23.511026520961206,
339
+ "model_id": "convrot_int8",
340
+ "pair_count": 20,
341
+ "pairs": [
342
+ {
343
+ "mae_rgb_8bit": 1.6430425643920898,
344
+ "mse_rgb_8bit": 22.24471886952718,
345
+ "prompt_id": "prompt_01",
346
+ "psnr_db": 34.65853439396324,
347
+ "seed": 2737473617249173572
348
+ },
349
+ {
350
+ "mae_rgb_8bit": 0.45065879821777344,
351
+ "mse_rgb_8bit": 1.7644844055175781,
352
+ "prompt_id": "prompt_02",
353
+ "psnr_db": 45.66462536442023,
354
+ "seed": 5636279213593584334
355
+ },
356
+ {
357
+ "mae_rgb_8bit": 2.1578118006388345,
358
+ "mse_rgb_8bit": 47.41307862599691,
359
+ "prompt_id": "prompt_03",
360
+ "psnr_db": 31.371822050243104,
361
+ "seed": 2337272915321693975
362
+ },
363
+ {
364
+ "mae_rgb_8bit": 2.8128862380981445,
365
+ "mse_rgb_8bit": 66.53188991546631,
366
+ "prompt_id": "prompt_04",
367
+ "psnr_db": 29.90050500608385,
368
+ "seed": 5284037423569190479
369
+ },
370
+ {
371
+ "mae_rgb_8bit": 6.780258814493815,
372
+ "mse_rgb_8bit": 268.41435559590656,
373
+ "prompt_id": "prompt_05",
374
+ "psnr_db": 23.842746213927057,
375
+ "seed": 6913066525750388688
376
+ },
377
+ {
378
+ "mae_rgb_8bit": 2.7879279454549155,
379
+ "mse_rgb_8bit": 58.42911624908447,
380
+ "prompt_id": "prompt_06",
381
+ "psnr_db": 30.464510432902898,
382
+ "seed": 7394637781574154634
383
+ },
384
+ {
385
+ "mae_rgb_8bit": 5.940625826517741,
386
+ "mse_rgb_8bit": 289.7194878260295,
387
+ "prompt_id": "prompt_07",
388
+ "psnr_db": 23.511026520961206,
389
+ "seed": 8805682773639136733
390
+ },
391
+ {
392
+ "mae_rgb_8bit": 2.69136110941569,
393
+ "mse_rgb_8bit": 49.07272084554037,
394
+ "prompt_id": "prompt_08",
395
+ "psnr_db": 31.22240222686356,
396
+ "seed": 8599963958067732996
397
+ },
398
+ {
399
+ "mae_rgb_8bit": 5.244619369506836,
400
+ "mse_rgb_8bit": 213.63016319274902,
401
+ "prompt_id": "prompt_09",
402
+ "psnr_db": 24.83417788619411,
403
+ "seed": 5673822435512390978
404
+ },
405
+ {
406
+ "mae_rgb_8bit": 3.4313023885091147,
407
+ "mse_rgb_8bit": 102.67724291483562,
408
+ "prompt_id": "prompt_10",
409
+ "psnr_db": 28.01606162369761,
410
+ "seed": 4537681100734872717
411
+ },
412
+ {
413
+ "mae_rgb_8bit": 1.7503690719604492,
414
+ "mse_rgb_8bit": 21.204309781392414,
415
+ "prompt_id": "prompt_11",
416
+ "psnr_db": 34.86656220502798,
417
+ "seed": 6991054715693460219
418
+ },
419
+ {
420
+ "mae_rgb_8bit": 2.6095762252807617,
421
+ "mse_rgb_8bit": 47.14798386891683,
422
+ "prompt_id": "prompt_12",
423
+ "psnr_db": 31.396172345967884,
424
+ "seed": 4444155078815147914
425
+ },
426
+ {
427
+ "mae_rgb_8bit": 3.23709774017334,
428
+ "mse_rgb_8bit": 77.43270905812581,
429
+ "prompt_id": "prompt_13",
430
+ "psnr_db": 29.24155907126606,
431
+ "seed": 6135808568015678407
432
+ },
433
+ {
434
+ "mae_rgb_8bit": 1.647062619527181,
435
+ "mse_rgb_8bit": 26.97847906748454,
436
+ "prompt_id": "prompt_14",
437
+ "psnr_db": 33.82062898527484,
438
+ "seed": 713035478727730346
439
+ },
440
+ {
441
+ "mae_rgb_8bit": 4.368714014689128,
442
+ "mse_rgb_8bit": 104.97626558939616,
443
+ "prompt_id": "prompt_15",
444
+ "psnr_db": 27.91989241690556,
445
+ "seed": 248937108497645287
446
+ },
447
+ {
448
+ "mae_rgb_8bit": 6.765830675760905,
449
+ "mse_rgb_8bit": 187.27487786610922,
450
+ "prompt_id": "prompt_16",
451
+ "psnr_db": 25.406008383558977,
452
+ "seed": 5277644178537905334
453
+ },
454
+ {
455
+ "mae_rgb_8bit": 2.061037063598633,
456
+ "mse_rgb_8bit": 50.301029205322266,
457
+ "prompt_id": "prompt_17",
458
+ "psnr_db": 31.11503489656528,
459
+ "seed": 7635742545595743441
460
+ },
461
+ {
462
+ "mae_rgb_8bit": 6.625752766927083,
463
+ "mse_rgb_8bit": 274.37188784281415,
464
+ "prompt_id": "prompt_18",
465
+ "psnr_db": 23.747407493878026,
466
+ "seed": 300265456486907271
467
+ },
468
+ {
469
+ "mae_rgb_8bit": 3.0780162811279297,
470
+ "mse_rgb_8bit": 86.96947542826335,
471
+ "prompt_id": "prompt_19",
472
+ "psnr_db": 28.737135103091486,
473
+ "seed": 5279743298653840878
474
+ },
475
+ {
476
+ "mae_rgb_8bit": 4.515058835347493,
477
+ "mse_rgb_8bit": 118.36112753550212,
478
+ "prompt_id": "prompt_20",
479
+ "psnr_db": 27.398712671698327,
480
+ "seed": 533279967017145387
481
+ }
482
+ ],
483
+ "reference_model_id": "original_bf16"
484
+ },
485
+ {
486
+ "global_mae_rgb_8bit": 17.185767714182536,
487
+ "global_mse_rgb_8bit": 1048.3769245465596,
488
+ "global_psnr_db": 17.92562907590282,
489
+ "label": "Paper W4A4 + BF16 T5",
490
+ "max_pair_psnr_db": 27.43898551645215,
491
+ "mean_pair_psnr_db": 19.040987054028783,
492
+ "median_pair_psnr_db": 18.33645593419423,
493
+ "min_pair_psnr_db": 13.220893291481797,
494
+ "model_id": "paper_w4a4",
495
+ "pair_count": 20,
496
+ "pairs": [
497
+ {
498
+ "mae_rgb_8bit": 9.805227279663086,
499
+ "mse_rgb_8bit": 363.933437983195,
500
+ "prompt_id": "prompt_01",
501
+ "psnr_db": 22.520584007352777,
502
+ "seed": 2737473617249173572
503
+ },
504
+ {
505
+ "mae_rgb_8bit": 4.84106985727946,
506
+ "mse_rgb_8bit": 117.2686185836792,
507
+ "prompt_id": "prompt_02",
508
+ "psnr_db": 27.43898551645215,
509
+ "seed": 5636279213593584334
510
+ },
511
+ {
512
+ "mae_rgb_8bit": 10.301324208577475,
513
+ "mse_rgb_8bit": 391.7325661977132,
514
+ "prompt_id": "prompt_03",
515
+ "psnr_db": 22.20090683289783,
516
+ "seed": 2337272915321693975
517
+ },
518
+ {
519
+ "mae_rgb_8bit": 21.82541561126709,
520
+ "mse_rgb_8bit": 1270.901157061259,
521
+ "prompt_id": "prompt_04",
522
+ "psnr_db": 17.089685857758415,
523
+ "seed": 5284037423569190479
524
+ },
525
+ {
526
+ "mae_rgb_8bit": 15.27580738067627,
527
+ "mse_rgb_8bit": 945.251550356547,
528
+ "prompt_id": "prompt_05",
529
+ "psnr_db": 18.3753296252364,
530
+ "seed": 6913066525750388688
531
+ },
532
+ {
533
+ "mae_rgb_8bit": 10.646452903747559,
534
+ "mse_rgb_8bit": 339.07828934987384,
535
+ "prompt_id": "prompt_06",
536
+ "psnr_db": 22.827803773929737,
537
+ "seed": 7394637781574154634
538
+ },
539
+ {
540
+ "mae_rgb_8bit": 22.21392822265625,
541
+ "mse_rgb_8bit": 1860.1204293568928,
542
+ "prompt_id": "prompt_07",
543
+ "psnr_db": 15.435392983101881,
544
+ "seed": 8805682773639136733
545
+ },
546
+ {
547
+ "mae_rgb_8bit": 14.578474362691244,
548
+ "mse_rgb_8bit": 789.6456416447958,
549
+ "prompt_id": "prompt_08",
550
+ "psnr_db": 19.156481181901018,
551
+ "seed": 8599963958067732996
552
+ },
553
+ {
554
+ "mae_rgb_8bit": 23.46330388387044,
555
+ "mse_rgb_8bit": 1956.1720809936523,
556
+ "prompt_id": "prompt_09",
557
+ "psnr_db": 15.216733046194022,
558
+ "seed": 5673822435512390978
559
+ },
560
+ {
561
+ "mae_rgb_8bit": 35.05847581227621,
562
+ "mse_rgb_8bit": 3097.355337460836,
563
+ "prompt_id": "prompt_10",
564
+ "psnr_db": 13.220893291481797,
565
+ "seed": 4537681100734872717
566
+ },
567
+ {
568
+ "mae_rgb_8bit": 17.353435516357422,
569
+ "mse_rgb_8bit": 991.8816242218018,
570
+ "prompt_id": "prompt_11",
571
+ "psnr_db": 18.166205163497114,
572
+ "seed": 6991054715693460219
573
+ },
574
+ {
575
+ "mae_rgb_8bit": 9.548001925150553,
576
+ "mse_rgb_8bit": 311.9878346125285,
577
+ "prompt_id": "prompt_12",
578
+ "psnr_db": 23.189427010278493,
579
+ "seed": 4444155078815147914
580
+ },
581
+ {
582
+ "mae_rgb_8bit": 26.1892032623291,
583
+ "mse_rgb_8bit": 1978.286860148112,
584
+ "prompt_id": "prompt_13",
585
+ "psnr_db": 15.167910944629083,
586
+ "seed": 6135808568015678407
587
+ },
588
+ {
589
+ "mae_rgb_8bit": 12.478487650553385,
590
+ "mse_rgb_8bit": 633.0524272918701,
591
+ "prompt_id": "prompt_14",
592
+ "psnr_db": 20.116406825397924,
593
+ "seed": 713035478727730346
594
+ },
595
+ {
596
+ "mae_rgb_8bit": 19.866172154744465,
597
+ "mse_rgb_8bit": 1099.4894485473633,
598
+ "prompt_id": "prompt_15",
599
+ "psnr_db": 17.718892949379445,
600
+ "seed": 248937108497645287
601
+ },
602
+ {
603
+ "mae_rgb_8bit": 20.394683837890625,
604
+ "mse_rgb_8bit": 962.3258158365885,
605
+ "prompt_id": "prompt_16",
606
+ "psnr_db": 18.29758224315206,
607
+ "seed": 5277644178537905334
608
+ },
609
+ {
610
+ "mae_rgb_8bit": 9.971921920776367,
611
+ "mse_rgb_8bit": 427.9283091227214,
612
+ "prompt_id": "prompt_17",
613
+ "psnr_db": 21.817093431638046,
614
+ "seed": 7635742545595743441
615
+ },
616
+ {
617
+ "mae_rgb_8bit": 19.527167956034344,
618
+ "mse_rgb_8bit": 1111.8292411168416,
619
+ "prompt_id": "prompt_18",
620
+ "psnr_db": 17.67042269067247,
621
+ "seed": 300265456486907271
622
+ },
623
+ {
624
+ "mae_rgb_8bit": 16.195018132527668,
625
+ "mse_rgb_8bit": 903.1033693949381,
626
+ "prompt_id": "prompt_19",
627
+ "psnr_db": 18.573428982747764,
628
+ "seed": 5279743298653840878
629
+ },
630
+ {
631
+ "mae_rgb_8bit": 24.181782404581707,
632
+ "mse_rgb_8bit": 1416.1944516499836,
633
+ "prompt_id": "prompt_20",
634
+ "psnr_db": 16.61957472287724,
635
+ "seed": 533279967017145387
636
+ }
637
+ ],
638
+ "reference_model_id": "original_bf16"
639
+ }
640
+ ],
641
+ "schema_version": 1,
642
+ "source_grid_manifest_sha256": "22354490f79e3126d129098ad14d4baa07fbba43d8f9f9d4a2862f4a385b914d",
643
+ "status": "verified_complete"
644
+ }
manifests/conversion_summaries.json ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "base_model": {
4
+ "repo_id": "black-forest-labs/FLUX.1-dev",
5
+ "revision": "3de623fc3c33e44ffbe2bad470d0f45bccf2eb21",
6
+ "license_name": "flux-1-dev-non-commercial-license",
7
+ "license_url": "https://huggingface.co/black-forest-labs/FLUX.1-dev/blob/3de623fc3c33e44ffbe2bad470d0f45bccf2eb21/LICENSE.md"
8
+ },
9
+ "artifacts": {
10
+ "FLUX.1-dev-w8a8-convrot.safetensors": {
11
+ "policy": "whole_dit_w8a8_convrot",
12
+ "convrot_group_size": 256,
13
+ "counts": {
14
+ "w8a8": 304,
15
+ "preserve_bf16": 476
16
+ },
17
+ "limitations": [
18
+ "Paper scope is the FLUX.1 diffusion transformer; CLIP, T5, VAE, biases, norms, and non-block linears remain BF16.",
19
+ "ComfyUI fuses single-block q/k/v/MLP input projections into linear1, expanding component-level decisions to the fused tensor."
20
+ ],
21
+ "source_manifest_sha256": "859aa6f5321c0a528426a0518d1c3b20d0b1701d84896c1cf9c34611a8a8b322"
22
+ },
23
+ "FLUX.1-dev-int8_convrot.safetensors": {
24
+ "policy": "partial_profile_int8_convrot",
25
+ "convrot_group_size": 256,
26
+ "limitations": [
27
+ "Profile-based selective quantization rather than the whole-DiT paper ablation.",
28
+ "Larger checkpoint because more sensitive tensors remain at higher precision."
29
+ ],
30
+ "source_manifest_sha256": null
31
+ },
32
+ "FLUX.1-dev-paper-w4a4-convrot.safetensors": {
33
+ "policy": "paper_whole_dit_w4a4_convrot",
34
+ "convrot_group_size": 256,
35
+ "quantization_group_size": 64,
36
+ "counts": {
37
+ "w4a4": 301,
38
+ "preserve_bf16": 479
39
+ },
40
+ "limitations": [
41
+ "Memory-first experimental variant with substantially lower paired PSNR than INT8 variants.",
42
+ "ComfyUI fuses single-block q/k/v/MLP input projections into linear1, expanding component-level decisions to the fused tensor."
43
+ ],
44
+ "source_manifest_sha256": "aaa49f1d13d719eb813addf57e380f4d77c01032db1b33e03b8d9c1156fb7390"
45
+ },
46
+ "t5xxl_flux1_int8_convrot.safetensors": {
47
+ "policy": "t5xxl_encoder_w8a8_convrot",
48
+ "convrot_group_size": 256,
49
+ "counts": {
50
+ "w8a8": 168,
51
+ "preserve_bf16": 51
52
+ },
53
+ "limitations": [
54
+ "Experimental T5-XXL policy not evaluated by the ConvRot paper.",
55
+ "Image similarity does not establish text-comprehension equivalence."
56
+ ],
57
+ "source_manifest_sha256": "5ef2d35fef8945a9e9e5c68c028aa74a0ea47f2e834e80614fc4ab9542199bfb"
58
+ }
59
+ },
60
+ "paper": {
61
+ "title": "ConvRot: Rotation-Based Plug-and-Play 4-bit Quantization for Diffusion Transformers",
62
+ "arxiv": "2512.03673"
63
+ }
64
+ }
release_manifest.json ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "status": "ready_for_local_verification",
4
+ "created_at": "2026-07-20T16:40:30Z",
5
+ "suggested_repo_id": "SearchingMan/FLUX.1-dev-ConvRot",
6
+ "remote_status": "not_created",
7
+ "base_model": {
8
+ "repo_id": "black-forest-labs/FLUX.1-dev",
9
+ "revision": "3de623fc3c33e44ffbe2bad470d0f45bccf2eb21",
10
+ "gated": true,
11
+ "license": "other",
12
+ "license_name": "flux-1-dev-non-commercial-license",
13
+ "license_url": "https://huggingface.co/black-forest-labs/FLUX.1-dev/blob/3de623fc3c33e44ffbe2bad470d0f45bccf2eb21/LICENSE.md"
14
+ },
15
+ "artifact_total_bytes": 39047204632,
16
+ "artifacts": [
17
+ {
18
+ "repo_path": "FLUX.1-dev-w8a8-convrot.safetensors",
19
+ "source_relative_path": "diffusion_models/FLUX.1-dev-w8a8-convrot.safetensors",
20
+ "role": "whole_dit_w8a8_default",
21
+ "bytes": 11980878688,
22
+ "sha256": "3a15dd0b701173132bda34835b07fc6640bff94f048ee2e7a9660aa8e1bf723a",
23
+ "source_manifest_relative_path": "diffusion_models/FLUX.1-dev-w8a8-convrot.safetensors.manifest.json",
24
+ "source_manifest_sha256": "859aa6f5321c0a528426a0518d1c3b20d0b1701d84896c1cf9c34611a8a8b322"
25
+ },
26
+ {
27
+ "repo_path": "FLUX.1-dev-int8_convrot.safetensors",
28
+ "source_relative_path": "diffusion_models/FLUX.1-dev-int8_convrot.safetensors",
29
+ "role": "partial_int8_quality_first",
30
+ "bytes": 15920463088,
31
+ "sha256": "18f0af3a5ccc3c59044e282b8c1c70cce8356e8c01888693fc5e386e2576b72a",
32
+ "source_manifest_relative_path": null,
33
+ "source_manifest_sha256": null
34
+ },
35
+ {
36
+ "repo_path": "FLUX.1-dev-paper-w4a4-convrot.safetensors",
37
+ "source_relative_path": "diffusion_models/FLUX.1-dev-paper-w4a4-convrot.safetensors",
38
+ "role": "whole_dit_w4a4_memory_first_experimental",
39
+ "bytes": 6247752968,
40
+ "sha256": "431b92916da98eaa6c7a622db8302db5a49277fda97a7076835ebc3ca3f56ea0",
41
+ "source_manifest_relative_path": "diffusion_models/FLUX.1-dev-paper-w4a4-convrot.safetensors.manifest.json",
42
+ "source_manifest_sha256": "aaa49f1d13d719eb813addf57e380f4d77c01032db1b33e03b8d9c1156fb7390"
43
+ },
44
+ {
45
+ "repo_path": "t5xxl_flux1_int8_convrot.safetensors",
46
+ "source_relative_path": "text_encoders/t5xxl_flux1_int8_convrot.safetensors",
47
+ "role": "optional_t5xxl_w8a8_companion",
48
+ "bytes": 4898109888,
49
+ "sha256": "78cd681f670b4bc064a8880e40bd4806aa266c6b484a2012846cbeae6f0bfe17",
50
+ "source_manifest_relative_path": "text_encoders/t5xxl_flux1_int8_convrot.safetensors.manifest.json",
51
+ "source_manifest_sha256": "5ef2d35fef8945a9e9e5c68c028aa74a0ea47f2e834e80614fc4ab9542199bfb"
52
+ }
53
+ ],
54
+ "required_repository_files": [
55
+ ".gitattributes",
56
+ "LICENSE_NOTICE.md",
57
+ "README.md",
58
+ "assets/VRAM_MATRIX.md",
59
+ "assets/grid_verification.json",
60
+ "assets/overview_contact_sheet.png",
61
+ "assets/quality_metrics.json",
62
+ "manifests/conversion_summaries.json",
63
+ "release_manifest.json",
64
+ "scripts/compute_quality_metrics.py",
65
+ "scripts/upload.py",
66
+ "scripts/verify_release.py",
67
+ "workflows/FLUX1_Dev_ConvRot_API.json"
68
+ ],
69
+ "excluded_artifacts": [
70
+ "Original BF16 reference",
71
+ "CLIP-L",
72
+ "BF16 T5-XXL",
73
+ "VAE"
74
+ ],
75
+ "evidence": {
76
+ "overview_contact_sheet": {
77
+ "repo_path": "assets/overview_contact_sheet.png",
78
+ "bytes": 9961323,
79
+ "sha256": "3af42bd633bd813f806ff8652a23e21b133004b012ef509656ce336914e914d0",
80
+ "width": 2596,
81
+ "height": 2948
82
+ },
83
+ "source_grid_manifest_sha256": "22354490f79e3126d129098ad14d4baa07fbba43d8f9f9d4a2862f4a385b914d",
84
+ "quality_global_psnr_db": {
85
+ "t5_int8_convrot": 26.55898542834396,
86
+ "whole_w8a8": 27.39914263741072,
87
+ "convrot_int8": 27.88817356191052,
88
+ "paper_w4a4": 17.92562907590282
89
+ },
90
+ "grid_pixel_identity": "PASS for all 100 rendered source regions",
91
+ "vram_run_id": "20260719T215033Z_1143248"
92
+ },
93
+ "upload_policy": {
94
+ "default_mode": "dry_run",
95
+ "remote_creation": "explicit_private_only",
96
+ "license_acceptance_flag_required": true,
97
+ "full_model_hash_verification_required": true
98
+ }
99
+ }
release_verification.json ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "artifact_count": 4,
3
+ "artifact_total_bytes": 39047204632,
4
+ "artifacts": [
5
+ {
6
+ "bytes": 11980878688,
7
+ "hash_verified": true,
8
+ "repo_path": "FLUX.1-dev-w8a8-convrot.safetensors",
9
+ "sha256": "3a15dd0b701173132bda34835b07fc6640bff94f048ee2e7a9660aa8e1bf723a",
10
+ "source_relative_path": "diffusion_models/FLUX.1-dev-w8a8-convrot.safetensors"
11
+ },
12
+ {
13
+ "bytes": 15920463088,
14
+ "hash_verified": true,
15
+ "repo_path": "FLUX.1-dev-int8_convrot.safetensors",
16
+ "sha256": "18f0af3a5ccc3c59044e282b8c1c70cce8356e8c01888693fc5e386e2576b72a",
17
+ "source_relative_path": "diffusion_models/FLUX.1-dev-int8_convrot.safetensors"
18
+ },
19
+ {
20
+ "bytes": 6247752968,
21
+ "hash_verified": true,
22
+ "repo_path": "FLUX.1-dev-paper-w4a4-convrot.safetensors",
23
+ "sha256": "431b92916da98eaa6c7a622db8302db5a49277fda97a7076835ebc3ca3f56ea0",
24
+ "source_relative_path": "diffusion_models/FLUX.1-dev-paper-w4a4-convrot.safetensors"
25
+ },
26
+ {
27
+ "bytes": 4898109888,
28
+ "hash_verified": true,
29
+ "repo_path": "t5xxl_flux1_int8_convrot.safetensors",
30
+ "sha256": "78cd681f670b4bc064a8880e40bd4806aa266c6b484a2012846cbeae6f0bfe17",
31
+ "source_relative_path": "text_encoders/t5xxl_flux1_int8_convrot.safetensors"
32
+ }
33
+ ],
34
+ "model_hashes_verified": true,
35
+ "overview_sha256": "3af42bd633bd813f806ff8652a23e21b133004b012ef509656ce336914e914d0",
36
+ "quality_source_grid_manifest_sha256": "22354490f79e3126d129098ad14d4baa07fbba43d8f9f9d4a2862f4a385b914d",
37
+ "remote_status": "not_created",
38
+ "schema_version": 1,
39
+ "status": "PASS",
40
+ "suggested_repo_id": "SearchingMan/FLUX.1-dev-ConvRot",
41
+ "support_file_count": 13,
42
+ "support_files": [
43
+ {
44
+ "bytes": 92,
45
+ "path": ".gitattributes",
46
+ "sha256": "32c3d5d9a15f591030c3a116ba7d068f88aa3e59f3f50edfa173e9174fa8d627"
47
+ },
48
+ {
49
+ "bytes": 682,
50
+ "path": "LICENSE_NOTICE.md",
51
+ "sha256": "89032e53e2394d6c57571ff9040feab2c0035836d0bb1bf5ea778f8436014c0a"
52
+ },
53
+ {
54
+ "bytes": 8682,
55
+ "path": "README.md",
56
+ "sha256": "e89065eda3304345d8ea7b751013646277347f6ee78a7482d9eecd1294112175"
57
+ },
58
+ {
59
+ "bytes": 1546,
60
+ "path": "assets/VRAM_MATRIX.md",
61
+ "sha256": "046a6f12f5f5bde79c3313b024ce8d52a582290aaea32004dca8d3313d15ff66"
62
+ },
63
+ {
64
+ "bytes": 770,
65
+ "path": "assets/grid_verification.json",
66
+ "sha256": "8d3e99f9b1c57ec0a6799ad82fb4254aef76a01944501e87ce1ea9931a890cbb"
67
+ },
68
+ {
69
+ "bytes": 9961323,
70
+ "path": "assets/overview_contact_sheet.png",
71
+ "sha256": "3af42bd633bd813f806ff8652a23e21b133004b012ef509656ce336914e914d0"
72
+ },
73
+ {
74
+ "bytes": 20793,
75
+ "path": "assets/quality_metrics.json",
76
+ "sha256": "344a9a188960ca8649ab4f85f0c28aa6da06d08b2a8f2e8fa81f2e22d756efa4"
77
+ },
78
+ {
79
+ "bytes": 2596,
80
+ "path": "manifests/conversion_summaries.json",
81
+ "sha256": "bfaa7cfcd14e55460cac0a63e6293ccc9bc6f25d31e2fd882d7c087f39e85bfc"
82
+ },
83
+ {
84
+ "bytes": 4058,
85
+ "path": "release_manifest.json",
86
+ "sha256": "c90982a897a7ebdbf1938e9c0ad1486ba095eb41ad854467bb701b317a4c7a2b"
87
+ },
88
+ {
89
+ "bytes": 7160,
90
+ "path": "scripts/compute_quality_metrics.py",
91
+ "sha256": "e38c568d5d2797fc6f70a0e7e2eca75e5e0a981c85652126e2ed575f55b7fa8d"
92
+ },
93
+ {
94
+ "bytes": 6261,
95
+ "path": "scripts/upload.py",
96
+ "sha256": "7717d9a996bdc76c80fe81b022d381b9c5720de1cd0e8cc8ed864efc405990c5"
97
+ },
98
+ {
99
+ "bytes": 7812,
100
+ "path": "scripts/verify_release.py",
101
+ "sha256": "b90a5074b0a4349c6cceba0461b95d3814f291b4a7309484eec03389962dac85"
102
+ },
103
+ {
104
+ "bytes": 1848,
105
+ "path": "workflows/FLUX1_Dev_ConvRot_API.json",
106
+ "sha256": "b369b4acd6111fbb7549724eaeebf3c3325dad244590078f1428de44f1b2ac6e"
107
+ }
108
+ ],
109
+ "verified_at": "2026-07-20T16:53:14+00:00"
110
+ }
scripts/__pycache__/compute_quality_metrics.cpython-311.pyc ADDED
Binary file (11.8 kB). View file
 
scripts/__pycache__/upload.cpython-311.pyc ADDED
Binary file (10.3 kB). View file
 
scripts/__pycache__/verify_release.cpython-311.pyc ADDED
Binary file (13.4 kB). View file
 
scripts/compute_quality_metrics.py ADDED
@@ -0,0 +1,187 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Compute paired RGB metrics for publication candidates against Original BF16."""
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ import hashlib
7
+ import json
8
+ import math
9
+ import os
10
+ from datetime import datetime, timezone
11
+ from pathlib import Path
12
+ from typing import Any
13
+
14
+ import numpy as np
15
+ from PIL import Image
16
+
17
+ REFERENCE_ID = "original_bf16"
18
+ EXPECTED_GRID_COUNT = 20
19
+ CHUNK_BYTES = 4 * 1024 * 1024
20
+
21
+
22
+ class MetricError(RuntimeError):
23
+ pass
24
+
25
+
26
+ def parse_args() -> argparse.Namespace:
27
+ parser = argparse.ArgumentParser(description=__doc__)
28
+ parser.add_argument("--grid-manifest", type=Path, required=True)
29
+ parser.add_argument("--output", type=Path, required=True)
30
+ return parser.parse_args()
31
+
32
+
33
+ def sha256_file(path: Path) -> str:
34
+ digest = hashlib.sha256()
35
+ with path.open("rb") as handle:
36
+ for chunk in iter(lambda: handle.read(CHUNK_BYTES), b""):
37
+ digest.update(chunk)
38
+ return digest.hexdigest()
39
+
40
+
41
+ def psnr(mse: float) -> float | str:
42
+ if mse == 0.0:
43
+ return "infinity"
44
+ return 10.0 * math.log10((255.0**2) / mse)
45
+
46
+
47
+ def load_rgb(record: dict[str, Any]) -> np.ndarray:
48
+ path = Path(str(record["path"])).resolve(strict=True)
49
+ if path.stat().st_size != int(record["bytes"]):
50
+ raise MetricError(f"byte drift: {path}")
51
+ if sha256_file(path) != str(record["sha256"]):
52
+ raise MetricError(f"hash drift: {path}")
53
+ with Image.open(path) as image:
54
+ if image.size != (1024, 1024):
55
+ raise MetricError(f"dimension drift: {path}: {image.size}")
56
+ return np.asarray(image.convert("RGB"), dtype=np.float64)
57
+
58
+
59
+ def atomic_json(path: Path, value: dict[str, Any]) -> None:
60
+ path.parent.mkdir(parents=True, exist_ok=True)
61
+ temporary = path.with_name(f".{path.name}.{os.getpid()}.tmp")
62
+ temporary.write_text(
63
+ json.dumps(value, indent=2, sort_keys=True) + "\n", encoding="utf-8"
64
+ )
65
+ os.replace(temporary, path)
66
+
67
+
68
+ def main() -> int:
69
+ args = parse_args()
70
+ manifest_path = args.grid_manifest.expanduser().resolve(strict=True)
71
+ manifest = json.loads(manifest_path.read_text(encoding="utf-8"))
72
+ grids = manifest.get("grids")
73
+ if not isinstance(grids, list) or len(grids) != EXPECTED_GRID_COUNT:
74
+ raise MetricError(f"expected {EXPECTED_GRID_COUNT} verified grids")
75
+ if manifest.get("status") != "verified" or manifest.get("profile") != "publication":
76
+ raise MetricError("grid manifest is not a verified publication profile")
77
+
78
+ expected_models: list[tuple[str, str]] | None = None
79
+ accumulators: dict[str, dict[str, Any]] = {}
80
+ prompt_ids: set[str] = set()
81
+
82
+ for grid in grids:
83
+ prompt_id = str(grid["prompt_id"])
84
+ if prompt_id in prompt_ids:
85
+ raise MetricError(f"duplicate prompt: {prompt_id}")
86
+ prompt_ids.add(prompt_id)
87
+ columns = grid.get("columns")
88
+ if not isinstance(columns, list):
89
+ raise MetricError(f"missing columns for {prompt_id}")
90
+ by_id = {str(column["model_id"]): column for column in columns}
91
+ if len(by_id) != len(columns) or REFERENCE_ID not in by_id:
92
+ raise MetricError(f"invalid model inventory for {prompt_id}")
93
+ models = [(str(column["model_id"]), str(column["label"])) for column in columns]
94
+ if expected_models is None:
95
+ expected_models = models
96
+ for model_id, label in models:
97
+ if model_id != REFERENCE_ID:
98
+ accumulators[model_id] = {
99
+ "label": label,
100
+ "sum_abs_error": 0.0,
101
+ "sum_squared_error": 0.0,
102
+ "value_count": 0,
103
+ "pairs": [],
104
+ }
105
+ elif models != expected_models:
106
+ raise MetricError(f"column order drift for {prompt_id}")
107
+
108
+ reference = load_rgb(by_id[REFERENCE_ID])
109
+ for model_id, _label in models:
110
+ if model_id == REFERENCE_ID:
111
+ continue
112
+ candidate = load_rgb(by_id[model_id])
113
+ difference = candidate - reference
114
+ absolute_error = float(np.abs(difference).sum(dtype=np.float64))
115
+ squared_error = float(np.square(difference).sum(dtype=np.float64))
116
+ value_count = int(difference.size)
117
+ pair_mse = squared_error / value_count
118
+ accumulator = accumulators[model_id]
119
+ accumulator["sum_abs_error"] += absolute_error
120
+ accumulator["sum_squared_error"] += squared_error
121
+ accumulator["value_count"] += value_count
122
+ accumulator["pairs"].append(
123
+ {
124
+ "prompt_id": prompt_id,
125
+ "seed": int(grid["seed"]),
126
+ "mae_rgb_8bit": absolute_error / value_count,
127
+ "mse_rgb_8bit": pair_mse,
128
+ "psnr_db": psnr(pair_mse),
129
+ }
130
+ )
131
+
132
+ if expected_models is None:
133
+ raise MetricError("no models found")
134
+
135
+ results: list[dict[str, Any]] = []
136
+ for model_id, label in expected_models:
137
+ if model_id == REFERENCE_ID:
138
+ continue
139
+ accumulator = accumulators[model_id]
140
+ value_count = int(accumulator["value_count"])
141
+ global_mse = float(accumulator["sum_squared_error"]) / value_count
142
+ global_mae = float(accumulator["sum_abs_error"]) / value_count
143
+ pair_scores = [float(pair["psnr_db"]) for pair in accumulator["pairs"]]
144
+ results.append(
145
+ {
146
+ "model_id": model_id,
147
+ "label": label,
148
+ "reference_model_id": REFERENCE_ID,
149
+ "pair_count": len(pair_scores),
150
+ "global_mae_rgb_8bit": global_mae,
151
+ "global_mse_rgb_8bit": global_mse,
152
+ "global_psnr_db": psnr(global_mse),
153
+ "mean_pair_psnr_db": float(np.mean(pair_scores)),
154
+ "median_pair_psnr_db": float(np.median(pair_scores)),
155
+ "min_pair_psnr_db": min(pair_scores),
156
+ "max_pair_psnr_db": max(pair_scores),
157
+ "pairs": accumulator["pairs"],
158
+ }
159
+ )
160
+
161
+ output = {
162
+ "schema_version": 1,
163
+ "status": "verified_complete",
164
+ "created_at": datetime.now(timezone.utc).isoformat(timespec="seconds"),
165
+ "source_grid_manifest_sha256": sha256_file(manifest_path),
166
+ "reference": {"model_id": REFERENCE_ID, "label": "Original BF16"},
167
+ "contract": {
168
+ "prompt_count": EXPECTED_GRID_COUNT,
169
+ "width": 1024,
170
+ "height": 1024,
171
+ "channels": "RGB",
172
+ "pixel_range": "8-bit [0,255]",
173
+ "same_prompt_seed_sampler_and_settings": True,
174
+ },
175
+ "results": results,
176
+ "limitations": [
177
+ "PSNR measures paired pixel similarity to the BF16 reference, not aesthetics or prompt adherence.",
178
+ "LPIPS and human-preference metrics were not computed.",
179
+ ],
180
+ }
181
+ atomic_json(args.output.expanduser().resolve(), output)
182
+ print(json.dumps({"status": output["status"], "results": results}, indent=2))
183
+ return 0
184
+
185
+
186
+ if __name__ == "__main__":
187
+ raise SystemExit(main())
scripts/upload.py ADDED
@@ -0,0 +1,170 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Dry-run by default uploader for the FLUX.1-dev ConvRot Hugging Face repo."""
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ import hashlib
7
+ import json
8
+ import os
9
+ import subprocess
10
+ import sys
11
+ from pathlib import Path
12
+ from typing import Any
13
+
14
+ ROOT = Path(__file__).resolve().parents[1]
15
+ MANIFEST_PATH = ROOT / "release_manifest.json"
16
+ VERIFY_SCRIPT = ROOT / "scripts/verify_release.py"
17
+ VERIFICATION_PATH = ROOT / "release_verification.json"
18
+ CHUNK_BYTES = 16 * 1024 * 1024
19
+
20
+
21
+ def parse_args() -> argparse.Namespace:
22
+ manifest = json.loads(MANIFEST_PATH.read_text(encoding="utf-8"))
23
+ parser = argparse.ArgumentParser(description=__doc__)
24
+ parser.add_argument("--repo-id", default=manifest["suggested_repo_id"])
25
+ parser.add_argument(
26
+ "--model-root",
27
+ type=Path,
28
+ default=Path(os.environ.get("COMFYUI_MODELS_ROOT", "/mnt/d/comfyui/models")),
29
+ )
30
+ parser.add_argument("--revision", default="main")
31
+ parser.add_argument("--execute", action="store_true", help="Perform network writes; default is dry-run.")
32
+ parser.add_argument(
33
+ "--create-private",
34
+ action="store_true",
35
+ help="Create a new private model repository before upload.",
36
+ )
37
+ parser.add_argument(
38
+ "--accept-flux-license",
39
+ action="store_true",
40
+ help="Confirm that the uploader reviewed and accepts the upstream FLUX.1-dev license.",
41
+ )
42
+ return parser.parse_args()
43
+
44
+
45
+ def load_manifest() -> dict[str, Any]:
46
+ value = json.loads(MANIFEST_PATH.read_text(encoding="utf-8"))
47
+ if not isinstance(value, dict):
48
+ raise RuntimeError("release manifest must be a JSON object")
49
+ return value
50
+
51
+
52
+ def sha256_file(path: Path) -> str:
53
+ digest = hashlib.sha256()
54
+ with path.open("rb") as handle:
55
+ for chunk in iter(lambda: handle.read(CHUNK_BYTES), b""):
56
+ digest.update(chunk)
57
+ return digest.hexdigest()
58
+
59
+
60
+ def existing_verification_is_current(manifest: dict[str, Any], model_root: Path) -> bool:
61
+ if not VERIFICATION_PATH.is_file():
62
+ return False
63
+ verification = json.loads(VERIFICATION_PATH.read_text(encoding="utf-8"))
64
+ if verification.get("status") != "PASS" or not verification.get("model_hashes_verified"):
65
+ return False
66
+ if verification.get("artifact_total_bytes") != manifest.get("artifact_total_bytes"):
67
+ return False
68
+ support = {record["path"]: record for record in verification.get("support_files", [])}
69
+ for relative in manifest["required_repository_files"]:
70
+ record = support.get(relative)
71
+ path = ROOT / relative
72
+ if record is None or not path.is_file() or path.is_symlink():
73
+ return False
74
+ if path.stat().st_size != record["bytes"] or sha256_file(path) != record["sha256"]:
75
+ return False
76
+ verified_artifacts = {
77
+ record["repo_path"]: record for record in verification.get("artifacts", [])
78
+ }
79
+ verification_mtime_ns = VERIFICATION_PATH.stat().st_mtime_ns
80
+ for artifact in manifest["artifacts"]:
81
+ record = verified_artifacts.get(artifact["repo_path"])
82
+ source = model_root / artifact["source_relative_path"]
83
+ if record is None or not record.get("hash_verified") or not source.is_file():
84
+ return False
85
+ if record.get("sha256") != artifact["sha256"]:
86
+ return False
87
+ if source.stat().st_size != artifact["bytes"] or source.stat().st_mtime_ns > verification_mtime_ns:
88
+ return False
89
+ return True
90
+
91
+
92
+ def main() -> int:
93
+ args = parse_args()
94
+ manifest = load_manifest()
95
+ model_root = args.model_root.expanduser().resolve(strict=True)
96
+ plan = {
97
+ "mode": "execute" if args.execute else "dry-run",
98
+ "repo_id": args.repo_id,
99
+ "revision": args.revision,
100
+ "create_private": args.create_private,
101
+ "support_root": str(ROOT),
102
+ "artifact_total_bytes": manifest["artifact_total_bytes"],
103
+ "artifacts": [
104
+ {
105
+ "source": str(model_root / artifact["source_relative_path"]),
106
+ "repo_path": artifact["repo_path"],
107
+ "bytes": artifact["bytes"],
108
+ "sha256": artifact["sha256"],
109
+ }
110
+ for artifact in manifest["artifacts"]
111
+ ],
112
+ }
113
+ print(json.dumps(plan, indent=2))
114
+ if not args.execute:
115
+ print("DRY RUN: no repository was created and no files were uploaded.")
116
+ return 0
117
+ if not args.accept_flux_license:
118
+ raise SystemExit("Refusing upload: pass --accept-flux-license after reviewing LICENSE_NOTICE.md")
119
+
120
+ if existing_verification_is_current(manifest, model_root):
121
+ print("Reusing current full-hash release_verification.json")
122
+ else:
123
+ subprocess.run(
124
+ [sys.executable, str(VERIFY_SCRIPT), "--model-root", str(model_root), "--models"],
125
+ check=True,
126
+ )
127
+
128
+ from huggingface_hub import HfApi
129
+
130
+ api = HfApi()
131
+ if args.create_private:
132
+ api.create_repo(repo_id=args.repo_id, repo_type="model", private=True, exist_ok=False)
133
+
134
+ support_paths = [
135
+ ".gitattributes",
136
+ "LICENSE_NOTICE.md",
137
+ "README.md",
138
+ "assets/*",
139
+ "manifests/*",
140
+ "release_manifest.json",
141
+ "release_verification.json",
142
+ "scripts/*",
143
+ "workflows/*",
144
+ ]
145
+ api.upload_folder(
146
+ repo_id=args.repo_id,
147
+ repo_type="model",
148
+ folder_path=str(ROOT),
149
+ path_in_repo=".",
150
+ revision=args.revision,
151
+ allow_patterns=support_paths,
152
+ commit_message="Add model card, workflows, and verified release evidence",
153
+ )
154
+ for artifact in manifest["artifacts"]:
155
+ source = model_root / artifact["source_relative_path"]
156
+ api.upload_file(
157
+ repo_id=args.repo_id,
158
+ repo_type="model",
159
+ path_or_fileobj=str(source),
160
+ path_in_repo=artifact["repo_path"],
161
+ revision=args.revision,
162
+ commit_message=f"Add {artifact['repo_path']}",
163
+ )
164
+ print(f"Upload complete: https://huggingface.co/{args.repo_id}")
165
+ print("If publication is intended, configure gating and review visibility in Hugging Face settings before making the repository public.")
166
+ return 0
167
+
168
+
169
+ if __name__ == "__main__":
170
+ raise SystemExit(main())
scripts/verify_release.py ADDED
@@ -0,0 +1,192 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Verify the local FLUX.1-dev ConvRot Hugging Face release package."""
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ import hashlib
7
+ import json
8
+ import math
9
+ import os
10
+ from datetime import datetime, timezone
11
+ from pathlib import Path
12
+ from typing import Any
13
+
14
+ CHUNK_BYTES = 16 * 1024 * 1024
15
+ ROOT = Path(__file__).resolve().parents[1]
16
+ MANIFEST_PATH = ROOT / "release_manifest.json"
17
+ OUTPUT_PATH = ROOT / "release_verification.json"
18
+
19
+
20
+ class VerificationError(RuntimeError):
21
+ pass
22
+
23
+
24
+ def parse_args() -> argparse.Namespace:
25
+ parser = argparse.ArgumentParser(description=__doc__)
26
+ parser.add_argument(
27
+ "--model-root",
28
+ type=Path,
29
+ default=Path(os.environ.get("COMFYUI_MODELS_ROOT", "/mnt/d/comfyui/models")),
30
+ )
31
+ parser.add_argument(
32
+ "--models",
33
+ action="store_true",
34
+ help="Hash all four model artifacts; required before upload.",
35
+ )
36
+ return parser.parse_args()
37
+
38
+
39
+ def sha256_file(path: Path) -> str:
40
+ digest = hashlib.sha256()
41
+ with path.open("rb") as handle:
42
+ for chunk in iter(lambda: handle.read(CHUNK_BYTES), b""):
43
+ digest.update(chunk)
44
+ return digest.hexdigest()
45
+
46
+
47
+ def load_json(path: Path) -> dict[str, Any]:
48
+ value = json.loads(path.read_text(encoding="utf-8"))
49
+ if not isinstance(value, dict):
50
+ raise VerificationError(f"expected JSON object: {path}")
51
+ return value
52
+
53
+
54
+ def require(condition: bool, message: str) -> None:
55
+ if not condition:
56
+ raise VerificationError(message)
57
+
58
+
59
+ def verify_regular_file(path: Path) -> None:
60
+ require(path.exists(), f"missing file: {path}")
61
+ require(path.is_file(), f"not a regular file: {path}")
62
+ require(not path.is_symlink(), f"symlink is not allowed: {path}")
63
+
64
+
65
+ def main() -> int:
66
+ args = parse_args()
67
+ manifest = load_json(MANIFEST_PATH)
68
+ require(manifest.get("status") == "ready_for_local_verification", "release status drift")
69
+ require(manifest.get("remote_status") == "not_created", "unexpected remote-status claim")
70
+ required = manifest.get("required_repository_files")
71
+ artifacts = manifest.get("artifacts")
72
+ if not isinstance(required, list):
73
+ raise VerificationError("missing required_repository_files")
74
+ if not isinstance(artifacts, list) or len(artifacts) != 4:
75
+ raise VerificationError("expected four artifacts")
76
+
77
+ support_records: list[dict[str, Any]] = []
78
+ for relative in required:
79
+ path = ROOT / str(relative)
80
+ verify_regular_file(path)
81
+ support_records.append(
82
+ {
83
+ "path": str(relative),
84
+ "bytes": path.stat().st_size,
85
+ "sha256": sha256_file(path),
86
+ }
87
+ )
88
+
89
+ unexpected_models = sorted(str(path.relative_to(ROOT)) for path in ROOT.rglob("*.safetensors"))
90
+ require(not unexpected_models, f"model files must not be duplicated into staging: {unexpected_models}")
91
+
92
+ readme = (ROOT / "README.md").read_text(encoding="utf-8")
93
+ for marker in (
94
+ "license: other",
95
+ "license_name: flux-1-dev-non-commercial-license",
96
+ "base_model: black-forest-labs/FLUX.1-dev",
97
+ "base_model_relation: quantized",
98
+ "pipeline_tag: text-to-image",
99
+ "FLUX.1-dev ConvRot for ComfyUI",
100
+ ):
101
+ require(marker in readme, f"model-card marker missing: {marker}")
102
+
103
+ workflow = load_json(ROOT / "workflows/FLUX1_Dev_ConvRot_API.json")
104
+ require(workflow["1"]["class_type"] == "UNETLoader", "workflow loader drift")
105
+ require(
106
+ workflow["1"]["inputs"]["unet_name"] == "FLUX.1-dev-w8a8-convrot.safetensors",
107
+ "workflow DiT default drift",
108
+ )
109
+ require(
110
+ workflow["2"]["inputs"]["clip_name2"] == "t5xxl_flux1_int8_convrot.safetensors",
111
+ "workflow T5 default drift",
112
+ )
113
+
114
+ evidence = manifest["evidence"]
115
+ overview = ROOT / evidence["overview_contact_sheet"]["repo_path"]
116
+ require(overview.stat().st_size == evidence["overview_contact_sheet"]["bytes"], "overview byte drift")
117
+ require(sha256_file(overview) == evidence["overview_contact_sheet"]["sha256"], "overview hash drift")
118
+
119
+ quality = load_json(ROOT / "assets/quality_metrics.json")
120
+ require(quality.get("status") == "verified_complete", "quality evidence status drift")
121
+ require(
122
+ quality.get("source_grid_manifest_sha256") == evidence["source_grid_manifest_sha256"],
123
+ "quality source-manifest drift",
124
+ )
125
+ results = quality.get("results")
126
+ if not isinstance(results, list) or len(results) != 4:
127
+ raise VerificationError("quality result inventory drift")
128
+ measured = {str(item["model_id"]): float(item["global_psnr_db"]) for item in results}
129
+ for model_id, expected in evidence["quality_global_psnr_db"].items():
130
+ require(model_id in measured, f"missing quality result: {model_id}")
131
+ require(math.isclose(measured[model_id], float(expected), rel_tol=0.0, abs_tol=1e-12), f"quality drift: {model_id}")
132
+
133
+ model_root = args.model_root.expanduser().resolve(strict=True)
134
+ artifact_records: list[dict[str, Any]] = []
135
+ total_bytes = 0
136
+ repo_paths: set[str] = set()
137
+ for artifact in artifacts:
138
+ repo_path = str(artifact["repo_path"])
139
+ require(repo_path not in repo_paths, f"duplicate repo path: {repo_path}")
140
+ repo_paths.add(repo_path)
141
+ source = (model_root / str(artifact["source_relative_path"])).resolve(strict=True)
142
+ require(source.is_file(), f"artifact is not a file: {source}")
143
+ actual_bytes = source.stat().st_size
144
+ require(actual_bytes == int(artifact["bytes"]), f"artifact byte drift: {source}")
145
+ total_bytes += actual_bytes
146
+ actual_hash = None
147
+ if args.models:
148
+ actual_hash = sha256_file(source)
149
+ require(actual_hash == str(artifact["sha256"]), f"artifact hash drift: {source}")
150
+ source_manifest_relative = artifact.get("source_manifest_relative_path")
151
+ if source_manifest_relative is not None:
152
+ source_manifest = (model_root / str(source_manifest_relative)).resolve(strict=True)
153
+ verify_regular_file(source_manifest)
154
+ require(
155
+ sha256_file(source_manifest) == str(artifact["source_manifest_sha256"]),
156
+ f"source conversion-manifest drift: {source_manifest}",
157
+ )
158
+ artifact_records.append(
159
+ {
160
+ "repo_path": repo_path,
161
+ "source_relative_path": str(artifact["source_relative_path"]),
162
+ "bytes": actual_bytes,
163
+ "sha256": actual_hash if actual_hash is not None else str(artifact["sha256"]),
164
+ "hash_verified": bool(args.models),
165
+ }
166
+ )
167
+
168
+ require(total_bytes == int(manifest["artifact_total_bytes"]), "artifact total-byte drift")
169
+ result = {
170
+ "schema_version": 1,
171
+ "status": "PASS",
172
+ "verified_at": datetime.now(timezone.utc).isoformat(timespec="seconds"),
173
+ "suggested_repo_id": manifest["suggested_repo_id"],
174
+ "remote_status": manifest["remote_status"],
175
+ "model_hashes_verified": bool(args.models),
176
+ "artifact_count": len(artifact_records),
177
+ "artifact_total_bytes": total_bytes,
178
+ "artifacts": artifact_records,
179
+ "support_file_count": len(support_records),
180
+ "support_files": support_records,
181
+ "overview_sha256": evidence["overview_contact_sheet"]["sha256"],
182
+ "quality_source_grid_manifest_sha256": evidence["source_grid_manifest_sha256"],
183
+ }
184
+ temporary = OUTPUT_PATH.with_name(f".{OUTPUT_PATH.name}.{os.getpid()}.tmp")
185
+ temporary.write_text(json.dumps(result, indent=2, sort_keys=True) + "\n", encoding="utf-8")
186
+ os.replace(temporary, OUTPUT_PATH)
187
+ print(json.dumps(result, indent=2, sort_keys=True))
188
+ return 0
189
+
190
+
191
+ if __name__ == "__main__":
192
+ raise SystemExit(main())
workflows/FLUX1_Dev_ConvRot_API.json ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "1": {
3
+ "class_type": "UNETLoader",
4
+ "inputs": {
5
+ "unet_name": "FLUX.1-dev-w8a8-convrot.safetensors",
6
+ "weight_dtype": "default"
7
+ },
8
+ "_meta": {
9
+ "title": "FLUX.1-dev Whole W8A8 ConvRot"
10
+ }
11
+ },
12
+ "2": {
13
+ "class_type": "DualCLIPLoader",
14
+ "inputs": {
15
+ "clip_name1": "clip_l_flux1.safetensors",
16
+ "clip_name2": "t5xxl_flux1_int8_convrot.safetensors",
17
+ "type": "flux",
18
+ "device": "default"
19
+ },
20
+ "_meta": {
21
+ "title": "FLUX CLIP-L + INT8 ConvRot T5-XXL"
22
+ }
23
+ },
24
+ "3": {
25
+ "class_type": "VAELoader",
26
+ "inputs": {
27
+ "vae_name": "ae_flux1.safetensors"
28
+ }
29
+ },
30
+ "4": {
31
+ "class_type": "CLIPTextEncode",
32
+ "inputs": {
33
+ "clip": ["2", 0],
34
+ "text": "A cinematic photograph of a futuristic city at sunrise, atmospheric light, intricate architecture, realistic materials, highly detailed"
35
+ }
36
+ },
37
+ "5": {
38
+ "class_type": "FluxGuidance",
39
+ "inputs": {
40
+ "conditioning": ["4", 0],
41
+ "guidance": 3.5
42
+ }
43
+ },
44
+ "6": {
45
+ "class_type": "ConditioningZeroOut",
46
+ "inputs": {
47
+ "conditioning": ["4", 0]
48
+ }
49
+ },
50
+ "7": {
51
+ "class_type": "EmptySD3LatentImage",
52
+ "inputs": {
53
+ "width": 1024,
54
+ "height": 1024,
55
+ "batch_size": 1
56
+ }
57
+ },
58
+ "8": {
59
+ "class_type": "KSampler",
60
+ "inputs": {
61
+ "model": ["1", 0],
62
+ "seed": 2737473617249173572,
63
+ "steps": 20,
64
+ "cfg": 1.0,
65
+ "sampler_name": "euler",
66
+ "scheduler": "simple",
67
+ "positive": ["5", 0],
68
+ "negative": ["6", 0],
69
+ "latent_image": ["7", 0],
70
+ "denoise": 1.0
71
+ }
72
+ },
73
+ "9": {
74
+ "class_type": "VAEDecode",
75
+ "inputs": {
76
+ "samples": ["8", 0],
77
+ "vae": ["3", 0]
78
+ }
79
+ },
80
+ "10": {
81
+ "class_type": "SaveImage",
82
+ "inputs": {
83
+ "images": ["9", 0],
84
+ "filename_prefix": "FLUX1-dev-ConvRot"
85
+ }
86
+ }
87
+ }