The Definitive Guide toAI Data Centers
Ask the GuideAboutAccount

Chapter 10.2

In this chapter · 7 sections
Term help
Terms in this chapter (54)

Topology-Aware & Rack-Scale Scheduling

For tightly coupled groups, placement sets performance: inside one NVLink domain the job runs at scale-up bandwidth, and split across the boundary it falls off a bandwidth cliff no tuning recovers. Price that loss against the idle capacity that keeps the group local.

ThreadsGoodputPower-boundDensity ramp

What you'll decide here

  1. Allocate by node, subgroup or NVLink domain to fit the job's communication groups; whole-rack reservation is a policy whose unused GPUs still cost money.
  2. How to express topology: Slurm block/segment with the IMEX switch plugin, or Kubernetes ComputeDomains on DRA with clique labels. Who owns the one-ComputeDomain-per-node limit.
  3. Where TP, EP, PP, DP and context-parallel groups cross the fabric, judged by measured collective exposure and the layout's locality constraints.
  4. Fragmentation policy: accept stranded GPUs to keep domains whole, defragment with preemption, or relax locality with segments, and what each costs in goodput versus utilization.
  5. Trust vendor labels and clique IDs, or verify with NCCL/nvbandwidth probes at admission. A mislabeled or degraded link hides a cliff from the scheduler.
One job, two Blackwell placements. Inside the NVLink domain a GPU gets ~0.9 TB/s each way. Scale-out gives ~0.1 TB/s each way on GB300’s 800G ConnectX-8 (~9×), or ~0.05 TB/s on GB200’s 400G ConnectX-7 (~18×). These are nominal endpoint ratios, not job slowdowns, and locality need not mean whole-domain allocation.

Chapter 10.1 described the scheduling plane as the control loop that turns a fleet of accelerators into a service. This chapter covers the hardest constraint that loop has to respect on 2026-era hardware: the network is not flat. Any two GPUs in a modern AI cluster reach each other over one of two very different kinds of path, and the gap between them is about an order of magnitude. NVLink links GPUs at terabytes per second inside a node and, on rack-scale systems, across the whole NVLink domain, as if all of them sat on one giant board. The 2026 volume rack, the GB300 NVL72, keeps the layout of the GB200 NVL72 it replaces: 72 GPUs in 18 compute trays, with 130 TB/s of aggregate NVLink bandwidth shared across them. Once a collective leaves that domain, it drops onto the scale-out fabric, which has its own failure and congestion regime. Each GPU gets an 800G NIC on GB300 (400G on GB200), or 1.6 Tb/s on Vera Rubin. Per GPU, NVLink beats that NIC by roughly an order of magnitude: about 18× on GB200, 9× on GB300 and 7.5× on Vera Rubin. A scheduler that ignores this hierarchy will cheerfully place a tightly coupled job with eight GPUs in one rack and eight in the next. The job runs, at a fraction of its rightful throughput, forever, with no error logged.

Topology-blind versus topology-aware placement is the choice, and choosing blind costs goodput at every step of every job for the life of the run. This chapter walks the bandwidth cliffs and how to discover them. It then covers the two production defenses, Slurm block scheduling with IMEX and Kubernetes ComputeDomains over Dynamic Resource Allocation, how to map a parallelism strategy onto the fabric so the right collectives stay local, and the fragmentation problem that makes the rack, not the node, the natural unit of allocation on rack-scale systems.

Why topology matters: the bandwidth cliffs

Three numbers drive everything in this chapter. NVLink (scale-up, inside the coherent domain): NVLink 5 on Blackwell delivers 1.8 TB/s bidirectional per GPU, and an NVL72 rack aggregates to 130 TB/s. Scale-out NIC (inter-node, over InfiniBand or RoCE Ethernet): GB200 gives each GPU one 400 Gb/s ConnectX-7 path (50 GB/s per direction), and GB300 gives each GPU 800 Gb/s through one ConnectX-8 (100 GB/s per direction), which runs as two 400G planes on Ethernet. Against NVLink 5 at 900 GB/s per direction, the platform-scoped ratio is roughly 18× on GB200 with ConnectX-7 and 9× on GB300 with ConnectX-8. So the most bandwidth-hungry collectives must fit inside the scale-up domain, and the scheduler decides whether they do.

