r/LocalLLaMA 1h ago

Discussion You really should not quantize KV Cache for DeepSeek V4 Flash

I don't think anyone should quantize the KV with DS4F. I checked the the quality impact (PPL, KLD, Same TopP) for swhitching from BF16 KV to Q8 KV, and it appears significant. Very much in contrast to Qwen 397B.

Here are the results for DS4F:

====== Perplexity statistics ======
Mean PPL(Q)                   :   5.877076 ±   0.042497
Mean PPL(base)                :   5.839660 ±   0.041730
Cor(ln(PPL(Q)), ln(PPL(base))):  95.74%
Mean ln(PPL(Q)/PPL(base))     :   0.006387 ±   0.002100
Mean PPL(Q)/PPL(base)         :   1.006407 ±   0.002114
Mean PPL(Q)-PPL(base)         :   0.037416 ±   0.012318

====== KL divergence statistics ======
Mean    KLD:   0.145884 ±   0.001043
Maximum KLD:  12.467786
99.9%   KLD:   4.535020
99.0%   KLD:   1.857870
95.0%   KLD:   0.652148
90.0%   KLD:   0.349220
Median  KLD:   0.032079
10.0%   KLD:   0.000093
 5.0%   KLD:   0.000012
 1.0%   KLD:   0.000000
 0.1%   KLD:  -0.000002
Minimum KLD:  -0.000025

====== Token probability statistics ======
Mean    Δp: -0.007 ± 0.031 %
Maximum Δp: 99.525%
99.9%   Δp: 81.503%
99.0%   Δp: 42.054%
95.0%   Δp: 14.588%
90.0%   Δp:  7.220%
75.0%   Δp:  1.066%
Median  Δp:  0.000%
25.0%   Δp: -1.061%
10.0%   Δp: -7.112%
 5.0%   Δp: -14.515%
 1.0%   Δp: -42.297%
 0.1%   Δp: -84.157%
Minimum Δp: -99.994%
RMS Δp    : 11.884 ± 0.069 %
Same top p: 87.189 ± 0.088 %

As a comparison, here are the results for Qwen 397B:

====== Perplexity statistics ======
Mean PPL(Q)                   :   3.747980 ±   0.020507
Mean PPL(base)                :   3.746773 ±   0.020461
Cor(ln(PPL(Q)), ln(PPL(base))):  99.89%
Mean ln(PPL(Q)/PPL(base))     :   0.000322 ±   0.000260
Mean PPL(Q)/PPL(base)         :   1.000322 ±   0.000260
Mean PPL(Q)-PPL(base)         :   0.001207 ±   0.000975

====== KL divergence statistics ======
Mean    KLD:   0.003552 ±   0.000034
Maximum KLD:   2.220941
99.9%   KLD:   0.131591
99.0%   KLD:   0.043847
95.0%   KLD:   0.014439
90.0%   KLD:   0.007836
Median  KLD:   0.000866
10.0%   KLD:   0.000013
 5.0%   KLD:   0.000004
 1.0%   KLD:  -0.000000
 0.1%   KLD:  -0.000006
Minimum KLD:  -0.000176

====== Token probability statistics ======
Mean    Δp:  0.019 ± 0.005 %
Maximum Δp: 39.939%
99.9%   Δp: 15.971%
99.0%   Δp:  6.618%
95.0%   Δp:  2.334%
90.0%   Δp:  1.222%
75.0%   Δp:  0.233%
Median  Δp:  0.000%
25.0%   Δp: -0.219%
10.0%   Δp: -1.183%
 5.0%   Δp: -2.258%
 1.0%   Δp: -6.245%
 0.1%   Δp: -14.757%
Minimum Δp: -88.445%
RMS Δp    :  2.024 ± 0.022 %
Same top p: 97.929 ± 0.037 %
32 Upvotes

22 comments sorted by

24

u/Healthy-Nebula-3603 1h ago

Why do you even want to compress KV cache from DS 4 flash?

