Skip to content

Cluster Bring-Up and Commissioning · Part 6 of 7

Act 6 — Scheduler, Runtime, and the Environment That Runs Every Benchmark

Building the model…

Bring-up as a gate sequence across the cluster: nodes advance gate by gate, and a node that fails a gate is held back while the rest move on.

The last gate before measurement is the one people rush, and it is the one that produces the most confusing failures — because a scheduler misconfiguration looks exactly like a fabric problem when it hits a collective.

Align Slurm partitions or topology labels to physical scalable-unit boundaries. Validation runs "one SU at a time" so that intra-unit traffic never crosses the spine; if a partition spans two leaf groups because it was built from a hostname range rather than the wiring, then a supposedly leaf-local test is quietly measuring spine behaviour, and the result is both wrong and unexplainable. Build the node lists from the topology map, then have a second person check them against the rail audit output.

Pin the container runtime. Enroot and Pyxis need consistent configuration on every node — a writable rootfs, root remapping, and the site's hook set installed — and the environment the containers inherit must carry the fabric settings. On a multi-rail node, the single most common cause of a multi-node collective failing or silently selecting the wrong interface is a missing HCA list:

# /etc/enroot/enroot.conf  (identical on every compute node)
ENROOT_ROOTFS_WRITABLE  yes
ENROOT_REMAP_ROOT       yes

# /etc/enroot/environ.d/50-fabric.env -- verify device names with ibdev2netdev
NCCL_IB_HCA=mlx5_0,mlx5_1,mlx5_2,mlx5_3,mlx5_4,mlx5_5,mlx5_6,mlx5_7

# Confirm PMIx is available -- the benchmark launchers depend on it
$ srun --mpi=list
MPI plugin types are...
   pmi2
   pmix

# Smoke test the whole stack: scheduler, container, GPUs, fabric, one node
$ srun -p gpu -N 1 --ntasks-per-node=8 --gpus-per-node=8 --mpi=pmix \
    --container-image=./images/nccl-tests.sqsh \
    all_reduce_perf -b 512M -e 512M -f 2 -g 1

Record every non-default fabric environment variable in the manifest. An untracked tuning flag is the reason two teams cannot reproduce each other's numbers, and it is also the reason a result stops being reproducible six months later when nobody remembers what was set.

Exit criteria for G6: partitions match physical scalable units, a single-node containerised collective completes, and the environment applied to benchmark jobs is written down and version-controlled.

DELIVERABLE
What a passed bring-up leaves behind
Assembled as you go. A gate without an artefact is an opinion.
G0
cooling/loop-commissioning.pdf
Pressure test, flush record, balance sheet, leak-sensor test log
G1
inventory/bmc-sweep.tsv
Every BMC: serial, BIOS, health, socket and memory count
G2
manifest/2026-09-frozen.yaml
Exact version for every firmware and software layer, with a hash
G2
manifest/drift-report.txt
Verification output. Must be empty to pass
G3
fabric/link-rate-report.csv
Every compute link, trained rate, both ends
G3
fabric/rail-audit.txt
LLDP-derived rail map diffed against the design
G3
fabric/soak-counters-{t0,t24}.csv
24-hour idle error soak. Delta must be zero
G4
health/nhc-fleet.txt
One row per node. No exceptions granted
G5
fabric/configs/*.cfg
Running config captured from every switch, dated
G6
sched/nodelists/su*.txt
Partitions built from the topology map, not the hostname range
G6
sched/fabric-env.txt
Every non-default fabric variable, version controlled

Read aloudPage 6