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:
Out of scope: any attempt to load or run Pro, and the DSA real-geometry residual (tracked separately).
deepseek-ai/DeepSeek-V4-ProisDeepseekV4ForCausalLM/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.jsonfrom HF): zero new keys, zero removed keys. Every difference is a scaled value.hidden_sizenum_hidden_layersnum_attention_headsn_routed_expertsmoe_intermediate_sizeq_lora_ranko_groupsindex_topkrouted_scaling_factorcompress_ratios[0:2][0, 0, …][128, 128, …]Identical on both:
head_dim512,qk_rope_head_dim64,hc_mult4,hc_eps,hc_sinkhorn_iters20,num_hash_layers3,n_shared_experts1,sliding_window128,scoring_func: sqrtsoftplus,topk_method: noaux_tc,swiglu_limit10.0,expert_dtype: fp4,index_head_dim128,index_n_heads64,compress_rope_theta160000,num_experts_per_tok6,vocab_size129280. Heads-per-output-LoRA-group is 8 on both (64/8, 128/16).Upstream (pinned oracle
5559679229bc961848b121ccdeaa8fa5d79bec98, vLLM 0.26.0.dev0): the samevllm/models/deepseek_v4/package serves both. Every dimension is read offconfig(nvidia/model.py:535-679,attention.py:193-211,attention.py:708). Compressor presence iscompress_ratio > 1(attention.py:334) overmax(1, config.compress_ratios[layer_id])(attention.py:209), and the compressor itself assertscompress_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__), andcompress_ratiosis consumed by value —has_compressor(l) = ratio != 0,has_indexer(l) = ratio == 4(deepseek_v4.h:127-128), which matches upstream's> 1/== 4polarity exactly (ratio 0 → upstreammax(1,0) = 1→ no compressor).Checkpoint-level grounding. Normalizing layer and expert indices out of both real
model.safetensors.index.jsonfiles gives 98 distinct tensor-name patterns on each side, with zero patterns unique to either. Predicting compressor/indexer layers fromcompress_ratiosalone reproduces both real checkpoints exactly: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-Prois 805 GiB,nvidia/DeepSeek-V4-Pro-NVFP4864 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 whileseq_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:
ParseDeepseekV4Paramswith 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.Out of scope: any attempt to load or run Pro, and the DSA real-geometry residual (tracked separately).