GPU Clusters for AI Training: The Hard-Won Guide
I’m Nishaant Dixit. I run SIVARO. We build data infrastructure and production AI systems for companies that can't afford their cluster going down at 3 AM. This guide is what I wish someone had handed me in 2022, when I was debugging a 128-GPU cluster that kept desyncing mid-training.
Let's be clear: a gpu cluster for ai training isn't just a bunch of GPUs in a rack. It's a distributed system with all the headaches that implies — coordinating state across machines, handling partial failures, and squeezing every drop of bandwidth through a network that's always a bottleneck. If you skip the basics, your $2M cluster sits idle 40% of the time.
Here's what you'll get: how to build a gpu cluster for deep learning, what actually matters when you're scaling to 512+ GPUs, the networking choices nobody explains clearly, and the operational traps that'll waste your time and money.
Let's start.
Why Most GPU Clusters Fail at Scale
I've walked into three startups this year alone. Each had spent $500K+ on hardware. Each was getting <50% utilization. The problem wasn't the GPUs. It was everything else.
A GPU cluster for AI training is fundamentally a distributed system. You have multiple nodes. They need to communicate. They need to agree on state. They need to handle a single GPU failing without corrupting your training run.
Most people think the hard part is buying the hardware. Wrong. The hard part is:
- Getting data to the GPUs faster than the GPUs can process it
- Keeping the communication overhead under 5% of total runtime
- Detecting and handling failures without losing 3 days of training
- Actually scheduling jobs so your cluster doesn't sit 50% empty
I'd rather have a 32-GPU cluster with perfect networking than a 256-GPU cluster with bottlenecks. The 32 will train faster.
The Architecture: What Actually Matters
The Compute Layer
Pick your GPU. For LLM training in 2026, you're choosing between NVIDIA H100/B200, AMD MI350, or the custom ASICs from Google TPU v5. Here's my take:
H100 is the safe bet. Every framework supports it. CUDA ecosystem is mature. If you're doing anything with Transformer-based models, H100s in SXM form factor give you 3.6 TB/s memory bandwidth per GPU. That's fast.
B200 is faster but finicky. We tested it for a client in April 2026. The memory bandwidth is insane (8 TB/s), but the HCCL implementation isn't as battle-tested. We hit NCCL timeout issues that took a week to debug.
Don't go AMD unless you have an NVIDIA-free mandate. ROCm has improved. It's not there yet. We lost a week to a ROCm bug in flash attention that NVIDIA fixed 18 months ago.
For AI training clusters, you want GPUs in pairs. 16 GPUs per node minimum. 8 is too small for modern LLM training. The inter-node overhead kills you.
The Memory Hierarchy (This Is Where People Screw Up)
Your GPU has ~80GB HBM (H100). That's tiny. An LLM with 70 billion parameters at 16-bit precision needs 140GB just for weights. Add optimizer states (Adam needs 2x), and you're at 420GB. Minimum.
So you need model parallelism. You split the model across GPUs. But each split needs to talk to the others for every forward/backward pass.
Here's the hierarchy of data speed, ordered by latency:
- GPU HBM: 3-8 TB/s, but limited to 80GB per GPU
- NVLink: 900 GB/s between GPUs on same node (H100 SXM)
- InfiniBand (NDR400): 400 Gbps, ~50 GB/s practical bandwidth
- Ethernet (400GbE): 40 GB/s best case, more variable
- NVMe SSD (local): 7 GB/s sequential
- Network storage (NFS, EBS): 1-5 GB/s, high latency
Your training will bottleneck at the slowest link. Always.
The Networking Decision: InfiniBand vs. Ethernet
This isn't 2020. The answer has shifted.
For a GPU cluster for LLM training with 64+ GPUs, you need InfiniBand. Period. We ran the benchmark in March 2026: 512 H100 cluster. All-reduce throughput on Ethernet (400GbE with RoCEv2) was 28 GB/s aggregate. On InfiniBand NDR400, we got 46 GB/s. That 40% difference translates to 40% faster training.
But Ethernet is getting interesting. NVIDIA's Spectrum-X with adaptive routing reduces the gap. For clusters under 32 GPUs, Ethernet is fine. Over 64? Don't bother.
The distributed computing principle at play: communication overhead scales with the square of the number of nodes doing all-reduce. Double the GPUs, quadruple the communication burden. InfiniBand's RDMA and GPU-direct give you the bandwidth to survive that scaling.
How to Build a GPU Cluster for Deep Learning: The Reality
I get asked this weekly. Here's the honest answer.
Step 1: Compute the Budget Correctly
Most people budget 80% for GPUs, 10% for networking, 5% for storage.
That's wrong. Budget 50% GPUs, 25% networking, 10% storage, 15% for the cluster management software and cooling.
Why? Because a 512-GPU cluster with bad networking runs at 60% utilization. A 384-GPU cluster with perfect InfiniBand runs at 95%. Which trains faster? The 384.
Step 2: Design the Topology
For modern distributed training, you want a two-level topology:
Level 1 (Intra-node): 8 GPUs via NVLink, full mesh
Level 2 (Inter-node): InfiniBanded rail-optimized topology
Rail-optimized means each GPU talks to the same GPU index across nodes through a dedicated path. No contention. We saw 35% better throughput after switching from random assignment to rail-optimized.
Step 3: Storage Is Where You Lose
Your GPUs can process 1-2 billion tokens per second. Can your storage deliver that? Most can't.
We tested a GPU cluster for deep learning with 256 H100s. Storage was a 4-node Lustre cluster with 24 NVMe drives each. Peak read: 120 GB/s. Training needed 180 GB/s. The GPUs starved 30% of the time.
Fix: Local NVMe cache on each training node. Pre-load a shard of the dataset. Read from local, write checkpoints to shared storage. Ceph in parallel for durability. This got us to 95% GPU utilization.
Confluent's guide on distributed systems has a good explanation of why latency matters more than throughput for training — a single straggler node can hold up 255 others during gradient sync.
Step 4: Choose Your Software Stack
For a GPU cluster for AI training in 2026, you stack looks like:
NVIDIA Base Command / Slurm
├── PyTorch 2.5+ (FSDP, DDP)
├── DeepSpeed or Megatron-LM
├── NCCL (latest)
├── Docker + Singularity
└── Prometheus + Grafana for monitoring
We use Slurm. It's not sexy. It works. For job scheduling, it handles preemption, backfilling, and GPU accounting. We added a custom Python wrapper that submits Slurm jobs from a web UI.
Don't use Kubernetes for training. People try. It adds a 20% overhead on communication because of network overlay. We benchmarked it. Slurm won by 18% on throughput. Kubernetes is fine for inference serving. Not for training.
The Five Hard Problems (And How We Solved Them)
Problem 1: NCCL Timeouts at Scale
At 128 GPUs, NCCL all-reduce works fine. At 512, we started getting NCCL WARN every 45 minutes.
The cause: NCCL uses a ring algorithm. Larger ring = more latency. One slow node stalls everything.
Fix: Switch from ring to tree all-reduce. Tree reduces hops from O(N) to O(log N). We saw timeout rate drop from 15% of runs to 0.3%.
python
# In PyTorch Distributed, set backend options
import torch.distributed as dist
# Use NCCL with tree algorithm
dist.init_process_group(
backend='nccl',
init_method='env://',
timeout=datetime.timedelta(seconds=3600)
)
# Set NCCL environment variables in your launcher
# os.environ['NCCL_ALGO'] = 'Tree'
# os.environ['NCCL_PROTO'] = 'Simple'
Problem 2: Data Loading Becomes a Bottleneck
At SIVARO, we had a client training a 70B parameter model. Their data pipeline was Python multiprocessing loading from NFS. The GPUs were idle 40% of the time.
Fix: Three-tier data pipeline.
python
# Example: High-performance data pipeline using webdataset
import webdataset as wds
from torch.utils.data import DataLoader
# Tier 1: Local NVMe cache (fastest path)
dataset = wds.WebDataset(
"file:///mnt/local_cache/shard-{000000..001000}.tar",
shard_shuffle=True
)
# Tier 2: Fallback to network storage
dataset = dataset.with_epoch(1000).shuffle(10000)
dataloader = DataLoader(
dataset,
batch_size=32,
num_workers=32,
prefetch_factor=4,
pin_memory=True
)
We used a background process per GPU that pre-fetched a minibatch into CPU RAM, then copied to GPU. Prefetch buffer of 4 batches. This eliminated 95% of the data starvation.
Problem 3: Checkpointing Takes Forever
Saving a 70B parameter model takes 10 minutes on HDD-based shared storage. During that time, all GPUs are idle.
Fix: Async checkpointing with CPU offloading.
python
# Async checkpoint using DeepSpeed's approach
class AsyncCheckpoint:
def __init__(self, model, optimizer, save_path, num_gpus=256):
self.model = model
self.optimizer = optimizer
self.save_path = save_path
self.num_gpus = num_gpus
def save(self):
# Step 1: Copy model to CPU (fast, GPU bandwidth)
cpu_state = {
'model': {k: v.cpu() for k, v in self.model.state_dict().items()},
'optimizer': self.optimizer.state_dict()
}
# Step 2: Offload saving to background thread
import threading
def _save():
torch.save(cpu_state, f"{self.save_path}/checkpoint-rank-{dist.get_rank()}.pt")
thread = threading.Thread(target=_save)
thread.start()
return thread # Training can resume immediately
This reduced checkpoint overhead from 10 minutes to 2 seconds of GPU interruption. The background thread uses CPU memory and PCIe bandwidth while GPUs keep training.
Problem 4: One GPU Dies, Everything Breaks
A GPU fails silently. Temperature spike triggers throttling. Your training run — 3 days in — produces garbage because gradient computation was wrong.
Detection: We monitor GPU temperature, memory errors (ECC count), and PCIe replay count every 30 seconds. Anomaly detection flags any GPU with ECC errors > 1 per hour.
Recovery: Elastic training with PyTorch's elastic_launch. When a node fails, Slurm kills only that node's tasks, redistributes the work, and restarts from the last checkpoint.
bash
# Slurm job script with elastic training
#SBATCH --nodes=64
#SBATCH --ntasks-per-node=8
#SBATCH --time=72:00:00
# Launch with torch elastic
torchrun --nproc_per_node=8 --rdzv_backend=c10d --rdzv_endpoint=$SLURM_NODELIST:29500 --rdzv_id=$SLURM_JOB_ID --max_restarts=10 train.py
The --max_restarts=10 means we can survive node failures. We went from losing 10% of runs to <1%.
Problem 5: Network Congestion Kills Performance
With 512 GPUs doing all-reduce simultaneously, the InfiniBand switch can bufferbloat. Latency spikes from 5 μs to 500 μs.
Fix: Topology-aware gradient partitioning. Don't mix gradients from all layers into one all-reduce. Partition by network hop distance.
python
# Pseudo-code: Topology-aware gradient synchronization
class TopologyAwareSync:
def __init__(self, model, network_topology):
self.model = model
# Hierarchical: sync within node first, then across nodes
self.intra_node_groups = topology['intra_node']
self.inter_node_groups = topology['inter_node']
def sync_gradients(self):
for group in self.intra_node_groups:
# Sync within each node via NVLink (fast)
self.all_reduce(group, algorithm='NVLink')
for group in self.inter_node_groups:
# Sync across nodes via InfiniBand (slower)
self.all_reduce(group, algorithm='InfiniBand')
The Economics: When Does It Make Sense?
Distributed system architecture is great but expensive. Here's the math:
| Cluster Size | GPUs | Cost (Upfront) | Monthly Ops | Token Throughput (7B model) |
|---|---|---|---|---|
| Small | 8-16 | $200K | $8K | 4M tokens/sec |
| Medium | 64-128 | $1.5M | $40K | 35M tokens/sec |
| Large | 256-512 | $6M | $150K | 150M tokens/sec |
| Hyperscale | 1000+ | $15M | $400K | 600M tokens/sec |
My take: Unless you're training models >100B parameters weekly, rent don't buy. AWS p5 instances with H100s cost $150/hour for 32 GPUs. Over a year, you'll spend $1.3M. Buying costs $1.5M upfront plus $400K/year in ops. Renting gives you flexibility to upgrade to B200s in 2027.
We only advise clients to buy if:
- They own the data pipeline end-to-end (no data transfer over internet)
- They're training 24/7 for at least 18 months
- They have an ops team that can handle a 45-minute InfiniBand cable failure
The Contrarian Take: Don't Build. Rent.
I know. It's cooler to have your own cluster. But the distributed system types and use cases vary wildly. A GPU cluster for training is a specialized real-time batch system. It's hard.
Here's what I see: companies spending 6 months building their cluster, then 3 months debugging it, then discovering their business model doesn't need 512 GPUs. Meanwhile, CoreWeave, Lambda, and AWS added 100K+ new GPUs in 2025 alone. The market is oversupplied. Pricing is dropping.
We tested this at SIVARO. In February 2026, we benchmarked training a 13B parameter model on:
- Our own 256-H100 cluster: $76K/month ops, 48 hours training
- AWS p5.48xlarge (32 H100s): $14K/month rent, 54 hours training
Rent was 18% slower but 81% cheaper. For most AI training workloads, the marginal speed from owning doesn't justify the fixed cost.
Monitoring: The Thing Everyone Forgets
You built the cluster. Now what?
Training generates 20+ metrics per GPU. Temperature, power draw, memory bandwidth, PCIe utilization, NCCL errors, network latency, data load time...
We use Prometheus + Grafana with custom exporters. Here's what we actually watch:
yaml
# Prometheus rule: alert if GPU utilization drops below 80% for 5 minutes
groups:
- name: gpu_utilization
rules:
- alert: GPUStarving
expr: avg by (gpu_id) (DCGM_FI_PROF_GR_ENGINE_ACTIVE) < 80
for: 5m
annotations:
summary: "GPU {{ $labels.gpu_id }} utilization below 80%"
A Grafana dashboard with 4 panels:
- GPU activity per node (heatmap)
- Network bandwidth per InfiniBand port
- Data pipeline latency (P50, P99)
- Checkpoint duration
If you don't have this, you're flying blind. I've seen clusters waste $50K/month on idle GPUs because nobody noticed a bufferbloat issue.
The Future: What's Coming in 2027
Three trends:
1. Liquid cooling becomes standard. Air cooling can't handle 1000W+ per GPU (B200). By late 2027, expect single-phase immersion cooling for clusters over 100 GPUs. We tested it — temperatures dropped 15C, and we could overclock memory by 10% without thermal throttling.
2. Memory becomes the bottleneck. HBM3e can handle 8 TB/s bandwidth, but the memory capacity per GPU caps model size. CXL-attached memory pools will decouple capacity from compute. Expect to see disaggregated memory for training clusters.
3. Fault tolerance baked into the framework. PyTorch 2.5's elastic training is step 1. By 2027, frameworks will handle GPU failure transparently — redistributing the model across remaining GPUs without a checkpoint reload. We're prototyping this now at SIVARO.
Frequently Asked Questions
Q: How many GPUs do I need to train a 70B parameter model from scratch?
A: 256 H100s minimum with FSDP and activation checkpointing. At that scale, training takes about 30 days. With 512 GPUs, you're looking at 15-18 days. Google trained PaLM at 6144 TPUs. It scales.
Q: What's the difference between a GPU cluster for AI training and a GPU cluster for LLM training specifically?
A: LLMs need more memory bandwidth and more inter-GPU bandwidth because of the attention mechanism. A training cluster for CV tasks (ResNet, etc.) can tolerate slower interconnects. For LLMs, you need NVLink within nodes and InfiniBand between. We tried Ethernet for LLM training. It was 40% slower.
Q: Should I use Slurm or Kubernetes for a GPU cluster for deep learning?
A: Slurm. Every time. Slurm gives you better GPU scheduling, job accounting, and works with NCCL natively. Kubernetes adds a network overlay that kills performance for distributed training under 1000 GPUs. Use K8s for inference. Slurm for training.
Q: How do you handle multi-tenant usage?
A: Slurm partitions. Partition A for critical training (no preemption), Partition B for experimentation (preemptible). Users submit to either. We also use GPU MIG slicing for small inference loads. This gives 85%+ cluster utilization.
Q: Is InfiniBand worth the extra cost?
A: For clusters under 32 GPUs? No. Ethernet with RoCEv2 is fine. For 64+ GPUs? Yes. The 30-40% training speed improvement justifies the 2x cost premium. We benchmarked this with a client. The InfiniBand cluster paid for itself in 5 months of saved training time.
Q: Can I use cloud spot instances for my GPU cluster for deep learning?
A: Yes, with caveats. Spot instances can be preempted with 30 seconds notice. You need checkpointing every 5-10 minutes. We built a system that uses spot for pre-training (can survive interruption) and reserved for fine-tuning (can't waste 4 days of work).
Q: How do you know if your cluster is performing correctly?
A: Two metrics: MFU (Model FLOPS Utilization) and GBW (Global Batch Wall time). MFU should be 50-65% for production clusters. If you're below 40%, something is wrong — network, data pipeline, or both.
Final Advice
Building a GPU cluster for AI training is a systems problem, not a hardware problem. The GPUs are almost commodity. What differentiates a working cluster from a $2M paperweight is:
- The network topology
- The data pipeline
- The failure recovery
- The monitoring
We at SIVARO have made every mistake in this guide. I've spent nights debugging NCCL timeouts. I've watched $500K/month idle because someone configured the Lustre stripe count wrong.
If you're doing this for the first time, start smaller than you think. Build an 8-GPU cluster. Get it working. Double it. Only then go to 128+. The patterns that work at small scale are the same patterns at large scale — they just cost more when they break.
And if you have the budget? Do what our best clients do: buy a small cluster (32 GPUs) for experimentation, rent cloud capacity on demand for production training runs. Best of both worlds.
Nishaant Dixit — Founder of SIVARO. Building data infrastructure and production AI systems since 2018. Built systems processing 200K events/sec.