[UX] DCP Topology Validation (#49777)

Signed-off-by: Taneem Ibrahim <taneem.ibrahim@gmail.com>

Taneem Ibrahim committed Jul 25, 2026 at 16:53 UTC dbd80cc031718cae22ec8999bc5a494bacc4e955
1 file changed +23 -17
vllm/config/model.py
+23 -17
@@ -1298,27 +1298,33 @@ class ModelConfig:
1298 decode_context_parallel_size = parallel_config.decode_context_parallel_size
1299 if decode_context_parallel_size > 1 and not self.use_mla:
1300 total_num_kv_heads = self.get_total_num_kv_heads()
1301 - assert tensor_parallel_size > total_num_kv_heads, (
1302 - f"tensor parallel size {tensor_parallel_size} must be greater "
1303 - f"than total num kv heads {total_num_kv_heads} when enable "
1304 - f"decode context parallel for GQA/MQA"
1305 - )
1301 + if tensor_parallel_size <= total_num_kv_heads:
1302 + raise ValueError(
1303 + "Decode context parallelism for GQA/MQA requires "
1304 + f"`--tensor-parallel-size` ({tensor_parallel_size}) to be "
1305 + "greater than the model's total number of KV heads "
1306 + f"({total_num_kv_heads}). Increase `--tensor-parallel-size` "
1307 + "or set `--decode-context-parallel-size 1`."
1308 + )
1309
1310 max_dcp_size = tensor_parallel_size // total_num_kv_heads
1308 - assert decode_context_parallel_size <= max_dcp_size, (
1309 - f"decode context parallel size must less than or equal to "
1310 - f"(tensor parallel size {tensor_parallel_size} // total "
1311 - f"num kv heads {total_num_kv_heads}) = {max_dcp_size}, "
1312 - f"but got {decode_context_parallel_size}"
1313 - )
1311 + if decode_context_parallel_size > max_dcp_size:
1312 + raise ValueError(
1313 + "`--decode-context-parallel-size` "
1314 + f"({decode_context_parallel_size}) exceeds the maximum "
1315 + f"supported value ({max_dcp_size}) for "
1316 + f"`--tensor-parallel-size` ({tensor_parallel_size}) and "
1317 + f"{total_num_kv_heads} model KV heads."
1318 + )
1319
1320 num_q_per_kv = total_num_attention_heads // total_num_kv_heads
1316 - assert num_q_per_kv % decode_context_parallel_size == 0, (
1317 - f"Total number of q per kv attn heads ({num_q_per_kv})"
1318 - " must be divisible by dcp world size when enable "
1319 - "decode context parallel for GQA "
1320 - f"({parallel_config.decode_context_parallel_size})."
1321 - )
1321 + if num_q_per_kv % decode_context_parallel_size != 0:
1322 + raise ValueError(
1323 + "The model's number of query heads per KV head "
1324 + f"({num_q_per_kv}) must be divisible by "
1325 + "`--decode-context-parallel-size` "
1326 + f"({decode_context_parallel_size}) for GQA/MQA."
1327 + )
1328
1329 # torch_shm uses a single IPC queue to rank 0; DP>1 is
1330 # incompatible because API servers can't know which