MLSys Reproducibility
Use this while experiments are still running — reproducibility at this venue is a
measurement-design property, not a packaging afterthought. An MLSys claim is typically
"system A beats system B by X% on workload W on hardware H," and every one of those four
variables can silently drift. The venue's culture (badge-based artifact evaluation, the
MLPerf benchmark lineage published in its own proceedings) means reviewers assume
performance numbers will eventually be re-measured by someone else.
Two kinds of nondeterminism — control them separately
| Source |
Examples |
Control |
| ML randomness |
Init seeds, data order, dropout, sampling temperature |
Fix and log seeds; report across-seed variation where accuracy matters |
| Systems noise |
Clock boosting/thermal state, co-tenant interference, NUMA/PCIe placement, network jitter, filesystem caches |
Warmup phases, repeated trials, exclusive nodes, pinned placement, reporting distributions |
Papers routinely fix seeds meticulously while leaving thermal state and placement
uncontrolled — backwards for a performance paper, where systems noise usually dwarfs
seed effects on latency numbers.
The environment pin — deeper than requirements.txt
A latency claim depends on layers a Python lockfile never sees. Record all of them:
- Hardware: GPU/accelerator model and count, CPU, memory, interconnect (NVLink/PCIe
generation, NIC), storage class.
- System: driver version, CUDA/ROCm version, container image digest, kernel version.
- Framework: exact framework build, compilation flags, graph/eager mode, precision
(FP16/BF16/FP8/INT4), and any autotuning caches — a warm autotuner cache can fake a
speedup that a fresh machine cannot reproduce.
- Serving stack: batch policy, concurrency limits, admission control settings.
Measurement harness discipline
import time, statistics
def measure(step, warmup=20, trials=200):
for _ in range(warmup): # exclude JIT, autotuning, cache-fill effects
step()
xs = []
for _ in range(trials):
t0 = time.perf_counter()
step() # synchronize accelerator inside step()
xs.append(time.perf_counter() - t0)
xs.sort()
return {
"p50": xs[len(xs)//2],
"p99": xs[int(len(xs)*0.99)],
"mean": statistics.fmean(xs),
"stdev": statistics.stdev(xs),
"trials": trials,
}
- Never report a single run for any latency or throughput number; state trial counts and
either stdev or percentile spread in every table caption.
- Report tails (p95/p99) for anything serving-shaped; means alone hide the behavior
systems reviewers care about most.
- Synchronize accelerators before timestamps — async launch makes GPUs look infinitely
fast in naive harnesses.
- Interleave A/B trials (ABABAB, not AAABBB) so thermal drift and co-tenant noise hit
both systems equally.
- Keep raw measurement logs; tables should be generated from logs by script, so the
paper, the artifact, and reality cannot diverge.
Disclosure floor for the paper itself
- Workload identity: exact models, datasets or traces, sequence-length/request-rate
distributions, and how the workload was chosen (a named benchmark family beats a
bespoke workload for credibility — reviewers know the MLPerf-style conventions).
- Baseline versions and their tuning budget, stated symmetrically with your system's.
- Total compute consumed and, where the paper argues cost efficiency, the price basis
($/GPU-hour source and date) behind any dollar figures.
- Energy numbers, if claimed, with the measurement method (whole-node meter vs.
software counters) — the two can disagree wildly.
- What was not controlled, honestly: shared cluster, single hardware family, one
precision mode. A scoped claim survives re-measurement; an unscoped one does not.
Common measurement bugs this venue catches
Each of these has sunk real performance claims; check for them before a reviewer does.
- Warm-cache flattery: benchmarking after the dataset, weights, or autotuner cache
is hot, while the baseline runs cold. Symmetrize or report both regimes.
- Async mirage: timing GPU work without device synchronization, measuring launch
latency instead of execution.
- Batch-mismatch comparisons: your system at its best batch size versus the
baseline at its default — a tuning-parity violation wearing a measurement disguise.
- Coordinated omission: measuring latency only for requests the system accepted,
while it sheds load; report drop/timeout rates next to every latency figure.
- Averaging across heterogeneous workloads: a single mean over workloads of wildly
different scales lets one workload buy the headline; report per-workload numbers.
- Power-state contamination: comparing runs taken at different GPU clock or
thermal states; record clocks and lock them where the platform allows.
Pre-submission reproducibility drill
- Fresh-clone the repo on a machine that has never run the project; follow only the
README. Every undocumented step found here is a future AE failure.
- Regenerate the two most important tables from raw logs with one command each.
- Diff regenerated numbers against the PDF; investigate any discrepancy beyond stated
variance — this drill catches stale-table bugs that reviewers cannot, but artifact
evaluators will.
- Record the wall-clock and dollar cost of the full reproduction; put it in the
appendix so others can budget.
Cycle-volatility warning
Whether MLSys requires a reproducibility checklist or statement at submission time is a
per-cycle decision that could not be verified for 2026 (待核实) — check the current CFP
and OpenReview form fields rather than assuming either way. Artifact-evaluation badge
mechanics live in mlsys-artifact-evaluation.
Output format
[Claim under audit] <system-vs-baseline, workload, hardware>
[Environment pin] <hardware/driver/container/framework/precision status>
[Noise controls] <warmup/trials/interleaving/placement/tails reported?>
[Disclosure gaps] <workload provenance/baseline tuning/compute/cost/energy>
[Drill result] <fresh-machine reproduction outcome + cost>
[Fixes] <ordered, cheapest-first>
Source: brycewang-stanford/Awesome-Journal-Skills → MLSys-Skills/skills/mlsys-reproducibility/SKILL.md
1---2name: mlsys-reproducibility3description: Use when hardening the reproducibility of MLSys performance claims, pinning the full system layer from driver to interconnect, separating ML randomness from systems noise, choosing repetition counts and variance reporting for throughput and latency numbers, and disclosing hardware, workloads, and cost so strangers can re-measure results.4---567# MLSys Reproducibility89Use this while experiments are still running — reproducibility at this venue is a10measurement-design property, not a packaging afterthought. An MLSys claim is typically11"system A beats system B by X% on workload W on hardware H," and every one of those four12variables can silently drift. The venue's culture (badge-based artifact evaluation, the13MLPerf benchmark lineage published in its own proceedings) means reviewers assume14performance numbers will eventually be re-measured by someone else.1516## Two kinds of nondeterminism — control them separately1718| Source | Examples | Control |19|---|---|---|20| ML randomness | Init seeds, data order, dropout, sampling temperature | Fix and log seeds; report across-seed variation where accuracy matters |21| Systems noise | Clock boosting/thermal state, co-tenant interference, NUMA/PCIe placement, network jitter, filesystem caches | Warmup phases, repeated trials, exclusive nodes, pinned placement, reporting distributions |2223Papers routinely fix seeds meticulously while leaving thermal state and placement24uncontrolled — backwards for a performance paper, where systems noise usually dwarfs25seed effects on latency numbers.2627## The environment pin — deeper than requirements.txt2829A latency claim depends on layers a Python lockfile never sees. Record all of them:3031- Hardware: GPU/accelerator model and count, CPU, memory, interconnect (NVLink/PCIe32 generation, NIC), storage class.33- System: driver version, CUDA/ROCm version, container image digest, kernel version.34- Framework: exact framework build, compilation flags, graph/eager mode, precision35 (FP16/BF16/FP8/INT4), and any autotuning caches — a warm autotuner cache can fake a36 speedup that a fresh machine cannot reproduce.37- Serving stack: batch policy, concurrency limits, admission control settings.3839## Measurement harness discipline4041```python42import time, statistics4344def measure(step, warmup=20, trials=200):45 for _ in range(warmup): # exclude JIT, autotuning, cache-fill effects46 step()47 xs = []48 for _ in range(trials):49 t0 = time.perf_counter()50 step() # synchronize accelerator inside step()51 xs.append(time.perf_counter() - t0)52 xs.sort()53 return {54 "p50": xs[len(xs)//2],55 "p99": xs[int(len(xs)*0.99)],56 "mean": statistics.fmean(xs),57 "stdev": statistics.stdev(xs),58 "trials": trials,59 }60```6162- Never report a single run for any latency or throughput number; state trial counts and63 either stdev or percentile spread in every table caption.64- Report tails (p95/p99) for anything serving-shaped; means alone hide the behavior65 systems reviewers care about most.66- Synchronize accelerators before timestamps — async launch makes GPUs look infinitely67 fast in naive harnesses.68- Interleave A/B trials (ABABAB, not AAABBB) so thermal drift and co-tenant noise hit69 both systems equally.70- Keep raw measurement logs; tables should be generated from logs by script, so the71 paper, the artifact, and reality cannot diverge.7273## Disclosure floor for the paper itself7475- Workload identity: exact models, datasets or traces, sequence-length/request-rate76 distributions, and how the workload was chosen (a named benchmark family beats a77 bespoke workload for credibility — reviewers know the MLPerf-style conventions).78- Baseline versions and their tuning budget, stated symmetrically with your system's.79- Total compute consumed and, where the paper argues cost efficiency, the price basis80 ($/GPU-hour source and date) behind any dollar figures.81- Energy numbers, if claimed, with the measurement method (whole-node meter vs.82 software counters) — the two can disagree wildly.83- What was *not* controlled, honestly: shared cluster, single hardware family, one84 precision mode. A scoped claim survives re-measurement; an unscoped one does not.8586## Common measurement bugs this venue catches8788Each of these has sunk real performance claims; check for them before a reviewer does.8990- **Warm-cache flattery**: benchmarking after the dataset, weights, or autotuner cache91 is hot, while the baseline runs cold. Symmetrize or report both regimes.92- **Async mirage**: timing GPU work without device synchronization, measuring launch93 latency instead of execution.94- **Batch-mismatch comparisons**: your system at its best batch size versus the95 baseline at its default — a tuning-parity violation wearing a measurement disguise.96- **Coordinated omission**: measuring latency only for requests the system accepted,97 while it sheds load; report drop/timeout rates next to every latency figure.98- **Averaging across heterogeneous workloads**: a single mean over workloads of wildly99 different scales lets one workload buy the headline; report per-workload numbers.100- **Power-state contamination**: comparing runs taken at different GPU clock or101 thermal states; record clocks and lock them where the platform allows.102103## Pre-submission reproducibility drill1041051. Fresh-clone the repo on a machine that has never run the project; follow only the106 README. Every undocumented step found here is a future AE failure.1072. Regenerate the two most important tables from raw logs with one command each.1083. Diff regenerated numbers against the PDF; investigate any discrepancy beyond stated109 variance — this drill catches stale-table bugs that reviewers cannot, but artifact110 evaluators will.1114. Record the wall-clock and dollar cost of the full reproduction; put it in the112 appendix so others can budget.113114## Cycle-volatility warning115116Whether MLSys requires a reproducibility checklist or statement at submission time is a117per-cycle decision that could not be verified for 2026 (待核实) — check the current CFP118and OpenReview form fields rather than assuming either way. Artifact-evaluation badge119mechanics live in `mlsys-artifact-evaluation`.120121## Output format122123```text124[Claim under audit] <system-vs-baseline, workload, hardware>125[Environment pin] <hardware/driver/container/framework/precision status>126[Noise controls] <warmup/trials/interleaving/placement/tails reported?>127[Disclosure gaps] <workload provenance/baseline tuning/compute/cost/energy>128[Drill result] <fresh-machine reproduction outcome + cost>129[Fixes] <ordered, cheapest-first>130```131132---133134**Source:** [`brycewang-stanford/Awesome-Journal-Skills`](https://github.com/brycewang-stanford/Awesome-Journal-Skills) → `MLSys-Skills/skills/mlsys-reproducibility/SKILL.md`