Keeping the training run alive  / field guide
AI & LLM Systems · 2026-09-26

Keeping the training run alive

A frontier training run is one synchronous computation spread across thousands of machines, where a fault in any single part stalls every other part, and the parts fail daily. This guide reconstructs how teams survive that: from the two complete public training logbooks (Meta's OPT-175B and BigScience's BLOOM), the handbook their operator wrote afterwards, and the fault-tolerance code the industry shipped since. Afterwards you can set a checkpoint cadence from arithmetic rather than fear, and say which failure class your watchdogs will miss.

30 ledger rows, 24 artefacts 7 organisations 10+ logged incidents Evidence through Sep 2026 Read: 22 min
01

The territory

The problem, stated without naming a framework: one computation must run for weeks across tens of thousands of parts, any part can stall the whole, and progress survives only through state that was deliberately saved.

~90
restarts to train OPT-175B, against an ideal 33 days on 1,024 A100s
2/day
machines lost from the OPT cluster, steady state
18h
lost to one stall that no timeout ever caught, on BLOOM
69→95%
goodput on a thousands-of-GPUs job, from fault-tolerance automation alone

Training a large model is the one modern workload with mainframe failure semantics. A web fleet loses a machine and sheds a sliver of capacity; a synchronous training job loses a machine and produces nothing at all until that machine's work is re-homed, because every rank waits on every other rank at every step. Meta's OPT-175B logbook records what that means: "~2 machines go down every day" out of 128 hosts, and roughly 90 restarts to complete what would have been 33 uninterrupted days of compute. BigScience's BLOOM chronicles show the same shape at 384 GPUs: a GPU death "every week or so", absorbed by automation, and occasional stalls that were not. The stakes have grown since: Meta reports the Llama 3.1 family consumed 39.3 million H100-hours of training compute, which prices an hour of cluster downtime in thousands of GPU-hours.

The public record of this problem has an unusual shape, and this guide leans into it. The two most detailed accounts ever published are engineering logbooks written during the incidents, in 2021 and 2022, by teams who deliberately shipped their notes with the model. Nothing as complete has appeared since, even as clusters grew tenfold; the quantitative accounts of the 10,000-GPU era live in papers this session's network could not reach (section 5 names them). What became public instead is code: between January 2023 and October 2024, Ant Group, Meta and NVIDIA each shipped an open-source fault-tolerance layer, and the PyPI record dates Meta's torchft (2024-10-13) and NVIDIA's resiliency extension (2024-10-15) two days apart. The lessons of the logbooks took about three years to become installable software, and reading the two eras against each other is the most instructive thing this corpus offers.

The finding that reframes the topic

The most expensive incidents in both logbooks were not GPUs failing; they were the recovery machinery failing. OPT's worst single incident was the cloud provider's support team accidentally deleting the entire cluster while replenishing the spare-node pool; its checkpoint restores hung on blob storage; BLOOM's crash-to-restart chain routinely failed to fire; and PyTorch's own diagnostic dump can fail under exactly the error-handling setting operators are told to enable. Treat detection, checkpointing, spares and restart as a second production system with its own failure modes, because that is what the record shows it to be.

Figure 1 · Where the public record lives

pain, filed as issues

hardened into packages

The tooling wave, 2023-26

DLRover, Ant Group
first release 2023-01

torchft, Meta
first release 2024-10-13

nvidia-resiliency-ext
first release 2024-10-15

The framework record, 2022-26

Issues filed from the incidents
pytorch 76287, 121055

NCCL watchdog, heartbeat monitor,
flight recorder in ProcessGroupNCCL

The logbooks, 2021-22

Meta OPT-175B chronicles
1,024 A100s, ~90 restarts

BigScience BLOOM chronicles
384 A100s, weekly GPU deaths

pain, filed as issues

hardened into packages

The tooling wave, 2023-26

DLRover, Ant Group
first release 2023-01

torchft, Meta
first release 2024-10-13

nvidia-resiliency-ext
first release 2024-10-15

The framework record, 2022-26

Issues filed from the incidents
pytorch 76287, 121055

NCCL watchdog, heartbeat monitor,
flight recorder in ProcessGroupNCCL

The logbooks, 2021-22

Meta OPT-175B chronicles
1,024 A100s, ~90 restarts

BigScience BLOOM chronicles
384 A100s, weekly GPU deaths

Two complete logbooks from 2021-22 feed a period of framework hardening and, three years later, an installable tooling wave; dates are from the documents and the package registry.
Diagram source

Scope: this guide covers keeping a synchronous training job running against hardware and infrastructure failure: detection, checkpointing, spare capacity, restart, and per-step recovery. It deliberately excludes loss spikes and numerical divergence (a training-science problem the same logbooks also document), silent data corruption in depth, and serving reliability. It also, by necessity, excludes the paper record: this session could reach only GitHub and the package registries, which is why every citation is a logbook, an issue thread, source code or a registry timestamp, and why the famous paper numbers are named as a gap rather than quoted.

02

How it is actually built

Five organs recur across every system in the corpus: screening before the run, layered detection during it, tiered state preservation, a spare-capacity pool, and restart orchestration. The divergence point is what restarts: the whole world, or one replica group.

Figure 2 · The reference shape

admits nodes

stall or crash

saves state continuously

verdict

replacement node

newest usable tier

resume

1 · Screening
burn-in, fabric tests, health checks

The training job
one synchronous failure domain

2 · Detection
in-process watchdog + heartbeat monitor
+ external observer

