mirror of
https://github.com/deepseek-ai/DeepEP.git
synced 2026-11-05 00:47:32 +00:00
[PR #591] [MERGED] Hybrid ep nixl2 #650
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#650
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/591
Author: @QiaoK
Created: 3/12/2026
Status: ✅ Merged
Merged: 4/16/2026
Merged by: @jershi425
Base:
hybrid-ep← Head:hybrid-ep-nixl2📝 Commits (10+)
8bc735badd nixl connector stubsa441b04JIT: Fix potential race condition from multiple processes modifying the same file pathd053b69NIXL: Copy connector and warp code from hybrid-epcd6d4dfNIXL: Implement NIXLCoordinator87af414NIXL: Wire NIXLCoordinator into DeepEPbf71d60NIXL: Add USE_NIXL build path in setup.pyc10ad9fNIXL: Add JIT compiler support for USE_NIXL builddbac297NIXL: Fix Device API v2 compat, FP8 stride mismatch, and JIT build33e0158refactor: decouple internode backends and unify coordinator6ddeb4cConsolidate NIXL warp, fix param_t ABI📊 Changes
18 files changed (+2286 additions, -433 deletions)
View changed files
➕
.use_nixl(+0 -0)📝
README.md(+10 -0)📝
csrc/hybrid_ep/backend/hybrid_ep_backend.cuh(+252 -142)📝
csrc/hybrid_ep/buffer/internode.cuh(+8 -229)📝
csrc/hybrid_ep/buffer/internode_doca.cu(+1 -1)➕
csrc/hybrid_ep/buffer/internode_doca.cuh(+182 -0)➕
csrc/hybrid_ep/buffer/internode_nixl.cu(+208 -0)➕
csrc/hybrid_ep/buffer/internode_nixl.cuh(+41 -0)➕
csrc/hybrid_ep/buffer/nixl_connector.cu(+934 -0)➕
csrc/hybrid_ep/buffer/nixl_connector.h(+146 -0)📝
csrc/hybrid_ep/coordinator.cuh(+75 -0)📝
csrc/hybrid_ep/executor/executor.cu(+19 -5)📝
csrc/hybrid_ep/hybrid_ep.cu(+6 -6)📝
csrc/hybrid_ep/hybrid_ep.cuh(+6 -1)📝
csrc/hybrid_ep/jit/compiler.cu(+38 -3)➕
docs/Dockerfile.nixl(+164 -0)📝
docs/README_Hybrid-EP.md(+105 -2)📝
setup.py(+91 -44)📄 Description
Pull Request: NIXL Integration for Hybrid-EP Multi-Node Communication
Summary
This PR integrates NIXL (NVIDIA Inter-node eXchange Library) as an alternative inter-node communication backend for Hybrid-EP, alongside the existing DOCA/RDMA path. NIXL uses UCX for GPU-to-GPU communication and does not require the NCCL submodule or DOCA SDK, simplifying deployment in environments where DOCA is unavailable.
Motivation
doca_gpunetio_device.h, which often fails with "No rule to make target" when DOCA is not installed.USE_NIXL=1.Changes
1. NIXL Coordinator and Connector
NIXLCoordinator(internode_nixl.cuh/internode_nixl.cu): Implementsallocate_buffers(),destroy(),grow_buffer_config(), andupdate_config()using the NIXL connector.HybridEP_NIXLConnector(nixl_connector.h/nixl_connector.cu): Ported from hybrid-ep; manages NIXL agent lifecycle, buffer registration, peer exchange via etcd, UCX wireup, and GPU context building.hybrid_ep_backend.cuh,nixl_types.h,nixl_warp.cuh): AddedUSE_NIXL-guarded paths fordispatch_gpu_nixl_ctxandcombine_gpu_nixl_ctxin dispatch/combine kernels.2. Build System (
setup.py)HYBRID_EP_MULTINODE=1:USE_NIXL=1): Compilesinternode_nixl.cuandnixl_connector.cu; links against NIXL, UCX, mlx5, ibverbs; skips NCCL/DOCA build.USE_NIXL=0): Compilesinternode.cu; builds NCCL submodule; uses DOCA objects for JIT..use_nixlfallback: IfUSE_NIXLis not set but.use_nixlexists in the project root, the NIXL path is used (helps when pip build isolation does not propagate env vars).doca_gpunetio_device.h), a clear error suggests usingUSE_NIXL=1or creating.use_nixl.use_nixl=...and-> NIXL pathor-> DOCA pathduring build.3. JIT Compiler (
compiler.cu)USE_NIXL, JIT-compiled inter-node kernels use NIXL libs instead of DOCA objects.[HybridEP JIT] Inter-node: using NIXLorusing DOCA/RDMAwhen the JIT compiler initializes.4. Runtime Logging (
hybrid_ep.cu)[HybridEP] Inter-node: using NIXL (node_rank=X local_rank=Y)orusing DOCA/RDMAwhen multinode coordinators are initialized.[HybridEP] NIXL allocate_buffers (num_of_nodes=X)orDOCA allocate_buffersfor debugging.5. Documentation
doca_gpunetio_device.herror.hybrid_ep_testconfiguration (WORLD_SIZE,RANK,MASTER_ADDR, etc.).NUM_OF_HYBRID_EP_RANKS_PER_NVLINK_DOMAIN.6. Other Fixes
.../jit/proc-{pid}) to avoid races when multiple processes compile concurrently.Build Instructions
NIXL path (recommended when DOCA is unavailable):
DOCA path (when DOCA SDK is available):
Fallback when env does not propagate:
Testing
python tests/test_hybrid_ep.py --num-processes 4(unchanged; NIXL not used).WORLD_SIZE=2,RANK=0or1,MASTER_ADDR,MASTER_PORTon each node; runpython tests/test_hybrid_ep.py --num-processes 4on both.NUM_OF_HYBRID_EP_RANKS_PER_NVLINK_DOMAIN=2 python tests/test_hybrid_ep.py --num-processes 4to simulate 2 nodes on 4 GPUs.Dependencies
Backward Compatibility
USE_NIXL=0(default) preserves the DOCA path; no behavior change for existing DOCA users.#ifdef USE_NIXL; no NIXL symbols are linked when using DOCA.🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.