Files
aituner/docs/opprof/phase2-smoke-dash0.md
Gahow Wang d5b276180d Add OpProf campaign: protocols, results, patches, run evidence (P0-P6)
Workload-conditioned operator profiling on patched vLLM 0.24.0 +
Qwen3-30B-A3B/H20. H1b PASS (irregular patterns carry +23-45pp R64
raggedness, 8-45% token-efficiency loss vs rectangular controls);
mechanism decomposition kills the padding narrative and finds the
arrival-uniformization artifact (-12.9%); cross-version churn surface
shows TP2/MNS64 -29.4% across vLLM 0.20->0.24 while the argmax held.
Raw Layer-1 JSONL streams (507 MB) stay on disk, git-ignored; footer
sidecars and metrics are tracked.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 11:06:10 +08:00

1234 lines
71 KiB
Markdown

# OpProf Phase 2 single-H20 smoke on dash0
Final status: **PASS**. After preserving the earlier measurements and tracing
the entire CUDA-graph-stat path, attempt 4 found that `VLLM_OPPROF_DIR` was
accidentally included in vLLM's torch.compile cache key. Each unique ON output
directory therefore forced a distinct graph/AOT cache and confounded the
attempt-2 comparison; CUDA-graph-stat construction and msgspec serialization
were not the material cost. The minimal production fix is one ignored-factor
entry in `vllm/envs.py`.
The unchanged A-P2-1 rerun produced mean ON throughput 29.666501 req/s, mean
OFF throughput 29.654057 req/s, and overhead -0.04196% with paired-bootstrap
95% CI [-0.17443%, 0.04550%]. Its upper bound is below the unchanged 3% gate.
The accepted Layer-2 run then produced a loadable 16,416,452-byte Kineto trace
with exactly two discarded warm-up iterations and eight active profiler steps.
Attempt 2 remains preserved below as a valid measurement of the pre-fix patch:
4.1816% overhead with 95% CI [3.1364%, 4.7117%]. Attempt 3 then exonerated the
recorder stages and localized the boundary outside `opprof.py`, as required,
before attempt 4 identified the exact cache-key operation and made the
evidence-driven fix.
Attempt 1 remains preserved below as an invalidated measurement. Its raw
calculation was 13.1133% overhead with 95% CI [6.2434%, 19.5259%], but the
orchestrator rejected that approximately 10-second, cold-start-confounded
protocol rather than adjudicating the patch from it.
Attempt 1 also had a reproducibility anomaly: its input/output length arrays
and token totals were identical in all ten trials, but the generated-text
digest differed in all ten. Between 185 and 190 of 200 responses in each later
trial matched trial 1 exactly. The bundled client also generated ten distinct
request-ID prefixes even though `--seed 20260711` and `--temperature 0` were
fixed. A-P2-1 removed the work-volume consequence with fixed completion length.
## Dated amendment A-P2-1 (2026-07-11)
This amendment was written before launching any rerun. Attempt 1 remains below
as an invalidated measurement and will not be erased or pooled with the amended
data. The 3% CI-upper-bound gate is unchanged.
1. Each server will receive 128 fixed-seed warm-up requests after readiness and
before timing. These requests are excluded from the measurement. One
additional unmeasured server start and representative warm-up will run before
measured trial 1 so that no measured arm is the globally coldest start.
2. Every measured trial will use the same 4,000-request stream. A trial is
acceptable only if its measured window is at least 120 seconds; 4,000 also
exceeds the 2,000-request minimum. If any trial is shorter than 120 seconds,
the amended series is invalid and stops without a gate conclusion.
3. The random input distribution remains centered at 512 tokens with input
range ratio 0.5. Output range ratio is fixed at 0, `--ignore-eos` is
explicit, `--random-output-len 64` fixes `max_tokens=64`, temperature is 0,
seed is 20260711, and request-ID prefix is fixed as `opprof-p2a-`. Thus every
successful request must produce exactly 64 completion tokens in every run.
4. Ten fresh-server trials use the counterbalanced sequence
ON,OFF,OFF,ON,ON,OFF,OFF,ON,ON,OFF. Adjacent trials form five pairs; within
each pair, the ON/OFF orientation alternates. The only intended arm
difference remains whether `VLLM_OPPROF_DIR` is set.
5. Before and after each trial, the record will include `/proc/loadavg`, a
`nvidia-smi -q -d CLOCK` snapshot for physical GPU 0, GPU memory/utilization,
and a host-process snapshot. A periodic process/GPU sampler will record any
newly appearing process owned by another user. Server lifetime is measured
from launch to completed teardown.
6. Before serving, an offline dash0 microbenchmark will time the complete
`capture_start` + `begin` + `finalize` + non-blocking writer `submit` path
for a synthetic 64-request scheduler state over 10,000 measured iterations.
It will report total and per-step time; setup, writer drain, and close are
outside the timed region.
7. An artifact addendum will launch one extra short server forced to vLLM
0.24.0 `cudagraph_mode=PIECEWISE`. Its accepted footer-valid JSONL must
contain at least one PIECEWISE record with `bucket_tokens >=
unpadded_tokens` and `padding_tokens = bucket_tokens - unpadded_tokens`.
8. The primary statistic remains `1 - mean(ON) / mean(OFF)`. Its 95% CI will
use a paired percentile bootstrap over the five adjacent counterbalanced
pairs, 100,000 resamples, seed 20260711, NumPy's default linear percentile,
and no outlier removal. If the upper bound exceeds 3%, execution stops again.
Layer-2 runs only after this unchanged gate passes.
### A-P2-1 execution clarification (2026-07-11)
This clarification was recorded before restarting the accepted ten-run series.
The first 4,000-request invocation used unbounded client concurrency and is an
excluded admission pilot, not an overhead trial: the client hit its 1,024-file
descriptor ceiling, so only 984 requests succeeded and 3,016 failed with
`OSError: [Errno 24] Too many open files`. Its 42.799-second partial duration
and 22.991182 req/s successful-request rate are not gate inputs.
The accepted series retains 4,000 measured requests and every setting above,
but fixes `--max-concurrency 200` identically in both arms. This bounds client
file descriptors while keeping the server saturated: the earlier valid
200-request burst sustained approximately 21 req/s, implying an approximately
190-second 4,000-request window. All ten accepted trials restart from pair 1;
the excluded pilot is not pooled, substituted, or counted. The >=120-second,
4,000-success, zero-failure, and fixed-64-output acceptance checks remain hard.
## Goal and hard-gate outcome
The goal was to deploy the accepted Layer-1 patch at base `ee0da84a` and
tip-equivalent `668cfb7e`, validate one scheduler-owned JSONL stream on one H20,
measure its serving overhead with the pre-registered ten-run protocol, and then
sample one two-warm-up/eight-active torch-profiler window only if the earlier
gates passed.
| Hard gate | Result | Evidence |
|---|---|---|
| Artifacts | **PASS** | The original footer-valid artifact passed schema, footer, step, drop, histogram, KV, graph-field, and composition checks. The A-P2-1 addendum forced PIECEWISE and added a footer-valid stream with 129 PIECEWISE records preserving bucket/padding identities. |
| Overhead CI | **PASS** | Attempt-4 fixed point overhead -0.04196%; paired-bootstrap 95% CI [-0.17443%, 0.04550%]; required upper bound <=3%. Attempt 2's valid pre-fix FAIL is retained separately. |
| Layer-2 | **PASS** | Exactly 2 warm-up + 8 active profiler iterations; gzip/JSON-loadable Kineto trace, 790,843 events and 7,367 kernel events. The active steps ran uncaptured (`NONE`) because their approximately 8,192-token batches exceeded the captured bucket limit; mode coverage is reported, not hidden. |
## Environment and deployment
| Field | Value |
|---|---|
| Host | `dash0` (`ds-07429c65-1-6c5fd97778-9vhkr`) |
| OS / kernel | Ubuntu 24.04 / Linux `5.10.134-013.8.2.kangaroo.al8.x86_64` |
| CPU / RAM | 2 sockets, 80 cores/socket, 160 logical CPUs, 1,554,500,000 KiB RAM; CPU string `Intel(R) Xeon(R) Processor` |
| GPU used | Physical GPU 0, NVIDIA H20, UUID `GPU-ad3e049a-5bf0-44b7-e7f1-9af297b172af` |
| Driver / reported CUDA | NVIDIA 580.95.05 / CUDA 13.0 |
| Wheel path | Exact-base precompiled `cu130` wheel; metadata for commit `ee0da84ab9e04ac7610e28580af62c365e898389` returned HTTP 200 and contained vLLM 0.24.0 x86-64 |
| Python / torch | Python 3.12.3; torch `2.11.0+cu130`; `torch.version.cuda=13.0` |
| vLLM | Editable installation still reports build metadata `0.24.1.dev3+g668cfb7e2`; runtime source contains the three accepted commits plus two fix/test commits. Compiled extensions remain from the exact v0.24.0 base wheel. |
| Compiled extension check | `vllm._C_stable_libtorch` and `vllm._moe_C_stable_libtorch` imported successfully |
| msgspec | 0.21.1 |
| Source | `/home/admin/cpfs/wjh/opprof-phase2-dash0-20260711/vllm-v0.24.0` |
| Source state | dash0 HEAD `9ad32ff2eeb147c074beeb54418551923a57857b` and local HEAD `bbfa7176a6a3686a88ee66696f1ad8d754559d96`; commit hashes differ because `git am` dates differ, but all five patch IDs match. `HEAD~5=ee0da84ab9e04ac7610e28580af62c365e898389`; both trees clean. |
| Active venv | `/tmp/wjh-opprof-phase2-dash0-20260711/.venv`, 8.6 GiB |
| Persistent audit workdir | `/home/admin/cpfs/wjh/opprof-phase2-dash0-20260711` |
| Weights | `/home/admin/cpfs/wjh/models/Qwen/Qwen3-30B-A3B` |
| Weight validation | `Qwen3MoeForCausalLM`, `torch_dtype=bfloat16`, no `quantization_config`, 128 experts, top-8; 16/16 shards present, 61,066,575,648 shard bytes |
| MoE backend | `TRITON Unquantized MoE backend`, observed in every campaign server-start log, including all 19 attempt-4 launches (48/48 total) |
The driver reports CUDA 13.0, and vLLM 0.24.0 maps CUDA major 13 to `cu130`.
The `cu129` path was therefore not selected. The exact `cu130` metadata probe
was completed before installation.
The installation command was:
```bash
VLLM_USE_PRECOMPILED=1 \
VLLM_PRECOMPILED_WHEEL_COMMIT=ee0da84ab9e04ac7610e28580af62c365e898389 \
VLLM_PRECOMPILED_WHEEL_VARIANT=cu130 \
/tmp/wjh-opprof-phase2-dash0-20260711/.venv/bin/python -m pip install -e \
/home/admin/cpfs/wjh/opprof-phase2-dash0-20260711/vllm-v0.24.0
```
The successful local-rootfs install took 377 seconds. `pip check` reported no
broken requirements.
The final exported patch files are checksum-identical to the dash0-applied
series:
| File | SHA-256 |
|---|---|
| `0001-Add-lightweight-per-step-OpProf-telemetry.patch` | `3b6843906dde103ac47fe6862a092cc507de2f6e721cf39c147d89b6b70ce27d` |
| `0002-Add-standalone-OpProf-telemetry-tests.patch` | `897c770d5f137bd49a852530d5e8dc54666a867f754ef8fd7825c7fd64bbbb99` |
| `0003-Log-the-OpProf-output-path-at-startup.patch` | `c60b44f23d02e753b46e06d9a8d845203095802ce32538c11411b1b7069e69e7` |
| `0004-Exclude-OpProf-output-path-from-compile-cache-key.patch` | `c76bb2cf20dcdfd3b9d0ef40d4e235f8fa9e6e703cd9af9cd084790f65caf0f0` |
| `0005-Keep-compile-factor-regression-import-light.patch` | `16ab2f1101067d9df2831fba312d3e82dfa9d24404954ac817e3fd9681be5537` |
| `apply.sh` | `2e2a4392b3b5714ccf38d0cf2174d829c557af23597f91fa6162390b684dc92c` |
`apply.sh` returned `OpProf patch series is already applied.` only after
checking that the clone contained the exact five patch IDs rooted at the
required base. A second clean-base worktree applied all five patches and its
idempotent reapplication returned the same message.
Remote unit-test command and result:
```bash
/tmp/wjh-opprof-phase2-dash0-20260711/.venv/bin/python -m pytest \
--confcutdir=tests/v1/core tests/v1/core/test_opprof.py -q
```
```text
............... [100%]
15 passed in 0.18s
```
The final import-light local run passed 15/15 in 0.02 seconds, Ruff passed, and
the remote clean-base application passed 15/15 in 0.07 seconds. The original
deployed 14/14 result is retained in the archived pre-fix evidence.
## Serving protocol
### Attempt 1 protocol (invalidated)
All servers used one physical H20. GPU 0 had 0 MiB, 0% utilization, and no
compute process immediately before every launch. The server command was:
```bash
CUDA_VISIBLE_DEVICES=0 \
VLLM_OPPROF_DIR=<run>/opprof \
/tmp/wjh-opprof-phase2-dash0-20260711/.venv/bin/vllm serve \
/home/admin/cpfs/wjh/models/Qwen/Qwen3-30B-A3B \
--tensor-parallel-size 1
```
OFF trials used the same command with `VLLM_OPPROF_DIR` explicitly unset.
No serving knobs beyond the model path and explicit TP1 were changed. Startup
logs selected the default FULL+PIECEWISE CUDA-graph configuration and reported
the Triton unquantized MoE backend.
The artifact smoke used this fixed-seed, mixed-length load with no client
warm-up:
```bash
vllm bench serve --backend openai --host 127.0.0.1 --port 8000 \
--endpoint /v1/completions \
--model /home/admin/cpfs/wjh/models/Qwen/Qwen3-30B-A3B \
--dataset-name random --num-prompts 200 \
--random-input-len 512 --random-output-len 64 \
--random-range-ratio '{"input":0.5,"output":0.5}' \
--request-rate inf --seed 20260711 --temperature 0 \
--save-result --save-detailed --disable-tqdm \
--percentile-metrics ttft,tpot,e2el --metric-percentiles 50,95,99
```
The overhead trials added `--num-warmups 16`; the bundled benchmark executes
those warm-up requests before starting its measured timer. Every trial used a
fresh server. The exact order was ON,OFF repeated five times. The only intended
ON/OFF difference was the OpProf environment variable.
After a measured load had become idle, the EngineCore process was signalled
first and allowed to execute `scheduler.shutdown()` and drain the writer. The
API parent was then stopped. This ordering was used identically for ON and OFF
overhead trials because the default parent-first shutdown force-killed the
EngineCore before the first smoke footer could be written.
### A-P2-1 accepted protocol
The amended order was
ON,OFF,OFF,ON,ON,OFF,OFF,ON,ON,OFF. One default-configuration burn-in server
ran before measured pair 1. Every measured server received 128 excluded warm-up
requests followed by this fixed-work command:
```bash
vllm bench serve --backend openai --host 127.0.0.1 --port 8000 \
--endpoint /v1/completions \
--model /home/admin/cpfs/wjh/models/Qwen/Qwen3-30B-A3B \
--dataset-name random --num-prompts 4000 --num-warmups 128 \
--max-concurrency 200 \
--random-input-len 512 --random-output-len 64 \
--random-range-ratio '{"input":0.5,"output":0.0}' \
--ignore-eos --request-rate inf --seed 20260711 --temperature 0 \
--request-id-prefix opprof-p2a- \
--save-result --save-detailed --disable-tqdm \
--percentile-metrics ttft,tpot,e2el --metric-percentiles 50,95,99
```
All ten accepted runs completed 4,000 requests with zero failures. Every
completion was exactly 64 tokens; input/output length digests each had one
distinct value across runs. Each internal measured duration exceeded 120
seconds. The client generated seven distinct text-content digests, but this no
longer changed generation work because `ignore_eos` and `max_tokens=64` fixed
every completion length.
Before and after every run, the controller captured `/proc/loadavg`, full
`nvidia-smi -q -d CLOCK` output, selected-GPU state, and a host process
snapshot. A five-second sampler recorded clocks and newly appearing processes.
The server was restarted and torn down identically for every arm. A transient
4 MiB, 0%-utilization driver-accounting sample after trial 1 stopped the first
controller before trial 2 launched; after five consecutive 0 MiB/0% samples,
the unchanged sequence resumed at trial 2.
## Artifact gate
### Invalid first attempt
The first smoke completed 200/200 requests in 9.634701 seconds at 20.758299
req/s. It produced 110 step records, including one runtime PIECEWISE record:
```text
runtime_mode=PIECEWISE, unpadded_tokens=478, bucket_tokens=480,
padding_tokens=2
```
The parent-first default shutdown then force-killed the EngineCore and the file
had no footer. This file was retained as failure evidence but excluded from the
accepted artifact checks.
### Footer-valid rerun
The unchanged load rerun completed 200/200 requests in 9.391693 seconds at
21.295415 req/s. Its JSONL contained 109 records followed by one footer.
Every line decoded against a strict, unknown-field-forbidding `msgspec.Struct`
schema.
| Check | Result |
|---|---|
| JSONL / schema | 110/110 lines schema-valid; 109 records plus one terminal footer |
| Footer | `encoded=109`, `written=109`, `dropped=0`; `encoded=written+dropped` |
| Steps / pending leak | Step indices exactly 0 through 108; Prometheus counted 107 executed iterations and the stream contained 2 zero-token steps, totaling 109 |
| Queue drops | Footer drops 0 and sum of `dropped_records_before` 0 |
| Per-record invariants | All counters non-negative; context/chunk histograms sum correctly; KV block accounting exact; KV usage in [0,1]; completion timestamp not before submission |
| CUDA-graph fields | Hit/mode identity valid; bucket >= unpadded; padding = bucket - unpadded for every record |
| Layer-1 MoE field | `moe_expert_load` null in every record |
| Last state | Zero-token record, queues all zero, KV used blocks zero |
Observed graph modes in the footer-valid file were FULL=93 and NONE=16. The
bucket family had n=109, min=0, max=8192, distinct=32; padding had n=109,
min=0, max=7, distinct=8. No valid-file record exercised PIECEWISE. A planned
single-request PIECEWISE probe was not run after the overhead stop rule fired,
so the strict artifact gate remained unresolved at the end of attempt 1 despite
the other artifact checks passing.
### Composition cross-check
Random inputs covered 261 to 761 tokens; requested/actual outputs covered 32
to 96 tokens because the random OpenAI-compatible benchmark ignores EOS for
this dataset.
| Quantity | OpProf | Client ground truth | Delta / tolerance |
|---|---:|---:|---:|
| Prefill tokens | 102,848 | 102,848 input tokens | 0; exact |
| Decode tokens | 11,987 | 12,187 completion tokens | -200, or 1.6411%; allowed structural tolerance was one first token per completed request |
| Decode plus first-token correction | 12,187 | 12,187 completion tokens | 0; exact |
The one-token/request correction is expected because the first completion
token is sampled from the prefill logits; only later completion tokens require
decode inputs.
### A-P2-1 PIECEWISE addendum
The addendum forced the exact vLLM 0.24.0 configuration
`--compilation-config '{"cudagraph_mode":"PIECEWISE"}'` and ran 16 excluded
warm-ups plus 64 requests with fixed 64-token completions. EngineCore-first
shutdown produced one footer-valid file. Every line decoded with the same
strict, unknown-field-forbidding msgspec schema.
| Check | Result |
|---|---|
| File / footer | 139 records plus one footer; `encoded=139`, `written=139`, `dropped=0` |
| Step accounting | Indices 0 through 138, contiguous and unique; no pending leak |
| Runtime modes | PIECEWISE=129, NONE=10 |
| PIECEWISE unpadded tokens | n=129, min=1, max=241, distinct=9 |
| PIECEWISE buckets | n=129, min=1, max=248, distinct=6 |
| PIECEWISE padding | n=129, min=0, max=7, distinct=5 |
| Identity | Every record had bucket >= unpadded and padding = bucket - unpadded |
This closes the attempt-1 coverage red flag. The final artifact gate is
**PASS**: the original artifact supplies the composition and scheduler-step
cross-checks, while the addendum supplies footer-valid runtime PIECEWISE
coverage without weakening any earlier invariant.
## Attempt 1 overhead (invalidated measurement)
Metric: bundled-client `request_throughput`, in req/s. The registered statistic
was `1 - mean(ON) / mean(OFF)`. The 95% interval used paired percentile
bootstrap resampling of the five adjacent ON/OFF pairs, 100,000 resamples,
analysis seed 20260711, NumPy's default linear percentile, and no outlier
removal.
| Trial | Mode | Throughput (req/s) | Measured duration (s) | Server GPU lifetime (s) |
|---:|:---:|---:|---:|---:|
| 1 | ON | 20.487487 | 9.762056 | 155 |
| 2 | OFF | 22.864574 | 8.747156 | 139 |
| 3 | ON | 22.685507 | 8.816201 | 144 |
| 4 | OFF | 26.350950 | 7.589859 | 107 |
| 5 | ON | 19.877357 | 10.061700 | 144 |
| 6 | OFF | 23.302197 | 8.582882 | 92 |
| 7 | ON | 20.419460 | 9.794578 | 150 |
| 8 | OFF | 20.378458 | 9.814285 | 93 |
| 9 | ON | 20.068985 | 9.965626 | 145 |
| 10 | OFF | 26.269114 | 7.613504 | 91 |
Adjacent-pair overheads were 10.3964%, 13.9101%, 14.6975%, -0.2012%, and
23.6024%.
| Statistic | Value |
|---|---:|
| Mean ON | 20.707759 req/s |
| Mean OFF | 23.833059 req/s |
| Point overhead | 13.1133% |
| 95% CI | [6.2434%, 19.5259%] |
| Raw calculation | 19.5259% > 3%; later invalidated as a measurement |
All five ON artifacts closed with valid footer accounting and zero drops.
Their record counts were 183, 186, 183, 184, and 184.
The shape-level load checks passed: all trials completed 200 requests with no
reported failures; every result had 102,848 input and 12,187 output tokens; and
the input-length and output-length digests each had one distinct value. The
token-content check did not pass. Generated-text digests had ten distinct
values, and exact response matches against trial 1 were
`[200, 189, 186, 187, 190, 190, 186, 188, 188, 185]`. In addition, the bundled
client's automatically selected `request_id_prefix` had ten distinct values.
The performance numbers are therefore reported for the gate as registered but
should not be used to claim that instrumentation caused the entire measured
difference.
The orchestrator subsequently invalidated this attempt because the OFF-arm
spread was 29%, the approximately 10-second windows included cold compile and
autotune effects, and strict ON,OFF alternation assigned the globally coldest
run to ON. These ten rows are not pooled with A-P2-1 and do not adjudicate the
patch.
## A-P2-1 amended overhead gate
The first unbounded 4,000-request invocation was an excluded admission pilot:
the client exceeded its 1,024-file-descriptor ceiling, completing 984 requests
and failing 3,016 with `Too many open files`. The accepted series restarted
from pair 1 with maximum concurrency 200, as pre-recorded in the execution
clarification above.
| Trial | Mode | Throughput (req/s) | Measured duration (s) | Server allocation (s) |
|---:|:---:|---:|---:|---:|
| 1 | ON | 28.202897 | 141.829399 | 297 |
| 2 | OFF | 28.800396 | 138.886980 | 267 |
| 3 | OFF | 29.585085 | 135.203261 | 260 |
| 4 | ON | 28.183682 | 141.926096 | 307 |
| 5 | ON | 28.256715 | 141.559272 | 311 |
| 6 | OFF | 29.640096 | 134.952330 | 272 |
| 7 | OFF | 29.632434 | 134.987225 | 266 |
| 8 | ON | 28.249738 | 141.594235 | 312 |
| 9 | ON | 28.187008 | 141.909351 | 308 |
| 10 | OFF | 29.578830 | 135.231855 | 258 |
Adjacent-pair overheads were 2.0746%, 4.7369%, 4.6673%, 4.6662%, and
4.7055%. The frozen paired-bootstrap analysis used 100,000 resamples, seed
20260711, NumPy's default linear percentile, and no filtering.
| Statistic | Value |
|---|---:|
| Mean ON | 28.216008 req/s |
| Mean OFF | 29.447368 req/s |
| Point overhead | 4.1816% |
| 95% CI | [3.1364%, 4.7117%] |
| Gate | **FAIL: 4.7117% > 3%** |
This measurement passed its protocol-validity checks: ten distinct positive
throughputs, ten durations from 134.952330 to 141.926096 seconds, 4,000
successes and zero failures per run, exactly 2,031,054 input tokens and 256,000
output tokens per run, one input-length digest, one output-length digest, and
exactly 64 completion tokens per request. Generated text content still had
seven distinct digests, but it could not change token work.
All five ON JSONLs strict-decoded and closed cleanly. Their record counts were
1,405, 1,406, 1,405, 1,403, and 1,403; each footer had
`encoded=written=records`, `dropped=0`, contiguous step indices, and valid
bucket/padding identities.
### Host and clock observations
| Trial | Mode | 1-minute load before / after | Startup (s) | New other-user processes | Other-user GPU samples |
|---:|:---:|---:|---:|---:|---:|
| 1 | ON | 0.15 / 1.63 | 111 | 3 | 0 |
| 2 | OFF | 0.23 / 1.22 | 73 | 11 | 0 |
| 3 | OFF | 1.03 / 1.24 | 65 | 2 | 0 |
| 4 | ON | 1.05 / 1.07 | 113 | 2 | 0 |
| 5 | ON | 0.99 / 1.22 | 115 | 4 | 0 |
| 6 | OFF | 1.11 / 0.93 | 64 | 3 | 0 |
| 7 | OFF | 0.79 / 1.20 | 70 | 2 | 0 |
| 8 | ON | 1.01 / 1.57 | 116 | 2 | 0 |
| 9 | ON | 1.27 / 0.97 | 113 | 3 | 0 |
| 10 | OFF | 0.82 / 1.51 | 64 | 7 | 0 |
The sampler observed 39 newly appearing root-owned host processes: 13
`python3`, 6 `bash`, 3 each of `sed`, `runtime-bridge`, `nvidia-smi`, `grep`,
and `config-sync`, 2 `sshd`, and one each of `metrics-monitor`, `envd`, and
`easworker-proxy`. Some were orchestrator state checks. None appeared as an
other-user GPU compute process, and selected GPU 0 had no contamination.
All 545 periodic GPU samples were P0 with one 1,980 MHz maximum SM clock.
Among 318 active samples, observed SM clocks spanned 1,740 to 1,980 MHz; means
were 1,970.0 MHz ON and 1,973.9 MHz OFF. One-minute host load stayed between
0.15 and 1.63 on 160 logical CPUs. These observations do not support GPU clock
throttling or host CPU saturation as the 4.1816% explanation. Full per-run
before/after clock snapshots and process lists are retained in the archive.
### Recorder microbenchmark and localization
The offline benchmark pinned one CPU, used a synthetic state with 64 requests
(8 prefill, 56 decode, 312 scheduled tokens), ran 1,000 excluded warm-ups, and
timed 10,000 complete `capture_start + begin + finalize + submit` calls. The
writer drain and close were outside the timing, as pre-registered.
| Producer-path metric | Value |
|---|---:|
| Whole-loop cost | **29.1467 us/step** |
| Per-iteration mean / median | 28.9279 / 27.7620 us |
| p95 / p99 | 36.6643 / 40.6231 us |
| Min / max | 26.293 / 70.111 us |
| Distinct nanosecond timings | 4,144 / 10,000 |
| Writer accounting | 11,000 encoded, 11,000 written, 0 dropped, including warm-ups |
Production ON files averaged 1,404.4 records over active spans of 144.727 to
144.969 seconds: 9.696 steps/s, 914.7 bytes/record, and 8.87 KB/s. Applying
29.1467 us to 1,404.4 steps predicts only about 0.041 seconds per run, whereas
mean ON duration exceeded mean OFF duration by 5.911 seconds, or approximately
4.209 ms per production record. Raw msgspec encode volume and non-blocking
enqueue cost in isolation therefore cannot explain the measured gap.
The remaining localization hypothesis is an interaction absent from the
offline benchmark: the real `begin` loop can inspect up to 200 requests rather
than 64, and the production writer thread runs concurrently, introducing
possible GIL handoff, queue-lock, flush/I/O, or engine-loop cadence effects.
The systematic startup split (ON 111-116 seconds; OFF 64-73 seconds), although
excluded from throughput, is additional evidence that the enabled path has a
broader runtime interaction. This turn did not profile, tune, or fix any of
these hypotheses after the hard-gate failure.
## Attempt 3 stage bisection and stop
### Temporary diagnostic only
The installed editable dash0 source received a temporary 30-addition,
3-deletion diff, never committed or exported. It introduced
`VLLM_OPPROF_STAGE` with these exact boundaries:
- `off`: `OpProfRecorder.create()` returned `None`;
- `capture`: `capture_start` and `begin` ran; `finalize` paired/popped the
pending step, then skipped record construction, encode, and submit;
- `encode`: the full producer and queue path ran while the writer thread wrote
to a Python null sink; and
- `full`: unchanged JSONL behavior.
The exact diff is archived as
`runs/stage-bisection-attempt3/temporary-stage-toggle.diff`, SHA-256
`6c9186089fd61bc88b92ba38692f299b772cf3bf3b437fd9f9508eddf9ec3f2c`.
Before GPU work, py_compile, semantic stage checks, and all 14 remote unit tests
passed. After the bisection, the diff was reversed and `opprof.py` returned to
SHA-256 `679c9ae3026cd9eb3cdb48a681a91a9f7693c1dc52cc5ca7ade46cb5b268adbe`.
### Bisection table reported before any fix
Each fresh server received 128 excluded warm-ups and the same 4,200-request
stream at concurrency 200. All stages completed 4,200/4,200 requests, zero
failures, 2,132,262 input tokens, and 268,800 output tokens. Every completion
was exactly 64 tokens, and input/output length digests were identical.
| Stage | Throughput (req/s) | Duration (s) | Overhead vs `off` | Startup / allocation (s) | JSONL files / bytes |
|---|---:|---:|---:|---:|---:|
| off | 28.389494 | 147.942050 | 0.000% | 113 / 302 | 0 / 0 |
| capture | 28.257144 | 148.634981 | 0.466% | 114 / 304 | 1 / 96 |
| encode/null sink | 28.221609 | 148.822131 | 0.591% | 126 / 316 | 0 / 0 |
| full/CPFS | 28.269199 | 148.571596 | 0.424% | 111 / 301 | 1 / 1,346,466 |
The full output directory was on CPFS (`fuse.aliyun-alinas-efc` / `fuseblk`);
`/tmp` was rootfs overlay. Full CPFS output was faster than the null-sink stage
and only 0.424% below `off`, so filesystem I/O was not implicated and the
conditional full-on-`/tmp` trial was not run.
### Culprit boundary and mandated stop
No `opprof.py` stage reproduced the valid 4.1816% gate gap. Source inspection
then found the bisection-boundary violation:
- `vllm/v1/worker/gpu_model_runner.py` sets
`self.opprof_enabled = bool(envs.VLLM_OPPROF_DIR)` during initialization; and
- its cudagraph dispatch path constructs and propagates `CUDAGraphStat` when
either cudagraph metrics or `self.opprof_enabled` is true.
All four diagnostic servers had non-empty `VLLM_OPPROF_DIR`, so this
worker/model-runner path stayed enabled even when stage `off` returned no
recorder. The stage named `off` was therefore equivalent only at the scheduler
recorder boundary, not to the accepted gate's environment-unset OFF arm. The
evidence localizes the missing overhead outside `opprof.py`, specifically to
the `CUDAGraphStat` construction/propagation path or its downstream interaction;
it does not isolate which operation inside that path is expensive.
This matches the user's explicit outside-OpProf stop example. Consequently no
minimal fix was made: real branch line delta **0**, no commit, and no patch
re-export. The local and remote branches remain at `668cfb7e`; all three patch
files and `apply.sh` retain their accepted checksums. The unchanged local
standalone suite passed 14/14 in 0.02 seconds. No quick pair, full gate rerun,
or Layer-2 run was authorized after this stop condition.
## Attempt 4 static CUDA-graph-stat path analysis (2026-07-11; before GPU)
This analysis was completed and recorded before launching any attempt-4 GPU
trial. The authoritative tree is the accepted vLLM v0.24.0 patch tip
`668cfb7e27e488454dbf09a4927b8a60d6d49b40` in
`/home/gahow/phd/vllm-v0.24.0`.
### Worker to scheduler: no serializer in this TP1 configuration
- With TP1/PP1/DP1, `world_size == 1` selects backend `uni`
(`vllm/config/parallel.py:915-916`); `Executor.get_class()` maps that backend
to `UniProcExecutor` (`vllm/v1/executor/abstract.py:73-76`).
- `UniProcExecutor.collective_rpc()` invokes `run_method()` on its in-process
`driver_worker` and returns the object directly
(`vllm/v1/executor/uniproc_executor.py:79-106`); `execute_model()` is only a
thin call through that method (`:108-121`). The EngineCore receives the
resulting `ModelRunnerOutput` from the completed future and passes it to the
scheduler in the same process (`vllm/v1/engine/core.py:479-508`).
- Therefore the comment that `ModelRunnerOutput` can be serialized
(`vllm/v1/outputs.py:231-234`) does not describe this TP1 execution path.
For comparison only, the multiprocessing executor uses its worker response
`MessageQueue` (`vllm/v1/executor/multiproc_executor.py:376-396`), whose
implementation explicitly pickles the complete response
(`vllm/distributed/device_communicators/shm_broadcast.py:727-745`) and
unpickles it at `:772-805`. It does not use a msgspec unknown-type hook.
Conclusion: adding a `CUDAGraphStat` field cannot poison a worker-to-scheduler
serializer fast path in the measured TP1 server because that serializer does
not run.
### Exact producer work when the stat is enabled
The accepted OpProf patch adds only two CUDA-graph-stat enablement lines to
the upstream path: it caches `bool(VLLM_OPPROF_DIR)` at runner construction
(`vllm/v1/worker/gpu_model_runner.py:429-440`) and ORs that flag with upstream
`observability_config.cudagraph_metrics` (`:3920-3925`). When the condition is
true, each executed step performs:
1. three existing CPU integer reads/arithmetic operations,
2. `str(cudagraph_mode)`, and
3. construction of one frozen four-field `CUDAGraphStat` dataclass
(`vllm/compilation/cuda_graph.py:32-37` and
`vllm/v1/worker/gpu_model_runner.py:3925-3930`).
The dispatch decision and `BatchDescriptor` already exist before this branch
(`gpu_model_runner.py:3867-3918`); the metrics flag is not passed to the
dispatcher. The stat is carried through `ExecuteModelState` (`:405-418`,
`:4402-4413`, `:4452-4464`) and assigned to `ModelRunnerOutput` (`:4625-4639`).
There are no CUDA events, event reads, tensor `.item()` calls, stream
synchronizations, dispatcher re-queries, or feature-specific logs in this
branch. The only nearby `.item()` is the pre-existing DP>1 coordination at
`:3907-3918`, which is not entered in this DP1 smoke and is independent of the
metrics condition.
### Scheduler and EngineCore-to-frontend handling
The scheduler reads the field once
(`vllm/v1/core/sched/scheduler.py:1485-1497`), supplies it to the existing
`make_stats()` path (`:1812-1822`), and stores it as the
`SchedulerStats.cudagraph_stats` field (`:2255-2291`; field definition at
`vllm/v1/metrics/stats.py:170-198`). OpProf consumes the same object locally
after that assignment (`scheduler.py:1824-1828`).
`EngineCoreOutputs` is a typed, array-like `msgspec.Struct` with an optional
`SchedulerStats` (`vllm/v1/engine/__init__.py:220-234`). The EngineCore output
thread calls `MsgpackEncoder.encode_into()` and sends the resulting ZMQ frames
(`vllm/v1/engine/core.py:1589-1654`); the async frontend constructs
`MsgpackDecoder(EngineCoreOutputs)` (`vllm/v1/engine/core_client.py:585-595`)
and decodes those frames at `:1005-1011`.
`MsgpackEncoder` is a msgspec MessagePack encoder
(`vllm/v1/serial_utils.py:136-171`). Its custom hook handles tensors,
ndarrays, slices, multimodal objects, and utility results; an unknown object
raises unless insecure serialization is explicitly enabled, in which case
only that object is placed in a pickle/cloudpickle extension
(`:191-235`). Insecure fallback is off by default
(`vllm/envs.py:197`, `:1508-1509`). `CUDAGraphStat` is a standard dataclass,
which msgspec handles natively: a local typed encode/decode witness saw zero
hook calls with either `None` or a populated stat. Thus the stat neither uses
an extension hook nor forces pickle for the whole `EngineCoreOutputs`.
As a scale check only (not a GPU gate result), a 500,000-iteration synthetic
typed encode+decode loop measured 1.5340 us/message without the nested stat
and 1.7215 us/message with it, a 0.1875 us/message delta; encoded size grew
from 358 to 451 bytes. At the observed roughly 9.7 steps/s this is far below
the valid attempt-2 throughput gap. This witness checks serializer mechanism,
not end-to-end performance.
On the frontend, `AsyncLLM` hands `scheduler_stats` to the output processor
and logger manager (`vllm/v1/engine/async_llm.py:656-702`). Beyond OpProf,
the CUDA-graph-specific consumer exists only when the upstream CLI/config
flag is true: `LoggingStatLogger` creates `CUDAGraphLogging`
(`vllm/v1/metrics/loggers.py:99-123`), appends one dataclass per step
(`:163-190`), and at each normal logging interval builds a `Counter`, sorts
rows, formats a table, logs it, and resets the list
(`vllm/compilation/cuda_graph.py:65-124` and
`vllm/v1/metrics/loggers.py:219-283`). With only `VLLM_OPPROF_DIR` set and
`cudagraph_metrics=False`, this logger is absent; the stat is still encoded to
the frontend but has no feature-specific frontend consumer.
Static mechanism conclusion: serializer fast-path poisoning is ruled out for
the measured TP1 worker path and was not observed on the remaining typed
msgspec leg. The common hot-path delta to test is the upstream four-field
stat production and propagation; the upstream-only versus env-set/recorder-off
trials distinguish upstream feature cost from OpProf-specific enablement.
Static-witness sanity: encode/decode configurations n=2, min/max
1.5340/1.7215 us, distinct=2; message sizes n=2, min/max 358/451 bytes,
distinct=2. All timings and sizes were positive, the typed round trip
preserved values, and hook-call count was exactly zero in both configurations.
### Three-arm confirmation reported before fixing
These three fresh-server trials reused the frozen A-P2-1 stream: 128 excluded
warm-up requests, then 4,000 measured requests at concurrency 200, random
input lengths 256-768 from seed 20260711, greedy temperature 0, `ignore_eos`,
and exactly 64 output tokens. All arms completed 4,000/4,000 requests with
zero failures, 2,031,054 input tokens, and 256,000 output tokens.
| Trial | Configuration | Throughput (req/s) | Duration (s) | Startup (s) | Server lifetime (s) | Difference vs baseline |
|---:|---|---:|---:|---:|---:|---:|
| 1 | True baseline: env unset, CUDA-graph metrics off | 29.716821 | 134.603900 | 74 | 258 | 0 |
| 2 | Upstream only: env unset, `--cudagraph-metrics` | 29.641918 | 134.944034 | 64 | 248 | 0.2521% |
| 3 | `VLLM_OPPROF_DIR` set, temporary recorder `off` | 28.452675 | 140.584322 | 122 | 307 | 4.2540% |
The env-set arm was also 4.0120% below upstream-only. Input-length and
output-length digests were identical across all three arms. Generated-text
digests differed, as already seen in the longer A-P2-1 series; exact token
volume remained fixed. GPU0 was stably 0 MiB/0% before and after each arm,
and all three selected the TRITON unquantized MoE backend.
The table rules out the proposed upstream-stat/serializer mechanism: upstream
metrics were only 0.2521% below baseline, while the OpProf environment alone
reproduced the material gap with no recorder.
### Exact operation: compile-cache key poisoning by the output path
`envs.compile_factors()` starts from every registered vLLM environment
variable and removes only names in its explicit `ignored_factors` set
(`vllm/envs.py:2011-2017`, `:2089-2104`). The accepted patch registered
`VLLM_OPPROF_DIR` but did not add it to that exclusion set. `VllmBackend`
hashes those environment factors and combines the environment, vLLM config,
traced-code, and compiler hashes into the torch.compile cache-directory key
(`vllm/compilation/backends.py:1024-1065`).
The persisted `cache_key_factors.json` files make the mechanism exact:
- baseline/upstream used cache directory `2f59bf1436`; env-set/recorder-off
used `c0e8930879`;
- config hash `05ca9c77d6`, code hash
`7d1415ae9c2a984358bee50a7ae3079b0e9f0afd27ecdff56e25f9ef57e89c15`,
and compiler hash `1efad2be6d` were identical;
- the sorted environment maps differed in exactly one entry:
`VLLM_OPPROF_DIR=""` versus the per-run output directory.
Consequently every ON trial's unique artifact directory generated a unique
compile cache key. The baseline/upstream server loaded the existing graph
and AOT artifact (`torch.compile` 6.07 seconds); env-set/recorder-off compiled
and saved a new graph/AOT artifact (`torch.compile` 36.41 seconds). Its total
engine initialization was 70.22 seconds versus 21.85 seconds for baseline,
matching the startup signature seen throughout attempts 2 and 3. This cache
churn also placed each ON arm on a newly compiled/autotuned artifact instead
of the common warmed artifact, which is the systematic measurement confound.
Fix hypothesis, frozen before implementation: `VLLM_OPPROF_DIR` controls only
the host-side telemetry destination and cannot affect the model computation
graph, so excluding it from `compile_factors()` will make ON and OFF share the
same compilation/AOT cache. Verification requires the same cache directory
in a quick ON/OFF pair and quick-pair overhead below 2% before the full gate.
### Minimal fix, export, and verification
The production change adds exactly one string, `"VLLM_OPPROF_DIR"`, to
`compile_factors()`'s `ignored_factors` set in `vllm/envs.py:2011-2093`
(new entry at `:2047`). It
does not touch CUDA-graph dispatch, scheduler plumbing, serialization, the
recorder, or the import surface. The regression test loads `envs.py` directly
with light module stubs, sets the output path, and asserts that the name is not
returned as a compile factor.
The two fix commits are local `335da4a`/`bbfa717` and patch-ID-equivalent
dash0 commits `fbbc886`/`9ad32ff`. Relative to accepted tip `668cfb7e`, the
fix delta is **+1/-0 production line** and **+21/-1 test lines**, or +22/-1
overall. The fifth commit exists only to keep the new regression import-light;
it does not alter production code.
Verification summary:
- local standalone suite: 15/15 passed in 0.02 seconds;
- local Ruff check: passed;
- dash0 real-tip suite: 15/15 passed in 0.18 seconds;
- a fresh worktree at exact base `ee0da84a`: all five exported patches applied,
15/15 passed in 0.07 seconds, and a second `apply.sh` invocation was a no-op;
- the final real branch and clean-base worktree both retained the import-light
contract (no installed vLLM or torch required by the local test run).
An earlier four-patch clean-base validation exposed that the first version of
the regression test imported torch before the existing import-light assertion.
That test-isolation bug did not affect production code or GPU measurements; it
was corrected by the fifth commit before the final clean-base result above.
### Quick signal pair after the fix
One unmeasured 128-request burn-in preceded a fixed-work ON/OFF pair. Both
measured servers used compile cache `f66a11246c`.
| Arm | Throughput (req/s) | Duration (s) | Startup / lifetime (s) |
|---|---:|---:|---:|
| ON | 29.700657 | 134.677153 | 72 / 256 |
| OFF | 29.677979 | 134.780065 | 63 / 247 |
Quick-pair overhead was -0.07641%, below the pre-declared 2% continuation
threshold, so the full unchanged protocol was run.
### Attempt 4 full unchanged A-P2-1 gate
The burn-in server lived for 94 seconds. The ten measured fresh servers then
used the frozen ON,OFF,OFF,ON,ON,OFF,OFF,ON,ON,OFF order, 128 excluded warm-up
requests, and the same 4,000-request fixed stream. Every run completed 4,000
requests with zero failures, 2,031,054 input tokens, and 256,000 output tokens.
Every completion was exactly 64 tokens. All eleven servers, including burn-in,
used compile cache `f66a11246c`.
| Trial | Pair | Arm | Throughput (req/s) | Duration (s) | Startup / lifetime (s) | Host load 1m before / after |
|---:|---:|---|---:|---:|---:|---:|
| 1 | 1 | ON | 29.712835 | 134.621958 | 60 / 244 | 0.49 / 1.48 |
| 2 | 1 | OFF | 29.624180 | 135.024835 | 64 / 248 | 1.26 / 1.78 |
| 3 | 2 | OFF | 29.658364 | 134.869208 | 64 / 249 | 1.51 / 1.55 |
| 4 | 2 | ON | 29.647687 | 134.917776 | 63 / 247 | 1.43 / 1.91 |
| 5 | 3 | ON | 29.637994 | 134.961900 | 76 / 262 | 1.62 / 2.36 |
| 6 | 3 | OFF | 29.634841 | 134.976258 | 62 / 247 | 1.90 / 1.75 |
| 7 | 4 | OFF | 29.677443 | 134.782500 | 63 / 247 | 1.56 / 1.42 |
| 8 | 4 | ON | 29.657455 | 134.873342 | 62 / 246 | 1.20 / 1.63 |
| 9 | 5 | ON | 29.676533 | 134.786632 | 61 / 246 | 1.38 / 1.20 |
| 10 | 5 | OFF | 29.675455 | 134.791530 | 64 / 249 | 1.09 / 1.49 |
| Pair | ON (req/s) | OFF (req/s) | `1 - ON/OFF` |
|---:|---:|---:|---:|
| 1 | 29.712835 | 29.624180 | -0.29927% |
| 2 | 29.647687 | 29.658364 | 0.03600% |
| 3 | 29.637994 | 29.634841 | -0.01064% |
| 4 | 29.657455 | 29.677443 | 0.06735% |
| 5 | 29.676533 | 29.675455 | -0.00363% |
Mean ON was **29.666501 req/s**, mean OFF was **29.654057 req/s**, and the
pre-registered aggregate overhead `1 - mean(ON)/mean(OFF)` was **-0.04196%**.
The paired percentile bootstrap (100,000 resamples, seed 20260711) gave a 95%
CI of **[-0.17443%, 0.04550%]**. Its 0.04550% upper bound is below 3%:
**overhead hard gate PASS**.
All pre-launch clock snapshots reported current SM 345 MHz; all immediate
post-run snapshots and active samples reported 1,980 MHz. Maximum SM remained
1,980 MHz and memory 2,619 MHz throughout. Before/after compute-process
snapshots were empty, periodic GPU
samples contained only the campaign EngineCore, and no other user's GPU process
appeared. One-minute host load stayed between 0.23 and 2.36 on 160 logical CPUs.
Input- and output-length digests each had one value across all ten runs;
generated-text digests had six values, but exact work volume was invariant.
## Layer-2 window
The accepted retry used vLLM's profile endpoint during the same fixed 4,000
request load. `VLLM_TORCH_PROFILER_DIR` pointed to dash0-local `/tmp` during
capture, with `VLLM_TORCH_PROFILER_WITH_STACK=1`,
`VLLM_TORCH_PROFILER_RECORD_SHAPES=1`, and the v0.24.0 schedule configured for
wait 0, warm-up 2, active 8, repeat 1. The resulting files were copied into the
persistent run directory before teardown.
The trace
`dp0_pp0_tp0_dcp0_ep0_rank0.1783785319893394827.pt.trace.json.gz` is
16,416,452 bytes with SHA-256
`4d6bb869ff03ddfd421d3111414ec9532330a9cbefdfa9e9fed1982070f6d72e`.
It decompressed and parsed as JSON schema version 1, containing 790,843 trace
events, 7,367 kernel events, and 35 distinct kernel names. The trace contains
exactly eight active `ProfilerStep` annotations numbered 2 through 9 and eight
matching execute annotations; the two preceding iterations were warm-up and
were correctly discarded. Visible kernels include the Triton fused-MoE kernel,
FlashAttention, reshape-and-cache, top-k gating, and NVJet GEMMs.
All eight active execute annotations totaled approximately 8,192 scheduled
tokens (context 8,025-8,048 plus generation 144-167). They exceeded the
largest captured CUDA-graph bucket, so OpProf classified all ten records in
the scheduled collection interval as `NONE`. This explains why the trace
shows 7,367 individual kernel launches and zero `cudaGraphLaunch` runtime
events. The immediately preceding equal-length steady window contained 75
`FULL` and 20 `NONE` records; the broader pre-endpoint interval contained 215
`FULL`, 54 `NONE`, and two `PIECEWISE` records. The trace therefore proves
kernel visibility for the uncaptured mode actually active in the profiler
window; it does **not** claim individual-kernel visibility inside a FULL or
PIECEWISE graph replay.
Perturbation is indicative only. During the 8.174811-second scheduled
collection interval, 131 requests completed (16.0248 req/s) versus 269 in the
equal preceding interval (32.9060 req/s), a 51.30% reduction. The complete
24.102657-second start/stop endpoint interval sustained 5.4351 req/s versus
19.4584 immediately before and 29.8722 immediately after, reductions of
72.07% and 81.81%; trace finalization inside `stop_profile` dominates that
larger interval. Whole-load throughput was 25.869730 req/s, 12.80% below the
fixed-gate ON mean. These values are profiler perturbation, not Layer-1 gate
inputs.
The first Layer-2 controller attempt is excluded: its benchmark-progress
marker remained block-buffered, so profiling started after the load had
finished and produced no trace. No inference is drawn from that run. The
accepted retry used an unbuffered progress source and triggered during load.
**Layer-2 gate PASS:** the configured 2+8 window executed, its Kineto file is
loadable and kernel-bearing, observed CUDA-graph modes are documented, and
perturbation was measured.
## Deviations and failure notes
1. Two direct remote GitHub clones were interrupted by checkout/fetch transport
behavior. `rsync` was unavailable on dash0. The accepted local clean clone
was transferred as a gzip tar stream; `apply.sh` then verified the exact
patch IDs and required base parent.
2. A CPFS-hosted venv spent 21 minutes in slow package metadata/page writes and
was stopped before completion. It was preserved as failure evidence. The
successful fresh venv was installed on dash0 local rootfs to avoid CPFS I/O
variance in repeated startups and OpProf writes.
3. `/usr/bin/time` was absent, so install duration was recorded with epoch
timestamps.
4. The initial binary-import check incorrectly tried `vllm._C`. vLLM 0.24.0's
CUDA path uses `_C_stable_libtorch` and `_moe_C_stable_libtorch`; both actual
modules imported successfully before testing or serving.
5. Parent-first shutdown produced no footer. EngineCore-first teardown produced
a footer but causes the API parent to log an expected teardown-only
`EngineDeadError` after all requests and metrics are complete.
6. After overhead trial 6, the first cleanup sample showed 4 MiB and 0%
utilization with no compute process. The controller stopped before trial 7.
GPU memory was 0 MiB on two later checks; trials 7-10 resumed unchanged, and
cleanup polling was extended to wait for driver accounting to return to zero.
7. The footer-valid smoke did not contain PIECEWISE. The invalid first file did,
but it was not promoted into accepted gate evidence.
8. The fixed-seed commands did not yield bit-identical generated outputs, and
the bundled client generated a random request-ID prefix for each invocation.
A-P2-1 fixed the request-ID prefix and exact output length; content digests
still varied, but work volume did not.
9. A-P2-1's first unbounded 4,000-request admission pilot exceeded the client's
file-descriptor limit. It was excluded before any CI calculation. Maximum
concurrency 200 was documented before the accepted ten-run series began.
10. After accepted trial 1, a 4 MiB/0% transient appeared after an earlier 0 MiB
cleanup sample. Trial 2 had not launched. Five subsequent 0 MiB/0% samples
were required before resuming the frozen sequence at trial 2.
11. The process sampler recorded 39 transient root-owned processes, including
orchestrator checks and cluster control processes. None used a GPU, host
load remained low, and no process was touched.
12. A-P2-1 fixed completion work but still produced seven generated-text
digests. Because all 40,000 accepted completions were exactly 64 tokens,
this did not recreate attempt 1's work-volume confound.
13. Two malformed temporary stage-diff attempts failed before serving. The
first failed `git apply --check`; the second was immediately reversed after
py_compile exposed incorrect zero-context placement. The final logged diff
passed py_compile, stage semantic checks, and 14 tests before GPU use.
14. Attempt 3 showed that stage `off` could not disable the model-runner's
environment-controlled `CUDAGraphStat` path. The outside-OpProf stop rule
correctly prevented a speculative change in that turn; attempt 4 resumed
only after explicit authorization to trace that path.
15. The first attempt-4 confirmation controller incorrectly applied an ON-file
acceptance check to the true-baseline arm and stopped after that valid
trial. A first resume wrapper then failed a shell declaration before any GPU
launch. The remaining two arms resumed in order with unchanged commands;
neither control-plane error changed a measured result.
16. The first clean-base four-patch test exposed a test-only import-light
regression: the new test loaded real torch before the existing assertion.
Production code was unaffected. The fifth patch stubbed torch, and the
final five-patch clean-base validation passed 15/15.
17. **Footer anomaly:** the attempt-4 quick/full-gate and accepted Layer-2
controllers terminated the API and EngineCore process group simultaneously
after metrics were complete. Their record lines are contiguous and
decodable, but the five full-gate ON files and accepted Layer-2 file have no
footer. They are therefore not promoted as artifact-gate evidence. The
artifact hard gate remains based on the earlier footer-valid streams, and
the one-line cache-factor fix cannot alter recorder shutdown behavior.
18. The first Layer-2 controller used a block-buffered benchmark marker, so the
endpoint fired after load completion and produced no trace. That run is
explicitly excluded; the unbuffered retry produced the accepted trace.
## Artifacts and reproducibility record
- Persistent campaign workdir:
`/home/admin/cpfs/wjh/opprof-phase2-dash0-20260711`
- Runtime artifact archive:
`/home/admin/cpfs/wjh/opprof-phase2-dash0-20260711/phase2-runtime-artifacts.tar.gz`
- Archive SHA-256:
`040eb234818564f880489fca4a1a8b21278210dcd04b9f613e6000a28fbb3beb`
- Archive inventory: 203 files, 7 JSONL files, 12 serving result JSON files;
compressed size 1.6 MiB, uncompressed run tree 6.4 MiB.
- Remote analysis summaries are included at
`runs/artifact-smoke-rerun/artifact-gate.txt` and
`runs/overhead/overhead-analysis.json` inside the archive.
The amended evidence is separately preserved so attempt 1 remains immutable:
- A-P2-1 archive:
`/home/admin/cpfs/wjh/opprof-phase2-dash0-20260711/amendment-a-p2-1-runtime-artifacts.tar.gz`
- A-P2-1 archive SHA-256:
`acbf5eb2f495e322ecb087f8238540806bfa1c412cad3be0d8265f17c2e938cb`
- Inventory: 344 files; 24 MiB compressed and 120 MiB uncompressed.
- Primary analysis:
`runs/amendment-a-p2-1/overhead-attempt2-accepted/overhead-analysis.json`
- Microbenchmark:
`runs/amendment-a-p2-1/microbenchmark/result.json`
- PIECEWISE validation:
`runs/amendment-a-p2-1/piecewise-addendum/artifact-validation.json`
Attempt 3 is separately archived:
- Stage-bisection archive:
`/home/admin/cpfs/wjh/opprof-phase2-dash0-20260711/attempt3-stage-bisection-artifacts.tar.gz`
- Archive SHA-256:
`e2ee764b905a19162f41fbe153283de3b133024c5548813749837c89779dbe58`
- Inventory: 82 files; 12 MiB compressed and 50 MiB uncompressed.
- Bisection analysis:
`runs/stage-bisection-attempt3/bisection-analysis.json`
Attempt 4, including the accepted Kineto trace, is separately archived:
- Fix/confirmation/gate/Layer-2 archive:
`/home/admin/cpfs/wjh/opprof-phase2-dash0-20260711/attempt4-fix-and-gate-artifacts.tar.gz`
- Archive SHA-256:
`55d227d644d3d42c2a68edc19fcb2d47231f6971aa74dca9d2a9ef44de2cefa2`
- Inventory: 536 entries; 56,705,396 compressed bytes.
- Three-arm raw table:
`runs/attempt4-stat-path-confirmation/results.tsv`
- Full gate analysis:
`runs/attempt4-fix-full-gate/overhead-analysis.json`
- Layer-2 analysis and trace:
`runs/attempt4-layer2-window-accepted/layer2-analysis.json` and
`runs/attempt4-layer2-window-accepted/traces/`.
## Final required summary
- **Artifacts hard gate: PASS.** Original composition/accounting checks passed;
the addendum supplied 129 footer-valid PIECEWISE records with exact
mode/bucket/padding semantics.
- **Overhead CI hard gate: PASS.** Fixed ON 29.666501 req/s, OFF 29.654057
req/s, overhead -0.04196%, paired-bootstrap 95% CI
[-0.17443%, 0.04550%]. The unchanged limit was 3%.
- **Attempt history:** attempt 1's 13.1133% / [6.2434%, 19.5259%] is retained
as invalidated; attempt 2's 4.1816% / [3.1364%, 4.7117%] is retained as the
valid pre-fix FAIL; attempt 3 was diagnostic; attempt 4 is the final PASS.
- **Attempt-3 bisection:** off 28.389494, capture 28.257144, encode/null-sink
28.221609, and full/CPFS 28.269199 req/s; incremental overheads 0%, 0.466%,
0.591%, and 0.424%.
- **Exact mechanism:** no TP1 worker serializer exists; the remaining msgspec
leg natively encodes `CUDAGraphStat` with zero hook/pickle calls. Instead,
`envs.compile_factors()` (`vllm/envs.py:2011-2017,2089-2104` in the pinned
pre-fix tree) included `VLLM_OPPROF_DIR`, and `VllmBackend` folded that map
into the graph/AOT cache key (`vllm/compilation/backends.py:1024-1065`). A
unique output directory therefore meant a unique, cold cache.
- **Fix / line delta:** ignore `VLLM_OPPROF_DIR` in compile factors; +1/-0
production line, +21/-1 test lines. Final local tip `bbfa717`, dash0
patch-ID-equivalent tip `9ad32ff`; five exported patches.
- **Unit tests:** 15/15 local (0.02 s), 15/15 dash0 real tip (0.18 s), and 15/15
dash0 clean-base exported-series application (0.07 s); Ruff passed and the
import-light contract is preserved.
- **Layer-2 hard gate: PASS.** Loadable 16,416,452-byte Kineto trace; exactly
2 warm-up + 8 active steps, 790,843 events, 7,367 kernels, and 35 distinct
kernel names. Active mode was `NONE` because each profiled batch was about
8,192 tokens; the coverage caveat is explicit.
- **Recorder microbenchmark:** 29.1467 us/step by whole-loop timing; 27.7620 us
median and 36.6643 us p95 over 10,000 iterations.
- **PIECEWISE verification:** PASS; 129/139 records PIECEWISE, buckets 1-248,
padding 0-7, footer encoded=written=139 and dropped=0.
- **MoE backend observed:** TRITON unquantized in 48/48 campaign server logs.
- **Weights path:** `/home/admin/cpfs/wjh/models/Qwen/Qwen3-30B-A3B`.
- **Total GPU time consumed:** attempt 4 added 4,629 launch-to-clean seconds
(77.15 H20-minutes): confirmation 813, quick signal 648, full gate 2,579,
excluded Layer-2 attempt 329, accepted Layer-2 260. Whole campaign total is
conservatively **11,018.58 seconds = 183.64 H20-minutes = 3.061 H20-hours**.
- **Cleanup:** all eight H20s ended at 0 MiB/0%, with no campaign process.
## Data sanity block
Attempt 4 is the final gate conclusion. Attempts 1-3 remain listed for
auditability and are not pooled into its estimate.
### Attempt 1 (invalidated measurement)
| Numeric family | n | Min | Max | Distinct | Sanity note |
|---|---:|---:|---:|---:|---|
| Initial dash0 GPU memory used (MiB) | 8 | 0 | 0 | 1 | All eight H20s initially idle |
| Initial dash0 GPU utilization (%) | 8 | 0 | 0 | 1 | All eight H20s initially idle |
| Selected-GPU overhead precheck memory (MiB) | 10 | 0 | 0 | 1 | Required before every trial |
| Selected-GPU overhead precheck utilization (%) | 10 | 0 | 0 | 1 | Required before every trial |
| Selected-GPU immediate post-cleanup memory (MiB) | 10 | 0 | 4 | 2 | Trial 6 anomaly stopped the controller; next two checks were 0 |
| Model shard bytes | 16 | 1,087,928,584 | 3,999,975,472 | 11 | Sum 61,066,575,648; no shard missing |
| Unit-test cases | 14 | N/A | N/A | 14 names | 14 passed, 0 failed |
| Footer-valid artifact step index | 109 | 0 | 108 | 109 | File order contiguous and monotonic |
| Artifact scheduled tokens/step | 109 | 0 | 8,192 | 73 | Non-negative |
| Artifact prefill tokens/step | 109 | 0 | 8,188 | 15 | Non-negative |
| Artifact decode tokens/step | 109 | 0 | 200 | 80 | Non-negative |
| Artifact scheduled requests/step | 109 | 0 | 200 | 77 | Non-negative |
| Artifact KV usage ratio | 109 | 0 | 0.370965 | 106 | Every ratio in [0,1] |
| Artifact CUDA-graph bucket | 109 | 0 | 8,192 | 32 | Bucket >= unpadded for every record |
| Artifact CUDA-graph padding | 109 | 0 | 7 | 8 | Exact bucket-minus-unpadded identity |
| Smoke input lengths | 200 | 261 | 761 | 172 | Sum 102,848 |
| Smoke output lengths | 200 | 32 | 96 | 59 | Sum 12,187 |
| ON throughput (req/s) | 5 | 19.877357 | 22.685507 | 5 | Not all identical |
| OFF throughput (req/s) | 5 | 20.378458 | 26.350950 | 5 | Not all identical |
| All throughput (req/s) | 10 | 19.877357 | 26.350950 | 10 | Positive; high run-level spread |
| Measured benchmark duration (s) | 10 | 7.589859 | 10.061700 | 10 | Positive |
| Adjacent-pair overhead fraction | 5 | -0.002012 | 0.236024 | 5 | One negative pair, four positive pairs |
| Bootstrap overhead fraction | 100,000 | -0.002012 | 0.236024 | 232 | Fixed paired resampling; no filtering |
| ON JSONL record count | 5 | 183 | 186 | 3 | Footer-written count matched records; drops all zero |
| ON JSONL bytes | 5 | 165,982 | 168,696 | 5 | Non-negative, non-identical |
| Overhead server GPU lifetime (s) | 10 | 91 | 155 | 9 | Sum 1,260 seconds |
| All server GPU lifetime (s) | 12 | 91 | 414 | 11 | Sum 1,863 seconds |
| Overhead startup time (s) | 10 | 66 | 126 | 7 | Excluded from throughput timing |
| Client wall time including warm-up (s) | 10 | 21 | 25 | 5 | Main metric used internal measured duration |
| Completed requests | 10 | 200 | 200 | 1 | Expected identical fixed workload |
| Failed requests | 10 | 0 | 0 | 1 | Expected invariant |
| Input tokens | 10 | 102,848 | 102,848 | 1 | Expected identical fixed workload |
| Output tokens | 10 | 12,187 | 12,187 | 1 | Expected identical fixed shapes |
| Exact generated responses vs trial 1 | 10 | 185 | 200 | 7 | **Anomaly:** generated-text digests distinct in all ten trials |
### Attempt 2 A-P2-1 valid pre-fix measurement
| Numeric family | n | Min | Max | Distinct | Sanity note |
|---|---:|---:|---:|---:|---|
| Accepted pre-launch GPU memory (MiB) | 10 | 0 | 0 | 1 | Every accepted server launched only after stable zero |
| Accepted pre-launch GPU utilization (%) | 10 | 0 | 0 | 1 | No selected-GPU process present |
| PIECEWISE addendum step index | 139 | 0 | 138 | 139 | Contiguous and monotonic |
| PIECEWISE runtime records | 129 | 1 unpadded token | 241 unpadded tokens | 9 token counts | Every runtime mode was PIECEWISE |
| PIECEWISE bucket tokens | 129 | 1 | 248 | 6 | Bucket >= unpadded |
| PIECEWISE padding tokens | 129 | 0 | 7 | 5 | Exact bucket-minus-unpadded identity |
| Microbenchmark per-iteration cost (us) | 10,000 | 26.293 | 70.111 | 4,144 ns values | Mean 28.9279, median 27.7620, p95 36.6643 |
| Microbenchmark empty-timer cost (us) | 10,000 | 0.082 | 12.012 | 84 ns values | Harness cost small relative to producer path |
| Accepted ON throughput (req/s) | 5 | 28.183682 | 28.256715 | 5 | Range 0.259% of minimum; not identical |
| Accepted OFF throughput (req/s) | 5 | 28.800396 | 29.640096 | 5 | First OFF lower than later OFF runs |
| All accepted throughput (req/s) | 10 | 28.183682 | 29.640096 | 10 | Positive and non-identical |
| Accepted measured duration (s) | 10 | 134.952330 | 141.926096 | 10 | Every run >=120 seconds |
| Accepted pair overhead fraction | 5 | 0.020746 | 0.047369 | 5 | All five pairs positive |
| Accepted bootstrap overhead fraction | 100,000 | 0.020746 | 0.047369 | 263 | CI [0.031364, 0.047117] |
| Completed requests/run | 10 | 4,000 | 4,000 | 1 | Expected fixed workload |
| Failed requests/run | 10 | 0 | 0 | 1 | Required invariant |
| Input tokens/run | 10 | 2,031,054 | 2,031,054 | 1 | Input-length digest distinct=1 |
| Output tokens/run | 10 | 256,000 | 256,000 | 1 | Output-length digest distinct=1 |
| Input lengths in one fixed stream | 4,000 | 256 | 768 | 512 | Same array in all ten runs |
| Output lengths in one fixed stream | 4,000 | 64 | 64 | 1 | `ignore_eos` fixed all work |
| Generated-text digests | 10 | N/A | N/A | 7 | Content varied; token volume did not |
| Accepted ON JSONL records | 5 | 1,403 | 1,406 | 3 | Footers matched; all drops zero |
| Accepted ON JSONL bytes | 5 | 1,283,109 | 1,286,129 | 5 | Mean 914.7 bytes/record |
| Accepted ON active stream span (s) | 5 | 144.726692 | 144.968812 | 5 | Continuous submit-to-complete spans |
| Accepted ON step rate (steps/s) | 5 | 9.681545 | 9.707954 | 5 | Mean 9.696167 |
| Scheduled requests/telemetry record | 7,022 | 0 | 200 | 127 | Non-negative; configured cap 200 |
| Periodic GPU samples | 545 | P0 | P0 | 1 pstate | No pstate transition |
| Active GPU SM clock (MHz) | 318 | 1,740 | 1,980 | 12 | Max-clock family distinct=1 at 1,980 MHz |
| Active GPU power (W) | 318 | 118.46 | 501.12 | 311 | Non-negative |
| One-minute load average | 20 | 0.15 | 1.63 | 19 | Low relative to 160 logical CPUs |
| Newly observed other-user processes | 39 | N/A | N/A | 11 command names | All root-owned; explicitly reported |
| Other-user GPU samples/run | 10 | 0 | 0 | 1 | No GPU contamination |
| Accepted startup time (s) | 10 | 64 | 116 | 8 | ON 111-116; OFF 64-73; excluded from metric |
| Accepted server allocation (s) | 10 | 258 | 312 | 10 | Sum 2,858 seconds |
| Amended server allocation (s) | 13 | 102.54 | 312 | 13 | Burn-in, PIECEWISE, excluded pilot, accepted series; sum 3,303.58 seconds |
| Campaign allocation through attempt 2 (s) | 25 | 91 | 414 | 24 | Sum 5,166.58 seconds = 86.11 H20-minutes |
### Attempt 3 diagnostic bisection
| Numeric family | n | Min | Max | Distinct | Sanity note |
|---|---:|---:|---:|---:|---|
| Stage pre-launch GPU memory (MiB) | 4 | 0 | 0 | 1 | Stable zero before each server |
| Stage pre-launch GPU utilization (%) | 4 | 0 | 0 | 1 | No selected-GPU process |
| Stage throughput (req/s) | 4 | 28.221609 | 28.389494 | 4 | Total spread 0.595% of minimum |
| Stage measured duration (s) | 4 | 147.942050 | 148.822131 | 4 | Every stage approximately 140 seconds or longer |
| Stage overhead vs `off` fraction | 4 | 0 | 0.005914 | 4 | No stage approached 0.041816 |
| Completed requests/stage | 4 | 4,200 | 4,200 | 1 | Fixed work |
| Failed requests/stage | 4 | 0 | 0 | 1 | Required invariant |
| Input tokens/stage | 4 | 2,132,262 | 2,132,262 | 1 | Input digest distinct=1 |
| Output tokens/stage | 4 | 268,800 | 268,800 | 1 | Output digest distinct=1; every output 64 tokens |
| Stage startup time (s) | 4 | 111 | 126 | 4 | Excluded from measurement |
| Stage server allocation (s) | 4 | 301 | 316 | 4 | Sum 1,223 seconds |
| Stage JSONL file count | 4 | 0 | 1 | 2 | Off/encode 0; capture/full 1 |
| Stage JSONL bytes | 4 | 0 | 1,346,466 | 3 | Capture footer 96 bytes; full CPFS 1,346,466 |
| Temporary-diff unit tests | 14 | pass | pass | 14 names | 14/14 remote before trials |
| Restored-branch unit tests | 14 | pass | pass | 14 names | 14/14 local after reversal |
| Whole-campaign server allocation (s) | 29 | 91 | 414 | 28 | Sum 6,389.58 seconds = 106.49 H20-minutes |
### Attempt 4 confirmation, fix, and final gate
| Numeric family | n | Min | Max | Distinct | Sanity note |
|---|---:|---:|---:|---:|---|
| Static typed msgspec round-trip time (us) | 2 | 1.5340 | 1.7215 | 2 | Populated-stat delta 0.1875 us; hook calls 0/0 |
| Static typed MessagePack bytes | 2 | 358 | 451 | 2 | Positive; populated stat is larger as expected |
| Confirmation throughput (req/s) | 3 | 28.452675 | 29.716821 | 3 | Baseline/upstream close; env-set arm isolated |
| Confirmation measured duration (s) | 3 | 134.603900 | 140.584322 | 3 | Every arm >=120 seconds |
| Confirmation difference vs baseline | 3 | 0 | 0.042540 | 3 | Upstream 0.002521; env-set 0.042540 |
| Confirmation compile-cache key | 3 | N/A | N/A | 2 | Baseline/upstream same; env-set alone differed |
| Compared torch.compile time (s) | 2 | 6.07 | 36.41 | 2 | Cache load versus compile/save |
| Compared engine initialization (s) | 2 | 21.85 | 70.22 | 2 | Same cache-key split as compile time |
| Confirmation server allocation (s) | 3 | 248 | 307 | 3 | Sum 813 seconds |
| Quick-pair throughput (req/s) | 2 | 29.677979 | 29.700657 | 2 | Positive, not identical |
| Quick-pair overhead fraction | 1 | -0.000764 | -0.000764 | 1 | Negative means ON was 0.0764% faster; <2% continuation threshold |
| Fixed-gate pre-launch GPU memory (MiB) | 11 | 0 | 0 | 1 | Burn-in plus ten trials all launched from zero |
| Fixed-gate pre-launch GPU utilization (%) | 11 | 0 | 0 | 1 | No selected-GPU process present |
| Fixed-gate ON throughput (req/s) | 5 | 29.637994 | 29.712835 | 5 | Positive and not all identical |
| Fixed-gate OFF throughput (req/s) | 5 | 29.624180 | 29.677443 | 5 | Positive and not all identical |
| All fixed-gate throughput (req/s) | 10 | 29.624180 | 29.712835 | 10 | Total spread 0.299% of minimum |
| Fixed-gate measured duration (s) | 10 | 134.621958 | 135.024835 | 10 | Every run >=120 seconds |
| Fixed-gate pair overhead fraction | 5 | -0.002993 | 0.000674 | 5 | Three ON-faster and two OFF-faster pairs |
| Fixed-gate bootstrap overhead fraction | 100,000 | -0.002993 | 0.000674 | 224 | CI [-0.001744, 0.000455], no filtering |
| Completed requests/run | 10 | 4,000 | 4,000 | 1 | Fixed work invariant |
| Failed requests/run | 10 | 0 | 0 | 1 | Required invariant |
| Input tokens/run | 10 | 2,031,054 | 2,031,054 | 1 | Input-length digest distinct=1 |
| Output tokens/run | 10 | 256,000 | 256,000 | 1 | Output-length digest distinct=1; every completion 64 |
| Generated-text digests | 10 | N/A | N/A | 6 | Content varied; exact work did not |
| Fixed-gate startup time (s) | 10 | 60 | 76 | 6 | Excluded from throughput metric |
| Fixed-gate measured server lifetime (s) | 10 | 244 | 262 | 6 | Sum 2,485 seconds |
| Full-protocol server allocation (s) | 11 | 94 | 262 | 7 | Includes burn-in; sum 2,579 seconds |
| One-minute host-load snapshots | 22 | 0.23 | 2.36 | 20 | Low relative to 160 logical CPUs |
| Current-SM clock snapshots (MHz) | 22 | 345 | 1,980 | 2 | Eleven pre-launch 345; eleven immediate post-run 1,980; max 1,980 throughout |
| Idle memory-clock snapshots (MHz) | 22 | 2,619 | 2,619 | 1 | Stable before/after |
| Other-user GPU process count/run | 11 | 0 | 0 | 1 | Periodic samples contained only campaign processes |
| Fixed-gate ON JSONL records | 5 | 1,406 | 1,412 | 4 | Contiguous step indices and msgspec-decodable |
| Fixed-gate ON JSONL bytes | 5 | 1,285,722 | 1,291,357 | 5 | Positive and not identical |
| Fixed-gate ON footer count | 5 | 0 | 0 | 1 | **Anomaly:** simultaneous teardown; excluded from artifact accounting |
| Final unit-test cases | 15 | pass | pass | 15 names | Local, real-tip remote, and clean-base remote all passed |
### Layer-2 accepted window
| Numeric family | n | Min | Max | Distinct | Sanity note |
|---|---:|---:|---:|---:|---|
| Kineto trace files | 1 | 16,416,452 bytes | 16,416,452 bytes | 1 | gzip and JSON loadable; SHA-256 recorded |
| Trace category counts | 13 | 1 | 713,524 | 13 | Sum 790,843 total events |
| Kernel event count | 1 | 7,367 | 7,367 | 1 | 35 distinct kernel names |
| Active profiler-step number | 8 | 2 | 9 | 8 | Contiguous; configured active count exactly met |
| Active execute context tokens | 8 | 8,025 | 8,048 | 5 | Non-negative |
| Active execute generation tokens | 8 | 144 | 167 | 5 | Context + generation exactly 8,192 each |
| Scheduled collection window duration (s) | 1 | 8.174811 | 8.174811 | 1 | Covers the active trace collection |
| Equal-window completed requests | 2 | 131 | 269 | 2 | Profile versus immediately preceding steady window |
| Equal-window request rate (req/s) | 2 | 16.024836 | 32.905961 | 2 | Indicative 51.30% profiler perturbation |
| Endpoint-window request rate (req/s) | 3 | 5.435085 | 29.872225 | 3 | Profile, equal pre, equal post; stop/finalization included |
| Layer-2 whole-load throughput (req/s) | 1 | 25.869730 | 25.869730 | 1 | 4,000 completed, zero failed |
| OpProf collection-window per-mode record counts | 1 | 10 | 10 | 1 | Only observed mode was `NONE` |
| OpProf endpoint-pre per-mode record counts | 3 | 2 | 215 | 3 | FULL 215, NONE 54, PIECEWISE 2; sum 271 |
| Layer-2 OpProf record count | 1 | 1,407 | 1,407 | 1 | Contiguous; used only for mode/timing evidence |
| Layer-2 OpProf footer count | 1 | 0 | 0 | 1 | **Anomaly:** same simultaneous-teardown issue; not artifact-gate evidence |
| Attempt-4 server allocation (s) | 19 | 94 | 329 | 13 | Sum 4,629 seconds = 77.15 H20-minutes |
| Whole-campaign aggregate GPU time (s) | 1 | 11,018.58 | 11,018.58 | 1 | 183.64 H20-minutes; one GPU only |
Checked invariants across accepted evidence: non-negative counters; KV ratios
in [0,1]; exact KV block accounting and histogram sums; contiguous unique step
indices; footer `encoded=written+dropped` and zero drops in the footer-valid
artifact evidence; graph hit/mode/bucket/padding consistency; footer-valid
PIECEWISE runtime coverage; fixed ABBA order; five adjacent pairs; positive
throughput; 4,000 successes and zero failures per fixed-gate run; durations
>=120 seconds; output lengths exactly 64; input/output arrays identical across
runs; shared post-fix compile-cache key; and per-arm results not all identical.
Negative overhead values are permitted because they denote an ON-faster sample,
not a non-negative counter or probability. Monotonicity/curve continuity is not
applicable to this interleaved repeated-measures experiment.
Attempt 3 additionally checked identical fixed work, zero failures, durations
>=140 seconds, stable-zero GPU prechecks, clean teardown, and four distinct
positive throughputs. Its key invariant failure was conceptual rather than
numeric: stage `off` returned no recorder but could not disable the external
model-runner flag derived directly from `VLLM_OPPROF_DIR`.
Red flags and anomalies were reported before conclusions: attempt 1's invalid
noise/cold-start protocol; the excluded file-descriptor pilot; transient 4 MiB
driver accounting; 39 root-process arrivals; varying content digests; the
attempt-2 mode-correlated startup split and valid CI exceeding 3%; attempt 3's
non-equivalent `off` boundary; the initial clean-base test-isolation failure;
the excluded buffered-marker Layer-2 run; and missing footers caused by the
attempt-4 simultaneous process-group teardown. The PIECEWISE coverage red flag
is closed, not suppressed. Attempt-4 files without footers are explicitly
excluded from artifact accounting rather than treated as footer-valid.