diff --git a/tests/v1/kv_offload/tiering/test_obj_tier.py b/tests/v1/kv_offload/tiering/test_obj_tier.py index 2dba5baf3d6f..640848bda6f9 100644 --- a/tests/v1/kv_offload/tiering/test_obj_tier.py +++ b/tests/v1/kv_offload/tiering/test_obj_tier.py @@ -54,6 +54,7 @@ def _make_offloading_config( world_size: int | None = None, replicated_layout: bool = False, is_parallelism_agnostic: bool = False, + blocks_per_chunk: int = 1, ) -> OffloadingConfig: if world_size is None: world_size = tp_size @@ -64,7 +65,9 @@ def _make_offloading_config( extra_config={}, engine_id="test-engine", model=OffloadingModelConfig(name="test/model", dtype="float16"), - cache=OffloadingCacheConfig(tokens_per_hash=16, blocks_per_chunk=1), + cache=OffloadingCacheConfig( + tokens_per_hash=16, blocks_per_chunk=blocks_per_chunk + ), parallel=OffloadingParallelConfig( rank=rank, world_size=world_size, @@ -83,6 +86,7 @@ def _make_offloading_config( _OFFLOADING_SPEC = SimpleNamespace( config=_make_offloading_config(enable_kv_cache_events=False), + blocks_per_chunk=1, ) _STORE_CONFIG = { @@ -221,6 +225,7 @@ def _make_events_spec(enable_kv_cache_events: bool) -> SimpleNamespace: """Offloading spec stub with an explicit global KV events flag.""" return SimpleNamespace( config=_make_offloading_config(enable_kv_cache_events), + blocks_per_chunk=1, kv_events_config=OffloadingKVEventsConfig( enable_kv_cache_events=enable_kv_cache_events, self_describing_kv_events=False, @@ -780,6 +785,7 @@ def test_obj_tier_replicated_layout_collapses_mapper_identity(): config=_make_offloading_config( False, tp_size=2, world_size=2, rank=1, replicated_layout=True ), + blocks_per_chunk=1, kv_events_config=OffloadingKVEventsConfig( enable_kv_cache_events=False, self_describing_kv_events=False, @@ -789,6 +795,7 @@ def test_obj_tier_replicated_layout_collapses_mapper_identity(): config=_make_offloading_config( False, tp_size=4, world_size=4, rank=3, replicated_layout=True ), + blocks_per_chunk=1, kv_events_config=OffloadingKVEventsConfig( enable_kv_cache_events=False, self_describing_kv_events=False, @@ -806,3 +813,22 @@ def test_obj_tier_replicated_layout_collapses_mapper_identity(): finally: tp2_tier.shutdown() tp4_tier.shutdown() + + +def test_obj_tier_namespace_includes_blocks_per_chunk(): + """Chunks of different sizes have different layouts, so they must not share + object keys (the fs tier namespaces by chunk size the same way).""" + tiers = [] + for blocks_per_chunk in (1, 4): + spec = SimpleNamespace( + config=_make_offloading_config(False, blocks_per_chunk=blocks_per_chunk), + blocks_per_chunk=blocks_per_chunk, + ) + tiers.append(_make_tier(offloading_spec=spec)[0]) + try: + assert tiers[0]._file_mapper.get_file_name(key(1)) != ( + tiers[1]._file_mapper.get_file_name(key(1)) + ) + finally: + for tier in tiers: + tier.shutdown() diff --git a/vllm/v1/kv_offload/tiering/obj/manager.py b/vllm/v1/kv_offload/tiering/obj/manager.py index 26e78894742a..37ce4ca3e244 100644 --- a/vllm/v1/kv_offload/tiering/obj/manager.py +++ b/vllm/v1/kv_offload/tiering/obj/manager.py @@ -170,7 +170,10 @@ def __init__( root_dir = f"{prefix}/" if prefix else "" # Opt in; FileMapper enables it only for a parallelism-invariant block. self._file_mapper = FileMapper.from_offloading_spec( - root_dir, offloading_spec, parallel_agnostic=True + root_dir, + offloading_spec, + blocks_per_file=offloading_spec.blocks_per_chunk, + parallel_agnostic=True, ) self._next_obj_dev_id: int = 1 # dev_id=0 is reserved for _exists() probes