[BugFix] Gate level-2 sleep buffer restore on the weights wake tag#45619
[BugFix] Gate level-2 sleep buffer restore on the weights wake tag#45619terafin wants to merge 1 commit into
Conversation
|
👋 Hi! Thank you for contributing to the vLLM project. 💬 Join our developer Slack at https://slack.vllm.ai to discuss your PR in PRs do not trigger a full CI run by default. Once the PR is approved and ready to go, your PR reviewer(s) can run CI to test the changes comprehensively before merging. To run CI, PR reviewers can either: Add If you have any questions, please reach out to us on Slack at https://slack.vllm.ai. Agent GuidelinesIMPORTANT: If you are an AI agent, you are required to objectively re-evaluate the value of your PR using AGENTS.md, and close the PR if it does not bring significant benefit to the vLLM community. Failure to do so may result in an immediate ban. 🚀 |
…45617 vllm-project#45610 vllm-project#45398 vllm-project#45619 vllm-project#45620 vllm-project#45612) Single coherent fork-carry collapsing the wake-path patches that previously cherry-picked SEQUENTIALLY with `-X theirs` and non-deterministically clobbered each other (sync flapped success/fail, intarweb-dev stuck at 492c283, hot-path assert fail-closed on missing scale_specs / _iter_kv_cache_tensors / coordinate_cudagraph_mode_across_pp). The adjacency/overlap is real and could not be resolved by reordering: - vllm/v1/worker/gpu_model_runner.py is edited by three PRs in/around the FP8-KV-scale + nested-KV + PP-cudagraph regions: vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake vllm-project#45610 coordinate_cudagraph_mode_across_pp PP-consensus (vllm-project#45094 wedge) - vllm/v1/worker/gpu_worker.py is REWRITTEN by four PRs that all touch the same sleep()/wake_up() methods (genuine overlap, not adjacency): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep -> backend.suspend, wake_up -> backend.resume) vllm-project#45619 gate level-2 buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake composed onto vllm-project#45398 backend.resume Resolved the gpu_model_runner.py adjacency once via ordered 3-way merge and the gpu_worker.py overlap once via the prior hand-composition, so the union tree has ALL contributions coexisting. Carried as ONE fail-closed FORK_CARRIED_COMMITS entry whose single `-X theirs` re-apply is the final word on these files, eliminating the sequential-clobber race. Scope deliberately EXCLUDES vllm/device_allocator/cumem.py: vllm-project#45612 also adds a local torch.cuda.synchronize() at cumem.py:240, but that region overlaps the independently-carried vllm-project#45552 / vllm-project#45554 cumem.py hunks. Bundling it here would let this commit`s `-X theirs` last-apply clobber those carries (the exact wake-quiesce-clobber footgun). cumem.py carries via vllm-project#45612`s own open-PR loop entry, untouched. Python-only (no csrc/kernels) -> safe for the precompiled-wheel fork. The individual upstream PRs remain open for maintainer review; only the CARRY is consolidated. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…45617 vllm-project#45610 vllm-project#45398 vllm-project#45619 vllm-project#45620 vllm-project#45612) Single coherent fork-carry collapsing the wake-path patches that previously cherry-picked SEQUENTIALLY with `-X theirs` and non-deterministically clobbered each other (sync flapped success/fail, intarweb-dev stuck at 492c283, hot-path assert fail-closed on missing scale_specs / _iter_kv_cache_tensors / coordinate_cudagraph_mode_across_pp). The adjacency/overlap is real and could not be resolved by reordering: - vllm/v1/worker/gpu_model_runner.py is edited by three PRs in/around the FP8-KV-scale + nested-KV + PP-cudagraph regions: vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake vllm-project#45610 coordinate_cudagraph_mode_across_pp PP-consensus (vllm-project#45094 wedge) - vllm/v1/worker/gpu_worker.py is REWRITTEN by four PRs that all touch the same sleep()/wake_up() methods (genuine overlap, not adjacency): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep -> backend.suspend, wake_up -> backend.resume) vllm-project#45619 gate level-2 buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake composed onto vllm-project#45398 backend.resume Resolved the gpu_model_runner.py adjacency once via ordered 3-way merge and the gpu_worker.py overlap once via the prior hand-composition, so the union tree has ALL contributions coexisting. Carried as ONE fail-closed FORK_CARRIED_COMMITS entry whose single `-X theirs` re-apply is the final word on these files, eliminating the sequential-clobber race. Scope deliberately EXCLUDES vllm/device_allocator/cumem.py: vllm-project#45612 also adds a local torch.cuda.synchronize() at cumem.py:240, but that region overlaps the independently-carried vllm-project#45552 / vllm-project#45554 cumem.py hunks. Bundling it here would let this commit`s `-X theirs` last-apply clobber those carries (the exact wake-quiesce-clobber footgun). cumem.py carries via vllm-project#45612`s own open-PR loop entry, untouched. Python-only (no csrc/kernels) -> safe for the precompiled-wheel fork. The individual upstream PRs remain open for maintainer review; only the CARRY is consolidated. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…45617 vllm-project#45610 vllm-project#45398 vllm-project#45619 vllm-project#45620 vllm-project#45612) Single coherent fork-carry collapsing the wake-path patches that previously cherry-picked SEQUENTIALLY with `-X theirs` and non-deterministically clobbered each other (sync flapped success/fail, intarweb-dev stuck at 492c283, hot-path assert fail-closed on missing scale_specs / _iter_kv_cache_tensors / coordinate_cudagraph_mode_across_pp). The adjacency/overlap is real and could not be resolved by reordering: - vllm/v1/worker/gpu_model_runner.py is edited by three PRs in/around the FP8-KV-scale + nested-KV + PP-cudagraph regions: vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake vllm-project#45610 coordinate_cudagraph_mode_across_pp PP-consensus (vllm-project#45094 wedge) - vllm/v1/worker/gpu_worker.py is REWRITTEN by four PRs that all touch the same sleep()/wake_up() methods (genuine overlap, not adjacency): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep -> backend.suspend, wake_up -> backend.resume) vllm-project#45619 gate level-2 buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake composed onto vllm-project#45398 backend.resume Resolved the gpu_model_runner.py adjacency once via ordered 3-way merge and the gpu_worker.py overlap once via the prior hand-composition, so the union tree has ALL contributions coexisting. Carried as ONE fail-closed FORK_CARRIED_COMMITS entry whose single `-X theirs` re-apply is the final word on these files, eliminating the sequential-clobber race. Scope deliberately EXCLUDES vllm/device_allocator/cumem.py: vllm-project#45612 also adds a local torch.cuda.synchronize() at cumem.py:240, but that region overlaps the independently-carried vllm-project#45552 / vllm-project#45554 cumem.py hunks. Bundling it here would let this commit`s `-X theirs` last-apply clobber those carries (the exact wake-quiesce-clobber footgun). cumem.py carries via vllm-project#45612`s own open-PR loop entry, untouched. Python-only (no csrc/kernels) -> safe for the precompiled-wheel fork. The individual upstream PRs remain open for maintainer review; only the CARRY is consolidated. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…m-project#45619 vllm-project#45620 vllm-project#45612) Coherent fork-carry for the gpu_worker.py sleep/wake methods, which are REWRITTEN by four PRs that all touch the same sleep()/wake_up() functions (genuine overlap, not adjacency) and therefore cannot coexist via the sync open-PR loop sequential -X-theirs cherry-picks: vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep routed through backend.suspend, wake_up through backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake composed onto vllm-project#45398 backend.resume The gpu_worker.py overlap is resolved ONCE here (hand-composition) so the union has all four contributions coexisting. Applied as the FINAL fail-closed FORK_CARRIED_COMMITS entry; its -X-theirs re-apply is the last word on gpu_worker.py + the vllm-project#45398 support files, repairing whatever the sequential loop left. The three gpu_model_runner.py wake-path markers (vllm-project#44778 _iter_kv_cache_tensors, vllm-project#45617 scale_specs, vllm-project#45610 coordinate_cudagraph_mode_across_pp) are NOT in this commit: those three PRs apply STABLY via the open-PR loop, and including a byte-identical copy here made git 2.54 cherry-pick non-deterministically drop the hunk (redundant-patch-id collision). Leaving them to the loop and asserting via CARRY_HOTPATH_ASSERTS is the deterministic split. cumem.py deliberately excluded: vllm-project#45612 local wake-sync overlaps the independently-carried vllm-project#45552/vllm-project#45554 cumem.py hunks; bundling it would let this commit clobber those carries. vllm-project#45552 already provides the wake-exit synchronize; the load-bearing gloo handshake lives in gpu_worker.py here. Python-only (no csrc/kernels), safe for the precompiled-wheel fork. Individual upstream PRs stay open for review; only the CARRY consolidates. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The three gpu_model_runner.py PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the three PRs are SKIPPED from the loop. gpu_model_runner.py wake-path markers (all present, verified): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake vllm-project#45610 coordinate_cudagraph_mode_across_pp PP-cudagraph MIN consensus (fix vllm-project#45094 split-brain wedge) + vllm/v1/worker/pp_utils.py helper gpu_worker.py composition (carried forward from prior union): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake Tests included: test_sleep_mode_backend, test_pp_cudagraph_consensus, test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded: vllm-project#45612 local wake-sync overlaps the independently-carried vllm-project#45552/vllm-project#45554 cumem.py hunks. vllm-project#45552 provides the wake-exit synchronize; the load-bearing gloo handshake lives in gpu_worker.py. Python-only (no csrc/kernels), safe for the precompiled-wheel fork. Individual upstream PRs stay open for review; only the CARRY consolidates. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The three gpu_model_runner.py PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the three PRs are SKIPPED from the loop. gpu_model_runner.py wake-path markers (all present, verified): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake vllm-project#45610 coordinate_cudagraph_mode_across_pp PP-cudagraph MIN consensus (fix vllm-project#45094 split-brain wedge) + vllm/v1/worker/pp_utils.py helper gpu_worker.py composition (carried forward from prior union): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake Tests included: test_sleep_mode_backend, test_pp_cudagraph_consensus, test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded: vllm-project#45612 local wake-sync overlaps the independently-carried vllm-project#45552/vllm-project#45554 cumem.py hunks. vllm-project#45552 provides the wake-exit synchronize; the load-bearing gloo handshake lives in gpu_worker.py. Python-only (no csrc/kernels), safe for the precompiled-wheel fork. Individual upstream PRs stay open for review; only the CARRY consolidates. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
vllm-project#45610] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The three gpu_model_runner.py PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the three PRs are SKIPPED from the loop. gpu_model_runner.py wake-path markers (all present, verified): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake vllm-project#45610 coordinate_cudagraph_mode_across_pp PP-cudagraph MIN consensus (fix vllm-project#45094 split-brain wedge) + vllm/v1/worker/pp_utils.py helper *** vllm-project#45610 STARTUP-DEADLOCK FIX folded in (PR head 4d20740): the PP consensus all-reduce is now gated on `coordinate_pp_cudagraph_mode` (`if coordinate_pp_cudagraph_mode and get_pp_group().world_size > 1:`), a parameter that ONLY the real execute_model call site sets True. The dummy/warmup/profile/capture path (_dummy_run) leaves it False, so no PP gloo collective is issued during capture_model -> no startup deadlock on PP>1 (the prior union carried the ungated version, which wedged TP2/PP2 at startup: PP0 in do_poll, PP1 in futex_wait, /health never 200). The vllm-project#45094 split-brain fix is preserved on the lockstep decode path. gpu_worker.py composition (carried forward from prior union): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake Tests included: test_sleep_mode_backend, test_pp_cudagraph_consensus (with the 3 new startup-deadlock AST guards), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded: vllm-project#45612 local wake-sync overlaps the independently-carried vllm-project#45552/vllm-project#45554 cumem.py hunks. vllm-project#45552 provides the wake-exit synchronize; the load-bearing gloo handshake lives in gpu_worker.py. Python-only (no csrc/kernels), safe for the precompiled-wheel fork. Individual upstream PRs stay open for review; only the CARRY consolidates. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
vllm-project#45610] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The three gpu_model_runner.py PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the three PRs are SKIPPED from the loop. gpu_model_runner.py wake-path markers (all present, verified): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake vllm-project#45610 coordinate_cudagraph_mode_across_pp PP-cudagraph MIN consensus (fix vllm-project#45094 split-brain wedge) + vllm/v1/worker/pp_utils.py helper *** vllm-project#45610 STARTUP-DEADLOCK FIX folded in (PR head 4d20740): the PP consensus all-reduce is now gated on `coordinate_pp_cudagraph_mode` (`if coordinate_pp_cudagraph_mode and get_pp_group().world_size > 1:`), a parameter that ONLY the real execute_model call site sets True. The dummy/warmup/profile/capture path (_dummy_run) leaves it False, so no PP gloo collective is issued during capture_model -> no startup deadlock on PP>1 (the prior union carried the ungated version, which wedged TP2/PP2 at startup: PP0 in do_poll, PP1 in futex_wait, /health never 200). The vllm-project#45094 split-brain fix is preserved on the lockstep decode path. gpu_worker.py composition (carried forward from prior union): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake Tests included: test_sleep_mode_backend, test_pp_cudagraph_consensus (with the 3 new startup-deadlock AST guards), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded: vllm-project#45612 local wake-sync overlaps the independently-carried vllm-project#45552/vllm-project#45554 cumem.py hunks. vllm-project#45552 provides the wake-exit synchronize; the load-bearing gloo handshake lives in gpu_worker.py. Python-only (no csrc/kernels), safe for the precompiled-wheel fork. Individual upstream PRs stay open for review; only the CARRY consolidates. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
vllm-project#45610] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The three gpu_model_runner.py PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the three PRs are SKIPPED from the loop. gpu_model_runner.py wake-path markers (all present, verified): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake vllm-project#45610 coordinate_cudagraph_mode_across_pp PP-cudagraph MIN consensus (fix vllm-project#45094 split-brain wedge) + vllm/v1/worker/pp_utils.py helper *** vllm-project#45610 STARTUP-DEADLOCK FIX folded in (PR head 4d20740): the PP consensus all-reduce is now gated on `coordinate_pp_cudagraph_mode` (`if coordinate_pp_cudagraph_mode and get_pp_group().world_size > 1:`), a parameter that ONLY the real execute_model call site sets True. The dummy/warmup/profile/capture path (_dummy_run) leaves it False, so no PP gloo collective is issued during capture_model -> no startup deadlock on PP>1 (the prior union carried the ungated version, which wedged TP2/PP2 at startup: PP0 in do_poll, PP1 in futex_wait, /health never 200). The vllm-project#45094 split-brain fix is preserved on the lockstep decode path. gpu_worker.py composition (carried forward from prior union): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake Tests included: test_sleep_mode_backend, test_pp_cudagraph_consensus (with the 3 new startup-deadlock AST guards), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded: vllm-project#45612 local wake-sync overlaps the independently-carried vllm-project#45552/vllm-project#45554 cumem.py hunks. vllm-project#45552 provides the wake-exit synchronize; the load-bearing gloo handshake lives in gpu_worker.py. Python-only (no csrc/kernels), safe for the precompiled-wheel fork. Individual upstream PRs stay open for review; only the CARRY consolidates. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
vllm-project#45610] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The three gpu_model_runner.py PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the three PRs are SKIPPED from the loop. gpu_model_runner.py wake-path markers (all present, verified): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake vllm-project#45610 coordinate_cudagraph_mode_across_pp PP-cudagraph MIN consensus (fix vllm-project#45094 split-brain wedge) + vllm/v1/worker/pp_utils.py helper *** vllm-project#45610 STARTUP-DEADLOCK FIX folded in (PR head 4d20740): the PP consensus all-reduce is now gated on `coordinate_pp_cudagraph_mode` (`if coordinate_pp_cudagraph_mode and get_pp_group().world_size > 1:`), a parameter that ONLY the real execute_model call site sets True. The dummy/warmup/profile/capture path (_dummy_run) leaves it False, so no PP gloo collective is issued during capture_model -> no startup deadlock on PP>1 (the prior union carried the ungated version, which wedged TP2/PP2 at startup: PP0 in do_poll, PP1 in futex_wait, /health never 200). The vllm-project#45094 split-brain fix is preserved on the lockstep decode path. gpu_worker.py composition (carried forward from prior union): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake Tests included: test_sleep_mode_backend, test_pp_cudagraph_consensus (with the 3 new startup-deadlock AST guards), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded: vllm-project#45612 local wake-sync overlaps the independently-carried vllm-project#45552/vllm-project#45554 cumem.py hunks. vllm-project#45552 provides the wake-exit synchronize; the load-bearing gloo handshake lives in gpu_worker.py. Python-only (no csrc/kernels), safe for the precompiled-wheel fork. Individual upstream PRs stay open for review; only the CARRY consolidates. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
vllm-project#45610] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The three gpu_model_runner.py PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the three PRs are SKIPPED from the loop. gpu_model_runner.py wake-path markers (all present, verified): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake vllm-project#45610 coordinate_cudagraph_mode_across_pp PP-cudagraph MIN consensus (fix vllm-project#45094 split-brain wedge) + vllm/v1/worker/pp_utils.py helper *** vllm-project#45610 STARTUP-DEADLOCK FIX folded in (PR head 4d20740): the PP consensus all-reduce is now gated on `coordinate_pp_cudagraph_mode` (`if coordinate_pp_cudagraph_mode and get_pp_group().world_size > 1:`), a parameter that ONLY the real execute_model call site sets True. The dummy/warmup/profile/capture path (_dummy_run) leaves it False, so no PP gloo collective is issued during capture_model -> no startup deadlock on PP>1 (the prior union carried the ungated version, which wedged TP2/PP2 at startup: PP0 in do_poll, PP1 in futex_wait, /health never 200). The vllm-project#45094 split-brain fix is preserved on the lockstep decode path. gpu_worker.py composition (carried forward from prior union): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake Tests included: test_sleep_mode_backend, test_pp_cudagraph_consensus (with the 3 new startup-deadlock AST guards), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded: vllm-project#45612 local wake-sync overlaps the independently-carried vllm-project#45552/vllm-project#45554 cumem.py hunks. vllm-project#45552 provides the wake-exit synchronize; the load-bearing gloo handshake lives in gpu_worker.py. Python-only (no csrc/kernels), safe for the precompiled-wheel fork. Individual upstream PRs stay open for review; only the CARRY consolidates. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lm-project#45610 HOIST f24612b] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The wake-path PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the PRs (vllm-project#45610 vllm-project#45617 vllm-project#44778 vllm-project#45611 vllm-project#45565) are SKIPPED from the loop via PRECOMPILED_WHEEL_SKIP_PRS. *** vllm-project#45610 DECODE-WEDGE FIX RE-FOLDED: now carries the PP-consensus HOIST (PR vllm-project#45610 head f24612b), REPLACING the earlier pre-hoist gate variant (4d20740). The cudagraph-mode consensus all-reduce is hoisted out of the model runner's execute_model and into Worker.execute_model, issued BEFORE the inter-stage irecv_tensor_dict (gpu_worker.py). This eliminates the structural deadlock cycle that wedged TP2/PP2 at decode step 0 (PP0 ranks parked in coordinate_cudagraph_mode_ across_pp -> all_reduce while PP1 ranks parked in irecv gloo waitRecv). The model runner no longer self-issues the consensus all_reduce; it consumes the agreed value via the new pp_synced_cudagraph_mode kwarg. Applies to V1 (gpu_model_runner.py), V2 (gpu/model_runner.py), DP (gpu/dp_utils.py), and Ray (executor/ray_utils.py) paths, plus pp_utils.py helper. gpu_model_runner.py wake-path markers (HOTPATH_FILE_RESTORE / CARRY_HOTPATH_ASSERTS): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake gpu_worker.py composition (carried forward from prior union; disjoint region from the hoist's execute_model edits, no adjacency conflict): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake AUDIT-D composition assertions (verified, not just grepped): - wake_up dispatches backend.resume EXACTLY ONCE (needs_wake_sync if/else are mutually-exclusive branches); NO raw allocator.wake_up Block B double-wake. - the hoist consensus block precedes irecv_tensor_dict in Worker.execute_model. - runner does NOT self-issue the consensus all_reduce (hoist-correct). Tests: test_sleep_mode_backend, test_pp_cudagraph_consensus (V1 hoist), test_pp_cudagraph_consensus_v2 (V2 hoist), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded (carried by separate FORK_CARRIED entries vllm-project#45615/vllm-project#45552); the load-bearing gloo wake handshake lives in gpu_worker.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lm-project#45610 HOIST f24612b] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The wake-path PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the PRs (vllm-project#45610 vllm-project#45617 vllm-project#44778 vllm-project#45611 vllm-project#45565) are SKIPPED from the loop via PRECOMPILED_WHEEL_SKIP_PRS. *** vllm-project#45610 DECODE-WEDGE FIX RE-FOLDED: now carries the PP-consensus HOIST (PR vllm-project#45610 head f24612b), REPLACING the earlier pre-hoist gate variant (4d20740). The cudagraph-mode consensus all-reduce is hoisted out of the model runner's execute_model and into Worker.execute_model, issued BEFORE the inter-stage irecv_tensor_dict (gpu_worker.py). This eliminates the structural deadlock cycle that wedged TP2/PP2 at decode step 0 (PP0 ranks parked in coordinate_cudagraph_mode_ across_pp -> all_reduce while PP1 ranks parked in irecv gloo waitRecv). The model runner no longer self-issues the consensus all_reduce; it consumes the agreed value via the new pp_synced_cudagraph_mode kwarg. Applies to V1 (gpu_model_runner.py), V2 (gpu/model_runner.py), DP (gpu/dp_utils.py), and Ray (executor/ray_utils.py) paths, plus pp_utils.py helper. gpu_model_runner.py wake-path markers (HOTPATH_FILE_RESTORE / CARRY_HOTPATH_ASSERTS): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake gpu_worker.py composition (carried forward from prior union; disjoint region from the hoist's execute_model edits, no adjacency conflict): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake AUDIT-D composition assertions (verified, not just grepped): - wake_up dispatches backend.resume EXACTLY ONCE (needs_wake_sync if/else are mutually-exclusive branches); NO raw allocator.wake_up Block B double-wake. - the hoist consensus block precedes irecv_tensor_dict in Worker.execute_model. - runner does NOT self-issue the consensus all_reduce (hoist-correct). Tests: test_sleep_mode_backend, test_pp_cudagraph_consensus (V1 hoist), test_pp_cudagraph_consensus_v2 (V2 hoist), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded (carried by separate FORK_CARRIED entries vllm-project#45615/vllm-project#45552); the load-bearing gloo wake handshake lives in gpu_worker.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lm-project#45610 HOIST f24612b] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The wake-path PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the PRs (vllm-project#45610 vllm-project#45617 vllm-project#44778 vllm-project#45611 vllm-project#45565) are SKIPPED from the loop via PRECOMPILED_WHEEL_SKIP_PRS. *** vllm-project#45610 DECODE-WEDGE FIX RE-FOLDED: now carries the PP-consensus HOIST (PR vllm-project#45610 head f24612b), REPLACING the earlier pre-hoist gate variant (4d20740). The cudagraph-mode consensus all-reduce is hoisted out of the model runner's execute_model and into Worker.execute_model, issued BEFORE the inter-stage irecv_tensor_dict (gpu_worker.py). This eliminates the structural deadlock cycle that wedged TP2/PP2 at decode step 0 (PP0 ranks parked in coordinate_cudagraph_mode_ across_pp -> all_reduce while PP1 ranks parked in irecv gloo waitRecv). The model runner no longer self-issues the consensus all_reduce; it consumes the agreed value via the new pp_synced_cudagraph_mode kwarg. Applies to V1 (gpu_model_runner.py), V2 (gpu/model_runner.py), DP (gpu/dp_utils.py), and Ray (executor/ray_utils.py) paths, plus pp_utils.py helper. gpu_model_runner.py wake-path markers (HOTPATH_FILE_RESTORE / CARRY_HOTPATH_ASSERTS): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake gpu_worker.py composition (carried forward from prior union; disjoint region from the hoist's execute_model edits, no adjacency conflict): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake AUDIT-D composition assertions (verified, not just grepped): - wake_up dispatches backend.resume EXACTLY ONCE (needs_wake_sync if/else are mutually-exclusive branches); NO raw allocator.wake_up Block B double-wake. - the hoist consensus block precedes irecv_tensor_dict in Worker.execute_model. - runner does NOT self-issue the consensus all_reduce (hoist-correct). Tests: test_sleep_mode_backend, test_pp_cudagraph_consensus (V1 hoist), test_pp_cudagraph_consensus_v2 (V2 hoist), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded (carried by separate FORK_CARRIED entries vllm-project#45615/vllm-project#45552); the load-bearing gloo wake handshake lives in gpu_worker.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lm-project#45610 HOIST f24612b] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The wake-path PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the PRs (vllm-project#45610 vllm-project#45617 vllm-project#44778 vllm-project#45611 vllm-project#45565) are SKIPPED from the loop via PRECOMPILED_WHEEL_SKIP_PRS. *** vllm-project#45610 DECODE-WEDGE FIX RE-FOLDED: now carries the PP-consensus HOIST (PR vllm-project#45610 head f24612b), REPLACING the earlier pre-hoist gate variant (4d20740). The cudagraph-mode consensus all-reduce is hoisted out of the model runner's execute_model and into Worker.execute_model, issued BEFORE the inter-stage irecv_tensor_dict (gpu_worker.py). This eliminates the structural deadlock cycle that wedged TP2/PP2 at decode step 0 (PP0 ranks parked in coordinate_cudagraph_mode_ across_pp -> all_reduce while PP1 ranks parked in irecv gloo waitRecv). The model runner no longer self-issues the consensus all_reduce; it consumes the agreed value via the new pp_synced_cudagraph_mode kwarg. Applies to V1 (gpu_model_runner.py), V2 (gpu/model_runner.py), DP (gpu/dp_utils.py), and Ray (executor/ray_utils.py) paths, plus pp_utils.py helper. gpu_model_runner.py wake-path markers (HOTPATH_FILE_RESTORE / CARRY_HOTPATH_ASSERTS): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake gpu_worker.py composition (carried forward from prior union; disjoint region from the hoist's execute_model edits, no adjacency conflict): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake AUDIT-D composition assertions (verified, not just grepped): - wake_up dispatches backend.resume EXACTLY ONCE (needs_wake_sync if/else are mutually-exclusive branches); NO raw allocator.wake_up Block B double-wake. - the hoist consensus block precedes irecv_tensor_dict in Worker.execute_model. - runner does NOT self-issue the consensus all_reduce (hoist-correct). Tests: test_sleep_mode_backend, test_pp_cudagraph_consensus (V1 hoist), test_pp_cudagraph_consensus_v2 (V2 hoist), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded (carried by separate FORK_CARRIED entries vllm-project#45615/vllm-project#45552); the load-bearing gloo wake handshake lives in gpu_worker.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lm-project#45610 HOIST f24612b] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The wake-path PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the PRs (vllm-project#45610 vllm-project#45617 vllm-project#44778 vllm-project#45611 vllm-project#45565) are SKIPPED from the loop via PRECOMPILED_WHEEL_SKIP_PRS. *** vllm-project#45610 DECODE-WEDGE FIX RE-FOLDED: now carries the PP-consensus HOIST (PR vllm-project#45610 head f24612b), REPLACING the earlier pre-hoist gate variant (4d20740). The cudagraph-mode consensus all-reduce is hoisted out of the model runner's execute_model and into Worker.execute_model, issued BEFORE the inter-stage irecv_tensor_dict (gpu_worker.py). This eliminates the structural deadlock cycle that wedged TP2/PP2 at decode step 0 (PP0 ranks parked in coordinate_cudagraph_mode_ across_pp -> all_reduce while PP1 ranks parked in irecv gloo waitRecv). The model runner no longer self-issues the consensus all_reduce; it consumes the agreed value via the new pp_synced_cudagraph_mode kwarg. Applies to V1 (gpu_model_runner.py), V2 (gpu/model_runner.py), DP (gpu/dp_utils.py), and Ray (executor/ray_utils.py) paths, plus pp_utils.py helper. gpu_model_runner.py wake-path markers (HOTPATH_FILE_RESTORE / CARRY_HOTPATH_ASSERTS): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake gpu_worker.py composition (carried forward from prior union; disjoint region from the hoist's execute_model edits, no adjacency conflict): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake AUDIT-D composition assertions (verified, not just grepped): - wake_up dispatches backend.resume EXACTLY ONCE (needs_wake_sync if/else are mutually-exclusive branches); NO raw allocator.wake_up Block B double-wake. - the hoist consensus block precedes irecv_tensor_dict in Worker.execute_model. - runner does NOT self-issue the consensus all_reduce (hoist-correct). Tests: test_sleep_mode_backend, test_pp_cudagraph_consensus (V1 hoist), test_pp_cudagraph_consensus_v2 (V2 hoist), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded (carried by separate FORK_CARRIED entries vllm-project#45615/vllm-project#45552); the load-bearing gloo wake handshake lives in gpu_worker.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lm-project#45610 HOIST f24612b] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The wake-path PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the PRs (vllm-project#45610 vllm-project#45617 vllm-project#44778 vllm-project#45611 vllm-project#45565) are SKIPPED from the loop via PRECOMPILED_WHEEL_SKIP_PRS. *** vllm-project#45610 DECODE-WEDGE FIX RE-FOLDED: now carries the PP-consensus HOIST (PR vllm-project#45610 head f24612b), REPLACING the earlier pre-hoist gate variant (4d20740). The cudagraph-mode consensus all-reduce is hoisted out of the model runner's execute_model and into Worker.execute_model, issued BEFORE the inter-stage irecv_tensor_dict (gpu_worker.py). This eliminates the structural deadlock cycle that wedged TP2/PP2 at decode step 0 (PP0 ranks parked in coordinate_cudagraph_mode_ across_pp -> all_reduce while PP1 ranks parked in irecv gloo waitRecv). The model runner no longer self-issues the consensus all_reduce; it consumes the agreed value via the new pp_synced_cudagraph_mode kwarg. Applies to V1 (gpu_model_runner.py), V2 (gpu/model_runner.py), DP (gpu/dp_utils.py), and Ray (executor/ray_utils.py) paths, plus pp_utils.py helper. gpu_model_runner.py wake-path markers (HOTPATH_FILE_RESTORE / CARRY_HOTPATH_ASSERTS): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake gpu_worker.py composition (carried forward from prior union; disjoint region from the hoist's execute_model edits, no adjacency conflict): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake AUDIT-D composition assertions (verified, not just grepped): - wake_up dispatches backend.resume EXACTLY ONCE (needs_wake_sync if/else are mutually-exclusive branches); NO raw allocator.wake_up Block B double-wake. - the hoist consensus block precedes irecv_tensor_dict in Worker.execute_model. - runner does NOT self-issue the consensus all_reduce (hoist-correct). Tests: test_sleep_mode_backend, test_pp_cudagraph_consensus (V1 hoist), test_pp_cudagraph_consensus_v2 (V2 hoist), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded (carried by separate FORK_CARRIED entries vllm-project#45615/vllm-project#45552); the load-bearing gloo wake handshake lives in gpu_worker.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lm-project#45610 HOIST f24612b] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The wake-path PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the PRs (vllm-project#45610 vllm-project#45617 vllm-project#44778 vllm-project#45611 vllm-project#45565) are SKIPPED from the loop via PRECOMPILED_WHEEL_SKIP_PRS. *** vllm-project#45610 DECODE-WEDGE FIX RE-FOLDED: now carries the PP-consensus HOIST (PR vllm-project#45610 head f24612b), REPLACING the earlier pre-hoist gate variant (4d20740). The cudagraph-mode consensus all-reduce is hoisted out of the model runner's execute_model and into Worker.execute_model, issued BEFORE the inter-stage irecv_tensor_dict (gpu_worker.py). This eliminates the structural deadlock cycle that wedged TP2/PP2 at decode step 0 (PP0 ranks parked in coordinate_cudagraph_mode_ across_pp -> all_reduce while PP1 ranks parked in irecv gloo waitRecv). The model runner no longer self-issues the consensus all_reduce; it consumes the agreed value via the new pp_synced_cudagraph_mode kwarg. Applies to V1 (gpu_model_runner.py), V2 (gpu/model_runner.py), DP (gpu/dp_utils.py), and Ray (executor/ray_utils.py) paths, plus pp_utils.py helper. gpu_model_runner.py wake-path markers (HOTPATH_FILE_RESTORE / CARRY_HOTPATH_ASSERTS): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake gpu_worker.py composition (carried forward from prior union; disjoint region from the hoist's execute_model edits, no adjacency conflict): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake AUDIT-D composition assertions (verified, not just grepped): - wake_up dispatches backend.resume EXACTLY ONCE (needs_wake_sync if/else are mutually-exclusive branches); NO raw allocator.wake_up Block B double-wake. - the hoist consensus block precedes irecv_tensor_dict in Worker.execute_model. - runner does NOT self-issue the consensus all_reduce (hoist-correct). Tests: test_sleep_mode_backend, test_pp_cudagraph_consensus (V1 hoist), test_pp_cudagraph_consensus_v2 (V2 hoist), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded (carried by separate FORK_CARRIED entries vllm-project#45615/vllm-project#45552); the load-bearing gloo wake handshake lives in gpu_worker.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lm-project#45610 HOIST f24612b] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The wake-path PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the PRs (vllm-project#45610 vllm-project#45617 vllm-project#44778 vllm-project#45611 vllm-project#45565) are SKIPPED from the loop via PRECOMPILED_WHEEL_SKIP_PRS. *** vllm-project#45610 DECODE-WEDGE FIX RE-FOLDED: now carries the PP-consensus HOIST (PR vllm-project#45610 head f24612b), REPLACING the earlier pre-hoist gate variant (4d20740). The cudagraph-mode consensus all-reduce is hoisted out of the model runner's execute_model and into Worker.execute_model, issued BEFORE the inter-stage irecv_tensor_dict (gpu_worker.py). This eliminates the structural deadlock cycle that wedged TP2/PP2 at decode step 0 (PP0 ranks parked in coordinate_cudagraph_mode_ across_pp -> all_reduce while PP1 ranks parked in irecv gloo waitRecv). The model runner no longer self-issues the consensus all_reduce; it consumes the agreed value via the new pp_synced_cudagraph_mode kwarg. Applies to V1 (gpu_model_runner.py), V2 (gpu/model_runner.py), DP (gpu/dp_utils.py), and Ray (executor/ray_utils.py) paths, plus pp_utils.py helper. gpu_model_runner.py wake-path markers (HOTPATH_FILE_RESTORE / CARRY_HOTPATH_ASSERTS): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake gpu_worker.py composition (carried forward from prior union; disjoint region from the hoist's execute_model edits, no adjacency conflict): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake AUDIT-D composition assertions (verified, not just grepped): - wake_up dispatches backend.resume EXACTLY ONCE (needs_wake_sync if/else are mutually-exclusive branches); NO raw allocator.wake_up Block B double-wake. - the hoist consensus block precedes irecv_tensor_dict in Worker.execute_model. - runner does NOT self-issue the consensus all_reduce (hoist-correct). Tests: test_sleep_mode_backend, test_pp_cudagraph_consensus (V1 hoist), test_pp_cudagraph_consensus_v2 (V2 hoist), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded (carried by separate FORK_CARRIED entries vllm-project#45615/vllm-project#45552); the load-bearing gloo wake handshake lives in gpu_worker.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lm-project#45610 HOIST f24612b] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The wake-path PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the PRs (vllm-project#45610 vllm-project#45617 vllm-project#44778 vllm-project#45611 vllm-project#45565) are SKIPPED from the loop via PRECOMPILED_WHEEL_SKIP_PRS. *** vllm-project#45610 DECODE-WEDGE FIX RE-FOLDED: now carries the PP-consensus HOIST (PR vllm-project#45610 head f24612b), REPLACING the earlier pre-hoist gate variant (4d20740). The cudagraph-mode consensus all-reduce is hoisted out of the model runner's execute_model and into Worker.execute_model, issued BEFORE the inter-stage irecv_tensor_dict (gpu_worker.py). This eliminates the structural deadlock cycle that wedged TP2/PP2 at decode step 0 (PP0 ranks parked in coordinate_cudagraph_mode_ across_pp -> all_reduce while PP1 ranks parked in irecv gloo waitRecv). The model runner no longer self-issues the consensus all_reduce; it consumes the agreed value via the new pp_synced_cudagraph_mode kwarg. Applies to V1 (gpu_model_runner.py), V2 (gpu/model_runner.py), DP (gpu/dp_utils.py), and Ray (executor/ray_utils.py) paths, plus pp_utils.py helper. gpu_model_runner.py wake-path markers (HOTPATH_FILE_RESTORE / CARRY_HOTPATH_ASSERTS): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake gpu_worker.py composition (carried forward from prior union; disjoint region from the hoist's execute_model edits, no adjacency conflict): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake AUDIT-D composition assertions (verified, not just grepped): - wake_up dispatches backend.resume EXACTLY ONCE (needs_wake_sync if/else are mutually-exclusive branches); NO raw allocator.wake_up Block B double-wake. - the hoist consensus block precedes irecv_tensor_dict in Worker.execute_model. - runner does NOT self-issue the consensus all_reduce (hoist-correct). Tests: test_sleep_mode_backend, test_pp_cudagraph_consensus (V1 hoist), test_pp_cudagraph_consensus_v2 (V2 hoist), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded (carried by separate FORK_CARRIED entries vllm-project#45615/vllm-project#45552); the load-bearing gloo wake handshake lives in gpu_worker.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lm-project#45610 HOIST f24612b] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The wake-path PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the PRs (vllm-project#45610 vllm-project#45617 vllm-project#44778 vllm-project#45611 vllm-project#45565) are SKIPPED from the loop via PRECOMPILED_WHEEL_SKIP_PRS. *** vllm-project#45610 DECODE-WEDGE FIX RE-FOLDED: now carries the PP-consensus HOIST (PR vllm-project#45610 head f24612b), REPLACING the earlier pre-hoist gate variant (4d20740). The cudagraph-mode consensus all-reduce is hoisted out of the model runner's execute_model and into Worker.execute_model, issued BEFORE the inter-stage irecv_tensor_dict (gpu_worker.py). This eliminates the structural deadlock cycle that wedged TP2/PP2 at decode step 0 (PP0 ranks parked in coordinate_cudagraph_mode_ across_pp -> all_reduce while PP1 ranks parked in irecv gloo waitRecv). The model runner no longer self-issues the consensus all_reduce; it consumes the agreed value via the new pp_synced_cudagraph_mode kwarg. Applies to V1 (gpu_model_runner.py), V2 (gpu/model_runner.py), DP (gpu/dp_utils.py), and Ray (executor/ray_utils.py) paths, plus pp_utils.py helper. gpu_model_runner.py wake-path markers (HOTPATH_FILE_RESTORE / CARRY_HOTPATH_ASSERTS): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake gpu_worker.py composition (carried forward from prior union; disjoint region from the hoist's execute_model edits, no adjacency conflict): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake AUDIT-D composition assertions (verified, not just grepped): - wake_up dispatches backend.resume EXACTLY ONCE (needs_wake_sync if/else are mutually-exclusive branches); NO raw allocator.wake_up Block B double-wake. - the hoist consensus block precedes irecv_tensor_dict in Worker.execute_model. - runner does NOT self-issue the consensus all_reduce (hoist-correct). Tests: test_sleep_mode_backend, test_pp_cudagraph_consensus (V1 hoist), test_pp_cudagraph_consensus_v2 (V2 hoist), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded (carried by separate FORK_CARRIED entries vllm-project#45615/vllm-project#45552); the load-bearing gloo wake handshake lives in gpu_worker.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lm-project#45610 HOIST f24612b] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The wake-path PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the PRs (vllm-project#45610 vllm-project#45617 vllm-project#44778 vllm-project#45611 vllm-project#45565) are SKIPPED from the loop via PRECOMPILED_WHEEL_SKIP_PRS. *** vllm-project#45610 DECODE-WEDGE FIX RE-FOLDED: now carries the PP-consensus HOIST (PR vllm-project#45610 head f24612b), REPLACING the earlier pre-hoist gate variant (4d20740). The cudagraph-mode consensus all-reduce is hoisted out of the model runner's execute_model and into Worker.execute_model, issued BEFORE the inter-stage irecv_tensor_dict (gpu_worker.py). This eliminates the structural deadlock cycle that wedged TP2/PP2 at decode step 0 (PP0 ranks parked in coordinate_cudagraph_mode_ across_pp -> all_reduce while PP1 ranks parked in irecv gloo waitRecv). The model runner no longer self-issues the consensus all_reduce; it consumes the agreed value via the new pp_synced_cudagraph_mode kwarg. Applies to V1 (gpu_model_runner.py), V2 (gpu/model_runner.py), DP (gpu/dp_utils.py), and Ray (executor/ray_utils.py) paths, plus pp_utils.py helper. gpu_model_runner.py wake-path markers (HOTPATH_FILE_RESTORE / CARRY_HOTPATH_ASSERTS): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake gpu_worker.py composition (carried forward from prior union; disjoint region from the hoist's execute_model edits, no adjacency conflict): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake AUDIT-D composition assertions (verified, not just grepped): - wake_up dispatches backend.resume EXACTLY ONCE (needs_wake_sync if/else are mutually-exclusive branches); NO raw allocator.wake_up Block B double-wake. - the hoist consensus block precedes irecv_tensor_dict in Worker.execute_model. - runner does NOT self-issue the consensus all_reduce (hoist-correct). Tests: test_sleep_mode_backend, test_pp_cudagraph_consensus (V1 hoist), test_pp_cudagraph_consensus_v2 (V2 hoist), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded (carried by separate FORK_CARRIED entries vllm-project#45615/vllm-project#45552); the load-bearing gloo wake handshake lives in gpu_worker.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lm-project#45610 HOIST f24612b] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The wake-path PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the PRs (vllm-project#45610 vllm-project#45617 vllm-project#44778 vllm-project#45611 vllm-project#45565) are SKIPPED from the loop via PRECOMPILED_WHEEL_SKIP_PRS. *** vllm-project#45610 DECODE-WEDGE FIX RE-FOLDED: now carries the PP-consensus HOIST (PR vllm-project#45610 head f24612b), REPLACING the earlier pre-hoist gate variant (4d20740). The cudagraph-mode consensus all-reduce is hoisted out of the model runner's execute_model and into Worker.execute_model, issued BEFORE the inter-stage irecv_tensor_dict (gpu_worker.py). This eliminates the structural deadlock cycle that wedged TP2/PP2 at decode step 0 (PP0 ranks parked in coordinate_cudagraph_mode_ across_pp -> all_reduce while PP1 ranks parked in irecv gloo waitRecv). The model runner no longer self-issues the consensus all_reduce; it consumes the agreed value via the new pp_synced_cudagraph_mode kwarg. Applies to V1 (gpu_model_runner.py), V2 (gpu/model_runner.py), DP (gpu/dp_utils.py), and Ray (executor/ray_utils.py) paths, plus pp_utils.py helper. gpu_model_runner.py wake-path markers (HOTPATH_FILE_RESTORE / CARRY_HOTPATH_ASSERTS): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake gpu_worker.py composition (carried forward from prior union; disjoint region from the hoist's execute_model edits, no adjacency conflict): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake AUDIT-D composition assertions (verified, not just grepped): - wake_up dispatches backend.resume EXACTLY ONCE (needs_wake_sync if/else are mutually-exclusive branches); NO raw allocator.wake_up Block B double-wake. - the hoist consensus block precedes irecv_tensor_dict in Worker.execute_model. - runner does NOT self-issue the consensus all_reduce (hoist-correct). Tests: test_sleep_mode_backend, test_pp_cudagraph_consensus (V1 hoist), test_pp_cudagraph_consensus_v2 (V2 hoist), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded (carried by separate FORK_CARRIED entries vllm-project#45615/vllm-project#45552); the load-bearing gloo wake handshake lives in gpu_worker.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lm-project#45610 HOIST f24612b] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The wake-path PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the PRs (vllm-project#45610 vllm-project#45617 vllm-project#44778 vllm-project#45611 vllm-project#45565) are SKIPPED from the loop via PRECOMPILED_WHEEL_SKIP_PRS. *** vllm-project#45610 DECODE-WEDGE FIX RE-FOLDED: now carries the PP-consensus HOIST (PR vllm-project#45610 head f24612b), REPLACING the earlier pre-hoist gate variant (4d20740). The cudagraph-mode consensus all-reduce is hoisted out of the model runner's execute_model and into Worker.execute_model, issued BEFORE the inter-stage irecv_tensor_dict (gpu_worker.py). This eliminates the structural deadlock cycle that wedged TP2/PP2 at decode step 0 (PP0 ranks parked in coordinate_cudagraph_mode_ across_pp -> all_reduce while PP1 ranks parked in irecv gloo waitRecv). The model runner no longer self-issues the consensus all_reduce; it consumes the agreed value via the new pp_synced_cudagraph_mode kwarg. Applies to V1 (gpu_model_runner.py), V2 (gpu/model_runner.py), DP (gpu/dp_utils.py), and Ray (executor/ray_utils.py) paths, plus pp_utils.py helper. gpu_model_runner.py wake-path markers (HOTPATH_FILE_RESTORE / CARRY_HOTPATH_ASSERTS): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake gpu_worker.py composition (carried forward from prior union; disjoint region from the hoist's execute_model edits, no adjacency conflict): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake AUDIT-D composition assertions (verified, not just grepped): - wake_up dispatches backend.resume EXACTLY ONCE (needs_wake_sync if/else are mutually-exclusive branches); NO raw allocator.wake_up Block B double-wake. - the hoist consensus block precedes irecv_tensor_dict in Worker.execute_model. - runner does NOT self-issue the consensus all_reduce (hoist-correct). Tests: test_sleep_mode_backend, test_pp_cudagraph_consensus (V1 hoist), test_pp_cudagraph_consensus_v2 (V2 hoist), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded (carried by separate FORK_CARRIED entries vllm-project#45615/vllm-project#45552); the load-bearing gloo wake handshake lives in gpu_worker.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lm-project#45610 HOIST f24612b] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The wake-path PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the PRs (vllm-project#45610 vllm-project#45617 vllm-project#44778 vllm-project#45611 vllm-project#45565) are SKIPPED from the loop via PRECOMPILED_WHEEL_SKIP_PRS. *** vllm-project#45610 DECODE-WEDGE FIX RE-FOLDED: now carries the PP-consensus HOIST (PR vllm-project#45610 head f24612b), REPLACING the earlier pre-hoist gate variant (4d20740). The cudagraph-mode consensus all-reduce is hoisted out of the model runner's execute_model and into Worker.execute_model, issued BEFORE the inter-stage irecv_tensor_dict (gpu_worker.py). This eliminates the structural deadlock cycle that wedged TP2/PP2 at decode step 0 (PP0 ranks parked in coordinate_cudagraph_mode_ across_pp -> all_reduce while PP1 ranks parked in irecv gloo waitRecv). The model runner no longer self-issues the consensus all_reduce; it consumes the agreed value via the new pp_synced_cudagraph_mode kwarg. Applies to V1 (gpu_model_runner.py), V2 (gpu/model_runner.py), DP (gpu/dp_utils.py), and Ray (executor/ray_utils.py) paths, plus pp_utils.py helper. gpu_model_runner.py wake-path markers (HOTPATH_FILE_RESTORE / CARRY_HOTPATH_ASSERTS): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake gpu_worker.py composition (carried forward from prior union; disjoint region from the hoist's execute_model edits, no adjacency conflict): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake AUDIT-D composition assertions (verified, not just grepped): - wake_up dispatches backend.resume EXACTLY ONCE (needs_wake_sync if/else are mutually-exclusive branches); NO raw allocator.wake_up Block B double-wake. - the hoist consensus block precedes irecv_tensor_dict in Worker.execute_model. - runner does NOT self-issue the consensus all_reduce (hoist-correct). Tests: test_sleep_mode_backend, test_pp_cudagraph_consensus (V1 hoist), test_pp_cudagraph_consensus_v2 (V2 hoist), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded (carried by separate FORK_CARRIED entries vllm-project#45615/vllm-project#45552); the load-bearing gloo wake handshake lives in gpu_worker.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lm-project#45610 HOIST f24612b] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The wake-path PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the PRs (vllm-project#45610 vllm-project#45617 vllm-project#44778 vllm-project#45611 vllm-project#45565) are SKIPPED from the loop via PRECOMPILED_WHEEL_SKIP_PRS. *** vllm-project#45610 DECODE-WEDGE FIX RE-FOLDED: now carries the PP-consensus HOIST (PR vllm-project#45610 head f24612b), REPLACING the earlier pre-hoist gate variant (4d20740). The cudagraph-mode consensus all-reduce is hoisted out of the model runner's execute_model and into Worker.execute_model, issued BEFORE the inter-stage irecv_tensor_dict (gpu_worker.py). This eliminates the structural deadlock cycle that wedged TP2/PP2 at decode step 0 (PP0 ranks parked in coordinate_cudagraph_mode_ across_pp -> all_reduce while PP1 ranks parked in irecv gloo waitRecv). The model runner no longer self-issues the consensus all_reduce; it consumes the agreed value via the new pp_synced_cudagraph_mode kwarg. Applies to V1 (gpu_model_runner.py), V2 (gpu/model_runner.py), DP (gpu/dp_utils.py), and Ray (executor/ray_utils.py) paths, plus pp_utils.py helper. gpu_model_runner.py wake-path markers (HOTPATH_FILE_RESTORE / CARRY_HOTPATH_ASSERTS): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake gpu_worker.py composition (carried forward from prior union; disjoint region from the hoist's execute_model edits, no adjacency conflict): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake AUDIT-D composition assertions (verified, not just grepped): - wake_up dispatches backend.resume EXACTLY ONCE (needs_wake_sync if/else are mutually-exclusive branches); NO raw allocator.wake_up Block B double-wake. - the hoist consensus block precedes irecv_tensor_dict in Worker.execute_model. - runner does NOT self-issue the consensus all_reduce (hoist-correct). Tests: test_sleep_mode_backend, test_pp_cudagraph_consensus (V1 hoist), test_pp_cudagraph_consensus_v2 (V2 hoist), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded (carried by separate FORK_CARRIED entries vllm-project#45615/vllm-project#45552); the load-bearing gloo wake handshake lives in gpu_worker.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lm-project#45610 HOIST f24612b] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The wake-path PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the PRs (vllm-project#45610 vllm-project#45617 vllm-project#44778 vllm-project#45611 vllm-project#45565) are SKIPPED from the loop via PRECOMPILED_WHEEL_SKIP_PRS. *** vllm-project#45610 DECODE-WEDGE FIX RE-FOLDED: now carries the PP-consensus HOIST (PR vllm-project#45610 head f24612b), REPLACING the earlier pre-hoist gate variant (4d20740). The cudagraph-mode consensus all-reduce is hoisted out of the model runner's execute_model and into Worker.execute_model, issued BEFORE the inter-stage irecv_tensor_dict (gpu_worker.py). This eliminates the structural deadlock cycle that wedged TP2/PP2 at decode step 0 (PP0 ranks parked in coordinate_cudagraph_mode_ across_pp -> all_reduce while PP1 ranks parked in irecv gloo waitRecv). The model runner no longer self-issues the consensus all_reduce; it consumes the agreed value via the new pp_synced_cudagraph_mode kwarg. Applies to V1 (gpu_model_runner.py), V2 (gpu/model_runner.py), DP (gpu/dp_utils.py), and Ray (executor/ray_utils.py) paths, plus pp_utils.py helper. gpu_model_runner.py wake-path markers (HOTPATH_FILE_RESTORE / CARRY_HOTPATH_ASSERTS): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake gpu_worker.py composition (carried forward from prior union; disjoint region from the hoist's execute_model edits, no adjacency conflict): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake AUDIT-D composition assertions (verified, not just grepped): - wake_up dispatches backend.resume EXACTLY ONCE (needs_wake_sync if/else are mutually-exclusive branches); NO raw allocator.wake_up Block B double-wake. - the hoist consensus block precedes irecv_tensor_dict in Worker.execute_model. - runner does NOT self-issue the consensus all_reduce (hoist-correct). Tests: test_sleep_mode_backend, test_pp_cudagraph_consensus (V1 hoist), test_pp_cudagraph_consensus_v2 (V2 hoist), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded (carried by separate FORK_CARRIED entries vllm-project#45615/vllm-project#45552); the load-bearing gloo wake handshake lives in gpu_worker.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lm-project#45610 HOIST f24612b] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The wake-path PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the PRs (vllm-project#45610 vllm-project#45617 vllm-project#44778 vllm-project#45611 vllm-project#45565) are SKIPPED from the loop via PRECOMPILED_WHEEL_SKIP_PRS. *** vllm-project#45610 DECODE-WEDGE FIX RE-FOLDED: now carries the PP-consensus HOIST (PR vllm-project#45610 head f24612b), REPLACING the earlier pre-hoist gate variant (4d20740). The cudagraph-mode consensus all-reduce is hoisted out of the model runner's execute_model and into Worker.execute_model, issued BEFORE the inter-stage irecv_tensor_dict (gpu_worker.py). This eliminates the structural deadlock cycle that wedged TP2/PP2 at decode step 0 (PP0 ranks parked in coordinate_cudagraph_mode_ across_pp -> all_reduce while PP1 ranks parked in irecv gloo waitRecv). The model runner no longer self-issues the consensus all_reduce; it consumes the agreed value via the new pp_synced_cudagraph_mode kwarg. Applies to V1 (gpu_model_runner.py), V2 (gpu/model_runner.py), DP (gpu/dp_utils.py), and Ray (executor/ray_utils.py) paths, plus pp_utils.py helper. gpu_model_runner.py wake-path markers (HOTPATH_FILE_RESTORE / CARRY_HOTPATH_ASSERTS): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake gpu_worker.py composition (carried forward from prior union; disjoint region from the hoist's execute_model edits, no adjacency conflict): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake AUDIT-D composition assertions (verified, not just grepped): - wake_up dispatches backend.resume EXACTLY ONCE (needs_wake_sync if/else are mutually-exclusive branches); NO raw allocator.wake_up Block B double-wake. - the hoist consensus block precedes irecv_tensor_dict in Worker.execute_model. - runner does NOT self-issue the consensus all_reduce (hoist-correct). Tests: test_sleep_mode_backend, test_pp_cudagraph_consensus (V1 hoist), test_pp_cudagraph_consensus_v2 (V2 hoist), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded (carried by separate FORK_CARRIED entries vllm-project#45615/vllm-project#45552); the load-bearing gloo wake handshake lives in gpu_worker.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lm-project#45610 HOIST f24612b] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The wake-path PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the PRs (vllm-project#45610 vllm-project#45617 vllm-project#44778 vllm-project#45611 vllm-project#45565) are SKIPPED from the loop via PRECOMPILED_WHEEL_SKIP_PRS. *** vllm-project#45610 DECODE-WEDGE FIX RE-FOLDED: now carries the PP-consensus HOIST (PR vllm-project#45610 head f24612b), REPLACING the earlier pre-hoist gate variant (4d20740). The cudagraph-mode consensus all-reduce is hoisted out of the model runner's execute_model and into Worker.execute_model, issued BEFORE the inter-stage irecv_tensor_dict (gpu_worker.py). This eliminates the structural deadlock cycle that wedged TP2/PP2 at decode step 0 (PP0 ranks parked in coordinate_cudagraph_mode_ across_pp -> all_reduce while PP1 ranks parked in irecv gloo waitRecv). The model runner no longer self-issues the consensus all_reduce; it consumes the agreed value via the new pp_synced_cudagraph_mode kwarg. Applies to V1 (gpu_model_runner.py), V2 (gpu/model_runner.py), DP (gpu/dp_utils.py), and Ray (executor/ray_utils.py) paths, plus pp_utils.py helper. gpu_model_runner.py wake-path markers (HOTPATH_FILE_RESTORE / CARRY_HOTPATH_ASSERTS): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake gpu_worker.py composition (carried forward from prior union; disjoint region from the hoist's execute_model edits, no adjacency conflict): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake AUDIT-D composition assertions (verified, not just grepped): - wake_up dispatches backend.resume EXACTLY ONCE (needs_wake_sync if/else are mutually-exclusive branches); NO raw allocator.wake_up Block B double-wake. - the hoist consensus block precedes irecv_tensor_dict in Worker.execute_model. - runner does NOT self-issue the consensus all_reduce (hoist-correct). Tests: test_sleep_mode_backend, test_pp_cudagraph_consensus (V1 hoist), test_pp_cudagraph_consensus_v2 (V2 hoist), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded (carried by separate FORK_CARRIED entries vllm-project#45615/vllm-project#45552); the load-bearing gloo wake handshake lives in gpu_worker.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lm-project#45610 HOIST f24612b] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The wake-path PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the PRs (vllm-project#45610 vllm-project#45617 vllm-project#44778 vllm-project#45611 vllm-project#45565) are SKIPPED from the loop via PRECOMPILED_WHEEL_SKIP_PRS. *** vllm-project#45610 DECODE-WEDGE FIX RE-FOLDED: now carries the PP-consensus HOIST (PR vllm-project#45610 head f24612b), REPLACING the earlier pre-hoist gate variant (4d20740). The cudagraph-mode consensus all-reduce is hoisted out of the model runner's execute_model and into Worker.execute_model, issued BEFORE the inter-stage irecv_tensor_dict (gpu_worker.py). This eliminates the structural deadlock cycle that wedged TP2/PP2 at decode step 0 (PP0 ranks parked in coordinate_cudagraph_mode_ across_pp -> all_reduce while PP1 ranks parked in irecv gloo waitRecv). The model runner no longer self-issues the consensus all_reduce; it consumes the agreed value via the new pp_synced_cudagraph_mode kwarg. Applies to V1 (gpu_model_runner.py), V2 (gpu/model_runner.py), DP (gpu/dp_utils.py), and Ray (executor/ray_utils.py) paths, plus pp_utils.py helper. gpu_model_runner.py wake-path markers (HOTPATH_FILE_RESTORE / CARRY_HOTPATH_ASSERTS): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake gpu_worker.py composition (carried forward from prior union; disjoint region from the hoist's execute_model edits, no adjacency conflict): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake AUDIT-D composition assertions (verified, not just grepped): - wake_up dispatches backend.resume EXACTLY ONCE (needs_wake_sync if/else are mutually-exclusive branches); NO raw allocator.wake_up Block B double-wake. - the hoist consensus block precedes irecv_tensor_dict in Worker.execute_model. - runner does NOT self-issue the consensus all_reduce (hoist-correct). Tests: test_sleep_mode_backend, test_pp_cudagraph_consensus (V1 hoist), test_pp_cudagraph_consensus_v2 (V2 hoist), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded (carried by separate FORK_CARRIED entries vllm-project#45615/vllm-project#45552); the load-bearing gloo wake handshake lives in gpu_worker.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lm-project#45610 HOIST f24612b] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The wake-path PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the PRs (vllm-project#45610 vllm-project#45617 vllm-project#44778 vllm-project#45611 vllm-project#45565) are SKIPPED from the loop via PRECOMPILED_WHEEL_SKIP_PRS. *** vllm-project#45610 DECODE-WEDGE FIX RE-FOLDED: now carries the PP-consensus HOIST (PR vllm-project#45610 head f24612b), REPLACING the earlier pre-hoist gate variant (4d20740). The cudagraph-mode consensus all-reduce is hoisted out of the model runner's execute_model and into Worker.execute_model, issued BEFORE the inter-stage irecv_tensor_dict (gpu_worker.py). This eliminates the structural deadlock cycle that wedged TP2/PP2 at decode step 0 (PP0 ranks parked in coordinate_cudagraph_mode_ across_pp -> all_reduce while PP1 ranks parked in irecv gloo waitRecv). The model runner no longer self-issues the consensus all_reduce; it consumes the agreed value via the new pp_synced_cudagraph_mode kwarg. Applies to V1 (gpu_model_runner.py), V2 (gpu/model_runner.py), DP (gpu/dp_utils.py), and Ray (executor/ray_utils.py) paths, plus pp_utils.py helper. gpu_model_runner.py wake-path markers (HOTPATH_FILE_RESTORE / CARRY_HOTPATH_ASSERTS): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake gpu_worker.py composition (carried forward from prior union; disjoint region from the hoist's execute_model edits, no adjacency conflict): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake AUDIT-D composition assertions (verified, not just grepped): - wake_up dispatches backend.resume EXACTLY ONCE (needs_wake_sync if/else are mutually-exclusive branches); NO raw allocator.wake_up Block B double-wake. - the hoist consensus block precedes irecv_tensor_dict in Worker.execute_model. - runner does NOT self-issue the consensus all_reduce (hoist-correct). Tests: test_sleep_mode_backend, test_pp_cudagraph_consensus (V1 hoist), test_pp_cudagraph_consensus_v2 (V2 hoist), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded (carried by separate FORK_CARRIED entries vllm-project#45615/vllm-project#45552); the load-bearing gloo wake handshake lives in gpu_worker.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lm-project#45610 HOIST f24612b] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The wake-path PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the PRs (vllm-project#45610 vllm-project#45617 vllm-project#44778 vllm-project#45611 vllm-project#45565) are SKIPPED from the loop via PRECOMPILED_WHEEL_SKIP_PRS. *** vllm-project#45610 DECODE-WEDGE FIX RE-FOLDED: now carries the PP-consensus HOIST (PR vllm-project#45610 head f24612b), REPLACING the earlier pre-hoist gate variant (4d20740). The cudagraph-mode consensus all-reduce is hoisted out of the model runner's execute_model and into Worker.execute_model, issued BEFORE the inter-stage irecv_tensor_dict (gpu_worker.py). This eliminates the structural deadlock cycle that wedged TP2/PP2 at decode step 0 (PP0 ranks parked in coordinate_cudagraph_mode_ across_pp -> all_reduce while PP1 ranks parked in irecv gloo waitRecv). The model runner no longer self-issues the consensus all_reduce; it consumes the agreed value via the new pp_synced_cudagraph_mode kwarg. Applies to V1 (gpu_model_runner.py), V2 (gpu/model_runner.py), DP (gpu/dp_utils.py), and Ray (executor/ray_utils.py) paths, plus pp_utils.py helper. gpu_model_runner.py wake-path markers (HOTPATH_FILE_RESTORE / CARRY_HOTPATH_ASSERTS): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake gpu_worker.py composition (carried forward from prior union; disjoint region from the hoist's execute_model edits, no adjacency conflict): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake AUDIT-D composition assertions (verified, not just grepped): - wake_up dispatches backend.resume EXACTLY ONCE (needs_wake_sync if/else are mutually-exclusive branches); NO raw allocator.wake_up Block B double-wake. - the hoist consensus block precedes irecv_tensor_dict in Worker.execute_model. - runner does NOT self-issue the consensus all_reduce (hoist-correct). Tests: test_sleep_mode_backend, test_pp_cudagraph_consensus (V1 hoist), test_pp_cudagraph_consensus_v2 (V2 hoist), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded (carried by separate FORK_CARRIED entries vllm-project#45615/vllm-project#45552); the load-bearing gloo wake handshake lives in gpu_worker.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lm-project#45610 HOIST f24612b] Single FULL-UNION fork-carry composing ALL wake-path changes onto one base (upstream/main), so the sync open-PR loop never has to apply mutually-adjacent wake-path hunks sequentially (honest-fact vllm-project#54 adjacency clobber). The wake-path PRs touch the SAME hunks; sequential -X-theirs drops them. This commit is the SOLE provider; the PRs (vllm-project#45610 vllm-project#45617 vllm-project#44778 vllm-project#45611 vllm-project#45565) are SKIPPED from the loop via PRECOMPILED_WHEEL_SKIP_PRS. *** vllm-project#45610 DECODE-WEDGE FIX RE-FOLDED: now carries the PP-consensus HOIST (PR vllm-project#45610 head f24612b), REPLACING the earlier pre-hoist gate variant (4d20740). The cudagraph-mode consensus all-reduce is hoisted out of the model runner's execute_model and into Worker.execute_model, issued BEFORE the inter-stage irecv_tensor_dict (gpu_worker.py). This eliminates the structural deadlock cycle that wedged TP2/PP2 at decode step 0 (PP0 ranks parked in coordinate_cudagraph_mode_ across_pp -> all_reduce while PP1 ranks parked in irecv gloo waitRecv). The model runner no longer self-issues the consensus all_reduce; it consumes the agreed value via the new pp_synced_cudagraph_mode kwarg. Applies to V1 (gpu_model_runner.py), V2 (gpu/model_runner.py), DP (gpu/dp_utils.py), and Ray (executor/ray_utils.py) paths, plus pp_utils.py helper. gpu_model_runner.py wake-path markers (HOTPATH_FILE_RESTORE / CARRY_HOTPATH_ASSERTS): vllm-project#44778 _iter_kv_cache_tensors nested-container KV zeroing on wake vllm-project#45617 scale_specs calibrated FP8-KV scale restore on wake gpu_worker.py composition (carried forward from prior union; disjoint region from the hoist's execute_model edits, no adjacency conflict): vllm-project#45398 pluggable sleep-mode backend abstraction (_get_sleep_mode_backend, sleep->backend.suspend, wake_up->backend.resume; adds vllm/device_allocator/sleep_mode_backend.py + executor/abstract.py + config/model.py fields) vllm-project#45619 gate level-2 sleep buffer restore on the weights wake tag vllm-project#45620 do not crash sleep() on shared-GPU device-global free drop vllm-project#45612 cumem_tag PP-broadcast wake race: symmetric gloo wake handshake AUDIT-D composition assertions (verified, not just grepped): - wake_up dispatches backend.resume EXACTLY ONCE (needs_wake_sync if/else are mutually-exclusive branches); NO raw allocator.wake_up Block B double-wake. - the hoist consensus block precedes irecv_tensor_dict in Worker.execute_model. - runner does NOT self-issue the consensus all_reduce (hoist-correct). Tests: test_sleep_mode_backend, test_pp_cudagraph_consensus (V1 hoist), test_pp_cudagraph_consensus_v2 (V2 hoist), test_fp8_kv_scale_wake, test_gpu_model_runner_fp8_wake_up, test_gpu_worker_wake_barrier. cumem.py deliberately excluded (carried by separate FORK_CARRIED entries vllm-project#45615/vllm-project#45552); the load-bearing gloo wake handshake lives in gpu_worker.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
c9bb8c2 to
084c8ba
Compare
Worker.wake_up restored the buffers saved before a level-2 sleep whenever self._sleep_saved_buffers was non-empty, regardless of the requested wake tags. Model buffers are allocated under the "weights" tag (load_model runs under the weights memory pool), so their CUDA virtual addresses are only re-mapped once the allocator wakes that tag. On a partial wake that does not include "weights" (e.g. wake_up(["kv_cache"])), the restore loop ran buffer.data.copy_(saved) into a still-unmapped VA, raising CUDA_ERROR_ILLEGAL_ADDRESS, and then cleared _sleep_saved_buffers so a subsequent weights wake never restored them. This was inconsistent with the post_kv_cache_wake_up call below, which is already tag-gated. Gate the restore on `tags is None or "weights" in tags`, symmetric with the existing "kv_cache" gating. Full wakes and weights-inclusive wakes are unchanged; the buffers now stay pending across a kv_cache-only wake and are restored bit-for-bit on the following weights wake. Adds CPU-only regression tests that exercise the real wake_up source: the kv_cache-only partial wake no longer copies into the unmapped weights VA and leaves buffers pending; a following weights wake restores them; full and weights-only wakes are unaffected. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: terafin <terafin@users.noreply.github.com> Signed-off-by: Justin Wood <jwood@me.com>
084c8ba to
b76da8e
Compare
Summary
Worker.wake_uprestored the buffers saved before a level-2 sleep wheneverself._sleep_saved_bufferswas non-empty, regardless of the requested waketags.Model buffers are allocated under the
"weights"tag —load_modelruns inside the"weights"memory pool — so their CUDA virtual addresses are only re-mapped once the allocator wakes that tag. On a partial wake that does not include"weights"(e.g.wake_up(["kv_cache"])), the restore loop executedbuffer.data.copy_(saved)into a still-unmapped VA, raisingCUDA_ERROR_ILLEGAL_ADDRESS. Worse, it then cleared_sleep_saved_buffers, so a subsequentwake_up(["weights"])never restored the buffers.This was inconsistent with the
post_kv_cache_wake_up()call immediately below, which is already tag-gated (tags is None or "kv_cache" in tags).Fix
Gate the buffer restore on
tags is None or "weights" in tags, symmetric with the existing"kv_cache"gate. Behavior is preserved for the cases that matter today:wake_up(None)) — buffers restored, as before.wake_up(["weights"])) — buffers restored.wake_up(["kv_cache"])) — buffers stay pending (no copy into unmapped VA); restored bit-for-bit on the following weights wake.Tests
Adds
tests/v1/worker/test_gpu_worker_sleep_wake.py— CPU-only, no GPU required. The tests load the realWorker.wake_upsource and run it against a fake allocator that tracks mapped tags plus a guarded buffer whosecopy_raises if its backing tag is unmapped (simulating the illegal-address fault):test_partial_wake_kv_cache_does_not_restore_weight_buffers—wake_up(["kv_cache"])must not copy into the unmapped weights VA; buffers stay pending. FAILS pre-fix (RuntimeError: copy into unmapped VA for tag 'weights'), passes post-fix.test_subsequent_weights_wake_restores_buffers_bit_for_bit— kv_cache wake then weights wake restores buffers and clears the saved dict only after restore. FAILS pre-fix, passes post-fix.test_full_wake_restores_buffers_and_runs_post_kv_cache— full wake unaffected (passes both).test_partial_weights_wake_restores_buffers_no_post_kv_cache— weights-only wake restores buffers and does not run post_kv_cache (passes both).Pre-fix:
2 failed, 2 passed. Post-fix:4 passed.Related
Part of the sleep/wake correctness family; orthogonal to #45612 (PP-broadcast wake race,
cumem), #45615 (sleep-side kernel drain), #45616 (mixed-tag asleep-subset wake inexecutor/abstract.py), and #44778 (FP8 KV nested containers ingpu_model_runner.py) — none of which touch the_sleep_saved_buffersrestore loop ingpu_worker.py.