GPUscalegpuscale.net
Manual

The GPUscale manual

Everything the studio does, why it does it, and the arithmetic underneath. Read section 1 to get a fleet on screen in five minutes; read section 5 if you need to defend a number to somebody who signs the purchase order.

Studio 5.33Engine v27 Library v35101 models · 37 GPUs · 24 presets MIT licensedNothing leaves your browser

Quick start

GPUscale answers one question: what hardware does this LLM workload need, and will it keep the promises you made about latency? It is a single static page. There is no account, no backend and no upload; every number is computed in your browser from closed-form formulas you can audit in assets/app.js.

  1. Describe a use case, not a machine. Pick a workload preset (or type the numbers), pick a model, say how many people use it at peak. Leave the hardware alone for now.
  2. Pick one GPU for the project in Hardware & resilience, and how many of them sit in a node (8 for an HGX box, 72 for an NVL72 rack).
  3. Press Auto-size. The solver chooses tensor-parallel width, replica count and batch size, then packs the cards into nodes and applies your resilience pattern.
  4. Read the verdict bar, then the fleet map. If something is red or amber, the Recommendations at the bottom say what to change and, where possible, offer a button that changes it and re-solves.
  5. Add more use cases. Two cards on the same model and precision are served by one pooled deployment sized for their combined load, which is how real platforms are built.
The GPUscale studio: inputs on the left, results on the right, with numbered callouts
Figure 1. Inputs run down the left column, results down the right, and everything recomputes on every keystroke. 1 project bar and exports · 2 use cases · 3 workload · 4 model · 5 precision · 6 hardware and resilience · 7 verdict · 8 project fleet · 9 summary and sizing decision · 10 memory ledger · 11 key numbers · 12 SLO compliance. Click any figure to enlarge it.
Lower half of the studio: fleet map, charts, latency anatomy and recommendations
Figure 2. Below the fold: 13 the fleet map draws every node and every GPU with what it holds · 14 two charts showing how speed decays with load and with context · 15 where each request's seconds go · 16 recommendations, several of which carry a priced Apply button · 17 advanced tuning, back in the left column.
The example used throughout

Every screenshot in this manual is one project: a hospital group running four workloads on H200 141GB NVL nodes with one standby worker. You can open it yourself, edit it, and follow along. It is a readable link, so you can also read the project off the URL:

https://gpuscale.net/#p=t:name=Northwind+Health+AI+platform;gpu=H200+141GB+NVL;perw=8;
  resil=n1;uc=Clinical+knowledge+assistant;model=Llama+3.3+70B;quant=FP8;kv=FP8;
  preset=Clinical+knowledge;users=1500;uc=Document+intake;model=Qwen3+32B;quant=FP8;
  kv=FP8;preset=Document+Q&A;users=400;uc=Coding+agent;model=Qwen3+32B;quant=FP8;
  kv=FP8;preset=Code+agent;users=250;uc=Voice+triage;model=Qwen3+8B;quant=FP8;kv=FP8;
  preset=Voice+agent;users=300

(Joined onto one line, without the indentation. Section 12 explains the format.)

How the studio thinks

Three ideas explain almost every number on the page. If you understand these, the rest of the manual is reference material.

Three currencies, spent by two different phases

A GPU sells you three things, and an LLM request spends them in two distinct phases. Sizing goes wrong when people track only the third one.

What a GPU sells, and what each phase buys Compute · TFLOPS Matrix multiplies per second. Derated by MFU (~0.5 achieved). Bandwidth · TB/s Bytes read from HBM per second. Derated by MBU (~0.65 achieved). Capacity · GB VRAM that holds weights and KV. Not derated: it either fits or not. PREFILL · one pass Reads the whole prompt at once. Compute bound. Sets time to first token. TTFT = 2·tok·P_act / (TF·TP·MFU) DECODE · one token at a time Re-reads weights + KV every step. Bandwidth bound. Sets tok/s per user. tok/s = BW_eff / bytes-per-token RESIDENCY · the whole time Weights once per replica, KV per call. Capacity bound. Sets whether it fits. need ≤ replicas · TP · VRAM A fleet is sized by whichever of the three runs out first, and it is very often not capacity. A card can sit at 35% memory and still be completely full, because its bandwidth is already spoken for.

Diagram 1. The two phases have opposite bottlenecks, which is why one number never describes a deployment.

The most useful sentence in this manual

At the operating point, one card holds about bandwidth × interconnect × MBU ÷ achieved tok/s gigabytes of KV cache. Promise a faster stream and that number shrinks, so you buy more cards, each one emptier than the last. Empty-looking cards are usually a latency promise being kept, not waste.

One model call, never one task

Every workload field in the studio describes a single call to the model. This is the single most common way to get a sizing wrong by an order of magnitude.

If you meanDo not writeWrite instead
An agent that makes 40 tool calls to finish a task 40 × the tokens in one card One step's tokens, and let the traffic estimator turn tasks into simultaneous calls
A model with a 1M-token context window resident = 1048576 The tokens actually held per request, e.g. 8192
A 200,000-token browsing session visible out = 200000 One step: a 64K transcript in, a short tool call out

Resident sequence means the tokens the server is holding for that request right now: the system prompt, the retrieved passages, the conversation so far, the tool traces. Not the model's maximum context, which is a capability, not a workload.

Use cases become pools, pools own cards, nodes are bought whole

A project is a list of use cases. Two use cases that run the same model at the same weight and KV precision with the same KV policy are served by one deployment sized for their combined load, exactly as they would be in production. That merged deployment is called a pool.

From four use cases to a purchase order USE CASES · demand Clinical assistant Document intake Coding agent Voice triage POOLS · same model + precision Llama 3.3 70B FP8 Qwen3 32B FP8 two use cases, one deployment Qwen3 8B FP8 CARDS · what the solver buys TP4 × 1 = 4 GPUs TP16 × 4 = 64 GPUs TP2 × 1 = 2 GPUs NODES · bought whole 70 serving cards + 2 shared GPUs for supporting models = 9 nodes × 8 GPU (72 cards, 2 slots spare) Resilience: N+1 10 nodes · 80 GPUs one idle standby Pools own CARDS, not nodes. Rounding each pool up to a whole node bought GPUs nobody asked for: a pool needing two cards was handed eight. Cards from different pools share nodes, and only the fleet total is rounded up to whole nodes, once, at the end.

Diagram 2. The order of operations that turns demand into a bill of materials.

Three consequences worth remembering:

The interface, control by control

Inputs run down the left column in the order you should work: Use cases, then Workload, Model, Precision, then Hardware. Results on the right recompute on every keystroke. Nothing is ever "applied" or "submitted".

The project bar

The project bar: name, history, mode switch, import, export, XLS, share, PDF, theme
Figure 3. Left to right: project name (click to rename), new project, the history menu, the Normal/Advanced switch, then the export group and the theme toggle.
ControlWhat it does
Project nameFree text. Appears on the PDF, the workbook and the JSON export.
History (clock)Projects autosave to this browser's local storage as you type. The menu lists them, reloads one, deletes one, or starts a new project. Nothing is uploaded, and clearing site data clears them.
Normal / AdvancedNormal asks for people at peak and hides the tuning controls; Advanced exposes every field. See below.
ImportReads a configuration JSON, including files exported by older versions.
ExportWrites the whole project as JSON, with a snapshot of every model and GPU used so the file survives library changes.
XLSAn Excel workbook with live formulas, not pasted values, plus three native charts. See section 12.
ShareCopies a link with the entire project compressed inside the URL. No backend, nothing stored.
PDFOpens the print dialog against a print stylesheet that reflows the page into a report.

Use cases

The use cases station with four cards, one selected, showing pooled badges and support chips
Figure 4. Four use cases. The selected card is outlined; the others show a pooled badge when they share a deployment.

Each card is one workload with its own model, tokens, concurrency and SLO targets. The card shows its model, precision, derived concurrency, and chips for any supporting models attached to it.

  • + Add clones the current card as a starting point.
  • The copy and × icons duplicate and delete.
  • Click the name to rename it. The name is what appears in the fleet map, the charts and the report.
  • Support chips (Embeddings, Reranker, Guard, ASR, TTS, OCR) attach automatically from the preset. Click one to inspect or change the model behind it; click × to detach it.
  • A pooled badge means this card shares a deployment with another card. Hover it to see which.
  • Isolate (in the card menu) forces a card into its own pool even when it could share.

Workload

The workload station: preset, resident sequence, shared cached prefix, visible output, reasoning, users, concurrency, batch, KV policy, SLO targets
Figure 5. The workload station. Every field here describes one model call.

Start from a preset: 24 of them, each with SLO targets traced to published production guidance (section 11). A preset only prefills the fields; edit anything afterwards.

Each preset also suggests a model, marked suggested for this preset next to the model dropdown. It is a starting point of the right size class and modality for that workload, not a ranking, and every one is checked at build time against the preset's own first-token and speed targets so selecting a preset can never leave you looking at a configuration that is red on arrival. The moment you pick a model yourself the suggesting stops for that card, and later preset changes leave your choice alone.

FieldMeaningTypical
Resident sequenceTokens held per request: system prompt + retrieved context + history + tool traces. Not the model's context window.4K chat · 32K agent · 128K long-doc
Shared cached prefixThe share of that sequence which is byte-identical on every call, so a server with automatic prefix caching prefills it once and holds it once per replica. Leave at 0 unless you have measured it.agent loops 40-80% · RAG 10-30% · unique docs 0%
Visible outputTokens the user actually sees per response.60 inline completion · 350 chat · 2,000 document
Reasoning mode / tokensHidden thinking tokens per request. None, Light (2,000), Heavy (8,000) or an exact custom budget.256 is enough for 95% of GSM8K accuracy
Reasoning extends the KV cacheOn: thinking tokens are held in the cache alongside the prompt, so they cost memory and slow decode. Off: they are discarded as they are produced.on for most stacks
Active users at peakPeople using the feature in the busiest hour. Drives the concurrency estimator.
Concurrent LLM callsRequests in flight simultaneously. Typing here pins it and the user count is ignored for this card.usually 1-10% of active users
Max batch per replicaCeiling on how many requests one replica co-batches. Auto-size sets it; raising it trades per-user speed for throughput.solved
KV policyRunning batch frees KV between turns (vLLM-style admission). Pinned per session holds it for the whole session, which is far more expensive and only correct for live paths where an eviction would break the budget.running, except voice
SLO targetsTTFT in ms, per-user speed in tok/s, end-to-end P95 in seconds. 0 disables a check. tok/s is per user, never aggregate.see section 11

Conversation length: how long is the call?

The conversation length estimator: average call in minutes, tokens per minute, system and tools base, and a basis selector, with the derived resident tokens and an Apply button
Figure 5b. A twelve-minute call, and what it costs in resident tokens.

A conversation holds its own transcript, so the resident sequence grows with the length of the call. A two-minute IVR interaction and a twenty-minute contact-centre call are not the same workload, and sizing both at one fixed number is how a voice fleet arrives short.

It matters most when the KV policy is all active sessions stay in KV, which is the correct policy for a live voice path: every caller in flight holds their whole cache for the whole call, so call length multiplies straight into the memory bill.

The drawer opens by itself for a pinned-session workload and stays shut otherwise.

peak = base + rate × minutes tokens at hang-up mean = base + rate × minutes / 2 average call in flight
base is everything resident before anyone speaks: system prompt, persona, tool schemas, retrieved account context. rate is what the conversation adds per minute.
WorkloadTokens per minuteWhy
Voice through STT and TTS≈ 200The model sees a text transcript. Conversational speech runs about 150 words per minute across both speakers, and English is roughly 1.3 tokens per word.
Native speech-to-speech750 to 3,000Audio tokens, not text. Codec frame rates run 12.5 to 25 Hz per stream; whether both streams stay in context, and at what rate, is a property of the model. 750 assumes 12.5 Hz with one party speaking at a time.
Text chat≈ 200Typed turns are shorter but arrive less often, which lands in a similar place per minute of active session.
End of call, or average in flight?

Both are defensible and the studio shows both, always. End of call sizes every session at its longest. It is the conservative choice, and it is the only one that keeps a first-token promise on the last turn of a long call, so it is the default. Average in flight sizes at half that, which is the correct steady-state figure when call ages are spread evenly across the in-flight population, and it roughly halves the KV bill. Choose the second only if your call-length distribution really is smooth and you have headroom for a run of long calls.

Nothing here changes your sizing until you press Apply to resident sequence. Presets that describe a session (the two voice presets and contact-centre assist) prefill the drawer with the shape their own resident figure was built from, so 4,096 for the voice agent stops being an assertion and becomes a 3,100-token system prompt plus five minutes of conversation. Change the five and press Apply.

The concurrency estimator

Under Active users at peak the studio shows its working: how many simultaneous calls that headcount implies, and what share of your users that is. It is Little's law (section 5.11) over four traffic parameters the preset supplies. If your own telemetry says otherwise, type the concurrency directly; the card is then marked set manually and the user count stops driving it.

Model

The model station: a searchable list of 101 models plus a custom geometry option
Figure 6. 101 models, with the geometry that matters printed underneath.

The dropdown carries total and active parameters, hidden size, layers, KV heads, head dimension and maximum context for each entry, plus the architecture class and who published it.

Active parameters is what decides speed and first-token time. For a dense model it equals the total; for a mixture of experts it is much smaller, which is why a 671B MoE can decode faster than a 70B dense model while needing ten times the memory.

Custom model unlocks seven fields (params, active, hidden, layers, KV heads, head dim, context) for anything not in the library. Everything else in the studio works identically; exports carry the geometry so the file stays readable later. While it is on, the dropdown is replaced by a line naming the geometry actually in force, rather than greyed out still showing a library model that is not being used.

Effective KV

Models with grouped-query attention, multi-head latent attention or sliding-window layers are encoded so the engine lands on their true per-token cache cost rather than their nominal head count. The convention is documented in section 5.3 and in docs/DATA.md. It is the difference between a believable number and a fantasy for these architectures.

Precision

The precision station: weight quantization and KV cache quantization, with bytes per parameter shown
Figure 7. Two independent choices, with bytes per weight and per KV element.

Weights and KV cache are quantized separately, because they trade against different things. Weight precision sets the fixed cost per replica and the bytes re-read per decode step. KV precision sets the per-token cache cost, so it scales with concurrency and context.

19 weight formats from FP32 down to 2-bit GGUF K-quants, and five KV formats. FP8 KV halves the cache against BF16 with negligible quality impact and has become the production default; the studio says so in the recommendations when you leave a KV-dominated pool at BF16.

Hardware and resilience

The hardware station: GPU, GPUs per node, resilience model, auto-size memory target, the Auto-size button, workers and tensor parallel
Figure 8. One GPU type per project, then the topology the solver fills in.

GPU is a project-wide choice: 37 accelerators with dense (not sparsity) TFLOPS, real HBM bandwidth, VRAM and TDP. Mixing GPU types in one project is deliberately not modelled, because in practice a serving pool is homogeneous.

GPUs per node is your chassis: 8 for an HGX or MI300X box, 4 for many OEM servers, 72 for an NVL72 rack. It matters for two reasons: nodes are bought whole, and a tensor-parallel group wider than one node pays a cross-node interconnect penalty.

Resilience model chooses among 12 patterns, from bare N to N+N with disaster recovery (section 9).

Auto-size memory target is the fraction of VRAM the solver is allowed to plan into, 80% by default. The remainder absorbs fragmentation, CUDA graphs and the burst above your stated peak.

Below the button, Workers and Tensor parallel width show what the solver chose. You can override them by hand; the next Auto-size will overwrite your values, and so will opening a share link, because a shared link carries the workload and re-solves the hardware.

Tensor parallel is not replication

Tensor parallelism splits one copy of the model across TP GPUs. It is what makes a model fit that does not fit on one card, and it multiplies the bandwidth available to that copy, so it is often the cheapest way to hit a speed target. Replicas are additional independent copies; they add concurrency, never room for one copy. Doubling workers will never make a model fit.

TP4 × 2 replicas = 8 GPUs, two independent copies REPLICA 1 · one model copy, sharded four ways shard 1 shard 2 shard 3 shard 4 NCCL all-reduce every layer · 15 GB of buffers · needs NVLink inside the group REPLICA 2 · a second, complete copy shard 1 shard 2 shard 3 shard 4 Replicas never talk to each other, so they pay no communication overhead Wider TP gives one request 4× the bandwidth → 4× the decode ceiling 4× the FLOPS → first token in a quarter of the time More replicas give the fleet More requests in flight, each no faster Batch per replica falls toward 1, then stops helping

Diagram 3. Why the solver reaches for TP before replicas when a speed target is missed.

Advanced tuning

The advanced tuning station, collapsed
Figure 9. Collapsed by default. Four efficiency assumptions.
AssumptionDefaultWhat moves it
Prefill MFU0.50Model FLOPs utilization during prefill. Large batched prefills reach 0.5-0.6 on modern stacks; short prompts and small models do worse. Scales TTFT inversely.
Decode MBU0.65Memory bandwidth utilization during decode. 0.6-0.7 is realistic for a tuned server; the theoretical roofline is 1.0 and nobody reaches it. Scales tok/s directly.
Interconnect efficiency0.85The fraction of a tensor-parallel group's aggregate bandwidth you actually get after all-reduce. Inside an NVLink island 0.85 is fair. A group wider than one node is automatically capped at 0.70, and the studio tells you it did.
Framework overhead30 msScheduling, tokenization, HTTP, guardrail hops. Added to every request's latency, not to TTFT.

Normal and Advanced mode

Normal numbers the stations, asks for active users rather than concurrency, and hides the tuning controls and the manual topology fields. It is the right mode for a first pass and for handing the tool to somebody who is not a serving engineer. Advanced exposes everything. The switch is non-destructive: nothing is lost or reset, and the mode is remembered per browser.

The footer: project links, the downloadable skill, the URL format document and the studio version
Figure 10. The footer carries the version and engine numbers you should quote in a bug report, the portable single-file build, the downloadable AI skill and the link format document.
The studio in dark theme
Figure 11. Light and dark are equal-effort themes, including the charts, the fleet map and the printed report.

Reading the results

The right column answers, in order: does it fit, what does it cost, where does the memory go, how fast is it, does it keep the promises, what does the rack look like, how does it degrade, and what should you change.

The verdict bar

A green verdict bar reading Project fits and SLO targets met
Figure 12. Green: it fits and every enabled SLO target is met.
A red verdict bar reading Exceeds VRAM, explaining that each TP8 replica must hold a full 810 GB copy
Figure 13. Red: it does not fit, and the bar says why, in this case that more workers cannot help because each replica needs a complete copy.
ColourMeaning
GreenMemory fits inside the fleet and every enabled SLO target passes.
AmberMemory fits, but at least one latency or speed target is missed. The configuration is buildable; it will not keep a promise you made.
RedIt does not fit. The line underneath names the binding constraint and the levers that can move it.

Project fleet

The project fleet panel: one chip per pool and a card per use case with admitted calls, first token, speed, P95 and KV per call
Figure 14. One chip per pool along the top, then one card per use case with the figures that use case will actually see.

The pool chips carry the deployment shape: precision, tensor-parallel width, GPUs per replica, replica count and pooled concurrency. The per-use-case cards carry what that workload experiences: admitted versus offered calls, first token against its target, per-user speed against its target, P95 against its target, KV cost per call, and which supporting models are attached. Numbers that miss a target are red; numbers with no target are grey.

Summary and the sizing decision

The summary panel: demand per use case, deployments, resilience, and the auto-size sizing decision with per-pool reasoning
Figure 15. The summary is written to be pasted into a design document.

Three blocks:

Findings

Underneath, short factual observations that are not recommendations: which pools are KV-dominated, where the cache outweighs the weights, where a shorter context would pay off. They are the input to the recommendations further down, printed separately so you can see the reasoning.

Memory ledger

The memory ledger: one stacked bar per pool showing weights, KV, activations, overhead and headroom
Figure 16. Where every gigabyte goes, per pool, with the project total underneath.

Each bar is one pool, drawn to the same scale so pools are comparable. The four segments are weights, KV cache, activations and overhead; the pale remainder is headroom. Hover any segment for exact gigabytes and its share. The line underneath each bar breaks the same numbers out in text, including the sequence count the KV figure is for, so a screenshot of this panel is self-explanatory.

Supporting models are accounted separately, on their own shared GPUs, and shown on their own line.

Key numbers

Four KPI tiles: average first token, average per-user speed, aggregate throughput, average user latency
Figure 17. Four project-level tiles, demand-weighted across pools.
TileDefinitionCareful with
Avg first tokenConcurrency-weighted mean TTFT across pools.A project average hides a slow pool. The per-pool figures are in Summary.
Avg per-user speedConcurrency-weighted mean decode speed.Per user, not aggregate.
Aggregate throughputSum over pools of per-user speed × admitted calls.Only counts admitted requests; queued ones are listed beside it.
Avg user latencyMean end-to-end seconds per request, with the worst P95 beside it.Includes hidden reasoning tokens, which the user waits for but never sees.

SLO compliance

SLO compliance row: one badge per use case reading all targets met
Figure 18. Per use case, because a project average would hide the one that fails.

Each badge lists that use case's enabled targets and whether each passes. Disabled targets (0) are shown as off rather than as a pass, so an empty promise never reads as a kept one.

Deployment topology and fleet map

The fleet map: every node drawn as a grid of GPUs, coloured by what each card holds, with a legend and resilience economics
Figure 19. Every node, every GPU, and what is on it. This is the picture to put in the procurement request.

Each node is a box; each GPU inside it is a cell. Cells are coloured by the pool that owns them, with adjacent replicas of the same pool in alternating shades so you can count them. Inside a cell, the stack is drawn bottom-up: model weights, then KV cache, then working set, with the percentage of the card in use. Empty space above the stack is memory the speed target cannot spend.

Cell appearanceMeaning
Solid pool colourA dedicated card carrying one pool's replica (or a shard of it).
HatchedA shared GPU: MIG slices or fractional allocations carrying sliced model replicas and supporting models. The Shared GPUs line under the map itemises every slice.
Dashed outlineAn unused slot on the last node. Nodes are bought whole, so these are paid for and idle.
Amber dashedStandby or spare hardware from the resilience pattern: idle in normal operation.
Outlined nodeContains the currently selected use case's pool. A screen affordance only.
Four resilience tiles: guaranteed at peak, normal-day capacity, idle hardware, cost versus bare N
Figure 20. The economics of the pattern you chose: what survives a failure, what you get on a normal day, what stands idle, and the multiple over bare N.

Underneath the map, a text form of the same information is available for screen readers and for pasting into a ticket, listing every node and what sits on each GPU.

The two charts

Chart: per-user speed as admitted sequences grow, with target lines and shaded pass and fail zones
Figure 21. Speed per user as demand grows.
Chart: per-user speed against conversation length, with target lines and shaded zones
Figure 22. Speed per user against conversation length.

Both charts plot the decode equation from section 5.8 with one variable swept and everything else held at your configuration. One line per pool.

The first chart is the more important one: it is the shape of the batching trade. Adding requests to a replica raises total throughput and lowers every individual user's speed, because the KV that must be re-read each step grows with the batch.

Request latency anatomy

Stacked horizontal bars per use case: first token, framework overhead, reasoning tokens, visible output, with a P95 marker
Figure 23. Where the seconds go, per use case, with the P95 marker.

Four segments per use case: first token (prefill), framework overhead, hidden reasoning, and visible output. The reasoning segment is usually the surprise: a reasoning model with an 8,000-token budget spends most of the request producing tokens nobody reads, and that time counts against your P95 exactly like visible output does. The marker shows the P95 for that use case against its target.

Recommendations

The recommendations panel: several findings, some with priced Apply buttons
Figure 24. Ordered by what they would save, most valuable first.

Recommendations are graded: red is a defect in the configuration, amber is a risk or an over-provision, and plain is an explanation or an opportunity. Many carry buttons.

A recommendation about the speed target with two Apply buttons quoting the GPUs each would save
Figure 25. A priced Apply button. The number on the button is not an estimate: the studio re-solved the entire project with that change to produce it.
How to trust an Apply button

Every button quotes what it would buy back, and that figure comes from re-running the whole solver with the proposed change, not from a rule of thumb. Applying it changes every use case in scope, re-solves, and offers one Undo that restores the project exactly. The studio never silently changes a number you typed.

A recommendation itemising why the fleet is this size when the cards sit at 38 percent
Figure 26. When the cards look empty, this itemises the order: cards held by the speed and P95 promises, by the first-token targets, by the admission floor, by whole-node rounding and by the resilience pattern.

The full catalogue of recommendation types is in section 10.

The mathematics

The engine is about fifty lines of arithmetic between /*ENGINE-START*/ and /*ENGINE-END*/ in assets/app.js. There is no simulation, no fitted curve and no lookup table: every output is a closed form of the inputs, which is why the Excel export can reproduce it cell for cell and why you can check any figure by hand. This section is that arithmetic, in the order the engine evaluates it.

Notation

SymbolMeaningUnitSource
PTotal parametersbillionsmodel library
P_actActive parameters per token (= P for a dense model)billionsmodel library
L, H_kv, d_headLayers, KV heads, head dimensioncountmodel library
b_w, b_kvBytes per weight, bytes per KV elementbytesPrecision station
SResident sequence per requesttokensWorkload
RHidden reasoning tokens per requesttokensWorkload
OVisible output tokens per responsetokensWorkload
fShared cached prefix fraction0 to 0.95Workload
CConcurrent calls offered at peakcountWorkload
BMax batch per replicacountWorkload / solver
TPTensor-parallel widthGPUsHardware / solver
GGPUs in the poolcountHardware / solver
V, BW, FVRAM, HBM bandwidth, dense FP16 TFLOPS per GPUGB, TB/s, TFLOPSGPU library
η_mfu, η_mbu, η_icPrefill, decode and interconnect efficiencyfractionAdvanced tuning
t_ovhFramework overhead per requestmsAdvanced tuning

Weights

W = P × b_w GB per replica W_all = replicas × W GB across the pool
Parameters are counted in billions and bytes per weight in bytes, so the product is already gigabytes. Every replica holds a complete copy; tensor parallelism divides that copy across TP cards but does not shrink it. This is the reason more workers can never make a model fit.

Worked: 70B at FP8 is 70 × 1 = 70.0 GB per replica. At BF16 it is 140 GB, at NV FP4 it is 35 GB.

KV cache per token, and effective KV

Every token a request holds occupies a key and a value vector in every layer. The uniform-attention form is:

kv_tok = 2 × L × H_kv × d_head × b_kv / 1e9 GB per token
The 2 is key plus value. H_kv is KV heads, not attention heads: grouped-query attention shares one KV head across several query heads, and it is the KV count that occupies memory. This single distinction is worth an order of magnitude on a modern model.

Worked: Llama 3.3 70B has 80 layers, 8 KV heads and a head dimension of 128. At FP8, 2 × 80 × 8 × 128 × 1 = 163,840 bytes = 163.84 KB per token. A 8,192-token request therefore holds 1.34 GB of cache, and fifty of them hold 67 GB.

Architectures that do not fit the uniform form

Three families would be badly mis-sized by the formula above, so the library encodes them with an effective KV geometry chosen to make that same formula land on the true cost:

FamilyWhat is differentHow it is encoded
MLA
DeepSeek
Compresses key and value into one latent vector per token, so the cache is far smaller than the head count implies.H_kv = 1 with d_head = 288, which reproduces the 576-dimension latent through the standard 2 × … form.
Sliding window
Gemma, Ministral, Llama 4
Only a few layers attend to the full context; the rest hold a fixed window, so the per-token cost falls as the sequence grows.Explicit kvGlobal full-attention layers plus kvWin windowed ones, evaluated with the second form below.
SSM hybrids
Jamba, Nemotron-H
Mamba layers carry a constant-size state instead of a growing cache.kvLayers counts only the attention layers.
when kvGlobal > 0 and kvWin > 0: kv_tok = [ kvGlobal × k × H_g × d_g + (L_kv − kvGlobal) × 2 × H_kv × d_head × min(1, kvWin / S_eff) ] × b_kv / 1e9 k = 1 for key-only global layers, otherwise 2
The windowed term shrinks as the sequence grows because those layers never hold more than kvWin tokens no matter how long the conversation is. This is why a sliding-window model's memory curve flattens where a uniform model's keeps climbing, and why the second chart in the studio is worth looking at for these architectures.
Where the resident sequence comes from for a conversation

For a session workload the resident count is not a constant you guess: it is base + rate × minutes, and the studio derives it for you in the conversation-length drawer (section 3.4). Under a pinned KV policy that product is multiplied by every caller in flight, which makes call duration one of the largest single levers on a voice fleet's memory.

Prefix caching

Engine v27. If part of the sequence is byte-identical on every call, a server with automatic prefix caching computes it once and stores it once per replica rather than once per request.

cached = floor(S × clamp(f, 0, 0.95)) tokens, shared S_eff = S + R if reasoning extends the KV cache unique = max(0, S_eff − cached) tokens, per call prefill = max(0, S − cached) tokens actually prefilled kv_shared = cached × kv_tok GB, once per replica
Two separate consequences, and the model keeps them separate: prefill shrinks, so TTFT falls; and the shared blocks are stored once per replica instead of once per admitted request, so KV memory falls. Decode is deliberately not discounted and still divides by the full S_eff, because a request still attends over its whole context on every generated token unless the kernel batches shared pages, which not every stack does. Being optimistic about decode bandwidth would be the expensive kind of wrong.
The shared block is per replica, not per fleet

Each replica holds its own copy of the cached prefix, hence replicas × kv_shared in the total below. A pool with more replicas than concurrent calls therefore saves less, which is correct and occasionally surprising.

Activations, overhead, and the fit inequality

A = min(S_eff, 8192) × hidden × 12 × b_w / 1e9 GB per replica fixed = 5 GB, CUDA context + framework multi = replicas × (TP − 1) × m GB, NCCL buffers m = 15 GB per extra GPU in a group (1.4 for a MIG slice)
Activations are capped at an 8,192-token chunk because that is how long-context prefill is actually executed: in chunks, not as one enormous tensor. The NCCL term belongs to a communicator, and a communicator is one tensor-parallel replica; charging every extra GPU in the pool once billed 40 independent TP1 replicas 585 GB to communicate with nobody. That was engine v26's correction.
KV_total = admitted × unique × kv_tok + replicas × kv_shared need = W_all + KV_total + A_all + fixed + multi avail = replicas × TP × V FITS ⟺ need ≤ avail and the solver plans to a fraction of avail
One card's 141 GB, at the worked example's operating point 17.5 16.8 12.5 94.0 GB headroom the speed target cannot spend 141 GB weights 70 GB ÷ TP4 = 17.5 per card KV 67.1 GB ÷ 4 = 16.8 per card (50 calls) activations 0.8 ÷ 4 = 0.2 overhead 50 ÷ 4 = 12.5 The pool needs 187.9 GB of the 564 GB in four cards: 33% used. That is not waste. At 77 tok/s per user the group can only re-read about 137 GB per token, and 70 GB of that is already the weights. Filling the remaining VRAM with more concurrent requests would push the per-user speed below the 40 tok/s promise. The rule of thumb worth memorising KV a card can hold at speed ≈ BW × η_ic × η_mbu × 1000 / tok_s − P_act × b_w

Diagram 4. Why a fleet sized for latency looks empty, and why that is correct.

Prefill: time to first token

TTFT = 2 × prefill × P_act / (F × TP × η_mfu) ms
A forward pass over one token costs about 2 × P_act FLOPs (one multiply and one add per parameter), so a prompt of prefill tokens costs 2 × prefill × P_act. Parameters in billions over TFLOPS gives milliseconds directly. It scales with active parameters, so an MoE prefills at the speed of its active slice, and it divides by TP because every card in the group works on the same prompt.

Worked: 8,192 tokens of a 70B dense model at TP4 on an H200 (989 dense FP16 TFLOPS) at MFU 0.5:

TTFT = 2 × 8192 × 70 / (989 × 4 × 0.5)
     = 1,146,880 / 1,978
     = 580 ms

At a 50% shared prefix only 4,096 tokens are prefilled and the same expression gives 290 ms.

Decode: tokens per second per user

Generating one token requires reading every active weight and every cached key and value for every request in the batch. Decode is therefore bandwidth bound, and the studio's central equation is a division of available bytes per second by bytes needed per token.

BW_eff = BW × TP × η_ic × η_mbu × 1000 GB/s for the group admitted = min(C, B × replicas) or C when KV is pinned b_rep = max(1, admitted / replicas) batch actually running tok/s = BW_eff ──────────────────────────────── P_act × b_w + b_rep × S_eff × kv_tok agg = tok/s × admitted fleet throughput
The denominator is the whole story. The first term is the weights, paid once per step however many requests are batched, which is why batching raises aggregate throughput. The second term is the KV of every co-batched request, which is why batching lowers each individual user's speed. The trade between those two terms is the first chart in the studio.

Worked: BW_eff = 4.8 × 4 × 0.85 × 0.65 × 1000 = 10,608 GB/s, weights term 70 × 1 = 70 GB, KV term 50 × 8192 × 0.00016384 = 67.1 GB:

tok/s = 10,608 / (70 + 67.1) = 10,608 / 137.1 = 77.4 tok/s per user
agg   = 77.4 × 50           = 3,868 tok/s for the pool

Admission and queueing

replicas = floor(G / TP) admitted = C KV policy = pinned per session admitted = min(C, B × replicas) KV policy = running batch queued = C − admitted
Under a running batch the server admits what its batch slots allow and the rest wait, which is how vLLM and friends behave. Under a pinned policy every session holds its cache for the whole session, so all of them are resident whether or not they are generating: far more expensive, and the right model only for live paths where an eviction mid-conversation would break the latency budget. Queued requests are reported but their waiting time is not modelled, because queue delay depends on arrival distribution rather than on capacity.

End-to-end latency and P95

gen = R + O tokens the user waits for ITL = 1000 / tok_s ms between tokens latency = (TTFT + t_ovh) / 1000 + gen / tok_s seconds, mean P95 = 1.3 × latency
Hidden reasoning tokens are in gen: the user waits for every one of them and never sees any of them, which is why a reasoning model's P95 is dominated by a budget nobody reads. The 1.3 multiplier is a fixed convention, not a measured tail. A real deployment's ratio depends on arrival burstiness and scheduler fairness; validate it with GenAI-Perf or vLLM bench before committing to a P95 in a contract.
Which promise is actually buying the hardware

Invert the latency equation and a P95 target implies a per-user speed:

tok/s implied by a P95 target  =  gen / (P95 / 1.3 − (TTFT + t_ovh)/1000)

When that number exceeds your stated tok/s target, the speed target is not the lever at all: lowering it changes nothing and only the P95 can shrink the fleet. A 4-second P95 on a 1,000-token generation demands 343 tok/s whatever the tok/s field says. The studio detects this case explicitly and says so, because it once accounted for 89% of a reported project's cards while every suggestion the optimiser knew how to make was a lower tok/s target.

Concurrency from a headcount

Little's law: the number of requests in flight is the arrival rate times the time each one takes.

concurrent = ceil( users × turns × share × calls × dur / 3600 × burst )
turns is interactions per user per hour, share the fraction of interactions that reach the model, calls the model calls per interaction (an agent makes several), dur the seconds each call occupies a slot, and burst the peak-to-mean ratio inside the hour. Presets supply a traffic shape per workload class; the studio prints the derived number and the percentage of your users it represents so you can sanity-check it against your own telemetry.

Worked: 1,500 active users, 4 interactions/hour, 100% reaching the model, 1.5 calls each, 8 seconds per call, 2.5× burst gives 1500 × 4 × 1 × 1.5 × 8 / 3600 × 2.5 = 50 concurrent calls, 3.3% of the user base in flight.

A complete worked example

Every number below comes from the engine; you can reproduce all of them with a calculator.

InputValueInputValue
ModelLlama 3.3 70B InstructGPUH200 141GB NVL
Geometry80 L · 8 KV heads · 128 dimPer GPU141 GB · 4.8 TB/s · 989 TF
Weights / KVFP8 / FP8TopologyTP4 · 1 replica · 4 GPUs
Resident8,192 tokensConcurrency50 calls · batch 50
Visible out350 tokensEfficiencyMFU 0.5 · MBU 0.65 · IC 0.85
StepArithmeticResult
Weights70 × 170.00 GB
KV per token2 × 80 × 8 × 128 × 1 / 1e9163.84 KB
KV total50 × 8192 × 0.0001638467.11 GB
Activations8192 × 8192 × 12 × 1 / 1e90.81 GB
Overhead5 + 1 × (4−1) × 1550.00 GB
Total needed70 + 67.11 + 0.81 + 50187.91 GB
Available1 × 4 × 141564 GB → fits, 33%
Effective bandwidth4.8 × 4 × 0.85 × 0.65 × 100010,608 GB/s
Per-user speed10608 / (70 + 67.11)77.4 tok/s
Aggregate77.4 × 503,868 tok/s
First token2 × 8192 × 70 / (989 × 4 × 0.5)580 ms
Inter-token1000 / 77.412.9 ms
Mean latency(580 + 30)/1000 + 350/77.45.13 s
P951.3 × 5.136.67 s

Against the Clinical knowledge preset's targets of 800 ms, 40 tok/s and 50 s, all three pass with room to spare. (The example sets reasoning to zero rather than the preset's 1,000-token budget, purely to keep the arithmetic followable. Switch it on and gen becomes 1,350 tokens, and because those tokens also extend the KV cache the per-user speed falls to 73.0 tok/s, so the mean latency rises to 19.1 s and the P95 to 24.8 s: still inside the 50 s promise, but four times the number above.) Now set the shared cached prefix to 50%: the prefill halves to 4,096 tokens, TTFT falls to 290 ms, KV total falls to 34.2 GB because the shared half is held once instead of fifty times, and the per-user speed is unchanged at 77.4 tok/s, exactly as section 5.4 promises.

The auto-size solver

Auto-size answers: what is the cheapest topology that fits this pool and keeps every member's promises? It runs per pool, and it is deterministic: the same inputs always produce the same plan.

Auto-size, per pool 1 · Fitting width Smallest TP in 1,2,4,8,16,32,64,72 that holds one copy inside the memory target 2 · First-token widening Widen while any member misses its TTFT target, but only while widening still helps 3 · Candidate widths Plan the pool at that width and at every wider one; keep the cheapest that passes For each candidate width, plan(TP): a. Fewest replicas that admit the peak concurrency, then grow until the memory target is met b. Ask what one call gets ALONE at batch 1 on this width: a target that fails even there can never be met by more replicas, so it is reported as stuck instead of bought for c. For reachable targets, grow replicas using the closed form below until every member passes d. Give back any replica the plan does not need after the last growth step Closed-form replica count, instead of a search batch_per_replica = (BW_eff / target_tps − P_act × b_w) / (S_eff × kv_tok) 4 · Alternatives, then the cheapest plan wins A TP1 pool whose copy fits a hardware slice is also priced as MIG slices sharing physical GPUs, bin-packed against the supporting models. Whichever costs fewer real GPUs is the answer. Why widths, not just replicas Replicas push batch per replica toward 1 and asymptote. A wider TP raises the ceiling

Diagram 5. The solver in full. Step 3c is the important one: the replica count that hits a speed target is algebra, not a loop.

Invariants the solver is held to

These are enforced by a fuzz harness over thousands of random configurations, and each of them was added after a real defect:

InvariantWhat it prevents
No plan is beatable by a cheaper feasible planThe solver buying a wide TP when a narrow one with more replicas was cheaper and also passed. Currently 0 beatable out of 3,664 sampled plans.
A pool owns cards, never whole nodesA pool needing two cards being handed eight, because nodes are only rounded at the fleet level.
An unreachable target never suppresses a reachable oneA pool mixing an impossible P95 with an achievable speed target having the hardware that met the achievable one handed straight back.
Tensor parallelism is a speed lever, not only a fitting leverBuying replicas forever against a target that only bandwidth per replica could reach.
Demand is capped safelyTrimming a replica for cost when a member's P95 needed it.
Co-residency is latency-safePacking two pools onto a card whose duty cycle or first-token budget cannot absorb the neighbour.
When the solver cannot win

If a target is unreachable at any width and any batch size, the studio says so in the sizing decision and marks the pool stuck rather than buying hardware that will not help. The recommendations then propose what would make it reachable, priced.

Pooling, co-residency and MIG slicing

Three different mechanisms let one GPU carry more than one thing. They apply in this order.

Pooling · one deployment, several use cases

Two use cases with the same model, the same weight precision, the same KV precision and the same KV policy are one deployment. Their concurrency adds, the pool is solved once against the combined load, and each member is then checked against its own targets at the pool's shared batch size. Tick Isolate to prevent it.

Whole-GPU co-residency

Separate pools can share one physical card the way vLLM memory fractions or Triton multi-model do. The studio merges them only when every one of these holds, and it records which one refused:

GateTest
MemoryThe sum of the per-GPU footprints stays under the auto-size memory target.
Duty cycleThe combined decode bandwidth demand stays under 95% of one card. Two pools each wanting 60% of a card's bandwidth do not fit on it, whatever the memory says.
First tokenNeither tenant's TTFT headroom is consumed by sharing prefill compute with the other.
P95Both tenants still meet their P95 with the neighbour present.
A fleet map of four small pools co-resident on four GPUs, with the blockers listed
Figure 27. Four pools, one node. The map states how many GPUs co-residency saved and, underneath, exactly which pairing was refused and by which gate. A refusal is information, not a failure: it tells you what to change if you want the saving.

MIG slicing

A pool at TP1 whose copy fits a hardware partition can run one replica per slice and share physical GPUs with other models and with supporting services, the way Triton and vLLM deployments do on partitioned clusters. Only real slice geometries are offered, per GPU, and the per-slice speed is computed from that slice's own bandwidth and compute rather than the whole card's.

A fleet map showing two sliced pools and supporting models sharing physical GPUs, with a per-slice memory breakdown
Figure 28. Two model pools and two supporting models sharing physical cards as isolated MIG slices, with the memory each slice occupies itemised underneath.
Slicing is priced honestly, and often loses

Slices exist only whole, so a sliced plan is costed by first-fit-decreasing bin packing against the slices the supporting models already occupy, and the pool is charged only its marginal GPUs beyond those. The studio compares that against the dedicated plan and takes whichever is genuinely cheaper. Slicing frequently loses, and the sizing decision says why it was rejected for each pool: too large to fit a slice, no partitioning on this GPU, or simply more expensive.

Supporting models

A RAG copilot is not one model. It is a generator plus an embedder plus a reranker, probably a guard model, and for a voice path an ASR and a TTS. Those services are small, they are always on, and leaving them out of a capacity plan is how a fleet arrives 15% short.

Presets attach the right kinds automatically; the chips on each use-case card show what is attached and let you change the model or detach it. 54 supporting models are in the library across six kinds, from tiny CPU-viable encoders to flagship tiers, including Arabic-specialised ASR, TTS, OCR, embedding, reranking and guard models.

KindAttached bySizing note
EmbeddingsRAG, document and clinical presetsOne instance serves many queries; the cost is residency, not throughput.
RerankerRAG presetsCross-encoder, invoked per retrieved passage, so its instance count scales with retrieval depth.
ASRVoice presetsStreaming; its first-chunk latency is part of the voice budget the LLM target is carved out of.
TTSVoice presetsAs above, at the other end of the turn.
OCRDocument intakePage-rate driven rather than user driven.
GuardPublic-facing and clinical presetsUsually invoked twice per request, on the way in and on the way out.

Not in the library? Every chip's model dropdown ends with Custom (enter geometry), which asks for the only two numbers the sizing needs: gigabytes per running instance, and how many concurrent streams or queries one instance serves before another is needed. The fields are seeded from whatever was selected, so a house ASR starts from the nearest published model rather than from zero. A custom chip is drawn with a dashed border, and the geometry travels in the JSON export and in share links.

Supports are aggregated across the project by kind and model, so ten use cases that all want the same embedder do not buy ten embedders. They are then packed onto MIG slices, AMD partitions or fractional GPUs, and appear in the fleet map as shared cards and in the memory ledger on their own line. Their GPUs are counted once in the fleet total.

Resilience patterns

Capacity and survival are different purchases. The resilience model decides how much hardware you buy beyond the serving fleet and what that hardware guarantees during a failure.

PatternProcuredWhat it buys
nNCapacity only. A node failure removes its share of capacity.
n1N + 1One standby worker. One node can fail with no capacity loss. The common default.
n2N + 2Two standby workers: two concurrent failures, or one failure during planned maintenance.
nn2NIn-site mirror. Survives losing half the fleet.
dr2NFull standby site, active/passive. Survives losing a site.
drh1.5NHalf-size standby site: the second site runs degraded, which is often the honest trade.
aasNActive/active split: the same N spread across two sites, both serving. No extra hardware, and no spare capacity when a site is lost.
aas1N + 1The split above plus one spare shared across the two sites.
aassN + 2The split above with a spare in each site.
aa2NTwo live sites, each able to carry the whole load.
aan12N + 2Two live sites, each internally N+1.
nndr4NActive/active twin sites, each itself mirrored. The most expensive pattern the studio models.
Guaranteed versus normal-day capacity

The four tiles under the fleet map separate two numbers people routinely conflate. Guaranteed at peak is what remains after the failure you chose to cover. Normal-day capacity is what you get when nothing is broken. Active/active patterns raise the second without raising the first, which makes them look like better value than they are if you plan sustained load on the burst headroom. Idle standby hardware adds nothing to either number on a normal day: it buys survival, not speed.

Spare nodes are shared across pools where the hardware is uniform, because any spare can take over from any failed node. That is why a project with three pools and N+2 buys two spares, not six.

The SLO optimiser

Latency promises buy hardware. The optimiser's job is to show you the exchange rate and let you take the trade in one click, with an Undo.

at the operating point, one card holds about KV per card = BW × η_ic × η_mbu × 1000 / achieved_tok_s GB
Independent of tensor-parallel width, because both the bandwidth and the cards scale together. Promise 100 tok/s on an H200 and a card can hold roughly 26 GB of cache; promise 40 and it can hold 66. That ratio is the whole economics of a latency target.

What it proposes

RecommendationTriggerButton
The speed target is what this pool is really paying forA lower per-user speed target would shrink the fleetTwo levels: one that keeps every P95 promise exactly, one that relaxes P95 by at most half again. Both bounded by the workload class floor, so a live voice path is never asked to read at 19 tok/s.
The P95 promise is the binding oneThe P95 implies a higher speed than the tok/s field does, so lowering tok/s cannot helpA reachable P95, priced.
The first-token target is buying the TP widthTTFT widening chose a wider group than fitting neededNames the use case responsible and what a looser target would return.
A repeated prefix is being prefilled on every call8K+ resident tokens with no shared-prefix fraction set30% and 60%, each labelled with what it buys: GPUs off the order, or first-token headroom.
Why the fleet is this size when the cards sit at N%Fleet utilisation below 50%No button: an itemised account of the order by constraint class.
KV-dominated deploymentCache outweighs weightsKV cache to FP8.
Exceeds VRAMDoes not fitWeights to FP8, a wider tensor-parallel group, or a batch cap.
No redundancy configuredResilience is bare NN+1.
Interconnect efficiency is costing N cardsIC set below the defaultReset to 0.85 and re-solve.
TP crosses nodes (penalty modeled)A group is wider than one nodeNo button: states that IC was capped at 0.70 and what it cost.

The rules it plays by

Workload presets and the evidence behind them

The 24 presets are not opinions. Each one's SLO targets, context length and token budgets trace to published production guidance or a benchmark standard, and the trace is recorded in docs/PRACTICES.md along with a July 2026 review of every one of them.

ClassTTFTPer tokenAs tok/s
Interactive chat300 ms p9950 ms ITL20
RAG-augmented chat400 ms p9980 ms ITL12.5
Voice agent150 ms p9930 ms ITL33
Code completion, inline100 ms p9925 ms ITL40
Code completion, panel300 ms p9950 ms ITL20
Reasoning, interactive1.5-2.0 s p9915 ms TPOT67
Reasoning, server2.0-3.0 s p9980 ms TPOT12.5
Frontier dense, server6 s p99175 ms TPOT5.7
Batch / async3,000 ms200 ms ITL5

Two rules govern every preset, and tools/check_presets.py enforces the first mechanically on every release:

  1. Self-consistency. p95Target ≥ 1.3 × (ttftTarget/1000 + (reasonTok + visibleOut) / tpsTarget). A preset may never demand a P95 its own first-token and speed targets make arithmetically impossible.
  2. Per request, not per task. Every field describes one model call.
Changing a preset moves every project that uses it

Presets are referenced by name, so adding one is safe and editing one is not. If you maintain a fork, cite the source in PRACTICES.md and run the checker. Corrected targets only reach an existing card when its preset is re-selected.

Exports, share links and AI assistants

JSON

Schema gpuscale.net/5. Carries every use case, the project-wide hardware, and a full geometry snapshot of every model and GPU used, so the file still opens correctly after a library entry is renamed or removed: the studio rebuilds a missing model as a custom one and tells you it did. Older v3 and v4 single-scenario files import as a one-use-case project.

Excel workbook

Five sheets, and the important thing about it is that the Results sheet contains formulas, not values. Change a cell on the Inputs sheet and the whole model recalculates in Excel, mirroring the engine cell for cell.

SheetContents
ReportA formatted one-page brief: verdict banner, demand per use case, deployments, key numbers, the memory ledger, three native Excel charts, and a drawn fleet map.
InputsEvery input as a named, editable cell, including the shared cached prefix.
ResultsThe full engine as live formulas: kvTok, cachedTok, uniqueSeq, kvShared, kvTotal, ttft, tps, memory terms and the SLO checks.
DataThe series behind the charts.
ProjectPer use case and per pool detail, plus the node map.

PDF report

Page one of the printed report: cover, project summary line, an inputs table for all use cases, and the verdict
Figure 29. The PDF is the page reflowed by a print stylesheet, not a separate renderer, so it can never disagree with what you saw on screen.

It adds two things the screen does not show: a printed inputs table covering every use case, and a Reading of this configuration narrative that states the assumptions in prose for a reader who was not in the room.

Share links

Three payload forms, all carrying the project inside the URL fragment. Nothing is uploaded and no short-link service is involved unless you self-host the optional worker.

FormPayloadWho writes it
#p=z:deflate-raw + base64url of the project JSONThe Share button. Compact.
#p=j:base64url of the project JSONFallback where CompressionStream is unavailable.
#p=t:plain readable key=value pairsAnyone, including a chat model with no tools.

Opening a link imports it as a new local project, never overwriting existing work, saves it, and clears the address bar so a refresh keeps your edits rather than the sender's snapshot.

Getting a link from ChatGPT, Gemini or Claude

The readable form exists because no chat model can deflate or reliably base64 a kilobyte of JSON, so without it an assistant could only give you arithmetic you cannot check. With it, an assistant can answer a sizing question with a link that opens a fully solved fleet:

https://gpuscale.net/#p=t:gpu=H200+141GB+NVL;perw=8;resil=n1;uc=Support+chat;
model=Llama+3.3+70B;quant=FP8;preset=Simple+RAG;users=2000

Pairs separated by ;, every uc= starts a use case, spaces written +. It carries the workload only; the studio solves the hardware. The complete key table, worked examples, encoding recipes and the rules that keep a generated link honest are in docs/URL-FORMAT.md. Point your assistant at that file, or at llms.txt, and it can build links unaided.

In the page, GPUscale.textShare() prints the readable link for whatever is on screen, which is the fastest way to learn the format. For agents with a shell, the downloadable gpuscale-link.skill in the footer validates every name, clamps every field and round-trips the link before printing it.

Libraries, and extending them

Everything the studio knows lives in five one-entry-per-line files under data/. There is no build step: edit a line, reload the page.

FileEntriesNotes
models.js101Dense, MoE, MLA, SSM hybrids, sliding-window, VLMs, and a deep Arabic and GCC sovereign set. Undisclosed internals are flagged est. cfg.
gpus.js37Dense (not sparsity) TFLOPS, real HBM bandwidth, VRAM, TDP and partitioning profiles.
quants.js19 + 5Weight formats and KV formats, in bytes per element.
usecases.js24Workload presets with their traffic shapes.
support.js54Supporting models across six kinds.

Adding a model is one line:

{"name":"MyModel 34B","params":34.0,"active":34.0,"hidden":7168,"layers":60,
 "kvHeads":8,"headDim":128,"ctx":131072, ...}

Use the effective-KV convention from section 5.3 for MoE, MLA and hybrid attention. docs/DATA.md has the complete schemas and worked examples for each family. The generated artifacts (the portable single-file build and both skills) are rebuilt by three scripts under tools/ so they cannot drift from the live engine.

Accuracy, limits and validation

What these numbers are

Peak closed-form estimates. They land within roughly 10 to 30% of benchmarked behaviour when the efficiency assumptions match your stack, and production fleets typically achieve 70 to 90% of peak. Scope with this tool; verify with a benchmark; sign with margin.

Deliberately not modelled

Not modelledWhy, and what to do
Queue waiting timeDepends on arrival distribution, not capacity. Queued requests are reported; their delay is not.
A measured P95 tailThe 1.3× multiplier is a convention. Measure yours with GenAI-Perf.
Speculative decodingWorth 1.3-2× on decode when draft acceptance is high, but acceptance falls as batch grows, so the multiplier is largest exactly when the fleet is least loaded. It belongs in the margin column, never in the guaranteed one.
Decode benefit from shared-prefix kernelsCascade attention can read a shared block once per batch. Not every stack does; the studio stays conservative. See 5.4.
Prefill/decode disaggregationSplitting the phases onto different hardware changes the shape of the problem; the studio sizes a homogeneous pool.
Mixed GPU types in one projectA serving pool is homogeneous in practice.
Cooling, networking, storage, power distributionThe kW figure is GPU TDP only. Facility overhead is typically another 30-50%.

How the engine itself is verified

Every release runs the same battery before it ships, and the numbers are recorded in the changelog:

Privacy, offline use and troubleshooting

Glossary

TermMeaning
Active parametersParameters touched per token. Equals total for a dense model; much smaller for an MoE. Drives speed and TTFT.
AdmittedRequests actually in flight, as opposed to offered. min(concurrency, batch × replicas) under a running batch.
CardOne GPU. Pools own cards; nodes are bought whole.
Effective KVAn encoded geometry that makes the standard KV formula land on an unusual architecture's true per-token cost.
ITL / TPOTInter-token latency, time per output token. The reciprocal of per-user tok/s.
MBUMemory bandwidth utilization: the fraction of theoretical HBM bandwidth a real decode loop achieves.
MFUModel FLOPs utilization: the same idea for prefill compute.
MIGMulti-Instance GPU: hardware partitioning of one card into isolated slices with their own memory and bandwidth.
PoolOne deployment serving every use case that shares its model, precisions and KV policy.
Prefill / decodeThe compute-bound pass over the prompt, and the bandwidth-bound one-token-at-a-time generation that follows.
ReplicaOne complete copy of the model. Adds concurrency, never room for one copy.
Resident sequenceTokens held per request right now. Not the context window.
Shared cached prefixThe part of a request that is byte-identical every call, prefilled once and held once per replica.
Tensor parallel (TP)One model copy split across TP GPUs, which multiplies bandwidth and compute for that copy.
TTFTTime to first token: how long the user stares at nothing.

Where to go next

docs/DATA.md

Data schemas, the effective-KV convention, card stamps, co-residency gates and the engine version history.

docs/PRACTICES.md

The published evidence behind every workload preset, and the 2026 review of all of them.

docs/URL-FORMAT.md

How to build a configuration link, for AI assistants and for scripts.

Changelog

Every release with its reasoning, its corrections and its verification numbers.

Source

MIT licensed. The engine is fifty lines you can read in five minutes.

The studio

Back to work.

GPUscale manual · studio 5.33 · engine v27 · library v34. Written against the code, with every figure captured from the running application and every formula checked against the engine. © 2026 GPUscale.net, MIT licensed.