A CoLaR-Style Reasoning Compression Head for DeepSeek-V4-Flash
Preliminary technical report
Abstract
We attach a lightweight CoLaR-style reasoning compression head to the frozen
nvidia/DeepSeek-V4-Flash-NVFP4 backbone. The head predicts a compact 1024-d
latent of the model's next reasoning step from a mid-network hidden state, and a
symmetric decoder maps that latent back into the backbone's hidden space so the
model can reason from a compressed latent instead of emitting a long
token-level chain of thought. Training is two-stage β supervised regression onto
a frozen latent target (SFT), then a backbone-free GRPO stage over the head's
Gaussian latent policy. Serving the head on DeepSeek-V4's hash-routed MoE
required a compile-safe capture-and-inject path that keeps input_ids flowing;
the result runs on the cudagraph fast path at ~65 tok/s. On GSM8K the head
reduces median "thinking" tokens by ~40% and the worst-case trace length by
~4Γ. Task-accuracy is evaluated only at small scale (n=30) and is reported as
preliminary; the length/latency reduction is the robust finding. This report
documents the method and the serving process rather than a benchmark result.
1. Background
CoLaR (Compressed Latent Reasoning, arXiv:2505.16552) proposes to fold several reasoning tokens into a single latent step, so a model reasons in a compressed latent space rather than token by token. We apply this idea as a bolt-on adapter to an existing frozen backbone rather than retraining the base model.
DeepSeek-V4-Flash is a 284B-parameter (13B active) mixture-of-experts model
with 43 layers, hidden size 4096, and a 1M-token context. It exposes an explicit
<think> reasoning phase. Critically for serving, its MoE layers use
hash-based expert routing keyed on input_ids, which constrains how latents
can be injected (Section 4).
2. Method
2.1 Compression head
The reasoning head is a 3-layer MLP with SiLU activations:
h_src (4096) β Linear 4096β2048 β SiLU β Linear 2048β2048 β SiLU β Linear 2048β2048
β [mu, log_sigma], each 1024-d
It reads the hidden state at source layer 35 (h_src) and outputs the
parameters of a diagonal Gaussian over a 1024-d latent, with log_sigma clamped
to [-10, 2] for stability. Reasoning tokens are grouped into chunks of
compression_factor = 4; from the source hidden at the last token of group
k, the head predicts the compressed latent of group k+1.
2.2 Frozen target projection
The regression target is a stable readout of the target layer 42 hidden
state, produced by a frozen random projection target_proj: Linear(4096, 1024, bias=False). Freezing it is deliberate: a trainable target would let the
objective collapse to zero. Both the source hidden and the projected target are
LayerNorm-standardized β raw DeepSeek-V4 hidden states span roughly Β±16, and
an unnormalized summed-MSE would sit at 1e5β1e6 and never train.
2.3 SFT objective
The head is trained with a soft-MSE + entropy loss on the predicted mean:
L = 0.5 Β· Ξ£_d (target_d β mu_d)Β² + 0.5 Β· Ξ² Β· Ξ£_d log_sigma_d , Ξ² = 0.01
The MSE term regresses mu onto the (detached, normalized) next-group latent;
the entropy term prevents the variance from collapsing. Hyperparameters: AdamW,
lr 1e-4, warmup 100 steps of a 1000-step linear schedule, batch size 1 Γ
grad-accum 4, sequence length 4096. Training data is a corpus of agentic
reasoning traces (Glint-Research/Fable-5-traces). The backbone is frozen
throughout; only the head (and, when reconstruction is enabled, the decoder) is
updated. The SFT loss converges from β507 to the single digits over ~550 steps.
2.4 Latent decoder
On its own the latent has no path back into the model. A LatentDecoder β
symmetric to the head (1024β2048β2048β4096) β maps the latent back to a
hidden-space vector that can be injected as an input embedding, trained with a
reconstruction MSE so the latent stays invertible.
2.5 GRPO over the latent policy
Because the vLLM backbone is frozen and outside the autograd graph, the textbook "log-prob of generated tokens" GRPO is unavailable. We instead treat the head as a stochastic policy over the injected latent:
mu, log_sigma = head(h_src); z ~ N(mu, diag(sigmaΒ²)); decode(z) β inject β generate β reward
REINFORCE then gives a gradient into the head alone,
grad = E[ βlog N(z | mu, sigma) Β· A ], with A the group-relative advantage
(the "G" in GRPO). The decoder and backbone are the non-differentiable
environment. GRPO uses AdamW at lr 1e-5, KL coefficient 0.1, 500 steps, with a
token-overlap / exact-match reward.
3. Checkpoints
Each checkpoint is a self-describing v2 bundle: the head, decoder, and
target_proj state dicts plus a config block (hidden_size, latent_dim,
source_layer, target_layer, compression_factor). We release two stages β
sft (post-supervised) and grpo (post-RL) β as flattened .safetensors
(prefixed keys reasoning_head.*, decoder.*, target_proj.*) alongside the
original .pt bundles.
4. Serving process (engineering contribution)
Hosting the head for fast inference was the main practical hurdle.
Injection. vLLM's native prompt_embeds path nulls input_ids when
embeddings are supplied β but DeepSeek-V4's hash-based MoE routing needs
input_ids, so --enable-prompt-embeds crashes the engine at startup
(DeepSeek V4 hash MoE routing requires input_ids). We instead inject through an
embed_tokens forward hook: the hook overwrites the embedding at chosen
positions with the decoded latent while token ids continue to flow, so hash-MoE
routing still works. The decoded latent is injected at the final <think> prompt
position.
Compile-safe capture. Naively capturing a layer-35 hidden state forces
enforce_eager and forfeits cudagraphs. We instead write the capture into a 2-D
(tokens, hidden) buffer allocated outside the cudagraph memory pool, filled
by an in-loop copy_, so capture is compatible with compiled execution. A
byte-exact retrain gate confirmed the compiled-buffer capture equals the eager
forward-hook capture on the same prefill (max_abs_diff = 0.0), so no head
retraining was needed to move onto the fast path.
Result. The head serves on the compiled / cudagraph path at ~65 tok/s, with a one-time ~5-minute startup (weight load + cudagraph capture).
5. Results (preliminary)
GSM8K, 8-shot, temperature 0, GRPO head, n = 30 documents. Accuracy at this scale is noisy; the robust signal is reasoning-length reduction.
| Metric | Base (no injection) | +Head (2k budget) | +Head (14.5k budget) |
|---|---|---|---|
| exact-match | 40.0 / 33.3 | 40.0 | 46.7 |
closed </think> % |
97β100 | 30 | 40 |
| median think tokens | 146β187 | 106 | 103 |
| max think tokens | 1740β2048 | 472 | 415 |
- ~40% reduction in median thinking tokens; the longest trace shrinks from
1740β2048 to
415 tokens (**4Γ**, ~3% of the available budget). - The head never skips reasoning (skip% = 0) β it compresses rather than bypasses it.
- The drop in closed-
</think>% is a formatting artifact, not truncation: a 78Γ larger token budget did not increase closure, and the token-F1 GRPO reward never rewarded emitting the closing tag. Adding a</think>-closure bonus to the reward is the clear next step. - The published DeepSeek-V4-Flash-Base GSM8K score (90.8) is quoted for context only; it is not a baseline reproduced by this harness.
6. Limitations and future work
- Evaluation is small-n (30 docs, single task); a full multi-task benchmark is needed before any accuracy claim.
- Closure reward: add a
</think>-closure bonus and retrain GRPO. - Closed-loop latent decoding (emitting reasoning steps with no token id, bypassing the sampler) requires scheduler / KV-slot changes and is future work; current injection is prompt-position only.
- Hardware ceiling: on 2Γ RTX PRO 6000 (96 GiB), after weights and cudagraphs only ~6.4 GiB of KV cache remains, capping usable context at β15.8k tokens.
References
- CoLaR: Compressed Latent Reasoning. arXiv:2505.16552, 2025.
- DeepSeek-V4-Flash β
deepseek-ai/DeepSeek-V4-Flash; NVFP4 buildnvidia/DeepSeek-V4-Flash-NVFP4.