[Model] Add BAGEL step execution and continuous batching (#6359)
This commit is contained in:
1 parent
fda3af8bbc
commit
e43c787544
24 files changed
+1965
-108
No files matched your search
@@ -11,6 +11,7 @@ import torch
|
||||
import vllm_omni.diffusion.worker.diffusion_model_runner as model_runner_module
|
||||
from tests.helpers.mark import hardware_test
|
||||
from vllm_omni.diffusion.data import DiffusionOutput
|
||||
from vllm_omni.diffusion.diffusion_kv.config import DiffusionKVCacheMode
|
||||
from vllm_omni.diffusion.diffusion_kv.model_runner_backend import DiffusionKVModelRunnerBackend
|
||||
from vllm_omni.diffusion.worker.diffusion_model_runner import DiffusionModelRunner
|
||||
from vllm_omni.diffusion.worker.request_batch import DiffusionRequestBatch, split_diffusion_output_by_request
|
||||
@@ -297,6 +298,106 @@ def test_refresh_cache_without_request_or_pipeline_default_warns(caplog):
|
||||
assert "requires num_inference_steps to be passed explicitly" in caplog.text
|
||||
|
||||
|
||||
@pytest.mark.core_model
|
||||
@pytest.mark.cpu
|
||||
def test_execute_stepwise_falls_back_to_full_forward_without_creating_step_state(monkeypatch):
|
||||
runner = _make_runner(cache_backend=None, cache_backend_name="none")
|
||||
runner.pipeline = _SingleRequestDiffusionOutputPipeline()
|
||||
request = _make_request()
|
||||
request.request_id = "text-request"
|
||||
request.use_step_execution = False
|
||||
scheduler_output = SimpleNamespace(
|
||||
finished_req_ids=set(),
|
||||
scheduled_new_reqs=[
|
||||
SimpleNamespace(
|
||||
request_id=request.request_id,
|
||||
req=request,
|
||||
diffusion_kv_metadata=None,
|
||||
)
|
||||
],
|
||||
scheduled_cached_reqs=SimpleNamespace(request_ids=[]),
|
||||
)
|
||||
monkeypatch.setattr(model_runner_module, "set_forward_context", _noop_forward_context)
|
||||
monkeypatch.setattr(model_runner_module, "current_omni_platform", _fake_platform_for_peak_memory())
|
||||
|
||||
result = DiffusionModelRunner.execute_stepwise(runner, scheduler_output)
|
||||
output = result.get_request_output(request.request_id)
|
||||
|
||||
assert output.finished is True
|
||||
assert output.step_index == 0
|
||||
assert output.result is not None
|
||||
assert output.result.output == request.prompt
|
||||
assert isinstance(runner.pipeline.last_req, DiffusionRequestBatch)
|
||||
assert runner.pipeline.last_req.num_reqs == 1
|
||||
assert runner.state_cache == {}
|
||||
|
||||
|
||||
@pytest.mark.core_model
|
||||
@pytest.mark.cpu
|
||||
def test_non_step_fallback_cleans_finished_step_wave_state_and_paged_kv(monkeypatch):
|
||||
"""A finished step request must not survive into a text fallback wave."""
|
||||
runner = _make_runner(cache_backend=None, cache_backend_name="none")
|
||||
runner.pipeline = _SingleRequestDiffusionOutputPipeline()
|
||||
runner.state_cache = {"aborted-step-request": object()}
|
||||
old_step_batch = object()
|
||||
runner.input_batch = old_step_batch
|
||||
runner.od_config.diffusion_kv_mode = DiffusionKVCacheMode.PAGED_SCHEDULER
|
||||
runner.remove_diffusion_kv_requests = Mock()
|
||||
|
||||
text_request = _make_request()
|
||||
text_request.request_id = "text-fallback-request"
|
||||
text_request.use_step_execution = False
|
||||
scheduler_output = SimpleNamespace(
|
||||
finished_req_ids={"aborted-step-request"},
|
||||
scheduled_new_reqs=[
|
||||
SimpleNamespace(
|
||||
request_id=text_request.request_id,
|
||||
req=text_request,
|
||||
diffusion_kv_metadata=None,
|
||||
)
|
||||
],
|
||||
scheduled_cached_reqs=SimpleNamespace(request_ids=[]),
|
||||
)
|
||||
monkeypatch.setattr(model_runner_module, "set_forward_context", _noop_forward_context)
|
||||
monkeypatch.setattr(model_runner_module, "current_omni_platform", _fake_platform_for_peak_memory())
|
||||
|
||||
result = DiffusionModelRunner.execute_stepwise(runner, scheduler_output)
|
||||
|
||||
assert result.get_request_output(text_request.request_id).finished is True
|
||||
assert runner.state_cache == {}
|
||||
runner.remove_diffusion_kv_requests.assert_called_once_with(["aborted-step-request"])
|
||||
assert runner.input_batch is None
|
||||
|
||||
|
||||
@pytest.mark.core_model
|
||||
@pytest.mark.cpu
|
||||
def test_execute_stepwise_rejects_mixed_step_and_full_forward_batch():
|
||||
runner = _make_runner(cache_backend=None, cache_backend_name="none")
|
||||
non_step_request = _make_request()
|
||||
non_step_request.use_step_execution = False
|
||||
step_request = _make_request()
|
||||
step_request.request_id = "step-request"
|
||||
scheduler_output = SimpleNamespace(
|
||||
finished_req_ids=set(),
|
||||
scheduled_new_reqs=[
|
||||
SimpleNamespace(
|
||||
request_id=non_step_request.request_id,
|
||||
req=non_step_request,
|
||||
diffusion_kv_metadata=None,
|
||||
),
|
||||
SimpleNamespace(
|
||||
request_id=step_request.request_id,
|
||||
req=step_request,
|
||||
diffusion_kv_metadata=None,
|
||||
),
|
||||
],
|
||||
scheduled_cached_reqs=SimpleNamespace(request_ids=[]),
|
||||
)
|
||||
|
||||
with pytest.raises(ValueError, match="Cannot mix stepwise and non-step fallback"):
|
||||
DiffusionModelRunner.execute_stepwise(runner, scheduler_output)
|
||||
|
||||
|
||||
@pytest.mark.core_model
|
||||
@pytest.mark.cpu
|
||||
def test_update_states_carries_prepared_layout() -> None:
|
||||
|
||||
Reference in new issue
Block a user