Inside the node sits a third link, the host link from the GPU to its CPU or NIC. On Grace-based GB200 and GB300 superchips, NVLink-C2C connects each GPU to the Grace CPU at 900 GB/s bidirectional. That works out to about 450 GB/s in each direction, about seven times what PCIe Gen5 x16 carries (NVIDIA, August 2025). Each Grace serves two GPUs, so when both spill at the same time they share that one CPU's memory. On x86 HGX nodes such as H100 and B200 the CPU sits behind PCIe Gen5 x16 at ~64 GB/s each way. KV-cache spill and host staging ride this path, so offloading to host memory is a real bottleneck on x86 HGX and much less of one on a Grace-based rack (Chapter 7.8 covers the coherent host link). The NIC hangs off PCIe on both: ConnectX-8 on GB300 has a PCIe Gen6 x16 host interface, ~128 GB/s each way.

Bandwidth does not degrade gracefully as a job spreads. It steps down abruptly at each boundary. A tensor-parallel all-reduce that fits in one NVLink domain runs at NVLink speed. Split 8-and-8 across two domains, the same all-reduce runs at NIC speed for the cross-domain portion and stalls every other rank waiting on it. NVIDIA's own Slurm guidance says that when a job crosses the NVLink-domain boundary, performance "drops sharply", which is why the block plugin treats the domain as a hard constraint rather than a best-effort preference. The failure is silent: the job completes, the loss curve descends and nothing alarms, but step time rises by whatever share of the cross-domain collective cannot be overlapped with compute, and that loss compounds across the entire run. Before you set a locality policy, measure that loss: run the same step on an in-domain placement and on a split one.

Discovery: how the scheduler learns the fabric

