# DCP2 extraction from Aiden's production-1.1 image (2026-09-12) Everything needed to port Aiden's DCP2 (decode context parallelism) stack onto our clone-at-pin DSV4.1 tree — extracted from `aidendle94/sparkrun-vllm-dsv41-gb10: production-1.1` (published 2026-09-11T16:54Z; the DCP2 A/B ran on it, report in `recipes/dsv41-flash-4x-aiden11/reports/2026-09-12_003640_aiden11-dcp2-0912.md`). ## A/B verdict first (why this is optional, not urgent) Aiden 1.1 DCP2 (300K ctx, dcp=2, a2a, 8 GiB KV) vs our b12x baseline (512K ctx): | | our b12x (live) | Aiden 1.1 DCP2 | |---|---|---| | score | **167/176** | 158/176 | | pp/tg/TTFT (d0 c1, ms) | **1,642 / 47.0 / 1,738** | 1,517 / 41.8 / 2,446 | | KV | ~2M tokens @512K | **2,518,386 @300K** | DCP2 buys KV capacity / high-concurrency headroom, not quality or single-stream speed. Port it only if we want the 2.5M-token KV on our (fresher) stack. ## What the image contains - Base: `vllm/vllm-openai:nightly-8a728663` — an **older** vLLM tree (before DSV4.1 landed in-tree; it has no `models/deepseek_v4_1/` at all). Aiden's overlay adds the model files + the DCP2 machinery; the 24-file manifest is `/opt/dsv41-dcp2-mounts.txt` (copied to `manifest.txt` here). - FlashInfer: **zero porting work** — our FI pin `07869c61` already ships `csrc/trtllm_dcp_alltoall.cu`, `flashinfer/cake_dcp.py`, and the bench. - DCP CLI: `--decode-context-parallel-size N` (`-dcp`), `--dcp-comm-backend {ag_rs|a2a}` (default ag_rs; the a2a path is the new all-to-all with LSE exchange). Env (image defaults in brackets, all OFF): `DSV41_DCP_STAGE [3]`, `DSV41_DCP_COMBINE [ag_rs]`, `DSV41_DCP_PREFILL_GATHER [0]`, `DSV41_ENGRAM_MMAP [0]`, `DSV41_ENGRAM_PREFETCH [0]` (+MODE/THREADS/... ). ## Contents | path | what | |---|---| | `manifest.txt` | 23 (flat name, vllm-relative target) pairs from the image | | `baked/` | the 23 final (patched) files, `docker cp`'d from site-packages | | `base-theirs/` | the same 16 files at their base commit `8a728663` (GitHub) | | `base-ours/` | the same 23 files at our pin `e47aa780` (GitHub) | | `aiden-dcp2.patch` | their 16-file delta (base-theirs → baked), headers rewritten to `a/vllm/… b/vllm/…` for apply at the vLLM source root | ## Porting assessment (dry-run against our pin, 2026-09-12) | bucket | files | notes | |---|---|---| | clean `git apply` | 12 | communication_op, fused_moe/b12x, weight_utils, v1/attention/backend, mla/compressor_utils, kv_cache_coordinator, kv_cache_interface, cp_utils, gpu/attn_utils, gpu/block_table, gpu/model_runner, dflash/speculator — their base == our tree byte-for-byte | | needs 3-way merge | 4 | `sparse_attn_indexer.py`, `mla/indexer.py`, `mla/sparse_swa.py`, `kv_cache_utils.py` — our pin is newer in these (their base 8a728663 predates our e47aa780 for these paths) | | new-in-their-tree | 7 | `models/deepseek_v4_1/*` (6) + `candidate_blocks.py` — their base has no `deepseek_v4_1` at all; the overlay adds it. Our tree has newer versions in-tree; only the DCP2-specific deltas are wanted (largest: `engram.py` 773 diff lines, `nvidia/flashinfer_sparse.py` 681, `candidate_blocks.py` 254 — cherry-pick from `baked/` vs `base-ours/`, don't adopt wholesale) | Total estimate: a few hours of focused work (12 mechanical + 4 small merges + 7 cherry-picks) + one dgx5 rebuild + an A/B. The 7 model files are the risky part — their `engram.py` (70 KB) is much larger than ours (38 KB): the DCP2 mmap/prefetch machinery lives there. ## Apply procedure (when the day comes) ``` cd git apply --check dcp2/aiden-dcp2.patch # 12 clean, 4 expected failures # merge the 4 manually (per-file diffs inside aiden-dcp2.patch) # cherry-pick the 7 model-file deltas by hand # build with the usual clone-at-pin driver (DCP2 flags stay OFF unless the # recipe sets --decode-context-parallel-size 2 --dcp-comm-backend a2a + envs) ```