66 lines
3.4 KiB
Python
66 lines
3.4 KiB
Python
# SPDX-License-Identifier: Apache-2.0
|
|||
|
|
# SPDX-FileCopyrightText: Copyright contributors to the vLLM-Omni project
|
||
|
|
|
||
|
|
from contextlib import nullcontext
|
||
|
|
from pathlib import Path
|
||
|
|
from shutil import rmtree
|
||
|
|
from types import SimpleNamespace
|
||
|
|
from unittest.mock import MagicMock
|
||
|
|
|
||
|
|
import pytest
|
||
|
|
|
||
|
|
from tests.model_tests.diffusion import anima_builder, test_common_offline, test_common_online
|
||
|
|
from tests.model_tests.diffusion.config_types import DiffusionTasks
|
||
|
|
|
||
|
|
pytestmark = [pytest.mark.cpu, pytest.mark.core_model, pytest.mark.diffusion]
|
||
|
|
|
||
|
|
|
||
|
|
@pytest.mark.parametrize("model_name", ["AnimaPipeline", "FluxPipeline"])
|
||
|
|
def test_common_runners_resolve_native_checkpoint(model_name, tmp_path, monkeypatch):
|
||
|
|
"""Both entry points receive the file and class; directory models keep their existing arguments."""
|
||
|
|
paths = {model_name: str(tmp_path)}
|
||
|
|
subtests = SimpleNamespace(test=lambda **kwargs: nullcontext())
|
||
|
|
build_omni = MagicMock()
|
||
|
|
monkeypatch.setattr(test_common_offline, "build_omni_from_diff_accelerations", build_omni)
|
||
|
|
monkeypatch.setattr(test_common_offline, "run_and_validate_text_to_image_request", MagicMock())
|
||
|
|
test_common_offline.test_pipeline_on_supported_tasks(
|
||
|
|
model_name, None, [DiffusionTasks.TEXT_TO_IMAGE], False, False, False, paths, subtests
|
||
|
|
)
|
||
|
|
server = MagicMock()
|
||
|
|
monkeypatch.setattr(test_common_online, "OmniServer", server)
|
||
|
|
monkeypatch.setattr(test_common_online, "OnlineOmniClient", MagicMock())
|
||
|
|
monkeypatch.setattr(test_common_online, "run_and_validate_online_text_to_image_request", MagicMock())
|
||
|
|
test_common_online.test_online_on_supported_tasks(
|
||
|
|
model_name, None, [DiffusionTasks.TEXT_TO_IMAGE], False, False, paths, "core_model", subtests
|
||
|
|
)
|
||
|
|
if model_name == "AnimaPipeline":
|
||
|
|
checkpoint = str(tmp_path / anima_builder.CHECKPOINT_FILENAME)
|
||
|
|
build_omni.assert_called_once_with(
|
||
|
|
accelerations=None, model=checkpoint, enforce_eager=True, model_class_name=model_name
|
||
|
|
)
|
||
|
|
server.assert_called_once_with(checkpoint, ["--enforce-eager", "--model-class-name", model_name])
|
||
|
|
else:
|
||
|
|
build_omni.assert_called_once_with(accelerations=None, model=str(tmp_path), enforce_eager=True)
|
||
|
|
server.assert_called_once_with(str(tmp_path), ["--enforce-eager"])
|
||
|
|
|
||
|
|
|
||
|
|
def test_real_anima_assets_leave_cache_intact(tmp_path, monkeypatch):
|
||
|
|
"""The fixture may delete the assembled directory without deleting cached model assets."""
|
||
|
|
components = tmp_path / "components"
|
||
|
|
for name in ("text_encoder", "vae", "tokenizer", "t5_tokenizer"):
|
||
|
|
(components / name).mkdir(parents=True)
|
||
|
|
(components / name / "asset").write_text(name)
|
||
|
|
checkpoint = tmp_path / "real.safetensors"
|
||
|
|
checkpoint.write_bytes(b"checkpoint")
|
||
|
|
monkeypatch.setattr(anima_builder, "snapshot_download", lambda *args, **kwargs: str(components))
|
||
|
|
monkeypatch.setattr(anima_builder, "hf_hub_download", lambda *args, **kwargs: str(checkpoint))
|
||
|
|
directory = Path(anima_builder.real_anima_model())
|
||
|
|
try:
|
||
|
|
assert (directory / anima_builder.CHECKPOINT_FILENAME).read_bytes() == b"checkpoint"
|
||
|
|
assert (directory / "vae" / "asset").read_text() == "vae"
|
||
|
|
# Missing scheduler is supported by Anima's default scheduler fallback.
|
||
|
|
assert not (directory / "scheduler").exists()
|
||
|
|
finally:
|
||
|
|
rmtree(directory)
|
||
|
|
assert checkpoint.read_bytes() == b"checkpoint"
|
||
|
|
assert (components / "vae" / "asset").read_text() == "vae"
|