Skip to content

Add topk-io/Iso-ModernColBERT model meta - #4812

Merged
Samoed merged 1 commit into
embeddings-benchmark:mainfrom
wgu9:add-iso-moderncolbert-model
Jun 25, 2026
Merged

Samoed merged 1 commit into
embeddings-benchmark:mainfrom
wgu9:add-iso-moderncolbert-model

Conversation

@wgu9

@wgu9 wgu9 commented Jun 14, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes #4758.

Adds the ModelMeta entry for topk-io/Iso-ModernColBERT to
mteb/models/model_implementations/pylate_models.py.

Iso-ModernColBERT is a PyLate / ColBERT late-interaction (multi-vector) model —
an isotropically corrected version of lightonai/GTE-ModernColBERT-v1 built
for faster bf16 inference at near-identical accuracy. It loads via the same
MultiVectorModel loader as the other ModernColBERT entries.

Metadata sources

All fields were taken from the model card + HF API (not guessed):

  • revision a43b93e62b11ff205b7f935c1ce2207bfed2d283 (current main)
  • license apache-2.0, languages eng-Latn
  • adapted_from lightonai/GTE-ModernColBERT-v1 (HF base_model), so it
    shares its architecture: 149,015,808 params, 128-dim embeddings, 8192 tokens
  • public_training_data lightonai/ms-marco-en-bge-gemma (card datasets)
  • release_date from the repo creation date (2026-05-27)

Verification

from mteb.models.model_implementations import MODEL_REGISTRY
MODEL_REGISTRY["topk-io/Iso-ModernColBERT"]  # registers cleanly
  • ruff check / ruff format --check: clean
  • pytest tests/test_models/test_model_meta.py -k "name_and_revision or hashable or without_prefix": 731 passed

Closes embeddings-benchmark#4758. Adds the ModelMeta entry for topk-io/Iso-ModernColBERT, a
PyLate/ColBERT late-interaction model that is an isotropically corrected
version of lightonai/GTE-ModernColBERT-v1 (same architecture, 149M params,
128-dim multi-vectors, 8192 max tokens, Apache-2.0). Metadata sourced from the
HF model card and API (revision, license, base model, training data).
@Samoed

Samoed commented Jun 14, 2026

Copy link
Copy Markdown
Member

Can you run tasks to reproduce results?

