<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Noise2Signal]]></title><description><![CDATA[Real talk on ML infra - what breaks, what scales, and what the papers don't tell you.]]></description><link>https://blog.noise2signal.ai</link><image><url>https://substackcdn.com/image/fetch/$s_!ZQL3!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb698dd4f-5651-4410-9a1a-d0765b5c397a_720x720.png</url><title>Noise2Signal</title><link>https://blog.noise2signal.ai</link></image><generator>Substack</generator><lastBuildDate>Sat, 30 May 2026 02:56:16 GMT</lastBuildDate><atom:link href="https://blog.noise2signal.ai/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Saksham Consul]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[sakshamconsul@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[sakshamconsul@substack.com]]></itunes:email><itunes:name><![CDATA[Saksham Consul]]></itunes:name></itunes:owner><itunes:author><![CDATA[Saksham Consul]]></itunes:author><googleplay:owner><![CDATA[sakshamconsul@substack.com]]></googleplay:owner><googleplay:email><![CDATA[sakshamconsul@substack.com]]></googleplay:email><googleplay:author><![CDATA[Saksham Consul]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The five things you can shard]]></title><description><![CDATA[A working person's map of distributed training. There are only five axes; everything else is a name.]]></description><link>https://blog.noise2signal.ai/p/the-five-things-you-can-shard</link><guid isPermaLink="false">https://blog.noise2signal.ai/p/the-five-things-you-can-shard</guid><dc:creator><![CDATA[Saksham Consul]]></dc:creator><pubDate>Mon, 25 May 2026 01:04:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WYQ5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01341cb2-35d1-420d-b770-29b19661864f_860x381.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the last post I argued that training at scale is a systems problem, and the system you&#8217;re working against is the bandwidth hierarchy of your physical cluster. Each parallelism paradigm is a bet about where in that hierarchy you can afford to communicate.</p><p>This post answers the next question: <strong>what bets can you actually make?</strong></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.noise2signal.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Noise2Signal! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>When you read the literature, the answer looks complicated. DDP, ZeRO-1, ZeRO-2, ZeRO-3, FSDP, HSDP, TP, SP, PP (GPipe, 1F1B, interleaved, zero-bubble), CP, EP, ring attention, expert choice, DeepEP - every framework has its own vocabulary, every paper introduces a new acronym, and a new practitioner could be forgiven for thinking there are dozens of distinct techniques to learn.</p><p>The reality is simpler. A training step has a small number of dimensions you can split work along, and <strong>every named paradigm is a strategy for splitting one of those dimensions</strong>: sometimes one alone, sometimes a few combined. Once you have the dimensions in your head, the zoo of paradigms organizes itself into a small map.</p><p>The table below is the map at a glance - what each axis splits, what communication it forces, which tier of fabric it lives on. If you&#8217;ve worked with a few of these and just need the layout, the table is the post. If you want to know why each row reads the way it does, the sections after it walk through each axis in turn.</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\begin{array}{|l|l|l|l|l|l|}\n\\hline\n\\textbf{Axis} &amp; \\textbf{What's Split} &amp; \\textbf{Comm Primitive} &amp; \\textbf{Frequency} &amp; \\textbf{Fabric Tier} &amp; \\textbf{When to Use} \\\\\n\\hline\n\\text{DP} &amp; \\text{Batch} &amp; \\text{AllReduce (gradients)} &amp; \\text{1x per step} &amp; \\text{Slowest OK (inter-rack IB)} &amp; \\text{Always - start here} \\\\\n\\hline\n\\text{TP} &amp; \\text{Hidden dim (matmul)} &amp; \\text{AllReduce} &amp; \\text{~4x per layer} &amp; \\text{Fastest only (NVLink)} &amp; \\text{Layer/activations don't fit on one GPU} \\\\\n\\hline\n\\text{PP} &amp; \\text{Layer depth} &amp; \\text{Send/recv} &amp; \\text{Per stage boundary} &amp; \\text{IB OK} &amp; \\text{Model doesn't fit even with TP+FSDP} \\\\\n\\hline\n\\text{CP} &amp; \\text{Sequence (attention)} &amp; \\text{K/V ring rotation} &amp; \\text{Per attention layer} &amp; \\text{Mid-fast (intra-pod)} &amp; \\text{Long context (~16K+ tokens)} \\\\\n\\hline\n\\text{EP} &amp; \\text{Experts (MoE)} &amp; \\text{All-to-all} &amp; \\text{2x per MoE layer} &amp; \\text{Mid-fast (intra-pod)} &amp; \\text{MoE models} \\\\\n\\hline\n\\end{array}&quot;,&quot;id&quot;:&quot;WSTIOLVKGY&quot;}" data-component-name="LatexBlockToDOM"></div><p><em>Modifiers - knobs within an axis, not separate axes:</em></p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\begin{array}{|l|l|l|l|}\n\\hline\n\\textbf{Modifier} &amp; \\textbf{Modifies} &amp; \\textbf{What it does} &amp; \\textbf{Cost} \\\\\n\\hline\n\\text{SP} &amp; \\text{TP} &amp; \\text{Shards layernorm/dropout activations along sequence} &amp; \\text{Free (same total bytes moved)} \\\\\n\\hline\n\\text{FSDP} &amp; \\text{DP} &amp; \\text{Shards model state across DP ranks (ZeRO-3)} &amp; \\text{Extra allgather/reduce-scatter per layer} \\\\\n\\hline\n\\end{array}&quot;,&quot;id&quot;:&quot;HXVTZPTDCQ&quot;}" data-component-name="LatexBlockToDOM"></div><p>There are five dimensions worth knowing. Here they are, in the order I find easiest to remember.</p><h3>1. Batch (B): data parallelism</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Zkji!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc05680f4-0aea-4b20-b6b5-8d506af2d8dd_770x354.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Zkji!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc05680f4-0aea-4b20-b6b5-8d506af2d8dd_770x354.png 424w, https://substackcdn.com/image/fetch/$s_!Zkji!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc05680f4-0aea-4b20-b6b5-8d506af2d8dd_770x354.png 848w, https://substackcdn.com/image/fetch/$s_!Zkji!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc05680f4-0aea-4b20-b6b5-8d506af2d8dd_770x354.png 1272w, https://substackcdn.com/image/fetch/$s_!Zkji!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc05680f4-0aea-4b20-b6b5-8d506af2d8dd_770x354.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Zkji!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc05680f4-0aea-4b20-b6b5-8d506af2d8dd_770x354.png" width="770" height="354" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c05680f4-0aea-4b20-b6b5-8d506af2d8dd_770x354.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:354,&quot;width&quot;:770,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:42018,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://sakshamconsul.substack.com/i/199022940?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed7990b6-3241-414e-b66b-8599f48d1584_860x395.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Zkji!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc05680f4-0aea-4b20-b6b5-8d506af2d8dd_770x354.png 424w, https://substackcdn.com/image/fetch/$s_!Zkji!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc05680f4-0aea-4b20-b6b5-8d506af2d8dd_770x354.png 848w, https://substackcdn.com/image/fetch/$s_!Zkji!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc05680f4-0aea-4b20-b6b5-8d506af2d8dd_770x354.png 1272w, https://substackcdn.com/image/fetch/$s_!Zkji!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc05680f4-0aea-4b20-b6b5-8d506af2d8dd_770x354.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>What gets split</strong>: the batch of training examples. Each rank processes a different shard of the batch through the <em>same</em> model weights.</p><p><strong>Communication primitive</strong>: AllReduce on gradients at the end of each step. Each rank computes a gradient on its data shard; the cluster sums them so every rank ends up with the same averaged gradient.</p><p><strong>Paradigm names</strong>: DDP (the textbook version), and all the ZeRO/FSDP/HSDP variants which we&#8217;ll discuss separately because they&#8217;re really refinements of DP rather than a new axis.</p><p><strong>Why this exists</strong>: it&#8217;s the trivial parallelism - you can always train on more data in parallel. The forcing function is that one GPU&#8217;s batch is too small to get statistically meaningful gradients in reasonable time.</p><p><strong>Cost</strong>: one allreduce per step on the full gradient (~2P bytes per rank). This is the cheapest communication pattern in the menu because it&#8217;s infrequent (once per step, not once per layer) and can be overlapped with backward compute. It&#8217;s the bottom of the communication intensity hierarchy.</p><p><strong>Where it sits</strong>: tolerable on the slowest fabric in your hierarchy (inter-rack IB). This is <em>why</em> DP is the outermost layer of most composition recipes - it can pay the slowest fabric without bleeding throughput.</p><h3>2. Hidden dimension (H): tensor parallelism</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!alaw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6237092-3e1a-4028-8584-e4646ec5ccde_860x373.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!alaw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6237092-3e1a-4028-8584-e4646ec5ccde_860x373.png 424w, https://substackcdn.com/image/fetch/$s_!alaw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6237092-3e1a-4028-8584-e4646ec5ccde_860x373.png 848w, https://substackcdn.com/image/fetch/$s_!alaw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6237092-3e1a-4028-8584-e4646ec5ccde_860x373.png 1272w, https://substackcdn.com/image/fetch/$s_!alaw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6237092-3e1a-4028-8584-e4646ec5ccde_860x373.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!alaw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6237092-3e1a-4028-8584-e4646ec5ccde_860x373.png" width="860" height="373" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e6237092-3e1a-4028-8584-e4646ec5ccde_860x373.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:373,&quot;width&quot;:860,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:23175,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://sakshamconsul.substack.com/i/199022940?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6237092-3e1a-4028-8584-e4646ec5ccde_860x373.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!alaw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6237092-3e1a-4028-8584-e4646ec5ccde_860x373.png 424w, https://substackcdn.com/image/fetch/$s_!alaw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6237092-3e1a-4028-8584-e4646ec5ccde_860x373.png 848w, https://substackcdn.com/image/fetch/$s_!alaw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6237092-3e1a-4028-8584-e4646ec5ccde_860x373.png 1272w, https://substackcdn.com/image/fetch/$s_!alaw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6237092-3e1a-4028-8584-e4646ec5ccde_860x373.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>What gets split</strong>: the matmul itself. Each linear layer&#8217;s weight matrix is sharded, column-wise for some layers, row-wise for others, and the matmul is distributed across ranks accordingly.</p><p><strong>Communication primitive</strong>: AllReduce <em>inside</em> each layer. The classic Megatron-LM recipe gets you down to one allreduce per attention block and one per MLP block, so roughly two allreduces per layer per microbatch per pass, or four per layer per step counting backward.</p><p><strong>Paradigm names</strong>: TP (Megatron-style).</p><p>A note on naming before we go further. There&#8217;s a related technique called <strong>Sequence Parallelism (SP)</strong> which is the standard companion to TP. SP shards the activations of layernorm and dropout, the elementwise operations that sit between TP&#8217;s matmul regions, along the sequence dimension. It&#8217;s a free trick: <code>AllReduce = ReduceScatter + AllGather</code> , so SP turns TP&#8217;s region-boundary all-reduces into a reduce-scatter and all-gather pair that moves the same total bytes but leaves activations sharded between regions instead of replicated. The result is the same activation memory savings TP gives you for matmul tensors, now extended to the non-matmul stuff.</p><p>The naming is unfortunate. &#8220;Sequence parallelism&#8221; sounds like the general technique for sharding the sequence dimension, but in current usage (matching Megatron-Core, Transformer Engine, and most frontier framework documentation), <strong>SP specifically means this TP companion</strong> - sharding only the elementwise activations between TP regions, not the attention computation itself. The general technique for sharding sequence <em>across attention</em> is a different thing called Context Parallelism (CP), which gets its own section below. Some papers from 2022-2023 use &#8220;sequence parallelism&#8221; loosely to mean either. This series uses SP narrowly (the TP companion) and CP for the broader attention-sharding story.</p><p>So: SP rides with TP everywhere TP appears. It&#8217;s not a separate axis; it&#8217;s how you should always run TP at scale.</p><p><strong>Why this exists</strong>: when a single layer&#8217;s parameters or activations don&#8217;t fit on one GPU. Also useful when activation memory dominates at long context, even if the model would otherwise fit.</p><p><strong>Cost</strong>: many allreduces per layer, on the critical path of compute (the next operation can&#8217;t start until the allreduce completes). With ~80 layers and 4 allreduces per layer, that&#8217;s 320 hard sync points per step. Even small, this adds up - TP communication is often 10-30% of step time at typical TP=8.</p><p><strong>Where it sits</strong>: the top of the bandwidth hierarchy. TP must stay within the fast intra-node domain (NVLink/NVSwitch: 8 GPUs on H100, 72 on GB200 NVL72). Push it across InfiniBand and your MFU collapses, because the chattiest workload now lives on the slowest fabric.</p><h3>3. Layer depth (L): pipeline parallelism</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!C0gZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa00f8d45-dd30-4ac3-b3fc-0c571e0e0f54_860x373.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!C0gZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa00f8d45-dd30-4ac3-b3fc-0c571e0e0f54_860x373.png 424w, https://substackcdn.com/image/fetch/$s_!C0gZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa00f8d45-dd30-4ac3-b3fc-0c571e0e0f54_860x373.png 848w, https://substackcdn.com/image/fetch/$s_!C0gZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa00f8d45-dd30-4ac3-b3fc-0c571e0e0f54_860x373.png 1272w, https://substackcdn.com/image/fetch/$s_!C0gZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa00f8d45-dd30-4ac3-b3fc-0c571e0e0f54_860x373.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!C0gZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa00f8d45-dd30-4ac3-b3fc-0c571e0e0f54_860x373.png" width="860" height="373" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a00f8d45-dd30-4ac3-b3fc-0c571e0e0f54_860x373.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:373,&quot;width&quot;:860,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:33234,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://sakshamconsul.substack.com/i/199022940?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa00f8d45-dd30-4ac3-b3fc-0c571e0e0f54_860x373.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!C0gZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa00f8d45-dd30-4ac3-b3fc-0c571e0e0f54_860x373.png 424w, https://substackcdn.com/image/fetch/$s_!C0gZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa00f8d45-dd30-4ac3-b3fc-0c571e0e0f54_860x373.png 848w, https://substackcdn.com/image/fetch/$s_!C0gZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa00f8d45-dd30-4ac3-b3fc-0c571e0e0f54_860x373.png 1272w, https://substackcdn.com/image/fetch/$s_!C0gZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa00f8d45-dd30-4ac3-b3fc-0c571e0e0f54_860x373.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>What gets split</strong>: the model&#8217;s layers. Each rank (or rank group) owns a contiguous chunk of layers - the &#8220;pipeline stage.&#8221; Forward activations flow from stage 0 &#8594; 1 &#8594; 2 &#8594; ...; gradients flow back the other way.</p><p><strong>Communication primitive</strong>: point-to-point send/recv between adjacent stages. One activation tensor goes forward; one gradient tensor comes back. Not collectives.</p><p><strong>Paradigm names</strong>: PP, GPipe, PipeDream, 1F1B, interleaved 1F1B, zero-bubble PP. The progression in the literature is mostly about scheduling: how to fill the pipeline to minimize the idle &#8220;bubble&#8221; while keeping activation memory bounded.</p><p><strong>Why this exists</strong>: when even TP + FSDP can&#8217;t fit the model on the fast fabric. PP lets you spread the model across many nodes by giving each node a stage instead of a sharded copy.</p><p><strong>Cost</strong>: two related costs. First, the pipeline <em>bubble</em> - idle time on each stage while microbatches propagate. Bubble fraction is roughly (N-1)/(M+N-1) for N stages and M microbatches, so M has to be much larger than N to keep the bubble small. Second, <em>stashed activations</em>: each stage holds onto activations for in-flight microbatches until their backward pass arrives. The send/recv communication itself is cheap; the scheduling complexity is what makes PP hard.</p><p><strong>Where it sits</strong>: tolerable on InfiniBand. The messages are large but infrequent (per stage boundary, not per layer), and PP doesn&#8217;t depend on a fully-connected fast domain. This is why PP is typically the &#8220;across nodes&#8221; layer in composition recipes.</p><h3>4. Sequence - attention (S): context parallelism</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WYQ5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01341cb2-35d1-420d-b770-29b19661864f_860x381.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WYQ5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01341cb2-35d1-420d-b770-29b19661864f_860x381.png 424w, https://substackcdn.com/image/fetch/$s_!WYQ5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01341cb2-35d1-420d-b770-29b19661864f_860x381.png 848w, https://substackcdn.com/image/fetch/$s_!WYQ5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01341cb2-35d1-420d-b770-29b19661864f_860x381.png 1272w, https://substackcdn.com/image/fetch/$s_!WYQ5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01341cb2-35d1-420d-b770-29b19661864f_860x381.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WYQ5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01341cb2-35d1-420d-b770-29b19661864f_860x381.png" width="860" height="381" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/01341cb2-35d1-420d-b770-29b19661864f_860x381.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:381,&quot;width&quot;:860,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:30315,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://sakshamconsul.substack.com/i/199022940?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01341cb2-35d1-420d-b770-29b19661864f_860x381.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WYQ5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01341cb2-35d1-420d-b770-29b19661864f_860x381.png 424w, https://substackcdn.com/image/fetch/$s_!WYQ5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01341cb2-35d1-420d-b770-29b19661864f_860x381.png 848w, https://substackcdn.com/image/fetch/$s_!WYQ5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01341cb2-35d1-420d-b770-29b19661864f_860x381.png 1272w, https://substackcdn.com/image/fetch/$s_!WYQ5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01341cb2-35d1-420d-b770-29b19661864f_860x381.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>What gets split</strong>: the sequence dimension <em>across the attention computation itself</em>. Each rank persistently holds 1/N of the sequence&#8217;s Q, K, V. To make attention work (every Q must see every K), K and V chunks rotate around the ranks while attention is computed in pieces.</p><p><strong>Communication primitive</strong>: ring rotation of K/V shards between adjacent ranks (point-to-point send/recv, but in a ring pattern). Combined with the online-softmax trick (the same algorithmic identity FlashAttention uses) to combine partial attention results without ever materializing the full attention matrix.</p><p><strong>Paradigm names</strong>: CP, Ring Attention, Striped Attention (a load-balanced variant for causal masking).</p><p><strong>Why this exists</strong>: at long context (typically 16K+ tokens), the attention activation memory becomes the dominant cost, and you can&#8217;t reduce it further with TP alone (head sharding caps out at the number of heads, and activations per head are quadratic in sequence).</p><p><strong>Cost</strong>: N-1 ring rotations per attention layer, where N is the CP degree. The cost is high enough that CP only pays for itself past ~16K-32K sequence on H100 &#8212; below that, the rotation communication exceeds the memory savings. On GB200 NVL72 the crossover shifts down to maybe 4K-8K because the ring runs on much faster fabric.</p><p><strong>Where it sits</strong>: middle of the hierarchy. CP wants fast fabric (the ring rotation is on the critical path of attention), but tolerates inter-node IB at long context where the per-chunk attention compute is large enough to hide the rotation. Typically composed alongside TP.</p><h3>5. Experts (E): expert parallelism</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zdPd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa128f1-4970-478d-bed1-619c22441082_860x380.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zdPd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa128f1-4970-478d-bed1-619c22441082_860x380.png 424w, https://substackcdn.com/image/fetch/$s_!zdPd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa128f1-4970-478d-bed1-619c22441082_860x380.png 848w, https://substackcdn.com/image/fetch/$s_!zdPd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa128f1-4970-478d-bed1-619c22441082_860x380.png 1272w, https://substackcdn.com/image/fetch/$s_!zdPd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa128f1-4970-478d-bed1-619c22441082_860x380.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zdPd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa128f1-4970-478d-bed1-619c22441082_860x380.png" width="860" height="380" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/afa128f1-4970-478d-bed1-619c22441082_860x380.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:380,&quot;width&quot;:860,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:38051,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://sakshamconsul.substack.com/i/199022940?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa128f1-4970-478d-bed1-619c22441082_860x380.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zdPd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa128f1-4970-478d-bed1-619c22441082_860x380.png 424w, https://substackcdn.com/image/fetch/$s_!zdPd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa128f1-4970-478d-bed1-619c22441082_860x380.png 848w, https://substackcdn.com/image/fetch/$s_!zdPd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa128f1-4970-478d-bed1-619c22441082_860x380.png 1272w, https://substackcdn.com/image/fetch/$s_!zdPd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa128f1-4970-478d-bed1-619c22441082_860x380.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>What gets split</strong>: experts in a Mixture-of-Experts model. Each rank holds and computes for only its assigned subset of experts.</p><p><strong>Communication primitive</strong>: all-to-all. Twice per MoE layer per forward pass - once to dispatch tokens to the ranks holding their assigned experts, once to combine the expert outputs back to the originating ranks.</p><p><strong>Paradigm names</strong>: EP, expert sharding. The choice of routing algorithm (top-k, expert choice, auxiliary-loss-free) shapes the load distribution but doesn&#8217;t change the basic communication pattern.</p><p><strong>Why this exists</strong>: MoE models decouple parameter count from compute per token. A 1T-parameter MoE might activate only 37B parameters per token. Those 1T parameters still have to live somewhere; distributing them across DP ranks wastes memory (every rank holds all experts but uses few). EP makes each rank specialize.</p><p><strong>Cost</strong>: all-to-all is the densest communication pattern in this menu. Every rank sends data to every other rank, in both directions, simultaneously. The traffic is also <em>uneven</em> across steps - if the router sends 30% of tokens to one expert, that expert&#8217;s rank receives 30% of all traffic. Load imbalance directly compounds the communication cost. At frontier scale, EP all-to-all can be the single largest component of step time and motivates custom kernels (DeepSeek&#8217;s DeepEP).</p><p><strong>Where it sits</strong>: wants fast moderate-distance fabric. Within a single fast domain is ideal (EP=64 within a GB200 NVL72 rack is a meaningful sweet spot). Across nodes via IB works but requires careful tuning of both the routing (to balance load) and the communication kernels (to handle the dense traffic).</p><h3>The modifiers: SP and FSDP</h3><p>Two more names you&#8217;ll encounter in the literature deserve a callout, because the field talks about them as if they&#8217;re peer techniques to TP/PP/CP/EP and they aren&#8217;t.</p><p><strong>SP</strong> is the TP companion described in section 2. It&#8217;s not a separate axis: it&#8217;s how you should always run TP at scale. The reason it gets its own name is historical (Megatron published it as a distinct paper) and the reason it stuck is that you can run TP without SP, badly. But conceptually, SP is part of TP. Anywhere this series talks about TP, assume SP rides along.</p><p><strong>FSDP</strong> is a refinement of DP. DDP replicates the entire model state on every DP rank. ZeRO-1 shards optimizer states across DP ranks. ZeRO-2 also shards gradients. ZeRO-3 (= FSDP) also shards parameters. Each level reclaims memory DDP was wasting on redundant copies, at additional communication cost.</p><p>The right way to think about it: <strong>DP is an axis (the batch dimension). FSDP is a choice about how aggressively to shard state along that same axis.</strong> HSDP is &#8220;FSDP within one node, DDP across nodes&#8221;: same axis, hierarchical sharding policy. The DDP-vs-FSDP-vs-HSDP choice is a within-axis knob, not a new axis. The dedicated DP post will go deep on which knob to pick when.</p><p>The map of &#8220;things you can adjust&#8221;: five axes, plus a sharding-aggressiveness knob within DP, plus the TP-with-or-without-SP knob (always: with).</p><h3>The composition preview</h3><p>When you hear &#8220;3D parallelism&#8221; or &#8220;5D parallelism,&#8221; that&#8217;s just <strong>picking multiple axes at once</strong>. A typical frontier dense recipe (Llama 3 style) uses three axes: TP &#215; PP &#215; DP. A long-context recipe might add CP for four. A frontier MoE recipe might use TP &#215; EP &#215; PP &#215; DP for four, with EP replacing some of what TP normally does.</p><p>The geometry of the cluster sets the constraints: TP wants the fast fabric, so it goes intra-node. PP tolerates IB, so it goes across nodes. DP tolerates the slowest fabric, so it&#8217;s the outermost layer. CP and EP fit in the middle, with placement details that depend on the specific cluster topology.</p><p>The next several posts will take each axis seriously, one at a time. We&#8217;ll see how each one&#8217;s communication primitive maps to bandwidth and latency budgets, where it breaks under load, what knobs frameworks expose, and what surprises you when you scale it up. Then we&#8217;ll come back to composition - by that point, &#8220;4D parallelism&#8221; should feel less like jargon and more like an obvious consequence of picking the right axis for each tier of your machine.</p><p></p><p>Before the takeaway, it's worth pausing on what 5D composition actually looks like end-to-end. The diagram below zooms three times: from the cluster (DP across 16 replicas), into one replica (PP across 8 stages), into one stage (TP &#215; CP &#215; optional EP across 8 GPUs), all the way down to where a single QKV projection happens. It's the picture I keep coming back to, because it makes the nesting obvious in a way prose can't: each axis isn't a separate technique you bolt on, it's a level of zoom on the same physical cluster.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XJgZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F546f5371-f68d-4d42-9043-515b02760d85_960x1292.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XJgZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F546f5371-f68d-4d42-9043-515b02760d85_960x1292.png 424w, https://substackcdn.com/image/fetch/$s_!XJgZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F546f5371-f68d-4d42-9043-515b02760d85_960x1292.png 848w, https://substackcdn.com/image/fetch/$s_!XJgZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F546f5371-f68d-4d42-9043-515b02760d85_960x1292.png 1272w, https://substackcdn.com/image/fetch/$s_!XJgZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F546f5371-f68d-4d42-9043-515b02760d85_960x1292.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XJgZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F546f5371-f68d-4d42-9043-515b02760d85_960x1292.png" width="960" height="1292" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/546f5371-f68d-4d42-9043-515b02760d85_960x1292.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1292,&quot;width&quot;:960,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:169604,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://sakshamconsul.substack.com/i/199022940?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F546f5371-f68d-4d42-9043-515b02760d85_960x1292.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XJgZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F546f5371-f68d-4d42-9043-515b02760d85_960x1292.png 424w, https://substackcdn.com/image/fetch/$s_!XJgZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F546f5371-f68d-4d42-9043-515b02760d85_960x1292.png 848w, https://substackcdn.com/image/fetch/$s_!XJgZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F546f5371-f68d-4d42-9043-515b02760d85_960x1292.png 1272w, https://substackcdn.com/image/fetch/$s_!XJgZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F546f5371-f68d-4d42-9043-515b02760d85_960x1292.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3>The takeaway</h3><p>If I could put one thing in your head before the next post: <strong>There are five dimensions you can split work along, and the right composition is the one where each axis lives at the right level of zoom. Every paradigm name you've heard is a strategy for one of them, or a combination. Pick the dimensions by asking what your bottleneck is; pick the </strong><em><strong>degree</strong></em><strong> by asking what tier of your fabric you can afford to communicate.</strong></p><p>Once you have this map, the rest of the series is a tour of each axis in turn.</p><p>Next post: data parallelism in depth: what DDP actually does, why bucketing exists, where it breaks at scale, and how ZeRO-2 recovers most of the wasted memory essentially for free.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.noise2signal.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Noise2Signal! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://blog.noise2signal.ai/p/the-five-things-you-can-shard?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Noise2Signal! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.noise2signal.ai/p/the-five-things-you-can-shard?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.noise2signal.ai/p/the-five-things-you-can-shard?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div>]]></content:encoded></item><item><title><![CDATA[Training is not (just) a compute problem]]></title><description><![CDATA[Why your GPUs spend most of their time waiting, and what that tells you about the field.]]></description><link>https://blog.noise2signal.ai/p/training-is-not-just-a-compute-problem</link><guid isPermaLink="false">https://blog.noise2signal.ai/p/training-is-not-just-a-compute-problem</guid><dc:creator><![CDATA[Saksham Consul]]></dc:creator><pubDate>Fri, 22 May 2026 02:31:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ZQL3!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb698dd4f-5651-4410-9a1a-d0765b5c397a_720x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When I first started working on distributed training, I had a mental model that turned out to be wrong in an interesting way. I thought training a big model was, fundamentally, a <em>compute</em> problem. You had FLOPs; you had a model that needed FLOPs to fit; the job was to get them efficiently from one to the other. Cluster procurement was a matter of counting H100s. Performance work was a matter of making kernels faster.</p><p>This is true at small scale. It stops being true around the time you start filling a rack.</p><p>A well-tuned frontier training run on 16,000 H100s achieves roughly 40% of the cluster&#8217;s peak FP16 throughput. The other 60% is spent waiting: on memory, on the network, on other GPUs, on slow disks, on stragglers, on bubbles, on barriers, on the half-hour after someone&#8217;s NIC silently corrupted its 14th packet of the day. We&#8217;ve learned to live with this number, but it should bother us more than it does.</p><p>That 60% is the substrate this series will spend a lot of time on. Some of it is a <em>design</em> problem: choosing the parallelism that fits the physics of your cluster. Some of it is an <em>operations</em> problem: keeping 10,000 GPUs healthy enough to talk to each other for 54 days straight. The literature treats the first as real engineering and the second as plumbing. I think both are real engineering. The frontier labs that ship models on schedule are the ones that take both seriously.</p><p>The thing I&#8217;ve come to believe, and what this series will spend a lot of time exploring, is that <strong>training at scale is better understood as a systems problem than as a compute problem</strong>. The specific system you&#8217;re working against is the bandwidth hierarchy of your physical cluster, and most of the interesting choices in training infrastructure are bets about where in that hierarchy you can afford to communicate.</p><p></p><p>Once you have this lens, a lot of the field organizes itself.</p><h3>The hierarchy that actually runs your job</h3><p>The picture I keep in my head looks something like this, sorted from fast and small to slow and large. The absolute numbers depend on what generation of hardware you&#8217;re on; the <em>trend</em>, each tier roughly 10&#215; slower than the one above it, is remarkably stable.</p><ul><li><p><strong>HBM &#8596; tensor cores</strong>: ~3.3 TB/s on H100, ~8 TB/s on B200, scoped to one GPU. This is what tensor cores actually feed on, and it&#8217;s the reason most kernels run at a small fraction of peak FLOPs - they exhaust memory bandwidth before they exhaust compute.</p></li><li><p><strong>NVLink within the fast domain</strong>: 900 GB/s bidirectional per H100 GPU (NVLink 4), 1.8 TB/s bidirectional per B200 GPU (NVLink 5). The domain itself is 8 GPUs on H100 nodes or 72 GPUs on GB200 NVL72 racks - the size of the fast domain matters as much as its bandwidth, and the jump from 8 to 72 changes what parallelism schemes are viable in ways we&#8217;ll come back to.</p></li><li><p><strong>InfiniBand within a pod</strong>: ~50 GB/s per NIC, ~400 GB/s aggregate per node, scoped to a few nodes before contention shows up. Roughly an order of magnitude slower than NVLink, and that gap shapes most architecture decisions.</p></li><li><p><strong>InfiniBand across racks</strong>: same per-link bandwidth, but now sharing spine switches with hundreds of other ranks. Effective bandwidth drops further; latency variance gets ugly.</p></li><li><p><strong>Storage</strong>: ~100 GB/s aggregate for a decent shared filesystem, shared with everything else doing I/O.</p></li></ul><p>The thing I keep coming back to: each generational jump has improved the absolute numbers, but the ratios between tiers have stayed roughly constant. NVLink is faster than IB by about an order of magnitude on both H100 and Blackwell. HBM is faster than NVLink by about an order of magnitude on both. The cliff is the same shape; it&#8217;s just shifted up. Which means the architectural choices, what to put on which tier, stay broadly similar across generations, even as the per-tier capacity grows.</p><p>(Two notes on the numbers. First, NVLink bandwidth is quoted as bidirectional aggregate per GPU; in practice you&#8217;ll often see practitioners halve this when reasoning about single-direction effective throughput in real collectives. Second, the &#8220;10&#215; cliff&#8221; is approximate - the real ratios depend on per-NIC counts, NVSwitch topology, and what your network can actually sustain under contention. The point isn&#8217;t the exact factor; it&#8217;s that there&#8217;s a <em>very</em> large gap between intra-node and inter-node fabric that determines a lot of downstream decisions.)</p><p>The way I&#8217;ve come to read the parallelism literature is: every paradigm you&#8217;ve heard of, DP, FSDP, TP, PP, CP, EP, is a strategy for placing different kinds of communication onto different tiers of this hierarchy. That&#8217;s the organizing principle. Once it clicks, the menu starts to feel less like a grab-bag and more like a set of obvious choices given the constraints:</p><ul><li><p><em>Tensor parallelism</em> lives at the top tier (NVLink only) because its communication sits on the critical path of every matmul. There&#8217;s no room to hide it.</p></li><li><p><em>Pipeline parallelism</em> tolerates the middle tier because its communication is point-to-point and infrequent - once per stage boundary, not per layer.</p></li><li><p><em>Data parallelism</em> tolerates the bottom tier because its allreduce happens once per step and can be overlapped with backward compute.</p></li><li><p><em>FSDP</em> sits between TP and DP: it wants the fast tier when it can get it and falls back to &#8220;hybrid&#8221; (HSDP) when it can&#8217;t.</p></li></ul><p>When I see someone running TP across nodes, my first thought is that they&#8217;ve put the chattiest workload on the wrong tier. They&#8217;re paying for tensor cores that are mostly waiting on InfiniBand. Sometimes there&#8217;s a good reason; usually there isn&#8217;t. The hierarchy is unforgiving that way.</p><h3>The memory side of the same hierarchy</h3><p>The bandwidth story has a partner in a memory story, and the two together set up most of what&#8217;s interesting in the field.</p><p>Take a 70B-parameter model trained with Adam in mixed precision. The state you have to hold per parameter, in bytes:</p><ul><li><p>Parameters (bf16): 2</p></li><li><p>Gradients (bf16 or fp32): 2-4</p></li><li><p>Adam first moment (fp32): 4</p></li><li><p>Adam second moment (fp32): 4</p></li><li><p>Master weights kept in fp32 for the optimizer: 4</p></li></ul><p>That&#8217;s 16 bytes per parameter, give or take. For 70B parameters, <strong>~1.1 TB of model state</strong>, before you&#8217;ve stored a single activation. An H100 has 80 GB; a B200 has 180 GB. The model state alone vastly exceeds one GPU, and in fact exceeds an entire 8-GPU H100 node. This is the &#8220;16&#215; rule,&#8221; and it&#8217;s the second forcing function I&#8217;ll come back to throughout the series: you can&#8217;t compute alone, and you can&#8217;t <em>store</em> alone either.</p><p>Every parallelism paradigm is, among other things, a strategy for slicing this state across GPUs so no one GPU holds more than its HBM allows. These two pressures, communication and storage, pull against each other in ways that drive most of the algorithm design in the field. Shard state more aggressively (FSDP, TP) and you create more communication, because what one rank needs is now somewhere else. Replicate state (DP) and you waste memory on N copies of the same thing. The interesting algorithmic work, in my reading, is in <em>relaxing this tradeoff</em> - finding ways to keep memory low without paying full price in communication.</p><p>ZeRO-2 is the most elegant example I know of. It splits one allreduce into a reduce-scatter and an allgather, keeps the same total bytes on the wire, and recovers (N-1)/N of optimizer-state memory essentially for free. That&#8217;s a real algorithmic insight; everything downstream is engineering. The field has maybe a half-dozen ideas of that caliber, and a lot of careful work around them.</p><h3>The third pressure: synchronization</h3><p>There&#8217;s one more pressure that doesn&#8217;t show up until you&#8217;re at scale, and I think it&#8217;s underappreciated relative to how much MFU it costs.</p><p>Synchronous training pays for the <em>maximum</em>, not the <em>mean</em>. A synchronous step finishes when the slowest rank finishes. With N ranks, the expected maximum of N step times grows with both N and the variance of individual step times. For a roughly Gaussian distribution of step times with a 5% per-rank coefficient of variation (which is <em>good</em> tuning) the slowest rank at N=16,000 lags the average by something like 22%. That&#8217;s MFU you pay just for the right to call your training synchronous.</p><p>This tax compounds with every level of synchronization in your stack. TP allreduces synchronize 8 ranks 320 times per step. DP allreduces synchronize all 16K ranks once per step. Each is its own straggler event, with its own tail.</p><p>One consequence: variance reduction is its own engineering discipline at scale. People pin CPUs, disable Turbo Boost, set uniform power caps below the thermal-throttling threshold, isolate NUMA, pre-warm kernels - not for the small mean improvement, but to compress the right tail of per-rank latency. The slowest rank sets your throughput, and the slowest rank is set by &#963;, and &#963; is set by a hundred small things. A lot of what makes &#8220;well-tuned&#8221; clusters well-tuned is in this category, and most of it isn&#8217;t glamorous.</p><h3>What this series is for</h3><p>I&#8217;m writing this as a practicing infra engineer, mostly for other practicing infra engineers particularly who are scaling up and discovering that their 1,000-GPU recipe has failure modes their 100-GPU recipe never showed. The frontier labs publish technical reports; the textbooks describe the abstractions; the framework docs tell you which knobs exist. What I haven&#8217;t seen much of is the connective tissue: <em>why</em> these abstractions exist, <em>what</em> breaks when you scale them, <em>how</em> to reason about a recipe before you commit a month of cluster time to running it, and <em>what it actually takes</em> to keep a cluster running long enough to finish that month.</p><p>On the design side, I plan to write about:</p><ul><li><p>The parallelism paradigms, one at a time, with a consistent lens: what physics forces it, what its communication actually does, where it breaks, what it composes with.</p></li><li><p>Composition: 3D, 4D, 5D parallelism as the consequence of mapping each axis to the right tier of the hierarchy.</p></li><li><p>Hardware shifts that matter: NVL72, optical NVLink, what changes when the fast domain expands by an order of magnitude.</p></li><li><p>Close readings of public artifacts: the Llama 3 paper, the OPT logbook, the DeepSeek-V3 report. There&#8217;s a lot in these that becomes visible only when you read them with the operational lens.</p></li></ul><p>On the operations side, I plan to write about:</p><ul><li><p>Cluster health: what hardware actually fails, what to watch for, what to ignore.</p></li><li><p>Observability at 10K-GPU scale: what to measure when your metrics pipeline is itself a distributed system.</p></li><li><p>Stragglers, SDC, NCCL hangs - the failure modes that don&#8217;t fit the &#8220;crash and restart&#8221; model.</p></li><li><p>Checkpointing and recovery as a discipline, not a feature.</p></li><li><p>The boring operational work that makes the difference between 25% and 45% MFU at scale.</p></li></ul><h3>How I&#8217;m going to run this</h3><p>One thing about how I&#8217;m publishing: I want the dialogue more than I want the byline. The frontier of this field moves fast, no one person sees all of it, and a lot of what I&#8217;ve learned has come from discussions in the office and Slack threads and pull request reviews. I&#8217;d rather have a corrected post than a perfect one.</p><p>So if you read something here that&#8217;s wrong, or missing context, or that contradicts your experience - please push back. In the comments, on X, in your own blog post that links here, whatever works. I&#8217;ll update posts when I&#8217;m corrected and credit the source. I&#8217;ll write follow-ups when readers raise things I hadn&#8217;t considered. The posts will be better for it, and I think the practice of openly-revisable technical writing is itself underappreciated in this corner of the field.</p><p>If the framing here resonates, the next post is on the five things you can actually shard in a training run, and why that&#8217;s the entire menu on the design side. Operations content starts a few posts after that, once we have shared vocabulary for the systems we&#8217;re operating.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.noise2signal.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.noise2signal.ai/subscribe?"><span>Subscribe now</span></a></p><h3></h3><h3></h3><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.noise2signal.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Noise2Signal! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item></channel></rss>