Skip to content

GLM-5.2 vLLM Decode Context Parallelism

Independent research — not an official Z.ai publication.Identity and provider disclosure

A cool-blue technical diagram shows eight GPU ranks first holding repeated sparse-cache tiles and then different contiguous sequence shards; an amber compatibility gate sends an unsafe configuration into a red blocked branch, a validated candidate into a teal branch, and both toward a blue rollback loop

Original editorial illustration: the left side represents KV replication inside a tensor-parallel group, the center represents DCP sequence shards, and the right side represents a version/correctness gate plus rollback. It is not a vLLM trace, memory capture, output comparison, or benchmark.

Decode context parallelism (DCP) is attractive for GLM-5.2 because sparse MLA effectively leaves one latent KV head. Tensor parallelism can split the query and weight work while still replicating that cache. On an eight-GPU node, the result can be eight copies of the same sequence state. DCP replaces those copies with different sequence shards, then combines partial attention results.

That geometry is useful, but a plausible topology is not a compatible runtime. For GLM-5.2 FP8 on Hopper, four conditions must hold at once: the attention backend must support SM90, understand fp8_ds_mla, return decode LSE, and execute the model’s pure-DCP fused path correctly. Stable vLLM fails the third condition. The audited current main branch passes the backend gate but still misses the fourth.

This guide pins vLLM v0.26.0 at 568afb3a13806beb53bb2e6bd518269357b237c0, audits current main at 09fddeb4ce7ee8cd0c46f1da9c45aafb9a17e89a, and pins GLM-5.2-FP8 at ba978f7d347eaf65d22f1a86833408afdb953541. The machine-readable audit receipt hashes twenty-five public artifacts and reproduces the cache-copy, head-envelope, release-gap, and reporter-concurrency arithmetic below. We made zero model calls, zero local GPU runs, and zero local upstream-test runs.

  1. Make the version decision first
  2. Understand the cache-copy opportunity
  3. See why vLLM 0.26.0 fails
  4. Reject the FlashInfer shortcut on H200
  5. Separate the backend merge from stable
  6. Keep the current-main correctness blocker visible
  7. Calculate the GLM-5.2 head envelope
  8. Read upstream performance without transferring it
  9. Pin a future candidate before launch
  10. Build the DCP1 parity control
  11. Measure capacity and service behavior
  12. Add MTP only after plain decode passes
  13. Preserve one-setting rollback
  14. Rent GPUs only after the fix lands
  15. Troubleshoot common DCP failures
  16. Frequently asked questions
  17. Sources and method

The shortest safe answer is a four-row version matrix:

Build boundary FlashMLA sparse decode LSE GLM-5.2 pure-DCP fused fix Decision
vLLM v0.26.0, 568afb3a… No No Reject DCP before launch
Backend merge, 63ff748f… Added Not included Necessary backend work, not a complete production fix
Audited main, 09fddeb4… Yes No Can initialize, but do not promote
Open PR #50005 head, 6127a179… Yes on a compatible base Present in the branch Isolated source-evaluation candidate only

Pull request #46514 merged the FlashMLA sparse backend work on August 19, 2026. The v0.26.0 release was published on July 27. The deterministic receipt calculates a 23.1217-day gap, so a v0.26.0 version string cannot include that merge.

Pull request #50005 was still open at the August 25 audit. Its code may be reviewed or tested in a disposable environment, but an open PR is not a release. It can change base, fail review, be superseded, or expose a new interaction. “The backend starts” and “the model’s DCP path is correct” are separate gates.

The future promotion condition is intentionally stricter than “PR merged”:

  1. Both fixes must exist in the exact commit or image digest being tested.
  2. The resolved backend and cache dtype must match the intended H200 path.
  3. DCP1 and the candidate must produce equivalent outputs on a fixed corpus.
  4. The candidate must deliver a useful capacity or service gain.
  5. Restart rollback to DCP1 must be rehearsed.

If the correctness PR is still open, stop after source review. There is no reason to spend an eight-H200 production-shaped budget to rediscover a known unmerged boundary.

