Do the memory math — training is 8× heavier than the model
Everyone knows a 70B model is "big." Few people do the actual arithmetic of training it: weights are only the beginning — you also hold gradients (same size), Adam's two momentum buffers (2× more), and activations for the backward pass. Pick a model size and precision; the stacked bar is the honest bill, drawn against one 80GB GPU.
Bill: weights (2B/param fp16, 1B int8) + gradients (2B) + Adam states (8B, kept in fp32) + activations (rule-of-thumb ~1.4B/param at practical batch/sequence, checkpointing on). Real numbers vary; the order of magnitude doesn't.
Data parallelism — clone the brain, split the food
The easy trick: put a full copy of the model on every GPU, feed each a different slice of the batch, then average everyone's gradients (all-reduce) each step. Drag the GPU count and read the measured speedup curve. Then flip the interconnect from NVLink to plain ethernet and watch the curve bend — averaging a 14GB gradient blob every step is a lot of network.
Cost model: step time = compute/N + all-reduce time (ring: 2·(N−1)/N × gradient bytes ÷ link bandwidth). The curve is computed from it live — the bend is bandwidth arithmetic, not decoration.
Tensor parallelism — slice every matrix, pay per layer
The surgical trick: cut each weight matrix into column strips — GPU 1 holds columns 1-1024, GPU 2 the next batch, and so on. Every GPU computes its strip of every layer, then they exchange partial results — at every single layer, every step. Watch the animation slice a matmul across 4 GPUs, then check the efficiency table: this only works when the GPUs share a fast local link.
Efficiency computed from: per-layer compute ÷ slices + two all-gathers per layer over the chosen link. 80 layers per forward pass — the multiplier that makes bandwidth decisive.
Pipeline parallelism — the assembly line and its bubble
The third cut: give each GPU a contiguous chunk of layers — GPU 1 owns layers 1-20, GPU 2 owns 21-40… Data flows through like an assembly line. The catch is the bubble: while GPU 1 chews the first batch, everyone downstream stands idle. The fix: chop the batch into micro-batches so the line stays busy. Drag both sliders and read the measured idle fraction off the Gantt chart.
The Gantt is drawn from the actual schedule (GPipe-style fill-drain); idle fraction (S−1)/(S−1+M) emerges from the drawing, and the readout measures it off the schedule rather than quoting the formula.
The 3D recipe — assemble a real 70B training run
Now do the real job. You have 64 GPUs (8 nodes × 8 GPUs, NVLink inside a node, slower links between), and a 70B model that needs ~1.1TB for training. Choose your three numbers — tensor slices (TP), pipeline stages (PP), data-parallel clones (DP) — such that TP×PP×DP ≤ 64. The checker runs three audits: does it fit in memory? does TP stay inside a node? how bad is the bubble? Find a config that passes all three.
Audits: memory/GPU = 1.1TB ÷ (TP×PP) vs 80GB · TP ≤ 8 to stay in-node · bubble from EP 04's schedule at 16 micro-batches · DP all-reduce over inter-node links. Throughput estimate multiplies the three efficiencies.