Repository navigation
fix: wrun() must pass ssh -n, and harden the fabric preflight (MTU 9000, ibv_devices, fail-fast on unreachable peer) - #13
Conversation
Two silent-failure classes found bringing a second pair up. 1. wrun() inherits the caller's stdin. Any script that calls it from inside a heredoc-fed 'bash -s' has the rest of the heredoc consumed by ssh: the worker step succeeds and every later line vanishes with no error and a zero exit. ./stop.sh is the common case. Fixed with 'ssh -n' at the call site -- deliberately NOT in SSH_OPTS, which scp and 'rsync -e' share and where -n would break rsync's transport. 2. The fabric preflight only pinged default-size and only warned. So an MTU-1500 end passed silently and then capped the whole TP group (RoCE derives its IB MTU from the netdev MTU); an unreachable fabric peer warned and then hung in rendezvous instead of failing fast; and a wrong *_CX7_IB name was never checked, degrading NCCL silently. Now asserts an 8972-byte unfragmented ping end-to-end, reads the netdev MTU on both nodes, requires the configured RoCE device in ibv_devices on both nodes, and errors instead of warning. Validated on a known-good 2x GB10 pair: all four assertions pass, and a 20000-byte ping is correctly rejected, so the MTU check has teeth.
|
Reviewed and merging. Both halves are real bugs:
Nit, not blocking for the default single-device Spark pair: Behavior change to be aware of: a misconfigured fabric now refuses to start instead of warning and hanging. That is intended. Jumbo ICMP can theoretically fail while RoCE still works; unlikely on a DAC CX7 pair. |
Two silent-failure classes found while bringing up a second 2× GB10 pair from this recipe.
1.
wrun()needsssh -nwrun()inherits the caller's stdin, sosshconsumes it. Any script that calls it from inside a heredoc-fedbash -shas the remainder of the script silently eaten: the worker step succeeds, every later line vanishes, exit status is 0, and nothing is logged../stop.shis the everyday case. Driving it remotely, the worker stops and then every command after it is silently discarded. That cost us a genuinely confusing debugging session — the pair was down and our follow-up steps had simply never run.The fix is one flag, but placement matters:
-ngoes at thewrun()call site, not inSSH_OPTS, becausescpandrsync -eshareSSH_OPTSand-nwould break rsync's transport.2. The fabric preflight warns where it should assert
preflightpinged the worker's CX7 IP at default size and onlywarned on failure. Three gaps:*_CX7_IBwas never checked againstibv_devices. A wrong device name doesn't error; NCCL degrades quietly.This adds an
-M do -s 8972ping end-to-end so 9000 is proven in the path rather than read off one side, the netdev MTU read on both nodes, the configured RoCE device asserted present inibv_deviceson both nodes, anderror/exit 1instead ofwarnwhen the fabric peer is unreachable.Validation
On a correctly configured 2× GB10 pair (200 Gb/s DAC, MTU 9000 both ends,
rocep1s0f0):The last line is the negative control — the MTU assert fails when it should, rather than passing vacuously. No false positive on healthy hardware.
bash -n start.shclean.