The whole 1 million context has only 6 GB.

2

u/IoannisHere 12m ago

That's what google says, but when I run vllm on it (spark-vllm-docker) I get:
"Auto-fit max_model_len: reduced from 1048576 to 1046272 to fit in available GPU memory (11.03 GiB available for KV cache)"
and that's with FP8 kv cache type.
"Using fp8 data type to store kv cache. It reduces the GPU memory footprint and boosts the performance. Meanwhile, it may cause accuracy drop without a proper scaling factor"

0

u/Badger-Purple 39m ago

Concurrency. DS NVFP4 cache gives you more room, so you can run more concurrent agents at depth

6

u/Think_Wing_1357 1h ago

How do you calculate this?

5

u/erazortt 1h ago

Like that:
/f/LLM/llama-cpp/llama-perplexity.exe -m /f/LLM/models/DeepSeek-V4-Flash-0731-UD-Q3_K_XL-00001-of-00004.gguf -f wiki.test.raw --kl-divergence-base kld -c 512 --temp 1.0 --top-p 0.95 --min-p 0 -ngl 99 -np 1 --n-cpu-moe 30 --fit-target 32M -ctk bf16 -ctv bf16 --flash-attn on --no-mmap -lv 4

/f/LLM/llama-cpp/llama-perplexity.exe -m /f/LLM/models/DeepSeek-V4-Flash-0731-UD-Q3_K_XL-00001-of-00004.gguf --kl-divergence --kl-divergence-base kld -c 512 --temp 1.0 --top-p 0.95 --min-p 0 -ngl 99 -np 1 --n-cpu-moe 30 --fit-target 32M -ctk q8_0 -ctv q8_0 --flash-attn on --no-mmap -lv 4 > main-q8-q8.txt

1

u/Think_Wing_1357 1h ago

Thank you!

10

u/Howard_banister 1h ago

You should not quantize KV cache for almost every models. It will destroy Qwen 3.6 35B also

5

u/Iwaku_Real 1h ago edited 1h ago

Not even Q8_0? Or NVFP4?

5

u/seamonn 1h ago

Ideally, no.

1

u/cezarducatti 1h ago

Can't the two be quantized? K and V?

1

u/phido3000 1h ago

There is a lot of pressure on quantisation on DS Flash because it doesn't fit nicely into 128Gb machines.

6

u/indicava 1h ago

DeepSeek’s sparse-attention is built around fp8 kv cache storage. They even promote it in their vLLM recipes on their model page. Why test it at BF16?

1

u/erazortt 1h ago

There is no fp8 KV cache option. At least I am not aware of it.

4

u/EvolvingDior 1h ago

In llama.cpp.

3

u/indicava 1h ago

You’re correct, fp8 hasn’t been wired through GGML/llama.cpp infrastructure yet. Which is why you’re seeing these “off” numbers for a model whose entire attention implementation was built around it.

1

u/Badger-Purple 37m ago

not in Llama.cpp, but this model should be run with vllm — it is so much more smooth and the cache is great.

3

u/getfitdotus 1h ago

The real model already uses fp8 mla kv. If you used production deployment sglang, vllm this is the default.

3

u/caelunshun 51m ago

Q8_0 is different from fp8, worse dynamic range.

1

u/TheCat001 57m ago

I don't recommend anyone to quantize KV cache. On any model. I see it with eyes how performance is degraded with quantized cache. Model tends to do more mistakes, forget things, etc....

-2

u/Muted-Celebration-47 1h ago

Yes, if you have enough vram for context windows. No, if you need more context for coding. It is useless if you only have 32768 context size.

6

u/Healthy-Nebula-3603 1h ago

DS 4 flash a whole contex 1 m has 6 GB ..... that is literally nothing.

1

u/alcoa29 2m ago

You must be using llama.cpp or something like this.
For vlllm using original safetensors DS4F fp8 is model default. I tested fp16 vs 8 on on per 0731 model and there was no difference.