BuildNot yet confirmed elsewhere1 publisher3 min readPublished
Databricks puts your training bill in the data loader and the checkpointer
The argument is that GPU failures are the expected case at scale, so recovery speed sets goodput and therefore spend. Two subsystems most teams write once and forget decide how much idle time each failure costs.
The Engineer · Build desk

What happened
- Databricks argues that training efficiency at scale is set by goodput, the share of time GPUs spend computing rather than waiting or recovering, and that recovery speed therefore drives total GPU spend.
- To sanity-check its 1% annualized failure model, the post cites the 608-GPU H100 Delta supercomputer failing every 1.9 hours, which it maps to a 36-hour mean time to failure for a 32-GPU job.
- On AI Runtime, UCVolumeWriter and UCVolumeReader implement that API against Unity Catalog volumes, staging through local NVMe and marking a checkpoint complete only after the data fully lands.
Why it matters
- decision Databricks' claim that DCP helps even DDP jobs removes the usual reason to defer adoption, which turns resilience code into a day-one choice rather than something rewritten during the first FSDP migration.
- capability A checkpoint that records global layout lets a job resume on fewer GPUs than it started with, so a lost node no longer means waiting for replacement capacity before training continues.
- contradiction The 1% annualized model and the Delta observation differ by roughly two and a half orders of magnitude in GPU-hours per failure, so which one you plan against decides whether daily checkpoints are negligent or merely conservative.
- cost Every synchronous save to remote storage bills tens of seconds of idle accelerators, which is the reason frequent checkpointing stays unaffordable until the upload is moved off the training loop.
Start with the arithmetic that makes checkpoint frequency the dominant lever. Databricks states that a job checkpointing once a day loses, on average, 12 hours of duplicate work per failure [5]. That is the expected value of a uniform failure arrival inside a 24-hour interval: half the interval. Cut the interval to 30 minutes and the same model gives 15 minutes of rework [9]. The GPU itself hasn't changed at all; what changed is the write path.
So what stops teams from checkpointing every 30 minutes is the cost of the write itself. The default is `torch.save` on rank 0 [2]. It serialises, it blocks, and the accelerators sit there. PyTorch's distributed checkpoint inverts that: every rank writes its own shard in parallel, alongside a small `.metadata` file describing how the shards compose back into full tensors [6]. Save time then falls roughly as 1/N in the number of ranks [3].
The `.metadata` file is the part worth reading closely, because it is what makes recovery elastic. Since it records the global layout, the same checkpoint reloads onto a different GPU count, with DCP re-planning which bytes each new rank needs [7]. That is the difference between a node failure meaning "wait for replacement capacity" and meaning "resume smaller". Databricks also pushes back on the assumption that DCP is only for sharded models, noting that it shards and parallel-writes state even for DDP jobs where every rank holds an identical replica [8].
Parallel writes still leave a synchronous barrier: the loop waits until bytes are durable, which for a large checkpoint to a remote volume is tens of seconds of idle accelerators [10]. `async_save` splits it into a fast staging copy plus a background upload that overlaps continued training, so the loop pays for the copy and not the upload [11]. On AI Runtime, `UCVolumeWriter` and `UCVolumeReader` implement DCP against Unity Catalog volumes, staging I/O through local NVMe and marking a checkpoint complete only after its data has fully landed [12].
The failure-rate numbers are where I would want my own measurements before adopting the frame. The back-of-the-envelope model assumes a 1% annualised failure rate per GPU, giving a 256-GPU job over 30 days about a 19% chance of an interruption and 57% at 1,024 GPUs [15]. Databricks then grounds it against the 608-GPU H100 Delta supercomputer, which saw failures every 1.9 hours, implying roughly 36 hours mean time to failure for a 32-GPU job [16]. Those two views are not close. 1.9 hours across 608 GPUs is about 1,155 GPU-hours between failures; a 1% annualised rate is roughly 876,000 GPU-hours per failure, which is two and a half orders of magnitude apart [13]. The stated caveat is that the model covers infrastructure-level issues only [15]. Whichever number transfers to your fleet depends on your hardware age, your thermals, and how much of the tail your health checks catch, and Databricks routes that question to a separate post on detecting and isolating unhealthy GPUs [14].
The loader half of the argument gets less mechanism in this post, but the claim is sharp: a pipeline that cannot keep pace starves the GPUs and erodes goodput just as surely as a crash [1]. In one respect that failure mode is quieter than a crash, since a crash at least shows up in your logs.
What to watch
- Whether Databricks publishes measured save times and goodput deltas for UCVolumeWriter against plain local-disk DCP at comparable checkpoint sizes.
- Whether the companion hardware-health post quantifies how much of the gap between the 1% annualized model and the Delta failure rate its GPU isolation closes.
- Whether async_save's staging copy becomes the new bottleneck on hosts where NVMe is shared with the input data pipeline.
Clarity's read
What the record supports and how the coverage leans. The claims behind it follow.
Reality
- Evidence40
- Adoption28
- Hype gap+18
- Incentives80
- Confidence55
Claim ledger
Ranked by verification strength, evidence, and original report placement.
- [1]
Databricks names two subsystems as routinely treated as afterthoughts that make or break recovery: the data pipeline feeding accelerators and the checkpointing mechanism. It adds that even outside failures, a data pipeline that cannot keep pace with accelerators will silently starve GPUs and erode goodput just as surely as a crash.
- [2]
The first checkpoint most teams write is a simple torch.save on rank 0, whose blocking behaviour leaves GPUs idle and reduces goodput.
- [3]
Databricks says saving time under distributed checkpoint decreases roughly as 1/N with the number of ranks.
- [4]
Databricks defines goodput as the proportion of time GPUs spend on productive computation rather than waiting or recovering from failures, and says training efficiency at scale is determined by that single metric; because GPU failures are the expected case at scale, rapid automatic recovery is the only way to maintain high goodput and manage total GPU spend.
- [5]
Databricks calls checkpoint frequency the single biggest lever on goodput: if you checkpoint once a day, a failure requires rerunning on average 12 hours of duplicate work to return to the pre-failure state.
- [6]
PyTorch's distributed checkpoint has every rank write its own distinct shard in parallel, alongside a small .metadata file describing how the shards compose into the full tensors.
- [7]
Because the .metadata file records the global layout, the same checkpoint can reload onto a different number of GPUs; DCP re-plans which bytes each new rank needs, so recovering onto a reduced-capacity cluster after losing nodes works.
- [8]
Databricks rejects the common assumption that DCP only benefits sharded models, stating DCP shards model state and writes it in parallel across each worker even for DDP training tasks, and that it is the same API needed when moving to FSDP or tensor parallelism.
- [9]
Applying the same half-the-interval rule Databricks uses for a daily checkpoint, a 30-minute checkpoint interval implies about 15 minutes of average duplicate work per failure.
- [10]
Even with parallel writes, a synchronous save blocks training until the bytes are durable in storage, which for a large checkpoint to a remote volume means tens of seconds of idle accelerator time.
- [11]
async_save splits the operation into a fast copy to a staging buffer and a background upload that overlaps continued training, so the training loop pays only for the staging copy and not the upload.
- [12]
On Databricks AI Runtime, UCVolumeWriter and UCVolumeReader implement DCP against Unity Catalog volumes, staging I/O through local NVMe and marking a checkpoint complete only once its data has fully landed.
- [13]
The Delta figure implies about 1,155 GPU-hours between failures, while a 1% annualized per-GPU failure rate implies about 876,000 GPU-hours per failure, roughly two and a half orders of magnitude apart.
- [14]
Databricks points to a companion post on how its fleet detects and isolates unhealthy GPUs before they take down a job, and to a companion Training performance and resiliency guide for code pointers and examples.
- [15]
A back-of-the-envelope model from a companion Databricks post assumes roughly a 1% annualized failure rate per GPU; under that assumption a 256-GPU job running 30 days has about a 19% chance of seeing a failure, climbing to 57% at 1,024 GPUs, and these are described as just infrastructure-level issues.
- [16]
Databricks states the 608 H100 GPU Delta supercomputer saw failures every 1.9 hours, and that this means the average time to failure for a 32-GPU job would be 36 hours.
Sources
1 independent publisher whose own reporting we read for this story.
- databricks.comFast, fault-tolerant PyTorch training on AI Runtime
1 article · August 27, 2026
Topics and entities
Follow any of these and your For You feed starts watching them — no settings page required.