The decision layer. Everything the prior sections measured, distilled into what to deploy and when — separated cleanly for two readers: the internal architect choosing a transport, and the customer who just needs a working MoE serve on AWS.
Executive summary. On AWS EFA, DeepEP MoE all-to-all is a working drop-in across three serving frameworks (SGLang, vLLM, TRT-LLM) — but it does not beat a dense / allgather alternative on serving throughput. The reason is structural: EFA's CPU-proxy transport path is issue-bound (~2.2% NIC utilization measured) and pays a fixed +14.7 ms/token measured per-decode-step tax that the all-to-all byte reduction cannot overcome. Use DeepEP on EFA for capacity (fitting a too-big model) or framework fit — not for a serving speedup. A serving speedup requires GPU-initiated transport, which no shipping EFA stack exposes today. Update 2026-07-17: a native kernel-posted path (CQ-poll, no hardware counters) is now measured in §10 — it beats the proxy on dispatch/combine latency but remains a research path, not a serving recipe; this section's verdict is unchanged. On InfiniBand the calculus flips: IBGDA posts the WQE from the kernel, removes the proxy tax, and DeepEP's transport win converts to a serving win.
Every measured claim below is tagged measured on the efa-gda campaign: 2× p5en.48xlarge, AWS EFA (16 NICs/node, 25 GB/s/NIC effective), Qwen3-30B-A3B-FP8 EP16 unless noted. derived = computed from measured. assumed = engineering judgement, verify locally.
One stack serves DeepEP-V2 MoE all-to-all on EFA today. It is a binary drop-in: the
deep_ep wheel and ElasticBuffer API are stock; the transport runs over the
open-source aws-ofi-nccl GIN plugin via a host CPU proxy. Three frameworks ride it, all serve coherently,
all pass AIPerf.
| layer | what / why |
|---|---|
| DeepEP API | deep_ep.ElasticBuffer — the EFA-viable buffer (NCCL-GIN). Never deep_ep.Buffer. |
| GIN transport | NCCL_GIN_TYPE=2 (CPU proxy). Type 3 = GDAKI = not shipping on EFA. |
| plugin | aws-ofi-nccl 9c44d34 — combine-rewrite + FALLBACK_V1 gate-relax for gdrdrv-2.4 nodes. |
| parallelism | EP_NUM_COMMS=8 — K independent NCCL comms = K proxy threads = 4.3× the issue-bound ceiling. |
| frameworks | SGLang 0.5.11 · vLLM (deepep_v2) · TRT-LLM 0.21 — all serve, all pass AIPerf. |
All three frameworks construct ElasticBuffer on EFA (SGLang/vLLM natively or
via shim; TRT-LLM via the api-shim path). Coherent generation verified end-to-end on each.
deep_ep.Buffer (its cross-node
transport is NVSHMEM/IBGDA, which aborts on EFA — nvshmemi_init_thread IBGDA path).
Do not set NVSHMEM_IB_ENABLE_IBGDA=1. Use ElasticBuffer exclusively for
cross-node MoE on EFA, and assert it in the harness — a silent fall-through to Buffer looks
enabled but is wrong, and is the single most common deployment defect.
These are not tuning knobs. Each one is a hard gate — get it wrong and DeepEP either fails to initialize or silently runs the wrong (forbidden) transport. Set all of them.
/devThe GIN proxy opens /dev/gdrdrv for GPUDirect. Without a privileged pod and a hostPath
/dev mount, gdr_open() returns EPERM → GIN logs "Failed to open gdr
handle" → ginType==NONE → ElasticBuffer asserts at construction.
measured
This is a manifest bug, not a plugin/gdrcopy-version bug — the most expensive one to misdiagnose. It is the load-bearing requirement.
Expert-parallel all-to-all only engages when ep_size > top_k. For a top-8 MoE that means
EP ≥ 16 (2 nodes × 8 GPUs). Below that, experts collapse onto fewer ranks and you are not exercising
the cross-node path at all. measured
EP16 = the minimum honest 2-node configuration. Intra-node EP rides NVLink and pays no EFA tax.
| variable | value | why |
|---|---|---|
| NCCL_GIN_TYPE | 2 | CPU-proxy GIN. The only EFA-viable transport (3=GDAKI is upstream-gated). |
| EP_NUM_COMMS | 8 | Multi-comm. K proxy threads → 4.3× the single-comm 8 GB/s ceiling. measured |
| NCCL_NET_PLUGIN | → aws-ofi-nccl 9c44d34 | combine-rewrite + V1 gdr-pin fallback for gdrdrv-2.4 nodes. |
| SGLANG_DEEPEP_USE_V2 | 1 | SGLang: select DeepEP-V2 ElasticBuffer (not legacy Buffer). |
| SGLANG_DEEPEP_NUM_MAX_DISPATCH | 512 | Lifts the 128-tok/rank cap that crashes long-prompt prefill at conc≥32. |
| pod spec | privileged: true | + hostPath mount of /dev — see above. Non-negotiable. |
Framework selection of the backend differs (--moe-a2a-backend deepep on SGLang,
--all2all-backend deepep_v2 on vLLM, AlltoallMethodType.DeepEP via shim on TRT-LLM) — but the
transport stack below the framework is identical across all three.
For the architect placing a MoE model on AWS. Follow the branch; the leaf is the transport choice. The pivot is always the same question — is the network InfiniBand or EFA, and is your goal throughput or capacity?
Leaf colors: green = clear use, amber = measure / tie, purple = InfiniBand-only win. The EFA throughput branch is the one most likely to surprise — see the customer cards below for the per-framework call.
Three intents, three answers. Pick the card that matches what you are actually trying to do.
DeepEP-V2 is a proven drop-in on EFA across all three frameworks. Deploy the stack from
§2 verbatim: ElasticBuffer + NCCL_GIN_TYPE=2 + plugin 9c44d34 +
EP_NUM_COMMS=8, privileged pod with /dev mounted.
All three serve coherently · all pass AIPerf · EP16 on 2× p5en. measured
Measure your alternative. On TRT-LLM the dense path is ~1.5× faster — use dense. On vLLM it is a tie (allgather ≈ DeepEP-multicomm) — pick on ops. DeepEP does not give you a throughput edge here; choose on operations, not on the all-to-all.
TRT 0.67× · vLLM 0.97× · SGLang vs UCCL 1.03× (tie). measured
Use EP / DeepEP for capacity — sharding experts is how a 235B / 256-expert MoE fits at all and frees KV-cache memory. Accept the all-to-all toll: the alternative is OOM, not a faster serve. This is an EP-itself win (allgather-EP has it too).
Capacity is the genuine, often-mandatory advantage — distinct from the contested throughput claim. verify against your GPU memory
The single lever that flips the verdict is GPU-initiated transport: post the dispatch WQE from the CUDA kernel itself (GDAKI), removing the host proxy round-trip. That converts DeepEP's measured transport win into a serving win. Here is exactly where that stands — honestly.
3-framework drop-in, EP16, multi-comm. Parity with dense/allgather; 1.45× dense on transport bytes but that never reaches tok/s. measured
Cross-node DeepEP barrier runs GPU-initiated over EFA at ~19 µs. Proof the wire accepts kernel-posted traffic. measured
Hard-blocked at runtime on a stock p5en (source-verified 2026-06): (1) NCCL's GDAKI
backend is IB/RoCE-only by design — EFA needs a brand-new EFA-GDA backend that does not exist publicly
yet (NCCL #2090, NVIDIA + AWS "actively working"). (2) The GPU-pollable completion counter it needs is
unshipped: the EFA kernel module (efa_linux 3.1.0) has no comp_cntr object and
efadv_query_device doesn't report the cap; rdma-core #1701 is open/no-ETA. libfabric #12114 +
the plugin compile, but runtime dies at the efadv_create_comp_cntr() ioctl. EFA SRD also
has no atomics/ordering, which the accumulating put-signal path assumes. Verdict: park; re-evaluate when
an efa_linux release ships completion counters.
(0) VLLM_MOE_DP_CHUNK_SIZE sweep — the only runtime knob that packs more
tokens per transfer (fewer messages = the right lever for an issue-bound fabric); free, no rebuild.
(1) rebuild the plugin from aws-ofi-nccl@master (our shipped one is 64 GIN commits behind):
commit a698b6e "move signal gdrcopy to a worker thread" takes the receiver read-modify-write
off the proxy CQ-drain thread — directly attacks the per-step proxy stall, decode-concentrated. Builds on the
CPU-proxy path (no GDAKI gate), ~15 min. untested; bounded by the 1-SGE cap
Shard the proxy iput post path across K dedicated post threads with per-shard
request pools and a split ep_lock — attacks the issue-bound ceiling in software, no kernel
change. Multi-day C++ build; the EP_NUM_COMMS=K user-space path already ships the throughput
win so no serving deliverable is blocked. scoped, not yet built
Honest status: GPU-initiated dispatch on EFA is not shipping today. The nearer-term software path (K-thread rail driving) is the realistic next lever. Until one of these lands, DeepEP-on-EFA is a capacity / framework-fit tool, not a serving accelerator — exactly what §0 says.
deep_ep.Buffer — that path is NVSHMEM/IBGDA and forbidden on EFA.End of the DeepEP-on-EFA guidance site. ← Back to the Overview · run the numbers for your own model + workload in the DeepEP-on-EFA Calculator ▸
All measured claims sourced from the efa-gda campaign A/B experiments (TRT-LLM-vs-dense, DeepEP-multicomm-vs-dense, SGLang DeepEP-vs-UCCL, AIPerf 0.10.0). Sanitized — no IPs, account IDs, or hostnames.