Reference Architecture · GPU Inference Fabric
Multi-Cluster Inference Fabricv0.1
GPU model-serving capacity that survives losing a rack, a cluster, or a region — without the agents, applications, or teams calling it ever knowing it happened.
§1–§10 — the problem, the design, the guarantees, what it costs to run, and when it is the wrong choice. About ten minutes. You can stop at the divider.
§11 onward — topology, parallelism strategy, cross-cluster routing, failure behavior, and the appendices that specify all of it precisely enough to build from.
§ 1Executive summary
A single inference-fabric cluster — even a well-built one — is one fault domain. A driver upgrade, a rack power event, a fiber cut, or a control-plane outage on that one cluster takes the whole fabric down, and every caller depending on it goes down with it. This is true regardless of how carefully that single cluster is engineered; no amount of intra-cluster redundancy defends against losing the cluster itself.
This architecture removes that fault domain by treating one inference-fabric cluster as a replaceable, homogeneous unit of GPU capacity rather than as the place inference happens. Two or more clusters run an identical stack, independently, in different failure domains — different racks and power at minimum, different sites where the availability target requires it — and a routing control plane in front of them decides which cluster serves each request without either cluster having to know the other exists.
What that buys is survivability: the loss of any single cluster degrades capacity, not availability. What it costs is duplication — GPU capacity sitting in reserve, an operations practice run N times, and a routing layer with more discipline than round-robin, because inference state does not replicate for free.
Every decision in this document follows from one governing fact, established by benchmarking tensor- and pipeline-parallel inference over InfiniBand-class fabrics: model parallelism does not cross a cluster boundary. Tensor parallelism stays inside the NVLink domain of a single node. Pipeline, data, and expert parallelism may cross nodes within a cluster, over that cluster's own RDMA fabric. Nothing crosses between clusters except independent replica traffic and, for specific workloads only, cache state. That constraint is what turns “multi-cluster” into a routing and capacity problem instead of a distributed-GPU-fabric problem — and it is why this can be built from commodity DGX hardware and standard Kubernetes multi-cluster primitives rather than a bespoke wide-area interconnect.
The design is settled. One decision remains open, and it is a question of which routing technology fits infrastructure you already run, not of how the fabric is shaped (§9).
A cluster can fail. A request should never know.
1.1At a glance
| What it is | Two or more independent GPU inference-fabric clusters, unified behind one routing control plane |
| Who operates it | A GPU platform team, on DGX-class hardware and Kubernetes, per cluster |
| Core principle | No caller ever addresses a cluster directly; every cluster is built to be indistinguishable from any other |
| Shape | N independent fabric clusters, one routing control plane that depends on none of them |
| Parallelism rule | Tensor parallelism stays inside one node; nothing — TP, PP, DP, or EP — crosses a cluster boundary |
| Failure behavior | Active-active by default; losing one cluster reduces capacity, not availability |
| Status | Design complete. One decision open — §9 |
§ 2Why this architecture exists
Five problems show up whenever a single GPU inference-fabric cluster moves from a pilot into something the business actually depends on. Each is solved by a structural choice, not by better monitoring of the one cluster you have.
2.1A GPU fabric is a hardware fault domain, not just a software one
A model-serving replica is pinned to specific GPUs, a specific NVLink domain, specific IB rails. When a node drains for a driver update, a rack loses power, or a switch ASIC fails, the replicas on it don't reschedule elsewhere in milliseconds — they are gone until that hardware is back. A platform that only scales within one cluster inherits every hardware failure mode of that cluster as an availability outage.
2.2Maintenance and model promotion need somewhere to fail over to
GPU firmware, driver, and NCCL library upgrades happen on a cadence the calling applications don't control, and they are the highest-risk maintenance a platform team performs. Doing them with zero downtime requires a second fabric to shift traffic to — not a rolling update within one cluster's node pool.
2.3Capacity and blast radius scale differently across an organization
One team's traffic spike — a launch, an incident, a bulk evaluation run — can saturate a shared fabric's queue depth for every other consumer. Multiple independent clusters let capacity be planned, and bursts absorbed, per region, per business unit, or per criticality tier, funded and sized independently of one another.
2.4KV cache and parallelism state do not survive a cluster loss for free
This is the problem that breaks naive multi-region designs. A model server's attention state lives in GPU memory on the exact GPUs serving it; a tensor-parallel group is a set of GPUs synchronized every layer over NVLink. None of that state, and none of that synchronization group, can span a cluster boundary or survive that cluster disappearing. A multi-cluster design has to state, explicitly, what happens to in-flight requests and cache locality on failover — silence on this point is where most multi-region inference designs quietly break in production.
2.5Network economics do not scale the way GPU economics do
DGX nodes get materially faster generation over generation — NVLink, then InfiniBand or RoCE. Wide-area links between racks or sites do not improve at the same rate, and their cost scales with distance and bandwidth in a way GPU procurement doesn't. A design that assumes cross-site bandwidth behaves like intra-rack bandwidth will be both economically and technically wrong the moment a second site is added.
None of these five is about model quality or the serving engine underneath. A faster vLLM release, or a switch to SGLang or TensorRT-LLM, changes none of them — which is the test this architecture has to pass: it should be exactly as correct after the serving engine is replaced.
§ 3The architecture at a glance
Four areas, and one rule about how they connect. Everything else in this document is detail beneath this picture.
| Area | What lives there |
|---|---|
| People, agents, applications | Every caller — an agent platform's model gateway, a direct API consumer, a batch or evaluation job |
| Fabric Router | The one entry point into every fabric cluster; decides which cluster serves each request |
| Fabric cluster (× N) | A complete, independently operable inference stack — model servers, intra-cluster routing, KV cache, scheduler — capable of serving 100% of traffic alone |
| Shared control plane | GitOps source of truth, model registry, cross-cluster observability — informs every cluster, sits on no request path |
Each cluster internally implements the same trust and serving pattern a single-fabric deployment would — see the companion Inference Fabric & Agentic Platform reference for that zone-level detail. This document specifies what changes, and what must never change, when there is more than one.
§ 4What makes a cluster safe to lose
These are the part of the architecture worth remembering. If you retain one thing from this document, it should be that no single cluster is allowed to hold anything the others can't route around.
4.1The concerns they answer
| Leadership concern | Architecture response |
|---|---|
| Can we lose a rack, cluster, or region without an outage? | Every cluster runs the full stack independently; the router removes a cluster from rotation the instant it fails health checks |
| Can we upgrade GPU drivers or firmware without downtime? | Traffic drains off a cluster before maintenance begins; the cluster being upgraded is a capacity event, not an availability event |
| Does losing a cluster lose in-flight work? | In-flight requests on a failed cluster are lost at the request level and retried against a healthy cluster — nothing is silently dropped |
| Does losing a cluster lose cache or context state? | KV and prefix cache are cluster-local by design; failover accepts a cold cache on the receiving cluster unless a shared tier has been deliberately adopted for a specific workload (§14.3) |
| Can one team's traffic take down another team's capacity? | Per-cluster and per-pool admission control bounds any workload's blast radius to the clusters it is routed to |
4.2The controls
Fabric Router — governs which cluster serves a request
Every inference request, regardless of caller, resolves to a cluster through one routing layer. Routing considers cluster health, capacity, and — where the routing technology supports it — KV or prefix affinity. Nothing calls a fabric cluster's model-server endpoint directly; that is the single highest-leverage rule in this document, and the one most tempting to bypass for a “quick fix.”
Cluster Autonomy — governs what a cluster is allowed to depend on
A fabric cluster may not depend on any other fabric cluster to serve a request: its own scheduler, its own KV cache tier, its own model pool, its own weights cache. Cross-cluster dependencies are exactly the thing that turns N independent fault domains back into one.
Parallelism Containment — governs where model-parallel state is allowed to live
Tensor parallelism never crosses a node's NVLink domain. No parallel group — tensor, pipeline, data, or expert — ever crosses a cluster boundary. Full treatment in §12; this is the technical center of the document.
Failure-Aware Cache Policy — governs what happens to context locality on failover
Prefix and KV cache locality is optimized for the common case — no failure — and explicitly, deliberately allowed to reset in the uncommon case. That tradeoff is stated in §5 rather than discovered in an incident review.
4.3Engineering guarantees
| # | Invariant | What it removes |
|---|---|---|
| 1 | No caller addresses a cluster directly | A caller pinned to a dead cluster with no failover path |
| 2 | Any one cluster can serve 100% of traffic alone | Cascading failure when one cluster's capacity is subtracted from the pool |
| 3 | Model-parallel groups never cross a cluster boundary | A single fabric-wide synchronization stall, or a partial-cluster loss corrupting an in-flight collective |
| 4 | Health state is derived from GPU signals, not assumed from liveness | Routing traffic to a cluster that answers a health check but can't actually serve — driver fault, XID errors, thermal throttle |
| 5 | Failover is stateless from the router's side | The router becoming a second single point of failure by holding session state that must survive its own restart |
§ 5The design decisions
Six decisions determine everything else. Five are settled; the sixth is open (§9).
| Decision | Why it matters | Position |
|---|---|---|
| Active-active or active-passive? | Cost vs. simplicity | Active-active by default |
| How many clusters, minimum? | Blast radius vs. cost | Two minimum; three if a single loss must not reduce headroom below N-1 capacity |
| Where does model parallelism stop? | Latency vs. how large a model you can serve | TP inside one node's NVLink domain; PP/DP/EP may cross nodes within a cluster; nothing crosses clusters |
| Shared KV cache across clusters? | Failover cache-warmth vs. added latency and complexity | No, by default — opt-in per workload (§14.3) |
| Per-cluster orchestration? | Delivery cost and platform control | KubeRay + Ray Serve LLM, or NVIDIA Dynamo — either satisfies the router's contract (§15) |
| Cross-cluster routing technology? | What infrastructure you already run | Open — decided against existing gateway/mesh investment (§9) |
1Active-active across all clusters
BenefitAll capacity is always earning its keep, and failover is a capacity reduction the router already routes around continuously — not a cold-start event triggered by an incident.
CostYou provision for N-1 (or N-2) headroom rather than full utilization of every cluster, and every cluster carries production traffic, so every cluster needs production-grade operational rigor. There is no “the standby, we'll get to it” cluster.
2Where model parallelism stops
BenefitKeeping tensor parallelism inside a single node's NVLink domain avoids the collective-communication cost of TP over any inter-node fabric — a DGX node gives roughly 600 GB/s to 1.8 TB/s of intra-node bandwidth per GPU depending on generation, versus 50–100 GB/s per GPU on a single inter-node NIC. Extending pipeline, data, or expert parallelism across nodes within one cluster is the supported, low-risk way to scale a model past one node's GPU count.
CostA dense model too large to fit at any workable precision inside one node's aggregate memory requires either accepting cross-node TP as a deliberate latency trade (a real, precedented pattern — Meta's own Llama 3.1 405B release ships a model-parallel-16 configuration built for exactly this) or choosing a smaller or more heavily quantized model. Sized precisely in §12.
3No shared cross-cluster KV cache by default
BenefitCross-cluster cache replication adds a standing network cost and a consistency problem to every request, for a benefit — better cache-hit rate on the rare cluster a failover lands on — that most workloads never collect on.
CostA failover is a genuinely cold cache on the receiving cluster: time-to-first-token for previously-warm prompts spikes until that cluster repopulates its own cache. For workloads with very large, frequently reused shared prefixes, this cost is real enough to justify the exception in §14.3.
4 & 5Orchestration and routing technology
Both stay open by design — the router's contract with a cluster (§11.1) is identical regardless of which orchestrator serves behind it, and the routing technology should match infrastructure the team already operates rather than introduce a new one. Evaluated in §9 and §15.
§ 6One request, with a cluster down
A request arrives for a model normally served with a warm prefix cache on Cluster A. Cluster A has just failed a health check.
- The request reaches the Fabric Router. The router already knows Cluster A is unhealthy from continuous background probing — this request is not the thing that discovers the failure.
- The router selects a healthy cluster. Cluster B, chosen by capacity and whatever affinity signal is available. No session is pinned to a dead cluster waiting for it to come back.
- The request executes on Cluster B with a cold prefix cache. Time-to-first-token reflects a full prefill instead of a cache hit — the accepted cost from §5, decision 3, not a bug.
- Cluster A is removed from rotation, not torn down. A distinction that matters: a transient failure and a planned drain both end in “not receiving traffic,” but only one of them should page anyone.
- When Cluster A returns healthy, the router reintroduces it gradually. A hard cutover back onto a cold cluster reproduces the same cache-miss spike the failover just caused — reintroduction is ramped, not instant.
- Every hop is on one correlated trace. The routing decision, the health state that drove it, and the resulting cache-miss cost are all attributable after the fact, not inferred from a latency graph (§16).
Steps 1–3 are the Fabric Router doing its one job. Step 4 is why a failure and a drain share a mechanism. Step 5 is the reintroduction policy most multi-cluster designs skip and then discover the hard way. Step 6 is the observability guarantee.
The equivalent runtime paths, with their network flows, are specified in §17.
§ 7What the architecture guarantees
Stated as outcomes, with a pointer to the part of the technical reference that specifies each one.
| Concern | Guarantee | Specified in |
|---|---|---|
| Cluster-loss survivability | The loss of any one cluster, up to provisioned headroom, degrades capacity, not availability | §11 |
| Maintenance without downtime | Driver, firmware, and model upgrades drain traffic off a cluster before work begins | §13 |
| Model-parallel integrity | No tensor-, pipeline-, data-, or expert-parallel group spans a cluster boundary | §12 |
| Failover behavior | A caller never errors because the cluster it would have hit is down; it is routed transparently to a healthy one | §13 |
| Cache-state honesty | The cost of a cold cache on failover is stated and measured, not hidden as unexplained latency | §14 |
| Capacity fairness | No single workload can consume enough of one cluster's capacity to affect another workload on the same cluster | §16 |
| Observability | Every routing decision, health transition, and failover event is on one correlated record | §16 |
§ 8What this costs to operate
Every architectural choice has a price. This section states the one attached to this design.
8.1What the enterprise has to own
| Capability | Platform requirement |
|---|---|
| Multiple fault domains | At minimum two physically or logically separate racks and power domains; two sites where the target requires it |
| Cross-cluster routing | A control-plane component that is not itself hosted on any single fabric cluster |
| GPU operations, N times | The same DGX operations practice as a single cluster, run identically on every cluster |
| Health signal plumbing | GPU-level health surfaced to the router — not inferred from request failures |
| Capacity headroom | N-1 or N-2 provisioning discipline, reviewed as demand grows |
8.2The ledger
What it buys
- Survives a rack, cluster, or region loss without an outage
- Zero-downtime GPU maintenance
- Capacity that scales and is funded per region or business unit
- A stated, tested answer for “what happens when a cluster goes down” instead of an assumed one
- Independence from any single cluster's hardware failure modes
What it costs
- N-1 or N-2 GPU headroom sitting idle in the steady state — a genuinely expensive line item on DGX-class hardware, sized explicitly in 8.3, not waved past
- A routing control plane that is now a critical dependency and needs the availability engineering of an edge service
- Cold-cache latency on every failover
- An operations practice run N times instead of once
8.3Where the effort concentrates
Three areas hold most of it. The parallelism and networking decision (§12) — a one-time, high-consequence sizing exercise per model family. The Fabric Router (§13) — the one component with no fully standardized off-the-shelf answer, evaluated like §9. Steady-state headroom cost — not an engineering task at all, but an ongoing budget line that needs the same scrutiny as any other standing capacity reservation.
§ 9Open decisions
One decision gates delivery. The rest can be made after the fabric is standing, and are listed so that nobody mistakes silence for consensus.
9.1The gating decision — cross-cluster routing technology
The question. What component health-checks every cluster, routes and fails over between them, and never becomes a dependency of any single cluster it routes to.
| Gateway API Inference Extension, multi-cluster form | Fits directly if intra-cluster routing already uses the single-cluster form of this project. Model-aware, KV/load-metric-based balancing across pools and clusters. Newest of the three options, still maturing |
| Istio Ambient Multicluster + InferencePool | Sidecarless east-west routing with locality-aware failover. Right fit if the platform already runs Istio elsewhere; adds a mesh dependency if it doesn't |
| A dedicated cross-cluster control plane | Fastest path to one endpoint spanning clusters across clouds, regions, or on-prem. Adds a third-party control-plane dependency the other two options avoid |
| The gate | Adopt the option that matches infrastructure already standardized on elsewhere in the estate; do not introduce a new gateway or mesh technology solely for this |
9.2Decisions that can wait
Six choices are deliberately unmade. None of them changes the shape of the fabric, and each has a stated default that applies if nobody decides.
The six deferred decisions
1Two clusters or three?
Two survives one loss at reduced capacity. Three survives one loss at full N-1 capacity. Default to two unless the availability target requires full headroom through a single loss.
2Same site, different racks — or genuinely different sites?
Different racks defends against power, hardware, and maintenance failure. Different sites additionally defends against a site-level event, at the cost of real inter-site latency and egress, which changes the router's health-check and failover-latency assumptions.
3Per-cluster orchestration — KubeRay or Dynamo?
Deferred. The router's contract with a cluster is an OpenAI-compatible endpoint plus a health and metrics surface — both options provide it identically (§11, §15).
4Shared cache tier for specific workloads?
Deferred until a workload with sufficient shared-prefix reuse to justify it actually exists (§14.3).
5Which serving engine?
vLLM is the default. SGLang, TensorRT-LLM, and NIM are substitutable per cluster; a mixed fleet across clusters is supportable as long as every cluster presents the same contract to the router.
6Session or sticky-routing granularity?
Per-request versus per-conversation-thread affinity is a latency and cache-hit tradeoff decided per workload, not architecturally.
§ 10When to build this — and when not to
This is a substantial capacity commitment. It is worth being explicit about the conditions under which it is the wrong answer, because most organizations reach those conditions gradually rather than starting at them.
10.1Two lists
Probably excessive if
- a single-cluster outage is an acceptable, budgeted risk for the workload;
- the workload tolerates a scheduled maintenance window;
- GPU capacity fits comfortably in one rack and isn't yet the bottleneck;
- no regulatory or contractual availability target is driving the requirement;
- there isn't yet one inference-fabric cluster running reliably — build that first.
Appropriate when
- inference sits on the critical path of a production system with a stated availability target;
- GPU maintenance currently requires a downtime window and that's no longer acceptable;
- a single rack, PDU, or site failure would be a material incident;
- capacity needs already exceed what one cluster can hold;
- multiple business units or regions need capacity isolated from each other's blast radius.
10.2Assumptions this design rests on
- DGX-class (or equivalent) GPU nodes, homogeneous within a cluster; heterogeneous across clusters is supportable but not the default case sized here.
- Each cluster has, at minimum, 400G-class InfiniBand or RoCEv2 inter-node fabric with GPUDirect RDMA. A genuinely lower-bandwidth fabric materially changes the cross-node parallelism guidance in §12 and should be re-evaluated against it before this design is applied as-is.
- Clusters are independently reachable — separate control planes, separate network paths to the router — not sharing a single upstream failure domain.
- The router is deployed with its own availability plan, inheriting the edge-service treatment the companion agentic-platform reference gives its AI Gateway; specifying that plan is out of scope here.
- No requirement yet for cross-cluster session or cache consistency stronger than “eventually recovers” — see §14.3 if that assumption changes.
Change any of these — particularly the network-generation assumption — and §12 needs re-deriving before the rest of the document still applies.
Technical reference
The remainder specifies how the guarantees above are implemented. It assumes the vocabulary a platform, SRE, or GPU infrastructure team already uses. Nothing below changes the architecture described in §1–§10.
§ 11Per-cluster fabric topology
11.1What every cluster must provide — the contract with the router
- An OpenAI-compatible inference endpoint per model pool.
- A health and readiness surface reflecting actual GPU health — DCGM signals, XID errors, thermal state — not just process liveness.
- Cache-aware internal routing (prefix or KV affinity), intra-cluster.
- Independent scaling, with no cross-cluster scaling dependency.
- Exactly one inbound path from the router — the cluster-boundary form of the single-ingress principle a well-built fabric already applies at every zone boundary inside it.
11.2Reference implementation
Named products are the current best answers, not requirements — the fabric's contract with the router is a pool of OpenAI-compatible endpoints behind one gateway; substitutions are local decisions.
| Component | Notes |
|---|---|
| GPU nodes | DGX H100 / H200 / B200-class. NVLink/NVSwitch intra-node; InfiniBand or RoCEv2, 400G+, inter-node — Appendix B |
| Model servers | vLLM (primary), SGLang, or TensorRT-LLM/NIM. Parallelism sized per §12, not by model alone |
| Per-cluster orchestration | KubeRay (RayService + Ray Serve LLM) or NVIDIA Dynamo — open per §9; router contract identical either way |
| Intra-cluster routing | Gateway API Inference Extension: InferencePool + endpoint picker, prefix/KV-cache-aware |
| Disaggregated serving | llm-d or NVIDIA Dynamo — separate prefill/decode pools where traffic shape justifies it (§14) |
| KV cache tier | LMCache or equivalent, CPU RAM / NVMe offload, cluster-local |
| Gang scheduling | LeaderWorkerSet for TP/PP-group placement, topology-aware; Kueue, Volcano, or NVIDIA Grove + KAI Scheduler for the broader job-scheduling layer around it |
| Weights store | Object store + local NVMe cache, or Lustre/GPFS/WEKA — isolated from the RDMA fabric carrying TP/PP/KV traffic |
| GPU health | GPU Operator + DCGM → cluster-local Prometheus → federated to §16 |
11.3Per-cluster HA — one layer below the whole-cluster failure this document defends against
Losing one node inside a cluster should not be a cluster-level event. Ray-based clusters get this from GCS fault tolerance backed by an external, HA-configured Redis (Sentinel); Dynamo or LWS-based clusters get it from the underlying Kubernetes scheduler's normal pod replacement plus per-role health checks. Either way, this is intra-cluster resilience — it is what makes §4's “cluster autonomy” claim actually true, not what makes the fabric multi-cluster. A cluster without this layer is not a safe unit to call a replica.
§ 12Parallelism strategy
The section this document exists to make precise.
12.1The rule
Tensor parallelism stays inside a node. Pipeline, data, and expert parallelism may cross nodes within a cluster. Nothing crosses a cluster boundary. The rule follows directly from the bandwidth gap between the two kinds of interconnect involved, not from a preference: NVLink delivers roughly 600 GB/s to 1.8 TB/s of intra-node bandwidth per GPU depending on generation; a single inter-node NIC on a 400G or 800G fabric delivers roughly 50–100 GB/s per GPU. That gap — not the absolute speed of either — is what determines where tensor parallelism, with its every-layer all-reduce, is allowed to live.
12.2Decision table
| Situation | Strategy |
|---|---|
| Fits on one GPU | TP=1; scale by replica (data parallel) across clusters via the router |
| Fits in one node (≤8 GPU) | TP = GPU count, over NVLink, contained to the node |
| Uneven GPU division, or no NVLink | Pipeline parallelism within the node instead of TP |
| Dense model larger than one node | TP = GPUs/node × PP = node count, gang-scheduled within one cluster, never spanning clusters |
| MoE model | Data-parallel attention + expert parallelism; EP kept within the NVLink domain where possible, extended across nodes on the cluster's own fabric before ever considering a second cluster |
12.3When cross-node tensor parallelism is acceptable
Stated plainly: cross-node TP — a tensor-parallel degree greater than one node's GPU count — is a real, supported, production-precedented pattern for dense models too large to serve at any workable precision on a single node. Meta's own Llama 3.1 405B release ships a model-parallel-16 configuration built for exactly this, run over a 400G InfiniBand fabric between two 8-GPU nodes. It is a deliberate latency trade, not a default. NVIDIA SHARP in-network computing on the switch fabric materially reduces the cost of the cross-node all-reduce this requires and should be enabled whenever cross-node TP is used (Appendix B) — but even with SHARP enabled, per-token latency is measurably worse than staying within a node. Reserve it for the case where nothing else fits; try pipeline, data, or expert parallelism first.
12.4The one thing this design never permits
No parallel group — tensor, pipeline, data, or expert — crosses a cluster boundary. A TP or PP group spans, at most, every node in one cluster, over that cluster's own RDMA fabric. It never spans two clusters. This is the constraint that makes §4's cluster-autonomy claim and the use of model parallelism at all simultaneously true — a parallel group split across clusters would make both clusters required for a single request to complete, which defeats the entire premise of this document.
EvidenceA gang-scheduling placement that lands any rank of a TP or PP group outside its assigned cluster is a defect, not a scheduling edge case — treat it as a release blocker, not a performance tuning item.
12.5Benchmark gate
Before finalizing a parallelism plan for a specific model and fabric generation, measure the actual per-hop collective cost on the target hardware. The bandwidth figures in Appendix B are a planning input, not a substitute for nccl-tests on the fabric that will actually carry production traffic.
§ 13Cross-cluster control plane
13.1What the Fabric Router must do
- Health-check every cluster continuously, on the same GPU-health signal §16 defines — never a bare TCP or HTTP liveness check, which can pass while the fleet behind it is degraded.
- Route on capacity and, where the technology supports it, prefix or KV affinity — sending a request to the cluster most likely to already hold its context, while a healthy alternative always exists.
- Fail over transparently — a cluster failing removes it from the routing set without surfacing an error to the caller, beyond the latency cost of a cold cache on the receiving cluster.
- Reintroduce a recovered cluster gradually — a hard cutover back onto a cold cluster reproduces the thundering-herd problem it was built to avoid.
- Never become a cluster-specific dependency itself — deployed independently of every fabric cluster it routes to.
13.2Implementation options
Recapped from §9: Gateway API Inference Extension in its multi-cluster form, Istio Ambient Multicluster, or a dedicated cross-cluster control plane. The router's job is identical across all three — only the mechanism differs, and the gate is which one matches infrastructure already standardized on elsewhere.
13.3Active-active traffic shifting
Capacity-aware routing should shift traffic proportionally toward whichever cluster has headroom, not just binary-fail toward survivors on a hard cluster loss. That proportional behavior is what lets a cluster be intentionally drained for maintenance with no special-cased “maintenance mode” anywhere in the router — a planned drain and an unplanned failure are the same mechanism at different speeds.
§ 14Disaggregated serving and KV cache — cross-cluster implications
14.1The intra-cluster case, recapped
Prefill/decode disaggregation via llm-d or Dynamo, KV transfer via NIXL, tiering via LMCache — established practice, specified in §11.2. Nothing below changes that.
14.2The rule for disaggregation across a cluster boundary: never
A prefill pool and its paired decode pool are, functionally, a single parallel-serving unit connected by a KV transfer path that assumes a shared high-speed fabric. Splitting that pair across clusters reintroduces exactly the cross-cluster dependency §12.4 forbids, on the most latency-sensitive path in the system — KV transfer has to complete inside the token-generation budget. Keep every prefill/decode pair inside one cluster, full stop.
14.3The shared-cache exception, stated precisely
For a specific workload with a very long, frequently reused shared prefix — a large system prompt, a static RAG corpus — where cross-cluster cache-hit rate materially changes cost or latency, a shared LMCache tier, backed by an object store or a cross-cluster cache service, can be adopted deliberately as an addition to, not a replacement for, per-cluster caches. This is opt-in per workload, never a platform default: the added latency and consistency cost lands on every request on that path, whether or not a failover ever happens.
§ 15Orchestration: adopt or build (per cluster)
The per-cluster orchestrator is the one component below the router with no fully settled off-the-shelf answer.
15.1The comparison
| Requirement | KubeRay + Ray Serve LLM | NVIDIA Dynamo |
|---|---|---|
| Engine flexibility | vLLM primary target | Engine-agnostic — vLLM, TensorRT-LLM, SGLang |
| Fault tolerance | GCS fault tolerance + external HA Redis; mature, well documented | Kubernetes-native pod replacement + Grove/KAI Scheduler; newer |
| Disaggregation | Supported via Ray Serve LLM's P/D deployment mode | First-class — Smart Router, SLO Planner, KV Block Manager, NIXL transport |
| KV-aware routing | Built into Ray Serve LLM | Built into Dynamo's router |
| Operational maturity | Longest track record of the two, broadest community | Newer, NVIDIA-native, tightest fit with DGX-class hardware and SHARP-capable fabrics |
| Multi-cluster awareness | None natively — this document's Fabric Router supplies it | None natively — same |
15.2The gate
This is not a gating decision the way the serving-layer choice is in the companion agentic-platform reference, because the router's contract with a cluster (§11.1) is identical either way. Pick the option that matches existing operational investment — Ray elsewhere in the stack favors KubeRay; heavy NVIDIA-stack investment and a SHARP-capable fabric already in place favors Dynamo — and revisit only if that contract stops being met.
§ 16Observability and failure signals
| Question | Answered by |
|---|---|
| Which cluster served this request, and why? | Fabric Router routing decision, logged per request with the health and capacity state that drove it |
| Is a cluster degraded before it fails outright? | GPU health signals — DCGM/XID, thermal, ECC — federated from every cluster into one cross-cluster view |
| What did a failover cost? | Cache-hit-rate delta and TTFT delta on the receiving cluster, correlated to the failover event |
| Is capacity balanced across the fleet? | Per-cluster queue depth and KV-cache utilization, compared across clusters, not just monitored in isolation |
16.1Operational metrics
| Signal | Source | Alert on |
|---|---|---|
| Cluster health transition | Fabric Router | Any transition — logged, not only alerted, so failover frequency is a visible trend |
vllm:num_requests_waiting, per cluster | Each cluster | Sustained imbalance across clusters → capacity misrouting, not just per-cluster overload |
vllm:gpu_cache_usage_perc, per cluster | Each cluster | > 0.90 → out-of-memory risk |
| TTFT / TPOT, p95, per cluster | Router / Inference Gateway | SLO breach, and a persistent gap between clusters worth investigating |
| Failover rate | Fabric Router | More than one unplanned failover in a rolling window → treat as an incident, not routing working as designed |
| Cross-cluster capacity imbalance | Router + per-cluster metrics | Sustained skew → rebalance before it becomes a cascading failure if the heavier cluster also fails |
An imbalance that grows quietly for weeks is the precondition for the failure this document is designed to prevent: two clusters where one is doing most of the work, so losing that one is no longer a capacity reduction — it's an outage with extra steps.
§ 17Request paths
Three runtime paths carry essentially all traffic; the narrative walkthrough in §6 is F2 in full. Read the semantic chain first — the N# references beneath each one are cross-references into the connection matrix in Appendix A.
| Path | Purpose |
|---|---|
| Caller → Fabric Router → Cluster | Normal-path inference |
| Caller → Fabric Router → unhealthy cluster skipped → healthy cluster | Failover |
| Platform → Router / clusters → Observability | Health, metrics, traces |
F1Normal request
- Caller
- Fabric Router
- Healthy, affinity-matched cluster
- Intra-cluster routing
- Model server
- Response
The router selects on health, capacity, and whatever affinity signal the routing technology exposes; the cluster serves the request over its own intra-cluster routing and returns it along the same path. One correlated trace end to end.
Network references: N1 → N2, with health state from N3; telemetry via N6.
F2Failover request
- Caller
- Fabric Router
- Unhealthy cluster already excluded
- Alternative cluster
- Cold-cache prefill
- Response
Narrated in full in §6. In short: the unhealthy cluster is already out of the routing set from background health checks — the request does not discover the failure — the router selects an alternative, the request is served with a cold cache on the receiving cluster, and the event is logged with the routing decision and its cost.
Network references: N3 removes the cluster from rotation; the request itself is N1 → N2 against a survivor.
F3Planned maintenance drain
- Operator marks cluster for drain
- Router shifts traffic proportionally
- In-flight requests complete
- Zero traffic
- Maintenance
- Gradual reintroduction
Per §13.3, a drain uses the same proportional traffic-shifting mechanism as an unplanned failure, at a slower rate. Reintroduction uses the same ramp in both cases — there is no separate maintenance mode to get wrong.
Network references: N3 drives the shift; N2 carries whatever traffic remains until it reaches zero.
App. ANetwork matrix
Scoped to what's new in a multi-cluster design. Composes with the companion agentic-platform reference's network matrix for everything inside one cluster — this table only adds the cross-cluster edges.
| # | Source | Destination | Proto / port | AuthN / Z | Notes |
|---|---|---|---|---|---|
| N1 | Caller (agent platform gateway, direct API consumer) | Fabric Router | HTTPS 443 | mTLS / API key | Only entry point into the fabric |
| N2 | Fabric Router | Cluster inference gateway (per cluster) | HTTPS 443 | mTLS | One edge per healthy cluster; contract in §11.1 |
| N3 | Fabric Router | Cluster health / metrics endpoint | HTTPS 443 | mTLS | Continuous polling, not on the request path |
| N4 | Cluster model server | Same-cluster model server, same cluster only | RDMA (IB / RoCEv2) | Fabric-isolated | TP/PP collectives, KV transfer — never crosses N5 |
| N5 | — | — | — | — | Explicitly denied — any cluster-to-cluster GPU-fabric traffic |
| N6 | Every cluster | Cross-cluster observability aggregation | OTLP / HTTPS | mTLS | Pull or push per implementation; never on the inference request path |
Explicitly denied
- Cluster → cluster, any protocol, for inference or GPU-fabric traffic (N5)
- Caller → cluster, direct, bypassing the Fabric Router
- Fabric Router holding request state that must survive its own restart — the statelessness requirement from 4.3
App. BHardware & fabric appendix
| Path | Typical bandwidth | Scope |
|---|---|---|
| NVLink4 intra-node (H100) | ~900 GB/s per GPU | Intra-node only — never crosses a chassis boundary in a standard 8-GPU DGX |
| NVLink5 intra-node (B200) | ~1.8 TB/s per GPU | Intra-node only |
| NVLink domain, GB200 / GB300 NVL72 | ~130 TB/s aggregate, 72 GPUs | Spans up to 18 physical trays within one rack — still NVLink, not the inter-cluster fabric this document routes over |
| ConnectX-7 InfiniBand NDR | 400 Gb/s (~50 GB/s) per GPU/NIC | Inter-node, intra-cluster |
| ConnectX-8 InfiniBand XDR | 800 Gb/s (~100 GB/s) per GPU/NIC | Inter-node, intra-cluster |
| Inter-cluster / inter-site link | Site-dependent — plan for another order of magnitude below intra-cluster | Cross-cluster — carries only router and observability traffic per Appendix A, never GPU-fabric traffic |
On SHARP
NVIDIA's Scalable Hierarchical Aggregation and Reduction Protocol offloads part of a collective all-reduce into the switch ASIC itself, meaningfully reducing the cost of any cross-node TP, PP, or EP collective on a Quantum-2 (NDR) or Quantum-X800 (XDR) fabric. Enable it wherever the fabric supports it — it's a switch and firmware configuration, not a topology change, and one of the cheaper levers available for cross-node parallelism performance.
On scale-up versus scale-out
On a standard 8-GPU DGX node, any hop beyond that node's own GPUs is necessarily a scale-out hop over the ConnectX fabric — there is no other path. On a GB200 or GB300 NVL72 rack, up to 72 GPUs across 18 physical trays share one NVLink scale-up domain, and ConnectX in that architecture carries only the scale-out link beyond the rack. This matters directly for §12: on NVL72-class hardware, “cross-node” TP within one rack is still NVLink-speed, and the boundary this document actually cares about is the edge of the NVLink domain — not the edge of a physical server chassis.
On sub-400G fabrics
If the target fabric is genuinely HDR-generation (200 Gbps) rather than NDR or XDR, treat every cross-node TP recommendation in §12 as unavailable by default. Scale via pipeline, data, or expert parallelism only, and do not extend tensor parallelism past one node without benchmarking first (12.5). 400G+ is the practical floor for this document's cross-node TP guidance — this is also why 10.2 lists it as a load-bearing assumption rather than a preference.
App. CTerminology
Reference only. Nothing in §1–§10 requires any of it.
- TP / PP / DP / EP
- tensor, pipeline, data, and expert parallelism — the four ways a model or its serving load is split across GPUs
- NVLink / NVSwitch
- scale-up GPU interconnect within a node, or, on NVL72-class hardware, within a rack
- InfiniBand / RoCEv2
- scale-out network fabric connecting nodes within a cluster
- SHARP
- Scalable Hierarchical Aggregation and Reduction Protocol — switch-offloaded collective communication
- GCS fault tolerance
- Ray's mechanism for surviving a head-node failure via an externally backed control store
- Fabric Router
- this document's term for the cross-cluster routing control plane (§13)
- Active-active / active-passive
- whether all clusters serve traffic simultaneously, or one stands by unused until called on
- TTFT
- time to first token — how long before a response starts arriving
- TPOT
- time per output token — how fast it streams once started
- KV cache
- the key/value attention state a model server keeps per in-flight request; reusing it across requests with a shared prefix is the largest single win in serving throughput
- mTLS
- mutual TLS — both sides of a connection present a certificate