KV-cache quantization without any fork (recommended, 2026): upstream llama.cpp/Ollama now cover this natively — use -ctk q8_0 -ctv q8_0 (half KV memory, negligible quality loss: perplexity +0.002–0.05) or -ctk q4_0 -ctv q4_0 (quarter memory, ≈7.6% perplexity increase). In Ollama: OLLAMA_KV_CACHE_TYPE=q8_0 with OLLAMA_FLASH_ATTENTION=1. Keep K and V types symmetric to stay on the fast fused Flash-Attention path. Since April 2026, mainline llama.cpp also applies Hadamard rotation to KV activations (PR #21038), which greatly improves low-bit KV quality (opt-out: LLAMA_ATTN_ROT_DISABLE=1).

The RotorQuant/TurboQuant fork flow below is experimental/legacy: the TurboQuant llama.cpp PR was closed without merging (June 2026) and the fork is unmaintained relative to mainline. It is NOT required to use this model.

gemma-4-E4B-TurboQuant

TurboQuant KV cache compression for google/gemma-4-E4B.

This is a documentation repository that explains how to combine gemma-4-E4B's weights with TurboQuant inference-time KV cache compression. No weights are stored here — use the base model directly and apply TurboQuant via the Python package or llama.cpp fork.

Hardware compatibility

Device VRAM / RAM Recommendation
Any host that runs the base model baseline + runtime savings RotorQuant/TurboQuant is a KV-cache runtime modifier; pair with any weight variant

What is this?

KV cache compression reduces the memory used by the attention cache during inference. Unlike weight quantization (which is baked into the GGUF/MLX file), KV cache compression is applied at runtime — so the same base weights can be used with or without compression.

Technique Where it's applied Savings
TurboQuant KV cache At inference time Reduces attention memory (critical for long context)

Both can be combined for maximum efficiency.

Quickstart

Option A — Python / transformers

Install the turboquant package:

pip install turboquant

Then use it with the base model:

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from turboquant import TurboQuantCache

tokenizer = AutoTokenizer.from_pretrained("google/gemma-4-E4B", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
    "google/gemma-4-E4B",
    torch_dtype=torch.bfloat16,
    device_map="auto",
    trust_remote_code=True,
)

# Apply TurboQuant to the KV cache
cache = TurboQuantCache(bits=4)  # or bits=2 for more aggressive compression

inputs = tokenizer("Hello, how are you?", return_tensors="pt").to(model.device)
outputs = model.generate(
    **inputs,
    max_new_tokens=128,
    past_key_values=cache,
    use_cache=True,
)
print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:], skip_special_tokens=True))

Option B — llama.cpp / LM Studio / Ollama (with fork)

TurboQuant KV cache types (planar3) are not in upstream llama.cpp. They require:

Once built:

llama-cli -m gemma-4-E4B.gguf \
  --cache-type-k planar3 --cache-type-v planar3 \
  -ngl 99 -fa \
  -p "Hello"

For standard runtimes (LM Studio, Ollama, upstream llama.cpp), use conventional KV cache types (q8_0, q4_0). You lose the TurboQuant-specific benefits but keep GGUF weight quantization.

Model Specifications

Property Value
Base Model google/gemma-4-E4B
Architecture Dense transformer (Edge optimised)
Parameters ~4B
Context Length 128K
BF16 Size ~8 GB
Modalities Text + Image + Audio
License apache-2.0

About the RotorQuant / TurboQuant labels

RotorQuant and TurboQuant are this project's release labels, not distinct quantization algorithms — for any given tier, both brand repos carry byte-identical weights produced with the standard MLX / llama.cpp quantizers. No brand-specific speedup is claimed or measured. The KV-cache fork these labels originally referred to is legacy; for KV-cache memory savings use the upstream options described above (-ctk/-ctv q8_0, OLLAMA_KV_CACHE_TYPE).

Current Ecosystem Support

Runtime TurboQuant Support Notes
Python transformers + turboquant ✅ Full Drop-in cache class
llama.cpp upstream ❌ Not merged Use fork below
llama-cpp-turboquant fork planar3, iso3 GitHub
LM Studio Requested Use q8_0 as alternative
Ollama ❌ Not supported Use OLLAMA_KV_CACHE_TYPE=q8_0
vLLM ❌ Not supported
koboldcpp ❌ Not supported

Pre-quantized weight variants

If you want combined weight + KV cache compression, majentik hosts pre-quantized versions:

See Also

Variants in this family

(Showing 13 sibling variants under majentik/gemma-4-e4b-*. The current variant — TurboQuant — is bolded.)

Variant Runtime Approx size Use case
RotorQuant-GGUF-IQ4_XS llama.cpp ~3.4 GB Lossy 4-bit, low-RAM CPU/edge
RotorQuant-GGUF-Q2_K llama.cpp ~2.4 GB Lossy, low-RAM CPU/edge
RotorQuant-GGUF-Q3_K_M llama.cpp ~3.1 GB Smaller 3-bit, CPU-friendly
RotorQuant-GGUF-Q4_K_M llama.cpp ~4.4 GB Balanced default
RotorQuant-GGUF-Q5_K_M llama.cpp ~5.3 GB Higher fidelity, more RAM
RotorQuant-GGUF-Q8_0 llama.cpp ~8.4 GB Near-lossless reference
RotorQuant-MLX-2bit mlx-lm ~1.3 GB Apple Silicon, smallest
RotorQuant-MLX-4bit mlx-lm ~2.5 GB Apple Silicon balanced
RotorQuant-MLX-8bit mlx-lm ~4.7 GB Apple Silicon reference
TurboQuant runtime modifier n/a KV-cache root (weight-agnostic)
TurboQuant-MLX-2bit mlx-lm ~1.3 GB Apple Silicon, smallest
TurboQuant-MLX-4bit mlx-lm ~2.5 GB Apple Silicon balanced
TurboQuant-MLX-8bit mlx-lm ~4.7 GB Apple Silicon reference
Downloads last month
40
Safetensors
Model size
8B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for majentik/gemma-4-E4B-turboquant

Finetuned
(87)
this model

Paper for majentik/gemma-4-E4B-turboquant