mirror of
https://github.com/deepseek-ai/DeepEP.git
synced 2026-11-05 00:47:32 +00:00
[PR #466] Allow NVSHMEM PE to NIC mapping to be initialized by DeepEP rank #586
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#586
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?
📋 Pull Request Information
Original PR: https://github.com/deepseek-ai/DeepEP/pull/466
Author: @smarterclayton
Created: 10/24/2025
Status: 🔄 Open
Base:
main← Head:nic_pe_alignment📝 Commits (2)
55d97a6Allow NVSHMEM PE to NIC to be initialized by rank8a07e7eIf CUDA_VISIBLE_DEVICES is set, map cuda.current_device()📊 Changes
1 file changed (+32 additions, -0 deletions)
View changed files
📝
deep_ep/buffer.py(+32 -0)📄 Description
The
nvshmemi_get_devices_by_distancedefault initialization method in NVSHMEM does not work optimally for GPU configurations where 2 GPU and 2 RDMA NIC share a PCIe bus, such as the x86 based GCP A3 Ultra H200 and A4 B200 instance types: https://cloud.google.com/compute/docs/gpus/gpu-network-bandwidth#h200-gpus. GPU0 and GPU1 (on two independent processes) observe NIC0 and NIC1 on the same PCIe switch as being equidistant and the default configuration for DeepEP + NVSHMEM results in both GPUs being assigned NIC0 fromnvshmemi_get_devices_by_distance, halving the observed bandwidth for RDMA in test_internode.py and in vLLM wide-EP (because 4 of 8 NIC are enabled).The alternative is a static mapping between GPU host index (PE) and NIC index (HCA), but the
NVSHMEMX_INIT_WITH_UNIQUEIDinitialization method bypasses settingmype_nodeandnpes_node.The
nvshmemi_boot_handle.pg_rankfor this initialization method is always 0 and thenvshmem_boot_handle.pg_sizeis always 2, and as a result mype_node and npes_node are set to 0 and 2 respectively for all PEs initializing. This preventsNVSHMEM_ENABLE_NIC_PE_MAPPING=1from selecting from a static list of devices by mype_node / local rank intransport.cpp#nvshmemi_setup_connections:To allow static assignment, we introduce a new
DEEP_EP_DEVICE_TO_HCA_MAPPINGenvironment variable duringdeep_ep.Bufferinitialization that accepts<cuda_device_id>:<HCA_name>:<HCA_port>and usestorch.cuda.current_device()to setNVSHMEM_HCA_LISTto the appropriate<HCA_name>:<HCA_port>, or error if no such device was listed.We are proposing the change to DeepEP because the choice of initialization method determines how HCA to GPU binding can be achieved across multiple existing NVSHMEM versions. Because vLLM 0.11.0 uses CUDA_VISIBLE_DEVICES to associate GPU devices to each rank, we reverse map the visible devices to the current cuda device.
On GCP we would propose this configuration for all full host workloads on A3U and A4 instance types (H200/B200 + x86 with shared PCIe hubs per 2 NIC / 2 GPU):
Tested with NVSHMEM 3.3.20 and vLLM 0.11.0 and vLLM main @ 2025/10/23.
Co-Authored-By: Keon Jang keonjang@google.com
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.