feat(report): record run_config (load/runtime settings) in result_summary.json#377
feat(report): record run_config (load/runtime settings) in result_summary.json#377nvzhihanj wants to merge 1 commit into
Conversation
|
MLCommons CLA bot All contributors have signed the MLCommons CLA ✍️ ✅ |
There was a problem hiding this comment.
Code Review
This pull request introduces a mechanism to resolve the package's git commit SHA using git archive's export-subst feature via a new _git_archival.txt file, falling back to running git rev-parse anchored to the package directory. It also reorders the serialized JSON output of metrics reports to surface key throughput and run identity fields first. Feedback is provided regarding a potential issue where git rev-parse could traverse up to a parent repository if the package is installed in a virtual environment within an unrelated git repository, along with a suggestion to check for the existence of the .git directory first.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
…sha hack Pivot to dynamic VCS versioning per review on #377: - build backend uv_build -> hatchling + hatch-vcs; version is now `dynamic`, derived from git (nearest tag + commits-since + short SHA), written to src/inference_endpoint/_version.py at build time (gitignored). __version__ reads it. - the commit SHA is embedded in the version string itself (e.g. 0.6.dev3+g6eac351), so the report's version is self-identifying for submitters; the stale hardcoded 0.1.0 (unchanged since the first commit) is gone. - get_git_sha now just parses the +g<sha> local segment from __version__ — drops the cwd-dependent `git rev-parse` and the hand-rolled _git_archival.txt parsing. - git-archive/sdist/container builds (no .git) recover the version via the standard setuptools_scm .git_archival.txt export-subst. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Per review on #377: - Drop the result_summary.json key reordering (qps/tps after git_sha) — hard to maintain; Report.to_json goes back to plain field-order serialization. - Add a 'loadgen' field to Report: the run's load-generation settings (benchmark mode, load pattern, target qps/concurrency, n_samples, duration bounds, workers), sourced from config at finalize like 'seeds'. Serialized into result_summary.json and rendered as a 'Load settings:' line in report.txt. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
728749f to
4fe34b3
Compare
4fe34b3 to
bd458f5
Compare
bd458f5 to
10c1e36
Compare
Snapshot the run's load/runtime configuration into the report so it is
self-describing and a run is identified by its settings. A single 'run_config'
field is populated from settings.model_dump(include={runtime, load_pattern,
warmup}) — the Pydantic config is the single source of truth, so new or renamed
config fields propagate automatically, with no hand-listing at the
from_snapshot/finalize call site. 'client' (transport plumbing) and
endpoint_config (api_key/URLs, a sibling of settings) are excluded — the latter
so no secrets leak. Rendered as a 'Run config:' block in report.txt.
Replaces the standalone 'seeds' field (#353): the RNG seeds now live under
run_config.runtime / run_config.warmup.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
10c1e36 to
bdcc983
Compare
| run_config = ctx.config.settings.model_dump( | ||
| mode="json", | ||
| include={"runtime", "load_pattern", "warmup"}, | ||
| ) |
There was a problem hiding this comment.
Should we replicate sections of the config.yaml here - if the goal is reproducibility, we will still need the config.yaml file to run unless we include the whole thing. Otherwise we might end up with inconsistency between the two.
There was a problem hiding this comment.
The saved run_config can differ from what actually ran.
Audit phases override the sample count and ordering in ctx.rt_settings. For example, TEST04 runs one phase with normal sampling and another that repeatedly issues one fixed sample. This code instead saves ctx.config.settings, which does not contain those overrides. Consequently, both phases produce identical run_config blocks and report n_samples_to_issue: null.
Suggested fix: record effective runtime settings from ctx.rt_settings, including the resolved sample count from total_samples_to_issue(), sample_order.kind, and sample_order.fixed_index. Consider placing these under run_config["resolved_runtime"] so the original user configuration remains distinct from resolved values. Please add an integration assertion that TEST04 reference and output-caching phase configurations differ.
Summary
Record the run's load/runtime configuration in the benchmark report so a run is self-describing and reproducible from its own
result_summary.json.A single
run_configfield onReportis populated from the Pydantic config in one line:The config model is the single source of truth — new/renamed config fields propagate automatically, with no hand-listing at the
from_snapshot/finalize call site. Excluded:client(transport plumbing, not run-defining) andendpoint_config(api_key / endpoint URLs — a sibling ofsettings, so no secrets leak).result_summary.json, and rendered as aRun config:block inreport.txt.seedsfield (Feat: Add required fields (TPS/QPS/seed) into results_summary.json #353): the RNG seeds now live underrun_config.runtime/run_config.warmup.Example
result_summary.jsonFrom a real DGX-B300x8 DeepSeek-R1 server (poisson) run —
qps/tpsstay top-level, the run's settings (incl. seeds) are underrun_config(metric dicts elided as{ ... }):{ "version": "0.1.0", "git_sha": "...", "n_samples_completed": 40000, "duration_ns": 3328465383747, "state": "complete", "complete": true, "ttft": { ... }, "tpot": { ... }, "latency": { ... }, "output_sequence_lengths": { ... }, "legacy_loadgen_window_duration_ns": 2753346633148, "qps": 14.53, "tps": 54489.98, "run_config": { "runtime": { "min_duration_ms": 600000, "max_duration_ms": 3600000, "n_samples_to_issue": 40000, "scheduler_random_seed": 42, "dataloader_random_seed": 42 }, "load_pattern": { "type": "poisson", "target_qps": 14.75, "target_concurrency": null, "use_legacy_loadgen_qps_metrics": true }, "warmup": { "enabled": false, "n_requests": null, "salt": true, "drain": false, "warmup_random_seed": 42 } } }Same, rendered in
report.txt:Tests
run_configkeyword-only passthrough; serialization +report.txtrendering; absent ->null.Rebased on latest
main(keeps PR #372'suse_legacy_loadgen_qps_metrics; git_sha handled by #398).🤖 Generated with Claude Code