[Bugfix] Normalize sparse MLA warmup compression ratios (#49392)

Signed-off-by: Wu, Xiaochang <xiaochang.wu@intel.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Xiaochang Wu committed Jul 27, 2026 at 15:02 UTC 8061dc26bd0b37a2ad58068b99d072be5a0e5f47
2 files changed +24 -2
tests/v1/attention/test_indexer_deepseek_v4_slot_mapping.py
+23 -1
@@ -1,15 +1,37 @@
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4 +from types import SimpleNamespace
5 +
6 import pytest
7 import torch
8
9 from tests.v1.attention.utils import create_vllm_config
10 from vllm.v1.attention.backend import CommonAttentionMetadata
9 -from vllm.v1.attention.backends.mla.indexer import DeepseekV32IndexerMetadataBuilder
11 +from vllm.v1.attention.backends.mla.indexer import (
12 + BuildPrefillChunkMetadataKernel,
13 + DeepseekV32IndexerMetadataBuilder,
14 +)
15 from vllm.v1.kv_cache_interface import MLAAttentionSpec
16
17
18 +def test_indexer_warmup_normalizes_zero_compress_ratios():
19 + config = SimpleNamespace(
20 + scheduler_config=SimpleNamespace(max_num_batched_tokens=8),
21 + model_config=SimpleNamespace(
22 + hf_config=SimpleNamespace(compress_ratios=[0, 0, 4, 128, 0])
23 + ),
24 + parallel_config=SimpleNamespace(
25 + decode_context_parallel_size=1,
26 + cp_kv_cache_interleave_size=1,
27 + ),
28 + )
29 +
30 + keys = BuildPrefillChunkMetadataKernel().get_warmup_keys(config)
31 +
32 + assert {key.COMPRESS_RATIO for key in keys} == {1, 4, 128}
33 +
34 +
35 @pytest.mark.skipif(not torch.cuda.is_available(), reason="requires CUDA")
36 def test_indexer_builder_deepseek_v4_compressed_slot_mapping_uses_storage_block_size():
37 """Regression test: DeepseekV4 compression path must compute slot_mapping from
vllm/v1/attention/backends/mla/indexer.py
+1 -1
@@ -328,7 +328,7 @@ class BuildPrefillChunkMetadataKernel(
328 dcp_interleave = parallel_config.cp_kv_cache_interleave_size
329 dcp_rank = get_dcp_group().rank_in_group if dcp_world > 1 else 0
330 compress_ratios = tuple(
331 - int(ratio)
331 + max(1, int(ratio))
332 for ratio in (getattr(hf_config, "compress_ratios", None) or (1,))
333 )
334 return self._trace_dispatch(self.dispatch)(