network_stuff:machine_learning:networking:ai:tshoot-roce
Differences
This shows you the differences between two versions of the page.
| network_stuff:machine_learning:networking:ai:tshoot-roce [2026/10/09 15:05] – created admin | network_stuff:machine_learning:networking:ai:tshoot-roce [2026/10/09 15:12] (current) – admin | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Slow JCT troubleshooting – Spectrum-X Ethernet (east-west fabric), hypothetical example ====== | ====== Slow JCT troubleshooting – Spectrum-X Ethernet (east-west fabric), hypothetical example ====== | ||
| - | // | + | // |
| ===== Context ===== | ===== Context ===== | ||
| - | * **Fabric:** 2048 H200 GPUs = 256 nodes × 8 GPUs and 8 BlueField-3 SuperNICs (400G). Rail-optimised, | + | * **Fabric:** 2048 H200 GPUs = 256 nodes × 8 GPUs and 8 BlueField-3 SuperNICs (400G). Rail-optimised, |
| - | * **RoCE QoS design (the intended config):** RoCE marked **DSCP 26** → switch | + | * **Intended |
| - | * **Naming:** '' | + | * **Naming:** '' |
| - | * **Job 51877:** 512 GPUs on '' | + | * **Job 51877:** 512 GPUs on '' |
| ^ Baseline (healthy) ^ Value ^ | ^ Baseline (healthy) ^ Value ^ | ||
| | Live all-reduce busbw, cross-node communicator | 355 GB/s, stable | | | Live all-reduce busbw, cross-node communicator | 355 GB/s, stable | | ||
| - | | nccl-tests 2 nodes, 8 GB | 365 GB/s | | ||
| | nccl-tests all-to-all, 8 nodes | 41 GB/s | | | nccl-tests all-to-all, 8 nodes | 41 GB/s | | ||
| | '' | | '' | ||
| - | ===== Phase A: live, job keeps running, read-only | + | ===== Phase A: live, job keeps running ===== |
| - | ==== A1. Live busbw ==== | + | ==== A1. Live busbw (Grafana, NCCL Inspector) |
| - | < | + | * All-reduce busbw: 355 GB/s on previous runs. **Since Day-1 15:30: average 240 GB/s, swinging 180-300.** |
| - | # Prometheus (NCCL Inspector / Spectrum-X NetInspector; | + | * NVLink-only communicators: |
| - | avg by (coll) (nccl_bus_bandwidth_gbs{jobid=" | + | |
| - | </ | + | |
| - | < | + | **Reading: |
| - | AllReduce | + | |
| - | NVLink-only communicators: | + | |
| - | </code> | + | |
| - | **Reading: | + | ==== A2. Straggler or transfer path? (straggler panel, GPU dashboard) ==== |
| - | ==== A2. Straggler | + | * Straggler |
| + | * GPU clocks/ | ||
| - | Straggler panel: | + | **Reading:** the transfer path, not a slow GPU. |
| - | <code bash> | + | ==== A3. Physical health (fabric telemetry dashboard) ==== |
| - | pdsh -w su3-n[01-32], | + | |
| - | ' | + | |
| - | | awk -F, '$2+0 < 1900' | + | |
| - | </ | + | |
| - | < | + | * All job-facing links up at 400G/800G, no errors, no flaps. |
| - | (no output) | + | |
| - | </code> | + | |
| - | **Reading: | + | **Reading: |
| - | ==== A3. Link-rate sweep (comes back clean) ==== | + | ==== A4. What changed at onset? |
| - | <code bash> | + | * **No switch config changes.** |
| - | pdsh -w su3-n[01-32], | + | * Day-1 15:30: job restarted after a node failure, with **su3-n17 (freshly reimaged)** as the replacement. |
| - | 'for i in eth{0..7}; do echo "$i $(cat / | + | |
| - | </ | + | |
| - | < | + | **Reading:** a suspect, not yet evidence. |
| - | (no output: all 512 NICs at 400G) | + | |
| - | </ | + | |
| - | Switch-side errors on all job-facing leaf ports: clean. **Unlike | + | ==== A5. Is the fabric dropping anything? (drop telemetry / WJH, switch counters) ==== |
| - | ==== A4. RoCE traffic-class sweep: is RDMA traffic in the right queue? ==== | + | * **Tail drops** on spine downlinks and SU3/SU4 leaf downlinks, peaking during collectives (incast). |
| + | * In a lossless | ||
| - | Per-priority counters on every NIC, sampled 10 s apart (delta): | + | **Reading:** drops confirmed. Which traffic? |
| - | <code bash> | + | ==== A6. Which traffic class? |
| - | pdsh -w su3-n[01-32], | + | |
| - | 'for i in eth{0..7}; do a=$(ethtool | + | |
| - | b=$(ethtool -S $i | grep -E " | + | |
| - | </ | + | |
| - | < | + | * Drops are all in **class |
| - | all NICs except one: | + | * Class 3 (RoCE): no drops; PFC and ECN behaviour normal. |
| - | su3-n17 eth5: | + | |
| - | </ | + | |
| - | RoCE retransmit counters on the same NIC: | + | **Reading: |
| - | <code bash> | + | ==== A7. Who sends it? (WJH drop records) ==== |
| - | cat / | + | |
| - | </ | + | |
| - | < | + | * Every dropped packet: **DSCP |
| - | local_ack_timeout_err: | + | |
| - | roce_adp_retrans: | + | |
| - | rp_cnp_handled: | + | |
| - | </ | + | |
| - | **Reading: | + | **Reading: |
| - | ==== A5. Locate the switch port and confirm drops in the fabric ==== | + | ==== A8. Where does it attach? (fabric |
| - | <code bash> | + | * The IP is learned |
| - | lldpctl eth5 # on su3-n17 | + | * That port's ingress: RDMA traffic in class 0; class 3 ~0. |
| - | </ | + | |
| - | < | + | **Reading:** matches the A4 suspect. **Only now does the investigation touch the host.** |
| - | SysName: su3-l5 | + | |
| - | </ | + | |
| - | Switch side (Cumulus): | + | ==== A9. Confirm on the host and find why ==== |
| - | <code bash> | + | Host telemetry for su3-n17 rail 5: RDMA bytes go out on priority |
| - | nv show interface swp9s0 qos counters | + | |
| - | </ | + | |
| - | + | ||
| - | < | + | |
| - | ingress traffic-class 0 : high rate | + | |
| - | ingress traffic-class | + | |
| - | PFC rx/tx priority 3 : 0 | + | |
| - | </ | + | |
| - | + | ||
| - | What Just Happened | + | |
| - | + | ||
| - | < | + | |
| - | Drop reason: tail drop src: su3-n17 rail5 IP DSCP: 0 | + | |
| - | </ | + | |
| - | + | ||
| - | ==== A6. Config diff: why is it marked DSCP 0? ==== | + | |
| <code bash> | <code bash> | ||
| - | # on su3-n17 vs a healthy node (su3-n16) | ||
| mlnx_qos -i eth5 | grep -i trust | mlnx_qos -i eth5 | grep -i trust | ||
| cat / | cat / | ||
| </ | </ | ||
| - | < | + | ^ Node ^ Trust ^ traffic_class ^ |
| - | su3-n16: Priority trust state: | + | | su3-n16 |
| - | su3-n17: Priority trust state: | + | | su3-n17 |
| - | </ | + | |
| - | The job doesn' | + | The same drift is on **all 8 NICs** of su3-n17: the host QoS role didn't run on reimage. |
| - | **Phase A conclusion, no drain so far:** **host-side config drift** on su3-n17. Its RoCE traffic is not marked DSCP 26, lands in the lossy class, is dropped under congestion and retransmitted, | + | **Phase A conclusion, no drain so far:** **host-side |
| ===== Phase B: repair window agreed with the app team ===== | ===== Phase B: repair window agreed with the app team ===== | ||
| - | The fix is applied on the host, but RDMA queue pairs pick up their traffic class when the job initialises. The job must restart either way, so this is the repair window. | + | RDMA queue pairs take their traffic class when the job initialises, |
| ==== B0. Take the node out ==== | ==== B0. Take the node out ==== | ||
| Line 145: | Line 98: | ||
| </ | </ | ||
| - | The job restarts on '' | + | The job restarts on a spare. Grafana: live busbw **355 GB/s stable**, step time 1.10 s. |
| - | ==== B1. Decoupling | + | ==== B1. Confirm |
| - | **GPU side:** | + | ^ Test ^ Result ^ Baseline ^ Reading ^ |
| + | | GPU health (DCGM diag), single-node all-reduce | Pass / 478 GB/s | 480 | GPU side fine | | ||
| + | | '' | ||
| + | | '' | ||
| + | | 8-node all-to-all **with** su3-n17 | **24.6 GB/s** | 41 | Fault reproduces under congestion | | ||
| + | | Same, **without** su3-n17 | 40.8 GB/s | 41 | Fault follows the node | | ||
| - | <code bash> | + | **Key point:** a single uncongested flow never meets a full queue, so it is never dropped. **Pair tests pass even with a QoS fault present.** On Ethernet, |
| - | dcgmi diag -r 2 -> Overall: Pass | + | |
| - | ./ | + | |
| - | </ | + | |
| - | + | ||
| - | **Point-to-point, host memory and GPU memory (before the fix):** | + | |
| - | + | ||
| - | <code bash> | + | |
| - | show_gids mlx5_5 | + | |
| - | # on su3-s02 (server) | + | |
| - | ib_write_bw -d mlx5_5 -x 3 -F --report_gbits -s 1048576 -D 10 | + | |
| - | # on su3-n17 (client) | + | |
| - | ib_write_bw -d mlx5_5 -x 3 -F --report_gbits -s 1048576 -D 10 su3-s02 | + | |
| - | ib_write_bw -d mlx5_5 -x 3 -F --report_gbits -s 1048576 -D 10 --use_cuda=5 su3-s02 | + | |
| - | </ | + | |
| - | + | ||
| - | < | + | |
| - | host memory: 384.7 Gb/s GPU memory: 383.9 Gb/s <- both NORMAL | + | |
| - | </ | + | |
| - | + | ||
| - | **Reading:** a single uncongested flow never hits a full queue, so it' | + | |
| - | + | ||
| - | **Reproduce under congestion | + | |
| - | + | ||
| - | <code bash> | + | |
| - | mpirun -np 64 -H su3-n17: | + | |
| - | ./ | + | |
| - | </ | + | |
| - | + | ||
| - | < | + | |
| - | # Avg bus bandwidth : 24.6 | + | |
| - | </ | + | |
| - | + | ||
| - | Same test without su3-n17: 40.8. The fault shows only under congestion and only with su3-n17 in the set. | + | |
| - | + | ||
| - | ^ GPU side ^ Pair, host mem ^ Pair, GPU mem ^ Congested all-to-all ^ Counters / config ^ Verdict ^ | + | |
| - | | Pass / 478 | 385 (normal) | 384 (normal) | **24.6** (low) | DSCP 0, prio 0, no CNPs | **Host RoCE QoS config**, not hardware | | + | |
| ==== B2. Fix ==== | ==== B2. Fix ==== | ||
| - | <code bash> | + | Apply the QoS role on su3-n17 |
| - | # on su3-n17, all 8 NICs (persist via config management, not by hand) | + | |
| - | mlnx_qos -i eth5 --trust dscp | + | |
| - | echo 106 > / | + | |
| - | # repeat for eth0-7 / mlx5_0-7; fix the reimage pipeline so the QoS role always runs | + | |
| - | </ | + | |
| ==== B3. Verify and return ==== | ==== B3. Verify and return ==== | ||
| - | < | + | * Host telemetry: RDMA on priority 3, retransmits flat, CNPs handled again. |
| - | ethtool -S eth5 delta -> tx_prio3 ~ 38 GB/10s, tx_prio0 ~ 0 | + | * Switch |
| - | nv show interface swp9s0 qos counters -> traffic in class 3, PFC/ECN active | + | * WJH: no drops from su3-n17. |
| - | 8-node | + | * 8-node |
| - | WJH -> no drops from su3-n17 | + | |
| - | hw_counters local_ack_timeout_err | + | |
| - | </code> | + | |
| <code bash> | <code bash> | ||
| Line 212: | Line 126: | ||
| </ | </ | ||
| - | su3-n17 rejoins the spare pool. Also add a **pre-flight check** | + | Add a **pre-flight check**: a node's trust state and traffic class must match the golden config before |
| ===== Why a marking error on one node cost about 19% of JCT ===== | ===== Why a marking error on one node cost about 19% of JCT ===== | ||
| - | Every collective includes channels to and from su3-n17. Its packets are dropped whenever a queue on the path fills, and each drop stalls that channel until the retransmit. The collective finishes only when the stalled channel does, so all 512 ranks wait. Because drops depend on momentary congestion, the slowdown is **noisy**, not a clean step: that pattern alone points away from a hard link fault. | + | Every collective includes channels to and from su3-n17. Its packets are dropped whenever a queue on the path fills, and each drop stalls that channel until the retransmit. The collective finishes only when the stalled channel does, so all 512 ranks wait. Drops depend on momentary congestion, |
| + | |||
| + | ===== Principle ===== | ||
| + | |||
| + | * Go **fabric-wide first**: drops, traffic classes and congestion on the switches you own. | ||
| + | * **Let the fabric tell you which host.** The legitimate early pointers to a host are a **change correlation** (A4) or a **source address in drop telemetry** (A7). | ||
| + | * Touch the host only to confirm and find the cause. | ||
| - | ===== IB vs. Spectrum-X: what changes | + | ===== IB vs. Spectrum-X: what changes ===== |
| ^ Aspect ^ InfiniBand case ^ Spectrum-X case ^ | ^ Aspect ^ InfiniBand case ^ Spectrum-X case ^ | ||
| | Typical fault signature | Clean step, link rate/BER visible | Noisy, congestion-dependent | | | Typical fault signature | Clean step, link rate/BER visible | Noisy, congestion-dependent | | ||
| - | | Link-rate sweep | Finds it | Clean | | + | | Physical health check | Finds it | Clean | |
| - | | Key extra checks | + | | Key evidence |
| - | | Pair test ('' | + | | Pair test | Shows the fault | **Can pass with a fault present**; needs a congested test | |
| - | | Locate | + | | Locate |
| ===== Verify on your system ===== | ===== Verify on your system ===== | ||
| - | * NVUE command and counter | + | * Dashboard/ |
| - | * '' | + | * '' |
| - | * '' | + | * The Spectrum-X RoCE profile |
| - | * The default | + | |
| - | * '' | + | |
network_stuff/machine_learning/networking/ai/tshoot-roce.txt · Last modified: by admin
