malva-prune-brain / scripts /measure_full.py
malvalabel's picture
Upload scripts/measure_full.py with huggingface_hub
164eee7 verified
Raw
History Blame Contribute Delete
2.56 kB
import torch, json, time, re
import numpy as np
from transformers import AutoModelForImageTextToText, AutoTokenizer, AutoConfig
MODEL="/model"
cfg=AutoConfig.from_pretrained(MODEL); tc=cfg.text_config
L,E,K=tc.num_hidden_layers,tc.num_experts,tc.num_experts_per_tok
tok=AutoTokenizer.from_pretrained(MODEL,trust_remote_code=True)
print("cargando modelo...",flush=True); t0=time.time()
model=AutoModelForImageTextToText.from_pretrained(MODEL,device_map="auto",dtype=torch.bfloat16); model.eval()
print(f"cargado {time.time()-t0:.0f}s",flush=True)
counts=np.zeros((L,E),dtype=np.int64)
def mk(li):
def h(m,i,o):
lg=o[0] if isinstance(o,(tuple,list)) else o
if not torch.is_tensor(lg): return
lg=lg.reshape(-1,lg.shape[-1])
if lg.shape[-1]!=E: return
counts[li]+=torch.bincount(lg.float().topk(K,-1).indices.flatten(),minlength=E).cpu().numpy()
return h
nh=0
for n,mod in model.named_modules():
if re.search(r"layers\.(\d+)\.mlp\.gate$",n):
mod.register_forward_hook(mk(int(re.search(r"layers\.(\d+)\.",n).group(1)))); nh+=1
print(f"hooks {nh}",flush=True)
tools=json.load(open("/tools_native.json"))
corpus=[json.loads(l) for l in open("/corpus_prune.jsonl")]
SYS7K=corpus[0]["messages"][0]["content"]
SHORT="Eres Valentina, asesora de ventas de Malva Label. Usa las herramientas para guardar datos y gestionar el carrito."
text=tok.apply_chat_template([{"role":"system","content":SYS7K},{"role":"user","content":"hola"}],tools=tools,add_generation_prompt=False,tokenize=False)
ids=tok(text,return_tensors="pt").input_ids.to(model.device)
with torch.no_grad(): model(input_ids=ids,use_cache=False)
np.save("/counts_sys7k.npy",counts); print(f"[1] sys7k: {int((counts>0).sum(1).mean())} exp/capa ({ids.shape[1]}tok)",flush=True)
counts[:]=0
t0=time.time();done=0;errs=0
for ci,conv in enumerate(corpus):
try:
msgs=[{"role":"system","content":SHORT}]+conv["messages"][1:]
text=tok.apply_chat_template(msgs,tools=tools,add_generation_prompt=False,tokenize=False)
ids=tok(text,return_tensors="pt",truncation=True,max_length=4096).input_ids.to(model.device)
with torch.no_grad(): model(input_ids=ids,use_cache=False)
done+=1
except Exception: errs+=1
if (ci+1)%50==0:
np.save("/counts_conv.npy",counts)
el=time.time()-t0; print(f"[2] conv {ci+1}/{len(corpus)} {el:.0f}s ETA {el/(ci+1)*(len(corpus)-ci-1)/60:.0f}min",flush=True)
np.save("/counts_conv.npy",counts)
print(f"[2] CONV DONE {done} ok {errs} err {time.time()-t0:.0f}s",flush=True)