paper(§5): add roofline, capacity planning, parallelism selection subsections
Three new subsections at the top of §5, motivated by the deployment-sizing questions the analytical visualization tool exposes: - 5.1 Roofline Analysis — B*, L*, short vs long context batch effect (measured: 19× per-token cost reduction at short context, 28% at long) - 5.2 Capacity Planning — 3-axis sizing (weights / KV / SLO), SLO targets, regime rules, deployment templates, per-axis playbook - 5.3 Parallelism Selection — TP × CP × PP × DP × EP comparison, symptom-driven axis selection, add/stop criteria, misconceptions Restructure: - 05-gqa.tex trimmed to section header + intro - Existing 5.4-5.7 content (placement, short/long ctx, composite) moved to 05x-fused-kernel.tex - Summary extracted to 05z-summary.tex, cross-refs updated - main.tex \input order sets the requested subsection sequence - lmodern loaded to satisfy microtype font-expansion Two new figures generated from tests/analytical_visualization/chip_roofline: - roofline_short_context.png (S_kv=8K, batch wins) - roofline_long_context.png (S_kv=1M, batch stalls at KV floor) - Generator: tests/analytical_visualization/_gen_roofline_paper_figs.py 4 tables (regime rules, deployment templates, playbook, parallelism criteria) use table* so they span both columns without overflow. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
\subsection{Parallelism Selection: TP $\times$ CP $\times$ PP $\times$ DP $\times$ EP}
|
||||
\label{sec:parallelism-selection}
|
||||
|
||||
Given a capacity-feasible layout (\S\ref{sec:capacity-planning}), the
|
||||
remaining decision is \emph{how to shard}: which axes to enable and at
|
||||
what degrees. Memory is the feasibility filter; once you fit, the
|
||||
design problem is minimising \emph{exposed} communication (communication
|
||||
that could not be overlapped with compute). The core principle is to
|
||||
\textbf{rank techniques by how much they communicate per unit of
|
||||
compute, and assign the chattiest ones to the fastest links.}
|
||||
|
||||
\begin{table*}[h]
|
||||
\centering
|
||||
\small
|
||||
\caption{Parallelism axes at a glance. TP AllReduce volume does not
|
||||
shrink with degree — only compute does — which sets its practical
|
||||
ceiling near a fast-link (NVLink / intra-SIP) domain.}
|
||||
\label{tab:parallelism-compare}
|
||||
\begin{tabular}{@{}l l l l l@{}}
|
||||
\toprule
|
||||
Axis & Shards & Comm pattern & Frequency & Hard ceiling \\
|
||||
\midrule
|
||||
DP & optimizer state (w/ ZeRO) & AllReduce (grads) & 1$\times$/step & critical batch \\
|
||||
TP & weights + acts + KV heads & AllReduce & 2$\times$/layer & fast-link domain; $\lesssim h_{kv}$ \\
|
||||
PP & weights + KV by layer & P2P activation hand-off & per stage boundary & $n_{\text{layers}}$ \\
|
||||
CP & activations + KV by position & Ring P2P per hop & per layer (overlappable) & $\mathrm{seq\_len} / \mathrm{block}$ \\
|
||||
EP & expert weights (MoE only) & All-to-all & 2$\times$/MoE layer & $n_{\text{experts}}$ \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
\end{table*}
|
||||
|
||||
\paragraph{Symptom-driven axis selection.} The dominant problem dictates
|
||||
the first knob to try (Table~\ref{tab:parallelism-problem}).
|
||||
|
||||
\begin{table}[h]
|
||||
\centering
|
||||
\small
|
||||
\caption{Which axis to reach for first, by dominant problem.}
|
||||
\label{tab:parallelism-problem}
|
||||
\begin{tabular}{@{}l l@{}}
|
||||
\toprule
|
||||
Dominant problem & First axis \\
|
||||
\midrule
|
||||
Weight memory doesn't fit & TP within a fast domain \\
|
||||
KV of ONE long sequence & CP \\
|
||||
KV for MANY sequences & DP replicas \\
|
||||
Single-request TPOT & TP ($\lesssim 8$) \\
|
||||
Aggregate throughput & Outer DP \\
|
||||
Model spans multiple nodes & TP intra-node, PP inter-node \\
|
||||
MoE expert weight memory & EP \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
\end{table}
|
||||
|
||||
\paragraph{When to add, when to stop.} Every axis has a natural
|
||||
saturation point past which further degree hurts more than it helps
|
||||
(Table~\ref{tab:parallelism-criteria}). Sizing decisions are almost
|
||||
always constrained by two axes simultaneously (e.g.\ TP by NVLink
|
||||
domain and $h_{kv}$; CP by ring-hop hiding and per-rank block size).
|
||||
|
||||
\begin{table*}[t]
|
||||
\centering
|
||||
\small
|
||||
\caption{Add / stop criteria per axis.}
|
||||
\label{tab:parallelism-criteria}
|
||||
\begin{tabular}{@{}l l l@{}}
|
||||
\toprule
|
||||
Axis & Add when & Stop when \\
|
||||
\midrule
|
||||
DP & more independent requests & global batch $>$ critical \\
|
||||
TP & weights need sharding or TPOT tight & collectives dominate; local GEMMs shrink \\
|
||||
PP & depth too large; TP would cross slow links & bubble $>$ $\sim$10\% \\
|
||||
CP & one sequence needs position sharding & ring hops can't overlap compute \\
|
||||
EP & MoE expert memory & expert GEMMs too small; routing imbalance \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
\end{table*}
|
||||
|
||||
\paragraph{Common misconceptions.} Three widely repeated rules survive
|
||||
contact with real workloads only partially:
|
||||
\emph{(i)} memory is not just a feasibility filter but a continuous
|
||||
performance variable --- more free HBM enables larger $B$, more prefix
|
||||
cache, higher throughput even after weights fit;
|
||||
\emph{(ii)} the ``TP $\leq h_{kv}$'' ceiling is an efficiency
|
||||
preference, not a correctness constraint --- vLLM and others support
|
||||
KV-head replication and head-dim splitting for TP $>$ $h_{kv}$;
|
||||
\emph{(iii)} ``always start at TP=8'' is disproven by public
|
||||
disclosures (DeepSeek-V3 inference uses TP=4, some MLPs at TP=1;
|
||||
DeepSeek-V3 training uses PP=16 + EP=64 with no TP), which shows the
|
||||
right starting point is the smallest TP that fits memory and meets
|
||||
latency, followed by measurement.
|
||||
Reference in New Issue
Block a user