3 · State preservation
tiered checkpoints,
device to host to local to remote

4 · Spare capacity
validated buffer nodes

5 · Restart orchestration
scheduler-level teardown,
elastic agents, quorum

admits nodes

stall or crash

saves state continuously

verdict

replacement node

newest usable tier

resume

1 · Screening
burn-in, fabric tests, health checks

The training job
one synchronous failure domain

2 · Detection
in-process watchdog + heartbeat monitor
+ external observer

3 · State preservation
tiered checkpoints,
device to host to local to remote

4 · Spare capacity
validated buffer nodes

5 · Restart orchestration
scheduler-level teardown,
elastic agents, quorum

Every box is attributable: screening and buffers from the OPT logbook, the two-deadline watchdog from ProcessGroupNCCL, external observation from the PyTorch Conference 2024 poster, tiered checkpoints from DLRover and Orbax.
Diagram source

Screening exists because the delivered fleet is not the working fleet. The OPT team found that replacing a node through the cloud interface "can take hours for a single machine" and that "more often than not we would end up getting the same bad machine again", so they built their own GPU burn-in and InfiniBand tests and scripted the replacement. Bekman's fault-tolerance handbook, distilled from operating BLOOM, puts a number on why: "There can be as large as 10% failure rate early on for new accelerators", and one failed accelerator idles the other eight on its node. NVIDIA's resiliency extension now ships "system-wide health checks" as a product feature, which is the 2021 shell script promoted to a supported layer.

Detection is layered because each layer fails. Inside the process, PyTorch's NCCL watchdog enforces a 10-minute default timeout per collective (kProcessGroupNCCLDefaultTimeout). Watching the watchdog, a heartbeat monitor tears the process down if the watchdog thread itself stops making progress for 8 minutes, because, as the header comment explains, CUDA and NCCL calls "may hang" and the alternative is "jobs being stuck for a prolonged time than necessary tying up cluster resources". Outside the process sits the layer the 2024 poster describes: a flight-recorder ring buffer of recent collectives, dumped on timeout, and a per-node HTTP WorkerServer that an independent monitoring service polls for dumps, NCCL state and py-spy profiles. That third layer is exactly the tool the BLOOM operator lacked in April 2022, when the job stalled with "gpus spinning at 100%" and diagnosis meant hand-running py-spy over SSH; the mechanism was institutionalised rather than invented.

State preservation is a tier ladder, not a file. The 2022 systems wrote one artefact to one place: BLOOM saved 2.3 TB to a parallel filesystem every 100 iterations, OPT pushed 992 files to blob storage. The current systems copy device state synchronously to host shared memory in seconds, persist asynchronously from there, and restore from the fastest tier that survived the failure: DLRover's flash checkpoint reloads "directly from the host memory" when only the process died, and Google's Orbax emergency checkpointing defaults to a local save every 10 steps against a much rarer persistent one. Figure 3 draws the ladder; the decision section prices it.

Figure 3 · The checkpoint tier ladder

synchronous copy

asynchronous persist

less frequent persist

process restart:
reload in seconds

node replacement: full download
OPT: 1.6TB, sometimes hung

GPU memory
the live state

Host shared memory
DLRover: sync copy, seconds

Node-local storage
Orbax local tier:
default every 10 steps

Remote store
BLOOM: 2.3TB in 40s on GPFS,
every 100 iterations

synchronous copy

asynchronous persist

less frequent persist

process restart:
reload in seconds

node replacement: full download
OPT: 1.6TB, sometimes hung

GPU memory
the live state

Host shared memory
DLRover: sync copy, seconds

Node-local storage
Orbax local tier:
default every 10 steps

Remote store
BLOOM: 2.3TB in 40s on GPFS,
every 100 iterations

Each tier trades durability for restore speed; the design goal is that the common failure (a process dies) restores from the fast tier, and only node loss walks down the ladder. Times from DLRover, Orbax and the BLOOM chronicles.
Diagram source

Spare capacity and orchestration close the loop. OPT ran a buffer pool that grew from 4 hosts to 18, plus 12 for the holidays, as correlated failures overwhelmed the smaller pool, and by the end the pipeline of health checks, node swap and resume had recovered from 8 failures unattended in about a week. The divergence point among current systems is the restart unit. The stop-the-world school (DLRover, NVIDIA's in-job restart) keeps the allocation but restarts the processes in place, skipping the scheduler queue. The per-step school (torchft, wired into torchtitan) makes the replica group the failure domain: a quorum service admits and evicts groups "at the training step granularity", and a healed group receives weights by "live recovery from a healthy peer" rather than from storage. Bekman states the prize plainly: with replication "you only ever lose one iteration, whereas with file system checkpointing you may lose hundreds of iterations". The cost is that it requires data-parallel replication and a redesigned training loop, which is why it shipped as a library with a coordinator (the lighthouse) rather than as a flag.

Detection stack

Collective timeout (10 min default), watchdog heartbeat (8 min), flight-recorder dump, external poller with py-spy. Each layer exists because the one below it can hang.

Seen at: PyTorch c10d, Meta poster, NVIDIA NVRx

State preservation

Tiered saves: device to host shared memory synchronously, then async to local and remote. Restore prefers the fastest surviving tier. Keep two remote checkpoints; the newest can be torn by the crash that ended the run.

Seen at: DLRover flash, Orbax emergency, Bekman

Capacity and orchestration

Validated buffer nodes sized for correlated failure, scheduler-level teardown so a dead rank cannot leave the job in limbo, and either in-place restart or per-step quorum over replica groups.

Seen at: OPT logbook, DLRover design, torchtitan + torchft

03

The decisions that matter

Each decision below was faced, in writing, by at least one team in the corpus. The flips-when column is the rule you can reuse.

How often do you checkpoint?

Chosen
  • BLOOM: interval set by tolerable loss, not save cost. After losing 7.3h to a crash "2 iterations before checkpoint saving time", the team cut the interval to 100 iterations: "we would lose at most 3h".
  • The arithmetic, from Bekman: 40s saves every 3h cost 0.37% of the whole run.
Rejected
  • Saving every few minutes to remote storage: "this too would dramatically delay the reaching of the finish line because large models can't be saved quickly" (Bekman).
  • Rare heroic checkpoints: one mid-interval failure erases hours across the whole fleet.
Flips when
  • Save cost collapses. Once the save is a synchronous copy to host memory with async persistence, the interval question dissolves: DLRover persists in seconds (persistence time cut ~70x) and Orbax defaults its local tier to every 10 steps. If your save still costs minutes, fix that before tuning the interval.

What restarts when something dies: the world, or one replica group?

Chosen (2022, still the default)
  • Whole-job restart from the newest checkpoint. Every failure in the OPT and BLOOM logbooks was handled this way; it needs no algorithmic change and covers every parallelism layout.
Rejected then, shipping now
Flips when
  • You have data-parallel replica groups whose temporary loss you can tolerate (throughput shrinks until healing), and you can adopt the coordinator. Without weight replication (a job that is all tensor/pipeline parallel) there is no healthy peer to heal from, and whole-job restart remains the only move (torchtitan docs).

On a stall: tear the process down, or surface the error and heal?

Chosen by the 2022 operators
Rejected then
  • Trusting timeouts to fire: BLOOM watched a broadcast sit for 3+ hours with "No timeouts from NCCL or distributed".
  • Handling errors in-process with no supervisor: nobody is left to act on the error.
Flips when
  • A supervisor exists that can act on a surfaced error. torchft's process groups "report errors sanely and be reinitialized gracefully" precisely so the manager, not abort(), decides. Fail-fast is correct until the day you install something that can do better, and wrong after it.
DecisionChosenRejectedBecauseEvidence
Spare capacityOwn validated buffer pool (4, then 18+12 hosts)Replace via provider on demandReplacement took hours and "more often than not" returned the same bad machineOPT logbook, 2021
Node admissionBurn-in and fabric tests before joiningTrust the scheduler's view of health~10% early-life accelerator failure; nodes arrive broken in ways schedulers cannot seeBekman, NVRx
Who tears down a stuck jobThe scheduler (--kill-on-bad-exit), outside the processThe training runtime handles its own exittorch.elastic left workers "hanging in an infinite state of logging for 8 hours"pytorch #76287, 2022
Restart placementIn-job restart on standby workersRequeue through the schedulerReallocation waits in queue; NVRx restarts "without the need to reallocate SLURM nodes"NVRx README, DLRover design
Checkpoint destinationTiered: host memory, local, then remoteRemote store onlyRestores from remote hung (OPT); host-memory reload recovers a process crash in secondsOPT logbook, DLRover flash
Operator overrideStop-file polled by the training loopRely on scheduler permissionsOn the shared HPC machine nobody else could stop a colleague's job; the file could be created by anyone on the teamBLOOM chronicles

Figure 4 · What to do when a rank stops: the path the corpus converges on

silent stall

error

yes

no

yes

no

A rank fails or stalls

Did an error surface,
or is it a silent stall?

Impose a deadline from outside:
watchdog heartbeat, external observer,
then tear the process down

Are weights replicated
across DP groups?

Evict the replica group, requorum
next step, heal live from a peer
(torchft)

Validated spare
immediately available?

Swap the node, restart in-job,
restore from fastest tier
(NVRx, DLRover)

Requeue the job, restore from
newest remote checkpoint

silent stall

error

yes

no

yes

no

A rank fails or stalls

Did an error surface,
or is it a silent stall?

Impose a deadline from outside:
watchdog heartbeat, external observer,
then tear the process down

Are weights replicated
across DP groups?

Evict the replica group, requorum
next step, heal live from a peer
(torchft)

Validated spare
immediately available?

Swap the node, restart in-job,
restore from fastest tier
(NVRx, DLRover)

Requeue the job, restore from
newest remote checkpoint

Terminal nodes are actions. The left branch exists because stalls, unlike crashes, need a deadline imposed from outside; the replica-group branch is the 2024-26 addition. Reconstructed from the BLOOM chronicles, torchft and NVRx.
Diagram source
04

What broke in production

The logged incidents sort into four classes: hard faults, silent stalls, fail-slow, and failures of the recovery machinery itself. The fourth class is the expensive one, and the one designs least often account for.

"For some reason NCCL wasn't timing out either! even after 3 hours of not being able to broadcast." BigScience BLOOM training chronicles, entry of 2022-04-30
Postmortem

Hard fault: died two iterations before the save

AssumptionA 200-plus-iteration checkpoint interval was a fair trade against a 40-second save.
What happenedA GPU raised CUDA error: unknown error during a collective; the job died 2 iterations before the scheduled save.
Blast radius7.3 hours of training on 384 GPUs, roughly 2,800 GPU-hours (derived), from one component fault.
FixInterval cut to 100 iterations the next day: "we would lose at most 3h".
Design ruleExpected loss is uniform over the interval; set the interval from the loss you can absorb on your worst day, then drive the save cost down until that interval is cheap.
Postmortem

Hard fault, correlated: five hosts at once, buffer of four

AssumptionSpares sized for the average failure rate (~2 machines/day) would cover replacement.
What happenedFive hosts went down together on Dec 6, 2021, against a buffer pool of four.
Blast radiusExtended recovery for the whole 1,024-GPU job; the logbook calls the episode out specifically.
FixBuffer raised to 18 hosts, then 12 more for the holidays; weekly meetings with the provider's infra team.
Design ruleSize spares for the correlated event (a switch, a rack, a bad firmware batch), not the daily average; failures at this scale arrive in groups.
Postmortem

Silent stall: 18 hours, and no timeout ever fired

AssumptionIf ranks stop making progress, NCCL or torch.distributed timeouts will surface it.
What happenedAn eval-time broadcast deadlocked; GPUs spun at 100%, logs went quiet, the scheduler reported RUNNING, and no timeout fired for over 3 hours. Diagnosis was manual py-spy across dozens of nodes, over a weekend.
Blast radiusAbout 18 hours of training lost by the time the cause was found and rolled back; a related stall cost ~11h more in May.
FixNCCL_ASYNC_ERROR_HANDLING=1 plus srun --wait=60 --kill-on-bad-exit=1: make communication errors fatal and let the scheduler end the job.
Design ruleA deadline on collectives is not a deadline on progress. Watch the step counter from outside the process, and treat "running, silent, GPUs busy" as an incident state, not a healthy one.
Postmortem

Fail-slow: one GPU, five percent of the fleet

AssumptionA degraded node would show up in a node-level benchmark.
What happenedThroughput fell from 149 to 140 TFLOPs mid-run and stayed there. Network tests were clean. The operator found the node by excluding three nodes per restart and binary searching, on a weekend, with 3 spares.
Blast radius5% of 384-GPU throughput for the days it took to isolate; the culprit node's own benchmark deviated only 2.5%.
FixNode excluded, slow GPU replaced. The tooling gap later became products: straggler detection in NVRx, flight-recorder straggler classification at Meta.
Design ruleFail-slow hides below benchmark noise but compounds across synchronous steps. Detect it fleet-relative, at the collective level, continuously; never by benchmarking nodes one at a time.
Postmortem

Recovery machinery: the provider deleted the cluster

AssumptionReplenishing the spare-node pool is a routine, safe operation.
What happened"In the process of replenishing this pool, the cloud provider's support team accidentally deleted our entire cluster on December 21."
Blast radiusFull stop for the 1,024-GPU run; the restored cluster came back with 16 machines failing infrastructure checks and stayed "somewhat unstable" through the holiday.
FixEscalation channels, then automation: monitoring and health checks glued into unattended recovery, with a 14-days-without-humans goal.
Design ruleRecovery operations are change operations on your most valuable state. Gate them, stage them and drill them like production deploys, because they run most often exactly when the system is already degraded.
Source

Recovery machinery: the restarter would not restart

AssumptionWhen a node crashes, the elastic launcher ends every worker so the scheduler can requeue the job.
What happenedtorch.elastic detected the crash and ended most workers, but the failing node's workers hung; the job sat "in an infinite state of logging for 8 hours" until a human intervened. Filed by BLOOM's operator; still open in 2026. The same class recurs on the diagnostic path: flight-recorder dumps can fail under TORCH_NCCL_ASYNC_ERROR_HANDLING=1, per an issue a PyTorch maintainer filed and later closed as not planned.
Blast radius8 hours of a 384-GPU allocation burned by the recovery layer, not by the fault.
FixBelt and braces at the scheduler: --kill-on-bad-exit, --wait=60, plus an external watchdog on log progress.
Design ruleThe component that ends stuck processes must live outside every process it ends, and the diagnostic path needs its own failure testing.

Figure 5 · Anatomy of the undetected stall, BLOOM, 2022-04-30

OperatorPULSE job monitorOther 383 ranksOne rankOperatorPULSE job monitorOther 383 ranksOne rankGPUs spin at 100%, logs go silentno NCCL or distributed timeoutfires, 3h+~18h lost before rootcause foundenters eval broadcast, deadlocksreports RUNNING everyhourpy-spy stack dump across the nodesmanual restart from checkpoint
OperatorPULSE job monitorOther 383 ranksOne rankOperatorPULSE job monitorOther 383 ranksOne rankGPUs spin at 100%, logs go silentno NCCL or distributed timeoutfires, 3h+~18h lost before rootcause foundenters eval broadcast, deadlocksreports RUNNING everyhourpy-spy stack dump across the nodesmanual restart from checkpoint
Every automated layer reported a healthy job while zero work happened; the detection gap, not the fault, set the 18-hour cost. Reconstructed from the chronicles entry.
Diagram source
05

Numbers you can plan against

Everything quantitative the corpus yields, dated and sourced. Measured means a primary logbook or a code constant; claimed means a project's own README; derived shows its arithmetic in the ledger.

MetricValueAtContextAs ofSource
Machine attrition~2 hosts/dayMeta OPT128-host A100 cluster, steady state (measured)2022-01logbook
Restarts, whole run~90Meta OPTAgainst ~33 ideal days on 1,024 A100s; ~1.6/day derived2022-01logbook
Restarts, worst fortnight40+Meta OPTHardware-dominated stretch around Thanksgiving (measured)2021-12logbook
Record uninterrupted runs1.5 / 2.8 / 2 daysMeta OPTBest stretches, a month into the run (measured)2021-12logbook
GPU attrition~1 death/weekBigScience BLOOM384 A100s on Jean Zay; auto-restart absorbed most (measured)2022-04chronicles
Checkpoint size / save time2.3 TB / 40 sBigScience BLOOMWritten concurrently from 384 processes to GPFS over NVMe (measured)2022-03chronicles
Checkpoint overhead, whole run0.37%BigScience BLOOM~720 saves over ~3 months; 2% if IO were 5x slower (measured/derived)2022Bekman
Worst single losses7.3 h / 18 h / 11 hBigScience BLOOMCrash just before a save; two undetected stalls (measured)2022chronicles
Fail-slow cost5% throughputBigScience BLOOM149 to 140 TFLOPs from one slow GPU; its own benchmark deviated 2.5% (measured)2022-04chronicles
Collective timeout default10 minPyTorch NCCLkProcessGroupNCCLDefaultTimeout (code constant)2026-09c10d source
Watchdog heartbeat deadline8 minPyTorch NCCLMonitor aborts the process if the watchdog itself hangs (code constant)2026-09c10d source
Goodput delta, fault tolerance69% → 95%Ant GroupGLM-65B on thousands of GPUs (claimed by the operator)2023-08DLRover
Goodput delta, flash checkpoint90% → 95%Ant GroupPersistence time cut ~70x via a shared-memory tier (claimed)2024-01DLRover flash
Local checkpoint cadenceevery 10 stepsGoogle OrbaxDefault for the emergency local tier (code default)2026-09source
Training compute at stake39.3M GPU-hMeta Llama 3.1Cumulative H100-hours for the model family (vendor figure)2024-07model card
Read these carefully

The DLRover goodput figures are the operator's own claims about its own product, on workloads it chose; this corpus holds no independent measurement of them. The 2022 logbook numbers are measured but predate today's cluster sizes by an order of magnitude: failure rates scale with part count, so treat the OPT and BLOOM attrition figures as per-node baselines rather than per-cluster ones. The widely quoted interruption statistics for the 16,384-GPU era come from the Llama 3 herd paper and from the MegaScale, GEMINI and SuperBench papers; none was reachable from this session, so none is quoted here. Fetch them yourself before planning against second-hand retellings of their numbers.

Figure 6 · The run's lifecycle, priced by the record

hard fault, near daily at 1k GPUs

silent stall, GPUs busy

external deadline fires in minutes, or a human notices in hours

fail-slow GPU, minus 5% throughput

straggler found and excluded

bad node cordoned, spare swapped in

allocation healthy again

load newest tier, replay lost steps

restore path fails, e.g. checkpoint download hangs

Training

Crashed

Stalled

Degraded

Replacing

Restoring

hard fault, near daily at 1k GPUs

silent stall, GPUs busy

external deadline fires in minutes, or a human notices in hours

fail-slow GPU, minus 5% throughput

straggler found and excluded

bad node cordoned, spare swapped in

allocation healthy again

load newest tier, replay lost steps

restore path fails, e.g. checkpoint download hangs

Training

Crashed

Stalled

Degraded

Replacing

Restoring

Where the GPU-hours go: the detection gap on stalls is unbounded without an external deadline, and the restore edge has its own failure mode. Costs from the OPT and BLOOM logbooks.
Diagram source
06

The evidence wall

Every source behind this page, graded. The full ledger, one copied quote per claim, ships beside this file as sources.md.

How this corpus was cut

This session's network reached only GitHub and the package registries, so the wall holds no papers and no engineering blogs hosted elsewhere; that gap is stated in section 5 rather than papered over. The compensation: the two best artefacts on this topic are GitHub markdown written by the on-call engineers during the incidents, and they are graded postmortem because that is what they are.

Postmortem Meta (OPT team)2021-12-03

OPT-175B logbook: 27% update

The hardware fortnight: 40+ restarts, hours-long node replacement that returned the same bad machine, 1.6 TB checkpoint downloads hanging on blob storage, and the birth of their burn-in and InfiniBand test tooling.

Carry forwardProvider replacement latency and quality set your spare-pool size; screen returned nodes yourself.
facebookresearch/metaseq · 27_percent_update.md
Postmortem Meta (OPT team)2021-12-16

OPT-175B logbook: 56% update

Record uninterrupted runs of 1.5 to 2.8 days a month in; five hosts down together against a buffer of four; the buffer raised to 18; a volunteer on-call rotation with runbooks.

Carry forwardFailures arrive correlated; a buffer that covers the average day fails on the bad day.
facebookresearch/metaseq · 56_percent_update.md
Postmortem Meta (OPT team)2022-01-07

OPT-175B logbook: final update, and the cluster deletion

~90 restarts against 33 ideal days; ~2 machines lost daily; the provider's support team deleting the whole cluster while replenishing spares; then 8 unattended recoveries over the holidays and a 14-days-without-humans goal. The full 148-page logbook PDF sits beside it in the repo.

Carry forwardAutomate recovery until the on-call role can be dissolved, and treat recovery operations as production changes.
facebookresearch/metaseq · final_update.md
Postmortem Meta (OPT team)2021-11-17

OPT-175B logbook: 10% update

The moment the failure mix flips: once training settings stabilised, "the only restarts we've had to make were all related to hardware issues (missing GPUs on instances, training randomly hanging after including a new node, ECC errors, partial checkpoint upload after hardware error, CUDA errors, NCCL errors, etc.)."

Carry forwardPast the first stretch, reliability engineering rather than ML is what finishes the run.
facebookresearch/metaseq · 10_percent_update.md
Postmortem BigScience2022-03-21

BLOOM chronicles: the crash before the save

A GPU crash 2 iterations before checkpoint time costs 7.3 hours; the interval is cut to 100 iterations with the arithmetic written out: 2.3 TB, 40-second saves, at most 3 hours of exposure.

Carry forwardThe rare artefact: a checkpoint-cadence decision recorded with its reasoning, reusable as a formula.
bigscience-workshop/bigscience · chronicles.md
Postmortem BigScience2022-04

BLOOM chronicles: weekly deaths, and the stop-file

A GPU dies "every week or so"; auto-restart usually absorbs it at a max-3-hour cost. Stalls defeat the automation, and shared-HPC permissions forced the team to invent a stop-file so anyone on the team could end anyone's job gracefully, checkpoint included.

Carry forwardDesign the operator-override path explicitly; the scheduler's permission model will not give you one.
bigscience-workshop/bigscience · chronicles.md
Postmortem BigScience2022-04-28

BLOOM chronicles: hunting the fail-slow GPU

A 5% fleet-wide throughput drop, clean network tests, and a weekend of excluding nodes three at a time to binary search the culprit, whose own benchmark deviated just 2.5%.

Carry forwardFail-slow detection must be fleet-relative and continuous; single-node benchmarks sit inside the noise.
bigscience-workshop/bigscience · chronicles.md
Postmortem BigScience2022-04-30

BLOOM chronicles: the 18-hour stall, and the fix that made errors fatal

The eval-time deadlock no timeout caught, diagnosed by hand with py-spy; then the 2022-05-18 entry where NCCL_ASYNC_ERROR_HANDLING=1 and scheduler-level teardown became the standing configuration.

Carry forwardMake communication errors fatal by default, and give something outside the process the job of noticing silence.
bigscience-workshop/bigscience · chronicles.md
Source PyTorch2022-04-24

Issue #76287: torch.elastic fails to shutdown despite crashed processes

Filed by BLOOM's operator from the incident above: the elastic launcher left workers of the failed node hanging for 8 hours. Still open as of 2026-09, four years on.

Carry forwardDo not let the restart layer be the only thing that can end a broken job.
pytorch/pytorch #76287
Source PyTorch2026-09

ProcessGroupNCCL: the two-deadline watchdog, in code

kProcessGroupNCCLDefaultTimeout is 10 minutes per collective; TORCH_NCCL_HEARTBEAT_TIMEOUT_SEC defaults to 8 minutes on the watchdog itself, after which the monitor thread aborts the process. The header comments state the reason: CUDA/NCCL calls "may hang", and stuck jobs tie up cluster resources.

Carry forwardKnow these two numbers for your stack; they are the floor on how long a stall can burn your fleet before anything acts.
pytorch/pytorch · ProcessGroupNCCL.hpp
Source PyTorch2024-03-01

Issue #121055: flight-recorder dumps fail under async error handling

A maintainer's own report that "calling commAbort from inside watchdog thread leads to exit, 'broken promise' exception from async dump thread, and no dump file". Closed as not planned in 2026.

Carry forwardTest the diagnostic path under the failure it exists for; it has failure modes of its own.
pytorch/pytorch #121055
Source Meta / PyTorch2024-10 to 2026-09

torchft: per-step fault tolerance

A quorum service (the lighthouse) plus per-replica-group managers allow "membership changes at the training step granularity", with "live recovery from a healthy peer" instead of a storage restore, and process groups that "report errors sanely and be reinitialized gracefully".

Carry forwardThe failure domain becomes one replica group; the rest of the job never stops.
meta-pytorch/torchft
Source Meta / PyTorch2026-09

torchtitan: torchft wired into a real training loop

The end-to-end integration: replica groups as separate torchtitan instances, tolerance of one group's loss, and the operational detail that "the alive replica group with the smallest replica ID will perform checkpointing saving".

Carry forwardEven in the per-step world, someone still has to own the durable checkpoint; make that ownership explicit.
pytorch/torchtitan · experiments/torchft
Source Microsoft / Argonne2024-07 to 2024-11

DeepSpeed PR #5763: async checkpoint engine, closed unmerged

DataStates-LLM, an asynchronous checkpointing engine with non-blocking GPU-to-host copies, offered as a contribution in July 2024 and closed four months later: "I'm going to close this PR now as stale, but we would appreciate the contribution if you are able to come back to this and resolve the merge conflicts?"

Carry forwardCheckpoint improvements fragment per framework rather than accumulate; budget for integration, not invention.
deepspeedai/DeepSpeed #5763
Source Google2026-09

Orbax emergency checkpointing, in code

A two-tier checkpoint manager for multi-slice TPU jobs: a local tier defaulting to a save every 10 steps, a persistent tier saved rarely, and restore logic that prefers whichever local copy survived.

Carry forwardGoogle's default ratio: local saves every 10 steps against occasional durable ones is a working starting point for tiered cadence.
google/orbax · emergency/checkpoint_manager.py
Talk Meta / PyTorch Conference2024-09

Poster: fault tolerance for large-scale training

The detection layer in one page: flight recorder classifying deadlocks, stragglers, mismatched collectives and timeouts; a per-node HTTP WorkerServer for dumps, py-spy and fault injection; live checkpoint recovery over HTTP from healthy workers; fault-tolerant HSDP continuing "on the next batch without downtime".

Carry forwardAn independent monitor polling every node is now standard practice at the frontier, not an exotic add-on.
torchft · fault_tolerance_poster.pdf
Eng blog Hugging Face (Stas Bekman)2023-2026

ML Engineering: the fault-tolerance chapter

The BLOOM operator's distilled handbook: plan more nodes than needed, expect ~10% early-life accelerator failure, the checkpoint-overhead arithmetic (0.37% for BLOOM, 2% with 5x slower IO), watchdog patterns, and the stop-file and save-file mechanisms.

Carry forwardThe closest thing this field has to an operations manual, and it is maintained.
stas00/ml-engineering · fault-tolerance
Case study Ant Group2023-08

DLRover: goodput 69% to 95% in production

The operator's account of running fault-tolerance automation across its Kubernetes fleet: automatic diagnosis, process-level versus node-level restart, and the measured claim that GLM-65B goodput rose from 69% to 95% on thousands of GPUs.

Carry forwardA quarter of a large cluster's paid hours can be sitting in the recovery loop; automation is worth that much.
intelligent-machine-learning/dlrover
Eng blog Ant Group2024-01

Flash checkpoint: the tier ladder, priced

Synchronous copy to host shared memory, asynchronous persistence, emergency persist on failure, and memory-direct reload on process restart; wasted checkpoint time cut ~5x, persistence ~70x, goodput from 90% to 95%.

Carry forwardThe save cost that justified 3-hour intervals in 2022 is now an engineering choice, not a law.
dlrover · docs/blogs/flash_checkpoint.md
Decision record Ant Group2025

Unified failover: the design document

DLRover's failover mechanisms written up as a design document with per-scenario paths (process failure, node failure, master failure), rather than as operational folklore.

Carry forwardFailover deserves a design document with enumerated scenarios; if yours lives in a runbook only, it is untested design.
dlrover · docs/design/unified-failover.md
Vendor NVIDIA2024-10 to 2026-09

nvidia-resiliency-ext: the packaged stack

Hung-rank detection, in-job restart without reallocating scheduler nodes, async and local checkpointing, straggler detection, health checks; integrated into NeMo and Megatron-based stacks.

Carry forwardEvery organ of the reference architecture is now an installable package from the hardware vendor itself.
NVIDIA/nvidia-resiliency-ext
Vendor Meta2024-07

Llama 3.1 model card: the stakes

The family consumed a cumulative 39.3M GPU-hours on H100-80GB hardware; the training fleet behind it makes each hour of downtime worth thousands of GPU-hours.

Carry forwardMultiply your cluster size by your detection gap; that product is what a single stall costs.
meta-llama/llama-models · llama3_1 MODEL_CARD
Vendor PyPI record2023-01 to 2026-09

The registry dates the tooling wave

dlrover first published 2023-01-16; torchft 0.1.0 on 2024-10-13; nvidia-resiliency-ext 0.1.3 on 2024-10-15. Meta's and NVIDIA's fault-tolerance packages first shipped two days apart, three years after the logbooks that motivated them.

Carry forwardThis layer is young: assume rough edges, pin versions, and read the issue tracker before adopting.
pypi.org/project/torchft
07

Build a miniature, then productionise it

Six rungs from a resumable loop to a goodput dashboard. The line from toy to real is crossed at rung 4, where you start injecting the failures instead of waiting for them.

A loop that survives losing its process

Single-node PyTorch training loop with atomic checkpoint-and-resume (write to a temp name, fsync, rename; keep the last two). End the process abruptly at random points, including mid-save.

Done when: a hundred abrupt exits at random moments never lose more than one interval and never leave a corrupt checkpoint.  Teaches: why the newest checkpoint is not always a usable checkpoint.

Let the scheduler do the restarting

Run it under torchrun with more than one worker, wrapped by a scheduler (SLURM job array, or a Kubernetes Job with restartPolicy) so a failed process brings the job back without you. Reproduce BLOOM's settings: errors fatal, scheduler-level teardown.

Done when: ending any single worker gets the job back to training unattended, within one interval.  Teaches: the restart chain has more links than you think, and each one can hold the job in limbo.

Watch progress from outside

Add an external watchdog: a process on another machine that alerts when the step counter stops advancing, regardless of process state. Enable the flight-recorder environment variables and capture a dump from a deliberately mismatched collective.

Done when: a simulated stall (a rank sleeping inside a collective) is detected in minutes by the watchdog while the scheduler still says RUNNING.  Teaches: the difference between a deadline on collectives and a deadline on progress.

Tier the checkpoints, then measure the cadence

Add a shared-memory or local-disk tier (DLRover flash checkpoint, or torch.distributed async checkpointing) under the remote tier. Measure save cost per tier, then set each tier's interval from your measured failure rate and tolerable loss, BLOOM-style.

Done when: a process restart restores from memory in seconds while a simulated node loss falls back to the remote tier.  Teaches: the cadence question dissolves once the save is cheap.

Inject the whole failure catalogue

Script the four classes from section 4 against your miniature: hard fault (end a worker), stall (block in a collective), fail-slow (throttle one GPU's clocks or add sleep-per-step to one rank), and a recovery-machinery fault (make the checkpoint store unwritable mid-run). Record detection latency and loss for each.

Done when: you have a table like section 5's for your own system, including the injected recovery-path failure.  Teaches: which class your stack is blind to; for most stacks it is fail-slow or the recovery path.

Per-step recovery, and a goodput ledger

Run torchtitan with torchft on one machine: two replica groups of four GPUs (or scaled down), end one group mid-run, watch quorum shrink and heal. Then build the dashboard that turns all of it into one number: goodput, as useful-step time over elapsed time, with downtime attributed to detection, restore and recompute.

Done when: ending a replica group costs seconds of the survivors' time, and your dashboard attributes every lost GPU-hour to a class.  Teaches: goodput is the only metric leadership needs from this whole topic, and you can now defend its components.

08

Keep hunting

The queries that actually found this material. The logbook genre hides in repository files, not on blogs, so several of these search file paths rather than the web.

Logbooks and first-person accounts

  • site:github.com chronicles.md training logbook
  • "we lost" hours training checkpoint site:github.com
  • OPT logbook metaseq chronicles restarts
  • "buffer nodes" OR "spare nodes" GPU training failures

The framework's own record

  • repo:pytorch/pytorch "flight recorder" in:title
  • TORCH_NCCL_HEARTBEAT_TIMEOUT_SEC default
  • NCCL_ASYNC_ERROR_HANDLING hang slurm
  • is:pr is:closed is:unmerged checkpoint async (in a framework repo)

The tooling wave

  • "goodput" GPU training cluster fault tolerance
  • "in-job restart" OR "flash checkpoint" OR "emergency checkpoint"
  • torchft lighthouse quorum replica group
  • pypi release history nvidia-resiliency-ext torchft dlrover

The papers this page could not reach

  • Llama 3 herd paper unexpected interruptions table
  • MegaScale NSDI 2024 stragglers diagnosis
  • GEMINI SOSP 2023 in-memory checkpoints
  • SuperBench ATC 2024 gray failure proactive validation
09

References

  1. Meta OPT team, Update on 175B Training Run: 10% through facebookresearch/metaseq, 2021-11-17. Checked 2026-09-26.
  2. Meta OPT team, Update on 175B Training Run: 27% through facebookresearch/metaseq, 2021-12-03. Checked 2026-09-26.
  3. Meta OPT team, Update on 175B Training Run: 56% through facebookresearch/metaseq, 2021-12-16. Checked 2026-09-26.
  4. Meta OPT team, 175B Training Run Completed facebookresearch/metaseq, 2022-01-07. Checked 2026-09-26.
  5. Meta OPT team, OPT-175B full logbook (148 pages) facebookresearch/metaseq, 2022. Checked 2026-09-26.
  6. BigScience, BLOOM tr11-176B-ml training chronicles bigscience-workshop/bigscience, 2022. Checked 2026-09-26.
  7. Stas Bekman, ML Engineering: Fault Tolerance stas00/ml-engineering, 2023, maintained through 2026. Checked 2026-09-26.
  8. PyTorch, ProcessGroupNCCL.hpp (timeout and monitoring constants) pytorch/pytorch at main, 2026-09. Checked 2026-09-26.
  9. PyTorch, ProcessGroupNCCL.cpp (heartbeat default, watchdog loop) pytorch/pytorch at main, 2026-09. Checked 2026-09-26.
  10. Stas Bekman, pytorch issue #76287: torch.elastic fails to shutdown despite crashed processes pytorch/pytorch, 2022-04-24, open. Checked 2026-09-26.
  11. wconstab, pytorch issue #121055: Flight Recorder dumps fail when TORCH_NCCL_ASYNC_ERROR_HANDLING=1 pytorch/pytorch, 2024-03-01, closed not planned 2026-05. Checked 2026-09-26.
  12. Meta / PyTorch, torchft: per-step fault tolerance meta-pytorch/torchft, first release 2024-10-13. Checked 2026-09-26.
  13. Chirag Pandya and Tristan Rice, Fault Tolerance for Large Scale Training (poster) PyTorch Conference 2024, PDF in the torchft repository. Checked 2026-09-26.
  14. PyTorch, torchtitan: Enabling Fault Tolerance with TorchFT pytorch/torchtitan at main, 2026-09. Checked 2026-09-26.
  15. NVIDIA, nvidia-resiliency-ext NVIDIA on GitHub, first release 2024-10-15. Checked 2026-09-26.
  16. Avinash Maurya, DeepSpeed PR #5763: Add DataStates-LLM asynchronous checkpointing (closed unmerged) deepspeedai/DeepSpeed, 2024-07-10 to 2024-11-15. Checked 2026-09-26.
  17. Ant Group, DLRover: an automatic distributed deep learning system intelligent-machine-learning/dlrover, first release 2023-01-16. Checked 2026-09-26.
  18. Ant Group, Flash Checkpoint: recover training from failure in seconds dlrover docs/blogs, 2024-01. Checked 2026-09-26.
  19. Ant Group, Unified Failover Design & Scenarios dlrover docs/design. Checked 2026-09-26.
  20. Google, Orbax emergency checkpoint manager (source) google/orbax at main, 2026-09. Checked 2026-09-26.
  21. Meta, Llama 3.1 model card meta-llama/llama-models, 2024-07. Checked 2026-09-26.
  22. PyPI, torchft release history pypi.org. Checked 2026-09-26.
  23. PyPI, nvidia-resiliency-ext release history pypi.org. Checked 2026-09-26.
  24. PyPI, dlrover release history pypi.org. Checked 2026-09-26.