Date: 2026-06-14
scripts/run-qwen36-decisive-timing.sh.
scripts/qwen36-timing-family-decision.py.
scripts/run-qwen36-graph-replay-matrix.sh.
cuda_graph.py compare/trace hooks.VLLM_XPU_DECODE_TIMING_ALLOW=1.p512/o256, one measured repeat, and
no canaries. Set RUN_CANARIES=1 for a heavier timing-plus-correctness pass.cd /home/steve/llm-optimizations
bash scripts/run-qwen36-decisive-timing.sh accepted-c1-decisive-20260614
Use the generated timing decision to choose the next engineering branch: persistent W8A8 MoE layerlet, GDN/dense fusion, collectives/topology, or runtime/static c1 work.
If graph replay remains under investigation, run:
cd /home/steve/llm-optimizations
bash scripts/run-qwen36-graph-replay-matrix.sh
Command:
cd /home/steve/llm-optimizations
PROMPT_TOKENS=512 OUTPUT_TOKENS=128 METRICS_REPEATS=1 \
VLLM_XPU_DECODE_TIMING_SKIP_FIRST=16 \
VLLM_XPU_DECODE_TIMING_STEP_SKIP_FIRST=16 \
VLLM_XPU_DECODE_TIMING_STEP_EVERY=16 \
RUN_CANARIES=0 \
bash scripts/run-qwen36-decisive-timing.sh accepted-c1-decisive-20260614-impl
Artifacts:
data/qwen36-accepted-c1-decisive-20260614-impl-p512o128-20260614162746.jsondata/qwen36-accepted-c1-decisive-20260614-impl-timing-summary-20260614162746.jsondata/qwen36-accepted-c1-decisive-20260614-impl-timing-decision-20260614162746.jsondata/qwen36-accepted-c1-decisive-20260614-impl-run-summary-20260614162746.jsonResult:
13.38 tok/s.74.73 ms/generated token.284.98 ms; vLLM TTFT: 209.78 ms.19.07 GiB.57.80x.Decision:
moe.quant_method_total at 38.34 ms/step.all_reduce:(1, 2048):torch.bfloat16:bytes=4096 at 6.51 ms/step.Note: this is a diagnostic timing run, not a promoted speed row. Canaries were not requested for this pass.
Added a fail-closed guard in
/home/steve/src/vllm-xpu-kernels/vllm_xpu_kernels/fused_moe_interface.py
for the rejected oneDNN sidecar-inside-XPU-graph path.
VLLM_XPU_MOE_ONEDNN_SIDECAR_ALLOW_GRAPH_CAPTURE=1 for an isolated
diagnostic run.UR_RESULT_ERROR_DEVICE_LOST. This path is not a
candidate for production or unattended benchmarking.Added scripts/qwen36-ablation-report.py.
quality_validated from promotion_ready.--min-tok-s; promotion_ready=true requires quality validation
plus the requested speed floor.Generated current min-98 report:
data/qwen36-ablation-report-min98-20260614164151.jsondata/qwen36-ablation-report-min98-20260614164151.mdpromotion_ready: 0.quality_validated: 1.13.98 tok/s, so it is not useful for the speed goal.Added scripts/run-qwen36-oracle-parity-gate.sh.
check-qwen36-oracle-fixture.py in exact or known-drift mode.Known-drift smoke:
cd /home/steve/llm-optimizations
MODE=known-drift \
EXPECTED_MISMATCHES=2 \
EXPECTED_ROLES=verifier_bonus_after_full_accept,replacement_after_reject \
ACCEPTED_TRACE_JSON=data/qwen36-quark-int8-tp4-oracle-k1-short-accepted-graph-20260611.json \
CANDIDATE_TRACE_JSON=data/qwen36-quark-int8-tp4-oracle1-workertrace-completions-20260611a.json \
SPEC_SUMMARY_JSON=data/qwen36-quark-int8-tp4-oracle1-workertrace-spec-summary-20260611a.json \
REPLAY_JSON=data/qwen36-quark-int8-tp4-oracle1-workertrace-replay-20260611a.json \
./scripts/run-qwen36-oracle-parity-gate.sh workertrace-known-drift-smoke-v2
Result:
data/qwen36-oracle-workertrace-known-drift-smoke-v2-gate-summary-20260614164300.jsonknown-drift mode.verifier_bonus_after_full_accept,
replacement_after_reject.Current rejected paths to avoid re-testing without new evidence:
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1: slightly slower than accepted and
costs KV headroom.Current primary engineering branches:
Implemented an opt-in graph-native W8A8 MoE middle layerlet in
/home/steve/src/vllm-xpu-kernels.
Files changed:
csrc/xpu/moe_layerlet.cppcsrc/xpu/ops.hcsrc/xpu/torch_bindings.cppCMakeLists.txtvllm_xpu_kernels/fused_moe_interface.py/home/steve/src/vllm/vllm/model_executor/layers/fused_moe/experts/xpu_moe.pyscripts/check-qwen36-w8a8-middle-layerlet.pyscripts/launch-qwen36-quark-int8-accepted.shscripts/run-qwen36-ablation-candidate.shscripts/run-qwen36-decisive-timing.shBehavior:
_xpu_C::qwen36_moe_w8a8_middle_layerlet.VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=1 is set.VLLM_XPU_MOE_W8A8_MIDDLE_LAYERLET=1,
VLLM_XPU_W8A8_USE_OFFSETS=1,
activation is SiLU, INT8 scratch is available, and the oneDNN sidecar is not
selected.Build/deploy status:
python3 -m py_compile vllm_xpu_kernels/fused_moe_interface.py: pass._xpu_C rebuild: pass./home/steve/src/vllm-xpu-kernels/vllm_xpu_kernels/_xpu_C.abi3.so.backup-before-w8a8-middle-layerlet-20260614-170538Synthetic parity harness:
cd /home/steve/llm-optimizations
python3 scripts/check-qwen36-w8a8-middle-layerlet.py --graph-replay --require-graph
Latest artifact:
data/qwen36-w8a8-middle-layerlet-check-20260614T171738Z.jsondata/qwen36-w8a8-middle-layerlet-check-20260614T171738Z.mdResult:
tiny_sparse, single_hot_expert, decode_like_sparse,
dense_small.0.0.0.0.Endpoint smoke, layerlet with graph disabled:
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=1 \
VLLM_XPU_W8A8_USE_OFFSETS=1 \
VLLM_XPU_MOE_W8A8_MIDDLE_LAYERLET=1 \
PROMPT_TOKENS=64 OUTPUT_TOKENS=64 WARMUP_OUTPUT_TOKENS=16 \
METRICS_REPEATS=1 RUN_CANARIES=0 \
bash scripts/run-qwen36-decisive-timing.sh middle-layerlet-eager-smoke
Artifacts:
data/qwen36-middle-layerlet-eager-smoke-20260614171249.logdata/qwen36-middle-layerlet-eager-smoke-p64o64-20260614171249.jsondata/qwen36-middle-layerlet-eager-smoke-timing-decision-20260614171249.jsonResult:
13.2529 tok/s.75.4752 ms/token.192.48 ms.114.45 ms.xpu_moe.w8a8_offsets.xpu_moe.w8a8_offsets: max 0.099079 ms, mean 0.095973 ms.xpu_moe.w8a8_middle_layerlet: max 0.060602 ms, mean
0.059367 ms.xpu_moe.gemm1_quant: max 0.027884 ms, mean 0.027227 ms.Interpretation:
Added resident offsets scratch on the mixed INT8 workspace path.
Behavior:
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1, the XPU MoE workspace manager
also allocates w8a8_offsets as an int64 tensor of shape
num_local_experts + 1._make_w8a8_grouped_gemm_offsets now reuses this buffer when available and
performs torch.cumsum(..., dtype=torch.int64, out=offsets[1:]).Validation:
data/qwen36-w8a8-middle-layerlet-check-20260614T171738Z.json.Endpoint smoke, layerlet plus resident offsets:
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=1 \
VLLM_XPU_W8A8_USE_OFFSETS=1 \
VLLM_XPU_MOE_W8A8_MIDDLE_LAYERLET=1 \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
PROMPT_TOKENS=64 OUTPUT_TOKENS=64 WARMUP_OUTPUT_TOKENS=16 \
METRICS_REPEATS=1 RUN_CANARIES=0 \
bash scripts/run-qwen36-decisive-timing.sh middle-layerlet-resident-offset-smoke
Artifacts:
data/qwen36-middle-layerlet-resident-offset-smoke-20260614171754.logdata/qwen36-middle-layerlet-resident-offset-smoke-p64o64-20260614171754.jsondata/qwen36-middle-layerlet-resident-offset-smoke-timing-decision-20260614171754.jsonResult:
13.7112 tok/s.73.0055 ms/token.190.69 ms.111.75 ms.xpu_moe.w8a8_offsets.xpu_moe.w8a8_offsets: max 0.073370 ms, mean 0.0723868 ms.xpu_moe.w8a8_middle_layerlet: max 0.059415 ms, mean
0.0576678 ms.xpu_moe.gemm1_quant: max 0.019098 ms, mean 0.0188165 ms.Delta versus layerlet without resident offsets:
+0.4583 tok/s, about +3.46%.75.4752 -> 73.0055 ms/token.0.099079 -> 0.073370 ms.Status:
Canary-only quality smoke:
PORT=18083 BASE_URL=http://127.0.0.1:18083 \
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=1 \
VLLM_XPU_W8A8_USE_OFFSETS=1 \
VLLM_XPU_MOE_W8A8_MIDDLE_LAYERLET=1 \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
ABLATION_SKIP_METRICS=1 JSON_REPEATS=8 COLOR_REPEATS=8 \
bash scripts/run-qwen36-ablation-candidate.sh middle-layerlet-resident-offset-canary8
Artifacts:
data/qwen36-ablation-middle-layerlet-resident-offset-canary8-summary-20260614172409.jsondata/qwen36-ablation-middle-layerlet-resident-offset-canary8-json-repeat8-20260614172409.jsondata/qwen36-ablation-middle-layerlet-resident-offset-canary8-color-repeat8-20260614172409.jsondata/qwen36-ablation-middle-layerlet-resident-offset-canary8-20260614172409.logResult:
8/8, 0 mismatches.8/8, 0 mismatches.Harness fix:
scripts/run-qwen36-ablation-candidate.sh so future summaries record
per-step status as passed, failed, skipped, or missing_artifact.artifact_exists to the summary JSON.VLLM_XPU_INT8_MOE_MIXED_WORKSPACE to the recorded environment.Implemented the next target from the resident-offset checkpoint: a tiny graph-native prefix-offset XPU op.
Files changed:
/home/steve/src/vllm-xpu-kernels/csrc/xpu/moe_layerlet.cpp/home/steve/src/vllm-xpu-kernels/csrc/xpu/ops.h/home/steve/src/vllm-xpu-kernels/csrc/xpu/torch_bindings.cpp/home/steve/src/vllm-xpu-kernels/vllm_xpu_kernels/fused_moe_interface.pyscripts/check-qwen36-w8a8-middle-layerlet.pyscripts/launch-qwen36-quark-int8-accepted.shscripts/run-qwen36-ablation-candidate.shscripts/run-qwen36-decisive-timing.shBehavior:
_xpu_C::qwen36_rows_per_expert_offsets_int64_out.offsets[0] = 0 and the inclusive prefix of int32
rows_per_expert into the resident int64 offsets buffer.VLLM_XPU_W8A8_OFFSETS_PREFIX_OP=1.VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=1.xpu_moe.w8a8_offsets_prefix_op and
xpu_moe.w8a8_offsets_torch_cumsum.Build/deploy status:
_xpu_C rebuild: pass./home/steve/src/vllm-xpu-kernels/vllm_xpu_kernels/_xpu_C.abi3.so.backup-before-prefix-offset-20260614-173259torch.cumsum: pass.Updated synthetic harness:
cd /home/steve/llm-optimizations
ONEAPI_DEVICE_SELECTOR=level_zero:0 \
/home/steve/.venvs/vllm-xpu/bin/python \
scripts/check-qwen36-w8a8-middle-layerlet.py --graph-replay --require-graph
Artifacts:
data/qwen36-w8a8-middle-layerlet-check-20260614T173603Z.jsondata/qwen36-w8a8-middle-layerlet-check-20260614T173603Z.mdResult:
rows_per_expert after capture.Endpoint smoke, layerlet plus resident prefix offsets:
PORT=18084 BASE_URL=http://127.0.0.1:18084 \
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=1 \
VLLM_XPU_W8A8_USE_OFFSETS=1 \
VLLM_XPU_W8A8_OFFSETS_PREFIX_OP=1 \
VLLM_XPU_MOE_W8A8_MIDDLE_LAYERLET=1 \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
VLLM_XPU_DECODE_TIMING_LABEL_REGEX='xpu_moe\.w8a8_offsets|xpu_moe\.w8a8_offsets_prefix_op|xpu_moe\.w8a8_offsets_torch_cumsum|xpu_moe\.w8a8_middle_layerlet|xpu_moe\.gemm1_quant' \
PROMPT_TOKENS=64 OUTPUT_TOKENS=64 WARMUP_OUTPUT_TOKENS=16 \
METRICS_REPEATS=1 RUN_CANARIES=0 \
bash scripts/run-qwen36-decisive-timing.sh middle-layerlet-prefix-offset-smoke
Artifacts:
data/qwen36-middle-layerlet-prefix-offset-smoke-20260614173632.logdata/qwen36-middle-layerlet-prefix-offset-smoke-p64o64-20260614173632.jsondata/qwen36-middle-layerlet-prefix-offset-smoke-timing-decision-20260614173632.jsondata/qwen36-middle-layerlet-prefix-offset-smoke-run-summary-20260614173632.jsonResult:
14.2056 tok/s.70.4096 ms/token.184.92 ms.112.45 ms.xpu_moe.w8a8_middle_layerlet, not offsets.xpu_moe.w8a8_middle_layerlet: max 0.049362 ms, mean
0.0485178 ms.xpu_moe.w8a8_offsets: max 0.022380 ms, mean 0.0221915 ms.xpu_moe.w8a8_offsets_prefix_op: max 0.013010 ms, mean
0.0128663 ms.xpu_moe.gemm1_quant: max 0.014299 ms, mean 0.0141435 ms.Delta versus resident-offset cumsum candidate:
13.7112 -> 14.2056 tok/s, about +3.61%.73.0055 -> 70.4096 ms/token.0.073370 -> 0.022380 ms.Delta versus first layerlet smoke without resident offsets:
13.2529 -> 14.2056 tok/s, about +7.19%.75.4752 -> 70.4096 ms/token.0.099079 -> 0.022380 ms.Canary-only quality smoke:
PORT=18085 BASE_URL=http://127.0.0.1:18085 \
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=1 \
VLLM_XPU_W8A8_USE_OFFSETS=1 \
VLLM_XPU_W8A8_OFFSETS_PREFIX_OP=1 \
VLLM_XPU_MOE_W8A8_MIDDLE_LAYERLET=1 \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
ABLATION_SKIP_METRICS=1 JSON_REPEATS=8 COLOR_REPEATS=8 \
bash scripts/run-qwen36-ablation-candidate.sh middle-layerlet-prefix-offset-canary8
Artifacts:
data/qwen36-ablation-middle-layerlet-prefix-offset-canary8-summary-20260614173934.jsondata/qwen36-ablation-middle-layerlet-prefix-offset-canary8-json-repeat8-20260614173934.jsondata/qwen36-ablation-middle-layerlet-prefix-offset-canary8-color-repeat8-20260614173934.jsondata/qwen36-ablation-middle-layerlet-prefix-offset-canary8-20260614173934.logResult:
8/8, 0 mismatches.8/8, 0 mismatches.Longer candidate gate:
PORT=18086 BASE_URL=http://127.0.0.1:18086 \
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=1 \
VLLM_XPU_W8A8_USE_OFFSETS=1 \
VLLM_XPU_W8A8_OFFSETS_PREFIX_OP=1 \
VLLM_XPU_MOE_W8A8_MIDDLE_LAYERLET=1 \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
METRICS_REPEATS=2 JSON_REPEATS=32 COLOR_REPEATS=32 \
ABLATION_RUN_QUALITY=1 QUALITY_REPEAT_RUNS=4 QUALITY_LONG_CONTEXT_TOKENS=2048 \
bash scripts/run-qwen36-ablation-candidate.sh middle-layerlet-prefix-offset-gate32-quality
Artifacts:
data/qwen36-ablation-middle-layerlet-prefix-offset-gate32-quality-summary-20260614174351.jsondata/qwen36-ablation-middle-layerlet-prefix-offset-gate32-quality-p512o512-20260614174351.jsondata/qwen36-ablation-middle-layerlet-prefix-offset-gate32-quality-json-repeat32-20260614174351.jsondata/qwen36-ablation-middle-layerlet-prefix-offset-gate32-quality-color-repeat32-20260614174351.jsondata/qwen36-ablation-middle-layerlet-prefix-offset-gate32-quality-quality-suite-20260614174351.jsonResult:
14.1911 tok/s mean over two repeats.70.4677 ms/token mean over two repeats.32/32, 0 mismatches.32/32, 0 mismatches.exact_ok, copy_phrase, arithmetic, json_schema: pass;
repeat case: pass;
long-context case at 2048 tokens: pass.Adjacent accepted-control A/B:
PORT=18087 BASE_URL=http://127.0.0.1:18087 \
METRICS_REPEATS=2 ABLATION_SKIP_CANARIES=1 \
bash scripts/run-qwen36-ablation-candidate.sh accepted-control-adjacent-p512o512
Artifacts:
data/qwen36-ablation-accepted-control-adjacent-p512o512-summary-20260614174908.jsondata/qwen36-ablation-accepted-control-adjacent-p512o512-p512o512-20260614174908.jsonResult:
13.9929 tok/s mean over two repeats.71.4661 ms/token mean over two repeats.14.1911 / 13.9929 = 1.0142, about +1.42%.71.4661 -> 70.4677 ms/token, about +1.40%.Interpretation:
Saved patch snapshots:
patches/vllm-xpu-kernels-qwen36-w8a8-layerlet-prefix-offset-20260614.patchpatches/vllm-qwen36-w8a8-resident-offset-scratch-20260614.patchpatches/llm-optimizations-qwen36-w8a8-layerlet-prefix-offset-results-20260614.patchNext best implementation target:
xpu_moe.w8a8_middle_layerlet; it is now the top visible MoE label.gemm1_quant, or move toward
a persistent per-layer descriptor/scratch object so each decode token submits
fewer independent commands.Context:
_xpu_C.silu_and_mul_quant_int8_xpu_out, which is the
same fused shortcut used inside the candidate layerlet. That allowed the
checker to pass even when the layerlet did not match the accepted vLLM
endpoint path.fused_moe_activation(..., "silu") BF16 output ->
_xpu_C.per_token_quant_int8_xpu_out -> offsets W8A8 GEMM2.Patches:
scripts/check-qwen36-w8a8-middle-layerlet.py to use the accepted
two-step activation/quant reference and record
reference_activation_quant="vllm_silu_then_xpu_per_token_quant"./home/steve/src/vllm-xpu-kernels/csrc/xpu/quantization/int8_quant.cpp
to cast SiLU to BF16 before multiply and cast the product to BF16 before
INT8 quantization._xpu_C with GDN kernels enabled:
BUILD_DIR=/home/steve/src/vllm-xpu-kernels/build/xpu-c-only-exact-siluq-20260615a2,
INSTALL_PREFIX=/tmp/vllm-xpu-xpu-c-only-exact-siluq-20260615a2./home/steve/src/vllm-xpu-kernels/vllm_xpu_kernels/_xpu_C.abi3.so.backup-before-exact-siluq-layerlet-20260615a2.Corrected synthetic checker before the C++ repair:
PYTHONPATH=/home/steve/src/vllm:/home/steve/src/vllm-xpu-kernels \
LD_LIBRARY_PATH=/home/steve/src/vllm-xpu-kernels/vllm_xpu_kernels:/home/steve/.venvs/vllm-xpu/lib:/home/steve/.venvs/vllm-xpu/lib/python3.12/site-packages/torch/lib:${LD_LIBRARY_PATH:-} \
/home/steve/.venvs/vllm-xpu/bin/python \
scripts/check-qwen36-w8a8-middle-layerlet.py \
--graph-replay --require-graph \
--json-out data/qwen36-w8a8-middle-layerlet-check-accepted-ref-20260615a2.json \
--md-out data/qwen36-w8a8-middle-layerlet-check-accepted-ref-20260615a2.md
Result:
gemm2_a and scales diverged in every case, confirming the activation/quant
step was the real layerlet math mismatch.Corrected synthetic checker after the C++ repair:
PYTHONPATH=/home/steve/src/vllm:/home/steve/src/vllm-xpu-kernels \
LD_LIBRARY_PATH=/home/steve/src/vllm-xpu-kernels/vllm_xpu_kernels:/home/steve/.venvs/vllm-xpu/lib:/home/steve/.venvs/vllm-xpu/lib/python3.12/site-packages/torch/lib:${LD_LIBRARY_PATH:-} \
/home/steve/.venvs/vllm-xpu/bin/python \
scripts/check-qwen36-w8a8-middle-layerlet.py \
--graph-replay --require-graph \
--json-out data/qwen36-w8a8-middle-layerlet-check-exact-siluq-20260615a3.json \
--md-out data/qwen36-w8a8-middle-layerlet-check-exact-siluq-20260615a3.md
Result:
0.0.gemm2_a mismatches: 0.0.0.0.0.Offset-only endpoint isolation:
PORT=18092 BASE_URL=http://127.0.0.1:18092 STAMP=20260615a1 \
XPU_GRAPH=1 VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' \
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill \
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1 \
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1 \
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1 \
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=1 \
VLLM_XPU_W8A8_USE_OFFSETS=1 \
VLLM_XPU_W8A8_OFFSETS_PREFIX_OP=1 \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
METRICS_REPEATS=2 JSON_REPEATS=32 COLOR_REPEATS=32 ABLATION_RUN_QUALITY=0 \
bash scripts/run-qwen36-ablation-candidate.sh \
fastgraph-offsets-prefix-no-layerlet-smoke
Artifacts:
data/qwen36-ablation-fastgraph-offsets-prefix-no-layerlet-smoke-summary-20260615a1.jsondata/qwen36-ablation-fastgraph-offsets-prefix-no-layerlet-smoke-20260615a1.logResult:
RuntimeError: level_zero backend failed with error: 20 (UR_RESULT_ERROR_DEVICE_LOST).Exact layerlet endpoint smoke:
PORT=18093 BASE_URL=http://127.0.0.1:18093 STAMP=20260615a4 \
XPU_GRAPH=1 VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' \
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill \
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1 \
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1 \
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1 \
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=1 \
VLLM_XPU_W8A8_USE_OFFSETS=1 \
VLLM_XPU_W8A8_OFFSETS_PREFIX_OP=1 \
VLLM_XPU_MOE_W8A8_MIDDLE_LAYERLET=1 \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
METRICS_REPEATS=2 JSON_REPEATS=32 COLOR_REPEATS=32 ABLATION_RUN_QUALITY=0 \
bash scripts/run-qwen36-ablation-candidate.sh fastgraph-exact-layerlet-smoke
Artifacts:
data/qwen36-ablation-fastgraph-exact-layerlet-smoke-summary-20260615a4.jsondata/qwen36-ablation-fastgraph-exact-layerlet-smoke-p512o512-20260615a4.jsondata/qwen36-ablation-fastgraph-exact-layerlet-smoke-json-repeat32-20260615a4.jsondata/qwen36-ablation-fastgraph-exact-layerlet-smoke-color-repeat32-20260615a4.jsonResult:
88.2832 tok/s.11.3280 ms/token.32/32.32/32.Decision:
93.3 tok/s.100 tok/s unless it is redesigned to remove
more command/launch overhead. The current fused boundary is not enough.Next best >100 tok/s route:
~93.3 tok/s forced-graph lane, not the
rejected layerlet, to rank MoE, collectives, GDN, activation/quant, logits,
and scheduler overhead.k=1 spec parity as the other no-quality-loss path to a
large single-request speedup. No speed claim until token parity is exact.Post-rebuild accepted-control check:
PORT=18094 BASE_URL=http://127.0.0.1:18094 STAMP=20260615a5 \
XPU_GRAPH=1 VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' \
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill \
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1 \
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1 \
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1 \
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=0 \
METRICS_REPEATS=2 JSON_REPEATS=16 COLOR_REPEATS=16 ABLATION_RUN_QUALITY=0 \
bash scripts/run-qwen36-ablation-candidate.sh \
fastgraph-control-post-exactsiluq-smoke
Artifacts:
data/qwen36-ablation-fastgraph-control-post-exactsiluq-smoke-summary-20260615a5.jsondata/qwen36-ablation-fastgraph-control-post-exactsiluq-smoke-p512o512-20260615a5.jsondata/qwen36-ablation-fastgraph-control-post-exactsiluq-smoke-json-repeat16-20260615a5.jsondata/qwen36-ablation-fastgraph-control-post-exactsiluq-smoke-color-repeat16-20260615a5.jsonResult:
87.2888 tok/s.93.3 tok/s.Decision:
/home/steve/src/vllm-xpu-kernels/vllm_xpu_kernels/_xpu_C.abi3.so.backup-before-exact-siluq-layerlet-20260615a2.Goal:
Implementation:
VLLM_XPU_REPLAY_MICROSCOPE_FILE trace in
/home/steve/src/vllm/vllm/v1/worker/gpu_model_runner.py.sample, target, or bonus, records
input ids, positions, draft ids, request ids, and top-k logits, and emits a
compact per-row final hidden-state digest before lm_head.REPLAY_MICROSCOPE_FILE,
REPLAY_MICROSCOPE_MAX_LINES, REPLAY_MICROSCOPE_RANK,
REPLAY_MICROSCOPE_TENSOR_LIMIT, and REPLAY_MICROSCOPE_TOPK.Control:
data/qwen36-nospec-hiddenrow-eager-repetitive-20260615g42-completion.json.data/qwen36-nospec-hiddenrow-eager-repetitive-20260615g42-replay-microscope-r0.jsonl.[4581,2468,1345,28043,7072,3817,17856,13].Oracle run:
data/qwen36-oracle1-unsuppressed-hiddenrow-eager-repetitive-20260615g43-completion.json.data/qwen36-oracle1-unsuppressed-hiddenrow-eager-repetitive-20260615g43-replay-microscope-r0.jsonl.17856 (timing),
oracle 22188 (verification).Key evidence:
[7072,3817] at
positions [516,517].3817 at position 517.17856 above 22188:
top ids [17856,22188,271,248046,9191,198,13,1358,19039,81873,8240,248044],
top values [21.875,18.125,17.125,15.25,14.375,14.3125,13.5625,13.5,13.25,12.5,12.4375,12.3125].22188 above 17856:
top ids [22188,17856,271,248046,2652,159676,198,9845,181505,10206,174657,695],
top values [22.625,20.5,17.375,16.75,15.75,15.25,15.1875,14.125,14.125,13.375,13.3125,13.25].lm_head:
517: mean -0.1280970275402069, sum
-262.34271240234375, l2 109.96859741210938, head
[2.1875,-1.8125,-0.296875,1.1875,2.578125,-2.875,-0.515625,-4.21875].517: mean -0.1013849526643753, sum
-207.63638305664062, l2 109.91653442382812, head
[1.65625,-2.890625,0.0130615234375,-0.5625,3.703125,-3.390625,-1.625,-2.4375].Decision:
lm_head/top-k artifact.mamba_utils.preprocess_mamba/postprocess_mamba,
gdn_attn.py metadata construction, and gdn_linear_attn.py spec-state
usage.VLLM_XPU_NGRAM_NO_MAMBA_SPEC_BLOCKS=1 with
the same hidden-row trace. If the mismatch changes or disappears, the fault
is in speculative Mamba/GDN block allocation/state commit. If not, add
layer-level hidden digests to find the first layer where packed and sequential
decode diverge.Restored-binary control smoke:
PORT=18095 BASE_URL=http://127.0.0.1:18095 STAMP=20260615a6 \
XPU_GRAPH=1 VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' \
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill \
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1 \
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1 \
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1 \
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=0 \
METRICS_REPEATS=2 JSON_REPEATS=8 COLOR_REPEATS=8 ABLATION_RUN_QUALITY=0 \
bash scripts/run-qwen36-ablation-candidate.sh \
fastgraph-control-restored-binary-smoke
Artifacts:
data/qwen36-ablation-fastgraph-control-restored-binary-smoke-summary-20260615a6.jsondata/qwen36-ablation-fastgraph-control-restored-binary-smoke-p512o512-20260615a6.jsondata/qwen36-ablation-fastgraph-control-restored-binary-smoke-json-repeat8-20260615a6.jsondata/qwen36-ablation-fastgraph-control-restored-binary-smoke-color-repeat8-20260615a6.jsonResult:
89.9613 tok/s.11.1167 ms/token.190.25 ms.8/8.8/8.Interpretation:
93.3137 tok/s control from
qwen36-ablation-native-decode-safe-prefill-graph-summary-20260614f1.json.Fresh decisive timing on the accepted cache label:
STAMP=20260615a7 PORT=18096 BASE_URL=http://127.0.0.1:18096 \
CACHE_LABEL=qwen36-ablation-native-decode-safe-prefill-graph \
XPU_GRAPH=1 VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' \
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill \
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1 \
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1 \
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1 \
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=0 \
PROMPT_TOKENS=512 OUTPUT_TOKENS=256 METRICS_REPEATS=1 \
WARMUP_OUTPUT_TOKENS=64 RUN_CANARIES=0 \
VLLM_XPU_DECODE_TIMING_SKIP_FIRST=32 \
VLLM_XPU_DECODE_TIMING_STEP_SKIP_FIRST=32 \
VLLM_XPU_DECODE_TIMING_STEP_EVERY=16 \
bash scripts/run-qwen36-decisive-timing.sh \
accepted-restored-c1-decisive-timing
Artifacts:
data/qwen36-accepted-restored-c1-decisive-timing-run-summary-20260615a7.jsondata/qwen36-accepted-restored-c1-decisive-timing-timing-summary-20260615a7.jsondata/qwen36-accepted-restored-c1-decisive-timing-timing-decision-20260615a7.mdResult:
92.5220 tok/s.10.8095 ms/token.187.55 ms.moe.moe.quant_method_total at 4.535820 ms.runtime, gpu_model_runner.bookkeeping_sync at
3.923906 ms.Decision:
Async-scheduling smoke on the current prefill-safe forced-graph lane:
PORT=18097 BASE_URL=http://127.0.0.1:18097 STAMP=20260615a8 \
CACHE_LABEL=qwen36-ablation-native-decode-safe-prefill-graph \
XPU_GRAPH=1 VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' \
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill \
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1 \
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1 \
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1 \
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=0 \
VLLM_EXTRA_ARGS='--uvicorn-log-level warning' \
METRICS_REPEATS=2 JSON_REPEATS=32 COLOR_REPEATS=32 ABLATION_RUN_QUALITY=0 \
bash scripts/run-qwen36-ablation-candidate.sh \
prefill-safe-async-scheduling-smoke
Artifacts:
data/qwen36-ablation-prefill-safe-async-scheduling-smoke-summary-20260615a8.jsondata/qwen36-ablation-prefill-safe-async-scheduling-smoke-p512o512-20260615a8.jsondata/qwen36-ablation-prefill-safe-async-scheduling-smoke-json-repeat32-20260615a8.jsondata/qwen36-ablation-prefill-safe-async-scheduling-smoke-color-repeat32-20260615a8.jsonResult:
91.0666 tok/s.10.9806 ms/token.190.09 ms.32/32.32/32.Decision:
_bookkeeping_sync is expensive. Revisit only if a
GPU-local token/scheduler path can be proven faster and canary-clean.Current priority list:
moe.quant_method_total are fixed overhead versus true GEMM
cost.k=1 speculative parity as the second no-quality-loss route to
a large single-request speedup, but do not claim speed until token parity
passes with speculative activity proven active.Fresh route-exact kernel floor on the restored 67 MB _xpu_C binary:
PYTHONPATH=/home/steve/src/vllm:/home/steve/src/vllm-xpu-kernels \
LD_LIBRARY_PATH=/home/steve/src/vllm-xpu-kernels/vllm_xpu_kernels:/home/steve/.venvs/vllm-xpu/lib:/home/steve/.venvs/vllm-xpu/lib/python3.12/site-packages/torch/lib:${LD_LIBRARY_PATH:-} \
/home/steve/.venvs/vllm-xpu/bin/python \
scripts/bench-qwen36-w8a8-kernel-floor.py \
--route-jsonl data/qwen36-quark-int8-tp4-routecapture6-routes-rank0-20260611.jsonl \
--route-layer-regex 'layers\.(9|14|21)\.' \
--route-stage-regex '^quark_int8_apply$' \
--route-start-indices 0,12,24,36,48,60,72,84 \
--route-window-size 1 --max-cases 8 --gemm-stage both \
--include-compact-grouped --include-quant --warmup 5 --iterations 20 \
--output-json data/qwen36-w8a8-kernel-floor-restored-binary-20260615a9.json
Result:
119.207 us.111.575 us.119.860 us.116.875 us.85.041 us.85.033 us.Fresh fused-prologue route expansion replay:
PYTHONPATH=/home/steve/src/vllm:/home/steve/src/vllm-xpu-kernels \
LD_LIBRARY_PATH=/home/steve/src/vllm-xpu-kernels/vllm_xpu_kernels:/home/steve/.venvs/vllm-xpu/lib:/home/steve/.venvs/vllm-xpu/lib/python3.12/site-packages/torch/lib:${LD_LIBRARY_PATH:-} \
/home/steve/.venvs/vllm-xpu/bin/python \
scripts/bench-qwen36-moe-prologue.py \
--route-jsonl data/qwen36-quark-int8-tp4-routecapture6-routes-rank0-20260611.jsonl \
--route-layer-regex 'layers\.9\.' \
--route-stage-regex '^quark_int8_apply$' \
--route-start-indices 0:64:4 --rows 1 \
--iterations 30 --warmup 5 \
--output-json data/qwen36-moe-prologue-restored-binary-20260615a10.json \
--markdown-out data/qwen36-moe-prologue-restored-binary-20260615a10.md
Result:
102.640 us.fused_moe_prologue mean: 98.990 us.3.650 us/layer.Fresh full route-exact MoE replay:
PYTHONPATH=/home/steve/src/vllm:/home/steve/src/vllm-xpu-kernels \
LD_LIBRARY_PATH=/home/steve/src/vllm-xpu-kernels/vllm_xpu_kernels:/home/steve/.venvs/vllm-xpu/lib:/home/steve/.venvs/vllm-xpu/lib/python3.12/site-packages/torch/lib:${LD_LIBRARY_PATH:-} \
/home/steve/.venvs/vllm-xpu/bin/python \
scripts/bench-qwen36-int8-moe-kernels.py \
--rows 1 \
--route-jsonl data/qwen36-quark-int8-tp4-routecapture6-routes-rank0-20260611.jsonl \
--route-layer-regex 'layers\.9\.' \
--route-stage-regex '^quark_int8_apply$' \
--route-start-indices 0:64:4 \
--route-min-num-tokens 1 --route-max-num-tokens 1 \
--iterations 30 --warmup 5 \
--output-json data/qwen36-int8-moe-kernels-restored-binary-20260615a11.json \
--markdown-out data/qwen36-int8-moe-kernels-restored-binary-20260615a11.md
Result:
False.preallocated_staged is exact against xpu_fused_moe in this replay
(max_abs_diff=0.0).preallocated_staged at
190.786 us, 1.478x faster than the replay reference.221.257 us.160 us/layer target is not met, so this is not enough by
itself for a >100 tok/s endpoint.Endpoint implication:
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 was not identity-matched to the
current prefill-safe forced-graph lane. It used decode GDN fallback and other
drift, so it was not a valid rejection.Identity-matched mixed-workspace smoke:
PORT=18098 BASE_URL=http://127.0.0.1:18098 STAMP=20260615a12 \
CACHE_LABEL=qwen36-ablation-native-decode-safe-prefill-graph \
XPU_GRAPH=1 VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' \
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill \
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1 \
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1 \
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1 \
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=0 \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
METRICS_REPEATS=2 JSON_REPEATS=32 COLOR_REPEATS=32 ABLATION_RUN_QUALITY=0 \
bash scripts/run-qwen36-ablation-candidate.sh \
prefill-safe-int8-mixed-workspace-smoke
Artifacts:
data/qwen36-ablation-prefill-safe-int8-mixed-workspace-smoke-summary-20260615a12.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-smoke-p512o512-20260615a12.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-smoke-json-repeat32-20260615a12.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-smoke-color-repeat32-20260615a12.jsonResult:
93.5606 tok/s.10.6891 ms/token.187.04 ms.32/32.32/32.Decision:
93.3137 tok/s forced-graph reference, but
the margin is small and it needs adjacent repeat and quality validation
before accepting.Identity-matched mixed-workspace plus async smoke:
PORT=18099 BASE_URL=http://127.0.0.1:18099 STAMP=20260615a13 \
CACHE_LABEL=qwen36-ablation-native-decode-safe-prefill-graph \
XPU_GRAPH=1 VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' \
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill \
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1 \
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1 \
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1 \
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=0 \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
VLLM_EXTRA_ARGS='--uvicorn-log-level warning' \
METRICS_REPEATS=2 JSON_REPEATS=32 COLOR_REPEATS=32 ABLATION_RUN_QUALITY=0 \
bash scripts/run-qwen36-ablation-candidate.sh \
prefill-safe-int8-mixed-workspace-async-smoke
Artifacts:
data/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-smoke-summary-20260615a13.jsonResult:
95.0170 tok/s.10.5253 ms/token.92.0044 tok/s.186.97 ms.32/32.32/32.Decision:
Offset-GEMM MoE replay screen:
PYTHONPATH=/home/steve/src/vllm:/home/steve/src/vllm-xpu-kernels \
LD_LIBRARY_PATH=/home/steve/src/vllm-xpu-kernels/vllm_xpu_kernels:/home/steve/.venvs/vllm-xpu/lib:/home/steve/.venvs/vllm-xpu/lib/python3.12/site-packages/torch/lib:${LD_LIBRARY_PATH:-} \
/home/steve/.venvs/vllm-xpu/bin/python \
scripts/bench-qwen36-int8-moe-kernels.py \
--rows 1 \
--route-jsonl data/qwen36-quark-int8-tp4-routecapture6-routes-rank0-20260611.jsonl \
--route-layer-regex 'layers\.9\.' \
--route-stage-regex '^quark_int8_apply$' \
--route-start-indices 0:64:4 \
--route-min-num-tokens 1 --route-max-num-tokens 1 \
--iterations 30 --warmup 5 \
--enable-offset-gemm --enable-active-offset-gemm \
--output-json data/qwen36-int8-moe-kernels-offset-screen-restored-binary-20260615a14.json \
--markdown-out data/qwen36-int8-moe-kernels-offset-screen-restored-binary-20260615a14.md
Result:
max_abs_diff=0.0).160 us/layer replay target.Decision:
Mixed-workspace plus async quality gate:
PORT=18100 BASE_URL=http://127.0.0.1:18100 STAMP=20260615a15 \
CACHE_LABEL=qwen36-ablation-native-decode-safe-prefill-graph \
XPU_GRAPH=1 VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' \
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill \
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1 \
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1 \
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1 \
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=0 \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
VLLM_EXTRA_ARGS='--uvicorn-log-level warning' \
METRICS_REPEATS=4 JSON_REPEATS=64 COLOR_REPEATS=64 \
ABLATION_RUN_QUALITY=1 QUALITY_REPEAT_RUNS=8 QUALITY_LONG_CONTEXT_TOKENS=4096 \
bash scripts/run-qwen36-ablation-candidate.sh \
prefill-safe-int8-mixed-workspace-async-quality-gate
Artifacts:
data/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-quality-gate-summary-20260615a15.jsonResult:
93.2157 tok/s.94.3273,
94.5414, and 94.5266 tok/s; repeat 1 was slow at 89.4673 tok/s.10.7339 ms/token.64/64.64/64.pass_all=true, baseline_match_all=true,
long-context pass.Decision:
94.5 tok/s after the first measured
repeat, not as progress toward >100 by itself.Mixed-workspace plus async MoE boundary timing:
STAMP=20260615a17 PORT=18102 BASE_URL=http://127.0.0.1:18102 \
CACHE_LABEL=qwen36-ablation-native-decode-safe-prefill-graph \
XPU_GRAPH=1 VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' \
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill \
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1 \
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1 \
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1 \
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=0 \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
VLLM_EXTRA_ARGS='--uvicorn-log-level warning' \
VLLM_XPU_DECODE_TIMING_LABEL_REGEX='^(moe\.|xpu_moe\.|gpu_model_runner\.(forward_total|model_forward))' \
bash scripts/run-qwen36-decisive-timing.sh \
mixed-workspace-async-moe-boundary-timing
Result:
95.3692 tok/s.moe.quant_method_total: roughly 0.88-0.99 ms per MoE call by rank.moe.apply: roughly 0.34-0.36 ms per MoE call.xpu_moe.fused_moe_call: roughly 0.217-0.226 ms per MoE call.xpu_moe.workspace_scratch_get: roughly 0.036-0.038 ms per MoE call.Decision:
0.5 ms per MoE call outside moe.apply, so the next target is shared
expert handling.Shared-expert timing:
STAMP=20260615a18 PORT=18103 BASE_URL=http://127.0.0.1:18103 \
CACHE_LABEL=qwen36-ablation-native-decode-safe-prefill-graph \
XPU_GRAPH=1 VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' \
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill \
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1 \
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1 \
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1 \
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=0 \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
VLLM_EXTRA_ARGS='--uvicorn-log-level warning' \
VLLM_XPU_DECODE_TIMING_LABEL_REGEX='^(moe\.|xpu_moe\.|gpu_model_runner\.(forward_total|model_forward))' \
bash scripts/run-qwen36-decisive-timing.sh \
mixed-workspace-async-shared-expert-timing
Result:
95.3114 tok/s.moe.shared_experts.apply_no_overlap: 0.466-0.473 ms on ranks 1-3,
0.568 ms on rank 0.moe.apply: about 0.341-0.345 ms.xpu_moe.fused_moe_call: about 0.216-0.219 ms.Decision:
wait method cannot be used for an event associated with a command graph.Rejected smoke:
PORT=18104 BASE_URL=http://127.0.0.1:18104 STAMP=20260615a19 \
CACHE_LABEL=qwen36-ablation-native-decode-safe-prefill-graph \
XPU_GRAPH=1 VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' \
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill \
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1 \
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1 \
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1 \
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=0 \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
VLLM_XPU_SHARED_EXPERTS_STREAM=1 \
VLLM_EXTRA_ARGS='--uvicorn-log-level warning' \
METRICS_REPEATS=1 JSON_REPEATS=16 COLOR_REPEATS=16 ABLATION_RUN_QUALITY=0 \
bash scripts/run-qwen36-ablation-candidate.sh \
prefill-safe-int8-mixed-workspace-async-xpu-shared-stream-smoke
Next:
VLLM_XPU_SHARED_EXPERTS_STREAM patch opt-in only; do not use it
in accepted graph lanes yet.Hypothesis:
qwen2_moe.shared.silu_and_mul plus the down-projection input quantization
looked like a low-risk target because the XPU extension already exposes
silu_and_mul_quant_int8_xpu.VLLM_XPU_SHARED_EXPERT_FUSED_ACT_QUANT=1, default off, to use:
gate_up_proj -> silu_and_mul_quant_int8_xpu -> int8_gemm_w8a8 for the
shared expert down projection when the shared expert has reduce_results=False.Command:
STAMP=20260615a21 PORT=18106 BASE_URL=http://127.0.0.1:18106 \
CACHE_LABEL=qwen36-ablation-native-decode-safe-prefill-graph \
XPU_GRAPH=1 VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' \
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill \
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1 \
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1 \
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1 \
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=0 \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
VLLM_XPU_SHARED_EXPERT_FUSED_ACT_QUANT=1 \
VLLM_EXTRA_ARGS='--uvicorn-log-level warning' \
METRICS_REPEATS=1 JSON_REPEATS=16 COLOR_REPEATS=16 ABLATION_RUN_QUALITY=0 \
bash scripts/run-qwen36-ablation-candidate.sh \
prefill-safe-int8-mixed-workspace-async-shared-fused-act-quant-smoke
Artifacts:
data/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-shared-fused-act-quant-smoke-summary-20260615a21.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-shared-fused-act-quant-smoke-json-repeat16-20260615a21.jsonResult:
94.5476 tok/s, slower than the clean mixed-workspace
async lane.mismatch_count=1).Decision:
VLLM_XPU_SHARED_EXPERT_FUSED_ACT_QUANT in accepted
lanes.Accepted diagnostic patch:
VLLM_XPU_CUDAGRAPH_STATIC_INPUT_REGEX,
VLLM_XPU_CUDAGRAPH_STATIC_INPUT_INDICES, and
VLLM_XPU_CUDAGRAPH_STATIC_INPUT_MAX_NUMEL to clone only selected small XPU
graph inputs into static graph-owned buffers.VLLM_XPU_CUDAGRAPH_CLONE_REPLAY_OUTPUT_INDICES=all|* support for
diagnostics only.VLLM_XPU_CUDAGRAPH_STRONG_OUTPUT=1 so strong output mode stores the
real output object instead of still weak-refing it.Important rejected/neutral graph results:
20260615b3 strong output + native GDN + no top-k:
98.4654 tok/s, but JSON failed at repeat 42 and color failed at repeat 6.
Strong output does not repair the unsafe no-top-k lane.20260615b4 local-argmax direct-reuse crashed during endpoint startup with
XPU device lost/out-of-resources errors around _prepare_inputs.20260615b5 clone-all outputs for piecewise:0/41 produced immediate JSON
and color corruption. Whole-output cloning is invalid because graph outputs
include internal/KV/scratch tensors that must preserve identity.20260615b6 targeted static input copy on safe piecewise:1/41 args 8,10
passed JSON 64/64 and color 96/96 at 93.2155 tok/s, but was not faster.20260615b7 native GDN + no top-k + the same static input copy still failed
at the old JSON/color repeat windows. The remaining native/no-top-k
corruption is not fixed by graph boundary input copying.New sampler lead:
torch.ops._C.top_k_per_row_decode.torch.topk(k=1) for
rows 1, 2, 4, 8, and 16.torch.topk(k=1): about 392-419 ustorch.ops._C.top_k_per_row_decode(k=1): about 57-58 usVLLM_XPU_GREEDY_SAMPLE_XPU_FALLBACK=xpu_topk.20260615b8 failed before readiness because the raw
kernel returned int32 and the compiled sampler expected Long. Fixed by
returning indices.view(-1).long() to match the existing torch.topk
contract.Current test in flight:
STAMP=20260615b9 PORT=18108 BASE_URL=http://127.0.0.1:18108 \
CACHE_LABEL=qwen36-ablation-native-gdn-xpu-topk-int8-mixed-workspace-async-b9 \
XPU_GRAPH=1 VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' \
VLLM_XPU_GDN_NATIVE_FALLBACK=0 \
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1 \
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=0 \
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=0 \
VLLM_XPU_GREEDY_SAMPLE_XPU_FALLBACK=xpu_topk \
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=0 \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
VLLM_EXTRA_ARGS='--uvicorn-log-level warning' \
METRICS_REPEATS=2 JSON_REPEATS=64 COLOR_REPEATS=96 ABLATION_RUN_QUALITY=0 \
bash scripts/run-qwen36-ablation-candidate.sh \
native-gdn-xpu-topk-int8-mixed-workspace-async-smoke
Decision gate:
Result:
data/qwen36-ablation-native-gdn-xpu-topk-int8-mixed-workspace-async-smoke-summary-20260615b9.json97.6363 tok/s.伪 3 3 3 3 3 3 3.Decision:
xpu_topk fixes the unsafe sampler argmax concern, but the native
GDN/prefill-replay lane still has late token corruption.VLLM_XPU_GDN_NATIVE_FALLBACK=prefill,
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1,
VLLM_XPU_GREEDY_SAMPLE_XPU_FALLBACK=xpu_topk.Command identity:
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=0
and VLLM_XPU_GREEDY_SAMPLE_XPU_FALLBACK=xpu_topk.VLLM_XPU_GDN_NATIVE_FALLBACK=prefillVLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}'Result:
data/qwen36-ablation-prefill-safe-xpu-topk-int8-mixed-workspace-async-smoke-summary-20260615b10.json98.2378 tok/s.blue, green, red, yellow instead of
blue, green, orange, red.Decision:
torch.topk
for 3 x 2000 repeats, so the next test is endpoint ordering:
VLLM_XPU_GREEDY_SAMPLE_XPU_FALLBACK=xpu_topk_sync.xpu_topk_sync is about 300 us per call versus torch.topk about
392 us, so it may retain a smaller safe win if the sync resolves color.Follow-up result:
20260615b11, same safe lane with
VLLM_XPU_GREEDY_SAMPLE_XPU_FALLBACK=xpu_topk_sync.95.1228 tok/s.Decision:
top_k_per_row_decode kernel is not a safe drop-in greedy sampler for
this model/logits path. Keep the sampler patch for diagnostics only; do not
enable either xpu_topk or xpu_topk_sync in accepted lanes.topk sampler and test native GDN
with prefill cudagraph replay disabled:
VLLM_XPU_GDN_NATIVE_FALLBACK=0,
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1,
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1.Follow-up result:
20260615b12, native GDN with prefill replay disabled and PyTorch top-k.94.1672 tok/s.blue, green, orange,.Decision:
VLLM_XPU_GDN_NATIVE_FALLBACK=0 unless
we add a focused GDN state/correctness repair.torch.max: already rejected in
2026-06-13-qwen36-decode-graph-replay-corruption.md because it shares the
bad XPU reduction behavior. Do not rerun it as a candidate.Goal:
99.428358 tok/s p512/o512 text-prompt lane
before attempting more speculative or MoE changes.Old accepted reference:
data/localmaxxing-qwen36-quark-w8a8-int8-tp4-noprefix-p512n512-20260611.payload.jsondata/qwen36-quark-int8-tp4-noprefix-accepted-clean-single-r4-20260611.json99.428358 tok/s.76.454 ms.5214.734 ms.prompt_kind=text, 512 prompt tokens, 512 output tokens.VLLM_XPU_QUARK_W8A8_MOE=1,
VLLM_XPU_GDN_REUSE_QKVZ_BA_QUANT=clone, and gpu-memory-utilization=0.95.Recovery attempt d1:
data/qwen36-ablation-old-accepted-text-async-gmem95-smoke-summary-20260615d1.jsongmem=0.95, async enabled,
and full GDN fallback default VLLM_XPU_GDN_NATIVE_FALLBACK=decode,prefill.80.3113 tok/s.12.4318 ms/token.183.140 ms.64/64 and 64/64 passed.Decision:
Recovery attempt d2:
data/qwen36-ablation-old-accepted-text-gdn-prefill-async-gmem95-smoke-summary-20260615d2.jsonVLLM_XPU_GDN_NATIVE_FALLBACK=prefill,
gmem=0.95, async enabled, and no mixed INT8 MoE workspace.UR_RESULT_ERROR_DEVICE_LOST at block_table.copy_to_gpu.data/qwen36-ablation-old-accepted-text-gdn-prefill-async-gmem95-smoke-20260615d2.logDecision:
Recovery attempt d3:
data/qwen36-ablation-text-prefill-mixedws-async-gmem95-smoke-summary-20260615d3.jsonVLLM_XPU_GDN_NATIVE_FALLBACK=prefill,
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1, gmem=0.95, and async enabled.92.1688 tok/s.10.8372 ms/token.178.712 ms.64/64 and 64/64 passed.Comparison to old accepted:
99.4284 tok/s; current mixed safe text:
92.1688 tok/s.5214.734 ms; current: 5725.962 ms.76.454 ms; current: 178.712 ms.Current interpretation:
7.26 tok/s
against the old accepted text prompt and by about 0.84 ms/token against the
old decode budget.VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1 recovers TTFT/decode without
canary drift. If it fails quality, keep the disable flag and move to timing
trace / code-drift isolation.Goal:
Attempt e1:
data/qwen36-ablation-oldshape-nativegdn-piecewise-gmem90-smoke-summary-20260615e1.jsonGPU_MEMORY_UTILIZATION=0.90,
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}', graph enabled,
forced/noop graph comm capture enabled, native GDN enabled
(VLLM_XPU_GDN_NATIVE_FALLBACK=0), prefill replay enabled, zero-fresh/all
GDN state disabled, PyTorch top-k fallback disabled, async scheduling enabled.98.4720 tok/s.{"answer": "42", "unit": whiskey whiskey whiskey whiskey2"}が可能 acquaintanceunyablue, 4green, 5orange, 6redDecision:
Attempt e2:
data/qwen36-ablation-oldshape-nativegdn-sanitize-piecewise-gmem90-canary-summary-20260615e2.jsonVLLM_XPU_CUDAGRAPH_SANITIZE_REPLAY_INPUTS=1, canaries only.Decision:
VLLM_XPU_CUDAGRAPH_SANITIZE_REPLAY_INPUTS in the
ablation summary JSON because it is now part of benchmark identity.Attempt e3:
data/qwen36-ablation-oldshape-nativegdn-staticall-piecewise-gmem90-canary-summary-20260615e3.jsonVLLM_XPU_CUDAGRAPH_STATIC_INPUT_REGEX='piecewise:',
VLLM_XPU_CUDAGRAPH_STATIC_INPUT_INDICES=all,
VLLM_XPU_CUDAGRAPH_STATIC_INPUT_MAX_NUMEL=1048576.data/qwen36-ablation-oldshape-nativegdn-staticall-piecewise-gmem90-canary-20260615e3.logDecision:
cudagraph_copy_inputs
failure class and should not be retried without narrowing the copied input set.Next ideas:
Problem:
VLLM_XPU_SHARED_EXPERT_FUSED_ACT_QUANT=1
because JSON canary failed after only a few repeats.silu_and_mul_quant_int8_xpu had already been corrected to
match the accepted two-step BF16 activation/INT8 quantization semantics, but
the installed _xpu_C.abi3.so binary was stale.Repair:
JOBS=8 GDN_KERNELS=ON scripts/build-vllm-xpu-kernels-xpu-c-only.sh/home/steve/src/vllm-xpu-kernels/vllm_xpu_kernels/_xpu_C.abi3.so
size 55831416, timestamp 2026-06-15 04:30:22 -0400./home/steve/src/vllm-xpu-kernels/vllm_xpu_kernels/libgdn_attn_kernels_xe_2.so
size 2713184, timestamp 2026-06-15 04:28:38 -0400./home/steve/src/vllm-xpu-kernels/vllm_xpu_kernels/libgrouped_gemm_xe_2.so
size 3539968, timestamp 2026-06-15 04:30:14 -0400.Focused parity gate:
data/qwen36-onednn-moe-island-layer9-r1-multiwindow-20260612bc/silu_quant_parity_xpu_20260615e6.jsondata/qwen36-onednn-moe-island-layer9-r1-multiwindow-20260612bc/silu_quant_parity_onednn_20260615e6.jsonall_fused_q_exact=trueall_fused_scales_exact=trueall_twostep_q_exact=trueall_twostep_scales_exact=truemax_fused_q_diff_count=0max_fused_scale_abs_diff=0.0Decision:
VLLM_XPU_SHARED_EXPERT_FUSED_ACT_QUANT=1.Endpoint canary result:
data/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-shared-fused-act-quant-rebuilt-smoke-summary-20260615e6.jsonGDN_NATIVE_FALLBACK=prefill,
DISABLE_PREFILL_CUDAGRAPH_REPLAY=1, PyTorch top-k fallback,
mixed INT8 MoE workspace, async scheduling, plus
VLLM_XPU_SHARED_EXPERT_FUSED_ACT_QUANT=1.94.1174 tok/s.data/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-shared-fused-act-quant-rebuilt-smoke-json-repeat64-20260615e6.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-shared-fused-act-quant-rebuilt-smoke-color-repeat64-20260615e6.jsonDecision:
~98.47 tok/s but fails
canaries.Goal:
Candidate:
data/qwen36-ablation-prefill-safe-xpu-topk-clonesampled-int8-mixed-workspace-async-smoke-summary-20260615f1.jsonGDN_NATIVE_FALLBACK=prefill, DISABLE_PREFILL_CUDAGRAPH_REPLAY=1,
XPU top_k_per_row_decode greedy sampler
(VLLM_XPU_GREEDY_SAMPLE_XPU_FALLBACK=xpu_topk), mixed INT8 MoE
workspace, async scheduling, plus
VLLM_XPU_ASYNC_CLONE_SAMPLED_TOKEN_IDS=1.Result:
97.4830 tok/s.{"answer":"12","unit":"widgets"}.blue, green, red, yellow.Decision:
Goal:
Trace:
data/qwen36-ablation-prefill-safe-xpu-topk-logprobs-color-trace-summary-20260615f2.jsondata/qwen36-ablation-prefill-safe-xpu-topk-logprobs-color-trace-color-repeat128-20260615f2.jsonGDN_NATIVE_FALLBACK=prefill, DISABLE_PREFILL_CUDAGRAPH_REPLAY=1,
direct XPU top-k greedy sampler
(VLLM_XPU_GREEDY_SAMPLE_XPU_FALLBACK=xpu_topk), mixed INT8 MoE
workspace, async scheduling, with COLOR_LOGPROBS=5.Result:
blue, green, red, yellow." red": -0.34027379751205444" orange": -1.3402738571166992Decision:
Goal:
indices, seq_lens) were
corrupting later requests in the direct XPU top-k lane.Candidate:
data/qwen36-ablation-prefill-safe-xpu-topk-nocache-int8-mixed-workspace-async-smoke-summary-20260615f3.jsonVLLM_XPU_GREEDY_SAMPLE_XPU_FALLBACK=xpu_topk_nocache.Result:
98.4856 tok/s.{"answer":"12","unit":"widgets"}.blue, green, red, yellow.Decision:
Goal:
~93-95 tok/s
decode lane.Shared-expert experiments:
VLLM_XPU_MOE_SHARED_EXPERT_OVERLAP_STREAM=1 failed before readiness with
RuntimeError: wait method cannot be used for an event associated with a
command graph. Do not retry this form inside graph capture without changing
the event/stream boundary.VLLM_XPU_MOE_SHARED_ADD_ALLREDUCE_CUSTOM_OP=1 ran cleanly but only reached
94.8245 tok/s, which is not a meaningful win over the accepted safe
baseline. Keep as a possible cleanup patch, not a promotion candidate.Oracle k=1 speculative path:
scripts/launch-qwen36-quark-int8-ngram-trace.sh so
COMPILE_CONFIG no longer appends an extra } when supplied by the caller.
Also added DISABLE_SPECULATIVE_CONFIG=1 to let the same launcher produce a
paired no-spec control with identical graph/cache identity.g3 (qwen36-oracle1-fullbonus-graph-20260615g3) failed exact parity
against the older accepted graph baseline, but this was not a valid verdict:
it used a fresh graph/cache root and hit known sentinel drift positions.g4 (qwen36-nospec-paired-freshgraph-20260615g4) is the valid paired
no-spec control for the fresh graph/cache branch.g5 (qwen36-oracle1-paired-freshgraph-20260615g5) is a real paired oracle
k=1 failure against g4:
natural_latency_plan diverged at token index 17:
no-spec token 321 ( and), oracle-spec token 4779 ( memory),
trace role replacement_after_reject.repetitive_kernel_notes diverged at token index 10:
no-spec token 17856 ( timing), oracle-spec token 22188
( verification), trace role verifier_bonus_after_full_accept.Current interpretation:
Next actions:
g6 using the g4 completion trace as ORACLE_TRACE, same cache base as
g4/g5, plus COW_WORKER_TRACE_FILE and COW_PARENT_TRACE_FILE.token_ids_cpu window, patch the transaction. If it does not, run the paired
no-bonus/recompute diagnostic to isolate verifier-bonus emission from
accepted-draft commit.Goal:
~93 tok/s baseline.Established control:
data/qwen36-nospec-inputtrace-eager-repetitive-20260615g20-completion.json
produced:
[3817,17856,13,78503,4581,2468,1345,28043,7072,3817,22188,13,15153,1543,6126,16401,85683,15162,5832,4618,3817,17856,13,78503,4581,2468,1345,28043,7072,3817,17856,13].data/qwen36-oracle1-fatrace-eager-repetitive-20260615g25-completion.json
matched until output index 30, then emitted 22188 (verification) where
no-spec emitted 17856 (timing).Trace evidence:
data/qwen36-oracle1-fatrace-eager-repetitive-20260615g25-fa-trace.jsonl
showed one prefill row, fifteen packed q_len=2 verifier rows with
seq_lens 490 through 518, then one final q_len=1 row.[7072,3817] at positions [516,517]
and requests logits for both tokens. No-spec feeds the same visible tokens as
two separate one-token forwards at the same positions.g23) did not change the mismatch, so simple GDN recurrent ordering is not
the root cause.Full-attention diagnostic matrix:
VLLM_XPU_FA_SERIAL_SPEC_MODE in
vllm/v1/attention/backends/flash_attn.py. Modes tested so far are
diagnostics only and are disabled unless the env var is set.progressive/legacy serial full attention plus serial GDN (g24) fixed the
final timing token but broke the earlier repeated context, causing the
sequence to shift from output index 10.same key-length mode plus serial GDN (g26) was worse: it introduced an
early <think> divergence at output index 5.progressive_nocausal plus serial GDN (g27) matched the earlier
progressive behavior and still shifted from output index 10.Decision:
Goal:
Baseline/control:
data/qwen36-nospec-inputtrace-eager-repetitive-20260615g20-completion.json...., 7072, 3817, 17856, 13.Runs:
g28
(qwen36-oracle1-nobonus-allfilters-serialgdn-eager-repetitive-20260615g28)
used all current no-bonus filters:
DISABLE_FULL_ACCEPT_BONUS=1,
RECOMPUTE_SUPPRESSED_BONUS=1,
FILTER_SUPPRESSED_BONUS_CACHE=1,
VLLM_XPU_SPEC_DECODE_FILTER_SUPPRESSED_BONUS_NEXT_INPUT=1,
VLLM_XPU_GDN_SPEC_ACCEPTED_DRAFT_ONLY=1, and
VLLM_XPU_GDN_SERIAL_SPEC_DECODE=1.
It still mismatched only at output index 30:
no-spec 17856 (timing), oracle no-bonus 22188
(verification).[7072,3817] at positions [516,517], suppressed
bonus 22188, and the next visible row recomputed position 517 with token
3817. The recompute still produced 22188.g29
(qwen36-oracle1-nobonus-skipbonus-serialgdn-eager-repetitive-20260615g29)
added VLLM_XPU_GDN_SERIAL_SPEC_SKIP_DRAFT_STATE=1. It produced the same
final mismatch at index 30. Skipping only the bonus recurrent state is not
enough.g31/g32/g33 tested a temporary
VLLM_XPU_GDN_SERIAL_SPEC_NO_STATE_COMMIT=1 patch that snapshot/restored GDN
conv and recurrent state around serial spec rows. The first version needed an
int64 index fix; later variants restored after output merge and with
torch.xpu.synchronize(). All variants failed by diverging much earlier at
output index 12 (15153 became 271 and then <think>). The failed patch
was removed from the worktree.Decision:
93.2-93.4 tok/s.Next:
mamba_state_idx bookkeeping in mamba_utils.preprocess_mamba/postprocess_mamba
and attention KV slot overwrite/rollback for accepted draft positions.Goal:
Runs/artifacts:
g44
qwen36-oracle1-nomambaspec-hiddenrow-eager-repetitive-20260615g44
set NGRAM_NO_MAMBA_SPEC_BLOCKS=1. It diverged immediately after the first
few tokens and degenerated into repeated token 15. Conclusion: Mamba/GDN
speculative blocks are required; removing them is not a fix.g45
qwen36-nospec-layertrace-eager-repetitive-20260615g45 recorded no-spec
all-layer row digests for positions 516-517.g46
qwen36-oracle1-layertrace-eager-repetitive-20260615g46 reproduced the
single mismatch at output index 30 and showed that token 3817@517 matches
at embedding but first differs after layer 0 (linear_attention).g47
qwen36-oracle1-serialgdn-layertrace-eager-repetitive-20260615g47 enabled
both VLLM_XPU_GDN_SERIAL_SPEC_DECODE=1 and
VLLM_XPU_GDN_SERIAL_SPEC_CONV=1. It diverged much earlier, so that combined
serial diagnostic is invalid for promotion.g48/g49 added initial GDN row tracing but exposed a diagnostic bug:
the trace digest treated 3D [tokens, heads, dim] tensors with
tokens == 1 as if they were [batch, tokens, ...]. This made early
recurrent-output comparisons invalid.vllm/model_executor/layers/mamba/gdn_linear_attn.py
to treat only 4D+ tensors with leading batch dimension as [1, tokens, ...].g56/g57 reran short no-spec/oracle traces with the corrected digest.
First accepted row (3817@488) had exact projection and convolution, and
GDN core matched to tiny floating accumulation scale.g58 compared the oracle draft row (17856@489) against a no-spec
three-token control. Projection and convolution matched exactly; GDN core
differed only by about 2.5e-4 in aggregate sum and 3.5e-6 in L2.g59/g60 reran full 32-token no-spec/oracle post-GDN traces at the known
target row 3817@517:
data/qwen36-oracle1-gdnposttrace-vs-nospec-pos517-20260615g60.json.Corrected evidence at 3817@517:
mixed_qkv, b/a, z, and convolution output are exactly identical between
no-spec sequential decode and oracle packed verifier row.3.34e-6, L2 delta 8.34e-7.-3.34e-4;
output projection head deltas up to 1.22e-4.M=2 rows instead
of two sequential M=1 rows. Later layers amplify that drift enough to flip
one low-margin token (17856 vs 22188) in the repetitive canary.Decision:
Next best work:
~93 tok/s forced-comm PIECEWISE
baseline: graph-safe MoE/GDN timing, output projection/GEMM M=1 fast path,
and TP collective replay/topology./home/steve/AGENTS.md;
do not compare against graph-none runs.Goal:
Oracle/no-spec rerun:
g62
qwen36-oracle1-replaymargin-eager-repetitive-20260615g62 used normal
oracle k=1, eager/no-XPU-graph, and the corrected replay microscope active
row trace.g63
qwen36-nospec-replaymargin-eager-repetitive-20260615g63 is discarded. It
used the accepted launcher identity and diverged from the established g20
no-spec control at output index 10.g64
qwen36-nospec-replaymargin-nglauncher-eager-repetitive-20260615g64 is the
valid paired no-spec control. It used the same ngram-trace launcher with
DISABLE_SPECULATIVE_CONFIG=1 and matched g20 exactly.Artifacts:
data/qwen36-oracle1-replaymargin-eager-repetitive-20260615g62-completion.jsondata/qwen36-nospec-replaymargin-nglauncher-eager-repetitive-20260615g64-completion.jsondata/qwen36-oracle1-vs-nospec-replaymargin-20260615g64.jsonResult:
17856, oracle token 22188.17856 with top1/top2 margin 3.75; oracle top-1 22188
with margin 5.625.Decision:
Implemented:
/home/steve/src/vllm/vllm/v1/worker/gpu_model_runner.py replay microscope
records. The trace now carries input IDs, positions, logits indices, batch
descriptor, cudagraph mode, and per-active-row top-k logits.VLLM_XPU_CUDAGRAPH_ALIAS_TRACE_* instrumentation in
/home/steve/src/vllm/vllm/compilation/cuda_graph.py.
inputs_vs_previous_outputs,
outputs_vs_previous_outputs, and outputs_vs_inputs.patches/vllm-qwen36-xpu-cudagraph-alias-trace-20260615.patch.Validation:
cd /home/steve/src/vllm
/home/steve/.venvs/vllm-xpu/bin/python -m py_compile \
vllm/compilation/cuda_graph.py \
vllm/v1/worker/gpu_model_runner.py \
vllm/v1/sample/sampler.py \
vllm/model_executor/layers/mamba/gdn_linear_attn.py \
vllm/model_executor/models/qwen3_next.py
git diff --check -- \
vllm/compilation/cuda_graph.py \
vllm/v1/worker/gpu_model_runner.py \
vllm/v1/sample/sampler.py \
vllm/model_executor/layers/mamba/gdn_linear_attn.py \
vllm/model_executor/models/qwen3_next.py
Both passed.
Helper smoke:
cd /home/steve/src/vllm
/home/steve/.venvs/vllm-xpu/bin/python - <<'PY'
import torch
from vllm.compilation.cuda_graph import CUDAGraphWrapper
w = object.__new__(CUDAGraphWrapper)
base = torch.arange(8, dtype=torch.float32)
prev = w._xpu_cudagraph_tensor_alias_records((base[:4],), max_tensors=8)
cur_same = w._xpu_cudagraph_tensor_alias_records((base[2:6],), max_tensors=8)
cur_new = w._xpu_cudagraph_tensor_alias_records(
(torch.arange(4, dtype=torch.float32),), max_tensors=8)
assert w._xpu_cudagraph_find_aliases(cur_same, prev, max_aliases=8)
assert not w._xpu_cudagraph_find_aliases(cur_new, prev, max_aliases=8)
print("alias helper smoke: pass")
PY
Result: pass.
Important code-state correction:
cuda_graph.py no longer matches the older note that
entry.output = weak_ref_tensors(output) is unconditional. In this tree,
entry.output follows cudagraph_options.weak_ref_output, and piecewise
wrappers pass weak_ref_output=is_last_graph. That means intermediate
piece outputs are already held strongly unless a global override changes the
policy. P0a still needs an alias trace because the remaining fault can be
graph-pool/static-input/custom-op scratch aliasing rather than pure weak-ref
recycling.Next trace command:
cd /home/steve/llm-optimizations
LABEL=qwen36-aliastrace-fastlane-smoke-20260615
STAMP=20260615alias1 \
CACHE_LABEL="$LABEL" \
XPU_GRAPH=1 \
VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 \
VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' \
GPU_MEMORY_UTILIZATION=0.90 \
VLLM_XPU_CUDAGRAPH_ALIAS_TRACE_FILE="data/${LABEL}-alias-r{rank}.jsonl" \
VLLM_XPU_CUDAGRAPH_ALIAS_TRACE_MAX_LINES=1200 \
VLLM_XPU_CUDAGRAPH_ALIAS_TRACE_RANK=0 \
VLLM_XPU_CUDAGRAPH_ALIAS_TRACE_REGEX='piecewise:(0|1)/' \
VLLM_XPU_CUDAGRAPH_ALIAS_TRACE_INPUT_MAX_TENSORS=96 \
VLLM_XPU_CUDAGRAPH_ALIAS_TRACE_OUTPUT_MAX_TENSORS=32 \
VLLM_XPU_CUDAGRAPH_ALIAS_TRACE_MAX_ALIASES=128 \
METRICS_REPEATS=1 \
METRICS_OUTPUT_TOKENS=64 \
METRICS_WARMUP_OUTPUT_TOKENS=16 \
ABLATION_SKIP_CANARIES=1 \
ABLATION_RUN_QUALITY=0 \
bash scripts/run-qwen36-ablation-candidate.sh "$LABEL"
Gate after trace:
piecewise:1 inputs alias piecewise:0 output 5/6 or another graph0
output after warmup, prototype targeted XPU-safe static input copy for only
that handoff.Goal: find a quality-safe fast PIECEWISE forced-comm graph lane before stacking MoE/shared-expert speed changes.
All runs below used the fast-lane identity unless noted:
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}'XPU_GRAPH=1, VLLM_XPU_ENABLE_XPU_GRAPH=1VLLM_XPU_FORCE_GRAPH_WITH_COMM=1VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1GPU_MEMORY_UTILIZATION=0.90VLLM_XPU_GDN_NATIVE_FALLBACK=prefillVLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1VLLM_XPU_CUDAGRAPH_STRONG_OUTPUT=1Medium gate:
data/qwen36-ablation-p0a-strong-output-medium-gate-summary-20260615p0strong1.json94.1246 tok/s.64/64.128/128.Deep gate:
data/qwen36-ablation-p0a-strong-output-deep-gate-summary-20260615p0strong2.json92.0524 tok/s over four repeats.49/128, first mismatch index 48.138/256, first mismatch index 137.Conclusion: strong output can pass shallow gates but does not fix the long-run graph corruption. Do not promote.
VLLM_XPU_CUDAGRAPH_PER_WRAPPER_POOL=1data/qwen36-ablation-p0a-per-wrapper-pool-medium-gate-summary-20260615p0pool1.jsondata/qwen36-ablation-p0a-per-wrapper-pool-medium-gate-20260615p0pool1.logRuntimeError: level_zero backend failed with error: 20 (UR_RESULT_ERROR_DEVICE_LOST)
during block_table.copy_to_gpu.Conclusion: per-wrapper graph pools are unstable in this stack. Do not retry without a lower-level runtime reason or reduced reproducer.
VLLM_XPU_CUDAGRAPH_NO_GLOBAL_POOL=1Medium gate:
data/qwen36-ablation-p0a-no-global-pool-medium-gate-summary-20260615p0noglobal1.json92.3935 tok/s.64/64.128/128.Deep gate:
data/qwen36-ablation-p0a-no-global-pool-deep-gate-summary-20260615p0noglobal2.json90.5909 tok/s over four repeats.49/128, first mismatch index 48.138/256, first mismatch index 137.Conclusion: no-global-pool is stable enough to run and medium-clean, but it does not move the long-run corruption window. Do not promote.
piecewise:0/41 replay outputsEnvironment:
VLLM_XPU_CUDAGRAPH_CLONE_REPLAY_OUTPUT_REGEX='piecewise:0/41'VLLM_XPU_CUDAGRAPH_CLONE_REPLAY_OUTPUT_INDICES='*'Result:
data/qwen36-ablation-p0a-clone-piecewise0-all-medium-gate-summary-20260615cloneall1.json92.5674 tok/s.1/64, repeated-token corruption.1/128.Conclusion: broad cloning changes the graph handoff semantics too much and is
not useful. Targeted cloning of output 5/6 had already failed the deep gate, so
the next copy experiment should target the actual piecewise:1 input args or
a reduced boundary reproducer, not all piecewise:0 outputs.
The corruption window remains remarkably stable across strong-output, no-global-pool, and targeted output 5/6 clone runs:
This points away from simple weak-ref or global-pool lifetime policy and toward a graph-owned static input/custom-op scratch state that survives many replays. Next best engineering step:
piecewise:1 args
instead of cloning outputs.piecewise:1 arg list after a metrics warmup.piecewise:1 Static Input Copy: First Deep-Clean Fast BaseReproduced and deepened the earlier shallow-pass static-input candidate.
Environment additions:
VLLM_XPU_CUDAGRAPH_STATIC_INPUT_REGEX='piecewise:1/41'VLLM_XPU_CUDAGRAPH_STATIC_INPUT_INDICES='8,10'VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1VLLM_EXTRA_ARGS='--uvicorn-log-level warning'Important identity note: this launch command did not include
--no-async-scheduling, so it is distinct from the no-async fast-lane runs.
Deep gate command label:
p0a-static-piece1-8-10-deep-gateArtifacts:
data/qwen36-ablation-p0a-static-piece1-8-10-deep-gate-summary-20260615static810deep1.jsondata/qwen36-ablation-p0a-static-piece1-8-10-deep-gate-p512o512-20260615static810deep1.jsondata/qwen36-ablation-p0a-static-piece1-8-10-deep-gate-json-repeat128-20260615static810deep1.jsondata/qwen36-ablation-p0a-static-piece1-8-10-deep-gate-color-repeat256-20260615static810deep1.jsondata/qwen36-ablation-p0a-static-piece1-8-10-deep-gate-quality-suite-20260615static810deep1.jsonResult:
93.1062 tok/s over four p512/o512 repeats.10.7411 ms/token.128/128.256/256.Conclusion:
Tested the first proposed stack on top of the deep-clean static-input base.
Environment additions versus the static-input base:
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=1VLLM_XPU_W8A8_USE_OFFSETS=1VLLM_XPU_W8A8_OFFSETS_PREFIX_OP=1VLLM_XPU_MOE_W8A8_MIDDLE_LAYERLET=1Command label:
p0a-static810-layerlet-prefix-medium-gateArtifacts:
data/qwen36-ablation-p0a-static810-layerlet-prefix-medium-gate-summary-20260615stacklayer1.jsondata/qwen36-ablation-p0a-static810-layerlet-prefix-medium-gate-p512o512-20260615stacklayer1.jsondata/qwen36-ablation-p0a-static810-layerlet-prefix-medium-gate-json-repeat64-20260615stacklayer1.jsondata/qwen36-ablation-p0a-static810-layerlet-prefix-medium-gate-color-repeat128-20260615stacklayer1.jsonResult:
89.4664 tok/s.11.1786 ms/token.27/64.91/128.Conclusion:
Implemented an opt-in shared-expert activation workspace in
/home/steve/src/vllm/vllm/model_executor/models/qwen2_moe.py.
Default behavior is unchanged. The new path is enabled only with:
VLLM_XPU_SHARED_EXPERT_ACT_WORKSPACE=1The path keeps the exact same activation math and kernel:
torch.ops._C.silu_and_mul(out, gate_up)Local checks:
python -m py_compile vllm/model_executor/models/qwen2_moe.py: pass.0.0.Endpoint stack on the static-input base:
p0a-static810-sharedact-medium-gatedata/qwen36-ablation-p0a-static810-sharedact-medium-gate-summary-20260615sharedact1.jsondata/qwen36-ablation-p0a-static810-sharedact-medium-gate-p512o512-20260615sharedact1.jsondata/qwen36-ablation-p0a-static810-sharedact-medium-gate-json-repeat64-20260615sharedact1.jsondata/qwen36-ablation-p0a-static810-sharedact-medium-gate-color-repeat128-20260615sharedact1.jsonResult:
93.6893 tok/s.10.6762 ms/token.27/64.91/128.Conclusion:
VLLM_XPU_SHARED_EXPERT_ACT_WORKSPACE=1. Keep it only as a
diagnostic flag unless a future graph-lifetime fix makes this class safe.Attempted to generate a fresh no-spec accepted token trace with the older
launch-qwen36-quark-int8-ngram-trace.sh identity:
18139DISABLE_SPECULATIVE_CONFIG=1TAG=oracle-k1-nospec-20260615data/qwen36-oracle-k1-nospec-20260615.logThe server loaded and captured graphs successfully, but the first
qwen36-completion-oracle-trace.py request crawled at roughly 0.2 tok/s.
The trace client and server were stopped before completing the 128-token
baseline trace.
Conclusion:
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill,
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1,
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1,
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1, and selected static input copy for
piecewise:1/41 args 8,10.Patched the oracle trace tooling so speculative request IDs join reliably:
scripts/replay-qwen36-spec-trace.py
load_token_cases() now indexes both request_id and response_id
aliases instead of choosing only one.scripts/summarize-qwen36-spec-trace.py
Validation:
/home/steve/.venvs/vllm-xpu/bin/python -m py_compile \
scripts/replay-qwen36-spec-trace.py \
scripts/summarize-qwen36-spec-trace.py
Replayed the unsuppressed oracle k=1 trace:
data/qwen36-oracle-k1-unsupp-static-20260615-spec.jsonldata/qwen36-oracle-k1-unsupp-static-p256o32-trace-20260615.jsondata/qwen36-oracle-k1-unsupp-static-spec-summary-20260615-rerun.jsondata/qwen36-oracle-k1-unsupp-static-replay-20260615.jsonResults:
2.100% across 23 rows and 2 requests.0.14.decode speed,; the divergence is the
verifier bonus token after full acceptance:
63520, 4554329541, 33389Conclusion:
Tried to suppress the verifier bonus and align worker cache/next-input state before widening speculation. Both lanes are rejected as unstable on the current XPU/GDN path.
oracle-k1-nobonus-filter-cap128-static-20260615
DISABLE_FULL_ACCEPT_BONUS=1,
FILTER_SUPPRESSED_BONUS_CACHE=1,
RECOMPUTE_SUPPRESSED_BONUS=1,
VLLM_XPU_SPEC_DECODE_FILTER_SUPPRESSED_BONUS_NEXT_INPUT=1.data/qwen36-oracle-k1-nobonus-filter-cap128-static-20260615.logUR_RESULT_ERROR_DEVICE_LOST.vllm/v1/worker/gpu_model_runner.py in
_update_states_after_model_execute, copying
num_accepted_tokens.gpu into
input_batch.num_accepted_tokens_cpu_tensor.oracle-k1-nobonus-filter-norecompute-cap128-static-20260615
RECOMPUTE_SUPPRESSED_BONUS.data/qwen36-oracle-k1-nobonus-filter-norecompute-cap128-static-20260615.logUR_RESULT_ERROR_DEVICE_LOST at the same
accepted-token CPU tensor copy.1.93,
accepted 13, drafted 14, acceptance 92.9%.Conclusion:
VLLM_XPU_NGRAM_NO_MAMBA_SPEC_BLOCKS=1._update_states_after_model_execute so
non-spec rows after a speculative step do not consume stale/invalid accepted
token counts, then rerun the oracle parity gate.Tested the lower-risk Mamba/GDN speculative block toggle:
oracle-k1-nobonus-filter-nomambaspec-cap128-static-20260615VLLM_XPU_NGRAM_NO_MAMBA_SPEC_BLOCKS=1data/qwen36-oracle-k1-nobonus-filter-nomambaspec-cap128-static-20260615.logdata/qwen36-oracle-k1-nobonus-filter-nomambaspec-cap128-static-20260615-spec.jsonlResult:
UR_RESULT_ERROR_DEVICE_LOST at the same line:
gpu_model_runner.py copying num_accepted_tokens.gpu into
input_batch.num_accepted_tokens_cpu_tensor.scheduled_spec_decode_tokens={},
num_scheduled_tokens=1, and num_output_tokens=15.1.93, accepted 13,
drafted 14, acceptance 92.9%.Conclusion:
Patch added in /home/steve/src/vllm/vllm/v1/worker/gpu_model_runner.py:
VLLM_XPU_SPEC_DECODE_SKIP_ACCEPTED_D2H_NONSPEC=1_update_states_after_model_execute, when there are no scheduled draft
tokens, set accepted count to 1 on CPU directly and avoid the XPU-to-CPU
accepted-count copy.python -m py_compile /home/steve/src/vllm/vllm/v1/worker/gpu_model_runner.py:
pass.Next:
Reran the no-bonus filtered lane with the accepted-count D2H shortcut:
oracle-k1-nobonus-filter-skipd2h-cap128-static-20260615VLLM_XPU_SPEC_DECODE_SKIP_ACCEPTED_D2H_NONSPEC=1data/qwen36-oracle-k1-nobonus-filter-skipd2h-cap128-static-20260615.logdata/qwen36-oracle-k1-nobonus-filter-skipd2h-cap128-static-20260615-spec.jsonlResult:
1.93,
accepted 13, drafted 14, acceptance 92.9%.num_accepted_tokens_cpu_tensor.copy_ did not recur._bookkeeping_sync -> _to_list(sampled_token_ids),
where the next XPU-to-CPU sampled-token copy hit
UR_RESULT_ERROR_DEVICE_LOST.Conclusion:
Captured a narrower unsuppressed oracle k=1 first-divergence microscope on the static-input fast lane.
Artifacts:
data/qwen36-oracle-k1-unsupp-microscope2-static-20260615-rank0.jsonldata/qwen36-oracle-k1-unsupp-microscope2-static-20260615-spec.jsonlFinding:
Continue with dense numbered engineering notes. Focus on single-request decode speed, reliability gates, and no quality loss.Continue with dense numbered engineering notes. Focus on single-request decode speed, low11 (comma) is correct.265 with input token 11 and
chooses token 3238 (low) while the no-spec path expects token 29541
(reliability). The expected token is present in the bonus-row top-k, but
not as top-1.Conclusion:
Also tried post-forward “commit only the accepted draft token” as:
oracle-k1-gdn-draftonly-static-20260615data/qwen36-oracle-k1-gdn-draftonly-static-20260615.logdata/qwen36-oracle-k1-gdn-draftonly-static-20260615-spec.jsonlResult:
24985 and emitted 271, after which the run stalled.Next:
100 tok/s no-quality-loss route remains verified speculation after the bonus-row parity fix.
Implemented a conservative opt-in sampler shortcut in
/home/steve/src/vllm/vllm/v1/sample/sampler.py:
VLLM_XPU_GREEDY_SAMPLE_BF16_TOPK_FASTPATH=1torch.topk directly on BF16 logits before the normal FP32
cast. It deliberately avoids the rejected custom XPU top-k kernel family.Also added the env flag to the ablation runner identity logging:
/home/steve/llm-optimizations/scripts/run-qwen36-ablation-candidate.shChecks:
/home/steve/.venvs/vllm-xpu/bin/python -m py_compile \
/home/steve/src/vllm/vllm/v1/sample/sampler.py
bash -n /home/steve/llm-optimizations/scripts/run-qwen36-ablation-candidate.sh
Smoke gate on top of the validated static-input fast base:
p0a-static810-bf16-greedy-smokedata/qwen36-ablation-p0a-static810-bf16-greedy-smoke-summary-20260615bf16g1.jsondata/qwen36-ablation-p0a-static810-bf16-greedy-smoke-p512o512-20260615bf16g1.jsondata/qwen36-ablation-p0a-static810-bf16-greedy-smoke-json-repeat64-20260615bf16g1.jsondata/qwen36-ablation-p0a-static810-bf16-greedy-smoke-color-repeat128-20260615bf16g1.jsonResult:
92.1217 tok/s.10.8558 ms/token.64/64.99/128, first mismatch:
blue, green, red, yellow.Conclusion:
93.1062 tok/s) and fails the color canary.Promoted the fastest short-gate passing base-lane candidate to a deeper gate. This is the same prefill-safe mixed-workspace async identity as the previous short smoke, but with four measured repeats, JSON 128, color 256, and the quality suite enabled.
Command label:
prefill-safe-int8-mixed-workspace-async-deep-gateEnvironment:
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}'XPU_GRAPH=1VLLM_XPU_ENABLE_XPU_GRAPH=1VLLM_XPU_FORCE_GRAPH_WITH_COMM=1VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1VLLM_XPU_GDN_NATIVE_FALLBACK=prefillVLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1GPU_MEMORY_UTILIZATION=0.90VLLM_EXTRA_ARGS='--uvicorn-log-level warning'Artifacts:
data/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-deep-gate-summary-20260615a13deep2.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-deep-gate-p512o512-20260615a13deep2.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-deep-gate-json-repeat128-20260615a13deep2.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-deep-gate-color-repeat256-20260615a13deep2.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-deep-gate-quality-suite-20260615a13deep2.jsonResult:
93.5505 tok/s over four p512/o512 repeats.10.6899 ms/token.128/128.256/256.Identity comparison against the previous validated static-input base:
p0a-static-piece1-8-10-deep-gate, 93.1062 tok/s,
VLLM_XPU_CUDAGRAPH_STATIC_INPUT_REGEX='piecewise:1/41',
VLLM_XPU_CUDAGRAPH_STATIC_INPUT_INDICES='8,10'.prefill-safe-int8-mixed-workspace-async-deep-gate, 93.5505 tok/s,
no static-input copy flags.Conclusion:
+0.444 tok/s / +0.48%, but it is cleaner because the static
input copy is no longer needed for this identity.Promoted the short-gate passing shared-add all-reduce candidate on top of the current validated base.
Additional env:
VLLM_XPU_MOE_SHARED_ADD_ALLREDUCE_CUSTOM_OP=1Command label:
prefill-safe-int8-mixed-workspace-async-shared-addar-deep-gateArtifacts:
data/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-shared-addar-deep-gate-summary-20260615g2deep1.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-shared-addar-deep-gate-p512o512-20260615g2deep1.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-shared-addar-deep-gate-json-repeat128-20260615g2deep1.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-shared-addar-deep-gate-color-repeat256-20260615g2deep1.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-shared-addar-deep-gate-quality-suite-20260615g2deep1.jsonResult:
91.9646 tok/s.10.8798 ms/token.128/128.256/256.Conclusion:
93.5505 tok/s current base by about 1.59 tok/s.Promoted the short-gate passing native-GDN candidate to the deep gate.
Environment differences versus the current base:
VLLM_XPU_GDN_NATIVE_FALLBACK=0VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=0VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1Command label:
native-gdn-topk-int8-mixed-workspace-async-deep-gateArtifacts:
data/qwen36-ablation-native-gdn-topk-int8-mixed-workspace-async-deep-gate-summary-20260615b2deep1.jsondata/qwen36-ablation-native-gdn-topk-int8-mixed-workspace-async-deep-gate-p512o512-20260615b2deep1.jsondata/qwen36-ablation-native-gdn-topk-int8-mixed-workspace-async-deep-gate-json-repeat128-20260615b2deep1.jsondata/qwen36-ablation-native-gdn-topk-int8-mixed-workspace-async-deep-gate-color-repeat256-20260615b2deep1.jsondata/qwen36-ablation-native-gdn-topk-int8-mixed-workspace-async-deep-gate-quality-suite-20260615b2deep1.jsonResult:
93.8668 tok/s.10.6540 ms/token.88/128.12/256.Conclusion:
Ran decisive timing on the current validated base
prefill-safe-int8-mixed-workspace-async-deep-gate.
Artifacts:
data/qwen36-prefill-safe-int8-mixed-workspace-async-current-base-timing-run-summary-20260615basetime1.jsondata/qwen36-prefill-safe-int8-mixed-workspace-async-current-base-timing-timing-summary-20260615basetime1.jsondata/qwen36-prefill-safe-int8-mixed-workspace-async-current-base-timing-timing-decision-20260615basetime1-rerun.jsondata/qwen36-prefill-safe-int8-mixed-workspace-async-current-base-timing-timing-decision-20260615basetime1-rerun.mdResult:
84.65 tok/s; this is not comparable to
normal endpoint speed because timing instrumentation adds overhead.persistent_w8a8_moe_layerlet.moe_forward_shared.custom_op, max 9.059154 ms.gdn_attention_core_xpu.native, max 1.690804 ms.moe.quant_method_total at about 8.420 ms,
moe.shared_experts.apply_no_overlap at about 6.413 ms, and
qwen2_moe.shared.silu_and_mul at about 3.997 ms.0.063 ms, so collectives are not
the immediate single-request wall in this identity.Conclusion:
Built and tested a decode-route prologue-inclusive replay path for the current validated base. The isolated route prologue matched route expansion/counts exactly and was slightly faster than the existing zero/remap setup.
Artifacts:
data/qwen36-moe-prologue-current-base-20260615.jsondata/qwen36-int8-moe-full-route-replay-current-base-20260615.jsondata/qwen36-ablation-prefill-safe-int8-fused-prologue-offset-smoke-20260615prol1.logResult:
106.93 us; fused prologue
average 103.80 us; exact route diff 0.fused_prologue_offset_gemm was exact
(max_abs_diff=0.0) and about 1.52x faster than the replay reference, with
best measured row 184.05 us.UR_RESULT_ERROR_DEVICE_LOST near the end of capture.Conclusion:
160 us layer
target needed to get comfortably past 100 tok/s without help from another
stackable optimization.Tested removing the explicit act_output.contiguous() handoff before GEMM2 in
the W8A8 MoE path after route replay showed a small exact speed improvement.
Command label:
prefill-safe-int8-no-act-contiguous-smokeArtifacts:
data/qwen36-ablation-prefill-safe-int8-no-act-contiguous-smoke-summary-20260615nocontig1.jsondata/qwen36-ablation-prefill-safe-int8-no-act-contiguous-smoke-p512o512-20260615nocontig1.jsondata/qwen36-ablation-prefill-safe-int8-no-act-contiguous-smoke-json-repeat32-20260615nocontig1.jsondata/qwen36-ablation-prefill-safe-int8-no-act-contiguous-smoke-color-repeat32-20260615nocontig1.jsonResult:
94.1136 tok/s.10.6255 ms/token.3/32; output was valid JSON but answered
{"answer":"12","unit":"widgets"} instead of 42.32/32.Conclusion:
Tested exact greedy sampler substitutions under the current accepted identity while keeping PIECEWISE forced-comm graph, prefill-only GDN fallback, prefill graph replay disabled, and INT8 mixed MoE workspace.
Artifacts:
max sampler summary:
data/qwen36-ablation-prefill-safe-max-sampler-int8-mixed-workspace-async-smoke-summary-20260615maxsafe1.jsondata/qwen36-ablation-prefill-safe-fp32-topk-fastpath-int8-mixed-workspace-async-smoke-summary-20260615fp32topkfast1.jsonResult:
torch.max path: 98.4505 tok/s corrected, but rejected. JSON failed at
repeat 3/64 with {"answer":"12","unit":"widgets"}; color failed at
repeat 56/128.88.5245 tok/s,
JSON failed at repeat 3/64, and color failed at repeat 91/128.xpu_topk / xpu_topk_nocache / xpu_topk_sync variants remain
rejected because they fail JSON or color canaries even when speed is near
98 tok/s.Conclusion:
torch.topk fallback as the sampler correctness anchor.Retested the fused prologue offset path after adding a capture guard and explicit allow-capture flag.
Artifacts:
data/qwen36-ablation-prefill-safe-int8-fused-prologue-offset-capture-smoke-20260615prolcap2.logReduced repro evidence:
xpu_fused_moe with prologue + INT8 grouped GEMM + gather captures
and replays.Endpoint result:
VLLM_XPU_INT8_MOE_FUSED_PROLOGUE_OFFSET=1 and
VLLM_XPU_INT8_MOE_FUSED_PROLOGUE_OFFSET_ALLOW_CAPTURE=1 still fails during
PIECEWISE graph capture at 14/15, on Worker_TP3, with
UR_RESULT_ERROR_DEVICE_LOST.Conclusion:
Extended scripts/check-qwen36-w8a8-middle-layerlet.py with a
rows-per-expert grouped-GEMM oracle and a model-shaped TP4 decode case. The
new case uses 256 experts, hidden size 2048, intermediate size 128, and eight
selected experts with all other experts receiving zero rows.
Run:
STAMP=20260615realparity2 \
/home/steve/.venvs/vllm-xpu/bin/python \
scripts/check-qwen36-w8a8-middle-layerlet.py \
--graph-replay --require-graph \
--json-out data/qwen36-w8a8-middle-layerlet-realrows-check-20260615realparity2.json \
--md-out data/qwen36-w8a8-middle-layerlet-realrows-check-20260615realparity2.md
Artifacts:
data/qwen36-w8a8-middle-layerlet-realrows-check-20260615realparity2.jsondata/qwen36-w8a8-middle-layerlet-realrows-check-20260615realparity2.mdResult:
qwen36_decode_one_token_tp4_shape, passed eager and
XPU graph replay.0 diff.0 diff.0; quant scales diff: 0; q output exact.Interpretation:
Bounded endpoint retry:
STAMP=20260615prolc1cap1 \
PORT=18126 BASE_URL=http://127.0.0.1:18126 \
CACHE_LABEL=qwen36-ablation-prefill-safe-int8-prologue-c1capture-smoke \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE","cudagraph_capture_sizes":[1],"max_cudagraph_capture_size":1}' \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=1 \
VLLM_XPU_W8A8_USE_OFFSETS=1 \
VLLM_XPU_W8A8_OFFSETS_PREFIX_OP=1 \
VLLM_XPU_MOE_W8A8_MIDDLE_LAYERLET=1 \
VLLM_XPU_INT8_MOE_FUSED_PROLOGUE_OFFSET=1 \
VLLM_XPU_INT8_MOE_FUSED_PROLOGUE_OFFSET_ALLOW_CAPTURE=1 \
METRICS_REPEATS=1 JSON_REPEATS=16 COLOR_REPEATS=16 ABLATION_RUN_QUALITY=0 \
bash scripts/run-qwen36-ablation-candidate.sh \
prefill-safe-int8-prologue-c1capture-smoke
Result:
data/qwen36-ablation-prefill-safe-int8-prologue-c1capture-smoke-20260615prolc1cap1.logUR_RESULT_ERROR_DEVICE_LOST on TP1/TP2 during PIECEWISE graph
capture size 1, while the worker was preparing the next dummy-run
logit_indices_device tensor.Decision:
Retested unsuppressed oracle k=1 under the current graph-safe identity with PIECEWISE forced-comm graph, noop comm capture, prefill-safe GDN, prefill graph replay disabled, top-k sampler fallback, INT8 mixed workspace, and async scheduling.
Artifacts:
data/qwen36-oracle-k1-graph-safe-candidate-20260615graphsafe1.jsondata/qwen36-oracle-k1-graph-safe-spec-summary-20260615graphsafe1.jsondata/qwen36-oracle-graph-safe-k1-fixture-20260615graphsafe1.mddata/qwen36-oracle-k1-graph-safe-20260615a.logResult:
15 accepted tokens, 1 rejected token, 93.75%
acceptance across 16 trace rows.replacement_after_reject and
verifier_bonus_after_full_accept.natural_latency_plan produced memory where the no-spec accepted trace had
hardware; repetitive_kernel_notes produced PU where the no-spec
accepted trace had unique.Conclusion:
Follow-up all-serial GDN diagnostic:
qwen36-oracle-k1-graph-gdnserial-20260615adata/qwen36-oracle-k1-graph-gdnserial-20260615a.logdata/qwen36-oracle-k1-graph-gdnserial-20260615a-spec.jsonldata/qwen36-oracle-k1-graph-gdnserial-20260615a-oracle-draft.jsonlResult:
4 spec trace rows and 20 oracle-draft rows
before the trace client timed out.TimeoutError: RPC call to sample_tokens timed out.SIGKILL; the cards were verified clear afterward with xpu-smi ps.Conclusion:
Retested unsuppressed oracle k=1 with the same graph-safe identity but forced
--no-async-scheduling.
Artifacts:
data/qwen36-oracle-k1-graph-noasync-candidate-20260615noasync1.jsondata/qwen36-oracle-k1-graph-noasync-spec-summary-20260615noasync1.jsondata/qwen36-oracle-graph-noasync-k1-fixture-20260615noasync1.mddata/qwen36-oracle-graph-noasync-k1-gate-summary-20260615noasync1.jsondata/qwen36-oracle-k1-graph-noasync-20260615a.logResult:
15 accepted tokens, 1
rejected token, 93.75% acceptance.hardware -> memory after a rejected draft and unique -> PU on the
verifier bonus after a fully accepted draft.Conclusion:
Retested unsuppressed oracle k=1 with ENABLE_XPU_GRAPH=0, --enforce-eager,
and --no-async-scheduling.
Artifacts:
data/qwen36-oracle-k1-eager-noasync-candidate-20260615eager1.jsondata/qwen36-oracle-k1-eager-noasync-spec-summary-20260615eager1.jsondata/qwen36-oracle-eager-noasync-k1-fixture-20260615eager1.mddata/qwen36-oracle-eager-noasync-k1-gate-summary-20260615eager1.jsondata/qwen36-oracle-k1-eager-noasync-20260615a.logResult:
replacement_after_reject and verifier_bonus_after_full_accept.unique, candidate emitted PU after accepting draft
token 1543.Arc instead of the graph run’s
memory.Conclusion:
VLLM_XPU_GDN_SERIAL_SPEC_DECODE=1 only
(no serial conv, no packed serial decode) to test whether the recurrent GDN
packed update is the drift source.Retested eager/no-graph/no-async oracle k=1 with only
VLLM_XPU_GDN_SERIAL_SPEC_DECODE=1.
Artifacts:
data/qwen36-oracle-k1-eager-serialrecur-candidate-20260615serialrecur1.jsondata/qwen36-oracle-k1-eager-serialrecur-spec-summary-20260615serialrecur1.jsondata/qwen36-oracle-eager-serialrecur-k1-fixture-20260615serialrecur1.mddata/qwen36-oracle-eager-serialrecur-k1-gate-summary-20260615serialrecur1.jsondata/qwen36-oracle-k1-eager-serialrecur-20260615a.logResult:
replacement_after_reject and verifier_bonus_after_full_accept.unique -> PU after accepting draft
token 1543.Conclusion:
VLLM_XPU_GDN_SERIAL_SPEC_DECODE=1 and
VLLM_XPU_GDN_SERIAL_SPEC_CONV=1, while leaving packed serial decode off.Retested eager/no-graph/no-async oracle k=1 with
VLLM_XPU_GDN_SERIAL_SPEC_DECODE=1 and
VLLM_XPU_GDN_SERIAL_SPEC_CONV=1, leaving packed serial decode off.
Artifacts:
data/qwen36-oracle-k1-eager-serialconv-candidate-20260615serialconv1.jsondata/qwen36-oracle-k1-eager-serialconv-spec-summary-20260615serialconv1.jsondata/qwen36-oracle-eager-serialconv-k1-fixture-20260615serialconv1.mddata/qwen36-oracle-eager-serialconv-k1-gate-summary-20260615serialconv1.jsondata/qwen36-oracle-k1-eager-serialconv-20260615a.logResult:
93.75% to 66.67% (4/6 accepted).replacement_after_reject; the previous
full-accept bonus mismatch disappeared only because the draft was no longer
accepted.Conclusion:
Regenerated the current graph/no-spec reference under the optimized fast-lane identity before continuing oracle k=1 work.
Identity:
/mnt/fast-ai/llm-cache/hf/models--nameistoken--Qwen3.6-35B-A3B-Quark-W8A8-INT8/snapshots/cced56592e8c8935f8220836b4baa04dfd389118TP=4, PP=1.COMPILATION_CONFIG={"cudagraph_mode":"PIECEWISE","max_cudagraph_capture_size":128},
XPU_GRAPH=1, VLLM_XPU_ENABLE_XPU_GRAPH=1,
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1,
VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1.VLLM_XPU_GDN_NATIVE_FALLBACK=prefill,
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1,
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1.VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1,
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1.GPU_MEMORY_UTILIZATION=0.90,
VLLM_EXTRA_ARGS=--uvicorn-log-level warning.Artifacts:
data/qwen36-nospec-graph-current-ref-candidate-20260615graphref1.jsondata/qwen36-nospec-graph-current-ref-candidate-20260615graphref2nolog.jsondata/qwen36-nospec-graph-current-ref-20260615a.logResult:
data/qwen36-quark-int8-tp4-accepted-restored-current-oracle-baseline-20260612i.json
token fixture.natural_latency_plan: first diff output index 17;
current token pair 4779,6044 (memory management) versus old fixture
11436,29796 (hardware acceleration).repetitive_kernel_notes: first diff output index 14;
current token 6126 (PU) versus old fixture 4752 ( unique).Conclusion:
data/qwen36-nospec-graph-current-ref-candidate-20260615graphref2nolog.json
as ORACLE_TRACE and as the accepted comparison file.Reran graph oracle k=1 against the fresh current no-spec graph reference:
data/qwen36-nospec-graph-current-ref-candidate-20260615graphref2nolog.jsondata/qwen36-oracle-k1-graph-currentref-candidate-20260615currentreforacle1.jsondata/qwen36-oracle-k1-graph-currentref-spec-summary-20260615currentreforacle1.jsondata/qwen36-oracle-graph-currentref-k1-spec-replay-20260615currentreforacle1.jsondata/qwen36-oracle-graph-currentref-k1-fixture-20260615currentreforacle1.mddata/qwen36-oracle-graph-currentref-k1-gate-summary-20260615currentreforacle1.jsonResult:
29/30 draft rows accepted (96.67%).natural_latency_plan: first mismatch at output index 40.
No-spec token 29541 ( reliability) versus spec token 4779
( memory). Replay role: verifier_bonus_after_full_accept.repetitive_kernel_notes: first mismatch at output index 19.
No-spec token 271 (newline) versus spec token 4618 ( graph).
Replay role: replacement_after_reject.Conclusion:
VLLM_XPU_GDN_SPEC_ACCEPTED_DRAFT_ONLY are unlikely to fix the first bonus
row because that logit is produced inside the same forward pass. They may
still be useful for the replacement-after-reject tail after the bonus row is
fixed.Retested the opt-in XPU shared-expert overlap path after changing it from a per-layer stream allocation to a process-global aux stream.
Patch state:
vllm/model_executor/layers/fused_moe/runner/shared_experts.py now keeps a
process-global XPU aux stream behind VLLM_XPU_SHARED_EXPERTS_STREAM=1.vllm/envs.py registers VLLM_XPU_SHARED_EXPERTS_STREAM.Run:
STAMP=20260615xpusharedglobal1 \
PORT=18120 \
CACHE_LABEL=qwen36-ablation-native-decode-safe-prefill-graph \
XPU_GRAPH=1 \
VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 \
VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' \
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill \
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1 \
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1 \
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1 \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
VLLM_XPU_SHARED_EXPERTS_STREAM=1 \
GPU_MEMORY_UTILIZATION=0.90 \
VLLM_EXTRA_ARGS='--uvicorn-log-level warning' \
METRICS_REPEATS=1 JSON_REPEATS=16 COLOR_REPEATS=16 ABLATION_RUN_QUALITY=0 \
bash scripts/run-qwen36-ablation-candidate.sh \
prefill-safe-int8-mixed-workspace-async-xpu-shared-stream-global-smoke
Artifact:
data/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-xpu-shared-stream-global-smoke-20260615xpusharedglobal1.logResult:
RuntimeError: wait method cannot be used for an event associated with a command graph.Decision:
Retested the dirty block-table commit patch on top of the current validated
fast research identity (prefill-safe-int8-mixed-workspace-async-deep-gate).
This was a controlled stack attempt, not a new code change to the model path.
Run:
STAMP=20260615dirtycur1 \
PORT=18121 \
CACHE_LABEL=qwen36-ablation-prefill-safe-int8-mixed-workspace-async-deep-gate \
XPU_GRAPH=1 \
VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 \
VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' \
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill \
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1 \
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1 \
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1 \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
VLLM_XPU_METADATA_COPY_ALLOW=1 \
VLLM_XPU_BLOCK_TABLE_DIRTY_COMMIT=1 \
VLLM_XPU_BLOCK_TABLE_DIRTY_COMMIT_LOG_EVERY=256 \
GPU_MEMORY_UTILIZATION=0.90 \
VLLM_EXTRA_ARGS='--uvicorn-log-level warning' \
METRICS_REPEATS=2 JSON_REPEATS=128 COLOR_REPEATS=256 \
ABLATION_RUN_QUALITY=1 QUALITY_REPEAT_RUNS=8 QUALITY_LONG_CONTEXT_TOKENS=4096 \
bash scripts/run-qwen36-ablation-candidate.sh \
prefill-safe-int8-mixed-workspace-async-dirtyblock-deep-gate
Artifacts:
data/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-dirtyblock-deep-gate-summary-20260615dirtycur1.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-dirtyblock-deep-gate-20260615dirtycur1.logResult:
RuntimeError: level_zero backend failed with error: 20 (UR_RESULT_ERROR_DEVICE_LOST)
during block_table.copy_to_gpu(num_reqs) inside
_commit_dirty_block_table on the first scheduled request.Decision:
Re-ran the timing trace under the exact current validated research identity
(prefill-safe-int8-mixed-workspace-async-deep-gate): PIECEWISE forced/noop
graph, prefill-only GDN native fallback, prefill recurrent fallback, prefill
graph replay disabled, top-k sampler fallback, INT8 mixed MoE workspace, async
enabled, and GPU_MEMORY_UTILIZATION=0.90.
Run:
STAMP=20260615nexttiming1 \
PORT=18123 BASE_URL=http://127.0.0.1:18123 \
CACHE_LABEL=qwen36-ablation-prefill-safe-int8-mixed-workspace-async-deep-gate \
XPU_GRAPH=1 VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' \
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill \
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1 \
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1 \
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1 \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
VLLM_EXTRA_ARGS='--uvicorn-log-level warning' \
PROMPT_TOKENS=512 OUTPUT_TOKENS=256 METRICS_REPEATS=1 RUN_CANARIES=0 \
bash scripts/run-qwen36-decisive-timing.sh current-safe-decisive-timing-next1
Artifacts:
data/qwen36-current-safe-decisive-timing-next1-run-summary-20260615nexttiming1.jsondata/qwen36-current-safe-decisive-timing-next1-timing-decision-20260615nexttiming1.mddata/qwen36-current-safe-decisive-timing-next1-timing-summary-20260615nexttiming1.jsonResult:
95.0788 tok/s for p512/o256. This is not a
promoted quality result; use it only as timing evidence.moe, next target
persistent_w8a8_moe_layerlet.moe_forward_shared.custom_op,
moe.quant_method_total, and moe.shared_experts.apply_no_overlap;
top collective timing stayed around 0.071 ms.Decision:
VLLM_XPU_INT8_MOE_PERSISTENT_SCRATCH=1, to reuse per-layer W8A8 MoE
scratch tensors for c1 decode without changing kernel math or the scratch
ABI. This is a small persistence step, not the final layerlet.Implemented a default-off VLLM_XPU_INT8_MOE_PERSISTENT_SCRATCH=1 candidate
in vllm/model_executor/layers/fused_moe/experts/xpu_moe.py. The change keeps
the existing xpu_fused_moe kernel ABI and math unchanged, but reuses
per-layer c1 decode scratch tensors instead of taking fresh views from the
global workspace manager on every call. It is registered in vllm/envs.py.
Run:
STAMP=20260615persist1 \
PORT=18124 BASE_URL=http://127.0.0.1:18124 \
CACHE_LABEL=qwen36-ablation-prefill-safe-int8-persistent-scratch-async-smoke \
XPU_GRAPH=1 VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' \
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill \
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1 \
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1 \
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1 \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
VLLM_XPU_INT8_MOE_PERSISTENT_SCRATCH=1 \
GPU_MEMORY_UTILIZATION=0.90 \
VLLM_EXTRA_ARGS='--uvicorn-log-level warning' \
METRICS_REPEATS=2 JSON_REPEATS=32 COLOR_REPEATS=32 ABLATION_RUN_QUALITY=0 \
bash scripts/run-qwen36-ablation-candidate.sh \
prefill-safe-int8-persistent-scratch-async-smoke
Artifacts:
data/qwen36-ablation-prefill-safe-int8-persistent-scratch-async-smoke-summary-20260615persist1.jsondata/qwen36-ablation-prefill-safe-int8-persistent-scratch-async-smoke-p512o512-20260615persist1.jsondata/qwen36-ablation-prefill-safe-int8-persistent-scratch-async-smoke-json-repeat32-20260615persist1.jsondata/qwen36-ablation-prefill-safe-int8-persistent-scratch-async-smoke-color-repeat32-20260615persist1.jsonResult:
92.9897 tok/s, slower than the current validated base
(93.5505 tok/s).32/32.32/32.Decision:
Added an env-gated diagnostic around the FLA/GDN speculative final-state store path in:
/home/steve/src/vllm/vllm/model_executor/layers/fla/ops/fused_recurrent.py/home/steve/src/vllm/vllm/model_executor/layers/fla/ops/fused_sigmoid_gating.pyThe safe default remains accepted-only state stores:
VLLM_XPU_GDN_SPEC_STORE_ACCEPTED_ONLY=1
Diagnostic attempt:
qwen36-oracle-k1-storeall-20260615VLLM_XPU_GDN_SPEC_STORE_ACCEPTED_ONLY=0Result:
UR_RESULT_ERROR_DEVICE_LOST during block_table.copy_to_gpu().Decision:
Parameterized the accepted launcher with TP_SIZE while keeping the default
at 4, so topology checks can reuse the same ablation harness without changing
existing TP4 behavior.
Run:
STAMP=20260615tp2safe1 \
PORT=18125 BASE_URL=http://127.0.0.1:18125 \
CACHE_LABEL=qwen36-ablation-prefill-safe-int8-mixed-workspace-async-tp2-smoke \
TP_SIZE=2 ONEAPI_DEVICE_SELECTOR=level_zero:0,1 ZE_AFFINITY_MASK=0,1 \
XPU_GRAPH=1 VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' \
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill \
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1 \
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1 \
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1 \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
GPU_MEMORY_UTILIZATION=0.90 MAX_NUM_SEQS=24 \
VLLM_EXTRA_ARGS='--uvicorn-log-level warning' \
METRICS_REPEATS=1 JSON_REPEATS=16 COLOR_REPEATS=16 ABLATION_RUN_QUALITY=0 \
bash scripts/run-qwen36-ablation-candidate.sh \
prefill-safe-int8-mixed-workspace-async-tp2-smoke
Artifacts:
data/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-tp2-smoke-summary-20260615tp2safe1.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-tp2-smoke-p512o512-20260615tp2safe1.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-tp2-smoke-json-repeat16-20260615tp2safe1.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-tp2-smoke-color-repeat16-20260615tp2safe1.jsonResult:
85.8691 tok/s.11.6458 ms/token.16/16.16/16.16.88 GiB per rank.Decision:
93.5505 tok/s).Built a reduced TP4 reproducer for the prologue-inclusive W8A8 MoE decode stack:
/home/steve/.venvs/vllm-xpu/bin/python \
scripts/repro-qwen36-prologue-tp4-capture.py \
--captures 15 --layers-per-capture 40 --distinct-layers --replays 1 \
--json-out data/qwen36-prologue-tp4-capture-repro-20260615tp4proldistinct15.json \
--md-out data/qwen36-prologue-tp4-capture-repro-20260615tp4proldistinct15.md
Artifacts:
data/qwen36-prologue-tp4-capture-repro-20260615tp4prolrepro1.jsondata/qwen36-prologue-tp4-capture-repro-20260615tp4prolrepro15.jsondata/qwen36-prologue-tp4-capture-repro-20260615tp4proldistinct1.jsondata/qwen36-prologue-tp4-capture-repro-20260615tp4proldistinct15.jsonResult:
fused_moe_prologue,
per_token_quant_int8_xpu_out, qwen36_moe_w8a8_middle_layerlet, and a
post-capture CPU-to-XPU dummy tensor copy.UR_RESULT_ERROR_DEVICE_LOST.Endpoint follow-up:
STAMP=20260615pprolc1 \
PORT=18126 BASE_URL=http://127.0.0.1:18126 \
CACHE_LABEL=qwen36-ablation-prefill-safe-int8-persistent-prologue-c1capture-smoke \
XPU_GRAPH=1 VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE","cudagraph_capture_sizes":[1],"max_cudagraph_capture_size":1}' \
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill \
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1 \
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1 \
VLLM_XPU_GREEDY_SAMPLE_TOPK_FALLBACK=1 \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
VLLM_XPU_INT8_MOE_PERSISTENT_SCRATCH=1 \
VLLM_XPU_W8A8_EXPERIMENTAL_ALLOW=1 \
VLLM_XPU_W8A8_USE_OFFSETS=1 \
VLLM_XPU_W8A8_OFFSETS_PREFIX_OP=1 \
VLLM_XPU_MOE_W8A8_MIDDLE_LAYERLET=1 \
VLLM_XPU_INT8_MOE_FUSED_PROLOGUE_OFFSET=1 \
VLLM_XPU_INT8_MOE_FUSED_PROLOGUE_OFFSET_ALLOW_CAPTURE=1 \
GPU_MEMORY_UTILIZATION=0.90 \
VLLM_EXTRA_ARGS='--uvicorn-log-level warning' \
METRICS_REPEATS=1 JSON_REPEATS=16 COLOR_REPEATS=16 ABLATION_RUN_QUALITY=0 \
bash scripts/run-qwen36-ablation-candidate.sh \
prefill-safe-int8-persistent-prologue-c1capture-smoke
Result:
UR_RESULT_ERROR_DEVICE_LOST during PIECEWISE graph capture size 1, at the
logit_indices_device = torch.from_numpy(logit_indices).to(...) copy.Decision:
Added two default-off diagnostics:
xpu_topk_sync now synchronizes after the int32-to-int64 sampled-token
conversion, so the returned LongTensor is covered by the sync.VLLM_XPU_SYNC_SAMPLER_TOKENS=1 broadcasts normal sampler outputs from TP
first rank before next-input state, reusing the local-argmax sync helper.Tested them together under the current safe identity:
STAMP=20260615samptpsync1 \
PORT=18127 BASE_URL=http://127.0.0.1:18127 \
CACHE_LABEL=qwen36-ablation-prefill-safe-xpu-topk-sync-tpsampled-int8-mixed-workspace-async-smoke \
XPU_GRAPH=1 VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' \
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill \
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1 \
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1 \
VLLM_XPU_GREEDY_SAMPLE_XPU_FALLBACK=xpu_topk_sync \
VLLM_XPU_SYNC_SAMPLER_TOKENS=1 \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
GPU_MEMORY_UTILIZATION=0.90 \
VLLM_EXTRA_ARGS='--uvicorn-log-level warning' \
METRICS_REPEATS=1 JSON_REPEATS=32 COLOR_REPEATS=128 ABLATION_RUN_QUALITY=0 \
bash scripts/run-qwen36-ablation-candidate.sh \
prefill-safe-xpu-topk-sync-tpsampled-int8-mixed-workspace-async-smoke
Artifact:
data/qwen36-ablation-prefill-safe-xpu-topk-sync-tpsampled-int8-mixed-workspace-async-smoke-20260615samptpsync1.logResult:
UR_RESULT_ERROR_DEVICE_LOST during
block_table.copy_to_gpu() in the next _prepare_inputs call, with the
async output copy thread also failing while synchronizing the copy-ready
event.Decision:
VLLM_XPU_SYNC_SAMPLER_TOKENS=1 in accepted or promotion runs.xpu_topk_sync with the post-conversion
sync but without TP broadcast; if that still fails the previous canary window,
stop sampler swaps and return to MoE structural or oracle-parity work.Tested the remaining sampler-only probe: xpu_topk_sync with synchronization
after the returned LongTensor conversion, but without TP sampled-token
broadcast.
Run:
STAMP=20260615samppostlong1 \
PORT=18128 BASE_URL=http://127.0.0.1:18128 \
CACHE_LABEL=qwen36-ablation-prefill-safe-xpu-topk-sync-postlong-int8-mixed-workspace-async-smoke \
XPU_GRAPH=1 VLLM_XPU_ENABLE_XPU_GRAPH=1 \
VLLM_XPU_FORCE_GRAPH_WITH_COMM=1 VLLM_XPU_GRAPH_NOOP_COMM_CAPTURE=1 \
COMPILATION_CONFIG='{"cudagraph_mode":"PIECEWISE"}' \
VLLM_XPU_GDN_NATIVE_FALLBACK=prefill \
VLLM_XPU_GDN_PREFILL_RECURRENT_FALLBACK=1 \
VLLM_XPU_DISABLE_PREFILL_CUDAGRAPH_REPLAY=1 \
VLLM_XPU_GREEDY_SAMPLE_XPU_FALLBACK=xpu_topk_sync \
VLLM_XPU_INT8_MOE_MIXED_WORKSPACE=1 \
GPU_MEMORY_UTILIZATION=0.90 \
VLLM_EXTRA_ARGS='--uvicorn-log-level warning' \
METRICS_REPEATS=1 JSON_REPEATS=32 COLOR_REPEATS=128 ABLATION_RUN_QUALITY=0 \
bash scripts/run-qwen36-ablation-candidate.sh \
prefill-safe-xpu-topk-sync-postlong-int8-mixed-workspace-async-smoke
Artifacts:
data/qwen36-ablation-prefill-safe-xpu-topk-sync-postlong-int8-mixed-workspace-async-smoke-summary-20260615samppostlong1.jsondata/qwen36-ablation-prefill-safe-xpu-topk-sync-postlong-int8-mixed-workspace-async-smoke-p512o512-20260615samppostlong1.jsondata/qwen36-ablation-prefill-safe-xpu-topk-sync-postlong-int8-mixed-workspace-async-smoke-json-repeat32-20260615samppostlong1.jsondata/qwen36-ablation-prefill-safe-xpu-topk-sync-postlong-int8-mixed-workspace-async-smoke-color-repeat128-20260615samppostlong1.jsonResult:
94.8247 tok/s.3/32.91/128.Decision:
topk fallback as the only validated greedy
sampler path.Date: 2026-06-15
Purpose:
Accepted safe reference:
data/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-deep-gate-summary-20260615a13deep2.json93.5505 tok/s.10.6899 ms/token.Isolation results:
prefill-safe-int8-layerlet-noprolog-directsync
data/qwen36-ablation-prefill-safe-int8-layerlet-noprolog-directsync-summary-20260615layerletnoprologsync1.jsonprefill-safe-int8-layerlet-noprolog-smoke
data/qwen36-ablation-prefill-safe-int8-layerlet-noprolog-smoke-summary-20260615layerletnoprologsmoke1.json86.8206 tok/s.11.5236 ms/token.exact.arithmetic.prefill-safe-int8-prologue-nopersist-directsync
data/qwen36-ablation-prefill-safe-int8-prologue-nopersist-directsync-20260615prologenopersistds1.logdata/qwen36-prologue-nopersist-directsync-trace-r*-20260615prologenopersistds1.jsonlsubmod_2) started and failed at direct sync.prefill-safe-int8-prologue-nolayerlet-directsync
data/qwen36-ablation-prefill-safe-int8-prologue-nolayerlet-directsync-20260615prologenolayerletds1.logdata/qwen36-prologue-nolayerlet-directsync-trace-r*-20260615prologenolayerletds1.jsonlsubmod_2 device loss without the middle layerlet.scripts/repro-qwen36-prologue-tp4-capture.py--topk-dtype, --prewarm-rows, --prewarm-repeats.data/qwen36-prologue-tp4-capture-repro-int64-prewarm8192-20260615a.jsonCompiled segment mapping:
/mnt/fast-ai/vllm-cache-exp/qwen36-ablation-prefill-safe-int8-prologue-nopersist-directsync/vllm/torch_compile_cache/890f183398/rank_0_0/backbone/computation_graph.pysubmod_2 contains layer 0 GDN output projection/allreduce,
post-attention RMSNorm, torch.ops.vllm.moe_forward_shared(...), MoE output
combine, allreduce, and the beginning of layer 1 GDN input projection.Decision:
VLLM_XPU_INT8_MOE_FUSED_PROLOGUE_OFFSET=1 rejected/default-off for
endpoint work.submod_2
device-loss failure.Machine cleanup:
VLLM::Worker_TP processes from the failed device-loss run were
killed.xpu-smi ps then showed no live vLLM process.xpu-smi dump reported about 26-44 MiB used per card and no throttling.Rejected/invalid result:
prefill-safe-int8-mixed-workspace-maxseq1-smoke failed before readiness
because stale failed-run state left cards with too little free memory.
This is not a valid MAX_NUM_SEQS=1 performance result and must not be
compared.Date: 2026-06-15
Purpose:
Accepted no-spec trace:
data/qwen36-oracle-accepted-current-20260615oraclefresh1.jsondata/qwen36-oracle-accepted-current-20260615oraclefresh1.lognatural_latency_plan and repetitive_kernel_notes
produced 128 output tokens.N-gram k=1 candidate:
data/qwen36-oracle-ngram1-current-20260615oraclefresh1.logdata/qwen36-oracle-ngram1-current-20260615oraclefresh1.jsonlUR_RESULT_ERROR_DEVICE_LOST during PIECEWISE graph capture.21/27 graph capture sizes completed or in
progress before the failure.Decision:
Date: 2026-06-15
Purpose:
Baseline:
data/qwen36-oracle-accepted-current-20260615oraclefresh1.jsonprefill-safe-int8-mixed-workspace-async-deep-gate,
93.5505 tok/s, full deep quality gate passed.Candidate:
{"cudagraph_mode":"PIECEWISE","cudagraph_capture_sizes":[1,2,4],"max_cudagraph_capture_size":4}data/qwen36-oracle-ngram1-c1capture-20260615oraclec1cap2.jsondata/qwen36-oracle-ngram1-c1capture-20260615oraclec1cap2.jsonldata/qwen36-oracle-current-ngram1-c1capture-gate-summary-20260615oraclec1cap2.jsonResult:
34 draft tokens, 31 accepted, 3 rejected,
91.18% acceptance.natural_latency_plan first diverged at the verifier bonus after a
full-accept row: accepted token 11436 ( hardware) versus candidate token
321 ( and) after reliability gates,.repetitive_kernel_notes stopped after only three tokens and emitted a
ChatML/special-token-looking sequence. This is also rejected and should not
be used for speed claims.Conclusion:
100 tok/s, but the current implementation is not parity safe.Date: 2026-06-15
Purpose:
Candidate:
VLLM_XPU_GDN_SPEC_ACCEPTED_DRAFT_ONLY=1data/qwen36-oracle-ngram1-c1capture-adraftonly-20260615adraft1.jsondata/qwen36-oracle-ngram1-c1capture-adraftonly-20260615adraft1.jsonldata/qwen36-oracle-ngram1-c1capture-adraftonly-spec-summary-20260615adraft1.jsondata/qwen36-oracle-current-ngram1-c1capture-adraftonly-gate-summary-20260615adraft1.jsonResult:
43/112 draft tokens, 38.39%.natural_latency_plan diverged at output index 7, where the accepted
output continued Focus ... but the candidate entered a <think> section.repetitive_kernel_notes diverged at output index 3, also entering a
<think> section.Decision:
VLLM_XPU_GDN_SPEC_ACCEPTED_DRAFT_ONLY=1 as a route to the current
oracle k=1 parity fix. It is at best a later state-copy diagnostic, not the
verifier-bonus repair.num_computed_tokens, num_accepted_tokens, logits
indices/roles, and GDN state indices for each target/draft/bonus row.Date: 2026-06-15
Purpose:
GPU_MEMORY_UTILIZATION from 0.90 to 0.95 improves
the accepted safe baseline without changing model quality.Baseline:
prefill-safe-int8-mixed-workspace-async-deep-gate93.5505 tok/s corrected output mean.Candidate:
prefill-safe-int8-mixed-workspace-async-gmem95-deep-gateGPU_MEMORY_UTILIZATION=0.95data/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-gmem95-deep-gate-p512o512-20260615gmem95deep1.json
data/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-gmem95-deep-gate-json-repeat128-20260615gmem95deep1.json
data/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-gmem95-deep-gate-20260615gmem95deep1.logResult:
93.1948 tok/s.10.7307 ms/token.189.3772 ms.Decision:
GPU_MEMORY_UTILIZATION=0.95 for the current safe lane. It is slower
than the accepted 0.90 baseline and has no reason to spend deeper quality
time.Date: 2026-06-15
Purpose:
Correct comparison identity:
COMPILE_CONFIG={"cudagraph_mode":"PIECEWISE","cudagraph_capture_sizes":[1,2,4],"max_cudagraph_capture_size":4}
with VLLM_EXTRA_ARGS=--no-async-scheduling and no speculative config.data/qwen36-nospec-smallcap-current-candidate-20260615nospecsmall1.jsongraphref2 trace because
graphref2 used a different capture identity. Do not use graphref2 as the
oracle for current small-capture spec rows.Current oracle k=1 small-capture result:
data/qwen36-oracle-k1-current-candidate-20260615speccurrent4b.jsondata/qwen36-oracle-k1-current-20260615speccurrent4b-spec.jsonldata/qwen36-oracle-k1-current-speccurrent4b-spec-summary-20260615.json17: no-spec emits
11436 ( hardware) after reliability gates,, while oracle k=1 emits
321 ( and).Decision:
17, including token IDs, positions, slot IDs,
num_tokens_no_spec, num_computed_tokens, logits top-k, and GDN state
indices.Date: 2026-06-15
Purpose:
VLLM_XPU_GDN_SERIAL_SPEC_DECODE=1 fixes the current
small-capture oracle k=1 verifier bonus mismatch.Candidate:
VLLM_XPU_GDN_SERIAL_SPEC_DECODE=1data/qwen36-oracle-k1-current-candidate-20260615serialcurrent1.jsondata/qwen36-oracle-k1-current-20260615serialcurrent1-spec.jsonldata/qwen36-oracle-k1-current-serialcurrent1-spec-summary-20260615.jsonResult:
17: candidate emits
321 ( and) where no-spec emits 11436 ( hardware).10.98/105, 93.33%), but high acceptance is useless
until token parity passes.Decision:
Date: 2026-06-16
Purpose:
Clean no-spec microscope:
data/qwen36-nospec-smallcap-micro-candidate-20260616micro1.jsondata/qwen36-nospec-smallcap-micro-20260616micro1-replay-r0.jsonlCOMPILE_CONFIG={"cudagraph_mode":"PIECEWISE","cudagraph_capture_sizes":[1,2,4],"max_cudagraph_capture_size":4},
no speculative config, VLLM_EXTRA_ARGS=--no-async-scheduling.Clean oracle k=1 microscope:
data/qwen36-oracle-k1-smallcap-micro-candidate-20260616micro1.jsondata/qwen36-oracle-k1-smallcap-micro-20260616micro1-replay-r0.jsonldata/qwen36-oracle-k1-smallcap-micro-20260616micro1-spec.jsonldata/qwen36-oracle-k1-smallcap-micro-spec-summary-20260616micro1.jsonFinding:
17: no-spec emits 11436
( hardware), oracle k=1 emits 321 ( and).input_id=33389,
position=517, draft_token_id=11, and correctly accepts token 11.input_id=11, position=518,
num_tokens_no_spec_cpu=518, num_computed_tokens_cpu=517,
num_accepted_tokens_cpu=2, and top-1 321.input_id=11, position=518,
num_computed_tokens_cpu=518, and top-1 11436.GDN row trace:
data/qwen36-oracle-k1-smallcap-gdntrace-candidate-20260616gdn1.jsondata/qwen36-oracle-k1-smallcap-gdntrace-20260616gdn1-gdn-r0.jsonldata/qwen36-oracle-k1-smallcap-gdntrace-20260616gdn1-replay-r0.jsonl17.num_accepted_tokens=[2], stateidx=[1,2], and
qsl=[0,2] around the failing window. More precise no-spec-vs-spec
per-layer alignment is still needed before a kernel-level fix.Decision:
Date: 2026-06-16
Purpose:
spec_pos==0 from spec_state_indices[:,0]; for a continuing
request the real running state is spec_state_indices[:,num_accepted-1].Patch:
vllm/model_executor/layers/mamba/gdn_linear_attn.pyVLLM_XPU_GDN_SERIAL_SPEC_CONV=1, copy the previously accepted
convolution state slot into the first target slot before serial target/bonus
conv updates.VLLM_XPU_GDN_SERIAL_SPEC_DECODE=1, copy the previously accepted
recurrent state slot into the first target slot before serial target/bonus
recurrent updates.py_compile passed.Candidate:
VLLM_XPU_GDN_SERIAL_SPEC_DECODE=1,
VLLM_XPU_GDN_SERIAL_SPEC_CONV=1, and
VLLM_XPU_GDN_SERIAL_SPEC_PACKED_DECODE=1.data/qwen36-oracle-k1-serialfixed-smallcap-candidate-20260616fix1.jsondata/qwen36-oracle-k1-serialfixed-smallcap-20260616fix1-replay-r0.jsonldata/qwen36-oracle-k1-serialfixed-smallcap-20260616fix1-spec.jsonldata/qwen36-oracle-k1-serialfixed-smallcap-spec-summary-20260616fix1.jsonResult:
17: no-spec emits 11436,
candidate emits 321.12 in the
unpatched small-capture oracle to output index 19; this proves the patched
serial state-start matters, but it is not sufficient.93.75%, but runtime was extremely slow (~2 generation
tok/s in server logs), so this is not a performance candidate.Decision:
Date: 2026-06-16
Purpose:
Artifacts:
data/qwen36-oracle-k2-draftsonly-noskip-candidate-20260616m4.jsondata/qwen36-oracle-k2-draftsonly-noskip-20260616m4-spec.jsonldata/qwen36-oracle-k2-draftsonly-suppressrepl-candidate-20260616m7.jsondata/qwen36-oracle-k2-draftsonly-suppressrepl-20260616m7-spec.jsonldata/qwen36-oracle-k2-draftsonly-suppressrepl2-20260616m8-spec.jsonlResult:
321 where the no-spec
baseline emitted 11436.num_tokens == num_computed_tokens and no visible output placeholder to
force the next one-token recovery step.Decision:
Date: 2026-06-16
Purpose:
block_table.copy_to_gpu(num_reqs).Patch:
vllm/v1/worker/block_table.pyscripts/check-qwen36-block-table-dirty-commit.pyLocal validation:
py_compile passed for both files.data/qwen36-block-table-dirty-rangecopy-check-20260616a.jsonEndpoint smoke identity:
GPU_MEMORY_UTILIZATION=0.90.VLLM_XPU_METADATA_COPY_ALLOW=1,
VLLM_XPU_BLOCK_TABLE_DIRTY_COMMIT=1,
VLLM_XPU_BLOCK_TABLE_DIRTY_COMMIT_LOG_EVERY=128.Artifacts:
data/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-dirtyrange-smoke-summary-20260616dirtyrange1.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-dirtyrange-smoke-p512o512-20260616dirtyrange1.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-dirtyrange-smoke-json-repeat16-20260616dirtyrange1.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-dirtyrange-smoke-color-repeat16-20260616dirtyrange1.jsonResult:
94.6513 tok/s
(10.5647 ms/token).16/16.3/16: emitted
{"answer":"12","unit":"widgets"} instead of the expected answer.Decision:
Date: 2026-06-16
Purpose:
Artifacts:
data/qwen36-oracle-k2-recompute-row-preempt-candidate-20260616m18.json
and /tmp/qwen36-oracle-k2-recompute-row-preempt-20260616m18-debug-spec.jsonldata/qwen36-oracle-k2-bonuslog-candidate-20260616m19.json,
data/qwen36-oracle-k2-bonuslog-20260616m19-bonus-logits.jsonl, and
data/qwen36-oracle-k2-bonuslog-20260616m19-spec.jsonldata/qwen36-oracle-k2-marginbonus-20260616m20-server.logdata/qwen36-oracle-k2-marginbonus-candidate-20260616m21.json and
data/qwen36-oracle-k2-marginbonus-20260616m21-spec.jsonldata/qwen36-oracle-k2-marginbonus-preempt-candidate-20260616m23.json
and data/qwen36-oracle-k2-marginbonus-preempt-20260616m23-spec.jsonldata/qwen36-oracle-k2-marginbonus-recompute-row-candidate-20260616m24.json
and data/qwen36-oracle-k2-marginbonus-recompute-row-20260616m24-spec.jsonldata/qwen36-oracle-k2-gdnaccepted-marginbonus-preempt-candidate-20260616m25.json
and
data/qwen36-oracle-k2-gdnaccepted-marginbonus-preempt-20260616m25-spec.jsonldata/qwen36-oracle-k1-clean-candidate-20260616m26.json and
data/qwen36-oracle-k1-clean-20260616m26-spec.jsonlFindings:
[22188, 13], bonus token 271, top candidates
[271, 15153, 198, 78503, 248044], and top-1/top-2 margin about 1.25.
Correct full-accept bonus rows in the same trace had much larger margins.VLLM_XPU_SPEC_DECODE_FILTER_SUPPRESSED_BONUS_CACHE=1, so it stripped even
correct high-margin bonuses. The filter now only applies to actual suppressed
bonus rows unless the explicit full-bonus disable flag is set.12 because
there was no recovery/preempt transaction.19.19; this makes the replay/preempt transaction itself suspect.VLLM_XPU_GDN_SPEC_ACCEPTED_DRAFT_ONLY=1 path remains rejected even
after mask-aware accounting. It changes otherwise high-confidence rows and
fails earlier than the base speculative path.17; the oracle row that should verify draft token 11436
instead verifies/generates token 321. Repetitive drift starts at output
index 12.Decision:
9 ms of the 10.7 ms/token base, while collectives are small; an exact
persistent/resident W8A8 MoE layerlet is the best remaining path to stack a
real decode-rate improvement.Date: 2026-06-16
Purpose:
timed_region(...) / allreduce_label(...)
wrappers in the Qwen decode hot path were adding measurable Python overhead.Patch:
vllm/utils/xpu_decode_timing.py_NoopContext whenever timing was
disabled. That failed before readiness because Torch Dynamo does not support
entering a user-defined context manager in compiled model code.VLLM_XPU_FAST_DISABLED_TIMING_CONTEXT=1.Validation:
py_compile passed.torch.compile(..., backend="eager") check with timed_region(...)
passed after restoring generator behavior for compiled regions.Artifacts:
data/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-noop-timing-smoke-20260616tnoop1.logdata/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-noop-timing-smoke2-summary-20260616tnoop2.json
and associated metrics/JSON/color artifacts.Result:
94.1988 tok/s corrected on one
p512/o512 repeat (10.6158 ms/token).3/32.32/32.Decision:
Date: 2026-06-16
Purpose:
VLLM_XPU_MOE_SHARED_ADD_ALLREDUCE_CUSTOM_OP=1 path.fused_output.add_(shared_output) and leaves the
existing all-reduce path unchanged.Patch:
vllm/model_executor/layers/fused_moe/runner/moe_runner.pyVLLM_XPU_MOE_SHARED_ADD_INPLACE=1Validation:
py_compile passed.Artifacts:
data/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-shared-add-inplace-smoke-summary-20260616addinplace1.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-shared-add-inplace-smoke-p512o512-20260616addinplace1.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-shared-add-inplace-smoke-json-repeat32-20260616addinplace1.jsondata/qwen36-ablation-prefill-safe-int8-mixed-workspace-async-shared-add-inplace-smoke-color-repeat32-20260616addinplace1.jsonResult:
93.2107 tok/s
(10.7292 ms/token), slower than the accepted 93.5505 tok/s deep-gate
base.3/32.32/32.Decision: