Reference architectures

We design and build systems like this one. Bring us the constraints and we will size the build.

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.

For decision makers

§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.

For implementers

§11 onward — topology, parallelism strategy, cross-cluster routing, failure behavior, and the appendices that specify all of it precisely enough to build from.

Version
0.1
Fabric clusters
2+, active-active
Hardware target
DGX H100 / H200 / B200-class · 400G+ IB or RoCE
Cross-cluster control
Fabric Router — one entry point, N clusters
Parallelism constraint
TP never leaves a node · nothing crosses a cluster
Author
Stewart Moreland

§ 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 isTwo or more independent GPU inference-fabric clusters, unified behind one routing control plane
Who operates itA GPU platform team, on DGX-class hardware and Kubernetes, per cluster
Core principleNo caller ever addresses a cluster directly; every cluster is built to be indistinguishable from any other
ShapeN independent fabric clusters, one routing control plane that depends on none of them
Parallelism ruleTensor parallelism stays inside one node; nothing — TP, PP, DP, or EP — crosses a cluster boundary
Failure behaviorActive-active by default; losing one cluster reduces capacity, not availability
StatusDesign 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.

The common thread

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.

AreaWhat lives there
People, agents, applicationsEvery caller — an agent platform's model gateway, a direct API consumer, a batch or evaluation job
Fabric RouterThe 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 planeGitOps source of truth, model registry, cross-cluster observability — informs every cluster, sits on no request path
People · Agents · Applications agent model gateways · direct API consumers · batch and eval jobs the one entry point CROSS-CLUSTER CONTROL PLANE Fabric Router health · capacity · KV / prefix affinity hosted on no fabric cluster it routes to Fabric Cluster A active model servers · intra-cluster routing · KV cache · scheduler Fabric Cluster B active model servers · intra-cluster routing · KV cache · scheduler Fabric Cluster C active model servers · intra-cluster routing · KV cache · scheduler N5 denied N5 denied own rack · power · scheduler · cache own rack · power · scheduler · cache own rack · power · scheduler · cache each sized to serve 100% of traffic alone
Figure 1 — The shape of the fabric. Every cluster is a complete, self-sufficient replica of the inference stack. The router is the only component that knows more than one cluster exists; nothing beneath it does — that property, not the diagram, is the architecture. The denied edges are the constraint that keeps N fault domains from collapsing back into one (Appendix A, N5).
Where the engineering detail begins

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 concernArchitecture 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

#InvariantWhat it removes
1No caller addresses a cluster directlyA caller pinned to a dead cluster with no failover path
2Any one cluster can serve 100% of traffic aloneCascading failure when one cluster's capacity is subtracted from the pool
3Model-parallel groups never cross a cluster boundaryA single fabric-wide synchronization stall, or a partial-cluster loss corrupting an in-flight collective
4Health state is derived from GPU signals, not assumed from livenessRouting traffic to a cluster that answers a health check but can't actually serve — driver fault, XID errors, thermal throttle
5Failover is stateless from the router's sideThe 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).

DecisionWhy it mattersPosition
Active-active or active-passive?Cost vs. simplicityActive-active by default
How many clusters, minimum?Blast radius vs. costTwo 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 serveTP 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 complexityNo, by default — opt-in per workload (§14.3)
Per-cluster orchestration?Delivery cost and platform controlKubeRay + Ray Serve LLM, or NVIDIA Dynamo — either satisfies the router's contract (§15)
Cross-cluster routing technology?What infrastructure you already runOpen — 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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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).
What the example demonstrates

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.

ConcernGuaranteeSpecified in
Cluster-loss survivabilityThe loss of any one cluster, up to provisioned headroom, degrades capacity, not availability§11
Maintenance without downtimeDriver, firmware, and model upgrades drain traffic off a cluster before work begins§13
Model-parallel integrityNo tensor-, pipeline-, data-, or expert-parallel group spans a cluster boundary§12
Failover behaviorA caller never errors because the cluster it would have hit is down; it is routed transparently to a healthy one§13
Cache-state honestyThe cost of a cold cache on failover is stated and measured, not hidden as unexplained latency§14
Capacity fairnessNo single workload can consume enough of one cluster's capacity to affect another workload on the same cluster§16
ObservabilityEvery 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

CapabilityPlatform requirement
Multiple fault domainsAt minimum two physically or logically separate racks and power domains; two sites where the target requires it
Cross-cluster routingA control-plane component that is not itself hosted on any single fabric cluster
GPU operations, N timesThe same DGX operations practice as a single cluster, run identically on every cluster
Health signal plumbingGPU-level health surfaced to the router — not inferred from request failures
Capacity headroomN-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

Decide before sizing the router

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 formFits 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 + InferencePoolSidecarless 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 planeFastest 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 gateAdopt 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
Open

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.

Open

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.

Open

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).

Open

4Shared cache tier for specific workloads?

Deferred until a workload with sufficient shared-prefix reuse to justify it actually exists (§14.3).

Open

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.

Open

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.

Part II

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.

ComponentNotes
GPU nodesDGX H100 / H200 / B200-class. NVLink/NVSwitch intra-node; InfiniBand or RoCEv2, 400G+, inter-node — Appendix B
Model serversvLLM (primary), SGLang, or TensorRT-LLM/NIM. Parallelism sized per §12, not by model alone
Per-cluster orchestrationKubeRay (RayService + Ray Serve LLM) or NVIDIA Dynamo — open per §9; router contract identical either way
Intra-cluster routingGateway API Inference Extension: InferencePool + endpoint picker, prefix/KV-cache-aware
Disaggregated servingllm-d or NVIDIA Dynamo — separate prefill/decode pools where traffic shape justifies it (§14)
KV cache tierLMCache or equivalent, CPU RAM / NVMe offload, cluster-local
Gang schedulingLeaderWorkerSet for TP/PP-group placement, topology-aware; Kueue, Volcano, or NVIDIA Grove + KAI Scheduler for the broader job-scheduling layer around it
Weights storeObject store + local NVMe cache, or Lustre/GPFS/WEKA — isolated from the RDMA fabric carrying TP/PP/KV traffic
GPU healthGPU 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

SituationStrategy
Fits on one GPUTP=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 NVLinkPipeline parallelism within the node instead of TP
Dense model larger than one nodeTP = GPUs/node × PP = node count, gang-scheduled within one cluster, never spanning clusters
MoE modelData-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

RequirementKubeRay + Ray Serve LLMNVIDIA Dynamo
Engine flexibilityvLLM primary targetEngine-agnostic — vLLM, TensorRT-LLM, SGLang
Fault toleranceGCS fault tolerance + external HA Redis; mature, well documentedKubernetes-native pod replacement + Grove/KAI Scheduler; newer
DisaggregationSupported via Ray Serve LLM's P/D deployment modeFirst-class — Smart Router, SLO Planner, KV Block Manager, NIXL transport
KV-aware routingBuilt into Ray Serve LLMBuilt into Dynamo's router
Operational maturityLongest track record of the two, broadest communityNewer, NVIDIA-native, tightest fit with DGX-class hardware and SHARP-capable fabrics
Multi-cluster awarenessNone natively — this document's Fabric Router supplies itNone 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

QuestionAnswered 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

SignalSourceAlert on
Cluster health transitionFabric RouterAny transition — logged, not only alerted, so failover frequency is a visible trend
vllm:num_requests_waiting, per clusterEach clusterSustained imbalance across clusters → capacity misrouting, not just per-cluster overload
vllm:gpu_cache_usage_perc, per clusterEach cluster> 0.90 → out-of-memory risk
TTFT / TPOT, p95, per clusterRouter / Inference GatewaySLO breach, and a persistent gap between clusters worth investigating
Failover rateFabric RouterMore than one unplanned failover in a rolling window → treat as an incident, not routing working as designed
Cross-cluster capacity imbalanceRouter + per-cluster metricsSustained skew → rebalance before it becomes a cascading failure if the heavier cluster also fails
The last row is worth acting on before it pages anyone

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.

PathPurpose
Caller → Fabric Router → ClusterNormal-path inference
Caller → Fabric Router → unhealthy cluster skipped → healthy clusterFailover
Platform → Router / clusters → ObservabilityHealth, 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.

#SourceDestinationProto / portAuthN / ZNotes
N1Caller (agent platform gateway, direct API consumer)Fabric RouterHTTPS 443mTLS / API keyOnly entry point into the fabric
N2Fabric RouterCluster inference gateway (per cluster)HTTPS 443mTLSOne edge per healthy cluster; contract in §11.1
N3Fabric RouterCluster health / metrics endpointHTTPS 443mTLSContinuous polling, not on the request path
N4Cluster model serverSame-cluster model server, same cluster onlyRDMA (IB / RoCEv2)Fabric-isolatedTP/PP collectives, KV transfer — never crosses N5
N5Explicitly denied — any cluster-to-cluster GPU-fabric traffic
N6Every clusterCross-cluster observability aggregationOTLP / HTTPSmTLSPull 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

PathTypical bandwidthScope
NVLink4 intra-node (H100)~900 GB/s per GPUIntra-node only — never crosses a chassis boundary in a standard 8-GPU DGX
NVLink5 intra-node (B200)~1.8 TB/s per GPUIntra-node only
NVLink domain, GB200 / GB300 NVL72~130 TB/s aggregate, 72 GPUsSpans up to 18 physical trays within one rack — still NVLink, not the inter-cluster fabric this document routes over
ConnectX-7 InfiniBand NDR400 Gb/s (~50 GB/s) per GPU/NICInter-node, intra-cluster
ConnectX-8 InfiniBand XDR800 Gb/s (~100 GB/s) per GPU/NICInter-node, intra-cluster
Inter-cluster / inter-site linkSite-dependent — plan for another order of magnitude below intra-clusterCross-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

Blueprints are the easy part

Trust zones, tenancy boundaries, and a serving layer you can actually operate — we build these for teams who would rather ship the system than spend a quarter specifying it.