Melikshah/Operational-Harm / scripts /03_resid_profile.py
Melikshah's picture
download
raw
2.91 kB
import argparse
import json
import opharm
import numpy as np
import torch
from opharm.bench.smoke import smoke_prompts
from opharm.bench.tools import TOOLS
from opharm.chat import load_tokenizer, pins, render
from opharm.interp import hooks
from opharm.models import load_model
from opharm.paths import RESULTS
def main():
ap = argparse.ArgumentParser()
ap.add_argument("model")
args = ap.parse_args()
tok = load_tokenizer(args.model)
model = load_model(args.model)
mods = hooks.resid_modules(model)
types = getattr(getattr(model.config, "text_config", model.config), "layer_types", None) or ["full_attention"] * len(hooks.layers(model))
attn = [i for i, t in enumerate(types) if t == "full_attention"]
stats = {k: [[] for _ in mods] for k in ("median_norm", "sink_norm", "inst_norm", "post_norm", "inst_max", "post_max")}
top_dims = {"inst": [[] for _ in mods], "post": [[] for _ in mods]}
for s, u in smoke_prompts():
r = render(tok, s, u, TOOLS)
store = {}
def make(p):
def fn(h):
store[p] = h[0].float()
return h
return fn
with torch.inference_mode(), hooks.hooked([("pre", m, make(p)) for p, m in enumerate(mods)]):
model(input_ids=torch.tensor([r.ids], device=model.device), use_cache=False, logits_to_keep=1)
for p, h in store.items():
norms = h.norm(dim=-1)
stats["median_norm"][p].append(norms[1:].median().item())
stats["sink_norm"][p].append(norms[0].item())
for name, t in (("inst", r.t_inst), ("post", r.t_post)):
stats[f"{name}_norm"][p].append(norms[t].item())
stats[f"{name}_max"][p].append(h[t].abs().max().item() / h[t].abs().median().item())
top_dims[name][p].append(int(h[t].abs().argmax()))
table = []
for p in range(len(mods)):
kind = {"full_attention": "attention", "sliding_attention": "sliding"}
row = {"point": p, "block_in": "final" if p == len(mods) - 1 else kind.get(types[p], "gdn")}
row.update({k: float(np.median(v[p])) for k, v in stats.items()})
row.update({f"{k}_top_dim": max(set(v[p]), key=v[p].count) for k, v in top_dims.items()})
table.append(row)
RESULTS.mkdir(exist_ok=True)
(RESULTS / f"resid_profile_{args.model}.json").write_text(json.dumps(
{"model": args.model, "revision": pins()[args.model]["revision"], "attention_layers": attn, "rows": table}, indent=1))
print("point block median_norm sink_norm inst_norm post_norm inst_max/med post_max/med")
for row in table:
print(f"{row['point']:>5} {row['block_in']:>9} {row['median_norm']:>11.1f} {row['sink_norm']:>9.1f} "
f"{row['inst_norm']:>9.1f} {row['post_norm']:>9.1f} {row['inst_max']:>12.1f} {row['post_max']:>12.1f}")
if __name__ == "__main__":
main()

Xet Storage Details

Size:
2.91 kB
·
Xet hash:
f44f8cd01a7a591aeac519a60ef5e6a44f26f42f52b312364de14b7905e714f7

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.