[Intra-node PD][DSV4] Pack all layers into one batch for INTRA_NODE_NVLINK path (#38984)

Co-authored-by: BJWang-ant <wangbingjia.wbj@ant-intl.com>
This commit is contained in:
Siyuan Chen
2026-09-15 21:08:33 +08:00
committed by GitHub
co-authored by BJWang-ant
parent a2a261963f
commit 832ec39cc0
3 changed files with 68 additions and 1 deletions
@@ -786,7 +786,10 @@ class MooncakeKVManager(StagingManagerMixin, CommonKVManager):
transfer_blocks.extend(set_transfer_blocks(src_ptr, dst_ptr, item_len)) transfer_blocks.extend(set_transfer_blocks(src_ptr, dst_ptr, item_len))
return self._transfer_data(mooncake_session_id, transfer_blocks) return self._transfer_data(mooncake_session_id, transfer_blocks)
if self.enable_custom_mem_pool: if (
self.enable_custom_mem_pool
and self.custom_mem_pool_type != "INTRA_NODE_NVLINK"
):
futures = [ futures = [
executor.submit( executor.submit(
process_layer, process_layer,
@@ -0,0 +1,63 @@
import unittest
from unittest.mock import MagicMock
import numpy as np
from sglang.srt.disaggregation.mooncake.conn import MooncakeKVManager
from sglang.test.ci.ci_register import register_cpu_ci
from sglang.test.test_utils import CustomTestCase
register_cpu_ci(est_time=5, suite="base-a-test-cpu")
class TestMooncakeCustomMemPoolBatch(CustomTestCase):
def test_generic_intra_node_nvlink_combines_all_layers(self):
manager = object.__new__(MooncakeKVManager)
manager.is_mla_backend = True
manager.is_hybrid_mla_backend = False
manager.enable_custom_mem_pool = True
manager.custom_mem_pool_type = "INTRA_NODE_NVLINK"
manager.max_transfer_batch_indices = 0
manager.pp_size = 1
manager._transfer_data = MagicMock(return_value=0)
executor = MagicMock()
layer_count = 43
src_ptrs = [100_000 + i * 10_000 for i in range(layer_count)]
dst_ptrs = [200_000 + i * 10_000 for i in range(layer_count)]
item_lens = [100] * layer_count
ret = manager._send_kvcache_generic(
mooncake_session_id="session",
src_data_ptrs=src_ptrs,
dst_data_ptrs=dst_ptrs,
item_lens=item_lens,
prefill_data_indices=np.array([1, 2, 5], dtype=np.int32),
dst_data_indices=np.array([11, 12, 15], dtype=np.int32),
executor=executor,
)
self.assertEqual(ret, 0)
executor.submit.assert_not_called()
manager._transfer_data.assert_called_once()
session_id, blocks = manager._transfer_data.call_args.args
self.assertEqual(session_id, "session")
self.assertEqual(len(blocks), layer_count * 2)
self.assertEqual(
blocks[:2],
[
(src_ptrs[0] + 100, dst_ptrs[0] + 1_100, 200),
(src_ptrs[0] + 500, dst_ptrs[0] + 1_500, 100),
],
)
self.assertEqual(
blocks[-2:],
[
(src_ptrs[-1] + 100, dst_ptrs[-1] + 1_100, 200),
(src_ptrs[-1] + 500, dst_ptrs[-1] + 1_500, 100),
],
)
if __name__ == "__main__":
unittest.main()
@@ -27,6 +27,7 @@ class TestMooncakeTransferBatching(unittest.TestCase):
is_hybrid_mla_backend=False, is_hybrid_mla_backend=False,
pp_size=1, pp_size=1,
enable_custom_mem_pool=enable_custom_mem_pool, enable_custom_mem_pool=enable_custom_mem_pool,
custom_mem_pool_type="NVLINK" if enable_custom_mem_pool else None,
enable_deferred_decode_kv_release=False, enable_deferred_decode_kv_release=False,
max_transfer_batch_indices=max_batch_indices, max_transfer_batch_indices=max_batch_indices,
get_mla_kv_ptrs_with_pp=MagicMock( get_mla_kv_ptrs_with_pp=MagicMock(