Serving Large Language Models
Understand the mechanism
Serving LLMs becomes useful when you can predict its behavior, measure it, and name its limits.
Before you start
Why this matters
Without looking anything up, sketch the path from input to output for Serving LLMs. Circle the step where state, computation, or trust changes. The sketch can be wrong; its purpose is to make your current model testable.
1Learn the idea
Read
Follow the mechanism
See it
Training
Inference
Training = long study · Inference = quick answer from what it already learned
Requests enter a queue, are tokenized, and are batched. Prefill processes prompt tokens in parallel; decode then generates one token per active sequence step while retaining a KV cache. Continuous batching inserts and removes sequences dynamically. Memory is consumed by weights, activations, and per-request KV state, so scheduling directly affects throughput and latency.
Trace causality rather than memorizing vocabulary. First identify the state that exists before the operation. Next identify the computation and anything it persists. Finally identify what reaches the caller and what remains uncertain. That separation prevents a common category error: treating a convenient interface as proof that the underlying system learned, retrieved, secured, or validated something.
Here is the compact calculation to anchor the mechanism: approximate weight memory for 7B parameters at 16 bits = 7B × 2 bytes ≈ 14 GB, before KV cache and runtime overhead. The equation is useful only with its assumptions. Ask which quantities were measured, which were estimated, and whether an average hides a tail or subgroup. If the mechanism cannot explain a surprising metric, inspect the boundary conditions before tuning randomly.
Read
Apply it to a concrete case
A service receives 20 short chats and one 32k-token prompt. Admission control places the long request in a separate queue so it cannot delay all chats; continuous batching keeps decode slots busy as short requests finish.
The worked number is approximate weight memory for 7B parameters at 16 bits = 7B × 2 bytes ≈ 14 GB, before KV cache and runtime overhead. State the unit and denominator whenever you report it. A percentage without a denominator can conceal a tiny sample; a latency without a percentile can conceal slow users; a similarity score without a labeled task can conceal irrelevant neighbors. Compare the observed value with a threshold chosen before seeing the final test result.
Now test the tempting shortcut. Suppose the team optimizes only the most visible metric. The result may look better while the system becomes less trustworthy. The reason is concrete: Larger batches improve GPU utilization and tokens per second but can worsen queueing and per-user latency. Quantization reduces memory and may increase throughput with possible quality loss. Longer contexts expand usefulness while sharply increasing KV memory and prefill work. This is why the decision record must include both the intended gain and the tolerated regression. If the tolerated regression is unknown, the change is not ready for a consequential workflow.
Read
Decision rules
- Prefer a measured baseline over a persuasive demo.
- Keep versions, inputs, and thresholds reproducible.
- Separate syntactic success from semantic correctness and authorization.
- Escalate or abstain when evidence falls outside the contract.
- Re-evaluate when data, traffic, models, providers, or user goals change.
These rules turn the topic into an engineering decision rather than a slogan. They also make disagreement productive: another person can challenge the assumptions, rerun the evaluation, and reach a documented conclusion.
Read
Inspect state, not just output
At each mechanism step, annotate three things: the shape or type of data entering, the state read or written, and the possible error returned. Then ask whether rerunning that step is deterministic, probabilistic, or dependent on external state. This exposes bugs hidden by a successful final response. A useful trace includes versions and units—for example, tokens rather than characters, milliseconds at a named percentile, or vectors produced by a named embedding version. When an intermediate value cannot be observed directly, record the proxy and explain why it is informative.