Version 1.0 is a stronger promise, not a transferable verdict
llm-d 1.0 arrived on October 20, 2026 with a serious claim: the Kubernetes-native distributed inference stack is ready for day-two operation. IBM describes stable APIs, competing service priorities, zero-downtime operation, and sustained efficiency under changing demand. Red Hat frames the release as a hardened core for production scale. The official repository had roughly 4,900 stars during the October 22 focused scan.
Those facts make llm-d worth evaluating. They do not make a deployment safe by declaration. The focused social scan found little exact independent operating evidence: one current release discussion, one project repository result, and mostly adjacent self-hosting conversations. Even the project's own hardware guide says some variants rely on manual verification and that active CI coverage for every hardware guide is a future goal. A stable API and a complete acceptance test answer different questions.
llm-d sits above model servers such as vLLM and SGLang. It coordinates cache-aware routing, KV-cache movement, prefill/decode disaggregation, batch work, expert parallelism, and autoscaling across Kubernetes resources. The production result therefore depends on a graph, not one binary. Change the model, tokenizer, engine, chart, router, cache connector, accelerator, driver, network, sequence distribution, or concurrency pattern and the observed system can change.
Treat “ready for day two” as a testable hypothesis. Production readiness belongs to the pinned serving graph under your traffic and failure conditions.
The practical consequence is constructive, not cynical. Version 1.0 should reduce interface churn and make evidence easier to compare across releases. It gives a team a better foundation for a release contract: name every component, replay the work that matters, make contention visible, break the graph deliberately, and prove the old graph can take traffic back.
Pin the entire inference graph before measuring it
A request can enter through a Kubernetes Gateway, pass an inference-aware router, land on an engine process, reuse or miss prefix state, trigger prefill on one worker group, transfer state, decode on another, emit telemetry, and interact with an autoscaler. Each boundary has its own version and failure semantics. Testing “llm-d 1.0” without recording that graph creates a result nobody can reproduce.
client workload
|
v
Gateway API / authentication / admission
|
v
llm-d router -> priority + locality + capacity decision
| |
| cache hit | cache miss
v v
decode worker prefill workers -> KV transfer -> decode
| |
+-------- telemetry, autoscaling, failure state --------+
|
acceptance ledgerCreate an immutable release receipt before running the first benchmark. Include the model and tokenizer digest, quantization, inference engine and arguments, llm-d component and Helm chart versions, container digests, Kubernetes version, Gateway API and inference CRDs, accelerator type and count, driver and runtime, node topology, network, storage, cache policy, routing policy, autoscaling limits, observability profile, and corpus digest.
{
"release": "inference-2026-10-22.1",
"model": "sha256:MODEL_DIGEST",
"tokenizer": "sha256:TOKENIZER_DIGEST",
"engine": {"name":"vllm","version":"PINNED","image":"sha256:..."},
"llm_d": {"release":"v1.0.0","charts":"sha256:..."},
"cluster": {"kubernetes":"PINNED","gateway_api":"PINNED"},
"accelerator": {"type":"B200","driver":"PINNED","runtime":"PINNED"},
"policies": {"routing":"sha256:...","cache":"sha256:...","qos":"sha256:..."},
"corpus": "sha256:WORKLOAD_SET",
"rollback": "inference-2026-09-29.4"
}Use immutable container digests, not floating tags. The llm-d project documents a production registry path and signed release images, which is useful supply-chain evidence. Verify signatures and issuer policy in CI, produce an SBOM for the promoted graph, and reject an image whose digest is not listed in the receipt. A signed image proves origin and integrity; it does not prove that the image belongs in your tested combination.
Record support level honestly. A “well-lit path” with release verification is stronger than an example that depends on a volunteer-maintained hardware guide. A component listed as experimental, deprecated, untested, or manually verified should remain labeled that way in the release packet. Do not let a stable umbrella version erase component-level uncertainty.
Replay the workload shape, not a convenient token generator
Distributed serving optimizations respond to traffic shape. Prefix-aware routing needs repeated prefixes. Disaggregation helps when prefill and decode pressure can be balanced across resources. Batching benefits from compatible arrivals. Autoscaling reacts to lagging signals. A benchmark with fixed prompt lengths and uniform arrival rate may prove almost nothing about an agent workload that alternates large context, short tool calls, cacheable system prompts, bursty retries, and long idle gaps.
Build a trace-derived corpus with privacy review. Preserve prompt-token and output-token distributions, concurrency, inter-arrival times, shared-prefix groups, model and adapter mix, streaming, deadlines, cancellation, priority, and tool-loop cadence. Replace content when necessary, but do not flatten the features that drive routing and cache behavior. Mark which records represent interactive users, background agents, batch jobs, evaluations, and incident spikes.
| Workload lane | Property to preserve | Primary acceptance signal | Common trap |
|---|
| Interactive chat | Short deadline, streaming, mixed context | p95 TTFT and inter-token latency | Reporting only aggregate throughput |
| Coding agent | Repeated repo prefix, bursty tool loop | Deadline attainment and cache locality | Ignoring retries after tools |
| Background agent | Large bursts, lower priority | Throughput without interactive starvation | Letting batch work seize all decode slots |
| Batch evaluation | Many independent prompts | Completion rate and cost per accepted result | Comparing against online SLOs |
| Long-context analysis | Heavy prefill and cancellation | Prefill queue and wasted work | Measuring only completed requests |
Use a baseline that answers a real decision. Compare the candidate graph with the current production graph under the same corpus, or compare llm-d's optimized path with a documented round-robin or engine-only configuration. Keep model quality, sampling, tokenizer, and output limits stable. When a result changes, identify whether it came from routing, cache, disaggregation, batching, engine upgrade, or hardware.
Measure more than tokens per second: request success, schema correctness, time to first token, inter-token latency, end-to-end latency, deadline miss rate, throughput, queue time, cache hit and eviction, prefill/decode utilization, transfer time, cancellation waste, fairness, recovery time, cost, power where available, and trace completeness. Publish confidence intervals or repeated-run ranges, not one heroic run.
for run in acceptance_matrix:
deploy(run.release_receipt)
wait_until(health_and_capacity_stable)
replay(run.trace, arrivals="preserved")
assert correctness >= run.correctness_floor
assert deadline_miss_rate <= run.slo.deadline_miss_max
assert interactive_p95_ttft <= run.slo.ttft_max
assert trace_completeness == 1.0
store(metrics, events, topology, cost, receipts)
Multi-tenant QoS is proven by contention, not configuration
One of the important 1.0 themes is sharing infrastructure across workloads with competing priorities. A policy object can express priority, but production proof requires an adversarial test. Start an interactive lane at its normal load, add a background agent burst, then introduce a cache-cold long-context lane. Verify that the protected lane stays within deadline while lower-priority work degrades in the declared order.
Inspect priority inversion. A low-priority request can occupy scarce accelerator memory, hold a cache entry, or begin an expensive prefill before high-priority traffic arrives. A router may send traffic toward cache locality even when that worker is saturated. An autoscaler may react too late or create cold capacity that worsens the next window. Track decisions and resource occupancy, not just end metrics.
Define admission behavior before overload. Which requests queue, shed, downgrade, reroute, or fail? How long may each lane wait? Can a background job consume spare capacity without turning that capacity into an entitlement? What happens when the preferred accelerator pool is unavailable? Encode these choices as SLOs and error classes.
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: decode-workers
spec:
minAvailable: 75%
selector:
matchLabels:
llm-d.ai/role: decode
---
# Readiness must reflect serving eligibility, not process existence.
readinessProbe:
httpGet: { path: /ready, port: 8080 }
periodSeconds: 5
failureThreshold: 2A disruption budget and readiness probe are necessary but incomplete. Readiness should drop when a worker lacks required model state, cannot reach its cache or transfer peer, is incompatible with the router protocol, or cannot satisfy the lane it advertises. The router must stop sending work before termination, while in-flight streams either drain or fail through a tested client contract.
Break every edge in the graph
Failure injection should target the boundaries that distributed optimization creates. Kill a router replica. Partition a prefill group from decode. Slow KV transfer. Evict cache state. Remove one accelerator node. Return corrupt or partial telemetry. Exhaust a priority lane. Rotate a certificate. Make the autoscaler API unavailable. Cancel requests during prefill and during stream. Confirm both the user-visible behavior and the internal recovery evidence.
For each drill, set an expected error budget, recovery time, data-loss rule, and rollback trigger. A request that receives a clean 503 may be safer than one that hangs until its client retries through another layer. Count all attempts across the gateway, engine, mesh, and client. Agent traffic can amplify a small reliability defect because the agent may retry, regenerate context, or repeat a tool loop.
| Injected failure | Expected behavior | Evidence required |
|---|
| Router restart | New requests use another replica; no duplicate admission | Request IDs and route ledger |
| Prefill worker loss | Affected work fails or requeues within deadline policy | Queue transition and recovery time |
| KV transfer degradation | Fallback path activates or request fails explicitly | Transfer metric and route reason |
| Decode node loss | Streams terminate honestly; no fabricated continuation | Finish/error event integrity |
| Cache outage | Correctness survives; latency impact is bounded | Hit-rate drop and SLO delta |
| Telemetry outage | Serving follows declared policy; evidence gap alerts | Gap detection and local receipt |
| Priority flood | Admission prevents system collapse | Per-lane queue, shed, and deadline metrics |
Run drills long enough to expose control-loop behavior. Autoscaling can look correct during the first minute and oscillate over twenty. Cache recovery may spike network traffic. Retry can convert partial recovery into a second overload. Observe the complete stabilization period.
Prove zero-downtime upgrade and rollback as separate capabilities
“Zero downtime” can mean that a Service IP stayed reachable while active streams failed, latency doubled, or traffic silently moved to an untested path. Define continuity with request-level measures: accepted requests complete or fail within contract; no route lands on an incompatible component; protected lanes remain within SLO; telemetry identifies the serving release; and new state remains readable by the rollback release.
Upgrade the candidate through a shadow or isolated environment first, using the same manifests and cluster policies intended for production. Then canary by workload lane, model, or tenant rather than random traffic alone. Long-context and agent traffic can be rare enough that a random one-percent canary never exercises the dangerous path.
- Freeze and sign current and candidate release receipts.
- Replay the full corpus and compare decision, latency, cache, correctness, and cost deltas.
- Run failure drills on the candidate graph.
- Verify mixed-version compatibility only where the project explicitly permits it.
- Shadow safe traffic without side effects or double billing.
- Canary one bounded workload lane with automated stop thresholds.
- Expand only after a full stabilization window and human review.
- Rollback core, components, configuration, state schema, and traffic policy together.
- Replay a post-rollback sample and confirm observability and cache integrity.
State compatibility deserves special attention. Cache metadata, CRDs, routing state, and autoscaler history may change independently of stateless serving pods. If the old release cannot consume the new state, rollback is really a rebuild. Either prove compatibility, version state by release, or document the recovery time and data loss honestly.
Failure modes that a release headline hides
| Failure | Misleading conclusion | Acceptance control |
|---|
| Unpinned graph | “1.0 passed” | Immutable release receipt |
| Synthetic workload only | Peak throughput predicts production | Trace-shaped corpus and lane SLOs |
| Cache-friendly test | Router improvement is universal | Hit, miss, eviction, and cold-start cases |
| No contention | QoS configuration guarantees fairness | Priority and overload experiment |
| One healthy run | System is reliable | Repeated runs and fault injection |
| Umbrella version confidence | Every component is equally mature | Component matrix and support labels |
| Reachability as zero downtime | No outage occurred | Request and stream continuity metrics |
| Binary-only rollback | Old release can recover service | State and policy rollback drill |
| First-party cost claim | Your bill will fall by the same amount | Local total-cost measurement |
The strongest warning is not that llm-d lacks useful machinery. It is that useful machinery can create false confidence when evaluated at the wrong layer. Prefix-cache routing can raise reuse and still miss interactive deadlines. Disaggregation can raise aggregate throughput and add a fragile transfer boundary. Multi-tenant scheduling can improve utilization and hide starvation in averages. The acceptance contract must expose both benefit and new failure surface.
Day-two acceptance checklist
- Define the exact workload lanes and the SLO each lane protects.
- Pin model, tokenizer, engine, llm-d components, charts, images, CRDs, hardware, drivers, network, policies, and observability.
- Verify image signatures, dependency provenance, SBOMs, and component support status.
- Build a privacy-reviewed replay corpus that preserves arrival, length, prefix, priority, cancellation, and tool-loop shape.
- Compare the candidate with a relevant baseline under identical quality settings.
- Measure correctness, deadlines, TTFT, inter-token latency, throughput, cache, fairness, recovery, cost, and evidence completeness.
- Run simultaneous interactive, agent, batch, and long-context contention.
- Inject router, worker, transfer, cache, telemetry, autoscaler, credential, and node failures.
- Canary a bounded lane and retain automatic stop thresholds.
- Test full rollback, including state and configuration, then replay after rollback.
- Record residual gaps, named owners, expiry dates, and the exact approval decision.
If the graph passes, version 1.0 has done something valuable: it gave the team a stable enough foundation to produce comparable evidence. If it fails, the receipt makes the failure actionable. Either outcome is more useful than declaring a complex serving system production-ready because the project crossed a semantic-version boundary.
FAQ
Is llm-d 1.0 production-ready?
It is a stable project milestone with explicit day-two goals. Your deployment is production-ready only after the pinned graph passes your workload, failure, upgrade, security, and rollback gates.
Which metric matters most?
No single metric. Interactive lanes need deadline and latency protection; batch lanes need completion and cost efficiency; the platform also needs correctness, fairness, recovery, and complete evidence.
Can maintainer benchmarks predict our cost?
No. Treat them as hypotheses. Model shape, prefix reuse, sequence lengths, concurrency, accelerator topology, cloud pricing, staff time, spare capacity, and reliability requirements determine local cost.
Do we need production prompts for replay?
Not necessarily. Preserve the traffic features that drive the system and use sanitized or synthetic content after privacy review. Keep lengths, arrivals, shared prefixes, priorities, cancellations, and tool-loop timing realistic.
What is the smallest safe pilot?
One model, one accelerator path, two representative workload lanes, a documented baseline, a bounded canary, explicit failure drills, and a tested rollback. Expand dimensions only after the pilot yields stable evidence.
Sources and further reading
- llm-d repository - architecture, project state, components, guides, and current issues; accessed Oct 22, 2026.
- llm-d v1.0.0 release - stable release artifact and change record.
- llm-d release matrix - component pins and guide-testing status.
- llm-d accelerator requirements - driver compatibility, maintainer, and verification expectations.
- llm-d benchmark repository - workload, replay, and measurement tooling.
- IBM Research: llm-d 1.0 day-two operations - first-party stable API, QoS, and zero-downtime claims; Oct 20, 2026.
- Red Hat: llm-d 1.0 announcement - contributor release and bounded performance claims.
- Google Cloud: llm-d and CNCF - governance and portability background.
- Kubernetes PodDisruptionBudget documentation - voluntary-disruption control.
- Kubernetes probes - readiness and restart behavior.
- Current llm-d 1.0 community discussion - bounded attention signal, not production proof.
- Related: make shared KV cache allocation and reuse fail closed.
- Related: benchmark the agent inference loop, not one speed.
- Related: reason about inference memory tiers.