Skip to content

Chapter 17: Storage Network Packet Path · Part 2 of 10

Act 1 -- The Storage Request in Context

When PyTorch calls torch.save() on a checkpoint, the call stack eventually reaches the kernel NVMe-oF initiator or the cuFile library. Either way, a block of GPU memory needs to land on a storage appliance. The DGX H100 does not have a dedicated storage processor. The two dual-port ConnectX-7 NICs in Slot1 and Slot2 carry both storage traffic and in-band management. The host CPU (Intel Xeon) runs the NVMe-oF initiator stack -- it is the CPU that maps namespaces, allocates queue pairs, and posts work requests.

This matters because the initiator is not close to the data. The model weights live in HBM, attached to the GPU over NVLink. To get those weights onto the wire, the data must cross PCIe from GPU to the CX7 NIC. The CX7 can DMA directly from GPU memory via GPUDirect, which is the GDS path covered in Act 6. The baseline path -- the one you learn first -- is the host CPU-mediated path where data goes GPU HBM -> system DRAM -> CX7 NIC -> storage switch -> appliance.

Storage DMA Path
GPU HBM to Storage Appliance
PCIe crossings: 2 (HBM -> DRAM, then DRAM -> CX7). The bounce buffer doubles PCIe load.
GPU
GPU HBM
A100 / H100 80 GB HBM3
~64 GB/s peak
CPU
Pinned DRAM
Registered MR
~64 GB/s peak
NIC
ConnectX-7 NIC
Slot1 or Slot2 (storage)
SN4600C 100GbE
STO
Storage Appliance
NVMe-oF target
click any node or link for details

The storage fabric is a separate physical network from the compute fabric. In a BasePOD, the compute fabric uses QM9700 HDR InfiniBand or SN5600 Ethernet spine/leaf switches. The storage fabric uses SN4600C (or similar) 100GbE switches in a simpler topology: each DGX node connects its storage CX7 ports to dedicated storage leaf switches, which connect to the storage appliances. There is no reason to run the full rail-optimised fat-tree topology here -- the storage traffic pattern is not all-to-all.

The three physical fabrics on a DGX cluster:

  • Compute fabric: GPU-to-GPU RDMA (RoCEv2 or InfiniBand). Eight CX7 HCA ports per DGX. Full bisection bandwidth. Rail-optimised topology.
  • Storage fabric: NVMe-oF checkpoint and dataset I/O. Two dual-port CX7 NIC ports per DGX. 2:1 oversubscription acceptable. Simpler leaf topology.
  • OOB/management fabric: BMC, SSH, UFM, DCGM telemetry. Separate 1GbE network. Covered in Ch18.
Fabric Comparison
Compute Fabric vs Storage Fabric
click any row for detail
Dimension
Compute Fabric
Storage Fabric
NIC hardware
8x single-port CX7 HCA per DGX
2x dual-port CX7 NIC per DGX (Slot1 + Slot2)
Switch hardware
QM9700 (InfiniBand HDR) or SN5600 (RoCEv2)
SN4600C 100GbE or similar
Topology
Rail-optimised fat-tree, full bisection (1:1)
Simple leaf, 2:1 oversubscription acceptable
Transport protocol
RDMA (InfiniBand or RoCEv2)
NVMe-oF RDMA (preferred) or NVMe/TCP
PFC
Required -- lossless for AllReduce
NOT used in most storage fabric designs
Congestion control
DCQCN with tight thresholds (Kmin ~80KB, Kmax ~400KB)
ECN only, larger thresholds (Kmin ~200KB, Kmax ~1MB)
Traffic pattern
All-to-all, synchronised (AllReduce barrier)
Burst writes (checkpoint), sequential reads (dataset load)
Payload
NCCL messages (RDMA Write chunks, 256KB-4MB typical)
NVMe command capsules (64B SQE) + RDMA Read data (target-pull, 4MB block)
GDS capable
Not applicable
Yes (RDMA transport only, requires nvidia-fs module)
Key diagnostic
ibstat, perfquery, DCGM, UFM
nvme error-log, rdma stat, fio, gds_check
The core confusion to avoid
Both fabrics use ConnectX-7 NICs and RoCEv2 framing. This does NOT mean they share a configuration. The PFC requirement, ECN thresholds, and traffic patterns are fundamentally different. A storage fabric misconfigured as a compute fabric (with PFC enabled) will pause-storm on checkpoint bursts. A compute fabric misconfigured as a storage fabric (PFC disabled) will drop packets and destroy AllReduce performance.