Spaces:
Running
Running
File size: 1,369 Bytes
b112551 | 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 | """Which token embeddings did fine-tuning move most? Streams only the embedding tensors."""
import sys, glob, os, json
import torch
from huggingface_hub import snapshot_download
from safetensors import safe_open
from transformers import AutoTokenizer
def emb(rid):
p = snapshot_download(rid, allow_patterns=["*.safetensors", "*.json"])
for f in sorted(glob.glob(os.path.join(p, "*.safetensors"))):
with safe_open(f, framework="pt") as fh:
for k in fh.keys():
if k.endswith("embed_tokens.weight") or k.endswith("wte.weight"):
return fh.get_tensor(k).float()
m, p = sys.argv[1], sys.argv[2]
watch = sys.argv[3:]
tok = AutoTokenizer.from_pretrained(m)
Em, Ep = emb(m), emb(p)
n = min(Em.shape[0], Ep.shape[0], len(tok))
rel = (Em[:n] - Ep[:n]).norm(dim=1) / (Ep[:n].norm(dim=1) + 1e-6)
order = rel.argsort(descending=True)
rank = torch.empty_like(order); rank[order] = torch.arange(n)
print("median rel change", rel.median().item(), "n tokens", n)
print("top 40:", [(tok.convert_tokens_to_string([tok.convert_ids_to_tokens(int(i))]), round(rel[i].item(), 4)) for i in order[:40]])
for w in watch:
for v in (w, " " + w, " " + w.capitalize(), w.capitalize()):
ids = tok(v, add_special_tokens=False)["input_ids"]
print(repr(v), ids, [(int(rank[i]), round(rel[i].item(), 4)) for i in ids])
|