NIMBLE Performance: DeepSeek-V3's MoE Layer in SGLang and vLLM

Machine Specifications: TACC Horizon

CPU Model CPU Core Info Memory GPU Model GPU Memory Interconnects
NVIDIA Grace (Arm Neoverse V2) 2x72 cores @3.4 GHz 960 GB NVIDIA GB200 (4/Node, NVL4) 185 Gib NVIDIA ConnectX-8 InfiniBand XDR (800 Gbps), 2/Node(400 Gb/s)

NIMBLE plans each AllToAllV from the byte matrix the ranks pass, sending each transfer directly or relaying it through another GPU of its node onto a less loaded NIC. The charts time DeepSeek-V3's MoE layer (FP8, prefill) on the real model at expert-parallel sizes (EP) 8, 16 and 32, on 2, 4 and 8 GB200 NVL4 nodes: the whole layer, its communication (dispatch and combine) and its compute, which is the same for all three.

Software: SGLang at commit fbf8f1d, vLLM 0.30.0, PyTorch 2.13 (CUDA 13), CUDA 13.2 and NCCL 2.30.7, for all three.

SGLang

SGLang results on TACC Horizon DeepSeek-V3 MoE layer in SGLang: NCCL, NIMBLE and NIMBLE dedup

At 16K tokens per rank the MoE layer is 1.21-1.28x faster with NIMBLE than with NCCL, and 1.32-1.53x with dedup (EP 32: 122.7 ms with NCCL, 96.1 ms with NIMBLE, 80.4 ms with dedup). Only dedup's smallest batch at EP 8 is slower (1K tokens: 4.36 against 3.83 ms).

vLLm

vllm results on TACC Horizon DeepSeek-V3 MoE layer in vLLM: NCCL, NIMBLE and NIMBLE dedup

NIMBLE is faster than NCCL at every batch and EP size, 1.09-1.24x on the layer, and dedup reaches 1.20-1.34x at the largest batches. The gains are smaller than in SGLang because vLLM's expert kernel runs untuned at large batches, so compute is a larger share of the layer.

To run these yourself: the serving examples, which run SGLang's server and offline engine, vLLM's server and a client, with step-by-step commands and the serving guide