High-Throughput AI Networking

Distributed training moves massive tensors between GPUs every forward/backward pass. Standard Ethernet bottlenecks this. AI clusters use specialized interconnects that deliver 10–100× the bandwidth of typical cloud networking.

Most sections below end with a quick knowledge check — track how many you clear as you go:

0/0 checks

Why Standard Networking Fails for AI Training

A single AllReduce operation during training (synchronizing gradients across all GPUs) for a 70B model transfers ~140GB of data. At 10 Gbps Ethernet: 112 seconds per step. At 400 Gbps InfiniBand: 2.8 seconds per step.

Training throughput bottleneck:
  Compute time per step: 5s
  Network sync (AllReduce) at 10 Gbps: 112s   ← 95% time wasted on network
  Network sync (AllReduce) at 400 Gbps: 2.8s  ← 36% overhead (acceptable)

Same ~140GB of gradients, same 5s of compute — only the transport changes. Flip between the two to see what that does to a training step:

112 seconds to sync ~140GB of gradients, against 5s of actual compute per step. Network is 95% of step time — the GPUs spend almost the entire step waiting on the wire instead of computing.
2.8 seconds for the same ~140GB transfer. Against 5s of compute, that's 36% overhead — still real, but the GPUs are doing useful work for most of the step instead of idling on the network.

A 70B-model AllReduce moves the same ~140GB of gradient data whether the cluster uses 10 Gbps Ethernet or 400 Gbps InfiniBand. So why is one setup usable for training and the other isn't?


Interconnect Technologies

graph TD
    subgraph "Within one node"
        NVL["NVLink / NVSwitch<br/>600 GB/s bidirectional<br/>GPU-to-GPU on same server<br/>A100/H100 only"]
    end

    subgraph "Between nodes"
        IB["InfiniBand (IB)<br/>400 Gbps HDR / 800 Gbps NDR<br/>RDMA — bypasses OS kernel<br/>HPC clusters, on-prem"]
        ROCE["RoCE (RDMA over Converged Ethernet)<br/>100–400 Gbps<br/>RDMA semantics over Ethernet<br/>AWS EFA, Azure RDMA"]
        ETH["Standard Ethernet<br/>10–100 Gbps<br/>No RDMA — CPU involved<br/>Development / inference only"]
    end

    NVL -->|"fastest"| IB
    IB -->|"cloud equivalent"| ROCE
    ROCE -->|"fallback"| ETH

NVLink / NVSwitch (intra-node)

  • NVLink: Direct GPU-to-GPU connection, bypassing PCIe. 600 GB/s aggregate on H100.
  • NVSwitch: All-to-all NVLink fabric within one DGX node. 8 GPUs act as one logical device.
  • Used automatically by NCCL when topology is detected — no configuration needed.

InfiniBand (inter-node, on-prem)

  • RDMA (Remote Direct Memory Access): GPU memory transferred directly to remote GPU memory — CPU never involved, no kernel copy.
  • Latency: ~1 microsecond vs ~50 microseconds for TCP.
  • Standard in HPC clusters (DGX SuperPOD, Cray, IBM).

RoCE / AWS EFA (inter-node, cloud)

  • EFA (Elastic Fabric Adapter): AWS's custom RDMA-capable network interface. Available on P4d (A100), P5 (H100) instances.
  • Provides InfiniBand-like performance over Ethernet fabric.
  • Required for multi-node distributed training on AWS.

Side-by-side, the headline numbers:

600 GB/s aggregate, GPU-to-GPU, within one node only. Bypasses PCIe entirely. Used automatically by NCCL when the topology is detected — no configuration needed.
400/800 Gbps (HDR/NDR) between nodes, RDMA end to end. GPU memory goes straight to remote GPU memory — the CPU is never involved, no kernel copy. Latency ~1 microsecond vs ~50 microseconds for TCP. Standard in on-prem HPC clusters.
100–400 Gbps between nodes, RDMA semantics carried over Ethernet fabric instead of dedicated IB hardware. AWS EFA is the cloud instance of this — required for multi-node distributed training on AWS.

What does RDMA (InfiniBand or RoCE/EFA) actually save you that a plain TCP/Ethernet transfer doesn't?


AWS EFA Setup on EKS

Getting EFA working end to end is a sequence, not a single config change — each step below has to be in place before the next one does anything useful:

1. Pick an EFA-enabled instance type. Only specific families expose EFA interfaces — e.g. p4d.24xlarge (8x A100, 4x 100 Gbps EFA) or p5.48xlarge (8x H100, 32x 100 Gbps EFA). The wrong instance type means there's no EFA hardware to configure at all.
2. Install the EFA driver and plugin. The driver goes on GPU nodes (user data or a DaemonSet); the EFA device plugin then exposes vpc.amazonaws.com/efa as a schedulable Kubernetes resource.
3. Request EFA in the pod spec. The pod asks for vpc.amazonaws.com/efa interfaces alongside its GPUs, and sets FI_PROVIDER=efa so libfabric actually uses them for the data path. NCCL_SOCKET_IFNAME stays pointed at the regular NIC — that's only for NCCL's control-plane bootstrap, not the tensor traffic.
4. Put the node group in a placement group. Same AZ, physically close racks — this is what actually delivers the low latency EFA is for. Skip it and EFA hardware is present but nodes can still end up far apart on the physical network.

