Pre-merge diagnostic framework for LLM model merging — analyze, diagnose, and optimize before you merge.
Project description
MergeLens
Pre-merge diagnostics for LLM model merging
34% of top Open LLM Leaderboard models are merges, yet merging is blind trial-and-error. MergeLens tells you before you merge whether it will work — and which method to use.
What It Does
- Merge Compatibility Index (MCI) — A single 0-100 score: "should I merge these models?"
- 10 diagnostic metrics — cosine similarity, spectral subspace overlap, sign disagreement, task vector interference, CKA, and more
- Strategy recommender — Maps your diagnostic profile to the optimal merge method (SLERP, TIES, DARE, linear) with a ready-to-paste MergeKit config
- Conflict zone detection — Identifies exactly which layers will cause problems
- Interactive HTML reports — Self-contained dashboards with Plotly charts
- MCP server — AI assistants (Claude, Cursor) can diagnose merges natively
Install
pip install mergelens
Optional extras:
pip install mergelens[mcp] # MCP server for AI assistants
pip install mergelens[audit] # Capability probing (requires transformers)
pip install mergelens[all] # Everything
Quick Start
CLI
# Compare two models
mergelens compare model_a/ model_b/
# Compare HuggingFace Hub models
mergelens compare meta-llama/Llama-3-8B mistralai/Mistral-7B-v0.1
# With a base model (for task vector metrics)
mergelens compare model_a/ model_b/ --base base_model/
# Generate HTML report
mergelens compare model_a/ model_b/ --report report.html
# Diagnose a MergeKit config before running it
mergelens diagnose --config merge.yaml
# Start MCP server
mergelens serve
Python API
from mergelens import compare_models
result = compare_models(["model_a/", "model_b/"])
# Single compatibility score (0-100)
print(f"MCI: {result.mci.score} — {result.mci.verdict}")
# MCI: 72.3 — compatible
# Per-layer metrics
for layer in result.layer_metrics:
print(f"{layer.layer_name}: cosine={layer.cosine_similarity:.4f}")
# Conflict zones
for zone in result.conflict_zones:
print(f"Layers {zone.start_layer}-{zone.end_layer}: {zone.severity.value}")
print(f" Fix: {zone.recommendation}")
# Strategy recommendation
if result.strategy:
print(f"Use: {result.strategy.method.value}")
print(result.strategy.mergekit_yaml) # Copy-paste into MergeKit
from mergelens import diagnose_config
result = diagnose_config("merge.yaml")
print(f"Overall interference: {result.overall_interference:.4f}")
for score in result.interference_scores:
print(f" {score.layer_name}: {score.score:.4f}")
from mergelens import generate_report
generate_report(compare_result=result, output_path="dashboard.html")
Metrics
| Metric | What It Measures | Range | Source |
|---|---|---|---|
| Cosine Similarity | Weight vector alignment | [-1, 1] | Standard |
| L2 Distance | Normalized weight divergence | [0, +inf) | Standard |
| KL Divergence | Weight distribution difference | [0, +inf) | Standard |
| Spectral Subspace Overlap | Top-k SVD direction alignment | [0, 1] | Zhou et al. 2026 |
| Effective Rank Ratio | Dimensionality compatibility | [0, 1] | Shannon entropy |
| Sign Disagreement Rate | Parameter sign conflicts | [0, 1] | TIES-Merging (Yadav et al. 2023) |
| TSV Interference | Cross-task singular vector conflict | [0, +inf) | Gargiulo et al. 2025 |
| Task Vector Energy | Knowledge concentration in top SVs | [0, 1] | Choi et al. 2024 |
| CKA Similarity | Activation representation similarity | [0, 1] | Kornblith et al. 2019 |
| Merge Compatibility Index | Composite go/no-go score | [0, 100] | Ours |
MCI Verdicts
| Score | Verdict | Meaning |
|---|---|---|
| 75-100 | Highly Compatible | Merge with confidence |
| 55-74 | Compatible | Should work, monitor quality |
| 35-54 | Risky | Expect degradation, use targeted methods |
| 0-34 | Incompatible | These models likely shouldn't be merged |
Strategy Recommendations
MergeLens maps diagnostic profiles to merge methods. Different metrics predict success for different methods (Zhou et al. 2026 found only 46.7% metric overlap between methods):
| Diagnostic Profile | Recommended Method |
|---|---|
| High cosine similarity everywhere | SLERP |
| High sign disagreement (>30%) | TIES |
| Concentrated task vector energy | DARE |
| Low spectral overlap | Linear (small alpha) |
Each recommendation includes a ready-to-paste MergeKit YAML config.
MCP Integration
Add to your Claude Code or Cursor config:
{
"mcpServers": {
"mergelens": {
"command": "mergelens",
"args": ["serve"]
}
}
}
Available tools: compare_models, diagnose_merge, get_conflict_zones, suggest_strategy, generate_report, explain_layer, get_compatibility_score
Security
- No pickle/torch.load — Only
safetensors.safe_open(). No arbitrary code execution risk. - YAML safety —
yaml.safe_load()only. No deserialization attacks. - Path validation — MCP server rejects path traversal attempts.
- Tensor size limits — SVD operations capped at 50M elements to prevent DoS.
- No credential leakage — HF tokens never appear in reports or logs.
How It Works
MergeLens loads model weights lazily via memory-mapped safetensors (peak memory: 2x largest layer, not 2x full model). It computes metrics layer-by-layer, detects conflict zones, and aggregates everything into the MCI score. The strategy recommender uses a rule-based decision tree mapping diagnostic profiles to merge methods.
References
- Zhou et al. 2026, "Demystifying Mergeability of Homologous LLMs" (arXiv:2601.22285)
- Gargiulo et al. CVPR 2025, "Task Singular Vectors" (arXiv:2412.00081)
- Yadav et al. NeurIPS 2023, "TIES-Merging" (arXiv:2306.01708)
- Choi et al. 2024, "Revisiting Weight Averaging for Model Merging" (arXiv:2412.12153)
- Kornblith et al. 2019, "Similarity of Neural Network Representations Revisited"
- Rahamim et al. 2026, "Will it Merge?" (arXiv:2601.06672)
License
Apache 2.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mergelens-0.1.1.tar.gz.
File metadata
- Download URL: mergelens-0.1.1.tar.gz
- Upload date:
- Size: 36.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e6f4de810e4160e0eba773d257f8a01fd08fca068d504adf9650ac1d9f33b7fd
|
|
| MD5 |
14efdd626039e99bed30258dae07b2fb
|
|
| BLAKE2b-256 |
4c6872b9cc367ccfcbb5478480b0951c0be1b8a26d286f68de1b4d0d0fa479c7
|
File details
Details for the file mergelens-0.1.1-py3-none-any.whl.
File metadata
- Download URL: mergelens-0.1.1-py3-none-any.whl
- Upload date:
- Size: 46.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3e9b91659a172b39cc46c1336cb3b14c7ad02ee91afb841765a831c4bc21ac36
|
|
| MD5 |
8ef4bb09ca5670f365edd46e6fb79925
|
|
| BLAKE2b-256 |
c8fdffe46e81665ea8433f5b45331eae5842d0d11564245d8f7f77d98098624c
|