AI Infra Interviews logo
Distributed Training & Parallelism / 09
mediumNewNVIDIAAnthropic

Why does tensor parallelism stop at 8? Show me the numbers.

Four all-reduces per transformer block, on activations, on the critical path. Inside the NVLink domain they cost 8% of a step; across the NIC they cost more than the step itself. The derivation for a 70B, and the second reason TP stops that has nothing to do with the network.

Updated Sep 2026 · Grounded in real AI infrastructure interview loops and written to a senior-engineer editorial bar, with every number worked and every diagram hand-built.

TL;DR: Tensor parallelism all-reduces a tokens × hidden activation four times per transformer block (twice in forward, twice in backward), and each one blocks the next layer, so it cannot hide behind compute the way a gradient all-reduce can. For a 70B at 8k tokens the four collectives cost about 84 ms per micro-batch over NVLink at 900 GB/s against about 1.1 s of compute, roughly 8%. The same bytes over a 50 GB/s NIC would cost 1.5 s, more than the compute itself. Eight is the size of the NVLink domain on an HGX node, so eight is where TP stops. A second limit arrives at the same time: each GEMM's per-GPU dimension shrinks by t, and below a few thousand the tensor cores are underfed.

How to approach it

Name what TP communicates and how often before doing any arithmetic, because the four-per-block count and the "on the critical path" property are the whole argument. Then size one all-reduce from the activation shape, multiply by the count, and compare against NVLink and against the NIC for the same layer's compute time. Add the GEMM-shape argument as the second limit. Close with what to do instead when a model needs more than 8 ways, and the one case where TP16 is used.

A strong answer

A typical situation: a team has a 405B model, computes that TP8 leaves 50 GB of parameters per GPU in bf16 with no room for optimizer state, and asks why they cannot go to TP16 across two nodes.

Tensor Parallelism splits each weight matrix across t GPUs. In Megatron's arrangement the attention block's output projection and the MLP's second linear layer each produce a partial sum on every GPU, and those partial sums must be added: one all-reduce after attention, one after the MLP, per block, in forward. In backward each of those has a mirror all-reduce for the gradient with respect to the block's input. Four per block. The tensor being reduced is the activation, of shape tokens × hidden, in bf16.

inputs:  Llama 3.1 70B: hidden h = 8,192, layers L = 80
         micro-batch of 8,192 tokens, bf16 activations (2 B)
         t = 8, NVLink 900 GB/s, NIC 50 GB/s

one all-reduce buffer   = tokens × h × 2 B = 8,192 × 8,192 × 2 = 134 MB
per-GPU bytes (ring)    = 2 (t−1)/t × 134 MB = 2 × 7/8 × 134 = 235 MB
count per micro-batch   = 4 per block × 80 blocks = 320
total per GPU           = 320 × 235 MB = 75 GB

time over NVLink        = 75 GB ÷ 900 GB/s ≈ 84 ms
time over NIC           = 75 GB ÷ 50 GB/s  ≈ 1.5 s

compute per GPU per micro-batch (TP8 share):
  6 × 70.6e9 × 8,192 ÷ 8 = 4.3e14 FLOPs ÷ (989e12 × 0.4) ≈ 1.1 s

NVLink: 84 ms ÷ 1.1 s ≈ 8% overhead
NIC:    1.5 s ÷ 1.1 s ≈ 140% overhead

sanity: the NIC case spends more time waiting on the network than computing, and unlike
        a gradient all-reduce it cannot overlap, since layer l+1 needs the reduced output
        of layer l before it can start. TP across nodes would halve throughput or worse.

The overlap point deserves emphasis. A data-parallel gradient all-reduce can start while backward is still producing earlier layers' gradients, so most of it hides. A TP all-reduce sits between two dependent layers; there is nothing to overlap it with except the next micro-batch's independent work, which pipeline-style scheduling can partly arrange but which costs memory and complexity. Sequence parallelism and the async-TP work in PyTorch decompose each all-reduce into a reduce-scatter and all-gather and overlap them with chunks of the adjacent GEMM, which recovers part of the 8% on NVLink but does nothing for the 140% on the NIC.

Eight is not a magic number; it is the size of the domain in which every GPU talks to every other at NVLink speed. An HGX H100 node has 8 GPUs on 4 NVSwitches. GB200 NVL72 puts 72 GPUs in one NVLink domain, and on that hardware TP of 16 or 32 is used, because the bandwidth argument now allows it. The rule is "TP stops at the NVLink domain", and on 2026 fleets of HGX nodes the domain is 8.

The second limit is GEMM shape. A 70B's MLP projects 8,192 to 28,672. At TP8 each GPU holds 28,672/8 = 3,584 output columns; at TP16 it would hold 1,792, and at TP64 only 448. Tensor cores reach peak on large square-ish tiles; a GEMM with a dimension of a few hundred runs at a fraction of peak because the tile grid does not fill the SMs and the memory traffic per FLOP rises. So even inside a large NVLink domain, TP beyond 16 on a 70B loses efficiency in the kernels themselves, and the fix for "more ways" is a different axis: Pipeline Parallelism and the Bubble for more layers per replica, ZeRO and FSDP for sharded state, Expert Parallelism for MoE.

Back to the 405B team. TP8 leaves 405e9 × 2 B ÷ 8 = 101 GB of bf16 weights per GPU, which already exceeds 80 GB before gradients and optimizer state. The answer is not TP16; it is TP8 × PP16, so each GPU holds 1/128 of the model (6.3 GB of weights, 51 GB of full training state before FSDP over the DP axis brings it down further). That is the Llama 3 layout, and it exists because TP stopped at 8.

Decision: TP equal to the NVLink domain size, or smaller when the model is small enough that the per-GPU GEMMs would be underfed. The condition that reverses it is hardware with a larger domain (NVL72) or a model with a hidden size large enough that TP16 GEMMs stay efficient, and even then only within the domain.

FOUR ALL-REDUCES PER LAYER, 80 LAYERS inside NVLink 900 GB/s ≈ 8% of the step across a 400 Gb/s NIC 50 GB/s effective more than the step The TP8 ceiling was never a convention. It was the edge of the NVLink domain. On NVL72 the boundary moves to 72, so every TP8 rule of thumb needs a date attached.

The reversal condition: an NVLink domain of 72 rather than 8, where tensor parallel degrees that were unreachable become a config flag and the whole placement argument reopens. nvidia-smi topo -m is how you confirm the domain you actually have.

What interviewers probe next

  • "Why four all-reduces and not two per block?" Forward needs one after attention's output projection and one after the second MLP matrix; backward needs the gradient with respect to the input of each of those, which is another all-reduce each.
  • "What does sequence parallelism do to this number?" It replaces each all-reduce with a reduce-scatter plus an all-gather of the same total bytes but lets the layernorm and dropout run on sequence shards, cutting activation memory; it does not reduce traffic.
  • "Could you use TP2 across two nodes with TP8 inside?" The cross-node pair would carry the full 134 MB per collective at 50 GB/s, 2.7 ms each, 320 times per micro-batch, 0.86 s; the answer is still no, and pipeline parallelism across the pair costs 5 ms instead.
  • "How would TP look on NVL72?" TP16 or TP32 within the rack at 1,800 GB/s per GPU; the 405B's 101 GB per GPU at TP8 becomes 25 GB at TP32, and PP can drop to 4.

Common mistakes

  • Saying TP stops at 8 "because of NVLink" without sizing the traffic or noting it is the domain size, not a property of the link.
  • Treating the TP all-reduce as overlappable like a DDP all-reduce.
  • Forgetting the backward-pass collectives and computing half the traffic.
  • Proposing TP16 across nodes for a 405B rather than adding a pipeline axis.

Key takeaways

  • Four all-reduces per block on a tokens × hidden activation, on the critical path.
  • For a 70B at 8k tokens: about 75 GB per GPU per micro-batch, 84 ms on NVLink (8% of compute), 1.5 s on a NIC (more than compute).
  • TP stops at the NVLink domain: 8 on HGX, larger on NVL72.
  • The second limit is GEMM shape; below a few thousand columns per GPU the tensor cores idle, so beyond 16 use another axis.
That one was free — and so are 10 answers per topic without an account. Signing in doubles that to 20, opens the Plus lessons in the courses, and remembers which topics you keep getting wrong.no card · Google sign-in · nothing to cancel
HOW DID IT GO?
0
READING SIGNED OUT

Signing in doubles your free answers, from 10 to 20 per topic, and the site starts remembering you: mastery per topic, bookmarks, and a next-focus recommendation. Free, no card.

Sign in free

The concepts behind this question

Ranked by how closely each one overlaps this question's topic, so the first card is the thing to read if the answer above moved too fast.

Advanced
🕸️ Distributed Training🔒 Premium
Tensor ParallelismTensor parallelism splits individual weight matrices across GPUs so each rank computes a slice of every layer, which is how a model whose single layer does not fit one GPU gets trained at all. It costs four all-reduces per transformer block on the critical path, which is why it stays inside the NVLink domain and rarely exceeds 8 ranks.
Advanced
🕸️ Distributed Training🔒 Premium
Context and Sequence ParallelismContext parallelism splits a single long sequence across GPUs so that attention over 128k tokens fits in memory that would otherwise need terabytes of activations per layer. Ring attention rotates key-value blocks around the ranks while queries stay put, and grouped-query attention is what makes that rotation cheap enough to hide behind the attention math.
Foundational
🔌 Networking & Storage
NCCL and Collective AlgorithmsNCCL is the library every PyTorch collective lands in, and its choice of ring or tree, channel count and protocol decides whether an all-reduce runs at fabric speed or at a third of it. Knowing what NCCL_DEBUG=INFO prints, and which environment variable changes which decision, is the difference between tuning a cluster and guessing at it.
Foundational
🧭 Ownership & Judgment
Talking About Cost and Capacity with LeadershipInfrastructure engineers are asked to justify large numbers to people who do not share their vocabulary, and the conversations go wrong in predictable ways: a technical objection with no alternative, a forecast with no assumptions, or a cost quoted in a unit the listener cannot act on. What works is a small number of costed options, a stated recommendation, the decision needed by a date, and every figure expressed in whatever the listener actually controls.
UP NEXT ON YOUR JOURNEY
FEDITOR'S NOTE

Scored on counting the four collectives per block and sizing them from tokens × hidden × bytes, on comparing NVLink and NIC bandwidth against compute for the same layer, and on mentioning the GEMM-efficiency reason as well as the bandwidth one.

DISCUSSION · 0

No comments yet — be the first to share your approach.