The pinned GLM-5.2-FP8 config declares GlmMoeDsaForCausalLM, 64 query heads, a 512-dimensional latent KV rank, and sparse index top K of 2,048. Sparse MLA uses one effective latent KV head. TP can divide the 64 query heads while leaving the latent sequence cache duplicated across ranks.

For TP8, DCP changes the relative copy geometry as follows:

DCP size Relative KV copies across TP8 Sequence fraction stored per rank Duplication reduction vs DCP1
1 8 1 0%
2 4 1/2 50%
4 2 1/4 75%
8 1 1/8 87.5%

The formula is simple for this one-KV-head case:

Relative GLM-5.2 TP8 cache geometry
copies across TP group = tensor_parallel_size / dcp_size
per-rank sequence share = 1 / dcp_size

Those are relative copies, not bytes. The calculation excludes block size, the packed fp8_ds_mla layout, index cache, workspace, allocator reserve, prefix reuse, graph pools, model state, fragmentation, and service headroom. DCP8 can reduce duplication by 87.5% and still fail to increase admitted requests if another allocation is the bottleneck.

Issue #53134 supplies a useful reporter cell. On vLLM 0.26.0 with 8×H200, TP8, EP, DCP8, fp8_ds_mla, and GLM-5.2-FP8, the reporter describes roughly 393K KV tokens per GPU, a 262,144-token request length, about 20 GB of available KV cache, and maximum concurrency near 1.50. The rounded arithmetic is:

Reconcile the issue reporter's rounded cell
393,000 / 262,144 = 1.4992

That reproduces the relationship between the reported numbers. It does not verify the bytes, concurrency, configuration, or result on another node.

The opportunity is therefore real but conditional: DCP can reclaim replicated sequence state, yet only a compatible, correct runtime and a live admission test can turn that geometry into service capacity.

DCP divides attention over sequence shards. Each rank calculates a partial output over its local cache, and the runtime must combine those pieces with the proper softmax normalization. That merge needs the log-sum-exp (LSE) term from decode attention.

The pinned v0.26.0 check_attention_cp_compatibility asserts that any attention implementation used with DCP can return decode LSE. At the same commit, FlashMLASparseImpl does not override that capability. The compatibility check fails before serving begins.

The reporter’s error has the correct shape:

Expected v0.26.0 failure boundary
Decode Context Parallelism requires the attention implementation
to return softmax LSE during decode, but FlashMLASparseImpl does not.

This is a healthy fail-closed outcome. Do not patch out the assertion. Removing the guard would not synthesize the missing LSE, coordinate sparse index ownership, gather query heads, or merge outputs. It would only allow execution to continue without the contract that DCP depends on.

The stable control should leave DCP disabled:

Stable H200 control: no DCP candidate
vllm serve zai-org/GLM-5.2-FP8 \
--tensor-parallel-size 8 \
--enable-expert-parallel \
--kv-cache-dtype fp8 \
--max-model-len 131072 \
--tool-call-parser glm47 \
--reasoning-parser glm45 \
--enable-auto-tool-choice \
--served-model-name glm-5.2-fp8

The official recipe uses fp8 for Hopper; the sparse backend canonicalizes the relevant aliases to the DeepSeek sparse-MLA layout. Record the resolved dtype rather than assuming the spelling in the command proves it.

Do not add --decode-context-parallel-size 8 to v0.26.0. The expected result is initialization failure, not a memory-saving deployment.

Issue #53134 also records a failed attempt to force FLASHINFER_MLA_SPARSE. That does not resolve the capability intersection.

The pinned v0.26.0 flashinfer_mla_sparse.py defines different hardware paths:

Stable backend candidate H200 / SM90 fp8_ds_mla Decode LSE Result
FLASHMLA_SPARSE Yes Yes No DCP compatibility check rejects it
FlashInfer sparse SM10 path No No Yes Backend selection rejects the profile
FlashInfer sparse SM120 path No Yes Yes Different compute-capability family

The target intersection is SM90 + fp8_ds_mla + decode LSE + correct pure DCP. No v0.26.0 selectable backend satisfies it. A backend name is not a portable implementation switch; it selects kernels with hardware, layout, head-shape, and feature constraints.

Three tempting workarounds are unsafe:

  • Remove the LSE assertion. The downstream merge still lacks a valid input.
  • Lie about the KV dtype. The packed layout and kernels do not change when a string changes.
  • Force a Blackwell path on Hopper. Compute capability and kernel support are not compatibility warnings that can be ignored.

The correct stable fallback is DCP1. If DCP1 cannot meet the long-context service goal, change the capacity plan or wait for the runtime fix; do not turn a fail-closed check into a silent-correctness experiment.

PR #46514 adds the backend-side pieces that v0.26.0 lacks. Its merged source:

  • sets can_return_lse_for_decode = True;
  • reshapes kernel LSE into the token/head form consumed by the DCP reducer;
  • localizes global sparse top-K indices to the rank that owns each sequence shard;
  • substitutes neutral (0, -inf) output/LSE for rows with no selected local token, so empty shards disappear from the cross-rank softmax merge;
  • restricts FlashMLA sparse DCP to the validated ag_rs communication path;
  • requires the FP8 mixed-batch path;
  • rejects incompatible local-versus-gathered head padding; and
  • permits the named varlen-decode boundary used by its MTP/full-graph tests.

Those are not cosmetic changes. Sparse attention first selects positions, so sequence ownership affects the indices as well as the attention kernel. A rank with no locally owned selected position must contribute the mathematical identity, not an undefined tensor or a fabricated token.

The main-branch source at 09fddeb4… contains these backend guards. That proves only that current main moved beyond the v0.26.0 startup blocker.

It does not prove:

  • the exact Docker image contains the audited commit;
  • the GLM-5.2 fused model wrapper feeds the backend correctly;
  • DCP2/4/8 produce the same answers as DCP1;
  • MTP plus full graphs is correct for the target checkpoint;
  • cache savings survive all other allocations; or
  • throughput and tail latency improve for the target workload.

Backend integration is one layer of the stack. The next section covers the model-level path that remains unresolved.

Keep the current-main correctness blocker visible

Section titled “Keep the current-main correctness blocker visible”

Issue #50095 and open PR #50005 describe two defects in the fused NVIDIA GLM-5.2 / DeepSeek-V3.2 pure-DCP path.

Query work is skipped with an owner-remote KV slot

Section titled “Query work is skipped with an owner-remote KV slot”

In the audited current common/kernels.py, the fused kernel returns when slot_mapping is negative before its query RMSNorm branch executes. Under ordinary padding, negative can mean “ignore this token.” Under DCP, it can mean “another rank owns this token’s KV slot.” The local rank still has a query contribution that must be normalized and sent through the distributed attention operation.

PR #50005 moves query RMSNorm ahead of the owner-local slot check while keeping the negative slot as a guard against incorrect cache writes. The distinction is precise: KV ownership suppresses the local cache write, not the query.

Pure DCP misses the global query and output merge

Section titled “Pure DCP misses the global query and output merge”

The audited current attention.py gathers query heads and combines partial output/LSE inside its PCP branch. Pure DCP does not enter that branch. The model can therefore send rank-local query heads into attention over owner-local KV and fail to combine the complete result across ranks.

PR #50005 adds the missing pure-DCP gather and MLADCPManager combine. At the audit time it remains open with head 6127a179f89384df0b0128584794a64dcaa8578b.

The contributor evidence is serious but bounded:

PR #50005 validation cell Reported result Publication boundary
Focused fused norm/RoPE suite on one GB200 67 passed PR-author run, not local
4×H200, GLM-5.2-NVFP4, TP4/DCP4, greedy Patched DCP4 byte-identical to DCP1 on the tested prompt Different checkpoint and topology
Same tested request on unpatched main Repeated-token output Reporter observation, not universal failure frequency

Passing startup after PR #46514 therefore does not close the correctness gate. The current recommendation is not “use a newer nightly.” It is “wait until the model-level fix merges, pin the resulting build, and then run your own parity canary.”

This is also why HTTP health cannot be the promotion signal. A server can be healthy, allocate cache, return status 200, and still combine distributed attention incorrectly.

PR #46514 includes a separate fail-closed head-envelope guard. The FP8 sparse decode kernel pads query heads to either 64 or 128. Under DCP, the backend builds metadata from the local count but runs the kernel after DCP gathers heads. The two counts must land in the same padded envelope.

GLM-5.2 has 64 global query heads. TP8 yields:

Pinned query-head geometry
local query heads = 64 global heads / TP8 = 8
gathered query heads = 8 × DCP size

The deterministic matrix is:

DCP size Local heads Gathered heads Local FP8 pad Gathered FP8 pad Head guard
1 8 8 64 64 Pass
2 8 16 64 64 Pass
4 8 32 64 64 Pass
8 8 64 64 64 Pass

This calculation removes one possible blocker for TP8/DCP8. It does not override PR #50005. Think of compatibility as an AND expression:

The full gate, not one passing cell
release contains backend support
AND release contains the model-level correctness fix
AND SM90 + fp8_ds_mla resolves to FlashMLA sparse
AND communication path is supported
AND mixed-batch FP8 path is selected
AND local/gathered head envelope matches
AND output parity passes
AND service and rollback gates pass

A single true cannot make the whole expression true. The head table is a useful preflight artifact because it prevents an otherwise valid future build from failing later on a shape that its kernel cannot represent.

Read upstream performance without transferring it

Section titled “Read upstream performance without transferring it”

The official vLLM DCP article shows why this feature is worth tracking. In its long-context benchmark, baseline TP plateaus near 1,863 tok/s/GPU, while DCP reaches 6,091 tok/s/GPU at concurrency 512 with 82% KV usage.

That result used B200 and Kimi K2.6 NVFP4. It is not a GLM-5.2/H200 forecast. Model architecture, sparse index behavior, precision, context distribution, batching, communication, graph mode, software revision, and accepted-output definition can all change the outcome.

PR #46514 reports a closer but still non-transferable profile:

Upstream cell Reported value Why it cannot be copied into a capacity plan
Hardware and model 4×H200, GLM-5.2-NVFP4 Target here is 8×H200 FP8
Topology TP4/DCP4/EP + MTP Different TP/DCP degree and checkpoint
Focused tests 140 passed, 0 failed PR branch coverage, not target-image verification
Long-context needle Exact recovery at 198K One named correctness task, not service parity
Warm batch-one decode 78 tok/s Contributor environment and request shape
Batch-32 aggregate 854 tok/s Aggregate output is not per-request tail latency

Use upstream numbers to design measurement cells, not to fill a business model. A local canary should report at least:

  • checkpoint revision and image digest;
  • GPU model, count, fabric, driver, CUDA, and vLLM commit;
  • TP, DCP, EP, MTP, graph, cache dtype, block size, and maximum model length;
  • prompt and output length distributions;
  • warm-up, repetitions, concurrency, and run order;
  • accepted-output parity before throughput;
  • TTFT, TPOT, queue time, accepted output tok/s, HBM, usable KV tokens, and admission failures; and
  • confidence intervals or at least repeated-run dispersion.

If an arm generates repeated, truncated, malformed, or semantically different output, its raw token rate is not a performance result. It is a correctness failure.

Do this section only after PR #50005 or its successor is merged and the exact build contains both the backend and model-level fixes.

First, record immutable provenance outside the service log’s secret-bearing environment dump:

Record only the future candidate provenance
python - <<'PY'
from importlib.metadata import version
from pathlib import Path
import json
print("vllm", version("vllm"))
cfg = json.loads(Path("/models/GLM-5.2-FP8/config.json").read_text())
for key in (
"architectures",
"model_type",
"num_attention_heads",
"kv_lora_rank",
"index_topk",
"max_position_embeddings",
):
print(key, cfg.get(key))
PY

Record the container digest, Git commit, checkpoint revision, driver, CUDA, GPU inventory, NVLink topology, and exact launch arguments separately. A package version alone cannot prove that a downstream image contains the merged fix or has no conflicting patch.

Then preflight resolved state. The candidate must show:

Property Required future value Failure action
GPU family H200 / SM90 Stop; this guide does not transfer
Model GlmMoeDsaForCausalLM Stop; wrong architecture
Cache dtype fp8_ds_mla after alias resolution Stop; re-audit layout/backend
Sparse backend FLASHMLA_SPARSE Stop; re-audit any different backend
DCP communication ag_rs for the audited backend support Stop; do not bypass guard
FP8 path Mixed-batch path accepted Stop; unsupported branch
Head envelope Local and gathered pads both 64 for TP8/DCP≤8 Stop on mismatch
Correctness fix Merged code present in exact image Stop if missing or uncertain

Do not validate code presence by checking only a PR number in release notes. Inspect the exact image source or a verifiable build manifest. If provenance is ambiguous, the candidate is ambiguous.

DCP1 is the clean rollback and comparison arm because it can use the same future image, checkpoint, backend, parser, sampling profile, and service configuration. Comparing stable v0.26.0 with a future branch changes hundreds of unrelated commits and cannot isolate DCP.

Freeze these inputs across arms:

  • immutable image and checkpoint revision;
  • TP8 and expert-parallel settings;
  • cache dtype, block size, model length, memory utilization, and scheduler limits;
  • MTP off for the first phase;
  • eager/graph mode and compilation settings;
  • reasoning and tool parsers;
  • sampling temperature, top P, seed, maximum output, stop rules, and penalties;
  • prompt corpus, arrival schedule, concurrency sweep, warm-up, repetitions, and run order; and
  • output normalizer and pass/fail thresholds.

Change only DCP size:

Future A/B arms after the fix is merged
control: decode_context_parallel_size = 1
candidate: decode_context_parallel_size = 2
only after DCP2 passes:
candidate: decode_context_parallel_size = 4
only after DCP4 passes:
candidate: decode_context_parallel_size = 8

Starting at DCP2 reduces the blast radius and reveals whether the distributed path works before the experiment uses the maximum degree. It also makes a monotonicity check possible: cache duplication should fall as DCP rises, while communication and scheduling costs may grow.

The output corpus should include:

  1. short deterministic prompts that catch immediate token divergence;
  2. long prompts that place selected sparse-attention positions on multiple shards;
  3. mixed prefill and decode batches;
  4. cases where one DCP rank owns none of a row’s selected positions;
  5. repeated low-concurrency runs that can expose one-row or empty-shard edges;
  6. reasoning on/off, tool calls, structured arguments, and normal text;
  7. stop strings, token stops, maximum-output termination, and cancellation;
  8. prefix-cache hit and miss arms if production uses prefix caching; and
  9. randomized arrival orders with deterministic per-request sampling seeds.

Compare token IDs when deterministic decoding is expected. Compare parsed tool arguments and termination reasons as first-class outputs, not only visible text. A byte-identical upstream request does not replace this workload-specific contract.

Correctness is necessary; it does not prove that DCP solves the actual bottleneck. Measure each phase separately:

Phase Required measurements Decision question
After weight load Total/free HBM per rank, backend, dtype Did the same model state load?
After graph capture Graph/workspace HBM and stream count Did the candidate reserve materially different runtime state?
Empty warm service Cache pool bytes, blocks, usable KV tokens Did sequence sharding enlarge the usable pool?
One long request TTFT, TPOT, HBM, per-rank cache ownership Does the distributed path behave as intended?
Concurrency sweep Admission, queue, p50/p95/p99 latency, accepted output tok/s Where is the useful operating point?
Near capacity Preemptions, evictions, OOMs, failures, recovery Is the new cliff operationally acceptable?

Capacity telemetry must also distinguish cache pressure from transient attention workspaces. If a GLM-5.2 FP8 service starts successfully but later dies in flash_mla_cuda.sparse_decode_fwd while KV occupancy is low, use the vLLM H200 runtime OOM workspace audit to reproduce the batched-token allocation and bound it independently of DCP.

If decode instead dies while copying a block table into expanded_block_table_buffer, classify the two logged widths before changing DCP or context. The GLM-5.2 vLLM block-table error guide separates the one-column alignment signature from the DCP-factor signature and maps each to the first stable release containing its merged fix.

For cache capacity, record both allocated bytes and usable tokens. A larger pool can be fragmented or constrained by block geometry. For service, report accepted outputs per second only after the output contract passes.

Use a fixed concurrency ladder such as 1, 2, 4, 8, 16, and the target service level, then add intermediate points near the first admission or latency cliff. Do not jump directly to the largest DCP size at maximum concurrency; that confounds topology, capacity, and load.

Track communication explicitly. DCP trades replicated memory for cross-rank query and output/LSE operations. A workload with shorter prompts or low cache pressure may save memory it did not need while paying communication on every decode step. A candidate can be correct and still lose on TPOT or tail latency.

Promotion should require a written service budget, for example:

Example gate categories; set workload-specific values
correctness: zero unexplained token, tool, or termination mismatches
capacity: target long-context concurrency admits with reserve
latency: p95 TTFT and TPOT stay inside the service budget
throughput: accepted output rate improves or capacity goal justifies tradeoff
stability: no new OOM, preemption, hang, NaN, or repeated-token event
rollback: DCP1 restart restores the known-good contract within the RTO

Do not copy numeric thresholds from a blog. Set them from the service’s user experience, traffic, and risk tolerance before seeing the candidate result.

PR #46514 reports MTP plus full CUDA graphs on its 4×H200 NVFP4 branch, but the target here changes checkpoint, degree, and software state. Speculative decode adds draft-token shapes, acceptance behavior, graph captures, and extra cache state. It should be a later experiment.

Use this order:

  1. DCP1 versus DCP2 with ordinary autoregressive decode and the simplest graph mode that production can tolerate.
  2. DCP1 versus the passing DCP degree under production graph capture.
  3. Add the pinned MTP configuration to both arms.
  4. Re-run output parity, acceptance length, draft/accepted token accounting, TTFT, TPOT, HBM, graph capture, and failure recovery.
  5. Advance to a larger DCP degree only after the complete lower-degree arm passes.

MTP changes the output pipeline even when final text looks plausible. Record accepted and rejected draft tokens, final token IDs, finish reasons, and tool arguments. A faster draft loop with divergent final output is not a win.

If the future merged fix or release notes state a narrower MTP boundary than the current open PR, follow the released source. This article’s audit date does not freeze the future implementation.

For broader speculative-decoding setup, use the GLM-5.2 MTP guide. Do not import its promotion result into DCP; test the combination as its own topology.

The rollback should not depend on finding a different image, rebuilding the checkpoint, or selecting another backend. Keep a versioned DCP1 deployment of the exact candidate image ready.

Rollback invariant
same image digest
same checkpoint revision
same TP8 and EP settings
same cache dtype and parsers
same sampling and service limits
only decode_context_parallel_size returns to 1

Rehearse rollback before production traffic:

  1. Start the passing DCP candidate in isolation.
  2. Send a small deterministic smoke corpus and a long-context request.
  3. Trigger the documented restart or deployment rollback.
  4. Confirm the replacement process resolves DCP1 and becomes ready.
  5. Re-run the smoke corpus and compare tokens, tools, and finish reasons.
  6. Measure restoration time against the recovery-time objective.
  7. Preserve both arms’ sanitized logs, metrics, commit, image digest, and failure evidence.

Do not hot-edit the running process to bypass a guard. DCP size is topology; the clean rollback is a controlled restart into the known-good arm.

Alert on correctness as well as infrastructure. Repeated tokens, all-zero or NaN outputs, unexplained stop changes, tool-argument drift, or a rank-specific cache anomaly should remove the candidate from traffic even if health probes remain green.

An isolated rented node can answer the future workload-specific question when it matches eight H200 GPUs, the intended interconnect, driver/CUDA stack, immutable image, and checkpoint. Renting hardware cannot make an open fix merged or prove that the provider’s topology matches a production cluster.

Before opening a rental, fix the candidate commit, image digest, checkpoint, TP/DCP arms, MTP phase, prompt corpus, metric definitions, run count, budget, failure threshold, evidence path, and teardown plan. If PR #50005 remains open or the exact image cannot prove it contains the eventual merged fix, postpone the run.

If an eight-H200 rental is not justified, keep DCP1 and revisit the broader GLM-5.2 local deployment decision. A large cluster is not the only route: a shorter context limit, lower concurrency, separate decode replicas, or a hosted API may better match the workload.

v0.26.0 says FlashMLASparseImpl cannot return decode LSE

Section titled “v0.26.0 says FlashMLASparseImpl cannot return decode LSE”

That is the expected stable-version boundary. Remove DCP and use DCP1, or wait for a pinned build that contains both the later backend work and the eventual model-level correctness fix. Do not remove the compatibility assertion.

Forcing FlashInfer says dtype or compute capability is unsupported

Section titled “Forcing FlashInfer says dtype or compute capability is unsupported”

The H200/SM90 and fp8_ds_mla intersection does not match the stable FlashInfer paths audited here. Return to automatic backend selection with DCP disabled. If a future release adds a new H200 path, audit that exact source and tests rather than inheriting this page’s matrix.

Current main starts, so can I assume the issue is fixed?

Section titled “Current main starts, so can I assume the issue is fixed?”

No. The audited main contains PR #46514’s backend capability but not open PR #50005’s fused-model pure-DCP fix. Startup proves the backend gate passed; it does not prove query RMSNorm, global query gathering, output/LSE combination, or final token parity.

DCP output repeats tokens while health checks stay green

Section titled “DCP output repeats tokens while health checks stay green”

Remove the candidate from traffic and roll back to the identical DCP1 arm. Capture token IDs, prompts after redaction, finish reasons, resolved backend, DCP degree, image digest, commit, cache dtype, graph/MTP state, and per-rank errors. Compare against the known open correctness path before attempting a new build. Do not keep serving because HTTP responses are syntactically valid.

DCP8 passes output parity but admits no more long requests

Section titled “DCP8 passes output parity but admits no more long requests”

Measure the full allocation breakdown. Weights, graphs, workspaces, index cache, block geometry, fragmentation, scheduler limits, or reserved headroom may dominate. Compare usable KV tokens and admission, not only the theoretical copy factor. If the service bottleneck is elsewhere, keep DCP1.

Cache capacity improves but TPOT or p99 latency regresses

Section titled “Cache capacity improves but TPOT or p99 latency regresses”

DCP adds distributed work during decode. Decide against the prewritten service budget: a capacity gain may justify a modest latency cost for one workload, but not for an interactive low-concurrency service. Test a lower DCP degree before changing unrelated knobs.

Return to the last plain-decode passing arm. Record draft settings, graph mode, acceptance length, final token IDs, and finish reasons. Treat DCP+MTP as a separate unsupported combination until the exact build and workload pass; do not infer safety from either feature alone.

The head-envelope guard rejects another topology

Section titled “The head-envelope guard rejects another topology”

Calculate local query heads and the DCP-gathered count for that model and TP degree. If they pad to different FP8 kernel envelopes, the rejection is intentional. Change the topology or use a supported release path; do not patch out the guard.

DCP shards the decode KV cache by sequence across GPUs that would otherwise hold replicated cache, performs attention over local shards, and combines the partial output using softmax LSE. It targets long-context capacity and decode work distribution; it is not the same as pipeline parallelism or expert parallelism.

Is DCP the same as GLM-5.2 vLLM sequence-parallel MoE?

Section titled “Is DCP the same as GLM-5.2 vLLM sequence-parallel MoE?”

No. The sequence-parallel MoE guide covers hidden and residual token-row state through MoE decoder layers. DCP shards the sequence dimension of decode attention cache and combines partial attention results. The two features have different activation, correctness, memory, and rollback contracts.

Does vLLM v0.26.0 support GLM-5.2 DCP on H200?

