Skip to content

[Feature Request] Add a Large-TopK benchmark case: LAION-100M with top-1M ground truth #826

Description

@frankleaf

Summary

I'd like to request support for a large-TopK benchmark scenario: the LAION-100M dataset
with ground truth extended to top-1,000,000 neighbors per query, so that VDBBench can
measure recall/latency/QPS when a single search returns up to 1M results.

Motivation

Large-TopK retrieval (roughly K from 16K up to a few million) is a real production
workload, distinct from the usual K=10/100 setting:

  • Batch similarity retrieval — fetch the top 100K–1M most similar items for one query
    vector.
  • Data mining / candidate generation — extract large candidate sets for downstream
    filtering, ranking or model training.
  • Regression / evaluation corpora — materialize large result sets to build test
    corpora.

Vector databases have started shipping dedicated support for it. Milvus 2.6 has a
collection-level query_mode=large_topk that raises the topK limit from 16,384 to 1,000,000

Today there is no standard, reproducible benchmark for this regime, which makes it hard to
compare systems or to validate optimizations.

Current gap in VDBBench

  • Existing performance cases target small K (e.g. k=100), and the shipped
    neighbors.parquet ground truth is correspondingly narrow.
  • Recall computation assumes ground truth is at least as wide as the requested K, so a
    k=1_000_000 run cannot be scored against the current GT files.
  • As a result, evaluating large-TopK today requires generating custom ground truth
    out-of-band, which is exactly the duplicated effort a shared benchmark should remove.

Proposed scope

A new case (name TBD, e.g. Performance768D100M_TopK1M) based on the existing LAION-100M
base data, plus a wide ground-truth artifact:

  1. Wide GT: top-1M neighbor IDs per query. To keep the artifact manageable, a small
    query set is sufficient — large-TopK latency is seconds per query, so a large nq is
    neither necessary nor practical.

    Rough sizing (int64 IDs):

    • 100 queries × 1M × 8 B ≈ 800 MB
    • 1,000 queries × 1M × 8 B ≈ 8 GB

    So something like 50–200 queries seems like the right trade-off; optionally ship
    distances as well (doubles the size), or make GT width configurable
    (e.g. top-100K variant for a lighter run).

  2. Multi-level recall reporting: report recall@100 / @1K / @10K / @100K / @1M from a
    single run, since accuracy typically degrades non-uniformly across the result depth.

  3. Latency percentiles + throughput: p50/p95/p99 per query, plus steady-state QPS.
    In this regime a single query can take seconds, so a fixed-duration load phase is more
    meaningful than a fixed number of queries.

Questions for maintainers

  1. Is a large-TopK case something the project is open to hosting, given the GT artifact
    size? Would a configurable GT width (e.g. 100K default, 1M optional download) be a
    better fit than a single 1M-wide file?
  2. Would you prefer this as a new CaseType, or as a parameterized variant of the existing
    Performance768D100M case with a --k / GT-width option?

I'm happy to help with generating the ground truth and contributing the case if there's
interest in the direction.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions