Date: 2026-06-13
The fast TP4 PIECEWISE graph lane for
nameistoken/Qwen3.6-35B-A3B-Quark-W8A8-INT8 is not quality-safe yet. The
failure is below the chat wrapper and appears in raw /v1/completions with a
fixed rendered ChatML prompt.
The decisive new boundary:
~97-100 tok/s, but corrupts repeated fixed
completions.15.993 tok/s, but passed fixed raw canaries.This means the next speed work should repair decode replay state/lifetime correctness, not tune output copying or response formatting.
Added:
scripts/probe-fixed-chatml-completion-repeat.pyIt sends raw rendered ChatML to /v1/completions and repeats deterministic
fixed prompts. It now supports --logprobs and records HTTP errors as
mismatches, which caught the logprob/NaN failure below.
Compile check:
/home/steve/.venvs/vllm-xpu/bin/python -m py_compile \
scripts/probe-fixed-chatml-completion-repeat.py \
scripts/qwen36-text-quality-suite.py
Known fast controls:
data/qwen36-quark-int8-tp4-seq1-mbt8192-p512o512-20260613m.json
99.8368 tok/sdata/qwen36-quark-int8-tp4-seq1-noasyncgraph-p512o512-20260613n.json
97.7546 tok/sRepresentative failures:
data/qwen36-quark-int8-tp4-seq1-noasyncgraph-fixed-color-repeat512-20260613n.json
10/512 mismatches.85,91,174,180,263,269,352,358,441,447.data/qwen36-quark-int8-tp4-seq1-noasyncgraph-fixed-json-repeat512-20260613n.json
11/512 mismatches.data/qwen36-quark-int8-tp4-seq1-noasyncgraph-fixed-color-alone-stopmismatch-20260613n.json
417.blue whiskey green,orange,red.Global no-replay control:
COMPILATION_CONFIG='{"cudagraph_mode":"NONE"}'.data/qwen36-quark-int8-tp4-seq1-cgnone-fixed-color-alone-stopmismatch-20260613n.json
512/512 pass.data/qwen36-quark-int8-tp4-seq1-cgnone-fixed-json-alone-stopmismatch-20260613n.json
512/512 pass.data/qwen36-quark-int8-tp4-seq1-cgnone-p512o512-20260613n.json
15.899 tok/s.Selective decode-replay bypass:
VLLM_XPU_DISABLE_DECODE_CUDAGRAPH_REPLAY=1.MAX_NUM_SEQS=1 \
MAX_NUM_BATCHED_TOKENS=8192 \
LOG_PATH=/tmp/qwen36-quark-int8-tp4-seq1-nodecodereplay-probe-20260613o.log \
VLLM_XPU_DISABLE_DECODE_CUDAGRAPH_REPLAY=1 \
scripts/launch-qwen36-quark-int8-accepted.sh
Artifacts:
data/qwen36-quark-int8-tp4-seq1-nodecodereplay-fixed-color-repeat128-20260613o.json
128/128 pass.data/qwen36-quark-int8-tp4-seq1-nodecodereplay-fixed-json-repeat128-20260613o.json
128/128 pass.data/qwen36-quark-int8-tp4-seq1-nodecodereplay-p512o512-20260613o.json
15.993 tok/s after first text.15.954 tok/s wall.Interpretation: this is a correctness control and a replay-boundary proof, not a promoted speed candidate.
VLLM_XPU_SYNC_ASYNC_OUTPUT_COPY=1:
MAX_NUM_SEQS=1 \
MAX_NUM_BATCHED_TOKENS=8192 \
LOG_PATH=/tmp/qwen36-quark-int8-tp4-seq1-syncoutput-probe-20260613o.log \
VLLM_XPU_SYNC_ASYNC_OUTPUT_COPY=1 \
scripts/launch-qwen36-quark-int8-accepted.sh
data/qwen36-quark-int8-tp4-seq1-syncoutput-fixed-color-stopmismatch-20260613o.json55.blue, green whiskey whiskey whiskey whiskey0000000000000000000000000.VLLM_XPU_CUDAGRAPH_MARK_STEP_BEGIN=1:
torch.compiler.cudagraph_mark_step_begin() call before
each execute_model.data/qwen36-quark-int8-tp4-seq1-markstep-fixed-color-stopmismatch-20260613o.json55.blue, green whiskey whiskey whiskey whiskey0000000000000000000000000.Runtime recapture:
VLLM_XPU_CUDAGRAPH_RECAPTURE_AFTER_N_REPLAYS diagnostic
plus VLLM_XPU_CUDAGRAPH_ALLOW_RUNTIME_RECAPTURE=1.RuntimeError: CUDA graph capturing detected at an inappropriate time.data/qwen36-quark-int8-tp4-seq1-recap32allow-fixed-color-stopmismatch-20260613n.json
at index 4.Strong output:
VLLM_XPU_CUDAGRAPH_STRONG_OUTPUT=1data/qwen36-quark-int8-tp4-seq1-strongout-fixed-color-stopmismatch-20260613n.json55.The logprob probe on the fast replay path failed with a server-side JSON serialization error:
data/qwen36-quark-int8-tp4-seq1-markstep-fixed-color-logprobs5-http-stopmismatch-20260613o.json124.Out of range float values are not JSON compliant: nan.The server log also recorded the same ValueError while rendering logprobs. This points at corrupted logits/logprob tensors, not merely detokenization, HTTP response handling, or host output-copy ordering.
These were not direct Intel-B70 fixes, but they match the failure class and informed the next direction:
#32834 isolates a different model/quant crash to V1 CUDA graph
capture/replay, with eager stable but slow:
https://github.com/vllm-project/vllm/issues/32834.#114844 shows CUDA graph replay does not replay Python-side
state assignment such as self.x = res, silently leaving stale state:
https://github.com/pytorch/pytorch/issues/114844.#171551 documents overwritten graph outputs and recommends
cloning or torch.compiler.cudagraph_mark_step_begin() for that class:
https://github.com/pytorch/pytorch/issues/171551.#169970 notes grouped matmul can be problematic with graph
capture/replay when dynamic allocations/state enter the graph:
https://github.com/pytorch/pytorch/issues/169970.cudagraph_mark_step_begin() did not fix our vLLM/XPU manual graph replay
failure, but the stale-state and grouped-kernel graph warnings remain relevant.
Saved focused patch:
patches/vllm-qwen36-decode-replay-boundary-20260613o.patchThis patch is diagnostic-only:
VLLM_XPU_DISABLE_DECODE_CUDAGRAPH_REPLAY=1VLLM_XPU_CUDAGRAPH_MARK_STEP_BEGIN=1VLLM_XPU_CUDAGRAPH_STRONG_OUTPUT=1VLLM_XPU_CUDAGRAPH_RECAPTURE_AFTER_N_REPLAYSVLLM_XPU_CUDAGRAPH_ALLOW_RUNTIME_RECAPTURE=1Only the decode replay bypass produced clean output, and it is too slow to promote.
~100 tok/s graph speed while keeping the clean canary
behavior of the 15.99 tok/s control.New probe support:
--request-id-prefix to
scripts/probe-fixed-chatml-completion-repeat.py so server-side microscope
traces can be aligned with deterministic canary repeats.vllm/v1/worker/gpu_model_runner.py.
It can trace selected request IDs with input IDs, positions, slot mappings,
hidden/sample-hidden/logit summaries, local-argmax sampled IDs, and request
counters.Key trace finding:
cudagraph_mode=NONE) already had a
different sample-hidden digest from the adjacent good repeat:
{, prefill sample-hidden sum -72.3495{, prefill sample-hidden sum -64.6469answer in the good request and question in the
bad request.Fast-but-not-clean candidate:
VLLM_XPU_LOCAL_ARGMAX_DECODE=1VLLM_XPU_LOCAL_ARGMAX_DIRECT_GATHER=1VLLM_XPU_SANITIZE_LOGITS_NAN=1p512/o512 c1 decode is about
91.4 tok/s, but long deterministic gates fail, so this is not promotable.Repairs tested and rejected:
VLLM_XPU_DISABLE_FIRST_DECODE_CUDAGRAPH_REPLAY=1
input_batch.req_ids.NONE).70.data/qwen36-quark-int8-tp4-seq1-localargmax-directsanitize-firstdecodeeager2-fixed-json-repeat512-20260613q.jsondata/qwen36-replay-microscope-firstdecodeeager2-json-068-070-20260613q.jsonlVLLM_XPU_GDN_REUSE_QKVZ_BA_QUANT=0
139, same answer -> question branch flip.data/qwen36-quark-int8-tp4-seq1-localargmax-directsanitize-gdnreuse0-fixed-json-repeat512-20260613q.jsonVLLM_XPU_ZERO_FRESH_GDN_STATE=1
conv_state and ssm_state for
fresh prefill state indices before the prefill convolution/recurrent core.139.data/qwen36-quark-int8-tp4-seq1-localargmax-directsanitize-zerofreshgdn-fixed-json-repeat512-20260613q.jsonVLLM_ENABLE_FLA_PACKED_RECURRENT_DECODE=0
139.data/qwen36-quark-int8-tp4-seq1-localargmax-directsanitize-nopackedrec-fixed-json-repeat512-20260613q.jsonVLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=0
parallel_state.graph_capture because the communicator
graph-capture context asserts CudaCommunicator.AssertionError at parallel_state.py:565.data/qwen36-localargmax-directsanitize-realcommgraph-20260613q.logVLLM_XPU_USE_CUSTOM_OP_COLLECTIVES=0
and VLLM_XPU_COMPILE_ALLREDUCE_CUSTOM_OP=0
139.data/qwen36-quark-int8-tp4-seq1-localargmax-directsanitize-stockcollectives-fixed-json-repeat512-20260613q.jsonCurrent conclusion:
Next best ideas:
has_initial_state, conv/SSM state norms for
fresh prefill blocks, and per-layer GDN output digests.New positive control:
COMPILATION_CONFIG='{"cudagraph_mode":"NONE"}'VLLM_XPU_SANITIZE_LOGITS_NAN=1VLLM_XPU_ZERO_FRESH_GDN_STATE=1VLLM_EXTRA_ARGS='--no-async-scheduling'data/qwen36-quark-int8-tp4-seq1-zeronative-noasync-graphnone-fixed-json-repeat512-20260613y.json
512/512 pass.data/qwen36-quark-int8-tp4-seq1-zeronative-noasync-graphnone-fixed-color-repeat512-20260613y.json
512/512 pass.Interpretation:
Native GDN zeroing update:
VLLM_XPU_ZERO_FRESH_GDN_STATE=1 into the native XPU GDN wrapper fixed
the previous async/direct-sanitize JSON repeat:
data/qwen36-quark-int8-tp4-seq1-localargmax-directsanitize-zeronative-fixed-json-repeat512-20260613r.json
512/512 pass.data/qwen36-quark-int8-tp4-seq1-localargmax-directsanitize-zeronative-fixed-color-repeat512-20260613r.json
56.data/qwen36-gdn-trace-zeronative-noasync-json-052-053-20260613x.jsonlNo-async PIECEWISE observations:
data/qwen36-quark-int8-tp4-seq1-zeronative-noasync-fixed-color-repeat512-20260613u.json
512/512 pass.data/qwen36-quark-int8-tp4-seq1-zeronative-noasync-fixed-json-repeat512-20260613u.json
372.data/qwen36-replay-microscope-zeronative-noasync-json-052-053-20260613w.jsonl{ for both, but first-step logits/top-k already
differed. The second token diverged to answer vs question.Repairs tested in this follow-up:
VLLM_XPU_SKIP_COMPILED_PREFILL=1
Shape: 8193 out of considered ranges: [(1, 8192)].data/qwen36-quark-int8-tp4-seq1-zeronative-noasync-skipprefill-fixed-json-repeat512-20260613z2.json
54.VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1
cudagraph_mode=NONE while preserving uniform decode replay.force_uniform_decode is None and not force_eager.data/qwen36-quark-int8-tp4-seq1-zeronative-noasync-prefillgraphoff-fixed-json-repeat512-20260613ab.json
54.VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1
plus VLLM_XPU_DISABLE_FIRST_DECODE_CUDAGRAPH_REPLAY=1
data/qwen36-quark-int8-tp4-seq1-zeronative-noasync-prefillfirstoff-fixed-json-repeat512-20260613ac.json
512/512 pass.data/qwen36-quark-int8-tp4-seq1-zeronative-noasync-prefillfirstoff-fixed-color-repeat512-20260613ac.json
120 with
blue, green, orange,\n</think>\n\nred.52 tok/s,
so this is a useful partial boundary, but it is not correctness-safe.VLLM_XPU_DISABLE_INITIAL_DECODE_CUDAGRAPH_REPLAY_STEPS=6
plus prefill replay off:
data/qwen36-quark-int8-tp4-seq1-zeronative-noasync-prefilloff-decode6off-fixed-color-repeat512-20260613ad.json
24 with blue, green, red, yellow.cudagraph_copy_inputs=true
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE","cudagraph_copy_inputs":true}'Assertion index out of bounds: 0 <= ... < 1048576, then worker
cancellation.data/qwen36-zeronative-noasync-copyinputs-20260613ae.logCurrent best correctness state:
cudagraph_mode=NONE or full uniform-decode replay bypass.52 tok/s, but color still fails, so it is not
promotable.Next deeper repair targets:
cudagraph_copy_inputs=true path for XPU. The stock
path matches the suspected stale-input class but fails at startup with an
inductor bounds assertion.Patch snapshot:
patches/vllm-qwen36-decode-replay-boundary-followup-20260613af.patchAdded opt-in replay tracing in vllm/compilation/cuda_graph.py:
VLLM_XPU_CUDAGRAPH_REPLAY_TRACE_FILEVLLM_XPU_CUDAGRAPH_REPLAY_TRACE_MAX_LINESVLLM_XPU_CUDAGRAPH_REPLAY_TRACE_RANKVLLM_XPU_CUDAGRAPH_REPLAY_TRACE_SUBMOD_REGEXVLLM_XPU_CUDAGRAPH_REPLAY_TRACE_REQ_REGEXVLLM_XPU_CUDAGRAPH_REPLAY_TRACE_INPUTSVLLM_XPU_CUDAGRAPH_DISABLE_SUBMOD_REGEXArtifacts:
data/qwen36-cgtrace-noasync-20260613af.logdata/qwen36-quark-int8-tp4-seq1-cgtrace-noasync-json-repeat80-20260613af.jsondata/qwen36-cg-replay-trace-noasync-json-20260613af-r0.jsonldata/qwen36-cg-replay-trace-noasync-json-20260613af-r1.jsonldata/qwen36-cg-replay-trace-noasync-json-20260613af-r2.jsonldata/qwen36-cg-replay-trace-noasync-json-20260613af-r3.jsonldata/qwen36-cgbypass-firsthalf-20260613ag.logdata/qwen36-cgbypass-secondhalf-20260613ag.logdata/qwen36-quark-int8-tp4-seq1-cgbypass-firsthalf-json-repeat96-20260613ag.jsondata/qwen36-quark-int8-tp4-seq1-cgbypass-secondhalf-json-repeat96-20260613ag.jsonFindings:
53 with
{"question": "12 30.", "unit": "widgets"}.cudagraph_mode=NONE, 36 tokens.41 PIECEWISE graph wrappers.submod_N entries from the compiled
backbone graph: submod_0, submod_2, ..., submod_80.Selective hybrid replay bypass was not a valid repair path yet:
0 with
{"\n\n.4 with
{"answer": "42", "unit":baka": "widgets"}.Next action:
VLLM_XPU_CUDAGRAPH_REPLAY_TRACE_INPUTS=1 on the same adjacent JSON
request pair.cudagraph.replay().Patch snapshot:
patches/vllm-qwen36-decode-replay-directdigest-nativequantoff-20260613am.patchNew instrumentation and knobs:
direct_start / direct_finish replay trace events, including optional
output digests.VLLM_XPU_CUDAGRAPH_REPLAY_TRACE_DIGEST=1.VLLM_XPU_DISABLE_NATIVE_INT8_ACTIVATION_QUANT=1, which keeps W8A8 GEMM
but falls back from native XPU per-token activation quant to the Python
per_token_quant_int8 path.VLLM_XPU_CUDAGRAPH_CLEAR_ON_PREFILL=1, a rejected request-boundary graph
clear/recapture diagnostic.VLLM_XPU_CUDAGRAPH_PER_WRAPPER_POOL=1 and
VLLM_XPU_CUDAGRAPH_NO_GLOBAL_POOL=1, per-wrapper/no-global graph pool
diagnostics.Artifacts:
data/qwen36-cgtrace-inputs-20260613ah.logdata/qwen36-quark-int8-tp4-seq1-cgtrace-inputs-json-repeat80-20260613ah.jsondata/qwen36-cg-replay-trace-inputs-json-20260613ah-r0.jsonldata/qwen36-cgtrace-digest-20260613ai.logdata/qwen36-quark-int8-tp4-seq1-cgtrace-digest-json-repeat80-20260613ai.jsondata/qwen36-cg-replay-trace-digest-json-20260613ai-r0.jsonldata/qwen36-cgtrace-directdigest-20260613aj.logdata/qwen36-quark-int8-tp4-seq1-cgtrace-directdigest-json-repeat80-20260613aj.jsondata/qwen36-cg-replay-trace-directdigest-json-20260613aj-r0.jsonldata/qwen36-gdnreuseoff-20260613ak.logdata/qwen36-quark-int8-tp4-seq1-gdnreuseoff-noasync-fixed-json-repeat512-20260613ak.jsondata/qwen36-syncreplay-20260613al.logdata/qwen36-quark-int8-tp4-seq1-syncreplay-zeronative-noasync-fixed-json-repeat512-20260613al.jsondata/qwen36-nativequantoff-20260613am.logdata/qwen36-quark-int8-tp4-seq1-nativequantoff-noasync-fixed-json-repeat512-20260613am.jsondata/qwen36-clearprefill-20260613an.logdata/qwen36-quark-int8-tp4-seq1-clearprefill-noasync-fixed-json-repeat512-20260613an.jsondata/qwen36-decodeoff-trace-20260613ao.logdata/qwen36-quark-int8-tp4-seq1-decodeoff-directdigest-json-repeat80-20260613ao.jsondata/qwen36-cg-replay-trace-decodeoff-directdigest-json-20260613ao-r0.jsonldata/qwen36-perpool-20260613ap.logdata/qwen36-quark-int8-tp4-seq1-perpool-noasync-fixed-json-repeat80-20260613ap.jsondata/qwen36-stockcollectives-20260613aq.logdata/qwen36-quark-int8-tp4-seq1-stockcollectives-noasync-fixed-json-repeat80-20260613aq.jsondata/qwen36-stockcollectives-fresh-20260613ar.logdata/qwen36-quark-int8-tp4-seq1-stockcollectives-fresh-noasync-fixed-json-repeat80-20260613ar.jsonFindings:
submod_0 and direct submod_1
gdn_attention_core_xpu in the first layer.submod_0: identical prompt inputs produced tiny garbage
and NaNs in rank-0 BF16 outputs such as the [36, 2048] tensor.VLLM_XPU_DISABLE_DECODE_CUDAGRAPH_REPLAY=1, the JSON canary passed
80/80 repeats and the request 52/53 submod_0 direct prefill digests
were identical and NaN-free. This confirms the direct prefill corruption is a
downstream effect of repeated decode graph replay.Rejected candidates:
VLLM_XPU_GDN_REUSE_QKVZ_BA_QUANT=0: still failed at repeat 53.VLLM_XPU_SYNC_CUDAGRAPH_REPLAY=1: still failed at repeat 53.VLLM_XPU_DISABLE_NATIVE_INT8_ACTIVATION_QUANT=1: still failed at repeat
53; native activation quant is not the primary trigger.VLLM_XPU_CUDAGRAPH_CLEAR_ON_PREFILL=1: failed immediately with
CachingHostAllocator.h:773 it->second->use_count > 0 during runtime graph
recapture. Runtime recapture remains unsafe on this XPU stack.VLLM_XPU_CUDAGRAPH_PER_WRAPPER_POOL=1: startup passed, but JSON still
failed at repeat 53; shared graph-pool aliasing is not sufficient.VLLM_XPU_USE_CUSTOM_OP_COLLECTIVES=0,
VLLM_XPU_COMPILE_ALLREDUCE_CUSTOM_OP=0) still failed at repeat 53.
The fresh compile log no longer showed vllm::all_reduce alias warnings, so
the custom collective op path is not the primary trigger.Current interpretation:
Next actions:
53, the native int8_gemm_w8a8 path is the
leading suspect.submod_0 with the
normal replay-on path to confirm whether the corruption appears abruptly at a
specific replay count.VLLM_XPU_DISABLE_DECODE_CUDAGRAPH_REPLAY=1 as the correctness-safe
fallback while searching for a replay-on repair.Patch snapshot:
patches/vllm-qwen36-decode-replay-moe-bf16fallback-20260613av.patchNew diagnostics:
VLLM_XPU_INT8_LINEAR_BF16_FALLBACK=1
F.linear instead of the native XPU INT8 GEMM path.VLLM_XPU_INT8_MOE_BF16_FALLBACK=decode
Artifacts:
data/qwen36-int8linear-bf16fallback-20260613as.logdata/qwen36-quark-int8-tp4-seq1-int8linear-bf16fallback-noasync-fixed-json-repeat80-20260613as.jsondata/qwen36-tritonmoe-20260613at.logdata/qwen36-moebf16decode-lowmem-20260613au.logdata/qwen36-moebf16decode-20260613av.logdata/qwen36-quark-int8-tp4-seq1-moe-bf16decode-noasync-fixed-json-repeat80-20260613av.jsonFindings:
53 with a
runaway ! sequence. Native XPU W8A8 dense GEMM is not sufficient to explain
the replay corruption.--moe-backend triton did not start because the Triton backend does
not support the Quark INT8 activation/weight quant key combination for this
model.gpu_memory_utilization=0.95:
23.59 GiB6.49 GiB0.34 GiB53 with
{"question": "12 30.", "unit": "widgets"}. The native XPU fused MoE decode
kernel is also not sufficient to explain the replay corruption.Updated interpretation:
gdn_attention_core_xpu, while dense INT8, activation quant, custom
collectives, and native MoE have all been rejected as sole causes.Next actions:
gdn_attn.py and gdn_linear_attn.py for persistent decode
metadata, state-index tensors, temporary buffers, and XPU custom op calls
that may be captured by graph replay.Patch snapshot:
patches/vllm-qwen36-decode-replay-gdn-native-fallback-20260613ay.patchNew diagnostic knob:
VLLM_XPU_GDN_NATIVE_FALLBACK=decode
torch.ops._xpu_C.gdn_attention path and unpacks the projected QKV/Z/B/A
tensors before calling the existing Python/Triton GDN core.VLLM_XPU_GDN_NATIVE_FALLBACK=all
_forward_core(...), so
VLLM_ENABLE_FLA_PACKED_RECURRENT_DECODE=0 can switch the fallback from the
packed recurrent decode path to the alternate recurrent update path.Artifacts:
data/qwen36-gdnfallbackdecode-20260613aw.logdata/qwen36-quark-int8-tp4-seq1-gdnfallbackdecode-noasync-fixed-json-repeat80-20260613aw.jsondata/qwen36-gdnfallbackall-20260613ax.logdata/qwen36-quark-int8-tp4-seq1-gdnfallbackall-noasync-fixed-json-repeat80-20260613ax.jsondata/qwen36-gdnfallbackdecode-nopacked-20260613ay.logdata/qwen36-quark-int8-tp4-seq1-gdnfallbackdecode-nopacked-noasync-fixed-json-repeat80-20260613ay.jsonResults:
VLLM_XPU_GDN_NATIVE_FALLBACK=decode
8.58 GiB.20.67 GiB.-6.16 GiB.66 after 67 completed requests.{"answer": "42", " whiskey whiskey whiskey whiskey": "widgets"}.VLLM_XPU_GDN_NATIVE_FALLBACK=all
RuntimeError: PassManager::run failed inside Intel Triton while compiling
the FLA prefill chunk_gated_delta_rule path.VLLM_XPU_GDN_NATIVE_FALLBACK=decode plus
VLLM_ENABLE_FLA_PACKED_RECURRENT_DECODE=0
-0.04 GiB.66 after 67 completed requests.{"answer": "42", " whiskey whiskey whiskey whiskey "unit": "widgets"}.Updated interpretation:
53 to
repeat 66, so native GDN decode is implicated in the original corruption
window.VLLM_XPU_GDN_NATIVE_FALLBACK=decode to determine whether the first
divergence has moved past the GDN boundary or remains in graph replay output.Next actions:
65 and 66 with
VLLM_XPU_GDN_NATIVE_FALLBACK=decode.Patch snapshots:
patches/vllm-qwen36-decode-replay-gdn-native-fallback-20260613ay.patchpatches/vllm-qwen36-xpu-greedy-topk-fallback-20260614bd.patchNew diagnostic/correctness knob:
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1
logits.argmax(dim=-1) with
torch.topk(logits, k=1, dim=-1).indices.Key trace finding:
VLLM_XPU_GDN_NATIVE_FALLBACK=decode, the JSON canary moved from the
original repeat-53 failure to repeat 66.3715 on all ranks.sampler_output.sampled_token_ids was wrong on the bad request
(62085 on rank 0 and 5 on ranks 1-3).argmax with top-k fixed that sampler-side corruption.Artifacts:
data/qwen36-gdnfallbackdecode-microscope-20260614ba.logdata/qwen36-replay-microscope-gdnfallbackdecode-json-20260614ba-r{rank}.jsonldata/qwen36-gdnfallbackdecode-topkgreedy-20260614bb.logdata/qwen36-quark-int8-tp4-seq1-gdnfallbackdecode-topkgreedy-json-repeat96-20260614bb.jsondata/qwen36-quark-int8-tp4-seq1-gdnfallbackdecode-topkgreedy-color-repeat96-20260614bb.jsondata/qwen36-gdnfallbackdecode-topkgreedy-colortrace-20260614bc.logdata/qwen36-replay-microscope-topkgreedy-color-20260614bc.jsonldata/qwen36-quark-int8-tp4-seq1-gdnfallbackdecode-topkgreedy-json-repeat96-20260614bc.jsondata/qwen36-quark-int8-tp4-seq1-gdnfallbackdecode-topkgreedy-color-repeat96-20260614bc.jsonResults before the prefill replay guard:
VLLM_XPU_GDN_NATIVE_FALLBACK=decode plus
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1:
96/96.74.num_computed_tokens_cpu=0, request 73 produced the expected
first-token top-1 11855 (blue), while request 74 produced top-1
9092.sample_hidden_states were corrupt before logits and split by rank group:
ranks 0-1 and ranks 2-3 had different fingerprints.Working correctness stack:
VLLM_XPU_GDN_NATIVE_FALLBACK=decodeVLLM_XPU_ZERO_FRESH_GDN_STATE=1VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1--no-async-schedulingValidation artifacts:
data/qwen36-gdnfallbackdecode-topkgreedy-prefillbypass-20260614bd.logdata/qwen36-quark-int8-tp4-seq1-gdnfallbackdecode-topkgreedy-prefillbypass-json-repeat96-20260614bd.jsondata/qwen36-quark-int8-tp4-seq1-gdnfallbackdecode-topkgreedy-prefillbypass-color-repeat96-20260614bd.jsondata/qwen36-quark-int8-tp4-seq1-gdnfallbackdecode-topkgreedy-prefillbypass-color-repeat256-20260614bd.jsondata/qwen36-quark-int8-tp4-replaycorrectness-quality-suite-20260614bd.jsondata/qwen36-quark-int8-tp4-replaycorrectness-p512o512-metrics-20260614bd.jsonValidation results:
96/96 passed.96/96 passed.256/256 passed.85.85 tok/s mean.84.50 tok/s mean.106.49 ms mean.11.65 ms mean.8.58 GiB.20.66 GiB.-0.05 GiB.Updated interpretation:
argmax correctness issue.Next actions:
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1.
If decode speed is unaffected, keep it for correctness and move performance
work back to decode/MoE.VLLM_XPU_CUDAGRAPH_REPLAY_TRACE_SUBMOD_REGEX and replace the broad prefill
bypass with a narrower submodule or batch-boundary guard.Promotion:
scripts/launch-qwen36-quark-int8-accepted.sh now defaults to the passing
correctness stack:
VLLM_XPU_GDN_NATIVE_FALLBACK=decodeVLLM_XPU_ZERO_FRESH_GDN_STATE=1VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1VLLM_EXTRA_ARGS=--no-async-scheduling when no extra args are supplied.New reproducibility helper:
scripts/run-qwen36-ablation-candidate.sh
scripts/launch-qwen36-quark-int8-accepted.sh with caller-provided
env overrides./v1/models.Artifacts:
data/qwen36-ablation-no-gdnfallback-summary-20260614be.jsondata/qwen36-ablation-no-gdnfallback-p512o512-20260614be.jsondata/qwen36-ablation-no-gdnfallback-json-repeat96-20260614be.jsondata/qwen36-ablation-no-gdnfallback-color-repeat96-20260614be.jsondata/qwen36-ablation-no-gdnfallback-no-topk-summary-20260614bf.jsondata/qwen36-ablation-no-gdnfallback-prefill-replay-summary-20260614bg.jsondata/qwen36-ablation-native-gdn-topk-prefillbypass-promotion-summary-20260614bh.jsondata/qwen36-ablation-native-gdn-topk-prefillbypass-promotion-quality-suite-20260614bh.jsondata/qwen36-ablation-gdnfallback-clone-argmax-summary-20260614bi.jsondata/qwen36-ablation-gdnfallback-max-sampler-summary-20260614bj.jsonResults:
20260614bd:
85.85 tok/s.96/96, color 96/96, extended color 256/256, and quality
suite.94.00 tok/s.96/96 and color 96/96.49 with
{"answer":"12","unit":"widgets"}.22 with blue, green, orange,.argmax:
97.90 tok/s.39; color failed at repeat 23.argmax remains rejected.93.69 tok/s, effectively no decode gain.96/96; color failed at repeat 36.clone_argmax:
90.04 tok/s.39; color failed at repeat 23.torch.max(...).indices:
93.56 tok/s.39; color failed at repeat 23.torch.max shares the bad XPU reduction behavior and is rejected.Updated interpretation:
3.5-4 tok/s, but the cheaper
argmax-family alternatives tested so far are corrupt under repeated slot reuse.8 tok/s in short runs, but native GDN
is not reliable enough to promote; the failure only appeared after a longer
warm/reuse sequence.~85.85 tok/s.
The best tempting but rejected speed remains ~94-98 tok/s, depending on
which guard is removed.Next actions:
Trace artifacts:
data/qwen36-ablation-native-gdn-jsontrace-summary-20260614bk.jsondata/qwen36-ablation-native-gdn-jsontrace-json-repeat80-20260614bk.jsondata/qwen36-native-gdn-jsontrace-20260614bk.jsonldata/qwen36-native-gdn-jsontrace-microscope-20260614bk.jsonlReproduction profile:
VLLM_XPU_GDN_NATIVE_FALLBACK=0JSON_REQUEST_ID_PREFIX=native-gdn-jsontraceVLLM_XPU_GDN_TRACE_REQ_REGEX='native-gdn-jsontrace-0000(4[5-9]|5[0-2])'VLLM_XPU_GDN_TRACE_DECODE_ONLY=1VLLM_XPU_REPLAY_MICROSCOPE_REQ_REGEX using the same window.Result:
48:
native-gdn-jsontrace-000048{"answer":"12","unit":"widgets"}000047 produced the expected answer path.000047 step 2 top token was 763.000048 step 2 top token was 3147, starting the compact
{"answer":"12"...} path.Native GDN state finding:
xpu_num_computed_tokens=36) and
rank 0:
projected_states_qkvz, projected_states_ba, z, and
conv_state were identical between good request 000047 and bad request
000048.ssm_state entering native GDN differed before the native
op:
284.500885266.058289core_attn_out differed slightly after native GDN.Interpretation:
Rejected trace-derived fixes:
VLLM_XPU_ZERO_ALL_PREFILL_GDN_STATE=1
data/qwen36-ablation-native-gdn-zero-all-prefill-state-summary-20260614bl.json49 and color at repeat 22.VLLM_XPU_GDN_NATIVE_FALLBACK_INITIAL_DECODE_STEPS=1
data/qwen36-ablation-native-gdn-initial1-summary-20260614bm.json94.00 tok/s.49 and color at repeat 22.VLLM_XPU_GDN_NATIVE_FALLBACK_INITIAL_DECODE_STEPS=4
data/qwen36-ablation-native-gdn-initial4-summary-20260614bn.json93.99 tok/s.49 and color at repeat 22.Current status:
~94 tok/s lane but remains rejected.~85.85 tok/s.Next actions:
has_initial_state handling.non_spec_state_indices_tensor, block IDs, and GDN state index mapping across
requests 47/48.Problem:
VLLM_XPU_GDN_NATIVE_FALLBACK=decode, which still
let native/chunked GDN prefill run on XPU.TritonIntelStrideVersioning in chunk_delta_h.py).Patch:
vllm/_xpu_ops.py
decode,prefill;vllm/model_executor/layers/mamba/gdn_linear_attn.py
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1;Artifacts:
data/qwen36-ablation-w8a8-safe-prefill-recurrent-gmem90-fixed-quality-summary-20260614d1.jsondata/qwen36-ablation-w8a8-safe-prefill-recurrent-gmem90-fixed-canaries-summary-20260614d2.jsondata/qwen36-ablation-w8a8-safe-prefill-recurrent-gmem90-nopacked-canaries-summary-20260614d3.jsondata/qwen36-ablation-w8a8-safe-prefill-recurrent-gmem90-eager-nopacked-canaries-summary-20260614d4.jsondata/qwen36-ablation-w8a8-safe-prefill-recurrent-gmem90-eager-packed-canaries-summary-20260614d5.jsondata/qwen36-ablation-w8a8-safe-prefill-recurrent-gmem90-graphnone-packed-gate-summary-20260614d6.jsonResults:
pass_all=true;baseline_match_all=true;85.26 tok/s;49 with
{"answer": "12.0", "unit": "widgets"};96/96.96/96;33 with
blue, green, orange, </think> red.128/128;128/128.64/64;64/64.COMPILATION_CONFIG='{"cudagraph_mode":"NONE"}',
XPU_GRAPH=0, VLLM_XPU_ENABLE_XPU_GRAPH=0,
VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=0, recurrent prefill fallback enabled, and
packed decode enabled passed the full gate:
13.98 tok/s;128/128;128/128;pass_all=true, baseline_match_all=true.Interpretation:
GPU_MEMORY_UTILIZATION=0.90. It is valid but much too slow for the final
performance target.Promotion:
scripts/launch-qwen36-quark-int8-accepted.sh now defaults to the safe lane:
GPU_MEMORY_UTILIZATION=0.90;COMPILATION_CONFIG='{"cudagraph_mode":"NONE"}';XPU_GRAPH=0;VLLM_XPU_ENABLE_XPU_GRAPH=0;VLLM_XPU_FORCE_GRAPH_WITH_COMM=0;VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=0;VLLM_XPU_GDN_NATIVE_FALLBACK=decode,prefill;VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1;VLLM_XPU_ZERO_FRESH_GDN_STATE=1;VLLM_EXTRA_ARGS=--no-async-scheduling when no override is supplied.scripts/run-qwen36-ablation-candidate.sh now records graph mode, XPU graph
toggles, packed decode, memory utilization, and compilation config in summary
JSON for future A/B runs.Next actions:
Goal:
Patch:
vllm/compilation/cuda_graph.py
VLLM_XPU_CUDAGRAPH_REPLAY_MAX_PIECEWISE_INDEX to replay only a
prefix of piecewise graphs and run later graphs direct;VLLM_XPU_CUDAGRAPH_COMPARE_DIRECT_REGEX;VLLM_XPU_CUDAGRAPH_ZERO_REPLAY_OUTPUT_REGEX and
VLLM_XPU_CUDAGRAPH_ZERO_REPLAY_OUTPUT_INDICES.scripts/run-qwen36-ablation-candidate.sh
Artifacts:
data/qwen36-ablation-w8a8-safe-prefill-recurrent-gmem90-piecewise-prefix0-summary-20260614e1.jsondata/qwen36-ablation-w8a8-safe-prefill-recurrent-gmem90-piecewise-prefix0-compare-summary-20260614e2.jsondata/qwen36-prefix0-compare-20260614e2-r0.jsonldata/qwen36-prefix0-compare-20260614e2-r1.jsonldata/qwen36-prefix0-compare-20260614e2-r2.jsonldata/qwen36-prefix0-compare-20260614e2-r3.jsonldata/qwen36-ablation-w8a8-safe-prefill-recurrent-gmem90-piecewise-prefix0-sync-summary-20260614e3.jsondata/qwen36-ablation-w8a8-safe-prefill-recurrent-gmem90-piecewise-prefix0-zero-empty-summary-20260614e4.jsondata/qwen36-ablation-w8a8-safe-prefill-recurrent-gmem90-piecewise-prefix0-return-direct-summary-20260614e5.jsondata/qwen36-prefix0-return-direct-20260614e5-r0.jsonldata/qwen36-prefix0-return-direct-20260614e5-r1.jsonldata/qwen36-prefix0-return-direct-20260614e5-r2.jsonldata/qwen36-prefix0-return-direct-20260614e5-r3.jsonlResults:
14.20 tok/s;4 with {"answer": "42", "unit": "widgets widgets"};64/64.piecewise:0/41 showed:
$[0] zeros buffer: 0 max diff;$[2] qkvz projection: 0 max diff;$[3] ba projection: 0 max diff;$[6] embedding all-reduce: 0 max diff;empty outputs differed:
$[1] GDN z scratch/output buffer;$[5] self_attention_output scratch/output buffer;34.302734375.8/8 and color 1/1, but this is
not accepted as a speed or correctness win because the extra direct execution
perturbs runtime state.VLLM_XPU_SYNC_CUDAGRAPH_REPLAY=1 failed:
14.41 tok/s;29 with malformed quoting:
{"answer": 42', 'unit': 'widgets'};12 with blue, green- red- yellow.$[1] and $[5] zeroed failed identically:
14.40 tok/s;29 with malformed quoting:
{"answer": 42', 'unit': 'widgets'};12 with blue, green- red- yellow.32 with nested/braced output:
{"{"answer": "42", "unit": "widgets"}"};64/64;4.8 MB per TP rank.Interpretation:
piecewise:0
is enough to corrupt deterministic canaries.Rejected:
$[1] and $[5] as the fix for prefix0
corruption.Next:
Goal:
Code changes:
vllm/model_executor/layers/mamba/gdn_linear_attn.py
torch.where zeroing path. This fixed the device-lost crash
seen in recurrent prefill fallback.scripts/check-qwen36-gdn-prefill-state-stability.py
scripts/run-qwen36-ablation-candidate.sh
VLLM_XPU_USE_CUSTOM_OP_COLLECTIVES,
VLLM_XPU_COMPILE_ALLREDUCE_CUSTOM_OP,
VLLM_XPU_CUSTOM_ALLREDUCE_GRAPH_CLONE_INPUT, and
VLLM_XPU_CUSTOM_ALLREDUCE_CLONE_INPUT.Artifacts:
data/qwen36-ablation-native-decode-safe-prefill-graph-summary-20260614f1.jsondata/qwen36-ablation-native-decode-safe-prefill-graph-full-summary-20260614f2.jsondata/qwen36-ablation-native-decode-safe-prefill-graph-full-20260614f2.logtorch.where crash fix:
data/qwen36-ablation-native-decode-safe-prefill-where-full-summary-20260614f3.jsondata/qwen36-gdn-prefill-state-stability-f4.jsondata/qwen36-gdn-prefill-state-stability-f4.mddata/qwen36-ablation-native-decode-safe-prefill-layer0-summary-20260614f5.jsondata/qwen36-ablation-native-decode-safe-prefill-layer0-3-summary-20260614f6.jsondata/qwen36-ablation-native-decode-safe-prefill-layer0-3-tracecolor-summary-20260614f7.jsondata/qwen36-replay-microscope-layer03-color-f7.jsonldata/qwen36-ablation-native-decode-safe-prefill-layer0-3-zeroall-summary-20260614f8.jsondata/qwen36-ablation-native-decode-safe-prefill-layer0-3-graphnone-summary-20260614f9.jsondata/qwen36-ablation-native-decode-safe-prefill-layer0-3-graphnone-metrics-summary-20260614fa.jsondata/qwen36-ablation-native-decode-safe-prefill-layer0-3-slottrace-summary-20260614fb.jsondata/qwen36-replay-microscope-layer03-color-slots-fb.jsonldata/qwen36-ablation-native-decode-safe-prefill-layer0-3-stockcollectives-summary-20260614fc.jsondata/qwen36-ablation-native-decode-safe-prefill-layer0-3-graphnocomm-summary-20260614fd.jsondata/qwen36-ablation-native-decode-safe-prefill-layer0-3-graphnocomm-metrics-summary-20260614fe.jsonResults:
20260614f1 short gate looked promising:
93.31 tok/s;64/64 passed;64/64 passed;20260614f2 full gate crashed before metrics:
UR_RESULT_ERROR_DEVICE_LOST;gdn_linear_attn.py.20260614f3 after the torch.where crash fix completed but was rejected:
93.15 tok/s;48 with answer 12;91 with blue, green, red, yellow.20260614f4 standalone GDN prefill state stability passed:
0 for core output, z, conv state, and SSM state;20260614f5 forced graph with layer-0 decode fallback was rejected:
90.02 tok/s;128/128 passed;19 with early stop:
blue, green, orange,.20260614f6 forced graph with layers 0-3 decode fallback was rejected:
128/128 passed;127 with blue, green, red, yellow.20260614f7 replay microscope showed the bad token was already in logits:
f7-color-000022;blue, green, red, yellow;blue, green,, token red had logit 23.875
and orange had 22.5;20260614f8 forced graph with all GDN prefill state zeroed was rejected:
128/128 passed;127 with blue, green, red, yellow;20260614f9 graph-disabled lane passed canaries:
128/128 passed;256/256 passed.20260614fa graph-disabled metrics:
15.47 tok/s;64.63 ms/token;20260614fb full slot trace:
22;-1;20260614fc forced graph with stock collectives was rejected:
128/128 passed;127;20260614fd graph enabled without forced comm capture passed canaries:
128/128 passed;256/256 passed.20260614fe graph enabled without forced comm capture metrics:
15.70 tok/s;63.71 ms/token;Interpretation:
~90-93 tok/s path requires forced communication graph capture.15-16 tok/s.Rejected:
Accepted as oracles only:
15.47 tok/s.15.70 tok/s.Next:
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 plus
VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 as the corruption boundary.Goal:
Patch:
vllm/compilation/cuda_graph.py
VLLM_XPU_CUDAGRAPH_RECAPTURE_REGEX so
VLLM_XPU_CUDAGRAPH_RECAPTURE_AFTER_N_REPLAYS can target selected graph
wrappers instead of every wrapper.scripts/run-qwen36-ablation-candidate.sh
VLLM_XPU_CUDAGRAPH_RECAPTURE_AFTER_N_REPLAYS,
VLLM_XPU_CUDAGRAPH_RECAPTURE_REGEX, and
VLLM_XPU_CUDAGRAPH_ALLOW_RUNTIME_RECAPTURE.Results:
data/qwen36-ablation-forcedcomm-recapture1-canary-summary-20260614g1.json128/128 pass.128/128 pass.data/qwen36-ablation-forcedcomm-recapture8-canary-summary-20260614g2.json128/128 pass.128/128 pass.data/qwen36-ablation-forcedcomm-recapture64-canary-summary-20260614g3.json128/128 pass.128/128 pass.data/qwen36-ablation-forcedcomm-recapture64-metrics-summary-20260614g4.json14.76 tok/s.piecewise:0/ every 64 replays:
data/qwen36-ablation-forcedcomm-recapture64-piecewise0-canary-summary-20260614g5.json128/128 pass.128/128 pass.data/qwen36-ablation-forcedcomm-recapture64-piecewise0-metrics-summary-20260614g6.json14.71 tok/s.data/qwen36-ablation-forcedcomm-norecapture-control-metrics-20260614g7.logUR_RESULT_ERROR_DEVICE_LOST in
torch.xpu.empty_cache() during rank-0 model load.Interpretation:
piecewise:0/ recapture fall back to roughly the graph-disabled
decode band (14-15 tok/s).Rejected:
piecewise:0/ recapture as a performance candidate.Next:
piecewise:0/ selective recapture is unexpectedly triggering slow
graph-stack behavior.piecewise:0/;cudagraph_copy_inputs=true failure with a minimal XPU-safe copy
implementation instead of the stock path that hit an inductor bounds assert.Problem found:
20260614g/h follow-up runs were not comparable to the original fast
forced-comm graph lane because they omitted
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}'.COMPILATION_CONFIG to
{"cudagraph_mode":"NONE"}, so those runs silently measured the correct but
slow graph-none class.~15 tok/s; it was harness drift,
not a confirmed model/runtime speed regression.Harness fix:
scripts/run-qwen36-ablation-candidate.sh
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill, XPU_GRAPH=1,
VLLM_XPU_ENABLE_XPU_GRAPH=1, VLLM_XPU_FORCE_GRAPH_WITH_COMM=1), the
runner now auto-fills
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' when omitted;GPU_MEMORY_UTILIZATION=0.90 for summary/provenance
consistency;ABLATION_FAST_GRAPH_AUTOCONFIG=0 disables this behavior for intentional
negative controls.Harness verification:
COMPILATION_CONFIG:
data/qwen36-ablation-fastlane-autoconfig-smoke-metrics-summary-20260614h8.jsonCOMPILATION_CONFIG={"cudagraph_mode":"PIECEWISE"};87.92 tok/s;~15 tok/s graph-none
class.Corrected fast baseline:
data/qwen36-ablation-fastlane-config-restored-control-metrics-summary-20260614h4.json93.45 tok/s;10.70 ms/token;Corrected safety result:
data/qwen36-ablation-fastlane-config-restored-clean-canary-control-summary-20260614h6.json128/128 pass;127;blue, green, red, yellow instead of
blue, green, orange, red.Rejected corrected candidates:
data/qwen36-ablation-fastlane-eagerreq32-canary-summary-20260614h1.json
was not valid fast-path evidence because the compile config was missing;data/qwen36-ablation-fastlane-config-restored-eagerreq32-canary-summary-20260614h5.json
hit UR_RESULT_ERROR_DEVICE_LOST on the first request in
block_table.copy_to_gpu;20260614g pass was not valid fast-path evidence because it used
GDN=decode,prefill and no PIECEWISE compile config;data/qwen36-ablation-fastlane-config-restored-recapture64-canary-summary-20260614h7.json
failed JSON by repeat 5 and color by repeat 10;{"answer": "42", "unit": "widgets"}"};blue.Current status:
~93.45 tok/s corrected decode.~15-16 tok/s.Next:
20260614h4 baseline.Goal:
Patch:
vllm/compilation/cuda_graph.py
VLLM_XPU_CUDAGRAPH_CLONE_REPLAY_OUTPUT_REGEXVLLM_XPU_CUDAGRAPH_CLONE_REPLAY_OUTPUT_INDICESscripts/analyze-qwen36-cudagraph-trace.py
cmpl-h12-color-000022-0-..., so nearby good/bad requests line up.scripts/run-qwen36-ablation-candidate.sh
Trace artifacts:
data/qwen36-ablation-fastlane-state-trace-piecewise0-color-summary-20260614h9.jsondata/qwen36-cudagraph-state-h9-r0.jsonldata/qwen36-cudagraph-state-h9-analysis.json10,20,30,40:
data/qwen36-ablation-fastlane-state-trace-piecewise-10-20-30-40-color-summary-20260614h10.jsondata/qwen36-cudagraph-state-h10-analysis.json1-9:
data/qwen36-ablation-fastlane-state-trace-piecewise-1-9-color-summary-20260614h11.jsondata/qwen36-cudagraph-state-h11-analysis.jsondata/qwen36-ablation-fastlane-state-trace-piecewise0-alloutputs-color-summary-20260614h12.jsondata/qwen36-cudagraph-state-h12-analysis.jsonTrace findings:
22, with:
blue, green, red, yellow.0-3 traced, requests 20, 21, and bad request
22 looked identical at computed-token step 33.piecewise:10, the bad request already differed from adjacent good
requests.piecewise:1 already differed, so the divergent
handoff had to be graph0 output state not covered by the first four outputs.5, shape [1, 2048], dtype bfloat16;-10.821243286132812;22 had digest sum -9.161483764648438;0-3 and 6 remained identical.Repair attempts:
piecewise:0/41 replay:
data/qwen36-ablation-fastlane-disable-piecewise0-canary-summary-20260614h13.json0 with repeated braces/exclamation output;0 with only blue;5:
data/qwen36-ablation-fastlane-clone-piecewise0-output5-canary-summary-20260614h14.json64/64 pass;192/192 pass;5, then run metrics and canaries:
data/qwen36-ablation-fastlane-clone-piecewise0-output5-metrics-summary-20260614h15.json92.21 tok/s;10.85 ms/token;48 with answer 12;91 with blue, green, red, yellow;5,6, then run metrics and canaries:
data/qwen36-ablation-fastlane-clone-piecewise0-output5-6-metrics-summary-20260614h16.json92.64 tok/s;10.80 ms/token;48 with answer 12;91 with blue, green, red, yellow;Interpretation:
92-93 tok/s, so the harness drift
issue is fixed, but the lane is still not quality-safe.5 is the first confirmed corrupt graph handoff for a clean
color-only failure.5 repairs the standalone canary sequence, which makes
graph-output alias/lifetime a real fault class, not just a theory.5;Rejected:
piecewise:0/41 replay.5 cloning without the metrics-warmed gate.5,6 cloning after the metrics-warmed gate.Current status:
data/qwen36-ablation-fastlane-config-restored-control-metrics-summary-20260614h4.json
at 93.45 tok/s.data/qwen36-ablation-fastlane-clone-piecewise0-output5-6-metrics-summary-20260614h16.json
at 92.64 tok/s, but rejected for correctness.Next:
h15/h16, targeting the failing JSON repeat 48 and color repeat 91.
The clean-only h12 trace is no longer sufficient.5
shares storage or data pointers with graph1 tensor arguments or downstream
mutable scratch buffers.Why:
Runs:
data/qwen36-ablation-fastlane-clone-piecewise0-output5-6-warmed-trace-summary-20260614h17.json
5,6 cloning plus trace, metrics warmup first;UR_RESULT_ERROR_DEVICE_LOST inside the XPU GDN prefill
recurrent fallback at the tensor .all() branch.data/qwen36-ablation-fastlane-clone-piecewise0-output5-6-warmed-trace-gdnmask-summary-20260614h18.json
.all()/boolean scatter final-state
branch with a device-side torch.where path;92.99 tok/s;64/64 pass;192/192 pass;data/qwen36-ablation-fastlane-gdnmask-no-output-clone-summary-20260614h19.json
91.45 tok/s;64/64 pass;192/192 pass;data/qwen36-ablation-fastlane-gdnmask-no-output-clone-promotion-summary-20260614h20.json
91.94 tok/s;48 with {"answer": "12.0", "unit": "widgets"};137 with blue, green, red, yellow;data/qwen36-ablation-fastlane-gdnmask-clone-output5-6-promotion-summary-20260614h21.json
5,6 cloning;92.95 tok/s;48;137;data/qwen36-ablation-fastlane-gdnmask-clone-output5-6-deep-trace-summary-20260614h22.json
5,6 clone and trace around the known
failing requests;93.03 tok/s;48;137;data/qwen36-cudagraph-state-h22-r0.jsonl;data/qwen36-cudagraph-state-h22-json-analysis.json and
data/qwen36-cudagraph-state-h22-color-analysis.json;direct_finish outputs already differ at
compute step 0 between adjacent good request 47 and bad request 48,
while traced tensor arguments did not differ. This moves the root cause
inside graph0 direct prefill or hidden/static state, not decode replay.data/qwen36-ablation-fastlane-gdnmask-zero-fresh-promotion-summary-20260614h23.json
VLLM_XPU_ZERO_FRESH_GDN_STATE=1;93.93 tok/s;49 completed repeats;138 completed repeats;data/qwen36-ablation-fastlane-gdnmask-zero-all-prefill-promotion-summary-20260614h24.json
VLLM_XPU_ZERO_ALL_PREFILL_GDN_STATE=1;93.95 tok/s;49 completed repeats;138 completed repeats;data/qwen36-ablation-fastlane-gdnmask-zero-all-prefill-fallbackpatch-promotion-summary-20260614h25.json
92.69 tok/s;49 completed repeats;92 completed repeats;Current accepted code state:
VLLM_XPU_ZERO_FRESH_GDN_STATE; this prevents future config drift.5 or 5,6 cloning;Decision:
Next:
46-49 and color 135-138.projected_states_qkvz, projected_states_ba, mixed_qkv_non_spec,
conv_state at selected state indices, initial_state,
core_attn_out_non_spec, and last_recurrent_state.Why:
Instrumentation:
vllm/model_executor/layers/mamba/gdn_linear_attn.py.VLLM_XPU_GDN_TRACE_FILE,
VLLM_XPU_GDN_TRACE_RANK,
VLLM_XPU_GDN_TRACE_PREFILL_ONLY,
VLLM_XPU_GDN_TRACE_LAYER_REGEX,
VLLM_XPU_GDN_TRACE_REQ_REGEX,
VLLM_XPU_GDN_TRACE_MAX_LINES,
VLLM_XPU_GDN_TRACE_TENSOR_LIMIT,
VLLM_XPU_GDN_TRACE_STATE_LIMIT.fallback_pre_convfallback_post_convfallback_pre_recurrentfallback_post_recurrenth26:
data/qwen36-ablation-fastlane-gdnmask-fallbacktrace-summary-20260614h26.jsondata/qwen36-gdn-fallback-trace-h26-r{rank}.jsonl
{rank}; rank was filtered by env,
so this literal filename still contains rank-0 data.128, color 160;0, layers 0-2, JSON 46-49, color 135-138.92.69 tok/s;49 completed repeats;92 completed repeats, earlier than the untraced color
window.46, 47, and bad 48;0, 1, 2;h26 finding:
46 and 47 were identical for the traced
fallback tensors aside from expected state-slot indices.48 already differed at
language_model.model.layers.0.linear_attn / fallback_pre_conv.fallback_pre_conv:
mixed_qkv_non_spec.sum: -2096.06005859375;mixed_qkv_non_spec.sum: -1850.251220703125;[-1.53125, 0.9921875, 0.609375, ...];[7.95e-11, -1.38e-10, ...].h27:
data/qwen36-ablation-fastlane-gdnmask-forwardtrace-json-summary-20260614h27.jsonhidden_states, projected_states_qkvz, and
projected_states_ba in forward_xpu.49 completed repeats;data/qwen36-gdn-forward-trace-h27-r0.jsonl;forward_xpu stages.forward_xpu trace in a way that wrote rows;h28:
pre_fallback_core trace inside
vllm/_xpu_ops.py::_gdn_attention_core_xpu_impl, before unpacking
projected_states_qkvz/ba into fallback tensors.data/qwen36-ablation-fastlane-gdnmask-coretrace-json-summary-20260614h28.jsonUR_RESULT_ERROR_DEVICE_LOST in block table CPU-to-XPU copy before the
targeted JSON trace window;qwen36-gdn-core-trace-h28-r0.jsonl was written.Current conclusion:
projected_states_qkvz, projected_states_ba, and possibly incoming
hidden_states.Source:
/home/steve/suggestions.mdAccepted direction:
93-98 tok/s,
but it is not production-usable while replay corrupts.85-86 tok/s.Next work to try, in order:
VLLM_XPU_CUDAGRAPH_SANITIZE_METADATA_TAIL=1.cudagraph_copy_inputs=true inductor bounds failure
with logs and generated-kernel context.VLLM_XPU_CUDAGRAPH_COPY_INPUTS_SAFE=1.85-86 tok/s oracle before
any speed claim.Rejected next steps:
AGENTS.md.Disk cleanup:
/mnt/fast-ai/vllm-cache-exp.459 GiB.0 GiB available, 100%) to
459 GiB available (48% used)./mnt/fast-ai/llm-models: 275 GiB/mnt/fast-ai/llm-cache: 70 GiBImmediate implementation target:
suggestions.md.Why this update exists:
/home/steve/suggestions.md changed after the prior triage.Current baseline framing from the updated suggestions file:
baseline-conservative: graph none, GDN fallback decode+prefill, no async,
about 12.8 tok/s, JSON 96/96, color 96/96, quality skipped. Use as a
correctness oracle only.fast-conservative-quality: PIECEWISE + forced comm + GDN fallback decode,
no async, about 77.8 tok/s, JSON 96/96, color 96/96, pass_all.
This is the fully quality-validated safe row from this table.native-decode-safe-prefill-graph: PIECEWISE + forced comm + native GDN
prefill, no async, about 93.3 tok/s, JSON 64/64, color 64/64, quality
skipped. Treat as the fastest canary-validated candidate, not fully promoted
until the quality suite and longer warmed canaries pass.Additional ideas and corrections to carry forward:
90 tok/s.native-decode-safe-prefill-graph lane
through full quality, longer JSON/color canaries, and repeated p512/o512.csrc/xpu/moe_layerlet.cpp, grouped-GEMM offset interfaces, and
xpu_moe.py workspace reuse.72 tok/s and immediate
color canary failure, likely offset or scale alignment rather than a
fundamental kernel problem.VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=1, then fix offset computation or
scale broadcasting before testing
VLLM_XPU_W8A8_USE_OFFSETS=1,
VLLM_XPU_W8A8_OFFSETS_PREFIX_OP=1, and
VLLM_XPU_MOE_W8A8_MIDDLE_LAYERLET=1 together.VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 after quality is clean.VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 is still a workaround.8 tok/s,
proving replay input preparation and metadata copies are material.cuda_graph.py, metadata tensor reuse, and per-replay event/stream
creation.VLLM_XPU_CUSTOM_ALLREDUCE_CLONE_INPUT=0 and
VLLM_XPU_CUSTOM_ALLREDUCE_GRAPH_CLONE_INPUT=0 separately, not together
first.Updated near-term priority:
93.3 tok/s
native-decode-safe-prefill-graph lane.