Skip to content

DeepSeek-V4-Pro is the same architecture as V4-Flash: record the variant and prove the config descent is shape-generic #504

Description

@localai-bot

deepseek-ai/DeepSeek-V4-Pro is DeepseekV4ForCausalLM / model_type: deepseek_v4 — the same architecture as DeepSeek-V4-Flash, which we already support (MODEL-TEXT-deepseek-v4-deepseek-v4-for-causal-lm, ✅). This issue records the assessment and adds the evidence that our config descent is genuinely shape-generic rather than Flash-tuned.

Grounding

Config diff (key-by-key, both config.json from HF): zero new keys, zero removed keys. Every difference is a scaled value.

key Flash Pro
hidden_size 4096 7168
num_hidden_layers 43 61
num_attention_heads 64 128
n_routed_experts 256 384
moe_intermediate_size 2048 3072
q_lora_rank 1024 1536
o_groups 8 16
index_topk 512 1024
routed_scaling_factor 1.5 2.5
compress_ratios[0:2] [0, 0, …] [128, 128, …]

Identical on both: head_dim 512, qk_rope_head_dim 64, hc_mult 4, hc_eps, hc_sinkhorn_iters 20, num_hash_layers 3, n_shared_experts 1, sliding_window 128, scoring_func: sqrtsoftplus, topk_method: noaux_tc, swiglu_limit 10.0, expert_dtype: fp4, index_head_dim 128, index_n_heads 64, compress_rope_theta 160000, num_experts_per_tok 6, vocab_size 129280. Heads-per-output-LoRA-group is 8 on both (64/8, 128/16).

Upstream (pinned oracle 5559679229bc961848b121ccdeaa8fa5d79bec98, vLLM 0.26.0.dev0): the same vllm/models/deepseek_v4/ package serves both. Every dimension is read off config (nvidia/model.py:535-679, attention.py:193-211, attention.py:708). Compressor presence is compress_ratio > 1 (attention.py:334) over max(1, config.compress_ratios[layer_id]) (attention.py:209), and the compressor itself asserts compress_ratio in [4, 128] (compressor.py:171). Pro is inside that asserted set. There is no Pro-specific code path upstream.

Our side: the only shape assertion across the 6930 lines of V4 sources is head_dim == 512 (deepseek_v4_weights.cpp:173), which Pro satisfies. All dims come off the config (deepseek_v4.cpp:1725-1731), all CUDA shared memory is dynamic (extern __shared__), and compress_ratios is consumed by value — has_compressor(l) = ratio != 0, has_indexer(l) = ratio == 4 (deepseek_v4.h:127-128), which matches upstream's > 1 / == 4 polarity exactly (ratio 0 → upstream max(1,0) = 1 → no compressor).

Checkpoint-level grounding. Normalizing layer and expert indices out of both real model.safetensors.index.json files gives 98 distinct tensor-name patterns on each side, with zero patterns unique to either. Predicting compressor/indexer layers from compress_ratios alone reproduces both real checkpoints exactly:

predicted compressor / indexer actual in checkpoint
Flash (43L) 41 / 21 41 / 21
Pro (61L) 61 / 30 61 / 30

Pro's layers 0-1 carry the 4-tensor ratio-128 compressor group where Flash has none, exactly as the value-driven rule predicts.

Verdict

No architecture work is owed. Pro is a config variant of the existing row, not a new model row.

What blocks actually running it

1.599T params. deepseek-ai/DeepSeek-V4-Pro is 805 GiB, nvidia/DeepSeek-V4-Pro-NVFP4 864 GiB, and the smallest real GGUF (teamblobfish/DeepSeek-V4-Pro-GGUF) is Q2_K-XL at 534.7 GiB. One GB10 is 119 GiB unified — Q2 is ~4.5x over, and 1.6T params at 2 bits has a ~400 GB floor. The pinned oracle needs the same memory, so there is no gateable denominator on this hardware either (Flash already needed 2 Sparks, and this needs roughly 5-8 at Q2).

Second, independent of memory: the real-geometry DSA sparse path is an already-named residual on our side. dsa_dense = (be.gguf != nullptr) (deepseek_v4.cpp:668) forces the compressor and indexer off on the real keep-quant path, so Flash runs dense MLA, which is exact only while seq_len <= index_topk. For Flash that window is 512 tokens; for Pro it is 1024. Long-context V4 on either model needs that residual built out.

Scope of this issue

Records-only plus one test. No download, no GPU, no forward:

  • Add a CPU test that drives ParseDeepseekV4Params with the real Pro config values and asserts the derived geometry (compressor/indexer layer counts 61/30, nope 448, heads-per-group 8, zdim, expert count), with Flash's 43L/41/21 as the control arm.
  • RED evidence by mutation: hardcoding a Flash dimension must turn the new test red.
  • Record the Pro variant + the HW verdict in the row spec.

Out of scope: any attempt to load or run Pro, and the DSA real-geometry residual (tracked separately).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions