Support unified memory page-envelope transfers in PD (#39477)

Co-authored-by: yhzhuang <yhzhuang@fb.com>
Co-authored-by: Lianmin Zheng <lianminzheng@gmail.com>
Co-authored-by: Yonghao Zhuang <yhzhuang@users.noreply.github.com>
Co-authored-by: Cheng Wan <cheng.wan@radixark.ai>
This commit is contained in:
Yonghao Zhuang
2026-09-18 17:39:50 -07:00
committed by GitHub
co-authored by yhzhuang Lianmin Zheng Yonghao Zhuang Cheng Wan
parent d0730a0e8b
commit 5931fd60ee
27 changed files with 1012 additions and 247 deletions
@@ -17,6 +17,9 @@ from sglang.srt.managers.scheduler import Scheduler
from sglang.srt.runtime_context import get_context, publish, reset_context
from sglang.srt.server_args import ServerArgs
from sglang.test.ci.ci_register import register_cpu_ci
from sglang.test.separate_buffer_allocator_double import (
bind_separate_buffer_capacity,
)
from sglang.test.test_utils import CustomTestCase
register_cpu_ci(est_time=11, suite="base-a-test-cpu")
@@ -71,7 +74,8 @@ class TestDecodeQueueCleanup(CustomTestCase):
queue.retracted_queue = reqs.copy()
queue.num_reserved_decode_tokens = 0
queue.req_to_token_pool = SimpleNamespace(available_size=lambda: len(reqs))
queue.token_to_kv_pool_allocator = SimpleNamespace(page_size=page_size)
queue.token_to_kv_pool_allocator = MagicMock(page_size=page_size)
bind_separate_buffer_capacity(queue.token_to_kv_pool_allocator)
queue.tree_cache = MagicMock()
queue.scheduler = SimpleNamespace(
sliding_window_size=2047,
@@ -81,6 +85,9 @@ class TestDecodeQueueCleanup(CustomTestCase):
queue._swa_aware_allocatable_token_budgets = MagicMock(
return_value=(physical_available, physical_available)
)
queue._allocatable_token_budgets = MagicMock(
side_effect=lambda **_: physical_available
)
queue._swa_tail_allocatable_token_budget = MagicMock(
side_effect=lambda **_: physical_available
)
@@ -120,6 +127,10 @@ class TestDecodeQueueCleanup(CustomTestCase):
queue.retracted_queue = []
queue._resolve_pending_reqs = MagicMock()
queue._uses_swa_tail_prealloc = MagicMock(return_value=False)
# `_uses_swa_reservation` consults the allocator once tail prealloc is
# off, so this abort path needs one even though it never allocates.
queue.token_to_kv_pool_allocator = MagicMock()
bind_separate_buffer_capacity(queue.token_to_kv_pool_allocator)
queue._allocatable_token_budgets = MagicMock(return_value=0)
queue._hicache_pending_restore_tokens = MagicMock(return_value=0)
@@ -175,6 +186,10 @@ class TestDecodeQueueCleanup(CustomTestCase):
queue._resolve_pending_reqs = MagicMock()
queue._update_handshake_waiters = MagicMock()
queue._uses_swa_tail_prealloc = MagicMock(return_value=False)
# `_uses_swa_reservation` consults the allocator once tail prealloc is
# off, so this abort path needs one even though it never allocates.
queue.token_to_kv_pool_allocator = MagicMock()
bind_separate_buffer_capacity(queue.token_to_kv_pool_allocator)
queue._allocatable_token_budgets = MagicMock(return_value=0)
queue._hicache_pending_restore_tokens = MagicMock(return_value=0)
@@ -234,6 +249,9 @@ class TestDecodeQueueCleanup(CustomTestCase):
)
queue._hicache_pending_restore_tokens = MagicMock(return_value=0)
queue._pre_alloc = MagicMock()
queue.token_to_kv_pool_allocator = MagicMock()
bind_separate_buffer_capacity(queue.token_to_kv_pool_allocator)
queue.tree_cache = MagicMock()
queue.req_to_token_pool = MagicMock()
queue.req_to_token_pool.available_size.return_value = 1
# Non-hybrid pools have no mamba allocator; MagicMock would otherwise