[Model] Add Cache-DiT and CPU offload support for SANA-Video 2B (#5882)

Signed-off-by: cr-gao <gaochenrui@sjtu.edu.cn>
Co-authored-by: Hongsheng Liu <liuhongsheng4@huawei.com>
Co-authored-by: Alicia <115451386+congw729@users.noreply.github.com>
This commit is contained in:
authored and GitHub committed 2026-09-02 23:40:48 +08:00
1 parent 95a9311696
commit 3b6ce98421
10 files changed
+558 -26

No files matched your search

+54 -16
View File
@@ -14,6 +14,7 @@ from vllm_omni.diffusion.data import DiffusionOutput
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
from vllm_omni.inputs.data import OmniDiffusionSamplingParams
pytestmark = [pytest.mark.diffusion]
@@ -133,12 +134,7 @@ class _CompileTrackingModel:
def _make_request():
sampling_params = SimpleNamespace(
generator=None,
seed=None,
generator_device=None,
num_inference_steps=4,
)
sampling_params = OmniDiffusionSamplingParams(num_inference_steps=4)
return SimpleNamespace(
request_id="req-test",
prompt="a prompt",
@@ -249,6 +245,58 @@ def _make_compile_runner(
return runner
class _EnabledCacheBackend:
def __init__(self):
self.refresh_calls = []
def is_enabled(self):
return True
def refresh(self, pipeline, num_inference_steps, verbose=True):
self.refresh_calls.append((pipeline, num_inference_steps, verbose))
@pytest.mark.core_model
@pytest.mark.cpu
def test_refresh_cache_prefers_request_steps_then_schedule_then_pipeline_default():
cache_backend = _EnabledCacheBackend()
runner = _make_runner(cache_backend=cache_backend, cache_backend_name="cache_dit")
runner.pipeline.default_num_inference_steps = 50
req = _make_request()
custom_timesteps = torch.linspace(999.0, 0.0, 8)
custom_sigmas = [0.9, 0.5, 0.1]
cases = [
(20, None, None),
(30, custom_timesteps, custom_sigmas),
(None, custom_timesteps, None),
(None, custom_timesteps, custom_sigmas),
(None, None, custom_sigmas),
(None, None, None),
]
for num_inference_steps, timesteps, sigmas in cases:
req.sampling_params.num_inference_steps = num_inference_steps
req.sampling_params.timesteps = timesteps
req.sampling_params.sigmas = sigmas
DiffusionModelRunner._refresh_cache_for_requests(runner, [req], od_config=runner.od_config)
assert [steps for _, steps, _ in cache_backend.refresh_calls] == [20, 30, 8, 8, 3, 50]
@pytest.mark.core_model
@pytest.mark.cpu
def test_refresh_cache_without_request_or_pipeline_default_warns(caplog):
cache_backend = _EnabledCacheBackend()
runner = _make_runner(cache_backend=cache_backend, cache_backend_name="cache_dit")
req = _make_request()
req.sampling_params.num_inference_steps = None
DiffusionModelRunner._refresh_cache_for_requests(runner, [req], od_config=runner.od_config)
assert cache_backend.refresh_calls == []
assert "requires num_inference_steps to be passed explicitly" in caplog.text
@pytest.mark.core_model
@pytest.mark.cpu
def test_update_states_carries_prepared_layout() -> None:
@@ -451,16 +499,6 @@ def test_execute_model_skips_cache_summary_without_active_cache_backend(monkeypa
@pytest.mark.core_model
@hardware_test(res={"cuda": "L4"}, num_cards=1)
def test_execute_model_emits_cache_summary_with_active_cache_dit_backend(monkeypatch):
class _EnabledCacheBackend:
def __init__(self):
self.refresh_calls = []
def is_enabled(self):
return True
def refresh(self, pipeline, num_inference_steps, verbose=True):
self.refresh_calls.append((pipeline, num_inference_steps, verbose))
cache_backend = _EnabledCacheBackend()
runner = _make_runner(cache_backend=cache_backend, cache_backend_name="cache_dit")
req = _make_request()