Fast vector quantization with 2-4 bit compression and SIMD search
Project description
turbovec
Fast vector quantization in Rust with Python bindings. Compresses vectors to 2-4 bits per dimension with near-optimal distortion. Implementation of TurboQuant (Google Research, ICLR 2026).
Unlike trained methods like FAISS PQ, TurboQuant is data-oblivious — no training step, no codebook retraining when data changes, and new vectors can be added at any time. This means faster index creation, simpler infrastructure, and comparable or higher recall.
Python
from turbovec import TurboQuantIndex
index = TurboQuantIndex(dim=1536, bit_width=4)
index.add(vectors)
index.add(more_vectors)
scores, indices = index.search(query, k=10)
index.write("my_index.tq")
loaded = TurboQuantIndex.load("my_index.tq")
Rust
use turbovec::TurboQuantIndex;
let mut index = TurboQuantIndex::new(1536, 4);
index.add(&vectors);
let results = index.search(&queries, 10);
index.write("index.tv").unwrap();
let loaded = TurboQuantIndex::load("index.tv").unwrap();
Recall
TurboQuant vs FAISS IndexPQFastScan (100K vectors, k=64). FAISS PQ configurations sized to match TurboQuant compression ratios.
Both converge to 1.0 by k=4-8. At d=3072 2-bit, TurboQuant recall exceeds FAISS (0.912 vs 0.903). At d=1536 2-bit, FAISS is slightly ahead (0.882 vs 0.870). The recall discrepancy between TQ and FAISS varies by dimension and bit width — this requires further investigation. Full results: d=1536 2-bit, d=1536 4-bit, d=3072 2-bit, d=3072 4-bit, GloVe 2-bit, GloVe 4-bit.
No FAISS FastScan comparison for GloVe d=200 (dimension not compatible with FastScan's m%32 requirement).
Compression
Search Speed
All benchmarks: 100K vectors, 1K queries, k=64, median of 5 runs.
ARM (Apple M3 Max)
On ARM, TurboQuant is within 2-25% of FAISS. Optimization is ongoing.
x86 (Intel Sapphire Rapids, 4 vCPUs)
On x86, TurboQuant is 1.4-3.7x behind FAISS. Optimization is ongoing.
How it works
Each vector is a direction on a high-dimensional hypersphere. TurboQuant compresses these directions using a simple insight: after applying a random rotation, every coordinate follows a known distribution -- regardless of the input data.
1. Normalize. Strip the length (norm) from each vector and store it as a single float. Now every vector is a unit direction on the hypersphere.
2. Random rotation. Multiply all vectors by the same random orthogonal matrix. After rotation, each coordinate independently follows a Beta distribution that converges to Gaussian N(0, 1/d) in high dimensions. This holds for any input data -- the rotation makes the coordinate distribution predictable.
3. Lloyd-Max scalar quantization. Since the distribution is known, we can precompute the optimal way to bucket each coordinate. For 2-bit, that's 4 buckets; for 4-bit, 16 buckets. The Lloyd-Max algorithm finds bucket boundaries and centroids that minimize mean squared error. These are computed once from the math, not from the data.
4. Bit-pack. Each coordinate is now a small integer (0-3 for 2-bit, 0-15 for 4-bit). Pack these tightly into bytes. A 1536-dim vector goes from 6,144 bytes (FP32) to 384 bytes (2-bit). That's 16x compression.
Search. Instead of decompressing every database vector, we rotate the query once into the same domain and score directly against the codebook values. The scoring kernel uses SIMD intrinsics (NEON on ARM, AVX2 on x86) with nibble-split lookup tables for maximum throughput.
The paper proves this achieves distortion within a factor of 2.7x of the information-theoretic lower bound (Shannon's distortion-rate limit). You cannot do much better for a given number of bits.
Building
Python (via maturin)
pip install maturin
cd turbovec-python
RUSTFLAGS="-C target-cpu=native" maturin build --release
pip install target/wheels/*.whl
Rust
cargo build --release
Running benchmarks
Download datasets:
python3 benchmarks/download_data.py all # all datasets
python3 benchmarks/download_data.py glove # GloVe d=200
python3 benchmarks/download_data.py openai-1536 # OpenAI DBpedia d=1536
python3 benchmarks/download_data.py openai-3072 # OpenAI DBpedia d=3072
Each benchmark is a self-contained script in benchmarks/suite/. Run any one individually:
python3 benchmarks/suite/speed_d1536_2bit_arm_mt.py
python3 benchmarks/suite/recall_d1536_2bit.py
python3 benchmarks/suite/compression.py
Run all benchmarks for a category:
for f in benchmarks/suite/speed_*arm*.py; do python3 "$f"; done # all ARM speed
for f in benchmarks/suite/speed_*x86*.py; do python3 "$f"; done # all x86 speed
for f in benchmarks/suite/recall_*.py; do python3 "$f"; done # all recall
python3 benchmarks/suite/compression.py # compression
Results are saved as JSON to benchmarks/results/. Regenerate charts:
python3 benchmarks/create_diagrams.py
References
- TurboQuant: Online Vector Quantization with Near-optimal Distortion Rate (ICLR 2026) -- the paper this implements
- FAISS Fast accumulation of PQ and AQ codes -- the FAISS FastScan approach our x86 kernel is based on
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file turbovec-0.1.0rc1.tar.gz.
File metadata
- Download URL: turbovec-0.1.0rc1.tar.gz
- Upload date:
- Size: 39.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
46cd927217336ec90a2c061f77cb5623ca194eca614f2907bdf3f8d5ec783163
|
|
| MD5 |
c96e78a11d488590eae62621ab0b7ec7
|
|
| BLAKE2b-256 |
d3a0332554dea4fbc4476d7f95e8e76769857dcc4de86cf8cb0da3f010e81a37
|
Provenance
The following attestation bundles were made for turbovec-0.1.0rc1.tar.gz:
Publisher:
release.yml on RyanCodrai/turbovec
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
turbovec-0.1.0rc1.tar.gz -
Subject digest:
46cd927217336ec90a2c061f77cb5623ca194eca614f2907bdf3f8d5ec783163 - Sigstore transparency entry: 1285862126
- Sigstore integration time:
-
Permalink:
RyanCodrai/turbovec@a95e4bdd11414374e7078d1d882f3337e38ee2f9 -
Branch / Tag:
refs/tags/v0.1.0rc1 - Owner: https://github.com/RyanCodrai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a95e4bdd11414374e7078d1d882f3337e38ee2f9 -
Trigger Event:
push
-
Statement type:
File details
Details for the file turbovec-0.1.0rc1-cp39-abi3-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: turbovec-0.1.0rc1-cp39-abi3-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 664.7 kB
- Tags: CPython 3.9+, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cf51c44c86b81372a196ee50485478cab97690e0d98331d2cc85be7fd1f2c7a8
|
|
| MD5 |
848c613f26ae6b303a1985050d73cc7d
|
|
| BLAKE2b-256 |
0c56a41b312b8e7dbff933cfd91053f8e026f70cb010e8f4ee4ff5cee8bf9646
|
Provenance
The following attestation bundles were made for turbovec-0.1.0rc1-cp39-abi3-manylinux_2_28_x86_64.whl:
Publisher:
release.yml on RyanCodrai/turbovec
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
turbovec-0.1.0rc1-cp39-abi3-manylinux_2_28_x86_64.whl -
Subject digest:
cf51c44c86b81372a196ee50485478cab97690e0d98331d2cc85be7fd1f2c7a8 - Sigstore transparency entry: 1285862267
- Sigstore integration time:
-
Permalink:
RyanCodrai/turbovec@a95e4bdd11414374e7078d1d882f3337e38ee2f9 -
Branch / Tag:
refs/tags/v0.1.0rc1 - Owner: https://github.com/RyanCodrai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a95e4bdd11414374e7078d1d882f3337e38ee2f9 -
Trigger Event:
push
-
Statement type:
File details
Details for the file turbovec-0.1.0rc1-cp39-abi3-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: turbovec-0.1.0rc1-cp39-abi3-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 618.5 kB
- Tags: CPython 3.9+, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
936e62e20bed75842c651a30bb1a007519dc395a8de1f1797fe54937dd422e4f
|
|
| MD5 |
bdd6a18ecb9b4e185e57635a60594c16
|
|
| BLAKE2b-256 |
b1837975cb1688ba16c301fa56e59311f02a99c55fb631a42a1dc5a099620277
|
Provenance
The following attestation bundles were made for turbovec-0.1.0rc1-cp39-abi3-manylinux_2_28_aarch64.whl:
Publisher:
release.yml on RyanCodrai/turbovec
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
turbovec-0.1.0rc1-cp39-abi3-manylinux_2_28_aarch64.whl -
Subject digest:
936e62e20bed75842c651a30bb1a007519dc395a8de1f1797fe54937dd422e4f - Sigstore transparency entry: 1285862395
- Sigstore integration time:
-
Permalink:
RyanCodrai/turbovec@a95e4bdd11414374e7078d1d882f3337e38ee2f9 -
Branch / Tag:
refs/tags/v0.1.0rc1 - Owner: https://github.com/RyanCodrai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a95e4bdd11414374e7078d1d882f3337e38ee2f9 -
Trigger Event:
push
-
Statement type:
File details
Details for the file turbovec-0.1.0rc1-cp39-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: turbovec-0.1.0rc1-cp39-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 531.2 kB
- Tags: CPython 3.9+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aa0158aed5e30d205bf9cb6659b82ff00d9e1b4b225d81a66748266e75b72c1b
|
|
| MD5 |
8c338c81ea8ad4c834aa895b10c0f8fc
|
|
| BLAKE2b-256 |
084218e2ff14288c5611e48f065d5e83c739711e6c8749fdc50df3c5b346cae4
|
Provenance
The following attestation bundles were made for turbovec-0.1.0rc1-cp39-abi3-macosx_11_0_arm64.whl:
Publisher:
release.yml on RyanCodrai/turbovec
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
turbovec-0.1.0rc1-cp39-abi3-macosx_11_0_arm64.whl -
Subject digest:
aa0158aed5e30d205bf9cb6659b82ff00d9e1b4b225d81a66748266e75b72c1b - Sigstore transparency entry: 1285862515
- Sigstore integration time:
-
Permalink:
RyanCodrai/turbovec@a95e4bdd11414374e7078d1d882f3337e38ee2f9 -
Branch / Tag:
refs/tags/v0.1.0rc1 - Owner: https://github.com/RyanCodrai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a95e4bdd11414374e7078d1d882f3337e38ee2f9 -
Trigger Event:
push
-
Statement type: