2026-08-11 14:55:42 +08:00
|
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
|
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
|
|
|
|
|
from vllm_omni.diffusion.diffusion_kv.metadata import (
|
|
|
|
|
DiffusionKVContextMetadata,
|
|
|
|
|
DiffusionKVMetadata,
|
|
|
|
|
DiffusionKVSequenceMetadata,
|
|
|
|
|
)
|
2026-09-06 05:41:54 +08:00
|
|
|
from vllm_omni.diffusion.diffusion_kv.request import DiffusionKVRequest
|
|
|
|
|
from vllm_omni.diffusion.request import OmniDiffusionRequest
|
|
|
|
|
from vllm_omni.diffusion.sched.base_scheduler import BaseScheduler
|
|
|
|
|
from vllm_omni.diffusion.sched.interface import CachedRequestData, DiffusionSchedulerOutput
|
|
|
|
|
from vllm_omni.inputs.data import OmniDiffusionSamplingParams
|
2026-08-11 14:55:42 +08:00
|
|
|
|
|
|
|
|
pytestmark = [pytest.mark.diffusion, pytest.mark.core_model, pytest.mark.cpu]
|
|
|
|
|
|
|
|
|
|
|
2026-09-06 05:41:54 +08:00
|
|
|
def test_native_request_metadata_round_trips_and_stays_optional() -> None:
|
|
|
|
|
params = {
|
|
|
|
|
"transfer_id": "xfer-req-0",
|
|
|
|
|
"do_remote_decode": True,
|
|
|
|
|
"do_remote_prefill": False,
|
|
|
|
|
"remote_engine_id": "dit-engine-0",
|
|
|
|
|
}
|
|
|
|
|
kv_request = DiffusionKVRequest(
|
|
|
|
|
"req-0/diffusion-kv/0",
|
|
|
|
|
sequence_id=0,
|
|
|
|
|
prefix_len=4,
|
|
|
|
|
target_len=2,
|
|
|
|
|
seq_len=6,
|
|
|
|
|
kv_transfer_params=params,
|
|
|
|
|
prompt_token_ids=[0] * 6,
|
|
|
|
|
)
|
|
|
|
|
public_request = OmniDiffusionRequest(
|
|
|
|
|
prompt="prompt",
|
|
|
|
|
sampling_params=OmniDiffusionSamplingParams(num_inference_steps=1),
|
|
|
|
|
request_id="req-0",
|
|
|
|
|
kv_transfer_params=params,
|
|
|
|
|
)
|
|
|
|
|
scheduler_output = DiffusionSchedulerOutput(
|
|
|
|
|
step_id=0,
|
|
|
|
|
scheduled_new_reqs=[],
|
|
|
|
|
scheduled_cached_reqs=CachedRequestData.make_empty(),
|
|
|
|
|
finished_req_ids=set(),
|
|
|
|
|
num_running_reqs=0,
|
|
|
|
|
num_waiting_reqs=0,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
assert kv_request.kv_transfer_params is params
|
|
|
|
|
assert kv_request.prompt_token_ids == [0] * 6
|
|
|
|
|
assert public_request.kv_transfer_params is params
|
|
|
|
|
assert scheduler_output.kv_connector_metadata is None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class _MetadataScheduler(BaseScheduler):
|
|
|
|
|
def update_from_output(self, sched_output, output) -> set[str]:
|
|
|
|
|
del sched_output, output
|
|
|
|
|
return set()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_scheduler_copies_opaque_params_to_sequence_requests() -> None:
|
|
|
|
|
params = {"transfer_id": "xfer-req-0", "do_remote_prefill": True}
|
|
|
|
|
sequence = DiffusionKVRequest(
|
|
|
|
|
"req-0/diffusion-kv/0",
|
|
|
|
|
sequence_id=0,
|
|
|
|
|
prefix_len=4,
|
|
|
|
|
target_len=2,
|
|
|
|
|
seq_len=6,
|
|
|
|
|
)
|
|
|
|
|
request = OmniDiffusionRequest(
|
|
|
|
|
prompt="prompt",
|
|
|
|
|
sampling_params=OmniDiffusionSamplingParams(num_inference_steps=1),
|
|
|
|
|
request_id="req-0",
|
|
|
|
|
diffusion_kv_requests=(sequence,),
|
|
|
|
|
kv_transfer_params=params,
|
|
|
|
|
)
|
|
|
|
|
scheduler = _MetadataScheduler()
|
|
|
|
|
scheduler._diffusion_kv_manager = object()
|
|
|
|
|
|
|
|
|
|
state = scheduler._make_request_state("req-0", request)
|
|
|
|
|
|
|
|
|
|
assert state.diffusion_kv_requests[0].kv_transfer_params == params
|
|
|
|
|
assert state.diffusion_kv_requests[0].kv_transfer_params is not params
|
|
|
|
|
|
|
|
|
|
|
2026-08-11 14:55:42 +08:00
|
|
|
def test_diffusion_kv_metadata_uses_native_cache_group_block_ids() -> None:
|
|
|
|
|
context = DiffusionKVContextMetadata(
|
|
|
|
|
context_id="text",
|
|
|
|
|
cache_role="cross_attention",
|
|
|
|
|
num_tokens=3,
|
|
|
|
|
block_ids=([7], [11]),
|
|
|
|
|
)
|
|
|
|
|
sequence = DiffusionKVSequenceMetadata(
|
|
|
|
|
sequence_id=1,
|
|
|
|
|
prefix_len=4,
|
|
|
|
|
target_len=2,
|
|
|
|
|
seq_len=8,
|
|
|
|
|
block_ids=([1, 2], [5, 6]),
|
|
|
|
|
context_ids=(context.context_id,),
|
|
|
|
|
)
|
|
|
|
|
metadata = DiffusionKVMetadata(
|
|
|
|
|
request_id="req-0",
|
|
|
|
|
allocation_generation=3,
|
|
|
|
|
sequences=(sequence,),
|
|
|
|
|
contexts=(context,),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
assert metadata.sequences[0].block_ids == ([1, 2], [5, 6])
|
|
|
|
|
assert metadata.contexts[0].block_ids == ([7], [11])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_cfg_sequences_can_share_one_request_context() -> None:
|
|
|
|
|
shared_context = DiffusionKVContextMetadata(
|
|
|
|
|
context_id="shared-text",
|
|
|
|
|
cache_role="cross_attention",
|
|
|
|
|
num_tokens=3,
|
|
|
|
|
block_ids=([7], [11]),
|
|
|
|
|
)
|
|
|
|
|
sequences = tuple(
|
|
|
|
|
DiffusionKVSequenceMetadata(
|
|
|
|
|
sequence_id=sequence_id,
|
|
|
|
|
prefix_len=4,
|
|
|
|
|
target_len=2,
|
|
|
|
|
seq_len=8,
|
|
|
|
|
block_ids=([sequence_id + 1],),
|
|
|
|
|
context_ids=(shared_context.context_id,),
|
|
|
|
|
)
|
|
|
|
|
for sequence_id in range(2)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
metadata = DiffusionKVMetadata(
|
|
|
|
|
request_id="req-shared-context",
|
|
|
|
|
allocation_generation=1,
|
|
|
|
|
sequences=sequences,
|
|
|
|
|
contexts=(shared_context,),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
assert metadata.contexts == (shared_context,)
|
|
|
|
|
assert metadata.sequences[0].context_ids == (shared_context.context_id,)
|
|
|
|
|
assert metadata.sequences[1].context_ids == (shared_context.context_id,)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_cfg_sequences_can_reference_branch_specific_contexts() -> None:
|
|
|
|
|
conditional_context = DiffusionKVContextMetadata(
|
|
|
|
|
context_id="conditional-text",
|
|
|
|
|
cache_role="cross_attention",
|
|
|
|
|
num_tokens=3,
|
|
|
|
|
block_ids=([7], [11]),
|
|
|
|
|
)
|
|
|
|
|
unconditional_context = DiffusionKVContextMetadata(
|
|
|
|
|
context_id="unconditional-text",
|
|
|
|
|
cache_role="cross_attention",
|
|
|
|
|
num_tokens=3,
|
|
|
|
|
block_ids=([8], [12]),
|
|
|
|
|
)
|
|
|
|
|
metadata = DiffusionKVMetadata(
|
|
|
|
|
request_id="req-branch-contexts",
|
|
|
|
|
allocation_generation=1,
|
|
|
|
|
sequences=(
|
|
|
|
|
DiffusionKVSequenceMetadata(
|
|
|
|
|
sequence_id=0,
|
|
|
|
|
prefix_len=4,
|
|
|
|
|
target_len=2,
|
|
|
|
|
seq_len=8,
|
|
|
|
|
block_ids=([1],),
|
|
|
|
|
context_ids=(conditional_context.context_id,),
|
|
|
|
|
),
|
|
|
|
|
DiffusionKVSequenceMetadata(
|
|
|
|
|
sequence_id=1,
|
|
|
|
|
prefix_len=4,
|
|
|
|
|
target_len=2,
|
|
|
|
|
seq_len=8,
|
|
|
|
|
block_ids=([2],),
|
|
|
|
|
context_ids=(unconditional_context.context_id,),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
contexts=(conditional_context, unconditional_context),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
assert metadata.sequences[0].context_ids == (conditional_context.context_id,)
|
|
|
|
|
assert metadata.sequences[1].context_ids == (unconditional_context.context_id,)
|