Files
vllm-omni/tests/e2e/online_serving/test_wan22_expansion.py
T

180 lines
5.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Comprehensive tests of diffusion features that are available in online serving mode.
CUDA coverage (3 models × 6 features):
- Wan-AI/Wan2.2-T2V-A14B-Diffusers
- Wan-AI/Wan2.2-I2V-A14B-Diffusers
- Wan-AI/Wan2.2-TI2V-5B-Diffusers
Features: Cache-DiT, CFG-Parallel, Ulysses-SP, Tensor-Parallel + VAE-Patch-Parallel,
HSDP, Ring-Attn.
NPU coverage (Wan-AI/Wan2.2-I2V-A14B-Diffusers only): 2 cases.
- 4-card combined: cfg=2 + usp=2 + vae-patch=2 + hsdp.
- 2-card tp_layerwise: tp=2 + enable-layerwise-offload.
assert_diffusion_response validates successful generation
"""
import pytest
from tests.helpers.mark import hardware_marks
from tests.helpers.media import generate_synthetic_image
from tests.helpers.runtime import OmniServer, OmniServerParams, OpenAIClientHandler
pytestmark = [pytest.mark.diffusion, pytest.mark.full_model]
PROMPT = "Two anthropomorphic cats in comfy boxing gear and bright gloves fight intensely on a spotlighted stage."
NEGATIVE_PROMPT = "low quality, blurry, distorted face, extra limbs, bad anatomy, watermark, logo, text, ugly, deformed, mutated, jpeg artifacts"
# CUDA marks (original matrix, unchanged)
CUDA_SINGLE_CARD_MARKS = hardware_marks(res={"cuda": "H100"})
CUDA_PARALLEL_MARKS = hardware_marks(res={"cuda": "H100"}, num_cards=2)
# NPU marks
NPU_TWO_CARD_MARKS = hardware_marks(res={"npu": "A2"}, num_cards=2)
NPU_FOUR_CARD_MARKS = hardware_marks(res={"npu": "A2"}, num_cards=4)
WAN22_MODELS = [
("Wan-AI/Wan2.2-T2V-A14B-Diffusers", "t2v"),
("Wan-AI/Wan2.2-I2V-A14B-Diffusers", "i2v"),
("Wan-AI/Wan2.2-TI2V-5B-Diffusers", "ti2v"),
]
NPU_MODELS = [("Wan-AI/Wan2.2-I2V-A14B-Diffusers", "i2v")]
CACHE_DIT_ARGS = ["--cache-backend", "cache_dit", "--enable-layerwise-offload"]
HSDP_ARGS = ["--use-hsdp", "--hsdp-shard-size", "2"]
PARALLEL_CONFIGS = [
("cfg_parallel", ["--cfg-parallel-size", "2"]),
("ulysses_sp", ["--usp", "2"]),
("tp_vae_patch", ["--tensor-parallel-size", "2", "--vae-patch-parallel-size", "2"]),
("hsdp", ["--use-hsdp", "--hsdp-shard-size", "2"]), # replicate_size=1 (default)
("ring_atten", ["--ring", "2"]),
]
# NPU: 2 cases only.
NPU_PARALLEL_CONFIGS = [
(
"combined",
[
"--cfg-parallel-size",
"2",
"--usp",
"2",
"--vae-patch-parallel-size",
"4",
"--use-hsdp",
"--hsdp-shard-size",
"4",
],
NPU_FOUR_CARD_MARKS,
),
(
"tp_layerwise_offload",
["--tensor-parallel-size", "2", "--enable-layerwise-offload"],
NPU_TWO_CARD_MARKS,
),
]
def _get_wan22_feature_cases():
"""
Generate parameterized test cases:
- CUDA: 3 models × (Cache-DiT + 5 parallel features), original matrix.
- NPU: I2V-A14B only, 2 cases (4-card combined, 2-card tp_layerwise_offload).
"""
cases = []
# ---- CUDA cases ----
# Single-card: CPU offload (applies to all models)
for model_path, model_key in WAN22_MODELS:
cases.append(
pytest.param(
OmniServerParams(
model=model_path,
server_args=["--enable-cpu-offload"],
),
id=f"{model_key}_cpu_offload",
marks=CUDA_SINGLE_CARD_MARKS,
)
)
# Single-card: Cache-DiT (applies to all models)
for model_path, model_key in WAN22_MODELS:
cases.append(
pytest.param(
OmniServerParams(model=model_path, server_args=CACHE_DIT_ARGS),
id=f"cuda_{model_key}_cache_dit",
marks=CUDA_SINGLE_CARD_MARKS,
)
)
for model_path, model_key in WAN22_MODELS:
for feat_id, server_args in PARALLEL_CONFIGS:
cases.append(
pytest.param(
OmniServerParams(model=model_path, server_args=server_args),
id=f"cuda_{model_key}_{feat_id}",
marks=CUDA_PARALLEL_MARKS,
)
)
# ---- NPU cases (I2V-A14B only) ----
for model_path, model_key in NPU_MODELS:
for feat_id, server_args, marks in NPU_PARALLEL_CONFIGS:
cases.append(
pytest.param(
OmniServerParams(model=model_path, server_args=server_args),
id=f"npu_{model_key}_{feat_id}",
marks=marks,
)
)
return cases
@pytest.mark.parametrize(
"omni_server",
_get_wan22_feature_cases(),
indirect=True,
)
def test_wan22_diffusion_features(
omni_server: OmniServer,
openai_client: OpenAIClientHandler,
):
model_path = omni_server.model
is_i2v_or_ti2v = any(kw in model_path for kw in ["I2V", "TI2V"])
is_moe_model = "I2V-A14B" in model_path # Only I2V-A14B uses MoE per spec
form_data = {
"prompt": PROMPT,
"negative_prompt": NEGATIVE_PROMPT,
"height": 512,
"width": 512,
"num_frames": 8,
"fps": 8,
"num_inference_steps": 2,
"guidance_scale": 4.0,
"seed": 42,
# flow_shift omitted: Service uses resolution-based defaults (12.0 for 512px)
# vae_use_slicing/tiling omitted: Service-side optimization, not request param
}
if is_moe_model:
form_data.update(
{
"guidance_scale_2": 1.0,
"boundary_ratio": 0.5,
}
)
request_config = {
"model": model_path,
"form_data": form_data,
}
if is_i2v_or_ti2v:
request_config["image_reference"] = f"data:image/jpeg;base64,{generate_synthetic_image(512, 512)['base64']}"
openai_client.send_video_diffusion_request(request_config)