Concretely:

# EFA-enabled instance types
# p4d.24xlarge  → 8x A100 (40GB), 4x 100 Gbps EFA (400 Gbps total)
# p5.48xlarge   → 8x H100, 32x 100 Gbps EFA (3200 Gbps total)

# Install AWS EFA driver on GPU nodes (via user data or DaemonSet)
# EFA plugin exposes vpc.amazonaws.com/efa as a K8s resource
# Pod requesting EFA interfaces
apiVersion: v1
kind: Pod
spec:
  containers:
  - name: training
    image: nvcr.io/nvidia/pytorch:25.01-py3
    resources:
      limits:
        nvidia.com/gpu: "8"
        vpc.amazonaws.com/efa: "4"    # request 4 EFA interfaces
    env:
    - name: NCCL_SOCKET_IFNAME
      value: "eth0"                   # control-plane NIC for NCCL bootstrap (data path uses EFA/libfabric)
    - name: FI_PROVIDER
      value: "efa"                    # use EFA provider for libfabric
    - name: NCCL_DEBUG
      value: "INFO"
# Node group for EFA training
# Must use placement group (same rack = lower latency)
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
managedNodeGroups:
- name: gpu-training
  instanceType: p4d.24xlarge
  minSize: 0
  maxSize: 8
  availabilityZones: ["us-east-1a"]   # single AZ for placement group
  placementGroup:
    enabled: true                      # ensures nodes are physically close

A training pod sets both NCCL_SOCKET_IFNAME=eth0 and FI_PROVIDER=efa. Are these fighting over which NIC carries the tensor data?


NCCL — NVIDIA Collective Communications Library

NCCL handles the AllReduce, AllGather, Broadcast operations across GPUs. It automatically selects the fastest transport (NVLink → EFA → Ethernet).

# Key NCCL environment variables
NCCL_SOCKET_IFNAME=eth0        # which network interface to use
NCCL_IB_DISABLE=0              # enable InfiniBand (0=yes, 1=no)
NCCL_DEBUG=INFO                # verbose logging for debugging
NCCL_NET_GDR_LEVEL=2           # GPU Direct RDMA level (bypass host memory)
NCCL_TOPO_DUMP_FILE=/tmp/nccl  # dump detected topology for debugging

# Test NCCL bandwidth between nodes
kubectl exec -it training-pod -- nccl-tests/build/all_reduce_perf \
  -b 8 -e 256M -f 2 -g 8       # sweep from 8B to 256MB, 8 GPUs

NCCL topology detection output shows which GPUs are connected via NVLink vs PCIe vs network.

Do you need to manually tell NCCL to prefer NVLink over Ethernet for GPUs on the same node?


Cilium for AI Cluster Networking

For inference clusters (not training), Cilium's eBPF-based networking reduces per-packet CPU overhead — critical when serving 10K+ concurrent LLM requests.

# Install Cilium with bandwidth manager for AI inference
helm install cilium cilium/cilium \
  --set bandwidthManager.enabled=true \     # BBR congestion control
  --set bandwidthManager.bbr=true \         # better throughput than CUBIC
  --set kubeProxyReplacement=true \         # eliminate iptables overhead
  --set loadBalancer.algorithm=maglev       # consistent hashing for session affinity

Why Cilium matters for inference:

  • 0 iptables rules → no rule-chain traversal per packet
  • Socket-level load balancing → direct pod-to-pod without DNAT
  • Network policies with L7 awareness → block by HTTP path without sidecar

Training clusters care about InfiniBand/EFA bandwidth. Why does Cilium's eBPF networking matter for inference instead, rather than training?


Network Topology for AI Clusters

graph TD
    subgraph "Spine Layer"
        SPINE1["Spine Switch<br/>400G RDMA"]
        SPINE2["Spine Switch<br/>400G RDMA"]
    end

    subgraph "Leaf Layer"
        LEAF1["Leaf Switch<br/>4x 400G uplink"]
        LEAF2["Leaf Switch<br/>4x 400G uplink"]
    end

    subgraph "Node Layer"
        N1["p5.48xlarge<br/>8x H100, 8x EFA"]
        N2["p5.48xlarge<br/>8x H100, 8x EFA"]
        N3["p5.48xlarge<br/>8x H100, 8x EFA"]
        N4["p5.48xlarge<br/>8x H100, 8x EFA"]
    end

    N1 & N2 --> LEAF1
    N3 & N4 --> LEAF2
    LEAF1 & LEAF2 --> SPINE1 & SPINE2

Fat-tree / CLOS topology ensures any-to-any communication at line rate — no oversubscription. Critical for AllReduce where every node communicates with every other node simultaneously.

Why does AllReduce specifically need a fat-tree/CLOS topology instead of a cheaper, oversubscribed network design?


Quick Reference: Which Interconnect for What

Scenario Recommended Why
Single-node training (≤8 GPUs) NVLink (automatic) 600 GB/s intra-node, no config
Multi-node training on AWS EFA (p4d/p5 instances) + NCCL RDMA-like performance on cloud
Multi-node training on-prem InfiniBand HDR/NDR Lowest latency, highest bandwidth
Online LLM inference at scale Cilium + standard Ethernet Throughput matters, not RDMA
Development / single GPU Standard VPC networking No special setup needed