NVIDIA-NeMo / NVIDIA-NeMo/Megatron-Bridge
[training] flex dispatcher downgrades an explicitly requested `deepep` to `alltoall` on GB200 (warning only, no error) — clarify GB200 policy or fail fast
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 920
- Forks
- 505
- Avg merge
- 1d 16h
- Merged PRs (30d)
- 253
Description
Summary
apply_flex_dispatcher_backend (src/megatron/bridge/training/flex_dispatcher_backend.py) only allows moe_flex_dispatcher_backend="deepep" when device_properties.major in [8, 9] or the device name starts with NVIDIA B200 / NVIDIA B300. On NVIDIA GB200 (compute capability 10.0, name NVIDIA GB200) the request is rejected and the run continues with alltoall. A rank-0 logger.warning ("DeepEP is only applicable to Ampere, Hopper, and Blackwell (B200/B300) GPUs ... Falling back to alltoall.") is emitted, but the job does not stop: an explicitly requested dispatcher is replaced by a different one and training proceeds, so the change is easy to miss in a multi-thousand-line rank-0 log.
(Correction, 2026-09-07: the first version of this issue said "no warning is emitted" — that was wrong, the warning exists in v0.6.0 and on main. The request below is about turning the warning into an error / an explicit opt-in, and about the GB200 policy itself.)
Same gate on main (checked 2026-09-06) and on r0.6.0. Related PRs #2731 (introduced the startswith form), #5207 (explicitly "does not add NVIDIA GB200 to the DeepEP allow-list"), #5740, #5468 (NCCL EP) — none change the gate.
Environment
- Container:
nvcr.io/nvidia/nemo:26.08(aarch64), Megatron-Bridge v0.6.0 (commit c932511), Megatron-Core 0.19 (16ad357), DeepEP 1.2.1+de0dd11 - Hardware: GB200 NVL72, 4 GPU/node, driver 580.126.20, CC 10.0,
torch.cuda.get_device_name()→NVIDIA GB200 - Model: GLM-5.2 SFT recipe
glm52_sft_192gpu_gb200_bf16_config, EP32 across 8 nodes
Reproduction
- Take the GB200 GLM-5.2 SFT recipe and set
model.moe_token_dispatcher_type=flex model.moe_flex_dispatcher_backend=deepep. - Run on GB200. Rank 0 logs the fallback warning once; the effective config shows
moe_token_dispatcher_type=alltoall; training runs to completion underalltoall. - DeepEP itself works on the same hardware: the official
tests/test_intranode.py --num-processes 4passes on one GB200 node (and HybridEPtest_hybrid_eppasses, BF16/FP8, ~830 GB/s NVL).
Expected
Either (a) accept deepep on major == 10 devices (or at least on NVIDIA GB200/GB300 by name, consistent with B200/B300), or (b) raise (or require an explicit allow_dispatcher_fallback-style opt-in) instead of downgrading, so users do not benchmark or converge under a dispatcher they did not ask for. The docstring says GB200/GB300 are HybridEP-only; if that is the intended policy, please surface it at runtime.
Why it matters
alltoallvsdeepep/hybridepchanges throughput materially at EP32; users comparing dispatchers on GB200 get misleading numbers.- We spent several jobs believing we were on
deepep. We now usehybridep(the official GB200 path) and documented the gate as a pitfall.
Possible fix
In apply_flex_dispatcher_backend, extend the allow-list to major == 10 (or names starting with NVIDIA GB200/NVIDIA GB300) if DeepEP is supported there, or replace _fallback_to_alltoall with a ValueError for an explicitly requested backend (keeping the fallback only when the backend was recipe-implied). Happy to send a PR for whichever is preferred.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start in src/megatron/bridge/training/flex_dispatcher_backend.py at apply_flex_dispatcher_backend, inspect the device allow-list and fallback path, and review related PRs #2731 and #5207. Reproduce the GB200 configuration and verify that the final behavior matches a documented policy: accept deepep, or fail explicitly instead of silently selecting alltoall.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python, pytorch
- Domain
- machine-learning, performance
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100