File size: 9,184 Bytes
f5b159e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
"""Losslessly extract the pinned BF16 GGUF; audit against the pinned upstream.

CPU-only preparation. This deliberately accepts only this BF16 checkpoint,
not arbitrary quantized GGUFs. No executable code is loaded from the model.
"""
import argparse
import hashlib
import json
import math
import os
from pathlib import Path
import shutil
import struct

import numpy as np

parser=argparse.ArgumentParser(description=__doc__)
parser.add_argument('--gguf',type=Path,required=True)
parser.add_argument('--original-snapshot',type=Path,required=True)
parser.add_argument('--output-dir',type=Path,required=True)
args=parser.parse_args()
ROOT=args.output_dir.resolve()
ROOT.mkdir(parents=True,exist_ok=False)
ORIGINAL=args.original_snapshot.resolve()
ORIGINAL_REVISION='790c92633540aa0cb11d9abf19eb46d861714758'
REVISION = '40319fb15542f0ad22921e0124a191a8a935a60a'
EXPECTED_HASH = 'f151c683a8aed4b310777017ebbbe3f2180f1180f7867115171adb7d50b0762a'
SOURCE = args.gguf.resolve()
SNAPSHOT = ROOT / 'bf16-snapshot'


def digest(path):
    with Path(path).open('rb') as f:
        return hashlib.file_digest(f, 'sha256').hexdigest()


def save_json(path, value):
    Path(path).write_text(json.dumps(value, indent=2) + '\n')


part = SOURCE.with_suffix('.gguf.part')
source = SOURCE if SOURCE.exists() else part
assert source.stat().st_size == 14230272800
actual = digest(source)
assert actual == EXPECTED_HASH, actual
if source == part:
    part.rename(SOURCE)
print('SOURCE SHA256 VERIFIED', actual, flush=True)

with SOURCE.open('rb') as f:
    def scalar(fmt):
        fmt = '<' + fmt
        return struct.unpack(fmt, f.read(struct.calcsize(fmt)))[0]

    def string():
        n = scalar('Q')
        assert n <= 1048576
        return f.read(n).decode('utf-8')

    def value(kind):
        if kind == 8:
            return string()
        return scalar({0:'B', 1:'b', 2:'H', 3:'h', 4:'I', 5:'i', 6:'f', 7:'?', 10:'Q', 11:'q', 12:'d'}[kind])

    assert f.read(4) == b'GGUF'
    assert scalar('I') == 3
    count, kv_count = scalar('Q'), scalar('Q')
    assert count == 297 and kv_count < 1000
    metadata = {}
    for _ in range(kv_count):
        key = string()
        assert key not in metadata
        metadata[key] = value(scalar('I'))
    assert metadata['general.architecture'] == 'qwen_image21'
    tensors = []
    names = set()
    for _ in range(count):
        name, ndims = string(), scalar('I')
        assert name not in names and 1 <= ndims <= 4
        names.add(name)
        shape = list(reversed([scalar('Q') for _ in range(ndims)]))
        assert all(0 < d <= 1048576 for d in shape)
        dtype, offset = scalar('I'), scalar('Q')
        assert dtype == 30, (name, dtype)
        tensors.append(dict(name=name, shape=shape, offset=offset, bytes=math.prod(shape)*2))
    header_end = f.tell()
    alignment = metadata.get('general.alignment', 32)
    assert alignment > 0 and alignment <= 4096 and alignment & (alignment-1) == 0
    data_start = (header_end + alignment-1) // alignment * alignment
    end = 0
    for t in sorted(tensors, key=lambda t: t['offset']):
        assert t['offset'] % alignment == 0 and t['offset'] >= end
        end = t['offset'] + t['bytes']
        assert data_start + end <= SOURCE.stat().st_size
    assert data_start + end == SOURCE.stat().st_size

# The author retained Diffusers parameter names. Verify that mapping exactly.
original = {}
for path in sorted((ORIGINAL/'transformer').glob('*.safetensors')):
    with path.open('rb') as f:
        header_size = struct.unpack('<Q', f.read(8))[0]
        header = json.loads(f.read(header_size))
    for name, row in header.items():
        if name == '__metadata__':
            continue
        assert name not in original
        original[name] = dict(row, path=path, start=8+header_size+row['data_offsets'][0])
assert names == set(original), (sorted(names-set(original)), sorted(set(original)-names))
for t in tensors:
    row = original[t['name']]
    assert t['shape'] == row['shape'] and row['dtype'] == 'BF16', (t, row)

SNAPSHOT.mkdir(exist_ok=False)
(SNAPSHOT/'transformer').mkdir()
for name in ('text_encoder', 'vae', 'processor', 'scheduler'):
    os.symlink(ORIGINAL/name, SNAPSHOT/name, target_is_directory=True)
for name in ('LICENSE', 'model_index.json'):
    if (ORIGINAL/name).exists():
        shutil.copyfile(ORIGINAL/name, SNAPSHOT/name)
shutil.copyfile(ORIGINAL/'transformer/config.json', SNAPSHOT/'transformer/config.json')

