➡️ Sponsored by Clearbox. Turn Reddit into pipeline.
A repackaged nvidia/Gemma-4-31B-IT-NVFP4 that is 68% smaller in GPU memory and ~2.5× faster than the base model, while retaining nearly identical quality (1-3% loss). Fits on a single RTX 5090 (🎉).
This variant is text-only, video/audio weights and encoders have been stripped. If you need video/audio support -> open an issue or PR.
Benchmark
Benchmark chart
[!NOTE]
RTX PRO 6000, vllm bench @ 1K input / 200 output tokens. See bench.sh.
Note: We also ran ⚡Turbo benchmark on RTX 5090, and it performed exactly the same because at 16k context, the performance is not limited by the GPU memory.
Other quants of similar size use kernel paths (compressed-tensors, Marlin) that don't leverage Blackwell's FP4 tensor cores, resulting in significantly lower prefill and concurrent throughput:
--kv-cache-dtype fp8 — halves KV cache memory on Blackwell
--max-model-len 16384 — maximum context length per request. See Compatibility for max value per GPU.
Tuning
The above benchmarks use a generic workload (1K input / 200 output tokens). You can tune vLLM flags for your specific use case:
High-throughput classification / short output — Reduce --max-model-len and limit output tokens (max_tokens in the API request). Less KV cache pressure means more concurrent requests. Expect 14+ req/s on RTX 5090 for classification workloads (~1K input, ~10 output tokens).
Long context — Increase --max-model-len (up to ~25K on RTX 5090, ~180K on PRO 6000). Trade concurrent capacity for longer sequences.
Latency-sensitive — Keep concurrency low. Single-request decode is ~51 tok/s with TTFT under 70ms — fast enough for interactive use.
Batch processing — Push --max-num-seqs higher and use --request-rate inf with --max-concurrency to saturate the GPU. Peak throughput is ~6.2 req/s on RTX PRO 6000 at 1K/200 workload.
Compatibility
Blackwell (SM 12.0+) — full FP4 tensor core support:
GPU
VRAM
Works?
Max context
Notes
RTX 5090
32 GB
✅
~25k
Primary target
RTX PRO 6000
96 GB
✅
~180K
Ideal for high-concurrency or long-context workloads.
B200
192 GB
✅
262k (full)
Datacenter, untested
B100
192 GB
✅
262k (full)
Datacenter, untested
RTX 5080 and lower
≤16 GB
❌
—
Not enough VRAM
Older GPUs (H100, A100, RTX 4090, etc.) may work without --quantization modelopt but they lack FP4 tensor cores, so you'll lose the optimized kernel path and performance will be significantly worse.
Approach
Three changes were made:
Quantized all self-attention weights from BF16 → FP4 (RTN, group_size=16, matching modelopt NVFP4 format)
Updated architecture to Gemma4ForCausalLM and quantization config accordingly
Stripped the vision and audio encoder
Everything else is untouched — MLP layers keep NVIDIA's calibrated FP4, embed_tokens stays BF16, all norms preserved, so we retain all the nvidia/Gemma-4-31B-IT-NVFP4 optimizations.
Why RTN didn't hurt quality
RTN (Round-To-Nearest) is the simplest quantization method — no calibration data, fully reproducible. It worked here because:
FP4 with group_size=16 and per-group scaling preserves relative weight distributions well
Self-attention weights tend to be normally distributed near zero, where the FP4 grid has finest resolution (0, 0.5, 1.0, 1.5)
MLP layers (more sensitive to quantization) keep NVIDIA's calibrated FP4
embed_tokens stays BF16, preventing noise from propagating through all layers