@Samoed Samoed changed the title Add topk-io/Iso-ModernColBERT model meta (#4758) Add topk-io/Iso-ModernColBERT model meta Jun 14, 2026
@Samoed Samoed added the new model Questions related to adding a new model to the benchmark label Jun 15, 2026
@wgu9

wgu9 commented Jun 24, 2026

Copy link
Copy Markdown
Contributor Author

I checked this branch again and did a best-effort local run.

What passed locally:

.venv312/bin/python - <<'PY'
from mteb.models.model_implementations import MODEL_REGISTRY
meta = MODEL_REGISTRY['topk-io/Iso-ModernColBERT']
print(meta.name)
print(meta.revision)
print(meta.framework)
print(meta.modalities)
print(meta.extra_requirements_groups)
print(meta.loader)
PY

Output confirms the registry entry resolves to MultiVectorModel with the pinned revision a43b93e62b11ff205b7f935c1ce2207bfed2d283 and pylate as the extra requirement. I also confirmed pylate, torch, transformers, and datasets are installed in the local env, and the model weights load successfully through mteb.get_model('topk-io/Iso-ModernColBERT').

I then tried to run the relevant small retrieval task:

.venv312/bin/mteb run \
  -m topk-io/Iso-ModernColBERT \
  -t NanoMSMARCORetrieval \
  --eval-splits train \
  --batch-size 64 \
  --output-folder /tmp/mteb-iso-moderncolbert-results \
  --verbosity 2 \
  --no-co2-tracker \
  --overwrite-strategy always

That run got through model loading, task loading, corpus standardization, and entered the PyLate MultiVector retrieval path, but I stopped it after several minutes on my local CPU-only run before it produced final metrics. NanoMSMARCORetrieval only has a train split in this checkout; using --eval-splits test fails with KeyError: 'test'.

Also, the currently failing lowest-deps CI job looks unrelated to this PR: it fails while downloading sentence-transformers/all-MiniLM-L6-v2 from the HF CDN with SSLEOFError, not while loading or testing topk-io/Iso-ModernColBERT. I tried to rerun the failed workflow, but GitHub requires repository admin rights for that rerun.

@Samoed

Samoed commented Jun 24, 2026

Copy link
Copy Markdown
Member

NanoMSMARCORetrieval only has a train split in this checkout; using --eval-splits test fails with KeyError: 'test

Yes, you don't need to run it on train

@wgu9

wgu9 commented Jun 24, 2026

Copy link
Copy Markdown
Contributor Author

Thanks, that makes sense. I reran this on a proper non-train eval split instead of using the Nano train split.

Completed local run:

import mteb

model = mteb.get_model("topk-io/Iso-ModernColBERT", device="mps")
evaluation = mteb.MTEB(tasks=[mteb.get_task("NFCorpus")])
results = evaluation.run(
    model,
    eval_splits=["test"],
    output_folder="/tmp/mteb-iso-moderncolbert-nfcorpus-mps",
    overwrite_results=True,
    co2_tracker=False,
    encode_kwargs={"batch_size": 16},
)

Run details:

  • task: NFCorpus
  • split: test
  • dataset revision: ec0fa4fe99da2ff19ca1214b7966684033a58814
  • model revision: a43b93e62b11ff205b7f935c1ce2207bfed2d283
  • MTEB version: 2.15.4
  • device: Apple MPS via Python API; the CLI in this checkout parses --device as an int, so --device mps is rejected
  • evaluation time: 246.7s

Key metrics from NFCorpus.json:

  • main_score / ndcg@10: 0.36991
  • map@10: 0.14613
  • recall@10: 0.17644
  • precision@10: 0.26625
  • mrr@10: 0.586329

So the registered MultiVectorModel path loads the pinned model and completes a retrieval task on a held-out test split.

@Samoed

Samoed commented Jun 24, 2026

Copy link
Copy Markdown
Member

They report 37.31 for nfcorpus. Do you have ideas why scores have this difference?

@wgu9

wgu9 commented Jun 24, 2026 •

Copy link
Copy Markdown
Contributor Author

I checked a few likely causes. I do not see evidence that the registry entry is loading the wrong revision/model, but I also cannot exactly reproduce the model-card number from the MTEB path.

What I verified locally:

  • The difference is small in absolute terms: my MTEB run is 36.991 NDCG@10 vs the model card's 37.31 for BEIR NFCorpus, so about 0.319 NDCG points.
  • The model card says those numbers come from an internal evaluation harness on BEIR, with Iso evaluated in bf16 and exact MaxSim for the NDCG@10 table.
  • The MTEB run uses mteb/nfcorpus at dataset revision ec0fa4fe99da2ff19ca1214b7966684033a58814 through the MultiVectorModel / PyLate wrapper.
  • I reran with explicit bf16 loading and the card's example batch size:
model = mteb.get_model(
    "topk-io/Iso-ModernColBERT",
    device="mps",
    model_kwargs={"torch_dtype": torch.bfloat16},
)
# dtype torch.bfloat16, query_length=32, document_length=300
# NFCorpus/test main_score remains ~0.37
  • I also tested whether the gap was caused by the 300-token PyLate document default vs the model's 8192 ModernBERT context. Forcing document_length=8192 did not explain it; it lowered this MTEB run to 36.115 NDCG@10.

So my best guess is that this is a small harness/data-path difference rather than a metadata issue: TopK's internal BEIR evaluation vs MTEB's mteb/nfcorpus wrapper and PyLate retrieval/scoring path. I can ask the model authors for the exact BEIR eval command/harness if you want the PR to match the card number more tightly before merge.

@Samoed Samoed left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gap is small and I think we can merge.

@Samoed
Samoed merged commit 521d9f3 into embeddings-benchmark:main Jun 25, 2026
12 of 13 checks passed
@wgu9
wgu9 deleted the add-iso-moderncolbert-model branch June 25, 2026 18:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new model Questions related to adding a new model to the benchmark

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add model: topk-io/Iso-ModernColBERT

2 participants