What each kind of parallelism puts on the wire, how large a gradient sync is and where links bind; in-network aggregation, low-communication training, and frequency-domain compression of gradients and momentum; and a planned experiment to test whether a DCT-based compressor can run on a photonic link module.
Concepts used here, and where they are explained. Each links to an entry in the series glossary, or in a sister series' glossary for concepts it already explains.
Large-model training splits work along several axes at once, and each axis puts a different kind of data on a different kind of link. What a compute-in-transit module could act on depends on which traffic it sees.
| Parallelism | What crosses the link | How often | Typical link |
|---|---|---|---|
| Data parallel (DDP) | Gradients, summed across replicas (all-reduce) | Every optimiser step | InfiniBand or Ethernet between nodes |
| FSDP / ZeRO-3 | Weight shards (all-gather) before use; gradients (reduce-scatter) after the backward pass | Every layer, forward and backward, every step | NVLink in a node, InfiniBand between nodes |
| Tensor parallel | Activations and their gradients, combined by all-reduce | Every layer, forward and backward | NVLink, inside one node |
| Pipeline parallel | Activations forward, activation gradients backward | At each stage boundary, per micro-batch | InfiniBand between nodes |
| Sequence / context parallel (incl. ring attention) | Key and value blocks passed round a ring of devices | Every attention layer | NVLink or InfiniBand |
| Expert parallel (MoE) | Tokens to their experts and back (all-to-all) | Every MoE layer, twice | NVLink or InfiniBand |
A BF16 gradient is 2 bytes per parameter. A ring all-reduce (slide 03) makes each worker send a little under twice that:
| Model | Parameters | BF16 gradient (GB) | Ring all-reduce bytes per worker, 8 workers (GB) | 64 workers (GB) |
|---|---|---|---|---|
| Llama-3-8B | 8,029,995,008 | 16.06 | 28.10 | 31.62 |
| Llama-3-70B | 70,552,387,584 | 141.10 | 246.93 | 277.80 |
Source: results.md, section “3. Training”
N workers each hold a buffer of B bytes and all need the sum. Split each buffer into N chunks and arrange the workers in a ring.
Time to move one model-sized BF16 update once over one link: latency + bytes / bandwidth, with the link presets of Disaggregated_Inference_Sim (milliseconds):
| Model | Link | GB/s | none | FP8 (2x) | 2-bit (8x) | DeMo reported (85x) |
|---|---|---|---|---|---|---|
| Llama-3-8B | NVLink 4 (one direction) | 450.0 | 35.7 | 17.8 | 4.5 | 0.4 |
| Llama-3-8B | InfiniBand NDR 400G | 50.0 | 321.2 | 160.6 | 40.2 | 3.8 |
| Llama-3-8B | 100 GbE | 12.5 | 1,284.8 | 642.4 | 160.6 | 15.1 |
| Llama-3-8B | 25 GbE | 3.1 | 5,139.2 | 2,569.6 | 642.4 | 60.5 |
| Llama-3-70B | NVLink 4 (one direction) | 450.0 | 313.6 | 156.8 | 39.2 | 3.7 |
| Llama-3-70B | InfiniBand NDR 400G | 50.0 | 2,822.1 | 1,411.1 | 352.8 | 33.2 |
| Llama-3-70B | 100 GbE | 12.5 | 11,288.4 | 5,644.2 | 1,411.1 | 132.8 |
| Llama-3-70B | 25 GbE | 3.1 | 45,153.5 | 22,576.8 | 5,644.2 | 531.2 |
Source: results.md, section “3. Training”. 2x = BF16 to FP8; 8x = BF16 to 2-bit (MuLoCo's setting); 85x = DeMo's reported reduction. The ratios are the papers' figures, used only to size transfers.
If the network itself sums the workers' updates, each worker sends its gradient once and receives the sum once, instead of the 2(N−1)/N · B of a ring, and the switch does the adds.
Summing needs flows from many workers to meet. A pluggable module sees one link, one stream; the arithmetic would fit, but the operands are never in the same place. Aggregation belongs in a switch. What a link module could do to the data-parallel sync is transform or compress the single stream it carries, which is the rest of this deck.
Instead of syncing every step, each worker (or island of accelerators) takes many local optimiser steps, then the workers exchange the pseudo-gradient, the change in their parameters, and apply one outer optimiser step to it.
for each worker i, in parallel:
θi ← θ # start from the shared parameters
repeat H times: θi ← AdamW(θi, local data) # inner steps, no communication
Δi ← θ − θi # pseudo-gradient: one model-sized buffer
Δ ← all_reduce_mean(Δi) # the only sync: once per H steps
θ ← Nesterov(θ, Δ) # outer step
| Method | What it changes | Reported result |
|---|---|---|
| DiLoCo (Douillard et al., 2023, arXiv:2311.08105) | Inner AdamW, outer Nesterov momentum; sync every H inner steps | On C4 with 8 workers, matches fully synchronous training while communicating 500× less |
| Streaming DiLoCo (Google DeepMind, Jan 2025, arXiv:2501.18512) | Syncs subsets of parameters in sequence, overlaps communication with training, quantises what is exchanged | Reduces required bandwidth by two orders of magnitude at similar quality |
| MuLoCo (May 2025, arXiv:2505.23725v1) | Muon as the inner optimiser, plus error feedback | Delta compressed to 2 bits with next to no degradation; communicates 8× less than DiLoCo (figures from the v1 abstract) |
| SparseLoCo (Aug 2025, arXiv:2508.15706) | Top-k sparsification of the pseudo-gradient (97–99% sparsity) with 2-bit quantisation | Lower final loss than dense DiLoCo, on models from 178M to 2B parameters |
Sparsification usually keeps the largest gradient entries in their own domain. Wang et al. asked whether a transform first would keep more of the information at the same compression ratio (“FFT-based Gradient Sparsification for the Distributed Training of Deep Neural Networks”, HPDC 2020, doi:10.1145/3369583.3392681; preprint arXiv:1811.08596, titled “SuperNeurons: FFT-based Gradient Sparsification…”).
Whether frequency coefficients are sparser than the raw entries depends on the tensor. Flattening a weight matrix's gradient into one long signal imposes an ordering the network does not care about; results.md section 5 shows that on white noise or sparse spikes a transform concentrates nothing. The case for frequency-domain compression is empirical, tensor by tensor.
DeMo (Peng, Quesnelle and Kingma; the later version adds Chen, Su and Liu; ICLR 2026; arXiv:2411.19870) drops the per-step all-reduce of full gradients. Each worker's momentum evolves locally, and only its fast-moving components are shared.
mi ← β mi + gi # local momentum, never all-reduced
C ← DCT(chunks(mi)) # transform each fixed-size chunk
qi ← top_k(C) # keep the k largest per chunk: values + indices
mi ← mi − IDCT(qi) # remove what was sent: momentum is the error feedback
Q ← all_gather(qi) # the only communication: small
θ ← θ − η · IDCT(Q) # same update on every worker (see the paper for its exact form)
Its compressor is a transform followed by a selection, applied to a stream on its way to the network. The transform is in a photonic module's operation set; the selection is not. That gap is the subject of the next three slides.
The module's published operation set is FFT, NTT, MAC, and modular and floating-point arithmetic (Kundu et al., arXiv:2608.21536). Step by step:
| DeMo step | In the set? | Substitute |
|---|---|---|
| Chunk the momentum | Data layout only | — |
| DCT of each chunk | yes (a real FFT variant) | — |
| Top-k selection | no: needs comparisons | A fixed frequency band: a gather, no arithmetic; no indices to send |
| Subtract what was sent from the momentum | Needs the optimiser state | Stays on the GPU, which must know which band was sent (with a fixed band, it always does) |
| Kernel | Transform / byte | Other / byte | In set | Fits low budget (transform charged) | Fits high budget (transform charged) | Fits if transform free (low) |
|---|---|---|---|---|---|---|
| 2-D DCT of 16x16 chunks, fixed band | 10.00 | 0.00 | yes | no | no | yes |
| 2-D DCT of 64x64 chunks, fixed band | 15.00 | 0.00 | yes | no | no | yes |
| 2-D DCT of 64x64 chunks + top-k (DeMo as published) | 15.00 | 1.00 | no | no | no | no |
Source: results.md, section “2. Work per byte”. Top-k is costed at about 2 comparisons per value (illustrative).
The DCT costs 10 to 15 FLOPs per BF16 byte if charged against a budget of 0.40 to 3.96, so it fits only if the optics does the transform without charge. If it does, the fixed band adds no arithmetic and fits; top-k does not, being outside the set.
| Signal | Kept fraction | Top-k energy | Fixed band energy |
|---|---|---|---|
| white noise | 0.0625 | 0.325 | 0.062 |
| 2-D random walk (smooth) | 0.0625 | 0.995 | 0.957 |
| sparse spikes (1% non-zero) | 0.0625 | 0.320 | 0.062 |
Source: results.md, section “5. A fixed frequency band against top-k”: share of each 64 × 64 chunk's energy kept after a 2-D DCT, keeping 1/16 of the coefficients. Synthetic signals, illustrative.
This experiment is planned, not run. No results are shown, and none of the slides above depends on its outcome.
Train a small GPT, tens of millions of parameters (nanoGPT-style, on a small text corpus), four ways, at the same keep fraction in arms (b) to (d):
| Arm | Optimiser and compression | Question it answers |
|---|---|---|
| (a) | AdamW with DDP, uncompressed | The baseline: loss with full communication |
| (b) | DeMo as published: DCT + top-k | Reproduces the reference compressor at this scale |
| (c) | DeMo with a fixed low-frequency band in place of top-k | Does a comparison-free selection keep the convergence? |
| (d) | Fixed band with emulated optics: additive noise at a chosen ENOB, and the transform restricted to a native size | Does it survive analogue precision and a fixed transform length? |
Low frequencies within a chunk are the obvious choice, and section 5 shows they work for smooth signals. But DeMo's own premise is that the components worth synchronising are the fast-moving ones, and the NeurIPS 2025 workshop variant (Nedelkoski et al.) synchronises the high-frequency components of momentum (slide 08). Is momentum energy within a chunk concentrated at low frequencies at all? And if what matters is high-frequency content, does a fixed high band do as well as top-k? The experiment should test a low band, a high band and top-k side by side rather than assume the answer.
The experiment gives loss against bytes. Whether that saves time depends on the system: link rates, latencies, how much of each sync overlaps with compute, and whether the module adds delay or energy. That question belongs to a discrete-event simulation, which is the part of this work that falls to a simulation engineer.
| Traffic | What a link module could do | Obstacle | Verdict |
|---|---|---|---|
| Ring-attention KV blocks | Compress each block in flight with a transform plus a fixed band; the FFT is in the set | Per-layer, latency-critical; the attention result must stay accurate, and KV blocks need not be smooth | possible if blocks compress well; the same question as inference KV (deck 03) |
| Pipeline-parallel activations | Compress activations at stage boundaries | Low tolerance to noise: an error in the forward pass compounds through every later stage, and the backward pass depends on it | poor fit |
| Checkpoints | Erasure-code the checkpoint as it is written | Erasure coding uses finite-field arithmetic, which is in the set (modular arithmetic, NTT), but checkpoints are infrequent and off the critical path | niche |
| Data-parallel sync (for comparison) | Transform + fixed band on the pseudo-gradient or momentum | Selection without comparisons; error feedback stays on the GPU | best candidate, pending slide 10 |