[Model] Add BAGEL step execution and continuous batching (#6359)

This commit is contained in:
Trigger authored and GitHub committed 2026-09-04 01:36:11 +00:00
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: