mirror of
https://github.com/deepseek-ai/DeepEP.git
synced 2026-11-05 00:47:32 +00:00
[GH-ISSUE #700] Low-latency combine returns one corrupted token row on B200 (~3% of invocations at max tokens/rank) #405
Labels
No labels
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
deepseek-ai/DeepEP#405
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @Oseltamivir on GitHub (Jul 26, 2026).
Original GitHub issue: https://github.com/deepseek-ai/DeepEP/issues/700
On B200 (sm100),
low_latency_combineintermittently returns one corrupted token row. no error, no NaN, plausible magnitudes. H100 and H200 are ok.Environment
fa8a9b16, legacyBufferlow-latency path (csrc/kernels/legacy/internode_ll.cu). Currentmainis byte-identical in this file, so it is not a stale-pin issue.low_latency_mode=True,allow_nvlink_for_low_latency_mode=True.num_max_dispatch_tokens_per_rank=256.Symptom
One dispatch + combine round trip at 256 tokens/rank, output compared against a host-side reference of the same reduction:
A dropped contribution would cut the row norm by ~12% and perturb every element. Preserved norm plus a dense-but-partial element set is what you get if one of the topk=8 expert contributions is read from the wrong slot.
Example (BF16, one event):
Ruled out by experiment
num_max_dispatch_tokens_per_rankto 511 while keeping the workload at 256 tokens/rank (buffer ~50% full) still corrupts. Note 512 is not testable without also raisingNVSHMEM_QP_DEPTH, sincenvshmem_qp_depth >= (num_max_dispatch_tokens_per_rank + 1) * 2asserts at construction.rdma_recv_flagis waited on by a single thread withld_acquire_sys_global, while the TMA and reduction warps reach the payload through the device-scopecg::this_grid().sync()atinternode_ll.cu:976; there is no__threadfence_systemin the file. Adding one immediately after that grid sync and rebuilding changes nothing (8 failures / 336 samples, unchanged), so this appears not to be the mechanism.Ask
Is a wrong-slot read plausible in the combine receive path on sm100? for example in the
kNumStagesmbarrier/TMA pipeline, or in therdma_recv_xslot addressing at(topk_idx * num_max_dispatch_tokens_per_rank + token_idx)? Happy to run further instrumentation on the reproducing hardware, including a device-side event ring, if that would help narrow it.@MARD1NO commented on GitHub (Aug 3, 2026):
Do you apply this fix?: https://github.com/deepseek-ai/DeepEP/pull/642
@Oseltamivir commented on GitHub (Aug 6, 2026):
Yes, it's working after pinning to a new version. Thanks @MARD1NO