Did you know Reed Hastings' first company sold software that watched other software run?
Yes, the Netflix guy. Before the DVDs-by-mail, before the streaming wars, Hastings co-founded Pure Software, whose flagship product — Purify — did one thing: it caught memory leaks in the act, on Sun workstations, in the early '90s.
Wait, a memory leak, what's that, you say? Well, sonny, back when the dinosaurs roamed and we walked uphill both ways to school, we worried about memory leaks. (How quaint!) You'd allocate a chunk of memory, forget to hand it back, and your program would bloat until the system keeled over. The bug was invisible: nothing in your source code looked wrong, and nothing in the crash told you where the memory went.
So Purify — and later Valgrind, its open-source descendant on Linux — ran your program under observation. Every memory operation intercepted, every byte in and every byte out accounted for, and a report at the end telling you exactly where you'd dropped one. Developers paid real money for this, because the alternative was guessing.
Hold that thought.
The crazy idea
Last time I argued that models broke the source of truth git gave us — and that the fix isn't reconstructing provenance after the run or declaring it before, but capturing it during: automatically, objectively, as a byproduct of doing the work.
Because that's what provenance does in ML: it leaks. Not with a crash — quietly, the way memory used to. A dataset gets renamed, a preprocessing step goes uncommitted, a config lives only in someone's shell history — and nothing in your source looks wrong. There is no lint for a provenance leak. But there can be a Purify.
So here's the crazy idea. Catch provenance leaking at runtime, the way Purify caught memory. Intercept every file a training run reads and writes. Account for every byte in and every byte out. Hand back a complete record of what the job actually touched.
There's a catch, and anyone who ever ran Valgrind just winced.
Valgrind makes your program crawl — 20x, 50x, go get lunch and it still isn't done. Do that to a training run and you've turned an expensive job into an unaffordable one. On a multi-node GPU cluster running hundreds of dollars an hour, time is money in the most literal way. If runtime observation doubled runtime, the conversation would be over before it started.
Runtime observation — that's crazy!
And it would be, if it cost what Valgrind cost. Which is exactly why we didn't argue about it. We measured it.
We built it twice, on purpose
We built the tool — Runtime Observation & Artifact Registration, which abbreviates to roar, and yes, we worked backward from the animal, and no, I'm not sorry. It records every file a run reads and writes.
We built more than one version of it deliberately: if the answer depends on how you happen to observe, it isn't really an answer. One tracer watches file activity from inside the operating system kernel; another intercepts file operations out in user space, before they ever reach the kernel — two vantage points on the same events, with different overhead profiles. (The mechanics are a rabbit hole worth falling into another day: ptrace is the one to avoid like the plague, eBPF and LD_PRELOAD are the fast paths. Full detail in the tracer docs.)
The first benchmark failed
Then we had to point it at something real — nanochat pretraining on 2×H100 GPUs — and the first thing we learned is that we'd measured nothing at all.
We'd compared a traced run on one cloud instance against an untraced run on another, supposedly identical instance. The numbers looked interesting, and for a little while we believed them — until it dawned on us that the two machines differed by nearly 10% on their own, before any instrumentation entered the picture. The signal we were chasing was smaller than that. We'd been admiring noise.
That wince turned out to be the most useful result of the whole exercise. To measure the overhead at all, we had to corner it: traced and untraced workloads back-to-back on the same hardware, over and over, same seed, same config. Do that and the noise collapses to about a quarter of a percent within a machine — and the tracer signal, finally, steps out of the fog.
Observation is cheap
So how cheap is it? Cheaper than I'd braced for. On shorter runs, tracing added 1.5–4% of wall-clock depending on which tracer; on a roughly three-hour run, that fell to about 1.1%. The shape of it makes sense once you see it: the tracer pays a roughly fixed cost while the GPUs spend more and more time doing real work, so the longer the run, the smaller a slice observation takes. (Full numbers in the benchmarks.)
Why doesn't the ghost of Valgrind apply? Because Purify and Valgrind stood inside the factory, inspecting every operation on every machine — each memory access of a CPU-bound program passed through the observer. Lineage doesn't need the factory floor. It needs the loading dock — what came in, what went out — and on a modern training run the factory floor is the GPU, while the loading dock is comparatively quiet. Valgrind watched every machine. roar watches the doors.
The headline isn't that tracing is free. It's that it isn't remotely expensive enough to be the thing that kills the idea.
The thing we didn't go looking for
And then, chasing that first number, we tripped over a second one we hadn't gone looking for.
Needing another pod, I grabbed whatever was available on RunPod — and what was left that day happened to be PCIe H100s rather than the NVLink SXM hardware we'd been on. Same GPU. Same 80 GB. Different interconnect. If you're deep into GPUs you're already rolling your eyes — of course PCIe is slower. But I hadn't put a number on it, and the number was startling: the same workload ran nearly twice as long — 89% more wall-clock. That gap was about twenty times larger than the worst tracing overhead we'd measured.
Do the economics and it gets worse. The PCIe H100 rents for roughly 10% less per hour than its NVLink sibling. A 10% discount on hardware that takes 89% longer means each completed run costs you roughly 70% more. The discount has negative value. Better still: the same RunPod catalog listing landed different silicon on different days — one pod SXM-class, one PCIe. Nominally identical, priced identically, half the speed.
Now, this doesn't mean hardware doesn't matter; engineers sweat it for good reason. What stopped me was noticing where my own attention had gone: I'd spent weeks fretting over a few percent of instrumentation cost while waving off hardware effects twenty times bigger as background scenery. The expensive variable was the one I'd never put a number on — and if you're not tracking which hardware your runs actually landed on, it's going to bite you too.
Which changes the question
The standing objection to runtime observation is that visibility costs speed. Having actually measured it, I don't think that's the live question anymore. On modern training workloads, observation is cheap enough to be practical — so the interesting question was never whether we can afford to observe a run. It's whether we can trust what we observed.
Remember the PhD student from last time, the one whose model already knew the answer? He didn't recover by trusting his results more — he recovered by refusing to, and then verifying. Cheap observation buys you a faithful record of what happened. It doesn't yet tell you whether that record can be believed. That's the harder half of the problem, and the one I'll pick up next.
What about you — what's the biggest variable in your training stack that you've never actually put a number on?