What a serving system moves between GPUs, pools and storage: the KV hand-off, KV tiering and prefix fetch, query-aware selection, ring attention, MoE all-to-all, weight loading and encrypted traffic. How big each flow is, when it binds, and which of them a module with a few operations per byte could usefully work on.
Deck 01 sets the budget and the five tests: a QSFP56 compute-in-transit module offers 0.40 to 3.96 operations per byte at line rate, and the published operations are FFT, NTT, MAC, and modular and floating-point arithmetic (Kundu et al., arXiv:2608.21536, a QSFP56 pluggable with an integrated optical Fourier transform device, evaluated only on FHE CKKS bootstrapping). Comparisons, rounding and top-k are not in the published set. Deck 02 applied the tests to training. This deck applies them to inference.
Concepts used here, and where they are explained. Each is defined, with links, in the series glossary.
Inference moves less data than training in any single transfer, but it moves it often and on the critical path of a request. Six flows are worth naming.
| Traffic | When it moves | Typical link |
|---|---|---|
| KV hand-off, prefill to decode | Once per request, after prefill (disaggregated serving: DistServe, Splitwise) | NVLink in a node; InfiniBand or Ethernet between nodes |
| KV tiering, offload and prefix fetch | When a cached prefix is reused, or KV is evicted from GPU memory | PCIe to host memory; network to a shared CPU/SSD pool |
| Context-parallel prefill (ring attention) | Every layer of a long-context prefill | NVLink or InfiniBand between the GPUs of one job |
| MoE all-to-all (and TP all-reduce) | Every MoE layer (every layer for TP), prefill and decode | NVLink in a node, InfiniBand across nodes |
| Weight loading and swapping | Cold start, model swap, adapter swap | PCIe from host or local SSD; network from object storage |
| Ciphertexts and encrypted traffic | Confidential inference: FHE ciphertexts, or encrypted links | Whatever link carries the data |
Disaggregated serving: DistServe (arXiv:2401.09670, OSDI 2024) and Splitwise (arXiv:2311.18677, ISCA 2024). NVIDIA Dynamo's transfer library, NIXL, moves KV between prefill and decode workers and across GPU, CPU, SSD and object-storage tiers (Dynamo architecture; ai-dynamo/nixl).
A KV cache grows linearly with the prompt. With grouped-query attention, Llama-3-8B stores 131,072 bytes per token and Llama-3-70B 327,680 (BF16). The hand-off time is the link latency plus bytes over bandwidth:
| Model | Prompt | KV hand-off (MB) | NVLink 4 (ms) | IB NDR (ms) | 100 GbE (ms) | 25 GbE (ms) |
|---|---|---|---|---|---|---|
| Llama-3-8B | 2,048 | 268.4 | 0.60 | 5.38 | 21.49 | 85.92 |
| Llama-3-8B | 32,768 | 4,295.0 | 9.55 | 85.91 | 343.62 | 1,374.41 |
| Llama-3-70B | 2,048 | 671.1 | 1.50 | 13.43 | 53.71 | 214.77 |
| Llama-3-70B | 32,768 | 10,737.4 | 23.87 | 214.76 | 859.01 | 3,435.99 |
Source: analysis/results.md, section 4. BF16 weights: Llama-3-8B 16.06 GB, loaded over PCIe Gen5 x16 in 0.25 s; Llama-3-70B 141.10 GB in 2.20 s. For scale, one Llama-3-70B BF16 training update is 141.10 GB against 268.4 MB for a 2,048-token Llama-3-8B hand-off (section 6).
A single transfer time says little; what matters is whether hand-offs queue. Disaggregated_Inference_Sim runs a request trace through a prefill pool, a link and a decode pool (Llama-3-8B shape, one H100 per instance, 2,048-token prompts: a 268.4 MB GQA KV hand-off). Its coefficients are illustrative; read these as a simulator's results, not measurements.
| Link | KV wait + transfer share of E2E | Link busy | TPOT p99 | SLO met |
|---|---|---|---|---|
| NVLink 4 | 0.0% | 0.5% | 8.8 ms | 100.0% |
| IB NDR | 0.3% | 4.0% | 8.8 ms | 100.0% |
| 100 GbE | 1.2% | 16.1% | 9.0 ms | 100.0% |
| 25 GbE | 8.1% | 64.4% | 11.6 ms | 100.0% |
At the default load the hand-off is invisible on anything faster than 25 GbE. Push the 25 GbE case harder: the link saturates near 11.6 req/s (268.4 MB per prompt at 3.125 GB/s).
| Load | Link busy, uncompressed | Hand-off p99 | TPOT p99 | SLO met: none | FP8 | freq-keep-k |
|---|---|---|---|---|---|---|
| 8 req/s | 64.4% | 471.9 ms | 11.6 ms | 100.0% | 100.0% | 100.0% |
| 10 req/s | 79.0% | 750.0 ms | 14.1 ms | 100.0% | 100.0% | 100.0% |
| 12 req/s | 90.6% | 2,959.0 ms | 26.5 ms | 98.3% | 100.0% | 100.0% |
| 14 req/s | 94.0% | 9,657.8 ms | 77.2 ms | 41.0% | 100.0% | 100.0% |
Source: Disaggregated_Inference_Sim, examples/results.md, sections 14 and 15. TPOT includes the hand-off, following DistServe's split (TTFT is the prefill phase; the rest counts towards TPOT); TTFT does not.
Two families of KV compression, and how each fares against the published operation set.
| Kernel | Transform / byte | Other / byte | In set | Fits high budget, transform charged | Fits low budget, transform free |
|---|---|---|---|---|---|
| 1-D FFT, length 8, keep a fixed band | 3.75 | 0.00 | yes | yes | yes |
| 1-D FFT, length 64, keep a fixed band | 7.50 | 0.00 | yes | no | yes |
| 1-D FFT, length 1024, keep a fixed band | 12.50 | 0.00 | yes | no | yes |
| Requantise BF16 to FP8 (per-block scale) | 0.00 | 1.00 | no | yes | no |
Source: analysis/results.md, section 2. Budget on QSFP56: 0.40 (low) to 3.96 (high) operations per byte.
Frequency keep-k is the codec that fits: built from FFT and a fixed gather, and it fits every budget if the optics does the transform without charge. FP8 would fit the arithmetic budget at the high end but needs rounding, which the module does not publish. In the simulator, FP8 at the GPU was as fast as FP8 in transit (both 166.6 ms hand-off p99 at 14 req/s): the GPU pass is short next to prefill, so in-transit compression saves GPU time, not latency. Whether a fixed band keeps enough of real KV is an accuracy question; FreqKV's result says yes for half, after fine-tuning.
Production systems keep KV caches beyond GPU memory and fetch them back when a prefix is reused: a system prompt, a document, an earlier turn of a chat. Every fetch is a hand-off from storage instead of from a prefill pool.
Sizes are those of slide 02. Fetching a 32,768-token Llama-3-70B prefix (10,737.4 MB) over 100 GbE takes 859.01 ms, against 23.87 ms over NVLink 4 (results.md section 4). Over a network, the fetch is bandwidth-bound and sits in front of the first token.
A tier is a better fit than the hand-off for an in-link codec: data is compressed once on the way out and decompressed on every fetch, at the network edge of a storage pool where no GPU is available to do it. The same frequency keep-k codec applies, and the same caveats: a fixed band, an accuracy check, and a free transform. The authors of LMCache and Mooncake report large throughput gains from tiering, which says the flow matters; neither says an in-link codec would help.
Moving fewer bytes beats compressing them. For a long context, a decode step's attention is dominated by a few tokens, and which ones depends on the query.
PRISM (Park and Park, arXiv:2603.21576; other authors, not the module’s developer) proposes a thin-film lithium niobate photonic similarity engine for KV block selection, arguing that ranking needs only 4 to 6 bits. The authors report 100% needle-in-a-haystack accuracy from 4K to 64K tokens on Qwen2.5-7B with simulated hardware impairments, and 16× less KV traffic at 64K. These are the authors' claims, not yet reproduced. It shows the scoring step is a natural candidate for analogue optics; its value in transit depends on the KV living somewhere remote.
A prompt too long for one GPU is split across devices. Each device keeps its query block and passes its KV block to the next device in a ring, computing blockwise attention against each block as it arrives, until every query block has seen every KV block.
Verdict: weak. Technically in the set; the error budget and the overlap leave little to gain.
Two collectives run inside a pool on every layer. They are frequent and on the critical path, but they carry activations, not cached state.
Verdict: weak to uncertain. MoE dispatch is a modest share of step time in the simulator, and activations tolerate little noise without the rounding-based FP8 recipe. The all-reduce is a strong in-network candidate, but for a switch, where it already exists.
Weights move when a model is loaded, swapped for another, offloaded layer by layer to fit memory, or when a LoRA adapter is paged in for a request.
| Model | BF16 weights (GB) | Load over PCIe Gen5 x16 (s) |
|---|---|---|
| Llama-3-8B | 16.06 | 0.25 |
| Llama-3-70B | 141.10 | 2.20 |
Source: analysis/results.md, section 4.
Verdict: weak.
Confidential inference is the one place the module's operations are already proven, because they were built for it.
Verdict: proven technically, small payoff in throughput. The module fits FHE by design, and ML-KEM's NTT fits too, but neither is a high-volume flow in an inference fleet. Bulk encryption, the high-volume part, uses an operation the module does not offer.
Every inference flow against the five tests of deck 01: bottleneck (link-bound), operations (fits published ops), budget (work in transit), precision (noise tolerance) and placement (a pluggable sees one flow, a switch many).
| Candidate | Traffic | Work in transit | Fits published ops | Link-bound | Noise tolerance | Verdict |
|---|---|---|---|---|---|---|
| KV tier fetch / offload | KV to and from CPU/SSD pools | FFT + fixed band, both ways | yes | often, over a network | moderate (2- to 3-bit KV tolerated; FreqKV half) | best inference candidate |
| KV hand-off | KV, prefill to decode | FFT + fixed band; FP8 | keep-k yes; FP8 no | only on slow links near saturation | moderate | plausible, narrow |
| Query-aware selection | KV page summaries | score pages (MAC, 1.00 / byte) | scoring yes; top-k no | when KV is remote | high (ranking only) | promising, needs host ranking |
| Ring attention | KV blocks round a ring | FFT + fixed band | yes | rarely; overlapped | low (exact attention) | weak |
| MoE all-to-all | token activations | FP8 dispatch | no (rounding) | 7.1% of a prefill step (sim) | low to moderate | weak / uncertain |
| TP all-reduce | partial sums | add, 0.50 / byte | yes | yes at TP8 decode (61.5%, sim) | exact sum | switch, not pluggable; exists |
| Weight streaming | weights, adapters | lossless only | no useful kernel | cold start only | none | weak |
| FHE inference | ciphertexts | NTT, modular arithmetic | yes (demonstrated) | no, compute-bound | exact by decomposition | proven, niche |
| PQ key exchange | ML-KEM handshakes | NTT | yes | no, kilobytes | exact | proven, negligible volume |
Over a 100 GbE cross-data-centre link, one Llama-3-70B BF16 update takes 11.3 s uncompressed (results.md, section 3), against 53.71 ms for a 2,048-token Llama-3-70B hand-off on the same link (section 4). Deck 02 covers cross-data-centre gradient sync, the place compression in transit would act on the most bytes.
Disaggregated_Inference_Sim already has an in-transit stage on the KV hand-off: no GPU time, 1 pJ per input bit, 1 µs added and 1.6 operations per line byte, all illustrative (results.md section 15). Answering the questions of slide 11 needs that stage generalised from “a codec on the hand-off” to a kernel on a link.
LinkKernel(
name="freq-keep-half",
ops_per_byte=0.0, # arithmetic besides the transform
op_types={"fft", "gather"}, # checked against {fft, ntt, modular, mac}
transform_charged=False, # the unknown that decides the verdict
precision_bits=8, # what the analogue path delivers
ratio=2.0,
placement="pluggable", # or "switch": sees one stream, or many
)
Simulator: Disaggregated_Inference_Sim; recorded results: examples/results.md.