Hey folks,
I’m running into a persistent NCCL error with pipeline parallelism on two DGX Spark nodes and I’m stuck. I tried to keep it short, because I respect your time and appreciate you reading this post. The first NCCL communicator initializes fine, but the second one (for pipeline parallelism) fails with what looks like a socket protocol mismatch. I’m not entirely sure this the correct approach, but my end goal is to fine-tune a 70B model. My current goal is to test if it’s possible, and then get some benchmarks completed.
Environment:
- Hardware: 2x NVIDIA DGX Spark (GB10 Grace Blackwell)
- OS: DGX OS (Linux 6.14.0-1015-nvidia)
- PyTorch: 2.10.0a0+b558c986e8.nv25.11 CUDA 13.0
- NCCL: 2.28.8+cuda13.0
- NeMo AutoModel: 0.2.0
- Network: Direct DAC connection (ConnectX-7, 192.168.100.10 and .11)
Configuration:
model: meta-llama/Llama-3.3-70B-Instruct
quantization: 8-bit (BitsAndBytes)
peft: LoRA (rank=16, alpha=32)
distributed:
pp_size: 2
dp_size: none
tp_size: 1
autopipeline:
pp_schedule: interleaved1f1b
pp_microbatch_size: 1
layers_per_stage: 20
The error:
The benchmark fails at iteration 0 with:
[2026-01-01 21:57:19] dgx1:1007:1165 [0] transport/net_socket.cc:565 NCCL WARN NET/Socket :
peer 192.168.100.11<56630> message truncated : receiving 8 bytes instead of 4.
If you believe your socket network is in a healthy state, there may be a mismatch in
collective sizes or environment settings (e.g. NCCL_PROTO, NCCL_ALGO) between ranks
[rank0]:[E101 21:57:19.147805485 ProcessGroupNCCL.cpp:617] [Rank 0] Collective
WorkNCCL(SeqNum=1, OpType=COALESCED, NumelIn=0, NumelOut=0, Timeout(ms)=600000)
raised the following async exception: NCCL error: invalid usage
[rank0]:[E101 21:57:19.150803196 ProcessGroupNCCL.cpp:2290] [PG ID 1 PG GUID 1(mesh_pp)
Rank 0] failure detected by watchdog at work sequence id: 1
What works:
The first NCCL communicator (default_pg) initializes perfectly:
dgx1:1007:1007 [0] NCCL INFO ncclCommInitRankConfig comm 0x389afbf0 rank 0 nranks 2 - Init COMPLETE
dgx1:1007:1007 [0] NCCL INFO Connected all rings, use ring PXN 0 GDR 0
Gloo backend connects successfully. Model loads and splits correctly across pipeline stages.
What fails:
The second NCCL communicator (mesh_pp) for pipeline parallelism. It reports “Init COMPLETE” but crashes immediately on the first collective operation with “message truncated: receiving 8 bytes instead of 4.”
What I’ve tried:
Network configuration:
- Verified single IP per node (192.168.100.10 and .11)
- Confirmed MTU=1500 on both nodes
- Tested ping connectivity (< 1.5ms latency)
- Removed secondary DAC interface IPs to prevent subnet conflicts
- Set NCCL_SOCKET_IFNAME=enp1s0f0np0 on both nodes
NCCL environment variables:
export NCCL_DEBUG=INFO
export NCCL_NET_PLUGIN=none
export NCCL_SOCKET_IFNAME=enp1s0f0np0
export NCCL_ALGO=Ring
export NCCL_PROTO=Simple
**I also tried NCCL_IB_DISABLE=1 (causes double-free crash in RDMA plugin), various buffer size settings (no effect).
Process cleanup:
- Verified ports are free
- No lingering Python processes
- Flushed page cache before benchmark
Additional troubleshooting steps:
- Multiple GPU resets after crashes to clear stuck states
- Attempted to enable RoCE/IB transport with NCCL_IB_DISABLE=1 (causes double-free crash in RDMA plugin, forcing fallback to socket transport)
- Tested multiple NCCL protocol/algorithm combinations individually and together
- Explicitly verified in NCCL debug logs that both ranks show identical NCCL_ALGO=Ring and NCCL_PROTO=Simple settings
- Confirmed both nodes report the same settings during initialization, yet the error persists
Observations:
The failure seems completely deterministic - same point every time (iteration 0, first collective on mesh_pp). The “receiving 8 bytes instead of 4” suggests incompatible message formats during handshake. It only seems to affect mesh_pp process group, not default_pg.
The error message suggests checking for NCCL_PROTO and NCCL_ALGO mismatches between ranks, but I’ve verified both ranks have identical settings (from NCCL debug logs). The error happens even when both ranks explicitly use NCCL_ALGO=Ring and NCCL_PROTO=Simple.
Questions:
Is this a known limitation of NCCL socket transport with multiple process groups? Or am I missing something for pipeline parallelism over socket transport? The first communicator works perfectly with the same network and NCCL settings, so I’m confused why the second one fails during handshake. I started off with tensor parallelism but ran into issues I couldn’t resolve; should I be using tensor parallelism instead?
I appreciate you and your time. Any help would be appreciated. Thanks!