feat(deepep-efa): NVIDIA Dynamo DeepEP-V2 MoE all-to-all over EFA (NCCL-GIN CPU-proxy) - #1256
Open
dmvevents wants to merge 1 commit into
Open
feat(deepep-efa): NVIDIA Dynamo DeepEP-V2 MoE all-to-all over EFA (NCCL-GIN CPU-proxy)#1256dmvevents wants to merge 1 commit into
dmvevents wants to merge 1 commit into
Conversation
…CL-GIN CPU-proxy) Adds examples/inference/nvidia-dynamo/deepep-v2-efa/: NVIDIA Dynamo (dynamo.frontend OpenAI ingress + dynamo.vllm engine) serving a Mixture-of-Experts model with the DeepEP-V2 (ElasticBuffer) expert-parallel all-to-all routed over AWS EFA via the aws-ofi-nccl GIN CPU-proxy path (NCCL_GIN_TYPE=2), on 2x p5en.48xlarge (H200), DP16/EP16. This is the Dynamo-frontend member of the DeepEP-EFA example family (vLLM awslabs#1230, TRT-LLM awslabs#1240, NeMo-RL awslabs#1242). dynamo.vllm wraps the same vLLM engine and forwards unknown CLI flags into vLLM's AsyncEngineArgs, so the DeepEP-V2/EFA transport is identical to the vLLM sample; only an OpenAI-compatible frontend and a DP/EP-aware worker wrapper are added. Placed as a variant subdirectory under the existing nvidia-dynamo/ engine folder (extend-before-create): the execution model differs materially from the platform sample there (raw 2-node StatefulSet + file discovery + DeepEP-V2 expert A2A on p5en/H200, vs operator + DGD CRD + etcd/NATS on L40S). NGC-from-scratch: FROM nvcr.io/nvidia/cuda:13.0.0-devel-ubuntu22.04, all deps built from public source; no private image referenced. vLLM pinned to the DeepEP-V2-backend merge commit e2f993dc4 (the measured-working substrate); served --enforce-eager. Verified E2E on 2x p5en.48xlarge (H200), DP16/EP16: DeepEP-V2 kernel-test PASS with the efa-direct banner on both nodes; both pods Ready; leader engine registered; coherent /v1/chat/completions; DeepEP-V2 EFA path initialized on all 16 DP ranks across both nodes. Full output under ## Test Results. Signed-off-by: Anton Alexander <dmvevents@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this adds
A new self-contained inference example: NVIDIA Dynamo (
dynamo.frontendOpenAI ingress +dynamo.vllmengine) serving a Mixture-of-Experts model with DeepEP-V2 (ElasticBuffer)expert-parallel all-to-all, routed over AWS EFA via the NCCL-GIN CPU-proxy path
(
NCCL_GIN_TYPE=2), onp5en.48xlarge(H200).Path:
examples/inference/nvidia-dynamo/deepep-v2-efa/It is the Dynamo-frontend counterpart to the vLLM DeepEP-V2 sample (
examples/inference/vllm/deepep-v2-efa/,open in #1230).
dynamo.vllmwraps the same vLLM engine — it forwards every unknown CLI flag straight intovLLM's
AsyncEngineArgs— so nothing about the DeepEP-V2 / EFA transport changes; this sample adds onlyan OpenAI-compatible frontend and a DP/EP-aware worker wrapper on top of that proven substrate.
Why this is not duplicating an existing PR
feat(deepep-efa): vLLM DeepEP-V2 MoE all-to-all over EFA (eager + non-eager) #1230 (vLLM), feat(deepep-efa): vLLM DeepEP-V2 MoE all-to-all over EFA via NCCL-GIN GDAKI (GPU-initiated) #1231 (vLLM + UCCL/NIXL), feat(deepep-efa): TensorRT-LLM NcclEP MoE all-to-all over EFA (NCCL-GIN CPU-proxy) #1240 (TRT-LLM), feat(deepep-efa): NeMo-RL GRPO + Megatron Shape-Y MoE all-to-all over EFA (DeepEP-V2 NCCL-GIN) #1242 (NeMo-RL). None serves the DeepEP-V2/EFA
engine behind an NVIDIA Dynamo front. This is the Dynamo member of that family.
nvidia-dynamo/platform sample. The currentexamples/inference/nvidia-dynamo/folder is a SageMaker HyperPod-EKS deployment driven by the Dynamo operator and its
DynamoGraphDeployment(DGD) CRD, serving GPT-OSS / Qwen3.6 in aggregated + disaggregated (NIXL)flavors on
ml.g6e.4xlarge. That is a materially different execution model (operator + CRD + etcd/NATSplatform, L40S, KV-transfer disagg) from this sample's raw two-node DeepEP-V2 MoE all-to-all serving on
p5en/H200. See the "extend-before-create" note below.
Extend-before-create (AGENTS.md §2)
Closest existing sibling:
examples/inference/nvidia-dynamo/(matheus's Dynamo-platform sample).This new content is placed as a variant subdirectory inside it (
nvidia-dynamo/deepep-v2-efa/), not asa parallel top-level sibling — so it extends the existing
nvidia-dynamo/engine folder rather thancreating a new one.
A new subdirectory (rather than a README section or model recipe inside the platform sample) is justified
because the execution model differs materially from the platform sample:
nvidia-dynamo/(existing)nvidia-dynamo/deepep-v2-efa/(this PR)--headless,--data-parallel-address) over EFAElasticBufferexpert all-to-all over EFA (NCCL-GIN CPU-proxy)ml.g6e.4xlarge(L40S 48GB)p5en.48xlarge(H200), 16 EFA NICs/nodeThe two share the same engine name (
nvidia-dynamo) — which is why this lives under that folder — butnot the same dependencies or run path, which is the AGENTS.md test for a new variant subdirectory.
How it works (one paragraph)
DeepEP's default transport is NVSHMEM/IBGDA, which EFA does not provide. The V2 (
ElasticBuffer) path runsits dispatch/combine over
aws-ofi-nccl's GIN CPU-proxy (NCCL_GIN_TYPE=2,OFI_NCCL_GIN_GDAKI=0) on theefa-directfabric. Three things make it work:EP_REUSE_NCCL_COMM=0(or serve init segfaults — torch'sNCCL comm is lazy/null under vLLM before
ElasticBufferconstruction); the gdrcopy forced-PCIe capabilityfor the GIN plugin on gdrdrv-2.4 hosts (
OFI_NCCL_GDRCOPY_FORCED_PCIE_COPY=1, the parameter fromaws/aws-ofi-nccl#1351, cherry-picked at a pinned SHA); and DeepEP-V2 source pinned to
b306af06+ PR#612(EFA auto-QP cap) at its immutable head SHA. Full detail + the eager/non-eager status table are in the folder
README. NGC-from-scratch: the Dockerfile is
FROM nvcr.io/nvidia/cuda:13.0.0-devel-ubuntu22.04, all depsbuilt from public source; no private image is referenced anywhere.
The one Dynamo-specific delta beyond the vLLM substrate is a readiness contract documented in the README
("Readiness on Dynamo — why
/healthalone lies"):dynamo.frontend's/healthreturns 200 as soon as theHTTP server binds (its
ServiceObserverdefaults to Ready and nothing flips it on engine registration), sothe Kubernetes leader probe requires
/health200 and a populatedendpointsarray — otherwise theprobe would pass hours before the model finishes loading and defeat the startup budget.
Test Results
Cluster: Amazon EKS, 2×
p5en.48xlarge(H200, 8 GPU + 16 EFA NIC/node), EFA K8s device plugin,ap-southeast-3.Model:
Qwen/Qwen3-30B-A3B-FP8(public), DP16 / EP16,--enforce-eager(the shipped default).Image: NGC-from-scratch, built from the in-tree
Dockerfile(
FROM nvcr.io/nvidia/cuda:13.0.0-devel-ubuntu22.04); vLLM pinned to the DeepEP-V2-backend merge commite2f993dc4(0.22.1rc1.dev283) +ai-dynamo{,-runtime}==1.3.1. Run 2026-09-04.1. EFA transport proof, before model load
recipe/run-kernel-test.shon both nodes runsDeepEP/tests/elastic/test_ep.py(DeepEP-V2 dispatch +combine) and prints
KERNEL-TEST PASSonly when theNCCL_DEBUG=INFOlog shows theefa-directbanner,so a green result cannot be a silent TCP/SHM fallback:
(This gate exercises DeepEP + aws-ofi-nccl + EFA only — not vLLM or Dynamo — so it was captured on an image
whose transport layers, Dockerfile Layers 1–4, are byte-identical to the shipped image; only the vLLM/Dynamo
layers above them differ. The serve-path proof on the shipped image is §3.)
2. End-to-end serving — both pods Ready, coherent chat completion
Two-node StatefulSet (
kubernetes/). The leader turns Ready only after/healthcarries a populatedendpointsarray (post-weight-load engine registration — see README "why/healthalone lies"):The vLLM engine came up as the pinned DeepEP-V2 substrate across all 16 DP ranks with no CUDA launch fault
(the exact failure mode that ruled out the vLLM 0.26 line on this DeepEP/EFA substrate — see README
"eager vs non-eager"):
Chat completion via the leader's OpenAI endpoint:
3. EFA carried the expert all-to-all during serving
On this cluster's EFA kernel driver (3.3.0g) the
rdma_*_byteshw_counterssysfs node is not exposed(
/sys/class/infiniband/rdmap*/ports/1/hw_counters/is absent even though all 16rdmap*devicesenumerate under
ibv_devices), so a per-request byte delta cannot be read on this host. The serve-pathproof instead is that DeepEP-V2 brought its expert all-to-all up on EFA on all 16 DP ranks across both
nodes — the per-rank banner printed during engine init, under
--all2all-backend deepep_v2,NCCL_GIN_TYPE=2,FI_PROVIDER=efa:All 16 ranks (DP0–7 on the leader node, DP8–15 on the worker node) initialized the DeepEP-V2 EFA path;
combined with the kernel-test
efa-direct (found 16 nics)banner in §1, the expert traffic is on EFA, not aTCP/SHM fallback.
Checklist
latesttags).FROM nvcr.io/nvidia/*); no private image referenced.npx markdownlint-cli2clean on changed markdown.## Test Resultsfilled with real E2E output on 2× p5en (DP16/EP16, coherent completion, EFA verified).