Views
No views yet
⚠️ This model was renamed
It was published asnanovdr/NanoVDR-L-Multi. Old links andfrom_pretrainedcalls still resolve through a redirect, but please move to the new id.diff1- SentenceTransformer("nanovdr/NanoVDR-L-Multi") 2+ SentenceTransformer("nanovdr/NanoVDR-Q-ModernBERT-Qwen3VL2B-2048-ML")Why. NanoVDR started as one thing: a small text encoder that replaces the query side of a large vision-language retriever. It has since grown a second tower that replaces the document side, and a second teacher, so a name like-Sno longer says enough. Two checkpoints only work together when they were distilled from the same teacher into the same width, and neither fact was recoverable from the old names.The scheme is nowNanoVDR-<Q|D>-<variant>-<teacher>-<width>[-ML], and the rule is simply that the teacher and the width have to match. This model isQ(query tower),ModernBERT(backbone), distilled from Qwen3-VL-Embedding-2B into 2048 dimensions, trained on the multilingual mixture (-ML).-MLused to be spelled-Multi, which read as multi-vector when it meant multilingual.
| Model | Params | ViDoRe v1 (en) | ViDoRe v2 (multi) | ViDoRe v3 (multi) |
|---|---|---|---|---|
| Qwen3-VL-Emb (Teacher) | 2.0B | 84.3 | 65.3 | 50.0 |
| NanoVDR-Q-ModernBERT-Qwen3VL2B-2048-ML | 151M | 82.2 | 63.1 | 47.1 |
| NanoVDR-Q-DistilBERT-Qwen3VL2B-2048-ML | 69M | 82.2 | 61.9 | 46.5 |
| ColPali | ~3B | 84.2 | 54.7 | 42.0 |
| Language | NDCG@5 | Teacher Retention |
|---|---|---|
| English | 50.7 | 93.0% |
| French | 47.8 | 93.6% |
| Spanish | 47.8 | 93.1% |
| Italian | 45.7 | 93.3% |
| German | 45.4 | 92.0% |
| Portuguese | 46.1 | 94.6% |
1from sentence_transformers import SentenceTransformer
2
3# Load the multilingual query encoder
4model = SentenceTransformer("nanovdr/NanoVDR-Q-ModernBERT-Qwen3VL2B-2048-ML")
5
6# Encode queries in any supported language
7queries = [
8 "What was the revenue growth in Q3 2024?", # English
9 "Quel est le chiffre d'affaires du trimestre?", # French
10 "Wie hoch war das Umsatzwachstum im dritten Quartal?", # German
11 "Cual fue el crecimiento de ingresos en el Q3?", # Spanish
12]
13query_embeddings = model.encode(queries)
14print(query_embeddings.shape) # (4, 2048)
15
16# Retrieve against pre-indexed document embeddings from the VLM teacher
17# scores = query_embeddings @ doc_embeddings.T1from sentence_transformers import SentenceTransformer
2
3# Step 1: Index documents with the VLM teacher (one-time, offline)
4from transformers import AutoModel
5teacher = AutoModel.from_pretrained("Qwen/Qwen3-VL-Embedding-2B")
6# doc_embeddings = teacher.encode(document_images) # See Qwen3-VL-Embedding docs
7
8# Step 2: Query with NanoVDR-Q-DistilBERT-Qwen3VL2B-2048-ML (online, fast, CPU-only)
9student = SentenceTransformer("nanovdr/NanoVDR-Q-ModernBERT-Qwen3VL2B-2048-ML")
10query_emb = student.encode("Quel est le chiffre d'affaires?")
11
12# Step 3: Retrieve
13scores = query_emb @ doc_embeddings.T
14top_k = scores.argsort()[-5:][::-1]| Model | Role | Params |
|---|---|---|
| NanoVDR-Q-DistilBERT-Qwen3VL8B-4096-ML | query tower | 70M |
| NanoVDR-D-HiRes-Qwen3VL8B-4096 | document tower | 457M |
| NanoVDR-D-Fast-Qwen3VL8B-4096 | document tower, 3x fewer visual tokens | 457M |
| Metric | NanoVDR-Q-ModernBERT-Qwen3VL2B-2048-ML | ColPali (3B) | Teacher (2B) |
|---|---|---|---|
| Query latency (CPU, B=1) | 51 ms | 7,300 ms | GPU only |
| Model size | 155M | ~3B | 2B |
| Index type | Single-vector | Multi-vector | Single-vector |
| Scoring | Cosine | MaxSim | Cosine |
1@article{nanovdr2026,
2 title={NanoVDR: Distilling a 2B Vision-Language Retriever into a 70M Text-Only Encoder for Visual Document Retrieval},
3 author={Liu, Zhuchenyang and Zhang, Yao and Xiao, Yu},
4 journal={arXiv preprint arXiv:2603.12824},
5 year={2026}
6}