TT Lab
Blog

한국어 English 日本語 中文

Get started
Blog

Blog

Quantization: Why reducing weights to 8-bit speeds up decoding and the trade-off

Status: Draft (2026-10-27), measured for FP8, GPTQ, and AWQ; GGUF and bitsandbytes unmeasured. Measured on 2026-10-27 using a single 8GB-class laptop GPU (Ada generation), vLLM 0.31.0, and Qwen3-Reranker-0.6B. Initial measurements were skipped because pre-quantized checkpoints (AWQ/GPTQ) needed to be downloaded anew, and were measured in Section 3-1 after approval. Actual measurements of the 8-bit KV cache capacity are available in Episode 14 of "Toss ML/AI Infra Preparation". Added on 2026-10-27. Upon approval, the vLLM 0.32.0 image, Qwen3-0.6B, Qwen3-0.6B-GPTQ-Int8, and Qwen3-4B-AWQ (all Apache-2.0, safetensors) were pulled to add Section 3-1. The previous 0.31.0 figures were left as is. Writing conventions: Measured data is the default. Unmeasured items are marked as "Unmeasured", and unverified items are marked as "Unverified".

Table of Contents

1. Why it gets faster

During decoding, to generate a single token per request, the entire set of weights is read once from GPU memory. For a 0.6B model, 1.2GB in bf16 is transferred back and forth at every step. Since computation is relatively small, step time is largely determined by "weight bytes ÷ memory bandwidth." Reducing weights to 8-bit halves the bytes to read, thereby shortening the step.

Two implications follow from this:

2. vLLM quantization map

Method What is reduced Checkpoint Principle (Paper)
Online FP8(fp8_per_tensor, fp8_per_block) Weights and activations 8-bit Keep bf16 as is, convert upon loading FP8 format (Micikevicius et al., 2022): E4M3, E5M2
llm-compressor FP8 W8A8 Weights and activations 8-bit Pre-converted Same format, determine scales using calibration data
AWQ Weights 4-bit Pre-converted Protect weights of channels with large activations (Lin et al., MLSys 2024)
GPTQ Weights 3- and 4-bit Pre-converted Quantize column by column while compensating for errors using second-order information (Frantar et al., ICLR 2023)
Marlin kernel Accelerate GPTQ, AWQ, FP8, and FP4 Above formats Multiplication kernel for 4-bit weights and 16-bit activations
GGUF, bitsandbytes Weights Each format llama.cpp format, quantized on read
KV cache FP8(--kv-cache-dtype fp8) KV storage N/A Double tokens in the same memory

The hardware table in the official documentation shows that FP8 W8A8 runs only on Ada and Hopper or newer, while AWQ and GPTQ run on most architectures since Turing. The numbers reported in papers vary by conditions. AWQ reported being over 3x faster than Hugging Face FP16 implementations on desktop and mobile GPUs with 4-bit weights, while GPTQ reported about 3.25x compared to FP16 on A100 and 4.5x on A6000 by fitting a 175-billion parameter model on a single GPU (both based on abstracts).

The 0.31.0 documentation cites fp8_per_tensor, fp8_per_block, mxfp8, mxfp4 as the method for online quantization. W8A8 for MXFP8 runs only on Blackwell (SM 100) or newer, and other GPUs fall back to a path where only weights are 8-bit.

3. Measuring it yourself: Online FP8

Method

Results

Metric bf16 FP8 (Online) Ratio
Weight memory (log) 1.12GiB 0.71GiB 0.63
KV capacity 40,208 tokens 42,080 tokens 1.05
Throughput, concurrency 1 174.2 tok/s 236.3 tok/s 1.36
Inter-token latency median, concurrency 1 5.6ms 4.1ms 0.73
Throughput, concurrency 16 1,683.1 tok/s 2,085.8 tok/s 1.24
Throughput, concurrency 64 2,899.3 tok/s 3,143.3 tok/s 1.08
Requests with greedy output identical to bf16 Baseline 6 out of 12
Perplexity (four texts) 36.03 36.46(+1.2%)

3-1. 2026-10-27 Remeasurement: Chat models and pre-quantized checkpoints

Using the official vLLM 0.32.0 container, we compared online FP8 and the 8-bit GPTQ version based on the chat-optimized Qwen3-0.6B, and loaded the 4B model in AWQ 4-bit onto the same GPU. The workload and perplexity methodology are the same as before.

Model / Method Weight memory KV capacity Throughput concurrency 1 Concurrency 16 Concurrency 64 Perplexity
Qwen3-0.6B bf16 1.12GiB 38,224 tokens 174.1 1,678.0 2,898.7 30.29
Qwen3-0.6B Online FP8(fp8_per_tensor) 0.71GiB 42,080 tokens 237.9 (1.37x) 2,094.5 (1.25x) 3,148.2 (1.09x) 29.88(-1.4%)
Qwen3-0.6B GPTQ 8-bit (Marlin) 0.74GiB 42,048 tokens 244.3 (1.40x) 2,023.0 (1.21x) 2,996.5 (1.03x) 30.78(+1.6%)
Qwen3-4B AWQ 4-bit (Marlin) 2.5GiB 15,424 tokens 80.0 651.9 736.4 21.02

Throughput is in tok/s, and parentheses show ratios compared to bf16.

4. 8-bit KV cache

--kv-cache-dtype fp8 stores the KV cache in 8-bit instead of weights. In previous measurements using a 1.7B model on the same GPU, the KV capacity expanded from 22,048 tokens to 41,920 tokens (bytes per token exactly halved), pushing back the point where long inputs ran out of KV memory and caused queuing (Episode 14). This time, only the same perplexity test and greedy output comparison were added.

Metric KV bf16 (Default) KV FP8
KV capacity (log) 40,208 tokens 69,920 tokens (1.74x)
Perplexity (same four texts, 338 tokens) 36.03 36.50(+1.3%)
Requests with greedy output matching bf16 KV Baseline 5 out of 12

5. Takeaways for Operations

6. Unverified Items

References

Sign in to like

Comments

No comments yet.

Sign in to leave a comment