Distributed inference | October 22, 2026

llm-d 1.0: a stable tag is not a production readiness test

Version 1.0 gives distributed inference operators a stronger contract. It does not prove that your model, engine, router, cache, accelerators, traffic mix, and failure budget work together. Promote the pinned serving graph only after replay, contention, failure, upgrade, and rollback evidence.

Day-two operationsMulti-tenant QoSRelease receiptSources checked Oct 22
A distributed inference request moving through routing, cache, prefill, decode, telemetry, and an acceptance gate

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 ledger

Create 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 laneProperty to preservePrimary acceptance signalCommon trap
Interactive chatShort deadline, streaming, mixed contextp95 TTFT and inter-token latencyReporting only aggregate throughput
Coding agentRepeated repo prefix, bursty tool loopDeadline attainment and cache localityIgnoring retries after tools
Background agentLarge bursts, lower priorityThroughput without interactive starvationLetting batch work seize all decode slots
Batch evaluationMany independent promptsCompletion rate and cost per accepted resultComparing against online SLOs
Long-context analysisHeavy prefill and cancellationPrefill queue and wasted workMeasuring 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: 2

A 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 failureExpected behaviorEvidence required
Router restartNew requests use another replica; no duplicate admissionRequest IDs and route ledger
Prefill worker lossAffected work fails or requeues within deadline policyQueue transition and recovery time
KV transfer degradationFallback path activates or request fails explicitlyTransfer metric and route reason
Decode node lossStreams terminate honestly; no fabricated continuationFinish/error event integrity
Cache outageCorrectness survives; latency impact is boundedHit-rate drop and SLO delta
Telemetry outageServing follows declared policy; evidence gap alertsGap detection and local receipt
Priority floodAdmission prevents system collapsePer-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.

  1. Freeze and sign current and candidate release receipts.
  2. Replay the full corpus and compare decision, latency, cache, correctness, and cost deltas.
  3. Run failure drills on the candidate graph.
  4. Verify mixed-version compatibility only where the project explicitly permits it.
  5. Shadow safe traffic without side effects or double billing.
  6. Canary one bounded workload lane with automated stop thresholds.
  7. Expand only after a full stabilization window and human review.
  8. Rollback core, components, configuration, state schema, and traffic policy together.
  9. 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

FailureMisleading conclusionAcceptance control
Unpinned graph“1.0 passed”Immutable release receipt
Synthetic workload onlyPeak throughput predicts productionTrace-shaped corpus and lane SLOs
Cache-friendly testRouter improvement is universalHit, miss, eviction, and cold-start cases
No contentionQoS configuration guarantees fairnessPriority and overload experiment
One healthy runSystem is reliableRepeated runs and fault injection
Umbrella version confidenceEvery component is equally matureComponent matrix and support labels
Reachability as zero downtimeNo outage occurredRequest and stream continuity metrics
Binary-only rollbackOld release can recover serviceState and policy rollback drill
First-party cost claimYour bill will fall by the same amountLocal 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

  1. Define the exact workload lanes and the SLO each lane protects.
  2. Pin model, tokenizer, engine, llm-d components, charts, images, CRDs, hardware, drivers, network, policies, and observability.
  3. Verify image signatures, dependency provenance, SBOMs, and component support status.
  4. Build a privacy-reviewed replay corpus that preserves arrival, length, prefix, priority, cancellation, and tool-loop shape.
  5. Compare the candidate with a relevant baseline under identical quality settings.
  6. Measure correctness, deadlines, TTFT, inter-token latency, throughput, cache, fairness, recovery, cost, and evidence completeness.
  7. Run simultaneous interactive, agent, batch, and long-context contention.
  8. Inject router, worker, transfer, cache, telemetry, autoscaler, credential, and node failures.
  9. Canary a bounded lane and retain automatic stop thresholds.
  10. Test full rollback, including state and configuration, then replay after rollback.
  11. 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