[AMD] Enable FP4 indexer for Deepseek V4 (#37353)

Co-authored-by: 1am9trash <1am9trash@gmail.com>
Co-authored-by: AMD-yanfeiwang <256076023+AMD-yanfeiwang@users.noreply.github.com>
Co-authored-by: Thomas Wang <thomawan@amd.com>
This commit is contained in:
Xinyi Song
2026-09-02 09:45:08 -07:00
committed by GitHub
co-authored by 1am9trash AMD-yanfeiwang Thomas Wang
parent f6aed6ec53
commit f8cbf000f4
21 changed files with 1727 additions and 75 deletions
@@ -136,6 +136,17 @@ class TestLazyHostPoolRelease(CustomTestCase):
def _make_logical_pool():
return LogicalHostPool(size=8, page_size=2)
@staticmethod
def _make_transfer_pool(*, page_aligned_only):
pool = DeepSeekV4PagedHostPool.__new__(DeepSeekV4PagedHostPool)
pool.pool_name = str(PoolName.DEEPSEEK_V4_C4_INDEXER)
pool.slot_page_size = 4
pool.layer_num = 1
pool.page_aligned_only = page_aligned_only
pool.device_ptrs = [0]
pool.data_ptrs = [0]
return pool
def _assert_lazy_release(self, pool):
self.assertEqual(pool.free(torch.empty(0, dtype=torch.int64)), 0)
self.assertEqual(pool.num_release_slots, 0)
@@ -190,6 +201,26 @@ class TestLazyHostPoolRelease(CustomTestCase):
pool.clear()
self.assertEqual(len(pool.alloc(1)), 2)
def test_grouped_page_rows_reject_unaligned_transfers(self):
# FP4 indexer rows group their slots, so a partial page has no
# well-defined token-granular copy and must not silently fall back.
pool = self._make_transfer_pool(page_aligned_only=True)
unaligned = torch.arange(3, dtype=torch.int64)
with self.assertRaisesRegex(ValueError, "page-aligned"):
pool.backup_from_device_all_layer(None, unaligned, unaligned, "direct")
with self.assertRaisesRegex(ValueError, "page-aligned"):
pool.load_to_device_per_layer(None, unaligned, unaligned, 0, "direct")
def test_fused_page_rows_keep_token_granular_transfers(self):
pool = self._make_transfer_pool(page_aligned_only=False)
unaligned = torch.arange(3, dtype=torch.int64)
with unittest.mock.patch(
"sglang.srt.mem_cache.memory_pool_host.transfer_cache_dsv4_mla"
) as transfer:
pool.backup_from_device_all_layer(None, unaligned, unaligned, "direct")
pool.load_to_device_per_layer(None, unaligned, unaligned, 0, "direct")
self.assertEqual(transfer.call_count, 2)
def test_logical_pool_lazy_release(self):
pool = self._make_logical_pool()
self._assert_lazy_release(pool)