|
| 1 | +# GB200 DeepSeek V4 vLLM Disaggregated Agentic Sweep Notes |
| 2 | + |
| 3 | +This is the engineering log for the GB200 DeepSeek V4 Pro NVFP4 vLLM |
| 4 | +disaggregated agentic sweep. It records configuration changes, official runs, |
| 5 | +observations, and the evidence behind each decision. It must be updated as the |
| 6 | +sweep progresses. |
| 7 | + |
| 8 | +## Target |
| 9 | + |
| 10 | +- Model: `deepseek-ai/DeepSeek-V4-Pro` (NVFP4 checkpoint) |
| 11 | +- Hardware: GB200, four GPUs exposed per Slurm node |
| 12 | +- Runtime: vLLM behind Dynamo disaggregated serving |
| 13 | +- Workload: `semianalysis_cc_traces_weka_061526` |
| 14 | +- Required result: successful official GitHub Actions artifacts covering |
| 15 | + multiple concurrency points and multiple prefill/decode topologies |
| 16 | +- Baseline: single-node B200 aggregate vLLM results from the InferenceX results |
| 17 | + database |
| 18 | + |
| 19 | +The workload has very long contexts and approximately 96% theoretical prefix |
| 20 | +reuse. Fixed-sequence recipes are not valid starting points because they use |
| 21 | +much shorter prompts and usually disable prefix caching. |
| 22 | + |
| 23 | +## Methodology |
| 24 | + |
| 25 | +1. Bring up a low-cost topology and prove model loading and cross-node NIXL |
| 26 | + transfer. |
| 27 | +2. Validate KV event ingestion and request transport independently of |
| 28 | + performance. |
| 29 | +3. Compare P/D balance at a constant 40-inference-GPU budget: |
| 30 | + `4P/1D`, `3P/2D`, `2P/3D`, and `1P/4D`. |
| 31 | +4. Use c64 as a topology gate, then run c32/c64/c128/c192 curves for viable |
| 32 | + topologies. |
| 33 | +5. Compare total and per-GPU throughput, TTFT, TPOT, E2E latency, request |
| 34 | + errors, and measured cache reuse against the B200 aggregate baseline. |
| 35 | + |
| 36 | +Each P or D worker is TP8/TEP8 and spans two four-GPU Slurm nodes. Every |
| 37 | +constant-budget topology therefore uses ten inference nodes plus one dedicated |
| 38 | +NATS/etcd node. |
| 39 | + |
| 40 | +## Configuration Changes |
| 41 | + |
| 42 | +### Initial TP8 disaggregation (`444371fb`) |
| 43 | + |
| 44 | +- Added a GB200 agentic vLLM configuration using vLLM `v0.23.0`. |
| 45 | +- Used TP8/TEP8 workers because the current NVFP4 checkpoint is not supported |
| 46 | + by the older vLLM images used by the fixed-sequence recipes. |
| 47 | +- Kept prefix caching enabled and used the full 061526 agentic trace. |
| 48 | + |
| 49 | +### KV-aware 4P/1D topology (`76ad0903`) |
| 50 | + |
| 51 | +- Added four cache-affinitized prefill replicas and one decode replica. |
| 52 | +- Enabled Dynamo KV routing and explicit vLLM KV-event publication. |
| 53 | +- Ensured each two-node TP8 prefill replica had one internally consistent and |
| 54 | + externally distinct NIXL engine ID. |
| 55 | + |
| 56 | +### TEP8 correction (`b56d0d9e`) |
| 57 | + |
| 58 | +- Changed prefill model sharding from TEP4 to TEP8. |
| 59 | +- Evidence: official run `27732316539` reached 182.54 GiB per GPU and failed |
| 60 | + while requesting another 1.97 GiB during MoE weight construction. |
| 61 | +- Conclusion: TEP4 cannot load this checkpoint on the available GB200 nodes. |
| 62 | + |
| 63 | +### Dynamo/vLLM compatibility and request transport (`1e29f559`) |
| 64 | + |
| 65 | +- Updated Dynamo from `1.2.0.dev20260426` to |
| 66 | + `1.2.0.dev20260526`. |
| 67 | +- Set `DYN_REQUEST_PLANE=tcp` for frontend, prefill, and decode workers. |
| 68 | +- Kept KV events on their separate ZMQ-to-NATS event path. |
| 69 | +- Evidence for the Dynamo change: every vLLM v0.23 `BlockStored` event failed |
| 70 | + to decode with the April 26 wheel. The compatible trailing-field parser was |
| 71 | + added upstream on April 29 and is present in the May 26 wheel. |
| 72 | +- Evidence for TCP: the earlier c64 canary returned HTTP 503 with |
| 73 | + `Rejecting request: all workers are busy` from the NATS request plane. |
| 74 | + Dynamo documents TCP as its fastest request plane. |
| 75 | +- The apparent `DYN_VLLM_KV_EVENT_PORT=5200+` versus recipe port `20080` |
| 76 | + mismatch was investigated and disproved: vLLM and its colocated Dynamo |
| 77 | + worker correctly communicate over local `tcp://127.0.0.1:20080`. |
| 78 | + |
| 79 | +### P/D topology grid (`74dfa0bb`) |
| 80 | + |
| 81 | +- Added constant-40-GPU recipes for `3P/2D`, `2P/3D`, and `1P/4D` alongside |
| 82 | + `4P/1D`. |
| 83 | +- Added c32/c64/c128/c192 to every topology in |
| 84 | + `.github/configs/nvidia-master.yaml`. |
| 85 | +- Multi-decode recipes use generated vLLM v0.23 engine IDs. This avoids ID |
| 86 | + collisions across decode replicas while vLLM synchronizes the generated ID |
| 87 | + across the two nodes of each TP8 replica. |
| 88 | + |
| 89 | +### Slurm job-name prefix (branch-only historical workaround) |
| 90 | + |
| 91 | +- This branch prefixes GB200 Slurm jobs with `ifx-` in |
| 92 | + `runners/launch_gb200-nv.sh`. |
| 93 | +- It is not standard on `main`. |
| 94 | +- It was introduced after jobs `18593` and `18599` were reportedly cancelled |
| 95 | + by another Watchtower runner fleet that reused the `gb200-nv_N` names. |
| 96 | +- This naming change does not alter topology or benchmark behavior. |
| 97 | + |
| 98 | +## Validation |
| 99 | + |
| 100 | +- `python -m pytest utils/matrix_logic/ -q`: 158 passed. |
| 101 | +- All four topology recipes parse as YAML and were checked for: |
| 102 | + - 40 inference GPUs plus one infrastructure node; |
| 103 | + - matching vLLM image and Dynamo wheel; |
| 104 | + - KV routing enabled; |
| 105 | + - TCP request plane on all components; |
| 106 | + - collision-free generated engine IDs for multi-decode topologies. |
| 107 | +- The sweep generator emits 16 points: four topologies times four |
| 108 | + concurrencies. |
| 109 | + |
| 110 | +## Official Runs |
| 111 | + |
| 112 | +| Run | Configuration | Outcome | Key evidence | |
| 113 | +| --- | --- | --- | --- | |
| 114 | +| `27728896563` | 1P/1D, c32/c64/c128/c192 | Partially green, later cancelled | c64: about 26.7k tok/s total, 423s mean TTFT, about 5% cache hit; not competitive | |
| 115 | +| `27732316539` | TEP4 prefill attempt | Failed | Model-load OOM at 182.54 GiB/GPU plus 1.97 GiB allocation | |
| 116 | +| `27732541012` | 4P/1D c64, old Dynamo/NATS | Failed warmup | 45/85 errors; empty router indexes; KV-event decode errors; HTTP 503 overloads | |
| 117 | +| `27734909066` | 4P/1D c64, new Dynamo/TCP | Success | Official artifact; clean 85/85 warmup and 99/99 profiled requests | |
| 118 | +| `27737167704` | c64 topology sweep | Running/queued | 4P/1D, 3P/2D, 2P/3D, 1P/4D | |
| 119 | + |
| 120 | +## Corrected 4P/1D c64 Gate (`27734909066`) |
| 121 | + |
| 122 | +Functional results: |
| 123 | + |
| 124 | +- All four prefills and one decode worker registered. |
| 125 | +- Warmup: 85 completed, zero errors. |
| 126 | +- Profiling: 99 successful records, zero request errors. |
| 127 | +- HTTP 503 responses: zero. |
| 128 | +- KV-event decode failures: zero. |
| 129 | +- Dynamo made 125 selections with nonzero `effective cached blocks`, proving |
| 130 | + that the KV index was populated and used. |
| 131 | + |
| 132 | +Performance from `results_bmk/agg_bmk.json`: |
| 133 | + |
| 134 | +- Total throughput: 22,573.5 tok/s. |
| 135 | +- Per-GPU throughput: 564.3 tok/s across 40 inference GPUs. |
| 136 | +- Output throughput: 124.2 tok/s total. |
| 137 | +- Mean TTFT: 133.0s; p95 TTFT: 205.5s. |
| 138 | +- Mean TPOT: 115.6ms; p95 TPOT: 209.5ms. |
| 139 | +- Mean E2E: 176.3s; p95 E2E: 263.8s. |
| 140 | +- Theoretical cache hit: 96.5%. |
| 141 | +- Final vLLM GPU prefix-hit rates by prefill: approximately 1.3% to 3.5%. |
| 142 | + |
| 143 | +Conclusion: this run proves the compatibility and transport fixes, but it is |
| 144 | +not a satisfactory performance result. It is slower than the earlier 1P/1D |
| 145 | +c64 point and far below the B200 aggregate baseline. The gap between 96.5% |
| 146 | +theoretical reuse and low single-digit measured reuse remains an open root |
| 147 | +cause; a green workflow alone is not acceptance. |
| 148 | + |
| 149 | +## Baseline |
| 150 | + |
| 151 | +The B200 aggregate c64 reference is approximately: |
| 152 | + |
| 153 | +- 82k tok/s total; |
| 154 | +- 10.3k tok/s/GPU; |
| 155 | +- about 93% measured cache hit. |
| 156 | + |
| 157 | +That configuration uses KV offloading. The initial GB200 disaggregated sweep |
| 158 | +does not use offloading, as requested, but the comparison remains useful for |
| 159 | +detecting clearly invalid performance. |
| 160 | + |
| 161 | +## Open Investigation |
| 162 | + |
| 163 | +1. Complete the c64 P/D topology comparison. The 4P/1D result is strongly |
| 164 | + decode-limited, so D-heavy layouts are expected to improve latency and |
| 165 | + completed-request rate. |
| 166 | +2. Determine why Dynamo observes only small cached overlaps even though the |
| 167 | + trace reports about 96% theoretical reuse and the prefills have spare KV |
| 168 | + capacity. Candidate causes must be proven from token/hash/routing evidence; |
| 169 | + no cache-hit metric bypass or synthetic workload substitution is acceptable. |
| 170 | +3. Select viable topologies and run official c32/c64/c128/c192 curves. |
| 171 | +4. Download and review final artifacts against the B200 aggregate baseline. |
| 172 | + |
| 173 | +## Acceptance Criteria |
| 174 | + |
| 175 | +- At least two P/D parallelism configurations represented in official |
| 176 | + successful GitHub Actions artifacts. |
| 177 | +- Multiple concurrency points for each selected topology. |
| 178 | +- No request errors or hidden warmup aborts. |
| 179 | +- Artifacts contain aggregated and raw agentic results. |
| 180 | +- Server logs demonstrate working KV-event ingestion and routing. |
| 181 | +- Performance is reviewed against B200 aggregate results and any remaining |
| 182 | + gap is explained by measured evidence rather than workflow success alone. |
0 commit comments