Skip to content

docs: steady-state metrics reporting design proposal - #447

Open
nv-alicheng wants to merge 2 commits into
mainfrom
doc/alicheng-steady-state-design
Open

docs: steady-state metrics reporting design proposal#447
nv-alicheng wants to merge 2 commits into
mainfrom
doc/alicheng-steady-state-design

Conversation

@nv-alicheng

Copy link
Copy Markdown
Collaborator

Post-processing step (and ad-hoc CLI over events.jsonl) that reports steady-state metrics — super-pass windowing, guarded drain-tail cut, CoV ensemble + trend gate (drift up/down), hairball, edge-case handling.

What does this PR do?

Adds a design doc for a new steady-state window detection and metrics reporting feature

Type of change

  • Bug fix
  • New feature
  • Documentation update
  • Refactor/cleanup

Related issues

cc @arekay-nv to tag any related issues

Testing

  • Tests added/updated
  • All tests pass locally
  • Manual testing completed

Checklist

  • Code follows project style
  • Pre-commit hooks pass
  • Documentation updated (if needed)

@nv-alicheng
nv-alicheng requested a review from a team August 13, 2026 23:55
@github-actions

Copy link
Copy Markdown

MLCommons CLA bot All contributors have signed the MLCommons CLA ✍️ ✅

Comment thread docs/steady-state-detection.md Outdated
Comment on lines +64 to +66
a run killed by `SIGKILL`/OOM before the log is flushed yields a truncated log;
the step must degrade to a best-effort result with a status flag rather than
fail (§5.6).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe I am not reading it in the right way - but I thought it should fail if the original run fails?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What does "failing" mean here — a request timeout or a process crash? My intent is that a timeout should still yield a best-effort (partial) result over whatever was logged, while a hard crash of the post-process can just fail. Could you clarify which case you had in mind so I word the edge-case handling to match?

Comment thread docs/steady-state-detection.md Outdated
Comment thread docs/steady-state-detection.md Outdated
Comment thread docs/steady-state-detection.md Outdated
- **Relative active concurrency.** In-flight count as a percentage of the
max-concurrency budget (100% at saturation).
- **Issue-time window.** A contiguous range of super-passes `[start, end)`. Its
measured set is every request _issued_ in that range. Throughput uses the

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This might requires some clarification - as far as i understand from below a sample issued but whose response is not received has no logged TTFT and is naturally excluded. So either it is issue only or issue with at least one event to be included in a window.

Comment thread docs/steady-state-detection.md Outdated
client. The window measures the sustained behavior of a healthy server; a
genuinely unhealthy server produces bad-but-real numbers, which the drift
detector (§5.5) distinguishes from transient pollution.
- **Super-pass.** One full **dataset pass** — `dataset_size` consecutive requests

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

minor - would it be easier to just call it a pass instead of a super-pass since it is a single pass over the entire dataset?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Kept super-pass deliberately rather than pass: it is not always one full dataset pass. A low-concurrency run may not issue even a single full pass, so reusing pass would create a terminology conflict. It's also a tunable hyperparameter — e.g. 2 dataset passes per super-pass to reduce per-super-pass variance. Reworded the §5.1 definition in bad5e83 to make this explicit.

Comment on lines +341 to +342
(everything issued at `t=0`), so there is no client-side issue-time window and no
client-side drain boundary. The step detects the mode and finds the steady region

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for TPOT calculations, we could potentially use the completion-first_token time, but that would require the server to not evict requests in decode phase.

Comment thread docs/steady-state-detection.md Outdated
## 5.7 Complementary: staggered ("feathered") issuance

The ramp exists because the target concurrency `C` is filled as a burst. A
staggered fill flattens the ramp-up spike: issue in steps of `ceil(C/k)` and, between

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add a small definition for k.

Comment on lines +378 to +382
- **ISL / OSL** are reported for analytics, not as validation numbers: once the
window is allowed to drop samples (not enforcing full dataset-pass boundaries),
the input/output-length distribution is skewed relative to the constructed
dataset and is no longer a meaningful validation quantity, though it remains
useful for analysis.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the window is allowed to drop samples, should the ISL/OSL statistics be computed for the samples included in the measurement?


# 6 Open questions {#6-open-questions}

- **Default parameters.** The warmup band, trailing-window length, per-percentile

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we ignore the first pass/super-pass over the dataset as a warmup pass and the other parameters can be benchmark specific decided by TF?

Comment thread docs/steady-state-detection.md Outdated
- **Guard distance measure.** The exact two-sample statistic and acceptance bound
for the per-token-invariance guard (§5.4) need to be fixed.
- **No-steady-state runs.** When no steady state is found (a tracked metric is
Drifting Up), should the run be reported _invalid_ — analogous to legacy

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should declare the gates for each benchmark and also define whether a submission should be invalid if it fails a certain gate. It should be a benchmark TF decision on what gates to include.

@nv-alicheng
nv-alicheng force-pushed the doc/alicheng-steady-state-design branch 2 times, most recently from 5e936f6 to bad5e83 Compare August 18, 2026 17:54
@arekay-nv
arekay-nv requested a review from hvagadia August 18, 2026 18:05
client. The window measures the sustained behavior of a healthy server; a
genuinely unhealthy server produces bad-but-real numbers, which the drift
detector (§5.5) distinguishes from transient pollution.
- **Super-pass.** The atomic unit of the analysis: a contiguous block of requests

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there an assumption here that we need more than one super-pass? How many would be needed to get a good estimate?

[ ingest -> per-super-pass series ] issue-order bucketing
|
v
[ adaptive warmup crop ] remove the ramp

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How is ramp detected?

Comment thread docs/steady-state-detection.md Outdated
**Ensemble and window selection.** CoV alone is insufficient — a window is only
meaningful if the metric is in Plateau. In practice, over a large set of runs, no
single `(window, bound)` fits all metrics and workloads, so the rule is run as an
**ensemble** of preset `(window, bound)` settings. Among the settings that report

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you explain what does "ensemble of (window, bound)" mean exactly? How are the values of window and bound decided?

nv-alicheng and others added 2 commits August 20, 2026 14:21
Post-processing step (and ad-hoc CLI over events.jsonl) that reports
steady-state metrics — super-pass windowing, guarded drain-tail cut,
CoV ensemble + trend gate (drift up/down), hairball, edge-case handling.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@nv-alicheng
nv-alicheng force-pushed the doc/alicheng-steady-state-design branch from bad5e83 to 158d294 Compare August 21, 2026 00:23
@github-actions github-actions Bot added the size/very-large PR Review Policy: >1500 lines or >50 files label Aug 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/very-large PR Review Policy: >1500 lines or >50 files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants