Step by step
The pipeline's eight stages
For each stage: what happens (simply), what each component does on each machine, who has the advantage and why, and a weak spot.
Read this first: this is not a race
Below you will see times like two seconds on the 5090 and far longer on the big machines. Do not read that as a ranking. Each machine runs a completely different model, sized to the memory it has, so they are never doing the same job.
RTX 5090 · 32 GBRuns a small, fast model (gpt-oss 20B). Brilliant for quick code edits, autocomplete and simple chat, but limited in what it can hold.
Mac M3 Ultra · 96 GBRuns a large MoE (gpt-oss 120B) that the 5090 cannot fit into its VRAM at all.
M5 Ultra · rumouredExpected to hold a larger model again, 200B and up, in the same unified-memory style.
Asus GB300 · 748 GBRuns a frontier 671B and up model, a different category of capability entirely.
So "the 5090 is faster" does not mean "the 5090 is better." It is faster because its model is tiny. The big machines spend more time per step because they run models that are vastly more capable. This guide is about what each tier lets you do, and how the work flows through it, not about who wins a benchmark, because no benchmark here would be fair.
01
Loading the model into memory
Cold load, once, before inference starts
I/O-bound
The model file on disk is moved into the memory where the GPU will do its maths. Think of the "Loading..." screen when a game opens: it happens once at the very start and then never repeats. The bigger the file and the slower the disk, the longer it takes.
RTX 5090
Runs gpt-oss 20B · ~17 GB
- Disk (T705): reads the 17 GB .gguf file
- CPU: mmaps the file, manages the load
- PCIe 5.0: copies the weights from RAM to VRAM
- VRAM: the final stop, 17 of the 32 GB fill
Time~2-5 s
Mac M3 Ultra
Runs gpt-oss 120B · ~63 GB
- SSD: reads the 63 GB file (~4x larger)
- CPU: mmaps it, manages the load
- Unified memory: the weights land directly, no PCIe copy
- 63 of the 96 GB fill
Time~10-15 s
M5 Ultra
Runs a 200B+ MoE · rumoured
- Unified memory, the M3 path: weights land directly, no PCIe copy
- a larger pool holds a bigger model than the M3 fits
- the file is larger again, so the read is longer
Time~15-30 s (est.)
Asus GB300
Runs a 671B+ frontier model
- NVMe into the 748 GB coherent pool (HBM3e + LPDDR5X) over NVLink-C2C
- a frontier model is hundreds of GB, so this is the longest cold load
- done once, then it never repeats
Time~30-90 s (est.)
What this meansCold load rewards small files and fast disks, so the lighter the model, the quicker the start. Read that as convenience, not capability. The machines that take longer are loading far larger, far more capable models, and a two second start on a 17 GB model is simply not the same job as a one minute start on a 671 GB one.
02
Turning text into tokens
Tokenize, text to numbers
Trivial
Your prompt and code are split into small pieces called tokens and turned into numbers. The model sees numbers, not letters: "Hello world" becomes [15043, 8222], roughly. Pure bookkeeping, done in under a millisecond.
RTX 5090
- CPU: runs the tokenizer (BPE), produces the token-ID list
- GPU: sits idle
Mac M3 Ultra
- CPU (P-cores): does the same
- GPU: sits idle
What this meansTokenizing is a sub-millisecond job on the CPU. It is identical on all four machines and is never the bottleneck.
03
Processing the prompt
Prefill, reading and understanding the context
Compute-bound
Every prompt token passes through every layer of the model at once, in parallel. This is where the model reads and understands the context you gave it. Feed in a big codebase and this is exactly why the first reply is delayed (TTFT). The stage is dominated by matrix multiply, so it is compute-bound: the limit is raw processing power.
RTX 5090
Runs gpt-oss 20B · ~17 GB
- Tensor cores: do the heavy GEMMs (attention + FFN), very high throughput, the real power sits here
- CUDA cores: activations, softmax, RoPE, layernorm
- VRAM: feeds the weights to the cores, holds the activations
ResultFast TTFT
Mac M3 Ultra
Runs gpt-oss 120B · ~63 GB
- GPU cores: do the same multiplies, but without tensor-core density, so lower raw FLOPS
- Unified memory: feeds the weights
- MoE: across many tokens, many experts get touched
ResultSlow TTFT
M5 Ultra
Runs a 200B+ MoE · rumoured
- Apple GPU cores, expected denser than the M3, still not discrete tensor-core class
- a larger, smarter model means more work to digest
- unified memory feeds the weights
Resultmoderate (est.)
Asus GB300
Runs a 671B+ frontier model
- Blackwell Ultra GPU with tensor cores, the 5090's class but far more of it
- up to 20 PFLOPS FP4 of raw throughput on tap
- the model and context are frontier-scale, so there is vastly more to chew
Resultfast for its size (est.)
What this meansRaw compute decides how quickly a prompt is digested, and the discrete tensor cores in the 5090 and the Asus lead here. But each machine is digesting a different prompt into a different model, so this measures how each tier copes with its own work, not a shared race.
04
Holding the context in memory
KV cache, so the past is not recomputed
Capacity + bandwidth
For every token, attention's Key and Value values are stored so later tokens do not recompute the whole history. As the context grows, this cache grows with it, like a long notebook: the more you write, the more room it takes. The problem is capacity, because this cache shares memory with the model weights.
RTX 5090
Runs gpt-oss 20B · ~17 GB
- VRAM: the KV cache lives here, sharing the same 32 GB as the 17 GB of weights, so about ~15 GB is free
- A very long context can still pressure it, but the headroom is now roughly double that of a 24 GB card
Mac M3 Ultra
Runs gpt-oss 120B · ~63 GB
- Unified memory: the KV cache is here too, in the 96 GB pool
- With the model taking ~63 GB, around 25 to 30 GB is left for context, far more than the 5090, though not the old 512 GB luxury
M5 Ultra
Runs a 200B+ MoE · rumoured
- a larger unified pool again (expected), so even more context headroom
- the M3 idea with more of it, long histories stay comfortable
Asus GB300
Runs a 671B+ frontier model
- 748 GB coherent (HBM3e + LPDDR5X): context is effectively a non-issue
- book-length histories fit, the cache and the weights share this vast pool
What this meansThis is the stage where memory size becomes capability. More memory does not make a machine faster, it makes a bigger model and a longer context possible at all. The 5090 is quick but cramped, while the big-memory machines trade a little speed for room a desktop card simply does not have.
05
Producing one token
Decode (1 token), the stage that actually decides
Bandwidth-bound
Once the prompt is processed, the next token is produced. For a single token, one pass through all the layers happens, and the weights it needs must be read from memory. The compute is tiny (one token), so the limit is how fast you can read memory. That is why it is bandwidth-bound, and why this is the stage that sets tokens per second.
RTX 5090
Runs gpt-oss 20B · ~17 GB
- VRAM bandwidth (~1.79 TB/s): for this one token it reads the ~17 GB of weights, that is the per-token cost
- Tensor cores: a width-one multiply, barely used, they wait on memory
- CUDA cores: prepare the sampling
Speed~70-90 tok/s
Mac M3 Ultra
Runs gpt-oss 120B · ~63 GB
- Unified memory bw (819 GB/s): reads only the active experts (~5B, roughly 3 GB), not all 63 GB, the MoE trick
- GPU cores: a width-one multiply, memory-bound
- ~5B active params means very little to read, so decode is surprisingly quick
Speed~50-70 tok/s
M5 Ultra
Runs a 200B+ MoE · rumoured
- Unified-memory bandwidth, expected above the M3's 819 GB/s
- an MoE reads only its active experts per token, so decode stays quick
- the bigger model is smarter, not heavier per token
Speedbrisk (est.)
Asus GB300
Runs a 671B+ frontier model
- Tiered memory: hot weights and KV in HBM3e at 7.1 TB/s, the rest in LPDDR5X at 396 GB/s
- a frontier MoE streams its active experts from the fast tier
- raw bandwidth dwarfs a desktop card, but the model is far larger
Speedfast at 671B (est.)
What this meansDecode speed depends on the model and the memory feeding it, so these numbers do not compare across machines. A 17 GB model on a desktop card and a 671 GB model on a coherent pool are different workloads, and being fast on a tiny model is not the same as being capable on a huge one.
06
Choosing the next token
Sampling, picking from the logits
Trivial
The model produces probabilities (logits) across the whole vocabulary, and one is chosen, with settings like temperature and top-p steering the pick. The "roll the dice for the next word" stage, done in under a millisecond.
RTX 5090
- CUDA cores: compute softmax over the logits
- CPU/GPU: apply the sampling strategy
Mac M3 Ultra
- GPU cores / CPU: do the same
What this meansSampling is sub-millisecond on every machine. No tier has an edge here, and it never moves the total time.
07
The generation loop
Decode loop, 99 percent of the time
Bandwidth (continuous)
Steps 5 and 6 repeat for every output token: a new token is added, fed back, the next is produced, and the KV cache grows by one each step. Almost all of the total wait happens here. The longer the answer, the more the loop turns.
RTX 5090
Runs gpt-oss 20B · ~17 GB
- Each token is the same VRAM read; steady speed until the KV cache fills the VRAM
- An 800-token code reply
≈ Time~9-12 s
Mac M3 Ultra
Runs gpt-oss 120B · ~63 GB
- Each token is the same unified-memory read; steady speed
- 800 tokens, and it is running a 120B model the 5090 cannot fit in VRAM at all
≈ Time~12-16 s
M5 Ultra
Runs a 200B+ MoE · rumoured
- each token is the same unified-memory read, steady
- it sustains a 200B+ model the 5090 cannot load at all
Timesteady (est.)
Asus GB300
Runs a 671B+ frontier model
- each token streams active experts from HBM3e, steady at frontier scale
- it runs a 671B model end to end, a different category of work
Timesteady at 671B (est.)
What this meansThe loop is where almost all of the waiting lives, and every machine runs it on its own model. The question is not whose loop is quicker, it is that more memory is what lets a bigger, more capable model run the loop at all.
08
Turning tokens back into text and streaming
Detokenize + stream, numbers to screen
Trivial
Each token ID produced is turned back into text and streamed to your editor or screen as it is generated. The words appearing one by one in ChatGPT is the visible form of this step. The CPU handles it in parallel while the GPU keeps producing in the background.
RTX 5090
- CPU: turns IDs into text, streams to screen while the GPU produces
What this meansTurning tokens back into text and streaming them is a light CPU job, identical on every machine. It is the visible part of generation, never the slow part.