shrinkvec report

sift-128. SIFT image descriptors, 1M vectors (ann-benchmarks). Public research dataset (INRIA TEXMEX).

vectors 1,000,000dimensions 128metric l2queries 1,000k 10seed 42
Recommendation for recall@10 ≥ 0.95

tq-mse-3>tq-mse-8 keeps recall@10 at 0.983 with 56 bytes per vector to search (9.1x smaller than float32). The rerank reads more precise data for each candidate, so 192 bytes per vector stay stored; only the searched part has to be in memory. In Postgres: pg_turbovec.

Codec lab: what the codes can do

Every option scans all codes exactly, so recall reflects the compression itself, not an index. Ground truth is exact search in float64. Hollow markers rerank the best candidates with a more precise codec.

Recall@10 against bytes per vector for every compression option0.00.10.20.30.40.50.60.70.80.91.02050100200500bytes per vector to search (log scale)recall@10target 0.95Full precision (float32) recall@10 1.000 512 B/vector (1.0x)Half precision (float16) recall@10 1.000 256 B/vector (2.0x)8-bit scalar, per-dimension range recall@10 0.990 128 B/vector (4.0x)TurboQuant 3-bit (mse), rerank top 100 with TurboQuant 8-bit (mse) recall@10 0.983 56 B/vector (9.1x)RaBitQ 4-bit (extended) recall@10 0.858 72 B/vector (7.1x)TurboQuant 4-bit (mse) recall@10 0.814 72 B/vector (7.1x)RaBitQ 1-bit, rerank top 100 with Full precision (float32) recall@10 0.704 24 B/vector (21.3x)TurboQuant 3-bit (mse) recall@10 0.671 56 B/vector (9.1x)TurboQuant 2-bit (mse) recall@10 0.456 40 B/vector (12.8x)TurboQuant 4-bit (prod) recall@10 0.339 72 B/vector (7.1x)RaBitQ 1-bit recall@10 0.252 24 B/vector (21.3x)1 sign bit per dimension, Hamming distance, rerank top 100 with Full precision (float32) recall@10 0.055 16 B/vector (32.0x)1 sign bit per dimension, Hamming distance recall@10 0.022 16 B/vector (32.0x)halfvecint8tq-mse-3>tq-mse-8rabitq-4tq-mse-4rabitq-1>float32tq-mse-3tq-mse-2tq-prod-4rabitq-1binary>float32pgvector typesRaBitQTurboQuantOther+ rerankbest per size
pipelinewhat it isrecall@10true top-10 in candidatesbytes/vector searchedbytes/vector storedvs float32in Postgres
float32Full precision (float32)1.0005125121.0xpgvector vector
halfvecHalf precision (float16)1.0002562562.0xpgvector halfvec
int88-bit scalar, per-dimension range0.9901281284.0xnot in pgvector
tq-mse-4TurboQuant 4-bit (mse)0.814 ± 0.00172727.1xpg_turbovec
tq-prod-4TurboQuant 4-bit (prod)0.339 ± 0.00572727.1xpg_turbovec
tq-mse-3TurboQuant 3-bit (mse)0.671 ± 0.00356569.1xpg_turbovec
tq-mse-2TurboQuant 2-bit (mse)0.456 ± 0.005404012.8xpg_turbovec
rabitq-4RaBitQ 4-bit (extended)0.858 ± 0.00172727.1xVectorChord vchordrq
rabitq-1RaBitQ 1-bit0.252 ± 0.002242421.3xVectorChord vchordrq
binary1 sign bit per dimension, Hamming distance0.022161632.0xpgvector binary_quantize
tq-mse-3>tq-mse-8TurboQuant 3-bit (mse), rerank top 100 with TurboQuant 8-bit (mse)0.983 ± 0.0010.997561929.1xpg_turbovec
rabitq-1>float32RaBitQ 1-bit, rerank top 100 with Full precision (float32)0.704 ± 0.0060.7042453621.3xVectorChord vchordrq
binary>float321 sign bit per dimension, Hamming distance, rerank top 100 with Full precision (float32)0.0550.0551652832.0xpgvector binary_quantize

Reproduce

pip install 'shrinkvec[pg,datasets]'
shrinkvec lab --dataset sift-128 --repeats 3 --out docs/results/sift-128