ONNX model fingerprinting tool for detecting functionally equivalent models by creating fingerprints based on the model's architecture and weights.
- Canonicalization & Preprocessing Split: Separates preprocessing from core model components
- Architecture Fingerprints: WL-ish core graph + parameter-operation skeleton hashing
- Weight Fingerprints: Per-layer sketches robust to batch normalization, noise, and permutations
- Global Descriptors: 512D global descriptors for similarity comparison
- CLI Interface: Simple command-line interface for model analysis and comparison
model-fp/
├── model_fp/ # Main package
│ ├── canonicalize.py # ONNX loading, canonicalization, preprocessing split
│ ├── arch.py # Architecture fingerprinting (skeleton hashing)
│ ├── weights.py # Weight fingerprinting (per-layer sketches)
│ ├── compare.py # Fingerprint comparison and aggregation
│ ├── utils.py # Shared utilities (hashing, JSON helpers)
│ ├── analyzer.py # Weight analysis and outlier detection
│ └── cli.py # Click-based command-line interface
├── tests/ # Test suite
├── install.sh # Installation script (uv + venv)
├── pyproject.toml # Modern Python packaging
├── setup.py # Traditional packaging (for compatibility)
├── requirements.txt # Dependencies
├── README.md # This file - overview and quickstart
└── TECHNICAL.md # Technical documentation
git clone https://github.com/your-username/model-fp.git
cd model-fp
./install.shGet detailed information about a model's fingerprint
model-fp explain path/to/model.onnxOutput includes:
- Parameter count
- Architecture features (bag-of-ops)
- Preprocessing operations
- Various hash fingerprints (core graph, weights, skeleton)
- Global vector norm
Compare two models to check for duplicates:
model-fp compare model_a.onnx model_b.onnxOutput includes:
- Similarity scores (cosine similarity, exact matches)
- Equivalence verdict
- Detailed comparison metrics
Get a simple true/false result for model equivalence:
model-fp compare model_a.onnx model_b.onnx --equivReturns true or false with appropriate exit codes.
Analyze weight distributions and outliers:
model-fp analyze path/to/model.onnx --top 10model-fp explain my_model.onnxmodel-fp compare model1.onnx model2.onnx --equiv --equiv-threshold 0.995model-fp explain model.onnx --output results.json
model-fp compare a.onnx b.onnx --output comparison.jsonModel-FP uses a three-stage fingerprinting approach:
- Canonicalization: Loads and normalizes ONNX models, separating preprocessing from core components
- Architecture Fingerprinting: Creates hashes based on parameterized operations and graph structure
- Weight Fingerprinting: Generates per-layer descriptors and global 512D vectors for similarity comparison
The system is designed to be robust against:
- Minor export differences
- Preprocessing variations
- Batch normalization changes
- Weight permutations
- Noise and small perturbations