Before you can read the parent note Data Parallelism and ZeRO, you need to earn every symbol it throws at you. This page builds each one from nothing, in an order where each idea leans on the one before it. Nothing here assumes you have seen distributed training before.
Picture a giant control panel covered in millions of little dials. Each dial is one number. Turning the dials is training. A modern model can have hundreds of billions of dials.
Why does the topic need Φ? Because everything about memory is measured in "how many bytes per parameter." If we know Φ and know how many bytes each dial costs, we can compute the total memory. Φ is the ruler the whole topic measures with.
Look at the figure: the same panel of dials is copied onto GPU 0 and GPU 1. That duplication is the villain of the entire topic.
Why does the topic care? Because memory = (number of dials) × (bytes per dial). A dial stored in fp16 costs 2 bytes, so all Φ parameters in fp16 cost 2Φ bytes. That is exactly where the parent's 2Φ comes from. This precision trade-off is explored fully in Mixed Precision Training.
Because there is exactly one gradient number per parameter, gradients also take Φ numbers → in fp16 that is another 2Φ bytes. That is the parent's second 2Φ term.
Why η must be small, and why that matters later: tiny steps mean the change to a dial can be a very small number. If we stored dials in fp16, such a tiny change might round to zero and get lost. That is the whole reason the topic keeps an fp32 "master copy" — see §7.
Why the topic needs these: the entire memory-saving trick is "divide by N." Every time you see N1 in the parent note, it literally means "each of the N GPUs keeps only its share." And r lets us say which share belongs to which GPU.
Recall from §4 that a step is η×gradient, often a minuscule number. In fp16 the smallest gaps between representable numbers are large; a tiny update lands between two fp16 values and rounds away to nothing — the dial never moves. Keeping the master weights in fp32 (finer gaps) lets those tiny nudges accumulate. This is why 12Φ includes a full fp32 copy. Full detail lives in Mixed Precision Training.
The GPUs must share their gradient arrows. The messaging patterns are named "collectives." Full treatment is in AllReduce and Collective Communication; here are just the three the parent uses.
The averaging formula the parent writes,
∇ˉθ=N1∑r=1N∇θrL(Br),
is just AllReduce in symbols: ∑r=1N means "add up over all GPUs r," and N1 averages them. It works because the gradient of the whole dataset equals the average of gradients over its parts.
Related deeper topics that build on this same foundation: Gradient Accumulation, Activation Checkpointing, Pipeline Parallelism, and the big picture in Large Language Models Training.