DeepEP on EFA

§5 · The alternatives — do they serve on EFA, and how fast?

DeepEP is one way to do Mixture-of-Experts all-to-all. There are five paths a serving stack can take on AWS EFA today. This section surveys each one with the same four questions: what is it, does inference actually serve on EFA (yes / no / with-what), what did we measure, and when would you pick it. Everything tagged measured ran on the efa-gda campaign — 2× p5en.48xlarge, 16 EFA NICs/node, Qwen3-30B-A3B-FP8 EP16 unless noted — not vendor spec sheets.

The one-line answer, up front. On EFA today, for serving throughput: pick dense allgather (fastest on TRT-LLM, 1.5× over DeepEP) or DeepEP multi-comm / allgather where they tie (vLLM, SGLang). UCCL and pplx are research comparators — UCCL needs a fork and ties DeepEP on serving despite a 4× transport edge; pplx has no serving adapter. DeepEP's genuine win is model capacity plus a future GDAKI path that no shipping EFA stack runs yet (a counter-free native research variant is measured in §10).

The decision matrix — five paths, one glance

Rows are the all-to-all alternatives. Read left-to-right: does it serve on EFA, how fast is the transport, how fast is end-to-end serving, does it need a code fork, and the one-line "pick it when". Green = yes / fast / no-fork. Amber = ties / caveat. Red = no / slow / blocker.

path serves on EFA? transport speed serving speed needs a fork? pick it when… Dense / allgather the "no-DeepEP" baseline YES no special transport N/A (O(N) volume) NVLink + small EFA FASTEST TRT 1.5× over DeepEP NO EP≤16 serving, default choice DeepEP-V2 (ElasticBuffer) NCCL-GIN CPU-proxy · the subject YES GIN_TYPE=2 proxy GOOD 33 SO · 1.45× UCCL-pub TIE parity w/ allgather NO capacity, or a working drop-in UCCL raw-ibverbs a2a wrapper PARTIAL SGLang yes · vLLM no FASTEST 47µs · ~4× microbench TIE 1.03× vs DeepEP YES research compare, long-prefill edge pplx (perplexity-garden) kernel-level a2a NO SERVE no adapter GOOD 222µs / 362µs — (comparator) not a serving path n/a transport bench only IBGDA / GDAKI GPU-initiated · the unlock NO SRD: no atomics/order would be best removes proxy tax WOULD WIN IB-only today 3 unshipped upstream layers on InfiniBand, not EFA (yet)

Verdict colours: ● yes / fast / no-fork   ● ties / caveat / partial   ● no / blocker / fork-required. "transport speed" = dispatch/combine microbench (bytes-on-the-wire); "serving speed" = end-to-end aggregate tok/s. The two columns disagree on purpose — that disagreement is the whole story of this section.

1 · Dense / allgather — the "no-DeepEP" baseline

What it is

Skip the expert-parallel all-to-all entirely. Each rank gathers every token (allgather), every rank runs every expert it owns, then a reduce-scatter returns the results. O(N) communication volume per GPU instead of DeepEP's O(top-k) — but it rides NVLink intra-node and a small EFA collective cross-node, with no special transport stack. In the frameworks: TRTLLM_MOE_DISABLE_ALLTOALLV (TRT-LLM) or --all2all-backend allgather_reducescatter (vLLM).

Does it serve on EFA?

Yes — everywhere, no caveats. It is the path that needs nothing: no GIN plugin, no ElasticBuffer, no QP-cap tuning, no proxy. If a framework runs on the box, this runs.

When to pick it

This is the default recommendation for EP≤16 serving on EFA. Reach for DeepEP only when a measurement or a capacity constraint says you should — not by default.

measured A/B (same framework, same model/nodes, EP16)DeepEP agg tok/sdense agg tok/sDeepEP / dense
TRT-LLM 0.21 · conc4 / ISL12068.7105.660.65×
TRT-LLM 0.21 · conc32 / ISL120545.04794.560.69×
vLLM · conc32 / decode2963040.97× (tie)
vLLM · conc64 / prefill18201227970.80×

measured Dense is 1.5× faster than DeepEP on TRT-LLM and ties DeepEP on vLLM. There is no measured serving regime on EFA where DeepEP beats dense — best case is a tie. That single fact is why dense is the default.

2 · DeepEP-V2 (ElasticBuffer, NCCL-GIN CPU-proxy) — the subject

What it is

DeepSeek's expert-parallel all-to-all, V2 generation. On EFA it runs through deep_ep.ElasticBuffer over the NCCL-GIN CPU-proxy path (NCCL_GIN_TYPE=2) — not the IBGDA/NVSHMEM path the upstream deep_ep.Buffer assumes, which EFA cannot run (no atomics, no ordering on SRD). The proxy posts each cross-node dispatch via the host: D2H ring → CPU proxy → libfabric fi_writedata → EFA SRD.

Does it serve on EFA?

Yes — proven on all three frameworks. SGLang, vLLM and TRT-LLM all serve DeepEP-V2 on EFA and pass AIPerf with coherent generation. The platform requirement: frameworks must construct ElasticBuffer, not Buffer — asserted in the harness so a silent fall-back to a broken transport cannot pass unnoticed.

The run-it-right knob: EP_NUM_COMMS=8 (multi-comm)

A single NCCL-GIN comm is issue-bound at ~8 GB/s SO — the CPU-proxy posts one fi_writedata/doorbell per token, serialized on one progress thread. Minting K independent comms behind the ElasticBuffer wall gives K progress threads and K× the issue ceiling.

multi-comm transport scaling (dispatch SO GB/s, prefill, MEASURED) K=1 ████████ ~8 GB/s (single-comm, issue-bound) K=2 █████████████ 12-13 1.7× K=4 █████████████████████ 21 K=8 █████████████████████████████████ 33 4.3× ← peak, recommended EP_NUM_COMMS=8 recovers vLLM serving 142 → 296 tok/s (2.09×) = PARITY with allgather. It 4×'d transport BYTES but did NOT change serving tok/s. Run it right ≠ beat dense.
Where DeepEP genuinely wins
  • Transport bytes measured — 33–35 GB/s SO dispatch prefill, 1.45× UCCL-published (22.77). The O(top-k) volume reduction is real on the wire.
  • Capacity — sharding experts fits a model that wouldn't otherwise (allgather-EP shares this; it is an EP-itself win, not a DeepEP-a2a win).
  • Drop-in — 3-framework serving proven; EP_NUM_COMMS mints the comms from a stock import.
Where it only ties / loses
  • Serving tok/s — TRT dense 1.5× faster; vLLM allgather a tie; prefill 1.25× to dense; EP32 a dead tie.
  • Expert count anti-scales measured — 128 exp = 36 SO, 256 exp = 13 SO (0.36×). More experts is slower.
  • Root cause — the all-to-all is not the serving critical path, and the fixed +14.7 ms/token CPU-proxy tax (~2.2% NIC util, issue-bound) never amortizes.

3 · UCCL — raw-ibverbs all-to-all, the fast-transport comparator

What it is

A raw-ibverbs MoE all-to-all wrapper. It bypasses the CPU proxy with GPU-driven raw verbs (WR-chaining, per-thread CQ/QP, out-of-order drain) and lands ~4× faster on the dispatch microbench — 47 µs vs DeepEP's 186 µs. It is the closest thing on EFA to what GDAKI would deliver, but implemented in user space.

Does it serve on EFA?

Partial. It serves via stock SGLang (--moe-a2a-backend deepep + a usercustomize shadow so every rank picks up the UCCL wrapper). It did not serve stock vLLM — vLLM's per-DP-worker Buffer construction deadlocks UCCL's collective all_gather_object; SGLang's symmetric launch satisfies the contract.

The headline finding — 4× transport, but a serving tie

Same framework (SGLang), same pods/model, ≥2-rep, decode variance <1%:

regimeDeepEP-V2 tok/sUCCL tok/sDeepEP / UCCL
conc 32263.9254.21.038×
conc 2562173.82105.41.032×
Transport microbench (dispatch latency, lower = faster) DeepEP 186 µs UCCL 47 µs · ~4× faster Serving throughput (agg tok/s @ conc32, higher = faster) DeepEP 263.9 UCCL 254.2 · TIE (1.03×)

measured UCCL's ~4× transport edge does not convert to serving throughput at EP16 — the bars on top are wildly unequal, the bars on the bottom are a tie. This is the same conclusion the whole campaign reaches from the other direction: all-to-all is not the serving critical path, so the fastest transport on EFA ties the proxy one when you actually serve.

When to pick it. As a research comparator, or where you can carry a fork and want the robustness edge: DeepEP-V2's ElasticBuffer crashed on long-prompt prefill (num_max_tokens_per_rank=128 cap) where UCCL completed every cell. For turnkey serving on EFA today, UCCL's fork requirement and serving tie make it a harder sell than dense or DeepEP-multicomm.

4 · pplx (perplexity-garden) — built and benchmarked, no serve adapter

What it is

Perplexity's open MoE all-to-all kernels (perplexity-garden). We built them on EFA and ran the transport benchmark to complete the comparison.

pathEFA latencyvs published
dispatch222 µsmatches
combine362 µsmatches

Does it serve on EFA?

No — diagnostic comparator only. pplx has no serving adapter: there is no vLLM / SGLang backend that drives it for real inference. It validates the transport layer (and confirms our EFA build is sane — the numbers match published), but it is not a turnkey serving backend.

When to pick it

Transport benchmarking and sanity-checking a build. Not for production serving on EFA without writing the missing serving integration yourself.

5 · IBGDA / GDAKI — GPU-initiated, the "what would improve it" answer

What it is

GPU-initiated communication: the kernel posts the work-queue entry and rings the doorbell itself — no CPU proxy on the data path. This is the only path that would let DeepEP beat dense on serving, because it removes the fixed +14.7 ms/token proxy tax that every measurement traces back to.

Does it serve on EFA? No, not today.
  • EFA SRD has no atomics and no message ordering; the kernel-posted-WQE dispatch path needs both.
  • It depends on a 3-layer unshipped stack: rdma-core comp-counter symbols, a libfabric counter PR, and an aws-ofi-nccl hardware-counter hook — none publicly released.
  • It works on InfiniBand today (IBGDA/NVSHMEM). On EFA the cross-node barrier works through our GDAKI override (~19 µs), but cross-node dispatch does not.
The honest frontier. DeepEP's volume saving is real in bytes but never reaches the serving critical path on EFA's CPU-proxy. Only GPU-initiated transport (GDAKI, or a UCCL-class raw-ibv port) removes the per-step host round-trip that swamps it. GDAKI is upstream-gated; UCCL is a multi-week port evaluated and declined as a dependency. Neither is reachable with a knob on EFA today — which is exactly why, on EFA, the serving recommendation is dense or DeepEP-at-parity, not DeepEP-as-a-win.

Verdict — what to actually deploy

▸ Serving on EFA, EP≤16

Use dense allgather (fastest on TRT-LLM, 1.5×) or DeepEP multi-comm / allgather where they tie (vLLM, SGLang). Pick on robustness and operational simplicity, since serving throughput is a wash.

◆ Capacity-forced

If the model won't fit without sharding experts, use DeepEP / EP — a working serve beats OOM. That is an EP-itself win (allgather-EP has it too), not a DeepEP-a2a throughput win.

○ Research comparators

UCCL (fork, serving tie, long-prefill edge) and pplx (no serve adapter) are for benchmarking the transport layer — not turnkey serving backends on EFA.

▲ The future win

DeepEP beats dense on serving only with GDAKI / IBGDA — which removes the proxy tax but is InfiniBand-only today. DeepEP's win on EFA is capacity + a future GDAKI.

Bottom line. On EFA today, for serving: dense (TRT) or DeepEP-multicomm / allgather-tie (vLLM, SGLang). UCCL / pplx = research comparators. DeepEP's real win is capacity + a future GDAKI path the shipping fabric stack cannot run yet. 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.

All measured claims: efa-gda campaign, 2× p5en.48xlarge, 16 EFA NICs/node, SRD (no atomics / no ordering / CQ-local / 1-SGE write), Qwen3-30B-A3B-FP8 EP16 unless noted. Sources: EXP-AB-TRTLLM-DEEPEP-VS-DENSE, EXP-AB-DEEPEP-MULTICOMM-VS-DENSE, EXP-AIPERF-SGLANG-AB, EXP-UCCL-SGLANG-LIVE, and the make-DeepEP-beneficial closeout (2026-06-19).

Next: §6 Solution architecture →