V4.1-Flash stores its main cache in FP4. Four-bit values nearly halve the storage of FP8, but each value must land on a much smaller set of representable numbers.
The report uses E2M1 FP4 codes with one E4M3 scale per 16 channels. That shared scale lets one compact code range cover groups with different magnitudes.
The layout is a derived 4.5 bits per value: 64 data bits plus one 8-bit scale for 16 channels. DeepSeek follows NVFP4's shape but omits its second, global scale.
Where the four bits are, and where they are not
The sliding-window cache stays in FP8. It is read on every decode step, so its local accuracy is worth the larger footprint. FP4 is reserved for the main compressed cache.
The authors introduce quantization-aware training for main-KV storage during post-training. They quantize after rotary position embedding, so the stored format matches the serving path.
The report publishes a combined global-KV footprint of 890 bytes per token. It does not provide a component ledger for main KV versus indexer keys. A 512-channel illustrative entry would occupy 288 bytes under this toy packing, but that is not a reported partition of 890.
Pack one word's cache row
Choose a word from the incident trace, pack its 16 toy values, then click a cell to inspect the rounding.
toy state for cache. Real cache vectors have 512 channels; this panel shows one 16-channel group. Its ladder and real-valued scale are illustrative, not the report's complete E2M1/E4M3 encoding.
stored for this 16-value group
72 bits
64 data bits + 8-bit scale
shared scale
0.270
maps the small ladder to this group's range
mean rounding distance
waiting
toy values only
channel v1: raw 1.620
Press “pack this row” to watch the storage representation replace the raw toy values.
What this buys, in sessions per machine
At 890 bytes per token, four million-token global-KV footprints total about 3.6 GB. The report says that global-KV figure is roughly four times smaller than V4-Flash, but it does not turn that ratio into a full per-session HBM budget.
More global cache can fit in a fixed memory pool. That changes how much agent context stays warm while a server waits for the next turn.