[CI][PD] Add optional/nightly DSv4 Disaggregated eval (#42310)

Signed-off-by: NickLucche <nicolo.lucchesi@mistral.ai>

Nicolò Lucchesi committed Jul 15, 2026 at 23:04 UTC 3034c8d389edaf4a131c30304eee76bb9aef5022
3 files changed +31 -5
.buildkite/test_areas/disaggregated.yaml
+22
@@ -203,3 +203,25 @@ steps:
203 commands:
204 - bash /vllm-workspace/.buildkite/scripts/install-kv-connectors.sh
205 - bash v1/kv_connector/nixl_integration/run_multi_connector_edge_case_test.sh
206 +
207 +# P TP 4 - D DPEP 4 test case for DSv4-Flash
208 +- label: DSv4-Flash Disaggregated DP EP
209 + key: dsv4-flash-disaggregated
210 + timeout_in_minutes: 60
211 + device: h200
212 + optional: true
213 + working_dir: "/vllm-workspace/tests"
214 + num_devices: 8
215 + env:
216 + ENABLE_HMA_FLAG: "1"
217 + DP_EP: "1"
218 + GPU_MEMORY_UTILIZATION: "0.85"
219 + PREFILLER_TP_SIZE: "4"
220 + DECODER_TP_SIZE: "4"
221 + PREFILL_BLOCK_SIZE: "256"
222 + DECODE_BLOCK_SIZE: "256"
223 + MODEL_NAMES: "deepseek-ai/DeepSeek-V4-Flash"
224 + VLLM_SERVE_EXTRA_ARGS: "--trust-remote-code,--kv-cache-dtype,fp8"
225 + commands:
226 + - bash /vllm-workspace/.buildkite/scripts/install-kv-connectors.sh
227 + - bash v1/kv_connector/nixl_integration/run_accuracy_test.sh
tests/v1/kv_connector/nixl_integration/run_accuracy_test.sh
+8 -5
@@ -140,12 +140,13 @@ run_tests_for_model() {
140 # Start prefill instances
141 for i in $(seq 0 $((NUM_PREFILL_INSTANCES-1))); do
142 # Calculate GPU ID - we'll distribute across available GPUs
143 - GPU_ID=$((i % $(get_num_gpus)))
144 - NEXT_GPU=${GPU_ID}
143 + GPU_START=$((i % $(get_num_gpus)))
144 + GPU_ID=$GPU_START
145 + NEXT_GPU=$GPU_START
146 # Reserve TP*PP GPUs for the prefiller (TP shards across PP stages).
147 PREFILLER_WORLD_SIZE=$((PREFILLER_TP_SIZE * PREFILLER_PP_SIZE))
148 for (( j=1; j < PREFILLER_WORLD_SIZE; j++ )); do
148 - NEXT_GPU=$(((GPU_ID + j) % $(get_num_gpus)))
149 + NEXT_GPU=$(((GPU_START + j) % $(get_num_gpus)))
150 GPU_ID="${GPU_ID},${NEXT_GPU}"
151 done
152
@@ -195,10 +196,12 @@ run_tests_for_model() {
196 # Start decode instances
197 for i in $(seq 0 $((NUM_DECODE_INSTANCES-1))); do
198 # Calculate GPU ID - we'll distribute across available GPUs, starting from after prefill GPUs
198 - GPU_ID=$(((i + NEXT_GPU + 1) % $(get_num_gpus)))
199 + DECODE_START=$(((i + NEXT_GPU + 1) % $(get_num_gpus)))
200 + GPU_ID=$DECODE_START
201 + NEXT_GPU=$DECODE_START
202 # If DECODER_TP_SIZE is more than 1
203 for (( j=1; j < DECODER_TP_SIZE; j++ )); do
201 - NEXT_GPU=$(((GPU_ID + j) % $(get_num_gpus)))
204 + NEXT_GPU=$(((DECODE_START + j) % $(get_num_gpus)))
205 GPU_ID="${GPU_ID},${NEXT_GPU}"
206 done
207 # Calculate port number (base port + instance number)
tests/v1/kv_connector/nixl_integration/test_accuracy.py
+1
@@ -26,6 +26,7 @@ EXPECTED_VALUES = {
26 "Qwen/Qwen3.5-0.8B": 0.33,
27 "google/gemma-4-E2B-it": 0.485,
28 "ai21labs/AI21-Jamba2-3B": 0.74,
29 + "deepseek-ai/DeepSeek-V4-Flash": 0.95,
30 }
31
32 SIMPLE_PROMPT = (