A fingerprint is the canonical identity of a model — a 32-byte BLAKE3 digest over its architecture, weights, and tokenizer. Two loads of the same checkpoint on the same environment produce the same digest; a single altered weight produces a completely different one.
1. Load a model
Any framework object works. This walkthrough uses HuggingFace transformers.
first_fingerprint.py··python
from transformers import AutoModel
model = AutoModel.from_pretrained("distilbert-base-uncased")2. Fingerprint it
first_fingerprint.py··python
import neuronscope as ns
fp = ns.fingerprint(model)
print(fp.hex)3. Verify determinism
Load the same checkpoint into a fresh process and compare. The digest is a value — equality is by bytes, not identity.
shellfocus a line, then ⌘/Ctrl+C or Enterbash
python -c 'import neuronscope as ns; from transformers import AutoModel; print(ns.fingerprint(AutoModel.from_pretrained("distilbert-base-uncased")).hex)'4. Split by component
kind="arch"— architecture only; stable across weight updates.kind="weights"— parameter tensors only.kind="tokenizer"— vocab + merges.
first_fingerprint.py··python
arch = ns.fingerprint(model, kind="arch").hex
weights = ns.fingerprint(model, kind="weights").hex
print(arch, weights, sep="\n")