Files
aituner/docs/opprof/oracle-gap-protocol.md

241 lines
12 KiB
Markdown

# Static-policy oracle-gap protocol
Status: **FROZEN WITH A-OG-1 THROUGH A-OG-4 AMENDMENTS**.
Date frozen: 2026-07-13 (Asia/Singapore). Existing Phase-3 measurements were
inspected only to choose the workload pair and rate brackets. They are
exploratory calibration data, not primary observations in this protocol.
### A-OG-4 — close a majority-shifted boundary (before confirmation scores)
After all four primary frontiers and 70 scores were complete, the controller
was interrupted before the first confirmation produced a score. The partial
`P01-C10-r26-rep1` attempt contained no result, sanity file, or score and is
archived separately. This amendment is therefore blind to confirmation
outcomes.
The original confirmation schedule still runs first. Afterward, each cell's
majority-vote frontier is recomputed. If either side of the *actual* final
boundary has fewer than three trials because the provisional boundary moved,
the controller runs only enough repetitions at that existing rate to reach
three, high-to-low, on a fresh server for that config. It then recomputes the
boundary and repeats for at most three closure rounds. No new rate anchor may
be added. Failure to obtain a monotone, bracketed boundary with three trials
per side within three rounds or the 6 H20-hour cap makes the experiment
inconclusive.
This fills a stopping-rule omission: it does not change any existing score,
majority rule, phase, config, rate grid, SLO, or oracle calculation.
### A-OG-3 — freeze a per-logical-trial transport retry rule (after 62 scores)
The first attempt at `P06-C10-r1.9-rep0` reproduced the same isolated local
transport signature seen in A-OG-2: one clean request raised
`ClientOSError` 3.56 ms after admission, with HTTP status 0, no first token,
and no output. The other 343 requests produced exactly 512 tokens, the server
stayed healthy, drain took 4.00 s, and every other client invariant passed.
The controller again rejected the attempt before creating a `score.json`.
For the remainder of this experiment, an attempt may be quarantined and the
identical logical trial retried once on a fresh server only if all of the
following hold: the sole failed client invariant is `clean_failures_zero`;
exactly one clean request failed; its error is `ClientOSError`, HTTP status is
0, it produced neither a first token nor output, and it completed within 10
ms of admission; every successful request has exact output; and the server
has no crash or error. The attempt is never scored. A second invalid attempt
for the same logical key, more than one failed request, or any other error
signature is a stop condition and makes the experiment inconclusive.
This rule is independent of config, rate, and observed performance, and
supersedes the one-key wording in A-OG-2 without changing how that retry was
executed. Existing scores remain immutable. No client, grid, policy,
threshold, order, SLO, or oracle calculation changes.
### A-OG-2 — retry one transport-invalid attempt (after 49 scored trials)
The first attempt at `P06-C01-r2.2-rep0` produced one local
`ClientOSError` 3.27 ms after admission, with HTTP status 0, no first token,
and no output. The other 399 requests completed successfully, every successful
request produced exactly 512 tokens, the server stayed healthy, and all other
client invariants passed. The controller rejected the attempt before creating
a `score.json`; no TTFT/TPOT result from this attempt was used to choose the
recovery rule.
This is a measurement-transport failure, not an observed server SLO outcome.
The entire attempt is content-hashed and moved under `invalid-attempts/`, then
the identical logical trial (phase, config, rate, repetition, derived manifest,
seeds, timeline, and SLO) is run once on a fresh C01 server. All 49 existing
scores remain immutable. A second client transport failure in the retry is a
stop condition and makes the experiment inconclusive; it must not be retried
again. No grid, policy, threshold, order, or oracle calculation changes.
### A-OG-1 — extend the P06 upper bracket (after trial 33)
The controller stopped as registered after C00/P06 remained SLO-feasible at
every original and upward-extension anchor through 2.3 requests/s. At that
point 33 trials and 1.519475 H20-hours were complete, all GPU memory had been
released, and no C00/P06 infeasible upper bound existed. No oracle inference
was performed.
This amendment changes only the P06 upward-extension list from
`2.1,2.2,2.3` to `2.1,2.2,2.3,2.4,2.5,2.6,2.8,3.0`. The controller stops at
the first bracket exactly as before. Existing trials are immutable and are
reused; config order, P01 rates, SLO, timelines, repetitions, placement,
metrics, and decision threshold do not change. The resumable controller may
accept the new code/protocol fingerprint only when all immutable runtime,
client, model, manifest, config, and base-grid fields match the pre-amendment
state, and it records both fingerprints under `A-OG-1`.
## Question and decision gate
The candidate motivation is:
> A single global static batching policy leaves at least 10% end-to-end
> SLO-goodput on the table when serving temporally heterogeneous phases; a
> phase-aware runtime policy can recover that gap without changing hardware,
> model, precision, or tensor-parallel topology.
This experiment tests a necessary condition in the existing TP1 policy space
`{C00,C10,C01,C11}`. The optimistic oracle knows the phase and switches with
zero delay, zero state-transfer cost, and no prediction error. If even this
oracle cannot beat the best one-config-for-all-phases policy by 10%, an online
controller over these MNS/MBT choices cannot do so either.
The primary gate uses a conservative capacity bracket:
- `L[p,c]`: highest offered rate accepted as SLO-feasible for phase `p` and
config `c`;
- `U[p,c]`: lowest higher offered rate accepted as SLO-infeasible;
- oracle upper bound at phase-time weights `w`:
`sum_p w[p] * max_c U[p,c]`;
- best-static lower bound:
`max_c sum_p w[p] * L[p,c]`.
We scan every P01/P06 time mixture, including pure endpoints. The current
motivation is **REFUTED** if the maximum conservative ratio
`oracle_upper / static_lower - 1` is below 10%. It is **NOT ESTABLISHED** if the
bound crosses 10% but the observed point estimate does not. A positive result
requires a point-estimate gap of at least 10% and then a separately
pre-registered interleaved-trace validation; this frontier experiment alone
cannot establish a positive E2E contribution.
The conclusion is scoped to the measured MNS/MBT policy family and the chosen
strongest-conflict phase pair. It does not rule out new scheduling mechanisms,
KV-state policies, topology changes, or other workload phases.
## Fixed system boundary
| Item | Frozen value |
|---|---|
| Host | `dash0`, one run at a time on physical GPU0 |
| GPU | NVIDIA H20; no other GPU process anywhere on the host |
| Model | `/home/admin/cpfs/wjh/models/Qwen/Qwen3-30B-A3B`, BF16 |
| Runtime | `/tmp/wjh-opprof-phase2-dash0-20260711/.venv`, vLLM `0.24.1.dev3+g668cfb7e2` |
| vLLM source | `/home/admin/cpfs/wjh/opprof-phase2-dash0-20260711/vllm-v0.24.0` |
| Topology | TP1, one server, no data/pipeline parallelism |
| Fixed mechanisms | chunked prefill on; prefix caching on |
| Client | Phase-5 timestamp/fixed-rate wrapper over the Phase-3 exact-token client |
| Seeds | workload `20260712`; trial token-domain seed derived only from phase/rate/repetition, never config |
SLO co-location results in Phase 6 showed pass-rate flips despite small
throughput deltas. Therefore unused H20s remain idle: parallel placement is not
authoritative for this experiment.
## Workloads and policies
The pair is chosen before new measurements because Phase 3 showed the strongest
opposing static preference:
- **P01:** input `U[128,512]`, output exactly 64 tokens, deterministic steady
arrivals. C10 lost 24.27% saturation throughput relative to C00.
- **P06:** 50/50 input mixture `U[128,512]`/`U[4096,8192]`, output exactly 512
tokens, deterministic bursts of eight. C10 gained 3.37% over C00.
Both reuse the immutable 32,768-row Phase-3 manifests. For every trial a
derived manifest preserves request order, lengths, outputs, and arrival class,
but applies a trial-specific token-seed offset. The same derived manifest is
used for all four configs. This prevents prefix-cache carry-over when a hot
server executes several anchors without changing the logical workload.
| Config | Effective MNS | Effective MBT | Extra flags |
|---|---:|---:|---|
| C00 | 1024 | 8192 | none |
| C10 | 64 | 8192 | `--max-num-seqs 64` |
| C01 | 1024 | 2048 | `--max-num-batched-tokens 2048` |
| C11 | 64 | 2048 | both flags |
Startup logs must confirm these values. A default drift is a stop condition.
## Load grid, order, and repetitions
Primary grids:
- P01: `{26,28,30,32,34,36}` requests/s; execution order
`32,26,36,28,34,30`.
- P06: `{1.4,1.5,1.6,1.7,1.8,1.9,2.0}` requests/s; execution order
`1.7,1.4,2.0,1.5,1.9,1.6,1.8`.
Every primary anchor runs once. For each phase/config, the highest primary
feasible anchor and its next higher primary anchor are then run two more times,
giving three trials at both sides of the boundary. If all primary anchors are
feasible, extend upward in the fixed order P01 `38,40,42` or P06
`2.1,2.2,2.3,2.4,2.5,2.6,2.8,3.0`.
If all are infeasible, extend downward in the fixed order P01 `24,22,20` or P06
`1.3,1.2,1.1`. Stop extending at the first bracket.
One primary server is launched per config in order `C11,C00,C01,C10`.
Confirmation servers are fresh and launch in reverse order
`C10,C01,C00,C11`; their boundary anchors run high-to-low. This balances
machine-time drift and makes confirmation independent of the primary server's
cache/compiler state.
Timelines:
- P01: 60 s warm-up + 60 s clean measurement; drain cap 120 s.
- P06: 60 s warm-up + 120 s clean measurement; drain cap 240 s.
- no Kineto profiling; exact greedy output with `ignore_eos`; maximum client
concurrency 256.
A trial is SLO-feasible when at least 95% of requests admitted during the clean
interval eventually finish successfully and individually satisfy both:
- TTFT <= 2 s for input <= 4,096 tokens; <= 4 s for input <= 32,768; <= 6 s
otherwise;
- TPOT <= 50 ms, computed as `(completion - first_token)/(output_tokens - 1)`.
SLO-goodput is the number of those passing clean-admission requests divided by
clean seconds. Client schedule lag must stay <=1 s and achieved clean offered
rate must be within 5% of target. Failure of either condition makes the anchor
infeasible; its admitted-only latency is not used to rescue it.
At a repeated boundary, feasibility is the majority of three trial verdicts.
All accepted anchor verdicts must be monotone in offered rate. A persistent
non-monotone result after the registered repeats is a red flag and stops the
oracle-gap inference.
## Validity and stopping rules
Before every server launch record host, GPU, driver, clocks, runtime package
versions, git/source hashes, manifest hashes, exact commands, and process
contamination. Stop on another GPU process, request/output mismatch, manifest
drift, server crash, non-finite latency, ratio outside `[0,1]`, negative
counter, or discontinuous/non-monotone accepted frontier.
The controller is detached and resumable. It kills only process groups it
created, checks zero GPU memory after every server, never overwrites a complete
trial, and writes state atomically. The hard budget is 6 H20-hours; expected
cost is 3.0--4.0 H20-hours and approximately the same wall time because runs
are serialized.
## Required report
The report includes every trial's target/achieved rate, clean cohort size,
pass count/rate, SLO-goodput, TTFT/TPOT percentiles, schedule lag, failure
reasons, accepted frontier brackets, per-phase oracle choices, best static
choice, equal-time gap, worst-mixture conservative gap, and GPU-hours.
The final statistics section ends with a data-sanity block containing `n`,
min/max, distinct-value counts, and checks for non-negative counters, ratios in
`[0,1]`, non-identical per-config results, exact output work, monotone
frontiers, and continuous rate brackets.