Ten billion patches

Swann Bessa, Matthijs Douze and Hervé Jégou have put out Dino10B, a nearest-neighbour benchmark with ten billion vectors in it. Each one is 1024 dimensions, stored as one byte per dimension and compared with L2 distance. It ships as nested prefixes from 100k up to 10B, with exact top-10 ground truth for 100k held-out queries at every size, a loader in faiss, and a separate 99M-vector learning set - the sample you train IVF centroids and PQ codebooks on, so anyone can build baselines without touching the base vectors. On disk it comes to about 10.3 TB.

Their pitch is about hardware: "One billion was a pragmatic ceiling: big enough to matter, small enough for one machine." A server today has hundreds of gigabytes of RAM and terabytes of SSD, so ten billion on one box is a realistic target. Qdrant already has FineWeb-10B on text, but the reference points most ANN papers report against are still SIFT1B and Deep1B: 128-d local descriptors and 96-d CNN features, nothing like the 768-1024-d transformer embeddings people index now. Moving the bar up by 10x with modern features is overdue, and with Douze and Jégou's names on it, people will use it.

Where the ten billion comes from

They didn't find ten billion images. They took roughly 60 million Creative Commons Flickr photos from YFCC100M, ran DINOv3 ViT-L/16 over them, and kept the patch embeddings: a 14x14 grid, so 196 vectors per image. After quantising, dropping exact duplicates and shuffling, they keep an even 10B - about 170 vectors per source image.

That's a multi-vector corpus. It's the image version of what late interaction does with text, where you keep a vector per token instead of averaging the document down to a single point.

I've been arguing for a while that multi-vector representations are where retrieval quality comes from, and that the objection is always storage and index cost. Dino10B is that objection in benchmark form. Sixty million photos is a modest collection. Store it at patch granularity and it's as big as any public ANN benchmark. Not every 10B problem looks like this - FineWeb-10B is one vector per document, and LAION-5B got to five billion with one vector per image - but here the scale is the multiplier.

The shuffle

Their reasoning for the shuffle: "Raw patches from the same image are highly correlated, so a plain scan drifts over time." It's also what makes the nested prefixes work. Read in raw order, the first 100M vectors would be about half a million complete images. Shuffled, every prefix is a uniform sample of the whole. And if you're evaluating a clustering method - the companion paper is e-means, a k-means variant that claims to converge in a tenth of the epochs - an ordered stream of correlated points would skew every pass.

What the shuffle leaves alone is the geometry. It changes the order the vectors arrive in, not where they sit. Patches from the same photo still land near each other, IVF cells still fill up with siblings, and an index sees that structure whether the scan does or not. The image IDs are gone, though. The README lists base chunks, queries, the learning set and ground truth files, and no mapping back to images. Deduplication would complicate recovering one anyway, since a patch shared by two photos is now one vector.

So as released, Dino10B tests patch-to-patch search. That's a real workload in its own right - dense correspondence and patch retrieval for segmentation both need it. It's a long way from late-interaction retrieval, where one image query fans out into 196 patch lookups and a per-image aggregation. Whether MaxSim is even the right aggregation for DINO patches is open: ColBERT's token vectors are trained for that scoring, DINOv3's patches aren't, and DINO image retrieval normally uses one pooled vector. ColPali shows patch-level MaxSim works on images when the model is trained for it.

What I'd want next

  • Query granularity. The 100k queries are held out, but held-out patches or held-out images? If a query patch's siblings are in the base set, recall@10 is measuring something close to within-image matching.
  • Baselines. There are no ANN results in the post yet. The learning set is there to build them, and the first few papers to report on it will set the numbers everyone else compares against.
  • A grouped variant. Keep the image IDs and publish image-level ground truth alongside the patch-level one. Then the same 10.3 TB could benchmark late-interaction retrieval end to end, which is the version I'd run.

Fifteen years of bags of vectors

SIFT1B was built the same way: a billion local descriptors pulled from photos, quantised to bytes, cut into prefixes, image IDs thrown away. And Jégou and Douze's work before deep learning, Hamming Embedding and its relatives, matched local descriptors one at a time and then added up votes per image. That's late interaction under another name.

They've been handing the ANN community bags of per-image vectors for fifteen years, and we've been scoring them as points. Dino10B is the same move with a better feature extractor and one more zero. The structure that makes a ten-billion-vector image corpus possible is the structure a late-interaction system runs on. The shuffle hides it from a scan. It doesn't hide it from the index.