A scheduler can only defend a topology it can see, and discovery is where most topology-aware deployments fail without anyone noticing. There are two postures, and choosing between them is a trust decision. Trusted discovery reads the fabric from labels the platform asserts. NVIDIA exposes an NVLink clique identifier (the nvidia.com/gpu.clique node label in Kubernetes, or equivalent block definitions in Slurm's topology.yaml) that tells the scheduler which nodes share a coherent NVLink partition. PCIe and NUMA affinity come from the driver and from the node's hardware topology. Scale-out topology (which leaf switch a node hangs off, which rail a NIC belongs to) comes from cabling databases, LLDP, or a topology file the operator maintains. Trusted discovery is fast, and it is how production schedulers run day to day.

Verified discovery distrusts the labels and measures. At node admission and after every repair, run point-to-point bandwidth probes (nvbandwidth, NCCL all-reduce and all-gather benchmarks, p2pBandwidthLatencyTest) and compare the results with the expected matrix for the asserted topology. The labels can be right while the physical link is degraded: a marginal NVLink lane that has fallen back to a lower width, a transceiver running hot, a badly seated cable. The label still says "one clique, full bandwidth" while the hardware delivers half, and a scheduler that trusts it places a tightly coupled job onto a cliff it believes isn't there. Gate nodes into the schedulable pool only after they pass the bandwidth matrix, not merely after they boot, so topology-label drift cannot eat your fleet's goodput. Chapter 10.5 lists the NVLink bandwidth gate among its acceptance tests. Rerun it after every repair, before the node clears the return-to-service step in Chapter 10.7; the scheduler acts on the result.

The interconnect hierarchy a scheduler must respect
TierReachNominal bandwidth (endpoint or aggregate)What rides itScheduling implication
NVLink (scale-up)Within the coherent NVLink domain (node → NVL72 rack)~1.8 TB/s bidirectional (~900 GB/s per direction; NVLink 5); 130 TB/s aggregate per NVL72TP and EP all-reduce / all-to-all; KV-cache over NVLinkKeep each required group inside one NVLink domain; smaller allocations are still valid.
Host link (NVLink-C2C or PCIe)GPU ↔ CPU / GPU ↔ NIC inside a nodeNVLink-C2C ~900 GB/s bidirectional (~450 GB/s each way) on Grace-based GB200/GB300; PCIe Gen5 x16 ~64 GB/s each way on x86 HGX; NIC on PCIe (Gen6 x16 for ConnectX-8)Host staging, GPUDirect setup, KV spill to hostNUMA/PCIe affinity: pin GPU to its local NIC and CPU socket; on x86 HGX, size KV spill against PCIe
Scale-out NIC (inter-node)Across the back-end fabric (IB / RoCE), domain to domain~50 GB/s per direction per GPU on GB200 with 400G ConnectX-7; ~100 GB/s per direction per GPU on GB300 with 800G ConnectX-8Data-parallel all-reduce; pipeline-stage point-to-pointDP and PP, or cross-node EP where measured traffic and overlap meet the workload's requirement. Honor rail alignment, leaf locality and each group’s declared boundary
Per-GPU bandwidths are Blackwell reference points that change with the platform version; see the key numbers for sources and dates. The scheduling implication column is the one to act on.

Slurm block scheduling: the NVLink domain as a locality unit

Slurm is an established scheduler for large training fleets, and its answer to rack-scale topology is block scheduling (the topology/block plugin, hardened for NVL72 in 2025). You declare in topology.yaml that a set of nodes forms a block matching one NVLink domain. For the cited GB200 NVL72 profile that is 18 four-GPU compute nodes carrying 72 GPUs. The scheduler then uses the block as a locality unit, and locality does not require reserving every GPU in it. A job requesting up to 18 nodes is consolidated into a single block, provided the required TP/EP groups are mapped within that block and the selected allocation policy preserves their locality. A job larger than one block is kept within the smallest group of blocks that holds it rather than smeared arbitrarily, so cross-domain traffic stays confined to the parallelism dimensions that tolerate scale-out bandwidth.

Two refinements make this practical rather than rigid. The --segment argument lets a user declare the atomic group size the job needs. For example, --segment=4 lets a 12-node job be split into three 4-node segments that the scheduler can pack flexibly across blocks while each segment keeps its locality. This is the release valve for fragmentation: instead of demanding one contiguous 12-node hole, the scheduler can fill three smaller holes and lift utilization without abandoning topology. The second refinement is the switch/nvidia_imex plugin (Slurm 24.05+), which manages IMEX channels, the driver-level memory-export/import access control that lets GPUs in a multi-node NVLink domain address each other's memory. Slurm provisions and tears down the IMEX channel per job, so authorized memory import and export follow the job. Verify isolation with your exact driver and job teardown rather than treating channel provisioning as whole-platform security. Block scheduling without IMEX management is a security and correctness gap on shared NVL72 hardware, not merely a tuning omission.

Deep dive: what topology.yaml encodes, and why segments beat raw node requests

The topology.yaml file is the scheduler's map of the bandwidth cliffs. For a two-rack NVL72 cluster it declares two blocks, say block01 and block02, each binding a named range of 18 nodes to a block size of 18. That declaration changes the scheduler's question from "find me 16 free nodes anywhere" to "find me 16 free nodes in one NVLink domain, and if the job is bigger than a domain, use as few domains as will hold it." The plugin arrived in Slurm 23.11. The --segment flag followed in 24.05, and topology.yaml with per-partition topologies in 25.05; earlier releases use topology.conf. The plugin matured for rack-scale systems through 2025 and enforces locality as a hard constraint. A job that fits in one block stays in it. A larger job lands in the smallest aggregated block level that can hold it and is best-fitted onto base blocks. Slurm 25.11 added --consolidate-segments and --spread-segments, which control how segments are placed.

Segments matter because they separate locality from contiguity. A naive topology scheduler places a job only if it can find one contiguous hole large enough, which on a busy fleet strands capacity because the holes are the wrong shape. With segments, the user tells the scheduler "my job needs groups of N that each stay NVLink-local, but the groups themselves can be anywhere." A 12-node job with --segment=4 becomes three independent 4-node locality requirements, far easier to satisfy from a fragmented fleet than one 12-node block. The cost is that cross-segment traffic now rides scale-out, so request segments smaller than your job only when the parallelism crossing the segment boundary (typically DP or PP) can tolerate it. Choosing the segment size is choosing which parallelism dimension you push onto the scale-out fabric, so it is a mapping decision, not merely a scheduler flag. See the parallelism mapping below, and the oversubscription budget in Chapter 8.5.

Kubernetes: ComputeDomains, DRA, and the one-domain-per-node limit

Kubernetes arrived at rack-scale topology from the opposite direction. Its original device-plugin model exposed a GPU as a flat, countable, location-free resource, nvidia.com/gpu: 8, which alone does not express cross-node NVLink domain membership. The fix is Dynamic Resource Allocation (DRA), the API that lets a workload request a structured, parameterized resource instead of an opaque count. NVIDIA's DRA driver adds the ComputeDomain abstraction on top. A ComputeDomain represents reachability between the distributed workers of a multi-node job: when its pods are scheduled, the platform dynamically creates the IMEX domain that lets those pods' GPUs address one another's memory over NVLink, and tears it down when the job ends. The IMEX channel surfaces inside each container as a device file, so CUDA or NCCL can use the authorized memory-export path; device preparation and a real transfer still have to pass. All of that describes the default, driver-managed mode. The same driver, now a Kubernetes SIGs project (kubernetes-sigs/dra-driver-nvidia-gpu, v0.5.x), has a second, host-managed mode. It sits behind the HostManagedIMEXDaemon feature gate and relies on an IMEX service that runs permanently on the host. Every ComputeDomain on that host IMEX domain shares channel 0, so this mode isolates domains and nothing finer, and a Ready ComputeDomain says nothing about the host service's health. Find out which mode your cluster runs before you count on per-job memory-import isolation when co-tenant jobs share an NVLink domain.

Two constraints shape the design. First, placement still needs an affinity rule: pods must be steered onto nodes that share an NVLink partition by matching the nvidia.com/gpu.clique node label, or the ComputeDomain spans a boundary it cannot bridge. The clique label is the Kubernetes analogue of the Slurm block. Second, and this is the sharp edge of the 2026 implementation, the deployed ComputeDomain driver can impose one domain per node. That is an allocation constraint, not the number of channels IMEX can represent. If a ComputeDomain claims only part of a node's GPUs, the remaining GPUs on that node cannot join a different ComputeDomain. This can favor whole-node allocation when different jobs need different domains, but it does not require reserving the whole rack. Record domain ownership separately from the GPU count reserved and billed. The two install paths have different floors. The standalone DRA driver runs ComputeDomains on Kubernetes 1.32 or later, with the DynamicResourceAllocation feature gate switched on for 1.32 and 1.33 (on by default from 1.34). The NVIDIA GPU Operator 26.7 managed workflow requires Kubernetes ≥1.34.2, NVIDIA driver R580+, CDI and a fresh GPUCluster installation without ClusterPolicy, and it offers no in-place migration from standalone DRA. ComputeDomains additionally require supported Multi-Node NVLink hardware and correctly owned IMEX services. If node preparation cannot be confirmed, admission is blocked; nothing falls back on an assumption.

Decision fork: Slurm block scheduling vs Kubernetes ComputeDomains for rack-scale jobs
DimensionSlurm block schedulingKubernetes + ComputeDomains (DRA)
Topology unitBlock in topology.yaml = one NVLink domain (18 nodes / 72 GPUs)ComputeDomain over nodes sharing the gpu.clique label
Locality enforcementHard constraint; --segment relaxes contiguity, not localityPod affinity on gpu.clique; scheduler must keep pods in-partition
IMEX managementswitch/nvidia_imex plugin provisions channel per jobIMEX domain created/torn down dynamically per ComputeDomain
Partial-node sharingSupported within a node; gang semantics per jobLimited: each node serves one ComputeDomain, so a partial claim strands the node's remaining GPUs for every other ComputeDomain
Native gang schedulingYes — all-or-nothing allocation is intrinsicNeeds a gang-aware scheduler (KAI, Volcano), or Kueue admitting all-or-nothing with Topology Aware Scheduling, layered on DRA
Best fitLarge synchronous training; HPC-heritage fleetsMixed train+serve estates; cloud-native, multi-tenant platforms
Both are valid in 2026, and the choice usually follows the existing control plane: an HPC-heritage training fleet or a cloud-native platform. Slurm-on-Kubernetes convergence is blurring the line; see Chapter 10.1.

Mapping parallelism onto the fabric

Topology-aware scheduling is half the bargain. The other half is the job declaring its parallelism so the scheduler can put each dimension on the right tier. 3D (and 4D) parallelism uses four collective patterns with very different bandwidth appetites, and the art is matching appetite to tier. Tensor parallelism (TP) all-reduces activations on every layer. It is the most bandwidth-hungry pattern and must live inside the NVLink domain. Expert parallelism (EP) for MoE models does all-to-all token routing. Wide EP (EP32 and beyond) is exactly what a 72-GPU NVLink domain unlocks, because the all-to-all stays on NVLink instead of hitting the scale-out fabric. Pipeline parallelism (PP) passes activations point to point between stages: low volume, latency-sensitive, and tolerant of crossing the domain boundary. Data parallelism (DP) all-reduces gradients once per step: high volume but infrequent and overlappable, so it is the canonical dimension to push onto scale-out.

The default rule that follows is TP and EP inside the scale-up domain; PP and DP across the scale-out fabric. For EP this is a preference, not a law. DeepSeek-V3 trained with 64-way expert parallelism across eight H800 nodes over InfiniBand, using node-limited routing and communication/compute overlap to keep the all-to-all off the critical path. Judge cross-node EP on measured routing volume, expert placement, overlap and available network bandwidth rather than ruling it out. A correctly mapped GB300 NVL72 job fits TP+EP within the 72-GPU domain, runs PP across racks, and lets DP all-reduce ride the rail-optimized fat-tree, where SHARP in-network reduction can absorb it. VR200 NVL72, shipping since June 2026, keeps that 72-GPU domain at higher scale-up bandwidth. Rubin Ultra Kyber (NVIDIA targets H2 2027; SemiAnalysis reported 2028 in July 2026) widens the domain itself. So the TP/EP fit is a mapping you recheck each generation, not a constant. Get the mapping backwards, with DP inside the domain and TP across racks, and you have inverted the bandwidth hierarchy: the cheap-to-cross dimension hogs NVLink while the expensive-to-cross dimension chokes on NIC bandwidth. That is why the scheduler needs the parallelism shape and not just a node count, so block and segment sizes line up with the TP/EP group instead of slicing through it. The framework that emits this shape is the subject of Chapter 10.8, and the fabric that carries it is Chapter 8.5.

72 GPUs / 130 TB/s
GB200 NVL72 scale-up domain; topology membership does not require whole-domain allocation
1.8 TB/s bidirectional (~0.9 TB/s per direction)
NVLink 5 nominal per-GPU bandwidth, bidirectional; one direction is half this value
Scope & caveats

Named NVIDIA generation/platform, bidirectional aggregate convention; not delivered collective bandwidth, cache coherence or arbitrary mixed-platform performance.

~18× GB200 / ~9× GB300derived
NVLink 5 per direction (900 GB/s) versus per-GPU scale-out: ~18× GB200 (400G ConnectX-7), ~9× GB300 (800G ConnectX-8)
Scope & caveats

Blackwell values retained at their historical date. Vera Rubin NVLink 6 calculation, kept separate: 1,500/200 = 7.5 (3.0 TB/s bidirectional = 1,500 GB/s each way; 1,600 Gb/s = 200 GB/s one way).

18 nodes
GB200 example: 18 four-GPU nodes per NVL72 block in topology.yaml
Scope & caveats

GB200 NVL72 with 18 four-GPU compute trays. Other NVL72 generations and partial racks declare their own block size.

1 / node
Kubernetes DRA driver allows one ComputeDomain per node, so a second domain cannot use that node's leftover GPUs
Scope & caveats

A driver-imposed allocation constraint of one ComputeDomain per node, not a count of the channels the IMEX service can represent. NVIDIA described it in November 2025 as a current limitation with removal planned. The kubernetes-sigs DRA driver v0.5.x docs do not restate it (checked 2026-10-16). Check the driver release you deploy.

K8s 1.32+
Standalone DRA driver path for ComputeDomains needs Kubernetes 1.32+, with the DRA feature gate enabled on 1.32 and 1.33
Scope & caveats

Standalone DRA driver path. The GPU Operator 26.7 managed workflow has a higher minimum, covered in the GPU Operator 26.7 prerequisites.

8.4% (10.0% incl. NIC)
Llama 3 interruptions from network faults: switch/cable 8.4%, 10.0% including NIC
Scope & caveats

Table 5 is internally inconsistent: its 17 listed counts sum to 417 although §3.3.4 states 419 unexpected interruptions; printed percentages sum to 94.4%; and 148/419 = 35.3%, not the printed 30.1%. Treat counts as auditable; label percentages as paper-printed. Network Switch/Cable is 35 (8.4% printed); NIC is classified Host and NCCL watchdog timeouts Unknown.

Fragmentation and the NVLink domain as the placement unit

Topology awareness creates a tension that flat scheduling never has: the better you defend locality, the worse your bin-packing gets. If a job can only land inside one NVLink domain, a domain with 6 of 72 GPUs busy has 66 GPUs that are useless to any job needing more than 66 NVLink-local. They are stranded by fragmentation, not by lack of capacity. Flat schedulers never see this because they place a job anywhere; they pay in silent cliffs instead. Topology schedulers make the fragmentation visible and force a policy choice.

There are three levers, and a 2026 fleet uses all three. Accept the strand: keep domains whole, leave the 66 GPUs idle until a job that wants them arrives, and price the lost utilization as the cost of full-bandwidth placement. That is the right call when goodput per job dominates, as in large training. Defragment: use preemption and migration to compact small jobs out of partially used domains and free whole domains for large ones. It works, but it is expensive on synchronous jobs because preemption forces a checkpoint and restart. Kubernetes adds a trap here. NVIDIA's GPU Operator 26.7 documentation lists a limitation: Kubernetes cannot preempt for DRA resources, so a higher-priority pod in kube-scheduler will not evict a lower-priority one to free a DRA GPU claim. On a ComputeDomain platform, compaction has to come from the batch layer evicting whole workloads (Kueue preemption is one example) or from an explicit drain. Confirm that your batch scheduler actually handles DRA claims before you plan around it. Relax locality with segments: let jobs declare smaller atomic groups (Slurm --segment, or sizing the ComputeDomain below a full rack) so they fit the holes you have, and accept scale-out traffic across the segment boundary. In Kueue, the equivalent of Slurm --segment is a slice annotation, which sets a required topology for each slice of N pods.

On rack-scale hardware the rack, meaning the NVLink domain, becomes the natural unit of allocation, not the GPU and not the node. Placement is what wants the domain as its unit. Any policy that subdivides one has to reckon with the one-ComputeDomain-per-node limit, the bandwidth cliff and the fragmentation it creates. Billing, drain and repair units are separate decisions. A job that fits inside a domain can take a subset of its nodes, and NVIDIA's own GB200 block-scheduling guidance places eight- and twelve-node jobs inside a single block. Reserve and price a whole rack where a workload or a capacity guarantee needs the whole rack, not by default.

Deep dive: why discovery errors are worse than placement errors

A placement error, putting a job on a cliff, is at least diagnosable: the bandwidth is wrong, a benchmark reveals it, and a better policy fixes the next run. A discovery error is worse, because it makes the scheduler confidently wrong. Suppose a node's gpu.clique label or Slurm block assignment says it shares an NVLink domain with neighbors it does not reach at full bandwidth, because of a degraded NVLink lane that fell back to half width, a partially seated backplane connector or a transceiver throttling on heat. The scheduler then places a tightly coupled job into what it believes is one coherent domain, and the job runs on a hidden cliff that no policy can see. The scheduler did everything right against a wrong map.

That is why 2026 practice is to verify the topology before trusting it, and to make the schedulable pool a function of measured bandwidth, not asserted labels. At admission and after every repair, run an NCCL all-reduce or nvbandwidth probe across the asserted domain and compare it with the expected matrix. If any link falls below threshold, mark the node degraded and take it out of the scheduler's trusted topology, even if it boots and passes basic health checks. On Kubernetes 1.37+, where DRA device taints became stable, you can publish that verdict as a taint. Either the driver or a DeviceTaintRule taints the degraded GPU so new claims skip it. A taint with an eviction effect also evicts running pods already using the tainted device if their claims lack a matching toleration. The effect is to quarantine one device without cordoning the node or touching the clique label.

The Meta figure in the key numbers shows the fabric is a real source of failures. Meta's Llama 3 405B run logged 419 unexpected interruptions. Switch and cable faults caused 35 of them (8.4%), or about 10% if NIC faults are counted. Meta does not report how many of those started as degraded links that the control plane still trusted. No admission or post-repair probe can stop a link from failing mid-run. What probes do is keep a degraded or badly repaired link from rejoining the topology the scheduler trusts. The scheduler is only as good as its map, so measure the map instead of declaring it. The NVLink bandwidth gate is part of the acceptance tests in Chapter 10.5; quarantine, repair and return to service are in Chapter 10.7.

Anti-patterns

The same mistakes recur because each one treats the GPU as fungible when the fabric says it is not:

  • Flat scheduling on rack-scale hardware. Exposing nvidia.com/gpu: 8 with no clique or block awareness, then wondering why a 16-GPU job that landed 8-and-8 across two racks takes noticeably longer per step than the same job inside one domain. The hardware is non-blocking inside the domain and an order of magnitude slower across it, and a location-free resource model cannot see the difference, so it cannot avoid the cliff.
  • Topology without gang scheduling. Placing the right pods on the right nodes but admitting them incrementally, so synchronous jobs deadlock holding partial allocations. Locality and all-or-nothing admission are a pair; shipping one without the other trades a silent cliff for an outright stall.
  • Inverted parallelism mapping. Putting data-parallel all-reduce inside the NVLink domain and tensor-parallel across racks spends the scarcest bandwidth on the dimension that least needs it. Follow the appetite: TP/EP local, PP/DP remote.
  • Trusting labels over measurements. Letting a node into the schedulable pool because it booted and its clique label is present, without verifying the NVLink bandwidth matrix, and so placing jobs onto a degraded domain the scheduler believes is healthy.
  • Subdividing domains under the one-ComputeDomain-per-node limit. Designing a Kubernetes multi-tenant scheme that hands partial nodes to distinct ComputeDomains, then discovering that the one-ComputeDomain-per-node constraint strands the remaining GPUs. On rack-scale NVLink hardware, align allocations to domain boundaries and keep each ComputeDomain whole at node granularity. Sell and bill the whole rack only where the workload or the capacity guarantee requires it.

Reserve the scale-up domain when the job’s measured TP/EP communication needs it; otherwise pack compatible jobs within your isolation and SLO limits. Reserving every rack wastes paid capacity, while splitting the wrong collective buys nominal utilization at the price of a longer completion time. Keep the rank map and the measured crossover beside the allocation policy.

This chapter sits inside the scheduling plane defined in Chapter 10.1 and feeds the multi-tenancy and isolation policy of Chapter 10.3, where the fragmentation-versus-utilization fork becomes a fairness and quota question. The fabric chapters engineer the cliffs it defends: scale-out topology, sizing and oversubscription in Chapter 8.5, transport and protocols in Chapter 8.4, and the congestion control that governs cross-domain traffic in Chapter 8.6. The parallelism strategy the scheduler must be told about belongs to Chapter 10.8. The acceptance gates that verify NVLink bandwidth before a node joins the pool are in Chapter 10.5, goodput telemetry in Chapter 10.6, and fault domains, quarantine and recovery in Chapter 10.7. The goodput-versus-availability reframe behind the whole fragmentation trade is in Chapter 12.2. Chapter 1.2 explains why training is the archetype that most rewards full-bandwidth placement.
Cite this chapter
Fehn, J. (2026). Topology-Aware & Rack-Scale Scheduling (Chapter 10.2). The Definitive Guide to AI Data Centers. https://aidatacenterguide.com/part-10-software-orchestration-and-service-delivery/10-2-topology-aware-and-rack-scale-scheduling (accessed 2026-10-25).
@misc{aidc-10-2,
  author       = {Fehn, Jacob},
  title        = {Topology-Aware & Rack-Scale Scheduling (Chapter 10.2)},
  howpublished = {The Definitive Guide to AI Data Centers},
  year         = {2026},
  url          = {https://aidatacenterguide.com/part-10-software-orchestration-and-service-delivery/10-2-topology-aware-and-rack-scale-scheduling},
  note         = {Accessed 2026-10-25}
}
Spotted an error? Suggest an edit