Why Turboquant saves DGX twice

… after Intel “handed” NVIDIA a rather convenient INT4 weight quantization story via the
Marlin kernel lineage (Autoround), Google has now returned the favour on the KV cache side —
with TurboQuant, published March 24 (ICLR 2026).

The short version: 3.5-bit KV cache, provably lossless, no calibration, no codebook,
online per-token.
At 2.5 bits you start to feel it. At 3.5 bits, benchmarks on
LongBench / Needle-in-a-Haystack / RULER are statistically indistinguishable from BF16.
Not “within 1%” — statistically identical (benchmarked).

For those of us running inference on unified LPDDR5X where every GB/s counts twice
(once for capacity, once for bandwidth), this is not a minor update. A 128k-context
32B session drops from ~30 GB KV cache to ~6 GB. The rest is arithmetic.

The algorithm (PolarQuant + QJL residual correction) has no exotic hardware
dependencies — no Tensor Core calls, no arch-specific intrinsics. Just sign bits and
matrix multiplies. Which means SM121 support is not a research project, it is a
TORCH_CUDA_ARCH_LIST="12.1" away. As usual.

Apparently patience does occasionally have a
payoff, even on Blackwell.

FP8 KV cache is the current baseline — TurboQuant slots into the same abstraction at
roughly half the bits and zero the accuracy loss. Whether that counts as progress is
left as an exercise for the reader.

TQ runs on vllm-riy branch now.

References

Many thanks for sharing.
This might be quite promising for the DGX Spark.

llama.cpp ticket: Feature Request: TurboQuant support · Issue #20977 · ggml-org/llama.cpp · GitHub

We will see how fast it can be implemented.

if you like llama you may have to wait, if not… [GitHub - flash7777/vllm at turboquant · GitHub]

i’m just running tests and benchmarks with this approach.

Update about llama.cpp :

TurboQuant is added.

#breakthrough

cool. any experiences on llama? does it give ollama any performance gain?

I just saw it so needs to compile. No idea right now.

That commit is based on a 3 year old version…

Wut

Really excited about this - for concurrency, long context, and fitting multiple agents or even a delegation agent alongside a bigger one into memory.

thanks @flash3 we need to wait for vllm to implement it @eugr ?
Seems promising

Thanks, always, as your nickname suggests, aiming for performance

Someone posted this
”I just implemented Google’s TurboQuant for vLLM.
My USB-charger-sized HP ZGX now fits 4,083,072 KV-cache tokens on GB10.”

Still fighting on the CUDA kernel optimization front. Currently CUDA is still slower than PyTorch… for now.

KV-Cache Medium (150t) Long (400t) Math Overhead vs FP8
FP8 47.8 tok/s 36.2 tok/s 100% Baseline
TQ3 PyTorch 35.4 tok/s 28.7 tok/s 100% -26% / -21%
TQ3 CUDA 33.3 tok/s 29.1 tok/s 100% -30% / -20%

Quality: 100% math accuracy across all configurations — zero quality loss.

Performance: The CUDA kernel is not yet optimized (naive loops, no tiling).

Is Mitko nearby? Could really save some work.

Sorry, I do not know about Mitko,
but I saw the following, which might help you with the implementation
PyTorch implementation from scratch

Explanation of the code.

Ich wünsche dir viel Glück mit der Implementierung (Good luck) :-).

ja, pytorch is … eigentlich sehr trivial. weil der algorithmus wirklich wirklich simpel ist. der rest ist dieses in vllm einbauen. flashinfer kommt damit z.b. gar nicht klar. also gleich eigenes backend, dann cuda. nunja. endless story.

SUMMARY:
TurboQuant is another example of how mathematically elegant doesn’t automatically mean fast to implement. The algorithm itself is beautifully simple — but it stores weights in unconventional bit widths, far from the 8/16/32-bit boundaries that hardware and software stacks are built around.

So the real battle isn’t with complex algorithms. It’s with interfaces and APIs that only want to hand you bits in nice, standard-sized boxes. Every additional library you pull in opens a new front — every change would need to be pushed upstream. And then you ask yourself: should you just bypass the whole stack and wire it up directly?

the term ‘breakthrough’ is dead to me

edit:

It is too early to give up. We might see big impact on video/image generation.

looks good. tokenrate is stable, the biggest issue as i mentioned before is the implementation in the vllm ecosystem. In other words: implementing TQ in vLLM and FlashInfer is a bit like being an entrepreneur in Germany. You see the problem, you solve the problem, but you can’t get it off the ground because everyone says it just can’t be done that way. FlashInfer cant imagine anything else than fp8 or fp16.

Well, and ultimately I had to — I essentially had to navigate around FlashInfer quite significantly. Yes, and that of course means even more work. Well, thanks for the highly flexible framework.

sometimes I have the feeling that both frameworks are a bit over-patched. Meaning, with every small addition — new model, new FFNs, new Algos — there’s a bit more patching going on, and in the end it’s almost non-deterministic, almost becoming a little language model itself, because the tooling capabilities aren’t universal at all. So you actually need a very specific combination of parameters to achieve anything, and when you dig into it, you find that someone just patched it that way at some point. And eventually it turns into one huge pile of patches. I wouldn’t necessarily call it a patchwork — it’s more of a patch heap. That’s a bit of a difference. So it works, but it’s not the tooling you’d imagine it to be — and this isn’t meant as a complaint, it’s just the reality when everything needs to move fast and wants to move fast. But who’s supposed to clean it up? Or better: when?

Maybe future contributions like TQ have to deliver the full stack. VLLM should decide where they want to end. Funding round or not, what it needs is architecture. And maybe some old braids cut off.