[diffusion] CI: refactor diffusion ci and reduce redundancy (#22810)

This commit is contained in:
Mick
2026-04-15 10:12:29 +08:00
committed by GitHub
parent 47ac830c07
commit e95c2e73bd
18 changed files with 306 additions and 464 deletions
+43 -19
View File
@@ -22,10 +22,8 @@ import tabulate
from sglang.multimodal_gen.runtime.utils.logging_utils import init_logger
from sglang.multimodal_gen.test.server.testcase_configs import (
BASELINE_CONFIG,
ONE_GPU_CASES_A,
ONE_GPU_CASES_B,
TWO_GPU_CASES_A,
TWO_GPU_CASES_B,
ONE_GPU_CASES,
TWO_GPU_CASES,
DiffusionTestCase,
)
@@ -54,13 +52,15 @@ def _discover_unit_tests() -> list[str]:
FILE_SUITES = {
"unit": _discover_unit_tests(),
"component-accuracy": [
"test_component_accuracy_1_gpu.py",
"test_component_accuracy_2_gpu.py",
],
"component-accuracy-1-gpu": [
"test_accuracy_1_gpu_a.py",
"test_accuracy_1_gpu_b.py",
"test_component_accuracy_1_gpu.py",
],
"component-accuracy-2-gpu": [
"test_accuracy_2_gpu_a.py",
"test_accuracy_2_gpu_b.py",
"test_component_accuracy_2_gpu.py",
],
"1-gpu-b200": [
"test_server_c.py",
@@ -76,12 +76,10 @@ FILE_SUITES.update(suites_ascend)
PARAMETRIZED_CASE_GROUPS = {
"1-gpu": [
("test_server_a.py", ONE_GPU_CASES_A),
("test_server_b.py", ONE_GPU_CASES_B),
("test_server_1_gpu.py", ONE_GPU_CASES),
],
"2-gpu": [
("test_server_2_gpu_a.py", TWO_GPU_CASES_A),
("test_server_2_gpu_b.py", TWO_GPU_CASES_B),
("test_server_2_gpu.py", TWO_GPU_CASES),
],
}
@@ -116,9 +114,14 @@ SUITES = {
STRICT_SUITES = {"unit"}
COMPONENT_ACCURACY_SUITES = {
"component-accuracy",
"component-accuracy-1-gpu",
"component-accuracy-2-gpu",
}
COMPONENT_ACCURACY_FILE_NUM_GPUS = {
"test_component_accuracy_1_gpu.py": 1,
"test_component_accuracy_2_gpu.py": 2,
}
@dataclass(frozen=True)
@@ -540,11 +543,28 @@ def _extract_failure_tail(full_output: str, max_lines: int = 20) -> list[str]:
return lines[-max_lines:]
def _summary_has_retryable_failure(summary_lines: list[str]) -> bool:
for line in summary_lines:
lowered = line.lower()
if (
"[performance]" in line
or "SafetensorError" in line
or "FileNotFoundError" in line
or "TimeoutError" in line
or "out of memory" in lowered
or "oom killer" in lowered
):
return True
return False
def _is_retryable_failure(full_output: str) -> bool:
summary_lines = _extract_short_test_summary(full_output)
is_perf_assertion = (
"multimodal_gen/test/server/test_server_utils.py" in full_output
and "AssertionError" in full_output
)
is_aggregated_retryable_failure = _summary_has_retryable_failure(summary_lines)
is_flaky_ci_assertion = (
"SafetensorError" in full_output
@@ -556,7 +576,12 @@ def _is_retryable_failure(full_output: str) -> bool:
"out of memory" in full_output.lower() or "oom killer" in full_output.lower()
)
return is_perf_assertion or is_flaky_ci_assertion or is_oom_error
return (
is_perf_assertion
or is_aggregated_retryable_failure
or is_flaky_ci_assertion
or is_oom_error
)
def _print_attempt_tail_summary(
@@ -710,17 +735,17 @@ def partition_test_files(files, partition_id, total_partitions):
]
def run_component_accuracy_files(
files, suite: str, filter_expr=None, continue_on_error=False
):
def run_component_accuracy_files(files, filter_expr=None, continue_on_error=False):
exit_code = 0
for file_path in files:
if suite == "component-accuracy-2-gpu":
file_name = Path(file_path).name
num_gpus = COMPONENT_ACCURACY_FILE_NUM_GPUS.get(file_name, 1)
if num_gpus > 1:
cmd = [
sys.executable,
"-m",
"torch.distributed.run",
"--nproc_per_node=2",
f"--nproc_per_node={num_gpus}",
"-m",
"pytest",
"-s",
@@ -1143,7 +1168,6 @@ def main():
exit_code = run_component_accuracy_files(
my_files,
suite=args.suite,
filter_expr=args.filter,
continue_on_error=args.continue_on_error,
)
@@ -0,0 +1,78 @@
from __future__ import annotations
from sglang.multimodal_gen.test.server.testcase_configs import (
ONE_GPU_CASES,
TWO_GPU_CASES,
DiffusionTestCase,
)
def _select_accuracy_cases(
cases: list[DiffusionTestCase], enabled_ids: tuple[str, ...]
) -> list[DiffusionTestCase]:
enabled = set(enabled_ids)
return [case for case in cases if case.id in enabled]
ACCURACY_ONE_GPU_CASE_IDS = (
"qwen_image_t2i",
"qwen_image_t2i_cache_dit_enabled",
"flux_image_t2i",
"flux_2_image_t2i",
"flux_2_klein_image_t2i",
"layerwise_offload",
"zimage_image_t2i",
"zimage_image_t2i_fp8",
"zimage_image_t2i_multi_lora",
"qwen_image_edit_ti2i",
"qwen_image_edit_2509_ti2i",
"qwen_image_edit_2511_ti2i",
"qwen_image_layered_i2i",
"flux_2_image_t2i_upscaling_4x",
"mova_360p_1gpu",
"wan2_1_t2v_1.3b",
"wan2_1_t2v_1.3b_text_encoder_cpu_offload",
"wan2_1_t2v_1.3b_teacache_enabled",
"wan2_1_t2v_1.3b_frame_interp_2x",
"wan2_1_t2v_1.3b_upscaling_4x",
"wan2_1_t2v_1.3b_frame_interp_2x_upscaling_4x",
"wan2_1_t2v_1_3b_lora_1gpu",
"flux_2_ti2i",
"flux_2_t2i_customized_vae_path",
"fast_hunyuan_video",
"wan2_2_ti2v_5b",
"fastwan2_2_ti2v_5b",
"hunyuan3d_shape_gen",
"turbo_wan2_1_t2v_1.3b",
"flux_2_ti2i_multi_image_cache_dit",
)
ACCURACY_TWO_GPU_CASE_IDS = (
"wan2_2_i2v_a14b_2gpu",
"wan2_2_t2v_a14b_2gpu",
"wan2_2_t2v_a14b_teacache_2gpu",
"wan2_2_t2v_a14b_lora_2gpu",
"wan2_1_t2v_14b_2gpu",
"wan2_1_t2v_1.3b_cfg_parallel",
"fsdp-inference",
"mova_360p_tp2",
"mova_360p_ring1_uly2",
"mova_360p_ring2_uly1",
"ltx_2_two_stage_t2v",
"wan2_1_i2v_14b_480P_2gpu",
"wan2_1_i2v_14b_lora_2gpu",
"wan2_1_i2v_14b_720P_2gpu",
"qwen_image_t2i_2_gpus",
"zimage_image_t2i_2_gpus",
"zimage_image_t2i_2_gpus_non_square",
"flux_image_t2i_2_gpus",
"flux_2_image_t2i_2_gpus",
"flux_2_klein_ti2i_2_gpus",
)
ACCURACY_ONE_GPU_CASES = _select_accuracy_cases(
ONE_GPU_CASES, ACCURACY_ONE_GPU_CASE_IDS
)
ACCURACY_TWO_GPU_CASES = _select_accuracy_cases(
TWO_GPU_CASES, ACCURACY_TWO_GPU_CASE_IDS
)
@@ -12,7 +12,6 @@ ONE_NPU_CASES: list[DiffusionTestCase] = [
"flux_image_t2i_npu",
DiffusionServerArgs(
model_path="/root/.cache/modelscope/hub/models/black-forest-labs/FLUX.1-dev",
modality="image",
),
T2I_sampling_params,
run_consistency_check=False,
@@ -22,8 +21,6 @@ ONE_NPU_CASES: list[DiffusionTestCase] = [
"wan2_1_t2v_1.3b_1_npu",
DiffusionServerArgs(
model_path="/root/.cache/modelscope/hub/models/Wan-AI/Wan2.1-T2V-1.3B-Diffusers",
modality="video",
custom_validator="video",
),
DiffusionSamplingParams(
prompt=T2V_PROMPT,
@@ -38,7 +35,6 @@ TWO_NPU_CASES: list[DiffusionTestCase] = [
"flux_2_image_t2i_2npu",
DiffusionServerArgs(
model_path="/root/.cache/modelscope/hub/models/black-forest-labs/FLUX.2-dev",
modality="image",
num_gpus=2,
tp_size=2,
),
@@ -49,7 +45,6 @@ TWO_NPU_CASES: list[DiffusionTestCase] = [
"qwen_image_t2i_2npu",
DiffusionServerArgs(
model_path="/root/.cache/modelscope/hub/models/Qwen/Qwen-Image",
modality="image",
num_gpus=2,
# test ring attn
ulysses_degree=1,
@@ -66,8 +61,6 @@ EIGHT_NPU_CASES: list[DiffusionTestCase] = [
"wan2_2_t2v_14b_w8a8_8npu",
DiffusionServerArgs(
model_path="/root/.cache/modelscope/hub/models/Eco-Tech/Wan2.2-T2V-A14B-Diffusers-w8a8",
modality="video",
custom_validator="video",
num_gpus=8,
tp_size=4,
),
@@ -1,37 +0,0 @@
import pytest
from sglang.multimodal_gen.test.server.accuracy_config import (
ComponentType,
get_skip_reason,
should_skip_component,
)
from sglang.multimodal_gen.test.server.accuracy_utils import (
run_native_component_accuracy_case,
run_text_encoder_accuracy_case,
)
from sglang.multimodal_gen.test.server.component_accuracy import AccuracyEngine
from sglang.multimodal_gen.test.server.testcase_configs import ACCURACY_TWO_GPU_CASES_A
@pytest.mark.parametrize("case", ACCURACY_TWO_GPU_CASES_A, ids=lambda x: x.id)
class TestAccuracy2GPU_A:
"""2-GPU Component Accuracy Suite (Set A)."""
def test_vae_accuracy(self, case):
if should_skip_component(case, ComponentType.VAE):
pytest.skip(get_skip_reason(case, ComponentType.VAE))
run_native_component_accuracy_case(
AccuracyEngine, case, ComponentType.VAE, "diffusers", 2
)
def test_transformer_accuracy(self, case):
if should_skip_component(case, ComponentType.TRANSFORMER):
pytest.skip(get_skip_reason(case, ComponentType.TRANSFORMER))
run_native_component_accuracy_case(
AccuracyEngine, case, ComponentType.TRANSFORMER, "diffusers", 2
)
def test_encoder_accuracy(self, case):
if should_skip_component(case, ComponentType.TEXT_ENCODER):
pytest.skip(get_skip_reason(case, ComponentType.TEXT_ENCODER))
run_text_encoder_accuracy_case(AccuracyEngine, case, 2)
@@ -1,37 +0,0 @@
import pytest
from sglang.multimodal_gen.test.server.accuracy_config import (
ComponentType,
get_skip_reason,
should_skip_component,
)
from sglang.multimodal_gen.test.server.accuracy_utils import (
run_native_component_accuracy_case,
run_text_encoder_accuracy_case,
)
from sglang.multimodal_gen.test.server.component_accuracy import AccuracyEngine
from sglang.multimodal_gen.test.server.testcase_configs import ACCURACY_TWO_GPU_CASES_B
@pytest.mark.parametrize("case", ACCURACY_TWO_GPU_CASES_B, ids=lambda x: x.id)
class TestAccuracy2GPU_B:
"""2-GPU Component Accuracy Suite (Set B)."""
def test_vae_accuracy(self, case):
if should_skip_component(case, ComponentType.VAE):
pytest.skip(get_skip_reason(case, ComponentType.VAE))
run_native_component_accuracy_case(
AccuracyEngine, case, ComponentType.VAE, "diffusers", 2
)
def test_transformer_accuracy(self, case):
if should_skip_component(case, ComponentType.TRANSFORMER):
pytest.skip(get_skip_reason(case, ComponentType.TRANSFORMER))
run_native_component_accuracy_case(
AccuracyEngine, case, ComponentType.TRANSFORMER, "diffusers", 2
)
def test_encoder_accuracy(self, case):
if should_skip_component(case, ComponentType.TEXT_ENCODER):
pytest.skip(get_skip_reason(case, ComponentType.TEXT_ENCODER))
run_text_encoder_accuracy_case(AccuracyEngine, case, 2)
@@ -5,33 +5,47 @@ from sglang.multimodal_gen.test.server.accuracy_config import (
get_skip_reason,
should_skip_component,
)
from sglang.multimodal_gen.test.server.accuracy_testcase_configs import (
ACCURACY_ONE_GPU_CASES,
)
from sglang.multimodal_gen.test.server.accuracy_utils import (
run_native_component_accuracy_case,
run_text_encoder_accuracy_case,
)
from sglang.multimodal_gen.test.server.component_accuracy import AccuracyEngine
from sglang.multimodal_gen.test.server.testcase_configs import ACCURACY_ONE_GPU_CASES_A
@pytest.mark.parametrize("case", ACCURACY_ONE_GPU_CASES_A, ids=lambda x: x.id)
class TestAccuracy1GPU_A:
"""1-GPU Component Accuracy Suite (Set A)."""
@pytest.mark.parametrize("case", ACCURACY_ONE_GPU_CASES, ids=lambda case: case.id)
class TestComponentAccuracy1GPU:
"""1-GPU component accuracy suite."""
def test_vae_accuracy(self, case):
if should_skip_component(case, ComponentType.VAE):
pytest.skip(get_skip_reason(case, ComponentType.VAE))
run_native_component_accuracy_case(
AccuracyEngine, case, ComponentType.VAE, "diffusers", 1
AccuracyEngine,
case,
ComponentType.VAE,
"diffusers",
case.server_args.num_gpus,
)
def test_transformer_accuracy(self, case):
if should_skip_component(case, ComponentType.TRANSFORMER):
pytest.skip(get_skip_reason(case, ComponentType.TRANSFORMER))
run_native_component_accuracy_case(
AccuracyEngine, case, ComponentType.TRANSFORMER, "diffusers", 1
AccuracyEngine,
case,
ComponentType.TRANSFORMER,
"diffusers",
case.server_args.num_gpus,
)
def test_encoder_accuracy(self, case):
if should_skip_component(case, ComponentType.TEXT_ENCODER):
pytest.skip(get_skip_reason(case, ComponentType.TEXT_ENCODER))
run_text_encoder_accuracy_case(AccuracyEngine, case, 1)
run_text_encoder_accuracy_case(
AccuracyEngine,
case,
case.server_args.num_gpus,
)
@@ -5,33 +5,47 @@ from sglang.multimodal_gen.test.server.accuracy_config import (
get_skip_reason,
should_skip_component,
)
from sglang.multimodal_gen.test.server.accuracy_testcase_configs import (
ACCURACY_TWO_GPU_CASES,
)
from sglang.multimodal_gen.test.server.accuracy_utils import (
run_native_component_accuracy_case,
run_text_encoder_accuracy_case,
)
from sglang.multimodal_gen.test.server.component_accuracy import AccuracyEngine
from sglang.multimodal_gen.test.server.testcase_configs import ACCURACY_ONE_GPU_CASES_B
@pytest.mark.parametrize("case", ACCURACY_ONE_GPU_CASES_B, ids=lambda x: x.id)
class TestAccuracy1GPU_B:
"""1-GPU Component Accuracy Suite (Set B)."""
@pytest.mark.parametrize("case", ACCURACY_TWO_GPU_CASES, ids=lambda case: case.id)
class TestComponentAccuracy2GPU:
"""2-GPU component accuracy suite."""
def test_vae_accuracy(self, case):
if should_skip_component(case, ComponentType.VAE):
pytest.skip(get_skip_reason(case, ComponentType.VAE))
run_native_component_accuracy_case(
AccuracyEngine, case, ComponentType.VAE, "diffusers", 1
AccuracyEngine,
case,
ComponentType.VAE,
"diffusers",
case.server_args.num_gpus,
)
def test_transformer_accuracy(self, case):
if should_skip_component(case, ComponentType.TRANSFORMER):
pytest.skip(get_skip_reason(case, ComponentType.TRANSFORMER))
run_native_component_accuracy_case(
AccuracyEngine, case, ComponentType.TRANSFORMER, "diffusers", 1
AccuracyEngine,
case,
ComponentType.TRANSFORMER,
"diffusers",
case.server_args.num_gpus,
)
def test_encoder_accuracy(self, case):
if should_skip_component(case, ComponentType.TEXT_ENCODER):
pytest.skip(get_skip_reason(case, ComponentType.TEXT_ENCODER))
run_text_encoder_accuracy_case(AccuracyEngine, case, 1)
run_text_encoder_accuracy_case(
AccuracyEngine,
case,
case.server_args.num_gpus,
)
@@ -15,7 +15,7 @@ from sglang.multimodal_gen.test.server.test_server_common import ( # noqa: F401
diffusion_server,
)
from sglang.multimodal_gen.test.server.testcase_configs import (
ONE_GPU_CASES_A,
ONE_GPU_CASES,
DiffusionTestCase,
)
@@ -25,7 +25,7 @@ logger = init_logger(__name__)
class TestDiffusionServerOneGpu(DiffusionServerBase):
"""Performance tests for 1-GPU diffusion cases."""
@pytest.fixture(params=ONE_GPU_CASES_A, ids=lambda c: c.id)
@pytest.fixture(params=ONE_GPU_CASES, ids=lambda c: c.id)
def case(self, request) -> DiffusionTestCase:
"""Provide a DiffusionTestCase for each 1-GPU test."""
return request.param
@@ -11,7 +11,7 @@ from sglang.multimodal_gen.test.server.test_server_common import ( # noqa: F401
diffusion_server,
)
from sglang.multimodal_gen.test.server.testcase_configs import (
TWO_GPU_CASES_A,
TWO_GPU_CASES,
DiffusionTestCase,
)
@@ -19,7 +19,7 @@ from sglang.multimodal_gen.test.server.testcase_configs import (
class TestDiffusionServerTwoGpu(DiffusionServerBase):
"""Performance tests for 2-GPU diffusion cases."""
@pytest.fixture(params=TWO_GPU_CASES_A, ids=lambda c: c.id)
@pytest.fixture(params=TWO_GPU_CASES, ids=lambda c: c.id)
def case(self, request) -> DiffusionTestCase:
"""Provide a DiffusionTestCase for each 2-GPU test."""
return request.param
@@ -1,25 +0,0 @@
"""
2 GPU tests
"""
from __future__ import annotations
import pytest
from sglang.multimodal_gen.test.server.test_server_common import ( # noqa: F401
DiffusionServerBase,
diffusion_server,
)
from sglang.multimodal_gen.test.server.testcase_configs import (
TWO_GPU_CASES_B,
DiffusionTestCase,
)
class TestDiffusionServerTwoGpu(DiffusionServerBase):
"""Performance tests for 2-GPU diffusion cases."""
@pytest.fixture(params=TWO_GPU_CASES_B, ids=lambda c: c.id)
def case(self, request) -> DiffusionTestCase:
"""Provide a DiffusionTestCase for each 2-GPU test."""
return request.param
@@ -1,31 +0,0 @@
"""
Config-driven diffusion performance test with pytest parametrization.
If the actual run is significantly better than the baseline, the improved cases with their updated baseline will be printed
"""
from __future__ import annotations
import pytest
from sglang.multimodal_gen.runtime.utils.logging_utils import init_logger
from sglang.multimodal_gen.test.server.test_server_common import ( # noqa: F401
DiffusionServerBase,
diffusion_server,
)
from sglang.multimodal_gen.test.server.testcase_configs import (
ONE_GPU_CASES_B,
DiffusionTestCase,
)
logger = init_logger(__name__)
class TestDiffusionServerOneGpu(DiffusionServerBase):
"""Performance tests for 1-GPU diffusion cases."""
@pytest.fixture(params=ONE_GPU_CASES_B, ids=lambda c: c.id)
def case(self, request) -> DiffusionTestCase:
"""Provide a DiffusionTestCase for each 1-GPU test."""
return request.param
@@ -1090,46 +1090,91 @@ Repository: https://github.com/sglang-bot/sglang-ci-data (path: diffusion-ci/con
self._save_gt_output(case, content)
return
# Validation 1: Performance
self._validate_and_record(case, perf_record)
failures: list[tuple[str, str]] = []
def run_case_check(name: str, fn: Callable[[], None]) -> None:
try:
fn()
except BaseException as exc:
if isinstance(exc, (KeyboardInterrupt, SystemExit)):
raise
failures.append((name, str(exc)))
run_case_check(
"performance",
lambda: self._validate_and_record(case, perf_record),
)
# Mesh correctness check (Chamfer Distance) for 3D models
if case.server_args.custom_validator == "mesh":
from sglang.multimodal_gen.test.server.test_server_utils import (
MESH_OUTPUT_PATHS,
validate_mesh_correctness,
)
mesh_path = MESH_OUTPUT_PATHS.pop(case.id, None)
if mesh_path:
validate_mesh_correctness(mesh_path)
def validate_mesh_output() -> None:
mesh_path = MESH_OUTPUT_PATHS.pop(case.id, None)
if mesh_path:
validate_mesh_correctness(mesh_path)
run_case_check("mesh correctness", validate_mesh_output)
# Test /v1/models endpoint for router compatibility
if case.run_models_api_check:
self._test_v1_models_endpoint(diffusion_server, case)
run_case_check(
"/v1/models endpoint",
lambda: self._test_v1_models_endpoint(diffusion_server, case),
)
if case.run_t2v_input_reference_check:
self._test_t2v_rejects_input_reference(diffusion_server, case)
run_case_check(
"t2v input_reference rejection",
lambda: self._test_t2v_rejects_input_reference(diffusion_server, case),
)
if case.run_consistency_check:
self._validate_consistency(case, content)
run_case_check(
"consistency",
lambda: self._validate_consistency(case, content),
)
# LoRA API functionality test with E2E validation (only for LoRA-enabled cases)
if case.run_lora_basic_api_check:
self._test_lora_api_functionality(diffusion_server, case, generate_fn)
run_case_check(
"LoRA basic API",
lambda: self._test_lora_api_functionality(
diffusion_server, case, generate_fn
),
)
if case.run_lora_dynamic_switch_check:
self._test_lora_dynamic_switch_e2e(
diffusion_server,
case,
generate_fn,
case.server_args.second_lora_path,
run_case_check(
"LoRA dynamic switch",
lambda: self._test_lora_dynamic_switch_e2e(
diffusion_server,
case,
generate_fn,
case.server_args.second_lora_path,
),
)
if case.run_multi_lora_api_check:
self._test_multi_lora_e2e(
diffusion_server,
case,
generate_fn,
case.server_args.lora_path,
case.server_args.second_lora_path,
run_case_check(
"multi-LoRA API",
lambda: self._test_multi_lora_e2e(
diffusion_server,
case,
generate_fn,
case.server_args.lora_path,
case.server_args.second_lora_path,
),
)
if failures:
formatted_failures = []
for name, message in failures:
if "\n" in message:
formatted_failures.append(f"[{name}]\n{message}")
else:
formatted_failures.append(f"[{name}] {message}")
pytest.fail(
f"Diffusion testcase '{case.id}' failed {len(failures)} check(s):\n\n"
+ "\n\n".join(formatted_failures),
pytrace=False,
)
@@ -3,10 +3,10 @@ Configuration and data structures for diffusion performance tests.
Usage:
pytest python/sglang/multimodal_gen/test/server/test_server_a.py
# for a single testcase, look for the name of the testcase in ONE_GPU_CASES_A,
# ONE_GPU_CASES_B, ONE_GPU_CASES_C, TWO_GPU_CASES_A, or TWO_GPU_CASES_B
pytest python/sglang/multimodal_gen/test/server/test_server_a.py -k qwen_image_t2i
pytest python/sglang/multimodal_gen/test/server/test_server_1_gpu.py
# for a single testcase, look for the name of the testcase in ONE_GPU_CASES,
# ONE_GPU_CASES_C, or TWO_GPU_CASES
pytest python/sglang/multimodal_gen/test/server/test_server_1_gpu.py -k qwen_image_t2i
To add a new testcase:
@@ -22,10 +22,13 @@ from __future__ import annotations
import json
import os
import statistics
from dataclasses import dataclass, field
from dataclasses import dataclass, field, replace
from functools import lru_cache
from pathlib import Path
from typing import Sequence
from sglang.multimodal_gen.configs.pipeline_configs.base import ModelTaskType
from sglang.multimodal_gen.registry import get_model_info
from sglang.multimodal_gen.runtime.platforms import current_platform
from sglang.multimodal_gen.runtime.utils.perf_logger import RequestPerfRecord
from sglang.multimodal_gen.test.test_utils import (
@@ -179,9 +182,9 @@ class DiffusionServerArgs:
"""Configuration for a single model/scenario test case."""
model_path: str # HF repo or local path
modality: str = "image" # "image" or "video" or "3d"
modality: str | None = None # auto-inferred: "image" or "video" or "3d"
custom_validator: str | None = None # optional custom validator name
custom_validator: str | None = None # auto-derived unless explicitly overridden
# resources
num_gpus: int = 1
tp_size: int | None = None
@@ -208,6 +211,12 @@ class DiffusionServerArgs:
extras: list[str] = field(default_factory=lambda: [])
def __post_init__(self):
if self.modality is None:
self.modality = _infer_modality_from_model_path(self.model_path)
if self.custom_validator is not None:
return
if self.modality == "image":
self.custom_validator = "image"
elif self.modality == "video":
@@ -216,6 +225,20 @@ class DiffusionServerArgs:
self.custom_validator = "mesh"
@lru_cache(maxsize=None)
def _infer_modality_from_model_path(model_path: str) -> str:
model_info = get_model_info(model_path)
if model_info is None:
raise ValueError(f"Could not resolve model info for {model_path!r}")
task_type = model_info.pipeline_config_cls.task_type
if task_type == ModelTaskType.I2M:
return "3d"
if task_type.is_image_gen():
return "image"
return "video"
@dataclass(frozen=True)
class DiffusionSamplingParams:
"""Configuration for a single model/scenario test case."""
@@ -416,7 +439,6 @@ ONE_GPU_CASES_A: list[DiffusionTestCase] = [
"qwen_image_t2i",
DiffusionServerArgs(
model_path=DEFAULT_QWEN_IMAGE_MODEL_NAME_FOR_TEST,
modality="image",
),
T2I_sampling_params,
),
@@ -424,16 +446,13 @@ ONE_GPU_CASES_A: list[DiffusionTestCase] = [
"qwen_image_t2i_cache_dit_enabled",
DiffusionServerArgs(
model_path=DEFAULT_QWEN_IMAGE_MODEL_NAME_FOR_TEST,
modality="image",
enable_cache_dit=True,
),
T2I_sampling_params,
),
DiffusionTestCase(
"flux_image_t2i",
DiffusionServerArgs(
model_path=DEFAULT_FLUX_1_DEV_MODEL_NAME_FOR_TEST, modality="image"
),
DiffusionServerArgs(model_path=DEFAULT_FLUX_1_DEV_MODEL_NAME_FOR_TEST),
T2I_sampling_params,
),
# TODO: modeling of flux different from official flux, so weights can't be loaded
@@ -441,23 +460,20 @@ ONE_GPU_CASES_A: list[DiffusionTestCase] = [
# DiffusionTestCase(
# "flux_image_t2i_override_transformer_weights_path_fp8",
# DiffusionServerArgs(
# model_path="black-forest-labs/FLUX.1-dev", modality="image",
# model_path="black-forest-labs/FLUX.1-dev",
# extras=["--transformer-weights-path black-forest-labs/FLUX.1-dev-FP8"]
# ),
# T2I_sampling_params,
# ),
DiffusionTestCase(
"flux_2_image_t2i",
DiffusionServerArgs(
model_path=DEFAULT_FLUX_2_DEV_MODEL_NAME_FOR_TEST, modality="image"
),
DiffusionServerArgs(model_path=DEFAULT_FLUX_2_DEV_MODEL_NAME_FOR_TEST),
T2I_sampling_params,
),
DiffusionTestCase(
"flux_2_klein_image_t2i",
DiffusionServerArgs(
model_path=DEFAULT_FLUX_2_KLEIN_4B_MODEL_NAME_FOR_TEST,
modality="image",
),
T2I_sampling_params,
),
@@ -468,7 +484,6 @@ ONE_GPU_CASES_A: list[DiffusionTestCase] = [
"layerwise_offload",
DiffusionServerArgs(
model_path=DEFAULT_SMALL_MODEL_NAME_FOR_TEST,
modality="image",
dit_layerwise_offload=True,
dit_offload_prefetch_size=2,
),
@@ -476,16 +491,13 @@ ONE_GPU_CASES_A: list[DiffusionTestCase] = [
),
DiffusionTestCase(
"zimage_image_t2i",
DiffusionServerArgs(
model_path=DEFAULT_SMALL_MODEL_NAME_FOR_TEST, modality="image"
),
DiffusionServerArgs(model_path=DEFAULT_SMALL_MODEL_NAME_FOR_TEST),
T2I_sampling_params,
),
DiffusionTestCase(
"zimage_image_t2i_fp8",
DiffusionServerArgs(
model_path=DEFAULT_SMALL_MODEL_NAME_FOR_TEST,
modality="image",
extras=["--transformer-path MickJ/Z-Image-Turbo-fp8"],
),
T2I_sampling_params,
@@ -495,7 +507,6 @@ ONE_GPU_CASES_A: list[DiffusionTestCase] = [
"zimage_image_t2i_multi_lora",
DiffusionServerArgs(
model_path=DEFAULT_SMALL_MODEL_NAME_FOR_TEST,
modality="image",
lora_path="reverentelusarca/elusarca-anime-style-lora-z-image-turbo",
second_lora_path="tarn59/pixel_art_style_lora_z_image_turbo",
),
@@ -507,16 +518,13 @@ ONE_GPU_CASES_A: list[DiffusionTestCase] = [
# === Text and Image to Image (TI2I) ===
DiffusionTestCase(
"qwen_image_edit_ti2i",
DiffusionServerArgs(
model_path=DEFAULT_QWEN_IMAGE_EDIT_MODEL_NAME_FOR_TEST, modality="image"
),
DiffusionServerArgs(model_path=DEFAULT_QWEN_IMAGE_EDIT_MODEL_NAME_FOR_TEST),
TI2I_sampling_params,
),
DiffusionTestCase(
"qwen_image_edit_2509_ti2i",
DiffusionServerArgs(
model_path=DEFAULT_QWEN_IMAGE_EDIT_2509_MODEL_NAME_FOR_TEST,
modality="image",
),
MULTI_IMAGE_TI2I_sampling_params,
),
@@ -524,7 +532,6 @@ ONE_GPU_CASES_A: list[DiffusionTestCase] = [
"qwen_image_edit_2511_ti2i",
DiffusionServerArgs(
model_path=DEFAULT_QWEN_IMAGE_EDIT_2511_MODEL_NAME_FOR_TEST,
modality="image",
),
TI2I_sampling_params,
),
@@ -532,7 +539,6 @@ ONE_GPU_CASES_A: list[DiffusionTestCase] = [
"qwen_image_layered_i2i",
DiffusionServerArgs(
model_path=DEFAULT_QWEN_IMAGE_LAYERED_MODEL_NAME_FOR_TEST,
modality="image",
),
MULTI_FRAME_I2I_sampling_params,
),
@@ -541,7 +547,6 @@ ONE_GPU_CASES_A: list[DiffusionTestCase] = [
"flux_2_image_t2i_upscaling_4x",
DiffusionServerArgs(
model_path="black-forest-labs/FLUX.2-dev",
modality="image",
),
DiffusionSamplingParams(
prompt="Doraemon is eating dorayaki",
@@ -562,8 +567,6 @@ ONE_GPU_CASES_B: list[DiffusionTestCase] = [
"wan2_1_t2v_1.3b",
DiffusionServerArgs(
model_path=DEFAULT_WAN_2_1_T2V_1_3B_MODEL_NAME_FOR_TEST,
modality="video",
custom_validator="video",
),
T2V_sampling_params,
),
@@ -571,8 +574,6 @@ ONE_GPU_CASES_B: list[DiffusionTestCase] = [
"wan2_1_t2v_1.3b_text_encoder_cpu_offload",
DiffusionServerArgs(
model_path=DEFAULT_WAN_2_1_T2V_1_3B_MODEL_NAME_FOR_TEST,
modality="video",
custom_validator="video",
text_encoder_cpu_offload=True,
),
T2V_sampling_params,
@@ -582,8 +583,6 @@ ONE_GPU_CASES_B: list[DiffusionTestCase] = [
"wan2_1_t2v_1.3b_teacache_enabled",
DiffusionServerArgs(
model_path=DEFAULT_WAN_2_1_T2V_1_3B_MODEL_NAME_FOR_TEST,
modality="video",
custom_validator="video",
),
DiffusionSamplingParams(
prompt=T2V_PROMPT,
@@ -596,8 +595,6 @@ ONE_GPU_CASES_B: list[DiffusionTestCase] = [
"wan2_1_t2v_1.3b_frame_interp_2x",
DiffusionServerArgs(
model_path="Wan-AI/Wan2.1-T2V-1.3B-Diffusers",
modality="video",
custom_validator="video",
),
DiffusionSamplingParams(
prompt=T2V_PROMPT,
@@ -610,8 +607,6 @@ ONE_GPU_CASES_B: list[DiffusionTestCase] = [
"wan2_1_t2v_1.3b_upscaling_4x",
DiffusionServerArgs(
model_path="Wan-AI/Wan2.1-T2V-1.3B-Diffusers",
modality="video",
custom_validator="video",
),
DiffusionSamplingParams(
prompt=T2V_PROMPT,
@@ -624,8 +619,6 @@ ONE_GPU_CASES_B: list[DiffusionTestCase] = [
"wan2_1_t2v_1.3b_frame_interp_2x_upscaling_4x",
DiffusionServerArgs(
model_path="Wan-AI/Wan2.1-T2V-1.3B-Diffusers",
modality="video",
custom_validator="video",
),
DiffusionSamplingParams(
prompt=T2V_PROMPT,
@@ -644,8 +637,6 @@ ONE_GPU_CASES_B: list[DiffusionTestCase] = [
"wan2_1_t2v_1_3b_lora_1gpu",
DiffusionServerArgs(
model_path=DEFAULT_WAN_2_1_T2V_1_3B_MODEL_NAME_FOR_TEST,
modality="video",
custom_validator="video",
num_gpus=1,
dynamic_lora_path="Cseti/Wan-LoRA-Arcane-Jinx-v1",
),
@@ -660,7 +651,6 @@ ONE_GPU_CASES_B: list[DiffusionTestCase] = [
# "hunyuan_video",
# DiffusionServerArgs(
# model_path="hunyuanvideo-community/HunyuanVideo",
# modality="video",
# ),
# DiffusionSamplingParams(
# prompt=T2V_PROMPT,
@@ -668,16 +658,13 @@ ONE_GPU_CASES_B: list[DiffusionTestCase] = [
# ),
DiffusionTestCase(
"flux_2_ti2i",
DiffusionServerArgs(
model_path=DEFAULT_FLUX_2_DEV_MODEL_NAME_FOR_TEST, modality="image"
),
DiffusionServerArgs(model_path=DEFAULT_FLUX_2_DEV_MODEL_NAME_FOR_TEST),
TI2I_sampling_params,
),
DiffusionTestCase(
"flux_2_t2i_customized_vae_path",
DiffusionServerArgs(
model_path=DEFAULT_FLUX_2_DEV_MODEL_NAME_FOR_TEST,
modality="image",
extras=["--vae-path=fal/FLUX.2-Tiny-AutoEncoder"],
),
T2I_sampling_params,
@@ -687,8 +674,6 @@ ONE_GPU_CASES_B: list[DiffusionTestCase] = [
"fast_hunyuan_video",
DiffusionServerArgs(
model_path="FastVideo/FastHunyuan-diffusers",
modality="video",
custom_validator="video",
),
T2V_sampling_params,
),
@@ -697,8 +682,6 @@ ONE_GPU_CASES_B: list[DiffusionTestCase] = [
"wan2_2_ti2v_5b",
DiffusionServerArgs(
model_path=DEFAULT_WAN_2_2_TI2V_5B_MODEL_NAME_FOR_TEST,
modality="video",
custom_validator="video",
),
TI2V_sampling_params,
),
@@ -706,8 +689,6 @@ ONE_GPU_CASES_B: list[DiffusionTestCase] = [
"fastwan2_2_ti2v_5b",
DiffusionServerArgs(
model_path="FastVideo/FastWan2.2-TI2V-5B-FullAttn-Diffusers",
modality="video",
custom_validator="video",
),
TI2V_sampling_params,
),
@@ -717,7 +698,6 @@ ONE_GPU_CASES_B: list[DiffusionTestCase] = [
# "helios_base_t2v",
# DiffusionServerArgs(
# model_path="BestWishYsh/Helios-Base",
# modality="video",
# ),
# DiffusionSamplingParams(
# prompt=T2V_PROMPT,
@@ -729,7 +709,6 @@ ONE_GPU_CASES_B: list[DiffusionTestCase] = [
# "helios_mid_t2v",
# DiffusionServerArgs(
# model_path="BestWishYsh/Helios-Mid",
# modality="video",
# ),
# DiffusionSamplingParams(
# prompt=T2V_PROMPT,
@@ -741,7 +720,6 @@ ONE_GPU_CASES_B: list[DiffusionTestCase] = [
# "helios_distilled_t2v",
# DiffusionServerArgs(
# model_path="BestWishYsh/Helios-Distilled",
# modality="video",
# ),
# DiffusionSamplingParams(
# prompt=T2V_PROMPT,
@@ -758,7 +736,6 @@ if not current_platform.is_hip():
"hunyuan3d_shape_gen",
DiffusionServerArgs(
model_path="tencent/Hunyuan3D-2",
modality="3d",
enable_warmup=False,
),
HUNYUAN3D_SHAPE_sampling_params,
@@ -772,8 +749,6 @@ if not current_platform.is_hip():
"turbo_wan2_1_t2v_1.3b",
DiffusionServerArgs(
model_path="IPostYellow/TurboWan2.1-T2V-1.3B-Diffusers",
modality="video",
custom_validator="video",
),
T2V_sampling_params,
)
@@ -785,7 +760,6 @@ ONE_GPU_CASES_C = [
"flux_2_nvfp4_t2i",
DiffusionServerArgs(
model_path="black-forest-labs/FLUX.2-dev-NVFP4",
modality="image",
),
T2I_sampling_params,
)
@@ -796,8 +770,6 @@ TWO_GPU_CASES_A = [
"wan2_2_i2v_a14b_2gpu",
DiffusionServerArgs(
model_path=DEFAULT_WAN_2_2_I2V_A14B_MODEL_NAME_FOR_TEST,
modality="video",
custom_validator="video",
),
TI2V_sampling_params,
),
@@ -805,9 +777,6 @@ TWO_GPU_CASES_A = [
"wan2_2_t2v_a14b_2gpu",
DiffusionServerArgs(
model_path=DEFAULT_WAN_2_2_T2V_A14B_MODEL_NAME_FOR_TEST,
modality="video",
custom_validator="video",
num_gpus=2,
extras=["--ulysses-degree=2"],
),
T2V_sampling_params,
@@ -819,9 +788,6 @@ TWO_GPU_CASES_A = [
"wan2_2_t2v_a14b_teacache_2gpu",
DiffusionServerArgs(
model_path=DEFAULT_WAN_2_2_T2V_A14B_MODEL_NAME_FOR_TEST,
modality="video",
custom_validator="video",
num_gpus=2,
extras=["--ulysses-degree=2"],
),
DiffusionSamplingParams(
@@ -835,9 +801,6 @@ TWO_GPU_CASES_A = [
"wan2_2_t2v_a14b_lora_2gpu",
DiffusionServerArgs(
model_path=DEFAULT_WAN_2_2_T2V_A14B_MODEL_NAME_FOR_TEST,
modality="video",
custom_validator="video",
num_gpus=2,
lora_path="Cseti/wan2.2-14B-Arcane_Jinx-lora-v1",
extras=[
"--lora-weight-name",
@@ -853,9 +816,6 @@ TWO_GPU_CASES_A = [
"wan2_1_t2v_14b_2gpu",
DiffusionServerArgs(
model_path=DEFAULT_WAN_2_1_T2V_14B_MODEL_NAME_FOR_TEST,
modality="video",
num_gpus=2,
custom_validator="video",
),
DiffusionSamplingParams(
prompt=T2V_PROMPT,
@@ -866,9 +826,6 @@ TWO_GPU_CASES_A = [
"wan2_1_t2v_1.3b_cfg_parallel",
DiffusionServerArgs(
model_path=DEFAULT_WAN_2_1_T2V_1_3B_MODEL_NAME_FOR_TEST,
modality="video",
custom_validator="video",
num_gpus=2,
cfg_parallel=True,
),
T2V_sampling_params,
@@ -877,8 +834,6 @@ TWO_GPU_CASES_A = [
"fsdp-inference",
DiffusionServerArgs(
model_path=DEFAULT_SMALL_MODEL_NAME_FOR_TEST,
modality="image",
num_gpus=2,
extras=["--use-fsdp-inference"],
),
T2I_sampling_params,
@@ -887,8 +842,6 @@ TWO_GPU_CASES_A = [
"mova_360p_tp2",
DiffusionServerArgs(
model_path=DEFAULT_MOVA_360P_MODEL_NAME_FOR_TEST,
modality="video",
num_gpus=2,
tp_size=2,
dit_layerwise_offload=True,
),
@@ -899,8 +852,6 @@ TWO_GPU_CASES_A = [
"mova_360p_ring1_uly2",
DiffusionServerArgs(
model_path=DEFAULT_MOVA_360P_MODEL_NAME_FOR_TEST,
modality="video",
num_gpus=2,
ring_degree=1,
ulysses_degree=2,
dit_layerwise_offload=True,
@@ -912,9 +863,9 @@ TWO_GPU_CASES_A = [
"ltx_2_two_stage_t2v",
DiffusionServerArgs(
model_path="Lightricks/LTX-2",
modality="video",
num_gpus=2,
extras=["--pipeline-class-name LTX2TwoStagePipeline", "--ulysses-degree=2"],
ulysses_degree=2,
dit_layerwise_offload=True,
extras=["--pipeline-class-name LTX2TwoStagePipeline"],
),
T2V_sampling_params,
),
@@ -922,8 +873,6 @@ TWO_GPU_CASES_A = [
"ltx_2_3_two_stage_ti2v_2gpus",
DiffusionServerArgs(
model_path="Lightricks/LTX-2.3",
modality="video",
num_gpus=2,
extras=["--pipeline-class-name LTX2TwoStagePipeline"],
),
TI2V_sampling_params,
@@ -935,9 +884,6 @@ TWO_GPU_CASES_B = [
"wan2_1_i2v_14b_480P_2gpu",
DiffusionServerArgs(
model_path=DEFAULT_WAN_2_1_I2V_14B_480P_MODEL_NAME_FOR_TEST,
modality="video",
custom_validator="video",
num_gpus=2,
extras=["--ulysses-degree=2"],
),
TI2V_sampling_params,
@@ -946,8 +892,6 @@ TWO_GPU_CASES_B = [
"ltx_2.3_two_stage_t2v_2gpus",
DiffusionServerArgs(
model_path="Lightricks/LTX-2.3",
modality="video",
num_gpus=2,
extras=["--pipeline-class-name LTX2TwoStagePipeline"],
),
T2V_sampling_params,
@@ -957,9 +901,6 @@ TWO_GPU_CASES_B = [
"wan2_1_i2v_14b_lora_2gpu",
DiffusionServerArgs(
model_path=DEFAULT_WAN_2_1_I2V_14B_720P_MODEL_NAME_FOR_TEST,
modality="video",
custom_validator="video",
num_gpus=2,
lora_path="starsfriday/Wan2.1-Divine-Power-LoRA",
extras=["--ulysses-degree=2"],
),
@@ -970,9 +911,6 @@ TWO_GPU_CASES_B = [
"wan2_1_i2v_14b_720P_2gpu",
DiffusionServerArgs(
model_path=DEFAULT_WAN_2_1_I2V_14B_720P_MODEL_NAME_FOR_TEST,
modality="video",
custom_validator="video",
num_gpus=2,
extras=["--ulysses-degree=2"],
),
TI2V_sampling_params,
@@ -981,8 +919,6 @@ TWO_GPU_CASES_B = [
"qwen_image_t2i_2_gpus",
DiffusionServerArgs(
model_path=DEFAULT_QWEN_IMAGE_MODEL_NAME_FOR_TEST,
modality="image",
num_gpus=2,
# test ring attn
ulysses_degree=1,
ring_degree=2,
@@ -993,8 +929,6 @@ TWO_GPU_CASES_B = [
"zimage_image_t2i_2_gpus",
DiffusionServerArgs(
model_path=DEFAULT_SMALL_MODEL_NAME_FOR_TEST,
modality="image",
num_gpus=2,
ulysses_degree=2,
),
T2I_sampling_params,
@@ -1003,8 +937,6 @@ TWO_GPU_CASES_B = [
"zimage_image_t2i_2_gpus_non_square",
DiffusionServerArgs(
model_path=DEFAULT_SMALL_MODEL_NAME_FOR_TEST,
modality="image",
num_gpus=2,
ulysses_degree=2,
),
DiffusionSamplingParams(
@@ -1017,8 +949,6 @@ TWO_GPU_CASES_B = [
"flux_image_t2i_2_gpus",
DiffusionServerArgs(
model_path=DEFAULT_FLUX_1_DEV_MODEL_NAME_FOR_TEST,
modality="image",
num_gpus=2,
),
T2I_sampling_params,
),
@@ -1026,8 +956,6 @@ TWO_GPU_CASES_B = [
"flux_2_image_t2i_2_gpus",
DiffusionServerArgs(
model_path=DEFAULT_FLUX_2_DEV_MODEL_NAME_FOR_TEST,
modality="image",
num_gpus=2,
tp_size=2,
),
T2I_sampling_params,
@@ -1036,8 +964,6 @@ TWO_GPU_CASES_B = [
"flux_2_klein_ti2i_2_gpus",
DiffusionServerArgs(
model_path="black-forest-labs/FLUX.2-klein-4B",
modality="image",
num_gpus=2,
),
TI2I_sampling_params,
),
@@ -1045,8 +971,6 @@ TWO_GPU_CASES_B = [
"ltx_2.3_one_stage_ti2v",
DiffusionServerArgs(
model_path="Lightricks/LTX-2.3",
modality="video",
num_gpus=2,
),
TI2V_sampling_params,
),
@@ -1059,7 +983,6 @@ if not current_platform.is_hip():
"flux_2_ti2i_multi_image_cache_dit",
DiffusionServerArgs(
model_path="black-forest-labs/FLUX.2-dev",
modality="image",
enable_cache_dit=True,
),
MULTI_IMAGE_TI2I_UPLOAD_sampling_params,
@@ -1067,86 +990,19 @@ if not current_platform.is_hip():
)
def _select_accuracy_cases(
cases: list[DiffusionTestCase], enabled_ids: tuple[str, ...]
def _with_default_num_gpus(
cases: list[DiffusionTestCase], num_gpus: int
) -> list[DiffusionTestCase]:
enabled = set(enabled_ids)
return [case for case in cases if case.id in enabled]
return [
replace(case, server_args=replace(case.server_args, num_gpus=num_gpus))
for case in cases
]
ACCURACY_ONE_GPU_CASES_A_IDS = (
"qwen_image_t2i",
"qwen_image_t2i_cache_dit_enabled",
"flux_image_t2i",
"flux_2_image_t2i",
"flux_2_klein_image_t2i",
"layerwise_offload",
"zimage_image_t2i",
"zimage_image_t2i_fp8",
"zimage_image_t2i_multi_lora",
"qwen_image_edit_ti2i",
"qwen_image_edit_2509_ti2i",
"qwen_image_edit_2511_ti2i",
"qwen_image_layered_i2i",
"flux_2_image_t2i_upscaling_4x",
)
ACCURACY_ONE_GPU_CASES_B_IDS = (
"wan2_1_t2v_1.3b",
"wan2_1_t2v_1.3b_text_encoder_cpu_offload",
"wan2_1_t2v_1.3b_teacache_enabled",
"wan2_1_t2v_1.3b_frame_interp_2x",
"wan2_1_t2v_1.3b_upscaling_4x",
"wan2_1_t2v_1.3b_frame_interp_2x_upscaling_4x",
"wan2_1_t2v_1_3b_lora_1gpu",
"flux_2_ti2i",
"flux_2_t2i_customized_vae_path",
"fast_hunyuan_video",
"wan2_2_ti2v_5b",
"fastwan2_2_ti2v_5b",
"hunyuan3d_shape_gen",
"turbo_wan2_1_t2v_1.3b",
"flux_2_nvfp4_t2i",
"flux_2_ti2i_multi_image_cache_dit",
)
ACCURACY_TWO_GPU_CASES_A_IDS = (
"wan2_2_i2v_a14b_2gpu",
"wan2_2_t2v_a14b_2gpu",
"wan2_2_t2v_a14b_teacache_2gpu",
"wan2_2_t2v_a14b_lora_2gpu",
"wan2_1_t2v_14b_2gpu",
"wan2_1_t2v_1.3b_cfg_parallel",
"fsdp-inference",
"mova_360p_tp2",
"mova_360p_ring1_uly2",
"ltx_2_two_stage_t2v",
)
ACCURACY_TWO_GPU_CASES_B_IDS = (
"wan2_1_i2v_14b_480P_2gpu",
"wan2_1_i2v_14b_lora_2gpu",
"wan2_1_i2v_14b_720P_2gpu",
"qwen_image_t2i_2_gpus",
"zimage_image_t2i_2_gpus",
"zimage_image_t2i_2_gpus_non_square",
"flux_image_t2i_2_gpus",
"flux_2_image_t2i_2_gpus",
"flux_2_klein_ti2i_2_gpus",
)
ACCURACY_ONE_GPU_CASES_A = _select_accuracy_cases(
ONE_GPU_CASES_A, ACCURACY_ONE_GPU_CASES_A_IDS
)
ACCURACY_ONE_GPU_CASES_B = _select_accuracy_cases(
ONE_GPU_CASES_B, ACCURACY_ONE_GPU_CASES_B_IDS
)
ACCURACY_TWO_GPU_CASES_A = _select_accuracy_cases(
TWO_GPU_CASES_A, ACCURACY_TWO_GPU_CASES_A_IDS
)
ACCURACY_TWO_GPU_CASES_B = _select_accuracy_cases(
TWO_GPU_CASES_B, ACCURACY_TWO_GPU_CASES_B_IDS
)
ONE_GPU_CASES = [*ONE_GPU_CASES_A, *ONE_GPU_CASES_B, *ONE_GPU_CASES_C]
TWO_GPU_CASES_A = _with_default_num_gpus(TWO_GPU_CASES_A, 2)
TWO_GPU_CASES_B = _with_default_num_gpus(TWO_GPU_CASES_B, 2)
TWO_GPU_CASES = [*TWO_GPU_CASES_A, *TWO_GPU_CASES_B]
# Load global configuration
BASELINE_CONFIG = BaselineConfig.load(
@@ -1129,7 +1129,7 @@ def compare_with_gt(
status = "PASSED" if passed else "FAILED"
print(f"\n{'=' * 60}")
print(f"[CLIP Consistency] {case_id}: {status}")
print(f"[Consistency Check] {case_id}: {status}")
print(
" Thresholds: "
f"clip>={thresholds.clip_threshold}, "