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>
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---56# MLSys Reproducibility78Use this while experiments are still running — reproducibility at this venue is a9measurement-design property, not a packaging afterthought. An MLSys claim is typically10"system A beats system B by X% on workload W on hardware H," and every one of those four11variables can silently drift. The venue's culture (badge-based artifact evaluation, the12MLPerf benchmark lineage published in its own proceedings) means reviewers assume13performance numbers will eventually be re-measured by someone else.1415## Two kinds of nondeterminism — control them separately1617| Source | Examples | Control |18|---|---|---|19| ML randomness | Init seeds, data order, dropout, sampling temperature | Fix and log seeds; report across-seed variation where accuracy matters |20| 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 |2122Papers routinely fix seeds meticulously while leaving thermal state and placement23uncontrolled — backwards for a performance paper, where systems noise usually dwarfs24seed effects on latency numbers.2526## The environment pin — deeper than requirements.txt2728A latency claim depends on layers a Python lockfile never sees. Record all of them:2930- Hardware: GPU/accelerator model and count, CPU, memory, interconnect (NVLink/PCIe31 generation, NIC), storage class.32- System: driver version, CUDA/ROCm version, container image digest, kernel version.33- Framework: exact framework build, compilation flags, graph/eager mode, precision34 (FP16/BF16/FP8/INT4), and any autotuning caches — a warm autotuner cache can fake a35 speedup that a fresh machine cannot reproduce.36- Serving stack: batch policy, concurrency limits, admission control settings.3738## Measurement harness discipline3940```python41import time, statistics4243def measure(step, warmup=20, trials=200):44 for _ in range(warmup): # exclude JIT, autotuning, cache-fill effects45 step()46 xs = []47 for _ in range(trials):48 t0 = time.perf_counter()49 step() # synchronize accelerator inside step()50 xs.append(time.perf_counter() - t0)51 xs.sort()52 return {53 "p50": xs[len(xs)//2],54 "p99": xs[int(len(xs)*0.99)],55 "mean": statistics.fmean(xs),56 "stdev": statistics.stdev(xs),57 "trials": trials,58 }59```6061- Never report a single run for any latency or throughput number; state trial counts and62 either stdev or percentile spread in every table caption.63- Report tails (p95/p99) for anything serving-shaped; means alone hide the behavior64 systems reviewers care about most.65- Synchronize accelerators before timestamps — async launch makes GPUs look infinitely66 fast in naive harnesses.67- Interleave A/B trials (ABABAB, not AAABBB) so thermal drift and co-tenant noise hit68 both systems equally.69- Keep raw measurement logs; tables should be generated from logs by script, so the70 paper, the artifact, and reality cannot diverge.7172## Disclosure floor for the paper itself7374- Workload identity: exact models, datasets or traces, sequence-length/request-rate75 distributions, and how the workload was chosen (a named benchmark family beats a76 bespoke workload for credibility — reviewers know the MLPerf-style conventions).77- Baseline versions and their tuning budget, stated symmetrically with your system's.78- Total compute consumed and, where the paper argues cost efficiency, the price basis79 ($/GPU-hour source and date) behind any dollar figures.80- Energy numbers, if claimed, with the measurement method (whole-node meter vs.81 software counters) — the two can disagree wildly.82- What was *not* controlled, honestly: shared cluster, single hardware family, one83 precision mode. A scoped claim survives re-measurement; an unscoped one does not.8485## Common measurement bugs this venue catches8687Each of these has sunk real performance claims; check for them before a reviewer does.8889- **Warm-cache flattery**: benchmarking after the dataset, weights, or autotuner cache90 is hot, while the baseline runs cold. Symmetrize or report both regimes.91- **Async mirage**: timing GPU work without device synchronization, measuring launch92 latency instead of execution.93- **Batch-mismatch comparisons**: your system at its best batch size versus the94 baseline at its default — a tuning-parity violation wearing a measurement disguise.95- **Coordinated omission**: measuring latency only for requests the system accepted,96 while it sheds load; report drop/timeout rates next to every latency figure.97- **Averaging across heterogeneous workloads**: a single mean over workloads of wildly98 different scales lets one workload buy the headline; report per-workload numbers.99- **Power-state contamination**: comparing runs taken at different GPU clock or100 thermal states; record clocks and lock them where the platform allows.101102## Pre-submission reproducibility drill1031041. Fresh-clone the repo on a machine that has never run the project; follow only the105 README. Every undocumented step found here is a future AE failure.1062. Regenerate the two most important tables from raw logs with one command each.1073. Diff regenerated numbers against the PDF; investigate any discrepancy beyond stated108 variance — this drill catches stale-table bugs that reviewers cannot, but artifact109 evaluators will.1104. Record the wall-clock and dollar cost of the full reproduction; put it in the111 appendix so others can budget.112113## Cycle-volatility warning114115Whether MLSys requires a reproducibility checklist or statement at submission time is a116per-cycle decision that could not be verified for 2026 (待核实) — check the current CFP117and OpenReview form fields rather than assuming either way. Artifact-evaluation badge118mechanics live in `mlsys-artifact-evaluation`.119120## Output format121122```text123[Claim under audit] <system-vs-baseline, workload, hardware>124[Environment pin] <hardware/driver/container/framework/precision status>125[Noise controls] <warmup/trials/interleaving/placement/tails reported?>126[Disclosure gaps] <workload provenance/baseline tuning/compute/cost/energy>127[Drill result] <fresh-machine reproduction outcome + cost>128[Fixes] <ordered, cheapest-first>129```