Research · Distributed Systems
Notes: checkpoints and fault tolerance in distributed training
A working summary of checkpoint strategies — full, async, and sharded — and why restart-mid-run still takes minutes.
2025-04-03 · 5 min read
Distributed SystemsMLOpsInfrastructure
Distributed Systems
Checkpoints and fault tolerance in distributed training
A 3-day training run on 8 GPUs will, with near-certainty, see a node fail. The difference between a hobby and an operation is what happens next.
The three checkpoint strategies
- Full checkpoints. The entire model state every N steps. Simple, reliable, and the most expensive thing you'll do in a day.
- Async checkpoints. Write state in a background thread to avoid blocking training. Saves throughput, costs memory, and risks checkpoint corruption at write time.
- Sharded checkpoints. Each rank saves its own shard. This is how the big frameworks actually scale past a single node — the catch is that resuming requires all shards present.
The numbers that matter
- A 70B-parameter model's checkpoint is roughly 140 GB in bf16.
- Restarting from a full checkpoint often means 5–15 minutes of shard reassembly and re-initialisation.
- The real cost is the gap: everything computed since the last save is lost.
What I'd implement differently
The pattern I keep gravitating toward is checkpoint + journal:
- Sharded checkpoints for speed and portability.
- A small write-ahead journal of the optimizer's momentum deltas since the last save.
That hybrid shrinks worst-case loss from hours to minutes, at the cost of a modest journal log — which is cheap next to re-running a whole batch of epochs.
Reading list
- The checkpoint internals of PyTorch's distributed library.
- Disaster-recovery design in object storage (retry, checksum, atomic rename).
- The async checkpointing docs of the frameworks I run.
This note is a working summary — I'll revise it as I actually stress-test the hybrid approach.