Section titled “Does vLLM v0.26.0 support GLM-5.2 DCP on H200?”

Not for the audited FP8 sparse-MLA profile. Its H200-compatible FlashMLA sparse backend does not return decode LSE, so the DCP compatibility check rejects the configuration. The later backend merge is not in the v0.26.0 tag.

Does the current main branch fix GLM-5.2 DCP?

Section titled “Does the current main branch fix GLM-5.2 DCP?”

It fixes the audited backend LSE integration but not the entire model path. At commit 09fddeb4…, the separate pure-DCP fused-attention correction remains in open PR #50005. Do not equate “newer than stable” with a closed correctness boundary.

Each rank computes attention over only its sequence shard. Combining the partial outputs requires their softmax normalization weights. Log-sum-exp is the numerically stable statistic used to perform that cross-rank merge.

The stable FlashInfer sparse paths audited here do not satisfy the H200/SM90 plus fp8_ds_mla intersection. A backend that returns LSE but cannot run the hardware or cache layout is not a valid substitute.

For TP8 with one effective KV head, DCP8 reduces relative cache copies across the group from eight to one, an 87.5% duplication reduction. That is not an 87.5% total-HBM prediction. Measure usable cache tokens and admitted requests on the exact build.

Is TP8/DCP8 rejected by the current head-envelope guard?

Section titled “Is TP8/DCP8 rejected by the current head-envelope guard?”

Not for the pinned GLM-5.2 query-head count. TP8 gives eight local heads; DCP8 gathers 64, and both pad to the same 64-head FP8 envelope. This one guard passes, but the open correctness fix still blocks promotion.

Only as an isolated source-evaluation experiment with an immutable base/head, no production traffic, a DCP1 control, strong output parity, and clean teardown. The safer operational choice is to wait for merge and release packaging. An open PR result cannot be generalized to a future tag.

Restart the identical pinned image and checkpoint with DCP size returned to one. Keep TP, EP, cache dtype, parsers, sampling, service limits, and corpus unchanged so rollback removes the distributed decode path instead of changing several variables.

When should I abandon DCP even after the fixes land?

Section titled “When should I abandon DCP even after the fixes land?”

Abandon it if output parity fails, the workload does not need replicated-cache relief, communication worsens the service budget, usable KV capacity does not increase, near-capacity recovery is unreliable, or DCP1 rollback cannot meet the recovery objective.

The model identity and head geometry come from the pinned GLM-5.2-FP8 config and model card. The H200 baseline comes from the pinned vLLM GLM-5.2 recipe.

The version and capability audit uses the v0.26.0 release, issue #53134, PR #46514, pinned v0.26.0 FlashMLA sparse source, current-main FlashMLA sparse source, and the pinned DCP compatibility check.

The separate correctness boundary comes from issue #50095, open PR #50005, and the audited current-main attention wrapper and fused kernel. The open-PR test results remain attributed to their authors.

General DCP mechanics and non-transferable performance context come from the official vLLM deployment docs and DCP engineering article. The llm-d GLM-5.2 H200 article was used as an alternative large-scale H200 architecture reference, not as a DCP validation.

This publication round began with four AI HOT discovery leads: MetaRoCE, Vera Rubin efficiency, OpenAI agents, and GPT-5.6 in Kiro. None passed the direct GLM-5.2 and originality gates, so they were not used as technical evidence. The topic came from the required proactive pass over Z.ai, Zhipu, vLLM, Hugging Face, and related primary repositories.

The evidence package records twenty-five source receipts with byte counts and SHA-256 hashes. Its deterministic calculations cover the 23.1217-day release gap, TP8/DCP1-8 cache-copy geometry, the GLM-5.2 FP8 head-envelope matrix, and the issue reporter’s rounded concurrency relationship. The package contains no model output, GPU result, or claim that an upstream PR test was executed here.

Recheck the vLLM release, issues, PR states, exact source, and image provenance before acting. DCP implementation is changing rapidly, and this audit’s fail-closed decision is tied to the named commits on August 25, 2026.