feat: add checkpoint-engine refit interface and integrate NIXL - #2608
Conversation
|
Auto-sync is disabled for draft pull requests in this repository. Workflows must be run manually. Contributors can view more details about this message here. |
ebf023f to
e5829e0
Compare
|
Auto-sync is disabled for ready for review pull requests in this repository. Workflows must be run manually. Contributors can view more details about this message here. |
6aeadb6 to
cad807c
Compare
6968a6c to
cb745fa
Compare
bd5271d to
c251ec6
Compare
|
/ok to test 705af30 |
|
Awesome @HollowMan6. Generally looks great to me! |
|
/ok to test 4d89446 |
terrykong
left a comment
There was a problem hiding this comment.
Re-review at head 4d89446b3 (rebased on top of the now-merged delta-refit #2444). Prior rounds were thorough — every earlier "fixed" claim landed, the lint failure I flagged last round is fixed, and the NIXL double-buffer handshake, bucket split/merge, and sharded w13/w2 placement were independently verified against vLLM 0.20.0 and check out.
The main new point from the rebase is structural, not a bug: delta-refit and this PR both add a non-colocated vLLM refit backend, but they're selected and dispatched three different ways (refit_transport string enum vs checkpoint_engine.enabled block vs the legacy inline path), with no single selector and no mutual-exclusion guard. The lead inline comment lays this out — aligning this PR with delta-refit's weight_synchronizer-at-setup pattern (routed through the existing-but-unused create_weight_synchronizer factory) collapses the dispatch to one path and makes the colocated guard actually run. A single docs/guides/refit.md explaining how to pick among the refit methods is also missing.
Minor / non-blocking: the PR description still shows the old update_weights_bucket_megabytes / cleanup_after_load fields (now update_weights_bucket_memory_ratio / release_after_refit); worth refreshing and surfacing the guide's NIXL-vs-NCCL benchmark table.
Generated by Claude Code
Signed-off-by: Hollow Man <hollowman@opensuse.org>
Signed-off-by: Hollow Man <hollowman@opensuse.org>
Signed-off-by: Hollow Man <hollowman@opensuse.org>
Signed-off-by: Hollow Man <hollowman@opensuse.org>
Signed-off-by: Hollow Man <hollowman@opensuse.org>
Signed-off-by: Hollow Man <hollowman@opensuse.org>
Signed-off-by: Hollow Man <hollowman@opensuse.org>
|
/ok to test 0916403 |
Signed-off-by: Hollow Man <hollowman@opensuse.org>
|
/ok to test 64c42b6 |
What does this PR do?
Adds NIXL checkpoint-engine refit for transferring policy weights to
non-colocated vLLM generation workers.
The implementation:
refit_transportand weight-synchronizerlifecycle.
generation.
GPU memory.
release after each refit.
destination-layout-aware sharded-expert path.
before transfer.
x86-64 and ARM64.
Limitations
shard_expert_weights: truecurrently supports unquantized Triton MoEstorage.
full-weight refit with
shard_expert_weights: false.supported by the sharded-expert path.
Issues
None.
Usage
Enable NIXL for non-colocated vLLM generation:
For MoE models, enable destination-local expert transfer with:
NIC and rail selection can be configured through
backend_init_params.Site-specific device names are intentionally not included in the minimal
configuration.
See:
docs/guides/refit.mddocs/guides/checkpoint-engine-refit.mddocs/design-docs/checkpoint-engines.mdPerformance
DeepSeek-V3 BF16 was benchmarked with 32 Megatron policy nodes and four vLLM
rollout nodes over eight RDMA rails:
Within the same NIXL build, destination-local sharded-expert transfer reduced
refit time from 36.81 s to 10.92 s, a 3.37x improvement.
tools/refit_verifier.pyreported identical aggregate outputs and logprobabilities for the full- and sharded-expert paths.
Testing
lifecycle, async receive/load dispatch, and sharded expert placement.
environments.
refits.
tools/refit_verifier.py.Before your PR is "Ready for review"
Pre checks:
Additional Information
The default configuration retains NIXL transfer buffers and peer connections
across refits for throughput. Set
release_after_refit: truewhen reclaimingthe transfer-buffer memory between refits is more important than avoiding
buffer registration and allocation overhead.