import argparse
import json
import sys
from pathlib import Path
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--model", required=True, help="HF repo id, e.g. Qwen/Qwen3-0.6B")
ap.add_argument("--output", required=True, help="output golden JSON path")
ap.add_argument(
"--prompts",
nargs="+",
default=[
"Hello",
"The capital of France is",
"2 + 2 =",
],
help="prompts to run",
)
ap.add_argument("--num-tokens", type=int, default=3, help="tokens per prompt")
args = ap.parse_args()
try:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
except ImportError as e:
print(f"ERROR: {e}", file=sys.stderr)
print("Install: pip install transformers torch", file=sys.stderr)
sys.exit(2)
print(f"Loading {args.model} in f32...")
tok = AutoTokenizer.from_pretrained(args.model)
model = AutoModelForCausalLM.from_pretrained(
args.model,
torch_dtype=torch.float32,
trust_remote_code=True,
)
model.eval()
records = []
for prompt in args.prompts:
print(f" prompt: {prompt!r}")
ids = tok(prompt, return_tensors="pt").input_ids
print(f" input tokens: {ids.tolist()[0]}")
with torch.no_grad():
out = model(input_ids=ids, use_cache=True)
last_logits = out.logits[0, -1, :].float().tolist()
kv = out.past_key_values
probs_sorted = sorted(
enumerate(last_logits), key=lambda kv: kv[1], reverse=True
)[:5]
next_id = int(torch.argmax(out.logits[0, -1, :]).item())
records.append(
{
"prompt": prompt,
"input_tokens": ids.tolist()[0],
"vocab_size": len(last_logits),
"last_logits": last_logits, "top5": probs_sorted,
"greedy_next_token": next_id,
"greedy_next_decoded": tok.decode([next_id]),
}
)
config = model.config.to_dict()
relevant = {
k: config.get(k)
for k in [
"model_type",
"hidden_size",
"num_attention_heads",
"num_key_value_heads",
"num_hidden_layers",
"vocab_size",
"rope_theta",
"rms_norm_eps",
"tie_word_embeddings",
"head_dim",
"intermediate_size",
]
if k in config
}
payload = {
"model_repo": args.model,
"config": relevant,
"records": records,
}
out_path = Path(args.output)
out_path.parent.mkdir(parents=True, exist_ok=True)
with out_path.open("w") as f:
json.dump(payload, f, indent=2)
print(f"wrote {out_path} ({len(records)} records, {len(records[0]['last_logits'])} logits each)")
if __name__ == "__main__":
main()