File size: 1,993 Bytes
c5a149d | 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 | """Check that every tensor in a converted Hugging Face D-FINE checkpoint is bit-identical to a
tensor (or a q/k/v third of an in_proj tensor) of the official checkpoint.
python verify_official.py Peterande/D-FINE 19214e91f5ce4c1e609022c38b1fc953c47404e7 dfine_s_coco.pth \
ustc-community/dfine-small-coco f79e65b5fbb33ceb9d3ebba042955d7410c608f8
"""
import hashlib
import json
import sys
import torch
from huggingface_hub import hf_hub_download
from safetensors.torch import load_file
off_repo, off_rev, off_file, port_repo, port_rev = sys.argv[1:6]
def digest(t):
t = t.detach().contiguous().cpu()
return hashlib.sha256(str(t.dtype).encode() + str(tuple(t.shape)).encode() + t.numpy().tobytes()).hexdigest()
off_path = hf_hub_download(off_repo, off_file, revision=off_rev)
ckpt = torch.load(off_path, map_location="cpu", weights_only=False)
official = ckpt["model"]
pool = {}
for k, t in official.items():
if not torch.is_tensor(t):
continue
pool.setdefault(digest(t), k)
if "in_proj" in k and t.shape[0] % 3 == 0:
for i, part in enumerate(t.chunk(3, dim=0)):
pool.setdefault(digest(part), f"{k}[{'qkv'[i]}]")
port_path = hf_hub_download(port_repo, "model.safetensors", revision=port_rev)
port = load_file(port_path)
matched, unmatched = 0, []
for k, t in port.items():
if digest(t) in pool:
matched += 1
else:
unmatched.append((k, tuple(t.shape)))
nparams = sum(t.numel() for t in port.values())
unparams = sum(port[k].numel() for k, _ in unmatched)
print(json.dumps({
"official": f"{off_repo}@{off_rev}/{off_file}",
"official_sha256": hashlib.sha256(open(off_path, "rb").read()).hexdigest(),
"official_keys": list(ckpt.keys()),
"port": f"{port_repo}@{port_rev}/model.safetensors",
"port_tensors": len(port),
"matched": matched,
"unmatched": len(unmatched),
"unmatched_params": unparams,
"total_params": nparams,
"unmatched_sample": unmatched[:25],
}, indent=1))
|