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))