output = SNAPSHOT/'transformer/diffusion_pytorch_model.safetensors'
notice = 'BF16 checkpoint published by abenzerps, losslessly extracted from GGUF by EliovpAI. Built with Qwen. Training recipe unverified.'
header = {'__metadata__': {'format': 'pt', 'modification_notice': notice}}
offset = 0
for t in tensors:
    header[t['name']] = dict(dtype='BF16', shape=t['shape'], data_offsets=[offset, offset+t['bytes']])
    offset += t['bytes']
encoded = json.dumps(header, separators=(',', ':')).encode()
encoded += b' ' * (-len(encoded) % 8)
audit = dict(status='running', source_repository='abenzerps/Qwen-Image-2.1-Uncensored-GGUF',
             source_revision=REVISION, source_sha256=actual, source_bytes=SOURCE.stat().st_size,
             gguf_metadata=metadata, extraction='BF16 raw-byte copy, no numeric conversion',
             tensors=[], changed_tensors=0, changed_elements=0, total_elements=0,
             original_revision=ORIGINAL_REVISION, source_data_start=data_start)
with SOURCE.open('rb') as src, output.open('xb') as dest:
    dest.write(struct.pack('<Q', len(encoded)))
    dest.write(encoded)
    for index, t in enumerate(tensors):
        src.seek(data_start+t['offset'])
        sha = hashlib.sha256()
        remaining = t['bytes']
        changed = 0
        sq_diff = sq_ref = max_abs = 0.0
        orig = original[t['name']]
        with orig['path'].open('rb') as ref:
            ref.seek(orig['start'])
            while remaining:
                n = min(8*1024*1024, remaining)
                chunk = src.read(n)
                ref_chunk = ref.read(n)
                assert len(chunk) == len(ref_chunk) == n
                a, b = np.frombuffer(chunk, '<u2'), np.frombuffer(ref_chunk, '<u2')
                af = (a.astype(np.uint32) << 16).view(np.float32)
                bf = (b.astype(np.uint32) << 16).view(np.float32)
                assert np.isfinite(af).all() and np.isfinite(bf).all(), t['name']
                delta = af.astype(np.float64) - bf
                changed += int(np.count_nonzero(a != b))
                sq_diff += float(np.sum(delta*delta))
                sq_ref += float(np.sum(bf.astype(np.float64)**2))
                max_abs = max(max_abs, float(np.max(np.abs(delta))))
                dest.write(chunk)
                sha.update(chunk)
                remaining -= n
        record = dict(t, sha256=sha.hexdigest(), changed_elements_vs_original=changed,
                      relative_l2_vs_original=math.sqrt(sq_diff/max(sq_ref, 1e-300)), max_abs_vs_original=max_abs)
        audit['tensors'].append(record)
        audit['changed_tensors'] += int(changed > 0)
        audit['changed_elements'] += changed
        audit['total_elements'] += t['bytes']//2
        if index % 25 == 0:
            print('EXTRACTED', index+1, '/', count, t['name'], 'changed elements:', changed, flush=True)

# Independently read the completed safetensors and verify every raw tensor hash.
with output.open('rb') as f:
    n = struct.unpack('<Q', f.read(8))[0]
    complete_header = json.loads(f.read(n))
    for t in audit['tensors']:
        row = complete_header[t['name']]
        f.seek(8+n+row['data_offsets'][0])
        sha = hashlib.sha256()
        remaining = t['bytes']
        while remaining:
            chunk = f.read(min(8*1024*1024, remaining))
            assert chunk
            sha.update(chunk)
            remaining -= len(chunk)
        assert sha.hexdigest() == t['sha256'], t['name']
audit['output_sha256'] = digest(output)
audit['output_bytes'] = output.stat().st_size
audit['status'] = 'verified_lossless_bf16_extraction'
save_json(ROOT/'source-audit.json', audit)
assert audit['changed_tensors'] > 0, 'Source is identical to original; do not market this as a verified distinct fine-tune.'

# Retain the pinned original companion hashes; update only the transformer pin.
pin = json.loads((Path(__file__).resolve().parent/'original-source-manifest.json').read_text())
pin.update(repository=audit['source_repository'], revision=REVISION,
           original_companions_repository='Qwen/Qwen-Image-2.1', original_companions_revision=ORIGINAL_REVISION,
           bf16_gguf=dict(file=SOURCE.name, bytes=SOURCE.stat().st_size, sha256=actual),
           extraction_audit_sha256=digest(ROOT/'source-audit.json'))
pin['files'] = [r for r in pin['files'] if not (r['path'].startswith('transformer/') and r['path'].endswith('.safetensors'))]
pin['files'].append(dict(path='transformer/'+output.name, bytes=output.stat().st_size, sha256=audit['output_sha256']))
save_json(ROOT/'source-manifest.json', pin)
print('COMPLETE', audit['changed_tensors'], 'changed tensors;', audit['changed_elements'], 'changed elements of', audit['total_elements'], flush=True)